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.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 convert_slice_to_tuple(r_slc, v_slc, llops): # slice -> (slice,) r_tuple = TupleRepr(llops.rtyper, [r_slc]) # XX get this from rtyper cache ? v_tuple = rtuple.newtuple(llops, r_tuple, [v_slc]) return r_tuple, v_tuple
def convert_int_to_tuple(r_int, v_int, llops): # int -> (int,) r_tuple = TupleRepr(llops.rtyper, [r_int]) # XX get this from rtyper cache ? v_tuple = rtuple.newtuple(llops, r_tuple, [v_int]) return r_tuple, v_tuple