def finish(self): # compute the final masterarray by copying over the masterarray1, # which is a list of dicts of attributes if SAVE_STATISTICS: import cPickle cPickle.dump(self.stats, open('stackless-stats.pickle', 'wb')) # fun fun fun patching the call_function_retval_xyz() functions! for RESTYPE, typename in frame.STORAGE_TYPES_AND_FIELDS: rettype_index = STORAGE_TYPES.index(RESTYPE) cache = self.signaturecodes[rettype_index] if not cache: continue # not used anyway, don't produce a broken empty switch func = getattr(code, 'call_function_retval_' + typename) desc = self.translator.annotator.bookkeeper.getdesc(func) graph = desc.getuniquegraph() [v_fnaddr, v_signature_index] = graph.getargs() block = model.Block([v_fnaddr, v_signature_index]) block.exitswitch = v_signature_index block.isstartblock = True graph.startblock = block switchlinks = [] for ARGTYPES, signature_index in cache.items(): # XXX because of type erasure, the following cast is # kind of invalid, but we hope that nobody will notice FUNCTYPE = lltype.Ptr(lltype.FuncType(ARGTYPES, RESTYPE)) v_fnaddr1 = varoftype(v_fnaddr.concretetype) callblock = model.Block([v_fnaddr1]) llops = LowLevelOpList() args_v = [model.Constant(TYPE._defl(), concretetype=TYPE) for TYPE in ARGTYPES] v_res = llops.genop('adr_call', [v_fnaddr1] + args_v, resulttype = RESTYPE) callblock.operations[:] = llops callblock.closeblock(model.Link([v_res], graph.returnblock)) link = model.Link([v_fnaddr], callblock) link.exitcase = signature_index link.llexitcase = signature_index switchlinks.append(link) block.closeblock(*switchlinks) model.checkgraph(graph) self.is_finished = True masterarray = lltype.malloc(frame.FRAME_INFO_ARRAY, len(self.masterarray1), immortal=True) for dst, src in zip(masterarray, self.masterarray1): dst.fnaddr, dst.info = src # horrors in the same spirit as in rpython.memory.gctransform # (shorter, though) ll_global_state = self.ll_global_state.value ll_global_state.inst_masterarray = masterarray return [masterarray]
def key(v): return STORAGE_TYPES.index(storage_type(v.concretetype))