Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
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
Exemplo n.º 3
0
 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
Exemplo n.º 4
0
 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
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
 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)
Exemplo n.º 7
0
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))
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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)
Exemplo n.º 10
0
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)