def STORE_DEREF(f, varindex, *ignored): # nested scopes: access a variable through its cell object w_newvalue = f.popvalue() # try: cell = f.cells[varindex] # except IndexError: # import pdb; pdb.set_trace() # raise namecheck_store(f, w_newvalue) # SRW cell.set(w_newvalue)
def MAKE_CLOSURE(f, numdefaults, *ignored): w_codeobj = f.popvalue() codeobj = f.space.interp_w(pycode.PyCode, w_codeobj) if codeobj.magic >= 0xA0DF281: # CPython 2.5 AST branch merge w_freevarstuple = f.popvalue() freevars = [f.space.interp_w(Cell, cell) for cell in f.space.viewiterable(w_freevarstuple)] else: nfreevars = len(codeobj.co_freevars) freevars = [f.space.interp_w(Cell, f.popvalue()) for i in range(nfreevars)] freevars.reverse() defaultarguments = [f.popvalue() for i in range(numdefaults)] defaultarguments.reverse() fn = function.Function( f.space, codeobj, f.w_globals, defaultarguments, freevars, creator_nametoken=f.space.finditem(f.w_globals, f.space.wrap(SLOTNAME_NAMETOKEN)), ) w_fn = f.space.wrap(fn) namecheck_store(f, w_fn) f.pushvalue(w_fn)