[pypy-svn] r62648 - in pypy/branch/pyjitpl5/pypy/jit/backend/x86: . test

fijal at codespeak.net fijal at codespeak.net
Fri Mar 6 16:28:06 CET 2009


Author: fijal
Date: Fri Mar  6 16:28:05 2009
New Revision: 62648

Modified:
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py
   pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py
Log:
IN-PROGRESS. Refactor x86 backend to adapt to new interface. Add xxx in places
that should never be called


Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/assembler.py	Fri Mar  6 16:28:05 2009
@@ -499,47 +499,19 @@
         self.mc2.JMP(eax)
         return recovery_code_addr
 
-    def _new_gen_call():
-        def gen_call(self, op, arglocs, resloc):
-            extra_on_stack = 0
-            for i in range(len(op.args) - 1, 0, -1):
+    def genop_call(self, op, arglocs, resloc):
+        extra_on_stack = 0
+        for i in range(len(op.args) - 1, 0, -1):
+            # op.args[1] is a calldesc
+            if i != 1:
                 v = op.args[i]
-                loc = arglocs[i]
+                loc = arglocs[len(arglocs) - 1 - extra_on_stack]
                 if not isinstance(loc, MODRM):
                     self.mc.PUSH(loc)
                 else:
                     # we need to add a bit, ble
                     self.mc.PUSH(stack_pos(loc.position + extra_on_stack))
                 extra_on_stack += 1
-            if isinstance(op.args[0], Const):
-                x = rel32(self.cpu.get_box_value_as_int(op.args[0]))
-            else:
-                # XXX add extra_on_stack?
-                x = arglocs[0]
-            self.mc.CALL(x)
-            self.mc.ADD(esp, imm(WORD * extra_on_stack))
-        return gen_call
-
-    genop_call__4 = _new_gen_call()
-    gen_call = _new_gen_call()
-    genop_call_ptr = gen_call
-    xxx_genop_getitem = _new_gen_call()    
-    xxx_genop_len = _new_gen_call()
-    xxx_genop_pop = _new_gen_call()
-    xxx_genop_newlist = _new_gen_call()
-    xxx_genop_listnonzero = _new_gen_call()
-
-    def genop_call_void(self, op, arglocs):
-        extra_on_stack = 0
-        for i in range(len(op.args) - 1, 0, -1):
-            v = op.args[i]
-            loc = arglocs[i]
-            if not isinstance(loc, MODRM):
-                self.mc.PUSH(loc)
-            else:
-                # we need to add a bit, ble
-                self.mc.PUSH(stack_pos(loc.position + extra_on_stack))
-            extra_on_stack += 1
         if isinstance(op.args[0], Const):
             x = rel32(self.cpu.get_box_value_as_int(op.args[0]))
         else:
@@ -548,18 +520,14 @@
         self.mc.CALL(x)
         self.mc.ADD(esp, imm(WORD * extra_on_stack))
 
-    xxx_genop_append = genop_call_void
-    xxx_genop_setitem = genop_call_void
-    xxx_genop_insert = genop_call_void
-
-    def genop_call__1(self, op, arglocs, resloc):
-        self.gen_call(op, arglocs, resloc)
-        self.mc.MOVZX(eax, al)
-
-    def genop_call__2(self, op, arglocs, resloc):
-        # XXX test it test it test it
-        self.gen_call(op, arglocs, resloc)
-        self.mc.MOVZX(eax, eax)
+    #def genop_call__1(self, op, arglocs, resloc):
+    #    self.gen_call(op, arglocs, resloc)
+    #    self.mc.MOVZX(eax, al)
+
+    #def genop_call__2(self, op, arglocs, resloc):
+    #    # XXX test it test it test it
+    #    self.gen_call(op, arglocs, resloc)
+    #    self.mc.MOVZX(eax, eax)
 
 genop_discard_list = [None] * rop._LAST
 genop_list = [None] * rop._LAST
@@ -579,8 +547,6 @@
         else:
             genop_list[num] = value
 
-genop_discard_list[rop.CALL_VOID] = Assembler386.genop_call_void
-
 def addr_add(reg_or_imm1, reg_or_imm2, offset=0, scale=0):
     if isinstance(reg_or_imm1, IMM32):
         if isinstance(reg_or_imm2, IMM32):

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/regalloc.py	Fri Mar  6 16:28:05 2009
@@ -718,14 +718,11 @@
             self.free_regs = REGS[:]
             return ops + [PerformDiscard(op, arglocs)]
 
-    def consider_call_ptr(self, op, ignored):
-        return self._call(op, [self.loc(arg) for arg in op.args])
+    def consider_call(self, op, ignored):
+        args = [op.args[0]] + op.args[2:]
+        return self._call(op, [self.loc(arg) for arg in args])
 
-    consider_call_void = consider_call_ptr
-    consider_call__1 = consider_call_ptr
-    consider_call__2 = consider_call_ptr
-    consider_call__4 = consider_call_ptr
-    consider_call__8 = consider_call_ptr
+    consider_call_pure = consider_call
 
     def consider_new(self, op, ignored):
         return self._call(op, [self.loc(arg) for arg in op.args])
@@ -764,15 +761,6 @@
                                [eax, imm(ofs + ofs_length), imm(WORD), loc])])
         return res
 
-    
-    def _unpack_arraydescr(self, arraydescr):
-        if arraydescr < 0:
-            arraydescr = ~arraydescr
-        assert arraydescr
-        size_of_field = arraydescr >> 16
-        ofs = arraydescr & 0xffff
-        return size_of_field, ofs
-
     def consider_new_array(self, op, ignored):
         size_of_field, basesize = self._unpack_arraydescr(op.args[0].getint())
         return self._malloc_varsize(0, basesize, 0, size_of_field, op.args[1],
@@ -785,12 +773,14 @@
         assert reg
         return [Perform(op, [argloc], reg)]
 
+    def _unpack_arraydescr(self, arraydescr):
+        from pypy.jit.backend.x86.runner import CPU386
+        return CPU386.unpack_arraydescr(arraydescr)
+
     def _unpack_fielddescr(self, fielddescr):
-        if fielddescr < 0:
-            fielddescr = ~fielddescr
-        ofs_loc = imm(fielddescr & 0xffff)
-        size_loc = imm(fielddescr >> 16)
-        return ofs_loc, size_loc
+        from pypy.jit.backend.x86.runner import CPU386
+        ofs, size, _ = CPU386.unpack_fielddescr(arraydescr)
+        return imm(ofs), imm(size)
 
     def consider_setfield_gc(self, op, ignored):
         base_loc, ops0  = self.make_sure_var_in_reg(op.args[0], op.args)

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/runner.py	Fri Mar  6 16:28:05 2009
@@ -1,7 +1,7 @@
 import sys
 import ctypes
 import py
-from pypy.rpython.lltypesystem import lltype, llmemory, ll2ctypes, rffi
+from pypy.rpython.lltypesystem import lltype, llmemory, ll2ctypes, rffi, rstr
 from pypy.rpython.llinterp import LLInterpreter, LLException
 from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rlib.objectmodel import CDefinedIntSymbolic, specialize
@@ -11,10 +11,13 @@
 from pypy.jit.metainterp import history
 from pypy.jit.metainterp.history import (ResOperation, Box, Const,
      ConstInt, ConstPtr, BoxInt, BoxPtr, ConstAddr)
-from pypy.jit.backend.x86.assembler import Assembler386
+from pypy.jit.backend.x86.assembler import Assembler386, WORD
 from pypy.jit.backend.x86 import symbolic
 from pypy.jit.metainterp.resoperation import rop, opname
 from pypy.jit.backend.x86.executor import execute
+from pypy.jit.backend.x86.support import gc_malloc_fnaddr
+
+GC_MALLOC = lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed))
 
 class CPU386(object):
     debug = True
@@ -139,6 +142,7 @@
         return self.cast_int_to_gcref(self.assembler._exception_data[1])
 
     def execute_operation(self, opnum, valueboxes, result_type):
+        xxx
         if execute[opnum] is not None:
             return execute[opnum](valueboxes)
         
@@ -171,6 +175,7 @@
 
     def get_compiled_single_operation(self, opnum, result_type, key,
                                       valueboxes):
+        xxx
         real_key = '%d,%s' % (opnum, result_type) + ','.join(key)
         try:
             return self._compiled_ops[real_key]
@@ -355,16 +360,161 @@
     def sizeof(self, S):
         return symbolic.get_size(S)
 
-    numof = sizeof
-    addresssuffix = str(symbolic.get_size(llmemory.Address))
+#    numof = sizeof
+#    addresssuffix = str(symbolic.get_size(llmemory.Address))
 
-    def itemoffsetof(self, A):
-        basesize, itemsize, ofs_length = symbolic.get_array_token(A)
-        return basesize
+#    def itemoffsetof(self, A):
+#        basesize, itemsize, ofs_length = symbolic.get_array_token(A)
+#        return basesize
+
+#    def arraylengthoffset(self, A):
+#        basesize, itemsize, ofs_length = symbolic.get_array_token(A)
+#        return ofs_length
+
+    # ------------------- backend-specific ops ------------------------
+
+    def do_arraylen_gc(self, args):
+        gcref = args[0].getptr(llmemory.GCREF)
+        return BoxInt(rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[0])
+
+    def do_getarrayitem_gc(self, args):
+        arraydescr = args[1].getint()
+        field = args[2].getint()
+        gcref = args[0].getptr(llmemory.GCREF)
+        if arraydescr < 0:
+            ptr = True
+        else:
+            ptr = False
+        shift, ofs = self.unpack_arraydescr(arraydescr)
+        size = 1 << shift
+        if size == 1:
+            return BoxInt(ord(rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)
+                          [ofs + field]))
+        elif size == WORD:
+            val = (rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
+                   [ofs/WORD + field])
+            if not ptr:
+                return BoxInt(val)
+            else:
+                return BoxPtr(self.cast_int_to_gcref(val))
+        else:
+            raise NotImplementedError("size = %d" % size)
 
-    def arraylengthoffset(self, A):
-        basesize, itemsize, ofs_length = symbolic.get_array_token(A)
-        return ofs_length
+    def do_setarrayitem_gc(self, args):
+        arraydescr = args[1].getint()
+        field = args[2].getint()
+        gcref = args[0].getptr(llmemory.GCREF)
+        if arraydescr < 0:
+            ptr = True
+        else:
+            ptr = False
+        shift, ofs = self.unpack_arraydescr(arraydescr)
+        size = 1 << shift
+        if size == 1:
+            v = args[3].getint()
+            rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[ofs + field] = chr(v)
+        elif size == WORD:
+            a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
+            if not ptr:
+                a[ofs/WORD + field] = args[3].getint()
+            else:
+                p = args[3].getptr(llmemory.GCREF)
+                a[ofs/WORD + field] = self.cast_gcref_to_int(p)
+        else:
+            raise NotImplementedError("size = %d" % size)
+
+    def do_strlen(self, args):
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+        gcref = args[0].getptr(llmemory.GCREF)
+        v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs_length/WORD]
+        return BoxInt(v)
+
+    def do_strgetitem(self, args):
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+        gcref = args[0].getptr(llmemory.GCREF)
+        i = args[1].getint()
+        v = rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[basesize + i]
+        return BoxInt(ord(v))
+
+    @specialize.argtype(1)
+    def _base_do_getfield(self, gcref, fielddescr):
+        ofs, size, ptr = self.unpack_fielddescr(fielddescr)
+        if size == 1:
+            v = ord(rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[ofs])
+        elif size == 2:
+            v = rffi.cast(rffi.CArrayPtr(rffi.USHORT), gcref)[ofs/2]
+        elif size == WORD:
+            v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs/WORD]
+            if ptr:
+                return BoxPtr(self.cast_int_to_gcref(v))
+        else:
+            raise NotImplementedError("size = %d" % size)
+        return BoxInt(v)
+
+    def do_getfield_gc(self, args):
+        fielddescr = args[1].getint()
+        gcref = args[0].getptr(llmemory.GCREF)
+        return self._base_do_getfield(gcref, fielddescr)
+
+    def do_getfield_raw(self, args):
+        fielddescr = args[1].getint()
+        return self._base_do_getfield(args[0].getint(), fielddescr)
+
+    @specialize.argtype(2)
+    def _base_do_setfield(self, fielddescr, gcref, vbox):
+        ofs, size, ptr = self.unpack_fielddescr(fielddescr)
+        if size == 1:
+            v = vbox.getint()
+            rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[ofs] = chr(v)
+        elif size == 2:
+            v = vbox.getint()
+            rffi.cast(rffi.CArrayPtr(rffi.USHORT), gcref)[ofs/2] = v
+        elif size == WORD:
+            a = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)
+            if ptr:
+                ptr = vbox.getptr(llmemory.GCREF)
+                a[ofs/WORD] = self.cast_gcref_to_int(ptr)
+            else:
+                a[ofs/WORD] = vbox.getint()
+        else:
+            raise NotImplementedError("size = %d" % size)
+
+    def do_setfield_gc(self, args):
+        fielddescr = args[1].getint()
+        gcref = args[0].getptr(llmemory.GCREF)
+        self._base_do_setfield(fielddescr, gcref, args[2])
+
+    def do_setfield_raw(self, args):
+        fielddescr = args[1].getint()
+        self._base_do_setfield(fielddescr, args[0].getint(), args[2])
+
+    def do_new(self, args):
+        res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(args[0].getint())
+        return BoxPtr(self.cast_int_to_gcref(res))
+
+    def do_new_with_vtable(self, args):
+        res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(args[0].getint())
+        rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[0] = args[1].getint()
+        return BoxPtr(self.cast_int_to_gcref(res))
+
+    def do_new_array(self, args):
+        size_of_field, ofs = self.unpack_arraydescr(args[0].getint())
+        num_elem = args[1].getint()
+        size = ofs + (1 << size_of_field) * num_elem
+        res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(size)
+        rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[0] = num_elem
+        return BoxPtr(self.cast_int_to_gcref(res))
+
+    def do_newstr(self, args):
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR)
+        assert itemsize == 1
+        num_elem = args[0].getint()
+        size = basesize + num_elem
+        res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(size)
+        rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem
+        return BoxPtr(self.cast_int_to_gcref(res))
+
+    # ------------------- helpers and descriptions --------------------
 
     @staticmethod
     def cast_adr_to_int(x):
@@ -391,6 +541,20 @@
         return res
 
     @staticmethod
+    def unpack_arraydescr(arraydescr):
+        # XXX move it to some saner place, regalloc is using it
+        if arraydescr < 0:
+            arraydescr = ~arraydescr
+        assert arraydescr
+        size_of_field = arraydescr >> 16
+        ofs = arraydescr & 0xffff
+        return size_of_field, ofs
+
+    @staticmethod
+    def calldescrof(argtypes, resulttype):
+        return 3
+
+    @staticmethod
     def fielddescrof(S, fieldname):
         ofs, size = symbolic.get_field_token(S, fieldname)
         val = (size << 16) + ofs
@@ -400,6 +564,16 @@
         return val
 
     @staticmethod
+    def unpack_fielddescr(fielddescr):
+        ptr = False
+        if fielddescr < 0:
+            fielddescr = ~fielddescr
+            ptr = True
+        ofs = fielddescr & 0xffff
+        size = fielddescr >> 16
+        return ofs, size, ptr
+
+    @staticmethod
     def typefor(fielddesc):
         if fielddesc < 0:
             return "ptr"

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/support.py	Fri Mar  6 16:28:05 2009
@@ -10,9 +10,6 @@
 
 GC_MALLOC = lltype.Ptr(lltype.FuncType([lltype.Signed], llmemory.Address))
 
-def gc_malloc(size):
-    return llop.call_boehm_gc_alloc(llmemory.Address, size)
-
 def gc_malloc_fnaddr():
     """Returns the address of the Boehm 'malloc' function."""
     if we_are_translated():

Modified: pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/x86/test/test_runner.py	Fri Mar  6 16:28:05 2009
@@ -1,5 +1,5 @@
 import py
-from pypy.rpython.lltypesystem import lltype, llmemory, rffi
+from pypy.rpython.lltypesystem import lltype, llmemory, rffi, rstr, rclass
 from pypy.jit.metainterp.history import ResOperation
 from pypy.jit.metainterp.history import (BoxInt, BoxPtr, ConstInt, ConstPtr,
                                          Box)
@@ -370,3 +370,138 @@
 
         res = self.execute_operation(rop.UINT_GT, [arg0, arg1], 'int')
         assert res.value == 1
+
+    def test_do_operations(self):
+        cpu = self.cpu
+        #
+        A = lltype.GcArray(lltype.Char)
+        descrbox_A = ConstInt(cpu.arraydescrof(A))
+        a = lltype.malloc(A, 5)
+        x = cpu.do_arraylen_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, a)), descrbox_A])
+        assert x.value == 5
+        #
+        a[2] = 'Y'
+        x = cpu.do_getarrayitem_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, a)), descrbox_A,
+             BoxInt(2)])
+        assert x.value == ord('Y')
+        #
+        B = lltype.GcArray(lltype.Ptr(A))
+        descrbox_B = ConstInt(cpu.arraydescrof(B))
+        b = lltype.malloc(B, 4)
+        b[3] = a
+        x = cpu.do_getarrayitem_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, b)), descrbox_B,
+             BoxInt(3)])
+        assert isinstance(x, BoxPtr)
+        assert x.getptr(lltype.Ptr(A)) == a
+        #
+        s = rstr.mallocstr(6)
+        x = cpu.do_strlen(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, s))])
+        assert x.value == 6
+        #
+        s.chars[3] = 'X'
+        x = cpu.do_strgetitem(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, s)), BoxInt(3)])
+        assert x.value == ord('X')
+        #
+        S = lltype.GcStruct('S', ('x', lltype.Char), ('y', lltype.Ptr(A)))
+        descrfld_x = cpu.fielddescrof(S, 'x')
+        s = lltype.malloc(S)
+        s.x = 'Z'
+        x = cpu.do_getfield_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, s)),
+             BoxInt(descrfld_x)])
+        assert x.value == ord('Z')
+        #
+        cpu.do_setfield_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, s)),
+             BoxInt(descrfld_x),
+             BoxInt(ord('4'))])
+        assert s.x == '4'
+        #
+        descrfld_y = cpu.fielddescrof(S, 'y')
+        s.y = a
+        x = cpu.do_getfield_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, s)),
+             BoxInt(descrfld_y)])
+        assert isinstance(x, BoxPtr)
+        assert x.getptr(lltype.Ptr(A)) == a
+        #
+        s.y = lltype.nullptr(A)
+        cpu.do_setfield_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, s)),
+             BoxInt(descrfld_y),
+             x])
+        assert s.y == a
+        #
+        RS = lltype.Struct('S', ('x', lltype.Char), ('y', lltype.Ptr(A)))
+        descrfld_rx = cpu.fielddescrof(RS, 'x')
+        rs = lltype.malloc(RS, immortal=True)
+        rs.x = '?'
+        x = cpu.do_getfield_raw(
+            [BoxInt(cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(rs))),
+             BoxInt(descrfld_rx)])
+        assert x.value == ord('?')
+        #
+        cpu.do_setfield_raw(
+            [BoxInt(cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(rs))),
+             BoxInt(descrfld_rx),
+             BoxInt(ord('!'))])
+        assert rs.x == '!'
+        #
+        descrfld_ry = cpu.fielddescrof(RS, 'y')
+        rs.y = a
+        x = cpu.do_getfield_raw(
+            [BoxInt(cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(rs))),
+             BoxInt(descrfld_ry)])
+        assert isinstance(x, BoxPtr)
+        assert x.getptr(lltype.Ptr(A)) == a
+        #
+        rs.y = lltype.nullptr(A)
+        cpu.do_setfield_raw(
+            [BoxInt(cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(rs))),
+             BoxInt(descrfld_ry),
+             x])
+        assert rs.y == a
+        #
+        descrsize = cpu.sizeof(S)
+        x = cpu.do_new(
+            [BoxInt(descrsize)])
+        assert isinstance(x, BoxPtr)
+        x.getptr(lltype.Ptr(S))
+        #
+        descrsize2 = cpu.sizeof(rclass.OBJECT)
+        vtable2 = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
+        x = cpu.do_new_with_vtable(
+            [BoxInt(descrsize2),
+             BoxInt(cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(vtable2)))])
+        assert isinstance(x, BoxPtr)
+        # well....
+        assert (rffi.cast(rffi.CArrayPtr(lltype.Signed),
+                         x.getptr(llmemory.GCREF))[0])
+        #assert x.getptr(rclass.OBJECTPTR).typeptr == vtable2
+        #
+        arraydescr = cpu.arraydescrof(A)
+        x = cpu.do_new_array(
+            [BoxInt(arraydescr), BoxInt(7)])
+        assert isinstance(x, BoxPtr)
+        assert len(x.getptr(lltype.Ptr(A))) == 7
+        #
+        cpu.do_setarrayitem_gc(
+            [x, descrbox_A, BoxInt(5), BoxInt(ord('*'))])
+        assert x.getptr(lltype.Ptr(A))[5] == '*'
+        #
+        cpu.do_setarrayitem_gc(
+            [BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, b)), descrbox_B,
+             BoxInt(1), x])
+        assert b[1] == x.getptr(lltype.Ptr(A))
+        #
+        x = cpu.do_newstr([BoxInt(5)])
+        assert isinstance(x, BoxPtr)
+        assert len(x.getptr(lltype.Ptr(rstr.STR)).chars) == 5
+        #
+        cpu.do_strsetitem([x, BoxInt(4), BoxInt(ord('/'))])
+        assert x.getptr(lltype.Ptr(rstr.STR)).chars[4] == '/'



More information about the Pypy-commit mailing list