예제 #1
0
 def handle_malloc_operation(self, op):
     opnum = op.getopnum()
     if opnum == rop.NEW:
         self.handle_new_fixedsize(op.getdescr(), op)
     elif opnum == rop.NEW_WITH_VTABLE:
         classint = op.getarg(0).getint()
         descr = heaptracker.vtable2descr(self.cpu, classint)
         self.handle_new_fixedsize(descr, op)
         if self.gc_ll_descr.fielddescr_vtable is not None:
             op = ResOperation(rop.SETFIELD_GC,
                               [op.result, ConstInt(classint)],
                               None,
                               descr=self.gc_ll_descr.fielddescr_vtable)
             self.newops.append(op)
     elif opnum == rop.NEW_ARRAY or opnum == rop.NEW_ARRAY_CLEAR:
         descr = op.getdescr()
         assert isinstance(descr, ArrayDescr)
         self.handle_new_array(descr, op)
     elif opnum == rop.NEWSTR:
         self.handle_new_array(self.gc_ll_descr.str_descr,
                               op,
                               kind=FLAG_STR)
     elif opnum == rop.NEWUNICODE:
         self.handle_new_array(self.gc_ll_descr.unicode_descr,
                               op,
                               kind=FLAG_UNICODE)
     else:
         raise NotImplementedError(op.getopname())
예제 #2
0
파일: rewrite.py 프로젝트: Darriall/pypy
 def handle_malloc_operation(self, op):
     opnum = op.getopnum()
     if opnum == rop.NEW:
         self.handle_new_fixedsize(op.getdescr(), op)
     elif opnum == rop.NEW_WITH_VTABLE:
         classint = op.getarg(0).getint()
         descr = heaptracker.vtable2descr(self.cpu, classint)
         self.handle_new_fixedsize(descr, op)
         if self.gc_ll_descr.fielddescr_vtable is not None:
             op = ResOperation(rop.SETFIELD_GC,
                               [op.result, ConstInt(classint)], None,
                               descr=self.gc_ll_descr.fielddescr_vtable)
             self.newops.append(op)
     elif opnum == rop.NEW_ARRAY or opnum == rop.NEW_ARRAY_CLEAR:
         descr = op.getdescr()
         assert isinstance(descr, ArrayDescr)
         self.handle_new_array(descr, op)
     elif opnum == rop.NEWSTR:
         self.handle_new_array(self.gc_ll_descr.str_descr, op,
                               kind=FLAG_STR)
     elif opnum == rop.NEWUNICODE:
         self.handle_new_array(self.gc_ll_descr.unicode_descr, op,
                               kind=FLAG_UNICODE)
     else:
         raise NotImplementedError(op.getopname())
예제 #3
0
def test_malloc_new_with_vtable():
    vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
    S = lltype.GcStruct("S", ("parent", rclass.OBJECT))
    heaptracker.set_testing_vtable_for_gcstruct(S, vtable, "S")
    v = varoftype(lltype.Ptr(S))
    op = SpaceOperation("malloc", [Constant(S, lltype.Void), Constant({"flavor": "gc"}, lltype.Void)], v)
    cpu = FakeCPU()
    op1 = Transformer(cpu).rewrite_operation(op)
    assert op1.opname == "new_with_vtable"
    assert op1.args == [("sizedescr", S)]
    # assert heaptracker.descr2vtable(cpu, op1.args[0]) == vtable [type check]
    vtable_int = heaptracker.adr2int(llmemory.cast_ptr_to_adr(vtable))
    assert heaptracker.vtable2descr(cpu, vtable_int) == op1.args[0]
예제 #4
0
 def _get_descr(self):
     return vtable2descr(self.cpu, self.known_class.getint())
예제 #5
0
파일: runner.py 프로젝트: Qointum/pypy
 def execute_new_with_vtable(self, _, vtable):
     descr = heaptracker.vtable2descr(self.cpu, vtable)
     return self.cpu.bh_new_with_vtable(vtable, descr)
예제 #6
0
파일: executor.py 프로젝트: Darriall/pypy
def exec_new_with_vtable(cpu, clsbox):
    from rpython.jit.codewriter import heaptracker
    vtable = clsbox.getint()
    descr = heaptracker.vtable2descr(cpu, vtable)
    return cpu.bh_new_with_vtable(vtable, descr)
예제 #7
0
def exec_new_with_vtable(cpu, clsbox):
    from rpython.jit.codewriter import heaptracker
    vtable = clsbox.getint()
    descr = heaptracker.vtable2descr(cpu, vtable)
    return cpu.bh_new_with_vtable(vtable, descr)
예제 #8
0
파일: virtualize.py 프로젝트: charred/pypy
 def _get_descr(self):
     return vtable2descr(self.cpu, self.known_class.getint())
예제 #9
0
 def execute_new_with_vtable(self, _, vtable):
     descr = heaptracker.vtable2descr(self.cpu, vtable)
     return self.cpu.bh_new_with_vtable(vtable, descr)