def test_delayedptr(self): FUNCTYPE = lltype.FuncType([], lltype.Signed) name = "delayed!myfunc" delayedptr1 = lltype._ptr(lltype.Ptr(FUNCTYPE), name, solid=True) delayedptr2 = lltype._ptr(lltype.Ptr(FUNCTYPE), name, solid=True) assert delayedptr1 == delayedptr1 assert delayedptr1 != delayedptr2 assert bool(delayedptr1) assert delayedptr1 != lltype.nullptr(FUNCTYPE)
def guess_size_obj(obj): TYPE = typeOf(obj) ptr = _ptr(Ptr(TYPE), obj) if TYPE._is_varsize(): arrayfld = getattr(TYPE, '_arrayfld', None) if arrayfld: length = len(getattr(ptr, arrayfld)) else: try: length = len(ptr) except TypeError: if TYPE._hints.get("nolength", False) and hasattr( obj, "items"): length = len(obj.items) else: print "couldn't find size of", ptr return 0 else: length = None if type(TYPE) is llgroup.GroupType: return sum(guess_size_obj(m) for m in obj.members) #print obj, ', length =', length r = convert_offset_to_int(llmemory.sizeof(TYPE, length)) #print '\tr =', r return r
def graph2delayed(self, graph, FUNCTYPE=None): if FUNCTYPE is None: FUNCTYPE = lltype.ForwardReference() # obscure hack: embed the name of the function in the string, so # that the genc database can get it even before the delayedptr # is really computed name = "delayed!%s" % (graph.name,) delayedptr = lltype._ptr(lltype.Ptr(FUNCTYPE), name, solid=True) self.delayedfuncs.append((delayedptr, graph)) return delayedptr
def graph2delayed(self, graph, FUNCTYPE=None): if FUNCTYPE is None: FUNCTYPE = lltype.ForwardReference() # obscure hack: embed the name of the function in the string, so # that the genc database can get it even before the delayedptr # is really computed name = "delayed!%s" % (graph.name, ) delayedptr = lltype._ptr(lltype.Ptr(FUNCTYPE), name, solid=True) self.delayedfuncs.append((delayedptr, graph)) return delayedptr
def delayedconst(self, repr, obj): if repr.is_setup_delayed(): # record the existence of this 'obj' for the bookkeeper - e.g. # if 'obj' is an instance, this will populate the classdef with # the prebuilt attribute values of the instance bk = self.rtyper.annotator.bookkeeper bk.immutablevalue(obj) delayedptr = lltype._ptr(repr.lowleveltype, "delayed!") self.delayedconsts.append((delayedptr, repr, obj)) return delayedptr else: return repr.convert_const(obj)
def guess_size_obj(obj): TYPE = typeOf(obj) ptr = _ptr(Ptr(TYPE), obj) if TYPE._is_varsize(): arrayfld = getattr(TYPE, '_arrayfld', None) if arrayfld: length = len(getattr(ptr, arrayfld)) else: try: length = len(ptr) except TypeError: print "couldn't find size of", ptr return 0 else: length = None return convert_offset_to_int(llmemory.sizeof(TYPE, length))
def guess_size_obj(obj): TYPE = typeOf(obj) ptr = _ptr(Ptr(TYPE), obj) if TYPE._is_varsize(): arrayfld = getattr(TYPE, '_arrayfld', None) if arrayfld: length = len(getattr(ptr, arrayfld)) else: try: length = len(ptr) except TypeError: print "couldn't find size of", ptr return 0 else: length = None #print obj, ', length =', length r = convert_offset_to_int(llmemory.sizeof(TYPE, length)) #print '\tr =', r return r
def cast_object_to_ptr(PTR, object): """NOT_RPYTHON: hack. The object may be disguised as a PTR now. Limited to casting a given object to a single type. """ if hasattr(object, '_freeze_'): warning("Trying to cast a frozen object to pointer") if isinstance(PTR, lltype.Ptr): TO = PTR.TO else: TO = PTR if not hasattr(object, '_carry_around_for_tests'): if object is None: return lltype.nullptr(PTR.TO) assert not hasattr(object, '_TYPE') object._carry_around_for_tests = True object._TYPE = TO else: assert object._TYPE == TO # if isinstance(PTR, lltype.Ptr): return lltype._ptr(PTR, object, True) else: raise NotImplementedError("cast_object_to_ptr(%r, ...)" % PTR)