def specialize_call(self, hop): from pypy.rpython.error import TyperError from pypy.rpython.lltypesystem import lltype, llmemory, rtuple from pypy.annotation import model as annmodel from pypy.rpython.memory.gc.marksweep import X_CLONE, X_CLONE_PTR config = hop.rtyper.getconfig() if config.translation.gc != 'marksweep': # if the gc policy does not support allocation pools, # gc_clone always raises RuntimeError hop.exception_is_here() hop.gendirectcall(_raise) s_pool_ptr = annmodel.SomeExternalObject(GcPool) r_pool_ptr = hop.rtyper.getrepr(s_pool_ptr) r_tuple = hop.r_result v_gcobject, v_pool = hop.inputargs(hop.args_r[0], r_pool_ptr) return rtuple.newtuple(hop.llops, r_tuple, [v_gcobject, v_pool]) r_gcobject = hop.args_r[0] if (not isinstance(r_gcobject.lowleveltype, lltype.Ptr) or r_gcobject.lowleveltype.TO._gckind != 'gc'): raise TyperError("gc_clone() can only clone a dynamically " "allocated object;\ngot %r" % (r_gcobject, )) s_pool_ptr = annmodel.SomeExternalObject(GcPool) r_pool_ptr = hop.rtyper.getrepr(s_pool_ptr) r_tuple = hop.r_result c_CLONE = hop.inputconst(lltype.Void, X_CLONE) c_flags = hop.inputconst(lltype.Void, {'flavor': 'gc'}) c_gcobjectptr = hop.inputconst(lltype.Void, "gcobjectptr") c_pool = hop.inputconst(lltype.Void, "pool") v_gcobject, v_pool = hop.inputargs(hop.args_r[0], r_pool_ptr) v_gcobjectptr = hop.genop('cast_opaque_ptr', [v_gcobject], resulttype=llmemory.GCREF) v_clonedata = hop.genop('malloc', [c_CLONE, c_flags], resulttype=X_CLONE_PTR) hop.genop('setfield', [v_clonedata, c_gcobjectptr, v_gcobjectptr]) hop.genop('setfield', [v_clonedata, c_pool, v_pool]) hop.exception_is_here() hop.genop('gc_x_clone', [v_clonedata]) v_gcobjectptr = hop.genop('getfield', [v_clonedata, c_gcobjectptr], resulttype=llmemory.GCREF) v_pool = hop.genop('getfield', [v_clonedata, c_pool], resulttype=r_pool_ptr) v_gcobject = hop.genop('cast_opaque_ptr', [v_gcobjectptr], resulttype=r_tuple.items_r[0]) return rtuple.newtuple(hop.llops, r_tuple, [v_gcobject, v_pool])
def specialize_call(self, hop): from pypy.annotation import model as annmodel s_pool_ptr = annmodel.SomeExternalObject(GcPool) r_pool_ptr = hop.rtyper.getrepr(s_pool_ptr) opname = 'gc_x_swap_pool' config = hop.rtyper.getconfig() if config.translation.gc != 'marksweep': # when the gc policy doesn't support pools, just return # the argument (which is lltyped as Void anyway) opname = 'same_as' s_pool_ptr = annmodel.SomeExternalObject(GcPool) r_pool_ptr = hop.rtyper.getrepr(s_pool_ptr) vlist = hop.inputargs(r_pool_ptr) return hop.genop(opname, vlist, resulttype=r_pool_ptr)
def compute_result_annotation(self, s_gcobject, s_pool): from pypy.annotation import model as annmodel return annmodel.SomeTuple( [s_gcobject, annmodel.SomeExternalObject(GcPool)])
def compute_result_annotation(self, s_newpool): from pypy.annotation import model as annmodel return annmodel.SomeExternalObject(GcPool)