cs107-lecture-examples

Example codes used during Harvard CS107 lectures
git clone https://git.0xfab.ch/cs107-lecture-examples.git
Log | Files | Refs | README | LICENSE

code_object.py (791B)


      1 #!/usr/bin/env python3
      2 import dis
      3 
      4 a = 1
      5 b = 2
      6 
      7 # source to be compiled into a code object
      8 source = 'a + 1'
      9 # source = 'a + b'
     10 
     11 # compile code object
     12 co = compile(source, '<string>', mode='eval')
     13 
     14 # disassembly columns are:
     15 # line_number   byte_offset   instruction_name   argument_value
     16 dis.dis(co)
     17 
     18 # names and constants
     19 print(f'names:               {co.co_names}')
     20 print(f'constants:           {co.co_consts}')
     21 
     22 # opcodes and opargs in binary
     23 print(f'raw binary bytecode: {co.co_code}')
     24 h = co.co_code.hex()
     25 inst_code = " ".join([h[i:i + 4] for i in range(0, len(h), 4)]).split()
     26 print(f'hex representation:  {" ".join(inst_code)}')
     27 
     28 for code in inst_code:
     29     opcode = f'0x{code[0:2]}'
     30     oparg = f'0x{code[2:4]}'
     31     print(f'opname lookup:  {opcode} -> {dis.opname[int(opcode, 16)]}')