[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