def frame_type_for_vars(self, vars): key = self._key_for_types([v.concretetype for v in vars]) if key not in self.frametypes: fields = [] tcounts = [] for t in STORAGE_TYPES: tcount = key.get(t, 0) tcounts.append(str(tcount)) for j in range(tcount): fname = 'state_%s_%d' % (STORAGE_FIELDS[t], j) fields.append((fname, t)) FRAME_TYPE = frame.make_state_header_type( "FrameState_"+'_'.join(tcounts), *fields) self.frametypes[key] = (FRAME_TYPE, self.saving_function_for_type(FRAME_TYPE)) T, save_state_funcptr = self.frametypes[key] varsforcall = list(vars) def key(v): return STORAGE_TYPES.index(storage_type(v.concretetype)) def mycmp(x, y): return cmp(key(x), key(y)) varsforcall.sort(mycmp) return T, varsforcall, save_state_funcptr
from pypy.rpython.lltypesystem import lltype, llmemory, lloperation from pypy.tool.sourcetools import func_with_new_name from pypy.rlib import rarithmetic from pypy.translator.stackless import frame from pypy.translator.stackless.frame import STATE_HEADER, SAVED_REFERENCE, STORAGE_TYPES_AND_FIELDS EMPTY_STATE = frame.make_state_header_type("empty_state") # ____________________________________________________________ SWITCH_STATE = frame.make_state_header_type("switch_state", ("c", SAVED_REFERENCE)) def ll_frame_switch(targetstate): if global_state.restart_substate == -1: # normal entry point for a call to state.switch() # first unwind the stack u = UnwindException() s = lltype.malloc(SWITCH_STATE) s.header.f_restart = INDEX_SWITCH s.c = lltype.cast_opaque_ptr(SAVED_REFERENCE, targetstate) add_frame_state(u, s.header) raise u elif global_state.restart_substate == 0: # STATE 0: we didn't do anything so far, but the stack is unwound global_state.restart_substate = -1 # grab the frame corresponding to ourself # the 'targetstate' local is garbage here, it must be read back from # 's.c' where we saved it by the normal entry point above mystate = global_state.top s = lltype.cast_pointer(lltype.Ptr(SWITCH_STATE), mystate)
from pypy.rpython.lltypesystem import lltype, llmemory, lloperation from pypy.tool.sourcetools import func_with_new_name from pypy.rlib import rarithmetic from pypy.translator.stackless import frame from pypy.translator.stackless.frame import STATE_HEADER, SAVED_REFERENCE, STORAGE_TYPES_AND_FIELDS EMPTY_STATE = frame.make_state_header_type('empty_state') # ____________________________________________________________ SWITCH_STATE = frame.make_state_header_type('switch_state', ('c', SAVED_REFERENCE)) def ll_frame_switch(targetstate): if global_state.restart_substate == -1: # normal entry point for a call to state.switch() # first unwind the stack u = UnwindException() s = lltype.malloc(SWITCH_STATE) s.header.f_restart = INDEX_SWITCH s.c = lltype.cast_opaque_ptr(SAVED_REFERENCE, targetstate) add_frame_state(u, s.header) raise u elif global_state.restart_substate == 0: # STATE 0: we didn't do anything so far, but the stack is unwound global_state.restart_substate = -1 # grab the frame corresponding to ourself # the 'targetstate' local is garbage here, it must be read back from # 's.c' where we saved it by the normal entry point above mystate = global_state.top s = lltype.cast_pointer(lltype.Ptr(SWITCH_STATE), mystate)
from pypy.rpython.lltypesystem import lltype, llmemory, lloperation from pypy.tool.sourcetools import func_with_new_name from pypy.rlib import rarithmetic from pypy.rpython import extfunctable from pypy.translator.stackless import frame from pypy.translator.stackless.frame import STATE_HEADER, SAVED_REFERENCE, STORAGE_TYPES_AND_FIELDS EMPTY_STATE = frame.make_state_header_type('empty_state') # ____________________________________________________________ SWITCH_STATE = frame.make_state_header_type('switch_state', ('c', SAVED_REFERENCE)) def ll_frame_switch(targetstate): if global_state.restart_substate == -1: # normal entry point for a call to state.switch() # first unwind the stack u = UnwindException() s = lltype.malloc(SWITCH_STATE) s.header.f_restart = INDEX_SWITCH s.c = lltype.cast_opaque_ptr(SAVED_REFERENCE, targetstate) add_frame_state(u, s.header) raise u elif global_state.restart_substate == 0: # STATE 0: we didn't do anything so far, but the stack is unwound global_state.restart_substate = -1 # grab the frame corresponding to ourself # the 'targetstate' local is garbage here, it must be read back from # 's.c' where we saved it by the normal entry point above mystate = global_state.top