示例#1
0
    def setup_method(self, method):
        cpu = CPU(None, None)
        cpu.vtable_offset = WORD
        cpu.gc_ll_descr = GCDescrFastpathMalloc()
        cpu.setup_once()

        # hack: specify 'tid' explicitly, because this test is not running
        # with the gc transformer
        NODE = lltype.GcStruct('node', ('tid', lltype.Signed),
                                       ('value', lltype.Signed))
        nodedescr = cpu.sizeof(NODE)
        valuedescr = cpu.fielddescrof(NODE, 'value')

        self.cpu = cpu
        self.nodedescr = nodedescr
        vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
        vtable_int = cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(vtable))
        NODE2 = lltype.GcStruct('node2',
                                  ('parent', rclass.OBJECT),
                                  ('tid', lltype.Signed),
                                  ('vtable', lltype.Ptr(rclass.OBJECT_VTABLE)))
        descrsize = cpu.sizeof(NODE2)
        heaptracker.register_known_gctype(cpu, vtable, NODE2)
        self.descrsize = descrsize
        self.vtable_int = vtable_int

        self.namespace = locals().copy()
示例#2
0
 def check_rewrite(self, frm_operations, to_operations, **namespace):
     S = lltype.GcStruct('S', ('x', lltype.Signed), ('y', lltype.Signed))
     sdescr = get_size_descr(self.gc_ll_descr, S)
     sdescr.tid = 1234
     #
     T = lltype.GcStruct('T', ('y', lltype.Signed), ('z', lltype.Ptr(S)),
                         ('t', lltype.Signed))
     tdescr = get_size_descr(self.gc_ll_descr, T)
     tdescr.tid = 5678
     tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
     #
     A = lltype.GcArray(lltype.Signed)
     adescr = get_array_descr(self.gc_ll_descr, A)
     adescr.tid = 4321
     alendescr = adescr.lendescr
     #
     B = lltype.GcArray(lltype.Char)
     bdescr = get_array_descr(self.gc_ll_descr, B)
     bdescr.tid = 8765
     blendescr = bdescr.lendescr
     #
     C = lltype.GcArray(lltype.Ptr(S))
     cdescr = get_array_descr(self.gc_ll_descr, C)
     cdescr.tid = 8111
     clendescr = cdescr.lendescr
     #
     E = lltype.GcStruct('Empty')
     edescr = get_size_descr(self.gc_ll_descr, E)
     edescr.tid = 9000
     #
     vtable_descr = self.gc_ll_descr.fielddescr_vtable
     O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
                         ('x', lltype.Signed))
     o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     register_known_gctype(self.cpu, o_vtable, O)
     #
     tiddescr = self.gc_ll_descr.fielddescr_tid
     wbdescr = self.gc_ll_descr.write_barrier_descr
     WORD = globals()['WORD']
     #
     strdescr = self.gc_ll_descr.str_descr
     unicodedescr = self.gc_ll_descr.unicode_descr
     strlendescr = strdescr.lendescr
     unicodelendescr = unicodedescr.lendescr
     #
     namespace.update(locals())
     #
     for funcname in self.gc_ll_descr._generated_functions:
         namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname)
         namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
                                                  '%s_descr' % funcname)
     #
     ops = parse(frm_operations, namespace=namespace)
     expected = parse(to_operations % Evaluator(namespace),
                      namespace=namespace)
     operations = self.gc_ll_descr.rewrite_assembler(
         self.cpu, ops.operations, [])
     equaloplists(operations, expected.operations)
示例#3
0
 def get_random_structure_type_and_vtable(self, r):
     if self.structure_types_and_vtables and r.random() < 0.5:
         return r.choice(self.structure_types_and_vtables)
     vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     vtable.subclassrange_min = self.vtable_counter
     vtable.subclassrange_max = self.vtable_counter
     self.vtable_counter += 1
     S = self.get_random_structure_type(r, with_vtable=vtable, cache=False)
     name = S._name
     vtable.name = lltype.malloc(lltype.Array(lltype.Char), len(name)+1,
                                 immortal=True)
     for i in range(len(name)):
         vtable.name[i] = name[i]
     vtable.name[len(name)] = '\x00'
     self.structure_types_and_vtables.append((S, vtable))
     #
     heaptracker.register_known_gctype(self.cpu, vtable, S)
     #
     return S, vtable
示例#4
0
 def get_random_structure_type_and_vtable(self, r):
     if self.structure_types_and_vtables and r.random() < 0.5:
         return r.choice(self.structure_types_and_vtables)
     vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     vtable.subclassrange_min = self.vtable_counter
     vtable.subclassrange_max = self.vtable_counter
     self.vtable_counter += 1
     S = self.get_random_structure_type(r, with_vtable=vtable, cache=False)
     name = S._name
     vtable.name = lltype.malloc(lltype.Array(lltype.Char),
                                 len(name) + 1,
                                 immortal=True)
     for i in range(len(name)):
         vtable.name[i] = name[i]
     vtable.name[len(name)] = '\x00'
     self.structure_types_and_vtables.append((S, vtable))
     #
     heaptracker.register_known_gctype(self.cpu, vtable, S)
     #
     return S, vtable
示例#5
0
 def check_rewrite(self, frm_operations, to_operations, **namespace):
     S = lltype.GcStruct('S', ('x', lltype.Signed),
                              ('y', lltype.Signed))
     sdescr = get_size_descr(self.gc_ll_descr, S)
     sdescr.tid = 1234
     #
     T = lltype.GcStruct('T', ('y', lltype.Signed),
                              ('z', lltype.Ptr(S)),
                              ('t', lltype.Signed))
     tdescr = get_size_descr(self.gc_ll_descr, T)
     tdescr.tid = 5678
     tzdescr = get_field_descr(self.gc_ll_descr, T, 'z')
     #
     A = lltype.GcArray(lltype.Signed)
     adescr = get_array_descr(self.gc_ll_descr, A)
     adescr.tid = 4321
     alendescr = adescr.lendescr
     #
     B = lltype.GcArray(lltype.Char)
     bdescr = get_array_descr(self.gc_ll_descr, B)
     bdescr.tid = 8765
     blendescr = bdescr.lendescr
     #
     C = lltype.GcArray(lltype.Ptr(S))
     cdescr = get_array_descr(self.gc_ll_descr, C)
     cdescr.tid = 8111
     clendescr = cdescr.lendescr
     #
     E = lltype.GcStruct('Empty')
     edescr = get_size_descr(self.gc_ll_descr, E)
     edescr.tid = 9000
     #
     vtable_descr = self.gc_ll_descr.fielddescr_vtable
     O = lltype.GcStruct('O', ('parent', rclass.OBJECT),
                              ('x', lltype.Signed))
     o_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
     register_known_gctype(self.cpu, o_vtable, O)
     #
     tiddescr = self.gc_ll_descr.fielddescr_tid
     wbdescr = self.gc_ll_descr.write_barrier_descr
     WORD = globals()['WORD']
     #
     strdescr     = self.gc_ll_descr.str_descr
     unicodedescr = self.gc_ll_descr.unicode_descr
     strlendescr     = strdescr.lendescr
     unicodelendescr = unicodedescr.lendescr
     #
     namespace.update(locals())
     #
     for funcname in self.gc_ll_descr._generated_functions:
         namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname)
         namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
                                                  '%s_descr' % funcname)
     #
     ops = parse(frm_operations, namespace=namespace)
     expected = parse(to_operations % Evaluator(namespace),
                      namespace=namespace)
     operations = self.gc_ll_descr.rewrite_assembler(self.cpu,
                                                     ops.operations,
                                                     [])
     equaloplists(operations, expected.operations)
示例#6
0
class LLtypeMixin(object):
    type_system = 'lltype'

    def get_class_of_box(self, box):
        return box.getref(rclass.OBJECTPTR).typeptr

    node_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
    node_vtable.name = rclass.alloc_array_name('node')
    node_vtable_adr = llmemory.cast_ptr_to_adr(node_vtable)
    node_vtable2 = lltype.malloc(OBJECT_VTABLE, immortal=True)
    node_vtable2.name = rclass.alloc_array_name('node2')
    node_vtable_adr2 = llmemory.cast_ptr_to_adr(node_vtable2)
    cpu = runner.LLtypeCPU(None)

    NODE = lltype.GcForwardReference()
    NODE.become(lltype.GcStruct('NODE', ('parent', OBJECT),
                                        ('value', lltype.Signed),
                                        ('floatval', lltype.Float),
                                        ('next', lltype.Ptr(NODE))))
    NODE2 = lltype.GcStruct('NODE2', ('parent', NODE),
                                     ('other', lltype.Ptr(NODE)))
    node = lltype.malloc(NODE)
    node.parent.typeptr = node_vtable
    node2 = lltype.malloc(NODE2)
    node2.parent.parent.typeptr = node_vtable2
    nodebox = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, node))
    myptr = nodebox.value
    myptr2 = lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(NODE))
    nullptr = lltype.nullptr(llmemory.GCREF.TO)
    nodebox2 = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, node2))
    nodesize = cpu.sizeof(NODE)
    nodesize2 = cpu.sizeof(NODE2)
    valuedescr = cpu.fielddescrof(NODE, 'value')
    floatdescr = cpu.fielddescrof(NODE, 'floatval')
    nextdescr = cpu.fielddescrof(NODE, 'next')
    otherdescr = cpu.fielddescrof(NODE2, 'other')

    accessor = FieldListAccessor()
    accessor.initialize(None, {'inst_field': IR_QUASIIMMUTABLE})
    QUASI = lltype.GcStruct('QUASIIMMUT', ('inst_field', lltype.Signed),
                            ('mutate_field', rclass.OBJECTPTR),
                            hints={'immutable_fields': accessor})
    quasisize = cpu.sizeof(QUASI)
    quasi = lltype.malloc(QUASI, immortal=True)
    quasi.inst_field = -4247
    quasifielddescr = cpu.fielddescrof(QUASI, 'inst_field')
    quasibox = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, quasi))
    quasiimmutdescr = QuasiImmutDescr(cpu, quasibox,
                                      quasifielddescr,
                                      cpu.fielddescrof(QUASI, 'mutate_field'))

    NODEOBJ = lltype.GcStruct('NODEOBJ', ('parent', OBJECT),
                                         ('ref', lltype.Ptr(OBJECT)))
    nodeobj = lltype.malloc(NODEOBJ)
    nodeobjvalue = lltype.cast_opaque_ptr(llmemory.GCREF, nodeobj)
    refdescr = cpu.fielddescrof(NODEOBJ, 'ref')

    INTOBJ_NOIMMUT = lltype.GcStruct('INTOBJ_NOIMMUT', ('parent', OBJECT),
                                                ('intval', lltype.Signed))
    INTOBJ_IMMUT = lltype.GcStruct('INTOBJ_IMMUT', ('parent', OBJECT),
                                            ('intval', lltype.Signed),
                                            hints={'immutable': True})
    intobj_noimmut_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
    intobj_immut_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
    noimmut_intval = cpu.fielddescrof(INTOBJ_NOIMMUT, 'intval')
    immut_intval = cpu.fielddescrof(INTOBJ_IMMUT, 'intval')

    PTROBJ_IMMUT = lltype.GcStruct('PTROBJ_IMMUT', ('parent', OBJECT),
                                            ('ptrval', lltype.Ptr(OBJECT)),
                                            hints={'immutable': True})
    ptrobj_immut_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
    immut_ptrval = cpu.fielddescrof(PTROBJ_IMMUT, 'ptrval')

    arraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Signed))
    floatarraydescr = cpu.arraydescrof(lltype.GcArray(lltype.Float))

    # a GcStruct not inheriting from OBJECT
    S = lltype.GcStruct('TUPLE', ('a', lltype.Signed), ('b', lltype.Ptr(NODE)))
    ssize = cpu.sizeof(S)
    adescr = cpu.fielddescrof(S, 'a')
    bdescr = cpu.fielddescrof(S, 'b')
    sbox = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(S)))
    arraydescr2 = cpu.arraydescrof(lltype.GcArray(lltype.Ptr(S)))

    T = lltype.GcStruct('TUPLE',
                        ('c', lltype.Signed),
                        ('d', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE)))))
    tsize = cpu.sizeof(T)
    cdescr = cpu.fielddescrof(T, 'c')
    ddescr = cpu.fielddescrof(T, 'd')
    arraydescr3 = cpu.arraydescrof(lltype.GcArray(lltype.Ptr(NODE)))

    U = lltype.GcStruct('U',
                        ('parent', OBJECT),
                        ('one', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE)))))
    u_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
    u_vtable_adr = llmemory.cast_ptr_to_adr(u_vtable)
    usize = cpu.sizeof(U)
    onedescr = cpu.fielddescrof(U, 'one')

    FUNC = lltype.FuncType([lltype.Signed], lltype.Signed)
    plaincalldescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                                     EffectInfo.MOST_GENERAL)
    nonwritedescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                                    EffectInfo([], [], [], []))
    writeadescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                                  EffectInfo([], [], [adescr], []))
    writearraydescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                                  EffectInfo([], [], [adescr], [arraydescr]))
    readadescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                                 EffectInfo([adescr], [], [], []))
    mayforcevirtdescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                 EffectInfo([nextdescr], [], [], [],
                            EffectInfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE,
                            can_invalidate=True))
    arraycopydescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
             EffectInfo([], [arraydescr], [], [arraydescr],
                        EffectInfo.EF_CANNOT_RAISE,
                        oopspecindex=EffectInfo.OS_ARRAYCOPY))


    # array of structs (complex data)
    complexarray = lltype.GcArray(
        lltype.Struct("complex",
            ("real", lltype.Float),
            ("imag", lltype.Float),
        )
    )
    complexarraydescr = cpu.arraydescrof(complexarray)
    complexrealdescr = cpu.interiorfielddescrof(complexarray, "real")
    compleximagdescr = cpu.interiorfielddescrof(complexarray, "imag")

    for _name, _os in [
        ('strconcatdescr',               'OS_STR_CONCAT'),
        ('strslicedescr',                'OS_STR_SLICE'),
        ('strequaldescr',                'OS_STR_EQUAL'),
        ('streq_slice_checknull_descr',  'OS_STREQ_SLICE_CHECKNULL'),
        ('streq_slice_nonnull_descr',    'OS_STREQ_SLICE_NONNULL'),
        ('streq_slice_char_descr',       'OS_STREQ_SLICE_CHAR'),
        ('streq_nonnull_descr',          'OS_STREQ_NONNULL'),
        ('streq_nonnull_char_descr',     'OS_STREQ_NONNULL_CHAR'),
        ('streq_checknull_char_descr',   'OS_STREQ_CHECKNULL_CHAR'),
        ('streq_lengthok_descr',         'OS_STREQ_LENGTHOK'),
        ]:
        _oopspecindex = getattr(EffectInfo, _os)
        locals()[_name] = \
            cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE,
                           oopspecindex=_oopspecindex))
        #
        _oopspecindex = getattr(EffectInfo, _os.replace('STR', 'UNI'))
        locals()[_name.replace('str', 'unicode')] = \
            cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
                EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE,
                           oopspecindex=_oopspecindex))

    s2u_descr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
            EffectInfo([], [], [], [], oopspecindex=EffectInfo.OS_STR2UNICODE))
    #

    class LoopToken(AbstractDescr):
        pass
    asmdescr = LoopToken() # it can be whatever, it's not a descr though

    from pypy.jit.metainterp.virtualref import VirtualRefInfo
    class FakeWarmRunnerDesc:
        pass
    FakeWarmRunnerDesc.cpu = cpu
    vrefinfo = VirtualRefInfo(FakeWarmRunnerDesc)
    virtualtokendescr = vrefinfo.descr_virtual_token
    virtualforceddescr = vrefinfo.descr_forced
    jit_virtual_ref_vtable = vrefinfo.jit_virtual_ref_vtable
    jvr_vtable_adr = llmemory.cast_ptr_to_adr(jit_virtual_ref_vtable)

    register_known_gctype(cpu, node_vtable,  NODE)
    register_known_gctype(cpu, node_vtable2, NODE2)
    register_known_gctype(cpu, u_vtable,     U)
    register_known_gctype(cpu, jit_virtual_ref_vtable,vrefinfo.JIT_VIRTUAL_REF)
    register_known_gctype(cpu, intobj_noimmut_vtable, INTOBJ_NOIMMUT)
    register_known_gctype(cpu, intobj_immut_vtable,   INTOBJ_IMMUT)
    register_known_gctype(cpu, ptrobj_immut_vtable,   PTROBJ_IMMUT)

    namespace = locals()