[pypy-svn] r64063 - pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal
arigo at codespeak.net
arigo at codespeak.net
Tue Apr 14 14:56:38 CEST 2009
Author: arigo
Date: Tue Apr 14 14:56:37 2009
New Revision: 64063
Modified:
pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py
Log:
Fixes for non-gc pointers.
Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py (original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/minimal/runner.py Tue Apr 14 14:56:37 2009
@@ -160,12 +160,12 @@
'input': make_reader(FIELDTYPE, 'xbox', dict2),
'result': make_writer(FIELDTYPE, 'x', dict2)}
exec py.code.Source("""
- def getfield(pbox):
- p = reveal_ptr(PTR, pbox)
+ def getfield(cpu, pbox):
+ p = reveal_ptr(cpu, PTR, pbox)
x = getattr(p, %(name)r)
return %(result)s
- def setfield(pbox, xbox):
- p = reveal_ptr(PTR, pbox)
+ def setfield(cpu, pbox, xbox):
+ p = reveal_ptr(cpu, PTR, pbox)
x = %(input)s
setattr(p, %(name)r, x)
""" % dict).compile() in dict2
@@ -184,15 +184,15 @@
def new(length):
p = malloc(ARRAY, length)
return cast_opaque_ptr(GCREF, p)
- def length(pbox):
- p = reveal_ptr(PTR, pbox)
+ def length(cpu, pbox):
+ p = reveal_ptr(cpu, PTR, pbox)
return len(p)
- def getarrayitem(pbox, index):
- p = reveal_ptr(PTR, pbox)
+ def getarrayitem(cpu, pbox, index):
+ p = reveal_ptr(cpu, PTR, pbox)
x = p[index]
return %(result)s
- def setarrayitem(pbox, index, xbox):
- p = reveal_ptr(PTR, pbox)
+ def setarrayitem(cpu, pbox, index, xbox):
+ p = reveal_ptr(cpu, PTR, pbox)
x = %(input)s
p[index] = x
""" % dict).compile() in dict2
@@ -214,7 +214,7 @@
'length': len(ARGS),
})
exec py.code.Source("""
- def call(function, args):
+ def call(cpu, function, args):
assert len(args) == length
function = rffi.cast(FUNC, function)
res = function(%(args)s)
@@ -241,14 +241,14 @@
def do_getfield_gc(self, args, fielddescr):
assert isinstance(fielddescr, FieldDescr)
assert fielddescr.getfield is not None
- return fielddescr.getfield(args[0])
+ return fielddescr.getfield(self, args[0])
do_getfield_raw = do_getfield_gc
def do_setfield_gc(self, args, fielddescr):
assert isinstance(fielddescr, FieldDescr)
assert fielddescr.setfield is not None
- fielddescr.setfield(args[0], args[1])
+ fielddescr.setfield(self, args[0], args[1])
do_setfield_raw = do_setfield_gc
@@ -261,7 +261,7 @@
def do_arraylen_gc(self, args, arraydescr):
assert isinstance(arraydescr, ArrayDescr)
assert arraydescr.length is not None
- return BoxInt(arraydescr.length(args[0]))
+ return BoxInt(arraydescr.length(self, args[0]))
do_arraylen_raw = do_arraylen_gc
@@ -269,14 +269,14 @@
assert isinstance(arraydescr, ArrayDescr)
assert arraydescr.getarrayitem is not None
index = args[1].getint()
- return arraydescr.getarrayitem(args[0], index)
+ return arraydescr.getarrayitem(self, args[0], index)
do_getarrayitem_raw = do_getarrayitem_gc
def do_setarrayitem_gc(self, args, arraydescr):
assert isinstance(arraydescr, ArrayDescr)
assert arraydescr.setarrayitem is not None
index = args[1].getint()
- arraydescr.setarrayitem(args[0], index, args[2])
+ arraydescr.setarrayitem(self, args[0], index, args[2])
do_setarrayitem_raw = do_setarrayitem_gc
@@ -329,7 +329,7 @@
assert calldescr.call is not None
self.clear_exception()
try:
- return calldescr.call(args[0].getaddr(self), args[1:])
+ return calldescr.call(self, args[0].getaddr(self), args[1:])
except Exception, e:
from pypy.rpython.annlowlevel import cast_instance_to_base_ptr
self.current_exc_inst = cast_instance_to_base_ptr(e)
@@ -423,16 +423,23 @@
def make_reader(TYPE, boxstr, dict):
if TYPE is lltype.Void:
return "None"
- elif isinstance(TYPE, lltype.Ptr) and TYPE.TO._gckind == 'gc':
- return "%s.getptr(%s)" % (boxstr, _name(dict, TYPE))
+ elif isinstance(TYPE, lltype.Ptr):
+ if TYPE.TO._gckind == 'gc':
+ return "%s.getptr(%s)" % (boxstr, _name(dict, TYPE))
+ else:
+ return "cast_adr_to_ptr(%s.getaddr(cpu), %s)" % (boxstr,
+ _name(dict, TYPE))
else:
return "cast_primitive(%s, %s.getint())" % (_name(dict, TYPE), boxstr)
def make_writer(TYPE, str, dict):
if TYPE is lltype.Void:
return "None"
- elif isinstance(TYPE, lltype.Ptr) and TYPE.TO._gckind == 'gc':
- return "BoxPtr(cast_opaque_ptr(GCREF, %s))" % (str,)
+ elif isinstance(TYPE, lltype.Ptr):
+ if TYPE.TO._gckind == 'gc':
+ return "BoxPtr(cast_opaque_ptr(GCREF, %s))" % (str,)
+ else:
+ return "BoxInt(rffi.cast(Signed, %s))" % (str,)
else:
return "BoxInt(cast_primitive(Signed, %s))" % (str,)
@@ -444,20 +451,22 @@
return i
i += len(STRUCT._names) + 1
- at specialize.arg(0)
-def reveal_ptr(PTR, box):
+ at specialize.arg(1)
+def reveal_ptr(cpu, PTR, box):
if PTR.TO._gckind == 'gc':
return box.getptr(PTR)
else:
- adr = rffi.cast(llmemory.Address, box.getint())
+ adr = box.getaddr(cpu)
return llmemory.cast_adr_to_ptr(adr, PTR)
base_dict = {
'cast_primitive': lltype.cast_primitive,
+ 'cast_adr_to_ptr': llmemory.cast_adr_to_ptr,
'cast_opaque_ptr': lltype.cast_opaque_ptr,
'reveal_ptr': reveal_ptr,
'GCREF': llmemory.GCREF,
'Signed': lltype.Signed,
+ 'rffi': rffi,
'BoxInt': BoxInt,
'BoxPtr': BoxPtr,
}
More information about the Pypy-commit
mailing list