def execute(code_obj): '''executing''' cur=0 stak=stack.stack() while cur<len(code_obj.code): opcode=code_obj.code[cur] # print cur,len(code_obj.code),hex(opcode) if opcode==0x64: # LOAD_CONS operand=functions.get_oparg(code_obj.code,cur) stak.push(code_obj.consts[operand]) cur+=3 elif opcode==0x5a: # STORE_NAME operand=functions.get_oparg(code_obj.code,cur) n=stak.pop() if Code.name_value.get(code_obj.names[operand]): Code.name_value[code_obj.names[operand]]=n code_obj.names[operand]=n cur+=3 elif opcode==0x47: # PRINT_ITEM print stak.pop(), cur+=1 elif opcode==0x48 : # PRINT_NEWLINE print cur+=1 elif opcode==0x78: # SETUP_LOOP cur+=3 elif opcode==0x65: # LOAD_NAME oparg=functions.get_oparg(code_obj.code,cur) stak.push(code_obj.names[oparg]) cur+=3 elif opcode==0x71 : # JUMB_ABSOLUTE cur=functions.get_oparg(code_obj.code,cur) elif opcode==0x57 : # POP_BLOCK cur+=1 elif opcode==0x53: # RETURN_VALUE return stak.pop() elif opcode==0x67: #BUILD_LIST oparg=functions.get_oparg(code_obj.code,cur) lst=[0]*oparg end=oparg-1 for i in range(oparg): lst[end]=stak.pop() end-=1 stak.push(lst) cur+=3 elif opcode==0x6b: # COMPARE_OP opname=functions.get_oparg(code_obj.code,cur) tos=stak.pop() tos2=stak.pop() stak.push(comparisons[opname](tos2, tos)) cur+=3 elif opcode==0x72 : # POP_JUMP_IF_FALSE target=functions.get_oparg(code_obj.code,cur) value=stak.pop() if not value: cur=target else: cur+=3 elif opcode==0x73 : # POP_JUMP_IF_TRUE target=functions.get_oparg(code_obj.code,cur) value=stak.pop() if value: cur=target else: cur+=3 elif opcode==0x17: #BINARY_ADD stak.push(stak.pop()+stak.pop()) cur+=1 elif opcode==20: #BINARY_MULTIPLY stak.push(stak.pop()*stak.pop()) cur+=1 elif opcode==21: #BINARY_DIVIDE f=stak.pop() s=stak.pop() stak.push(s/f) cur+=1 elif opcode==22: #BINARY_MODULO f=stak.pop()
cur+=1 elif opcode==22: #BINARY_MODULO f=stak.pop() s=stak.pop() stak.push(s%f) cur+=1 elif opcode==24: #BINARY_SUBTRACT f=stak.pop() s=stak.pop() stak.push(s-f) cur+=1 elif opcode==12: #UNARY NOT stak.push(not stak.pop()) cur+=1 elif opcode==0x6e: #JUMP_FORWARD delta=functions.get_oparg(code_obj.code,cur) cur+=delta+3 elif opcode==0x84: # MAKE_FUNCTION operand=functions.get_oparg(code_obj.code,cur) cur+=3 elif opcode==0x83 : #CALL_FUNCTION argc=functions.get_oparg(code_obj.code,cur) func=stak.get_top_n(argc) backup=func.varnames[:] while argc: argc -= 1 func.varnames[argc] = stak.pop() stak.pop() ret=execute(func) stak.push(ret) func.varnames = backup[:]