def interpret(pc, block, regv, frame): module = jit.promote(frame.module) unit = jit.promote(frame.unit) excs = jit.promote(frame.excs) try: while pc < len(block): try: jitdriver.jit_merge_point(pc=pc, block=block, module=module, unit=unit, excs=excs, regv=regv, frame=frame) opcode = rffi.r_ulong(block[pc]) >> 8 ix = pc + 1 pc = ix + (rffi.r_ulong(block[pc]) & 255) if opcode == opcode_of('assert'): obj = regv.load(block[ix + 0]) raise space.unwind(space.LAssertionError(obj)) elif opcode == opcode_of('raise'): obj = regv.load(block[ix + 0]) traceback = obj.getattr(u"traceback") if traceback is space.null: traceback = space.List([]) obj.setattr(u"traceback", traceback) elif not isinstance(traceback, space.List): raise space.unwind( space.LError( u"Expected null or list as .traceback: %s" % obj.repr())) raise space.Unwinder(obj, traceback) elif opcode == opcode_of('constant'): regv.store(block[ix + 0], unit.constants[block[ix + 1]]) elif opcode == opcode_of('list'): contents = [] for i in range(ix + 1, pc): contents.append(regv.load(block[i])) regv.store(block[ix], space.List(contents)) elif opcode == opcode_of('move'): regv.store(block[ix + 0], regv.load(block[ix + 1])) elif opcode == opcode_of('call'): op_call(regv, block, ix, pc) elif opcode == opcode_of('callv'): op_callv(regv, block, ix, pc) elif opcode == opcode_of('return'): return regv.load(block[ix + 0]) elif opcode == opcode_of('jump'): pc = rffi.r_ulong(block[ix + 0]) elif opcode == opcode_of('cond'): if space.is_false(regv.load(block[ix + 0])): pc = rffi.r_ulong(block[ix + 2]) else: pc = rffi.r_ulong(block[ix + 1]) elif opcode == opcode_of('func'): regv.store(block[ix + 0], Closure(frame, unit.functions[block[ix + 1]])) elif opcode == opcode_of('iter'): regv.store(block[ix + 0], regv.load(block[ix + 1]).iter()) elif opcode == opcode_of('next'): try: regv.store( block[ix + 0], regv.load(block[ix + 1]).callattr(u'next', [])) except StopIteration as _: pc = rffi.r_ulong(block[ix + 2]) # this is missing. #elif isinstance(op, Yield): # raise YieldIteration(op.block, loop_break, op.i, regv.load(op.value.i)) elif opcode == opcode_of('getattr'): name = get_string(unit, block, ix + 2) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.getattr(name)) elif opcode == opcode_of('setattr'): value = regv.load(block[ix + 3]) name = get_string(unit, block, ix + 2) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.setattr(name, value)) elif opcode == opcode_of('getitem'): index = regv.load(block[ix + 2]) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.getitem(index)) elif opcode == opcode_of('setitem'): item = regv.load(block[ix + 3]) index = regv.load(block[ix + 2]) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.setitem(index, item)) elif opcode == opcode_of('getloc'): regv.store(block[ix + 0], frame.local[block[ix + 1]]) elif opcode == opcode_of('setloc'): value = regv.load(block[ix + 2]) frame.local[block[ix + 1]] = value regv.store(block[ix + 0], value) elif opcode == opcode_of('getupv'): value = get_upframe(frame, block[ix + 1]).local[block[ix + 2]] regv.store(block[ix + 0], value) elif opcode == opcode_of('setupv'): value = regv.load(block[ix + 3]) get_upframe(frame, block[ix + 1]).local[block[ix + 2]] = value regv.store(block[ix + 0], value) elif opcode == opcode_of('getglob'): regv.store(block[ix + 0], module.getattr(get_string(unit, block, ix + 1))) elif opcode == opcode_of('setglob'): regv.store( block[ix + 0], module.setattr(get_string(unit, block, ix + 1), regv.load(block[ix + 2]))) elif opcode == opcode_of('not'): if space.is_false(regv.load(block[ix + 1])): regv.store(block[ix + 0], space.true) else: regv.store(block[ix + 0], space.false) elif opcode == opcode_of('contains'): v0 = regv.load(block[ix + 1]) v1 = regv.load(block[ix + 2]) if v0.contains(v1): regv.store(block[ix + 0], space.true) else: regv.store(block[ix + 0], space.false) else: raise space.unwind( space.LInstructionError( optable.names.get(opcode, str(opcode)).decode('utf-8'), opcode)) except space.Unwinder as unwinder: for exc in excs: if exc.start < pc <= exc.stop: regv.store(exc.reg, unwinder.exception) pc = exc.label break else: raise except StopIteration as stop: unwinder = space.unwind(space.LUncatchedStopIteration()) unwinder.traceback.contents.append( TraceEntry(rffi.r_long(pc), unit.constants, frame.sourcemap)) raise unwinder except space.Unwinder as unwinder: unwinder.traceback.contents.append( TraceEntry(rffi.r_long(pc), unit.constants, frame.sourcemap)) raise return space.null
def interpret(pc, block, frame): function = jit.promote(frame.function) module = jit.promote(frame.module) unit = jit.promote(frame.unit) excs = jit.promote(frame.excs) try: while pc < len(block): try: jitdriver.jit_merge_point(pc=pc, block=block, module=module, unit=unit, excs=excs, function=function, frame=frame) #ec=ec, regv=regv, opcode = rffi.r_ulong(block[pc]) >> 8 ix = pc + 1 pc = ix + (rffi.r_ulong(block[pc]) & 255) # Not sure.. #if ec.debug_hook is not None: # hook, ec.debug_hook = ec.debug_hook, None # res = ec.debug_hook.call([DebugContext(rffi.r_long(ix), unit, frame)]) # if res != space.null: # ec.debug_hook = res #print optable.dec[opcode][0] regv = frame # from now on.. if opcode == opcode_of('assert'): obj = regv.load(block[ix + 0]) raise space.unwind(space.LAssertionError(obj)) elif opcode == opcode_of('raise'): obj = regv.load(block[ix + 0]) traceback = obj.getattr(u"traceback") if traceback is space.null: traceback = space.List([]) obj.setattr(u"traceback", traceback) elif not isinstance(traceback, space.List): raise space.unwind( space.LError( u"Expected null or list as .traceback: %s" % obj.repr())) raise space.Unwinder(obj, traceback) elif opcode == opcode_of('constant'): regv.store(block[ix + 0], unit.constants[block[ix + 1]]) elif opcode == opcode_of('list'): contents = [] for i in range(ix + 1, pc): contents.append(regv.load(block[i])) regv.store(block[ix], space.List(contents)) elif opcode == opcode_of('move'): regv.store(block[ix + 0], regv.load(block[ix + 1])) elif opcode == opcode_of('call'): op_call(regv, block, ix, pc) elif opcode == opcode_of('callv'): op_callv(regv, block, ix, pc) elif opcode == opcode_of('return'): return regv.load(block[ix + 0]) elif opcode == opcode_of('yield'): result = regv.load(block[ix + 0]) jit.hint(frame, force_virtualizable=True) raise Yield(pc, result) elif opcode == opcode_of('jump'): pc = rffi.r_ulong(block[ix + 0]) elif opcode == opcode_of('cond'): if space.is_false(regv.load(block[ix + 0])): pc = rffi.r_ulong(block[ix + 2]) else: pc = rffi.r_ulong(block[ix + 1]) elif opcode == opcode_of('func'): regv.store(block[ix + 0], Closure(frame, unit.functions[block[ix + 1]])) elif opcode == opcode_of('iter'): regv.store(block[ix + 0], regv.load(block[ix + 1]).iter()) elif opcode == opcode_of('next'): try: regv.store( block[ix + 0], regv.load(block[ix + 1]).callattr(u'next', [])) except StopIteration as _: pc = rffi.r_ulong(block[ix + 2]) elif opcode == opcode_of('getattr'): name = get_string(unit, block, ix + 2) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.getattr(name)) elif opcode == opcode_of('setattr'): value = regv.load(block[ix + 3]) name = get_string(unit, block, ix + 2) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.setattr(name, value)) elif opcode == opcode_of('getitem'): index = regv.load(block[ix + 2]) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.getitem(index)) elif opcode == opcode_of('setitem'): item = regv.load(block[ix + 3]) index = regv.load(block[ix + 2]) obj = regv.load(block[ix + 1]) regv.store(block[ix + 0], obj.setitem(index, item)) elif opcode == opcode_of('getloc'): regv.store(block[ix + 0], frame.load_local(block[ix + 1])) elif opcode == opcode_of('setloc'): value = regv.load(block[ix + 2]) frame.store_local(block[ix + 1], value) regv.store(block[ix + 0], value) elif opcode == opcode_of('getupv'): value = get_upframe(frame, block[ix + 1]).load_local( block[ix + 2]) regv.store(block[ix + 0], value) elif opcode == opcode_of('setupv'): value = regv.load(block[ix + 3]) get_upframe(frame, block[ix + 1]).store_local( block[ix + 2], value) regv.store(block[ix + 0], value) elif opcode == opcode_of('getglob'): regv.store(block[ix + 0], module.getattr(get_string(unit, block, ix + 1))) elif opcode == opcode_of('setglob'): regv.store( block[ix + 0], module.setattr(get_string(unit, block, ix + 1), regv.load(block[ix + 2]))) elif opcode == opcode_of('loglob'): src_module = regv.load(block[ix + 0]) assert isinstance(src_module, space.Module) for name in src_module.list_locals(): module.setattr(name, src_module.getattr(name)) elif opcode == opcode_of('not'): if space.is_false(regv.load(block[ix + 1])): regv.store(block[ix + 0], space.true) else: regv.store(block[ix + 0], space.false) elif opcode == opcode_of('isnull'): if regv.load(block[ix + 1]) is space.null: regv.store(block[ix + 0], space.true) else: regv.store(block[ix + 0], space.false) elif opcode == opcode_of('contains'): v0 = regv.load(block[ix + 1]) v1 = regv.load(block[ix + 2]) if v0.contains(v1): regv.store(block[ix + 0], space.true) else: regv.store(block[ix + 0], space.false) else: raise space.unwind( space.LInstructionError( optable.names.get(opcode, str(opcode)).decode('utf-8'), opcode)) except space.Unwinder as unwinder: #print "exception detected, doing unwinds", pc, unwinder.exception.repr() for exc in excs: #print exc.start, exc.stop, exc.label, exc.reg if exc.start < pc <= exc.stop: frame.store(exc.reg, unwinder.exception) pc = exc.label #print "exception handler found" break else: raise except StopIteration as stop: # Doing an exception check to see if .next() was called in try block. unwinder = space.unwind(space.LUncatchedStopIteration()) for exc in excs: if exc.start < pc <= exc.stop: frame.store(exc.reg, unwinder.exception) pc = exc.label break else: raise unwinder except space.Unwinder as unwinder: unwinder.traceback.contents.append( TraceEntry(rffi.r_long(pc), unit.sources, frame.sourcemap, unit.path)) raise return space.null
def interpret(pc, block, regv, frame): module = jit.promote(frame.module) unit = jit.promote(frame.unit) excs = jit.promote(frame.excs) try: while pc < len(block): try: jitdriver.jit_merge_point( pc=pc, block=block, module=module, unit=unit, excs=excs, regv=regv, frame=frame) opcode = rffi.r_ulong(block[pc])>>8 ix = pc+1 pc = ix+(rffi.r_ulong(block[pc])&255) #print optable.dec[opcode][0] if opcode == opcode_of('assert'): obj = regv.load(block[ix+0]) raise space.unwind(space.LAssertionError(obj)) elif opcode == opcode_of('raise'): obj = regv.load(block[ix+0]) traceback = obj.getattr(u"traceback") if traceback is space.null: traceback = space.List([]) obj.setattr(u"traceback", traceback) elif not isinstance(traceback, space.List): raise space.unwind(space.LError(u"Expected null or list as .traceback: %s" % obj.repr())) raise space.Unwinder(obj, traceback) elif opcode == opcode_of('constant'): regv.store(block[ix+0], unit.constants[block[ix+1]]) elif opcode == opcode_of('list'): contents = [] for i in range(ix+1, pc): contents.append(regv.load(block[i])) regv.store(block[ix], space.List(contents)) elif opcode == opcode_of('move'): regv.store(block[ix+0], regv.load(block[ix+1])) elif opcode == opcode_of('call'): op_call(regv, block, ix, pc) elif opcode == opcode_of('callv'): op_callv(regv, block, ix, pc) elif opcode == opcode_of('return'): return regv.load(block[ix+0]) elif opcode == opcode_of('jump'): pc = rffi.r_ulong(block[ix+0]) elif opcode == opcode_of('cond'): if space.is_false(regv.load(block[ix+0])): pc = rffi.r_ulong(block[ix+2]) else: pc = rffi.r_ulong(block[ix+1]) elif opcode == opcode_of('func'): regv.store(block[ix+0], Closure(frame, unit.functions[block[ix+1]])) elif opcode == opcode_of('iter'): regv.store(block[ix+0], regv.load(block[ix+1]).iter()) elif opcode == opcode_of('next'): try: regv.store(block[ix+0], regv.load(block[ix+1]).callattr(u'next', [])) except StopIteration as _: pc = rffi.r_ulong(block[ix+2]) # this is missing. #elif isinstance(op, Yield): # raise YieldIteration(op.block, loop_break, op.i, regv.load(op.value.i)) elif opcode == opcode_of('getattr'): name = get_string(unit, block, ix+2) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.getattr(name)) elif opcode == opcode_of('setattr'): value = regv.load(block[ix+3]) name = get_string(unit, block, ix+2) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.setattr(name, value)) elif opcode == opcode_of('getitem'): index = regv.load(block[ix+2]) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.getitem(index)) elif opcode == opcode_of('setitem'): item = regv.load(block[ix+3]) index = regv.load(block[ix+2]) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.setitem(index, item)) elif opcode == opcode_of('getloc'): regv.store(block[ix+0], frame.local[block[ix+1]]) elif opcode == opcode_of('setloc'): value = regv.load(block[ix+2]) frame.local[block[ix+1]] = value regv.store(block[ix+0], value) elif opcode == opcode_of('getupv'): value = get_upframe(frame, block[ix+1]).local[block[ix+2]] regv.store(block[ix+0], value) elif opcode == opcode_of('setupv'): value = regv.load(block[ix+3]) get_upframe(frame, block[ix+1]).local[block[ix+2]] = value regv.store(block[ix+0], value) elif opcode == opcode_of('getglob'): regv.store(block[ix+0], module.getattr(get_string(unit, block, ix+1))) elif opcode == opcode_of('setglob'): regv.store(block[ix+0], module.setattr( get_string(unit, block, ix+1), regv.load(block[ix+2]))) elif opcode == opcode_of('not'): if space.is_false(regv.load(block[ix+1])): regv.store(block[ix+0], space.true) else: regv.store(block[ix+0], space.false) elif opcode == opcode_of('contains'): v0 = regv.load(block[ix+1]) v1 = regv.load(block[ix+2]) if v0.contains(v1): regv.store(block[ix+0], space.true) else: regv.store(block[ix+0], space.false) else: raise space.unwind(space.LInstructionError( optable.names.get(opcode, str(opcode)).decode('utf-8'), opcode)) except space.Unwinder as unwinder: #print "exception detected, doing unwinds", pc, unwinder.exception.repr() for exc in excs: #print exc.start, exc.stop, exc.label, exc.reg if exc.start < pc <= exc.stop: regv.store(exc.reg, unwinder.exception) pc = exc.label #print "exception handler found" break else: raise except StopIteration as stop: unwinder = space.unwind(space.LUncatchedStopIteration()) unwinder.traceback.contents.append(TraceEntry(rffi.r_long(pc), unit.sources, frame.sourcemap)) raise unwinder except space.Unwinder as unwinder: unwinder.traceback.contents.append(TraceEntry(rffi.r_long(pc), unit.sources, frame.sourcemap)) raise return space.null
def interpret_body(block, t, cl_frame, loop_break): frame = Frame(t) pc = 0 module = jit.promote(cl_frame.module) try: while pc < len(block): try: jitdriver.jit_merge_point( pc=pc, block=block, loop_break=loop_break, module=module, cl_frame=cl_frame, frame=frame) op = block[pc] pc += 1 if isinstance(op, Call): do_call(frame, op) elif isinstance(op, Assert): if space.is_false(frame.load(op.value.i)): raise space.Error(u"Assertion error") elif isinstance(op, Cond): pc = 0 if space.is_false(frame.load(op.cond.i)): block = op.exit else: block = op.then elif isinstance(op, Jump): pc = 0 block = op.exit elif isinstance(op, Next): frame.store(op.i, frame.load(op.it.i).callattr(u'next', [])) elif isinstance(op, Yield): raise YieldIteration(op.block, loop_break, op.i, frame.load(op.value.i)) elif isinstance(op, SetBreak): loop_break = op.block elif isinstance(op, Iter): frame.store(op.i, frame.load(op.value.i).iter()) elif isinstance(op, Constant): frame.store(op.i, op.value) elif isinstance(op, Variable): frame.store(op.i, lookup(module, cl_frame, op.name)) elif isinstance(op, Merge): frame.store(op.dst.i, frame.load(op.src.i)) elif isinstance(op, Function): frame.store(op.i, Closure(cl_frame, op)) elif isinstance(op, MakeList): contents = [] for val in op.values: contents.append(frame.load(val.i)) frame.store(op.i, space.List(contents)) elif isinstance(op, GetAttr): frame.store(op.i, frame.load(op.value.i).getattr(op.name)) elif isinstance(op, GetItem): frame.store(op.i, frame.load(op.value.i).getitem(frame.load(op.index.i))) elif isinstance(op, SetAttr): frame.store(op.i, frame.load(op.obj.i).setattr(op.name, frame.load(op.value.i))) elif isinstance(op, SetItem): frame.store(op.i, frame.load(op.obj.i).setitem( frame.load(op.index.i), frame.load(op.value.i))) elif isinstance(op, SetLocal): frame.store(op.i, set_local(module, cl_frame, op.name, frame.load(op.value.i), op.upscope)) elif isinstance(op, Return): return frame.load(op.ref.i) else: raise space.Error(u"spaced out") except StopIteration as stopiter: if loop_break is not None: block = loop_break loop_break = None continue op = block[pc-1] error = space.Error(u"stop iteration") error.stacktrace.append((cl_frame, op.start, op.stop)) raise error raise space.Error(u"crappy compiler") except space.Error as e: op = block[pc-1] e.stacktrace.append((cl_frame, op.start, op.stop)) raise e
def interpret_body(block, t, cl_frame, loop_break): frame = Frame(t) pc = 0 module = jit.promote(cl_frame.module) try: while pc < len(block): try: jitdriver.jit_merge_point(pc=pc, block=block, loop_break=loop_break, module=module, cl_frame=cl_frame, frame=frame) op = block[pc] pc += 1 if isinstance(op, Call): do_call(frame, op) elif isinstance(op, Assert): if space.is_false(frame.load(op.value.i)): raise space.Error(u"Assertion error") elif isinstance(op, Cond): pc = 0 if space.is_false(frame.load(op.cond.i)): block = op.exit else: block = op.then elif isinstance(op, Jump): pc = 0 block = op.exit elif isinstance(op, Next): frame.store(op.i, frame.load(op.it.i).callattr(u'next', [])) elif isinstance(op, Yield): raise YieldIteration(op.block, loop_break, op.i, frame.load(op.value.i)) elif isinstance(op, SetBreak): loop_break = op.block elif isinstance(op, Iter): frame.store(op.i, frame.load(op.value.i).iter()) elif isinstance(op, Constant): frame.store(op.i, op.value) elif isinstance(op, Variable): frame.store(op.i, lookup(module, cl_frame, op.name)) elif isinstance(op, Merge): frame.store(op.dst.i, frame.load(op.src.i)) elif isinstance(op, Function): frame.store(op.i, Closure(cl_frame, op)) elif isinstance(op, MakeList): contents = [] for val in op.values: contents.append(frame.load(val.i)) frame.store(op.i, space.List(contents)) elif isinstance(op, GetAttr): frame.store(op.i, frame.load(op.value.i).getattr(op.name)) elif isinstance(op, GetItem): frame.store( op.i, frame.load(op.value.i).getitem(frame.load(op.index.i))) elif isinstance(op, SetAttr): frame.store( op.i, frame.load(op.obj.i).setattr(op.name, frame.load(op.value.i))) elif isinstance(op, SetItem): frame.store( op.i, frame.load(op.obj.i).setitem(frame.load(op.index.i), frame.load(op.value.i))) elif isinstance(op, SetLocal): frame.store( op.i, set_local(module, cl_frame, op.name, frame.load(op.value.i), op.upscope)) elif isinstance(op, Return): return frame.load(op.ref.i) else: raise space.Error(u"spaced out") except StopIteration as stopiter: if loop_break is not None: block = loop_break loop_break = None continue op = block[pc - 1] error = space.Error(u"stop iteration") error.stacktrace.append((cl_frame, op.start, op.stop)) raise error raise space.Error(u"crappy compiler") except space.Error as e: op = block[pc - 1] e.stacktrace.append((cl_frame, op.start, op.stop)) raise e
def interpret(pc, block, regv, frame, iterstop=LARGE_PC): module = jit.promote(frame.module) unit = jit.promote(frame.unit) try: while pc < len(block): jitdriver.jit_merge_point( pc=pc, block=block, module=module, unit=unit, iterstop=iterstop, regv=regv, frame=frame) opcode = rffi.r_ulong(block[pc])>>8 ix = pc+1 pc = ix+(rffi.r_ulong(block[pc])&255) if opcode == opcode_of('assert'): if space.is_false(regv.load(block[ix+0])): raise space.Error(u"Assertion error") elif opcode == opcode_of('constant'): regv.store(block[ix+0], unit.constants[block[ix+1]]) elif opcode == opcode_of('list'): contents = [] for i in range(ix+1, pc): contents.append(regv.load(block[i])) regv.store(block[ix], space.List(contents)) elif opcode == opcode_of('move'): regv.store(block[ix+0], regv.load(block[ix+1])) elif opcode == opcode_of('call'): op_call(regv, block, ix, pc) elif opcode == opcode_of('return'): return regv.load(block[ix+0]) elif opcode == opcode_of('jump'): pc = rffi.r_ulong(block[ix+0]) elif opcode == opcode_of('cond'): if space.is_false(regv.load(block[ix+0])): pc = rffi.r_ulong(block[ix+2]) else: pc = rffi.r_ulong(block[ix+1]) elif opcode == opcode_of('func'): regv.store(block[ix+0], Closure(frame, unit.functions[block[ix+1]])) elif opcode == opcode_of('iter'): regv.store(block[ix+0], regv.load(block[ix+1]).iter()) elif opcode == opcode_of('iterstop'): iterstop = rffi.r_ulong(block[ix+0]) elif opcode == opcode_of('next'): regv.store(block[ix+0], regv.load(block[ix+1]).callattr(u'next', [])) # this is missing. #elif isinstance(op, Yield): # raise YieldIteration(op.block, loop_break, op.i, regv.load(op.value.i)) elif opcode == opcode_of('getattr'): name = get_string(unit, block, ix+2) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.getattr(name)) elif opcode == opcode_of('setattr'): value = regv.load(block[ix+3]) name = get_string(unit, block, ix+2) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.setattr(name, value)) elif opcode == opcode_of('getitem'): index = regv.load(block[ix+2]) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.getitem(index)) elif opcode == opcode_of('setitem'): item = regv.load(block[ix+3]) index = regv.load(block[ix+2]) obj = regv.load(block[ix+1]) regv.store(block[ix+0], obj.setitem(index, item)) elif opcode == opcode_of('getloc'): regv.store(block[ix+0], frame.local[block[ix+1]]) elif opcode == opcode_of('setloc'): value = regv.load(block[ix+2]) frame.local[block[ix+1]] = value regv.store(block[ix+0], value) elif opcode == opcode_of('getupv'): value = get_upframe(frame, block[ix+1]).local[block[ix+2]] regv.store(block[ix+0], value) elif opcode == opcode_of('setupv'): value = regv.load(block[ix+3]) get_upframe(frame, block[ix+1]).local[block[ix+2]] = value regv.store(block[ix+0], value) elif opcode == opcode_of('getglob'): regv.store(block[ix+0], module.getattr(get_string(unit, block, ix+1))) elif opcode == opcode_of('setglob'): regv.store(block[ix+0], module.setattr( get_string(unit, block, ix+1), regv.load(block[ix+2]))) else: raise space.Error(u"unexpected instruction: " + optable.names.get(opcode, str(opcode)).decode('utf-8')) except StopIteration as stop: if iterstop != LARGE_PC: return interpret(iterstop, block, regv, frame) else: raise space.Error(u"StopIteration") return space.null