[pypy-svn] r74376 - in pypy/branch/blackhole-improvement/pypy/jit: backend/llgraph codewriter metainterp
arigo at codespeak.net
arigo at codespeak.net
Wed May 5 11:20:29 CEST 2010
Author: arigo
Date: Wed May 5 11:20:28 2010
New Revision: 74376
Modified:
pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py
pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py
pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py
Log:
Pass the correct location of exceptions.
Complete some more executor.py.
Kill ConstAddr entirely, now that we have AddressAsInt.
Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py Wed May 5 11:20:28 2010
@@ -7,7 +7,7 @@
import sys
from pypy.objspace.flow.model import Variable, Constant
from pypy.annotation import model as annmodel
-from pypy.jit.metainterp.history import (ConstInt, ConstPtr, ConstAddr,
+from pypy.jit.metainterp.history import (ConstInt, ConstPtr,
BoxInt, BoxPtr, BoxObj, BoxFloat,
REF, INT, FLOAT)
from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr
Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py Wed May 5 11:20:28 2010
@@ -14,6 +14,7 @@
'residual_call_',
'(int|ref|float)_guard_value',
'guard_class',
+ 'int_(add|sub|mul)_ovf',
]
# ____________________________________________________________
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py Wed May 5 11:20:28 2010
@@ -85,27 +85,34 @@
return None
raise AssertionError("bad rettype")
+def do_getarrayitem_gc(metainterp, arraybox, indexbox, arraydescr):
+ cpu = metainterp.cpu
+ array = arraybox.getref_base()
+ index = indexbox.getint()
+ if arraydescr.is_array_of_pointers():
+ return BoxPtr(cpu.bh_setarrayitem_gc_r(arraydescr, array, index))
+ elif arraydescr.is_array_of_floats():
+ return BoxFloat(cpu.bh_setarrayitem_gc_f(arraydescr, array, index))
+ else:
+ return BoxInt(cpu.bh_setarrayitem_gc_i(arraydescr, array, index))
+
def do_setarrayitem_gc(metainterp, arraybox, indexbox, itembox, arraydescr):
cpu = metainterp.cpu
array = arraybox.getref_base()
index = indexbox.getint()
- if itembox.type == INT:
- item = itembox.getint()
- cpu.bh_setarrayitem_gc_i(arraydescr, array, index, item)
- elif itembox.type == REF:
- item = itembox.getref_base()
- cpu.bh_setarrayitem_gc_r(arraydescr, array, index, item)
- elif itembox.type == FLOAT:
- item = itembox.getfloat()
- cpu.bh_setarrayitem_gc_f(arraydescr, array, index, item)
+ if arraydescr.is_array_of_pointers():
+ cpu.bh_setarrayitem_gc_r(arraydescr, array, index,
+ itembox.getref_base())
+ elif arraydescr.is_array_of_floats():
+ cpu.bh_setarrayitem_gc_f(arraydescr, array, index, itembox.getfloat())
else:
- raise AssertionError("bad itembox.type")
+ cpu.bh_setarrayitem_gc_i(arraydescr, array, index, itembox.getint())
def do_getfield_gc(metainterp, structbox, fielddescr):
cpu = metainterp.cpu
struct = structbox.getref_base()
if fielddescr.is_pointer_field():
- return BoxPtr(cpu.bh_getfield_gc_p(struct, fielddescr))
+ return BoxPtr(cpu.bh_getfield_gc_r(struct, fielddescr))
elif fielddescr.is_float_field():
return BoxFloat(cpu.bh_getfield_gc_f(struct, fielddescr))
else:
@@ -115,12 +122,32 @@
cpu = metainterp.cpu
struct = structbox.getint()
if fielddescr.is_pointer_field():
- return BoxPtr(cpu.bh_getfield_raw_p(struct, fielddescr))
+ return BoxPtr(cpu.bh_getfield_raw_r(struct, fielddescr))
elif fielddescr.is_float_field():
return BoxFloat(cpu.bh_getfield_raw_f(struct, fielddescr))
else:
return BoxInt(cpu.bh_getfield_raw_i(struct, fielddescr))
+def do_setfield_gc(metainterp, structbox, itembox, fielddescr):
+ cpu = metainterp.cpu
+ struct = structbox.getref_base()
+ if fielddescr.is_pointer_field():
+ cpu.bh_setfield_gc_r(struct, fielddescr, itembox.getref_base())
+ elif fielddescr.is_float_field():
+ cpu.bh_setfield_gc_f(struct, fielddescr, itembox.getfloat())
+ else:
+ cpu.bh_setfield_gc_i(struct, fielddescr, itembox.getint())
+
+def do_setfield_raw(metainterp, structbox, itembox, fielddescr):
+ cpu = metainterp.cpu
+ struct = structbox.getint()
+ if fielddescr.is_pointer_field():
+ cpu.bh_setfield_raw_r(struct, fielddescr, itembox.getref_base())
+ elif fielddescr.is_float_field():
+ cpu.bh_setfield_raw_f(struct, fielddescr, itembox.getfloat())
+ else:
+ cpu.bh_setfield_raw_i(struct, fielddescr, itembox.getint())
+
def do_int_add_ovf(metainterp, box1, box2):
a = box1.getint()
b = box2.getint()
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py Wed May 5 11:20:28 2010
@@ -98,7 +98,7 @@
def nonconstbox(self):
raise NotImplementedError
- def getaddr(self, cpu):
+ def getaddr(self):
raise NotImplementedError
def sort_key(self):
@@ -182,18 +182,13 @@
__slots__ = ()
@staticmethod
- def _new(x, cpu):
+ def _new(x):
"NOT_RPYTHON"
T = lltype.typeOf(x)
kind = getkind(T)
if kind == "int":
if isinstance(T, lltype.Ptr):
- if not we_are_translated():
- # cannot store integers representing casted addresses
- # inside ConstInt() instances that are going through
- # translation; must use the special ConstAddr instead.
- return ConstAddr(x, cpu)
- intval = cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(x))
+ intval = llmemory.cast_adr_to_int(llmemory.cast_ptr_to_adr(x))
else:
intval = lltype.cast_primitive(lltype.Signed, x)
return ConstInt(intval)
@@ -256,8 +251,8 @@
def getint(self):
return self.value
- def getaddr(self, cpu):
- return cpu.cast_int_to_adr(self.value)
+ def getaddr(self):
+ return llmemory.cast_int_to_adr(self.value)
def _get_hash_(self):
return self.value
@@ -281,50 +276,6 @@
CONST_FALSE = ConstInt(0)
CONST_TRUE = ConstInt(1)
-class ConstAddr(Const): # only for constants built before translation
- type = INT
- _attrs_ = ('value', 'cpu')
-
- def __init__(self, adrvalue, cpu):
- "NOT_RPYTHON"
- assert not we_are_translated()
- if isinstance(lltype.typeOf(adrvalue), lltype.Ptr):
- adrvalue = llmemory.cast_ptr_to_adr(adrvalue) # convenience
- else:
- assert lltype.typeOf(adrvalue) == llmemory.Address
- self.value = adrvalue
- self.cpu = cpu
-
- def clonebox(self):
- return BoxInt(self.cpu.cast_adr_to_int(self.value))
-
- nonconstbox = clonebox
-
- def getint(self):
- return self.cpu.cast_adr_to_int(self.value)
-
- def getaddr(self, cpu):
- return self.value
-
- def _get_hash_(self):
- return llmemory.cast_adr_to_int(self.value)
-
- def set_future_value(self, cpu, j):
- cpu.set_future_value_int(j, self.getint())
-
- def same_constant(self, other):
- assert isinstance(other, Const)
- return self.value == other.getaddr(self.cpu)
-
- def nonnull(self):
- return bool(self.value)
-
- def _getrepr_(self):
- return self.value
-
- def repr_rpython(self):
- return repr_rpython(self, 'ca')
-
class ConstFloat(Const):
type = FLOAT
value = 0.0
@@ -388,7 +339,7 @@
else:
return 0
- def getaddr(self, cpu):
+ def getaddr(self):
return llmemory.cast_ptr_to_adr(self.value)
def set_future_value(self, cpu, j):
@@ -441,7 +392,7 @@
def set_future_value(self, cpu, j):
cpu.set_future_value_ref(j, self.value)
-## def getaddr(self, cpu):
+## def getaddr(self):
## # so far this is used only when calling
## # CodeWriter.IndirectCallset.bytecode_for_address. We don't need a
## # real addr, but just a key for the dictionary
@@ -470,7 +421,7 @@
is_box = True # hint that we want to make links in graphviz from this
@staticmethod
- def _new(x, cpu):
+ def _new(x):
"NOT_RPYTHON"
kind = getkind(lltype.typeOf(x))
if kind == "int":
@@ -533,8 +484,8 @@
def getint(self):
return self.value
- def getaddr(self, cpu):
- return cpu.cast_int_to_adr(self.value)
+ def getaddr(self):
+ return llmemory.cast_int_to_adr(self.value)
def _get_hash_(self):
return self.value
@@ -604,7 +555,7 @@
return lltype.cast_opaque_ptr(PTR, self.getref_base())
getref._annspecialcase_ = 'specialize:arg(1)'
- def getaddr(self, cpu):
+ def getaddr(self):
return llmemory.cast_ptr_to_adr(self.value)
def _get_hash_(self):
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py Wed May 5 11:20:28 2010
@@ -1,9 +1,11 @@
import os
from pypy.rlib.debug import have_debug_prints
from pypy.rlib.debug import debug_start, debug_stop, debug_print
+from pypy.rlib.objectmodel import we_are_translated
+from pypy.rpython.lltypesystem import llmemory
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.history import Const, ConstInt, Box, \
- BoxInt, ConstAddr, ConstFloat, BoxFloat, AbstractFailDescr
+ BoxInt, ConstFloat, BoxFloat, AbstractFailDescr
class Logger(object):
@@ -46,10 +48,16 @@
mv = len(memo)
memo[arg] = mv
if isinstance(arg, ConstInt):
+ if int_could_be_an_address(arg.value):
+ addr = arg.getaddr()
+ name = self.metainterp_sd.get_name_from_address(addr)
+ if name:
+ return 'ConstAddr(' + name + ')'
return str(arg.value)
elif isinstance(arg, BoxInt):
return 'i' + str(mv)
elif isinstance(arg, self.ts.ConstRef):
+ # XXX for ootype, this should also go through get_name_from_address
return 'ConstPtr(ptr' + str(mv) + ')'
elif isinstance(arg, self.ts.BoxRef):
return 'p' + str(mv)
@@ -57,12 +65,6 @@
return str(arg.value)
elif isinstance(arg, BoxFloat):
return 'f' + str(mv)
- elif isinstance(arg, self.ts.ConstAddr):
- addr = arg.getaddr(self.metainterp_sd.cpu)
- name = self.metainterp_sd.get_name_from_address(addr)
- if not name:
- name = 'cls' + str(mv)
- return 'ConstClass(' + name + ')'
elif arg is None:
return 'None'
else:
@@ -102,3 +104,10 @@
fail_args = ''
debug_print(res + op.getopname() +
'(' + args + ')' + fail_args)
+
+
+def int_could_be_an_address(x):
+ if we_are_translated():
+ return not (-32768 <= x <= 32767)
+ else:
+ return isinstance(x, llmemory.AddressAsInt)
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py Wed May 5 11:20:28 2010
@@ -148,10 +148,10 @@
for _opimpl in ['int_add_ovf', 'int_sub_ovf', 'int_mul_ovf']:
exec py.code.Source('''
- @arguments("box", "box")
- def opimpl_%s(self, b1, b2):
+ @arguments("orgpc", "box", "box")
+ def opimpl_%s(self, pc, b1, b2):
resbox = self.execute(rop.%s, b1, b2)
- self.metainterp.handle_possible_overflow_error()
+ self.metainterp.handle_possible_overflow_error(pc)
return resbox
''' % (_opimpl, _opimpl.upper())).compile()
@@ -280,13 +280,13 @@
except KeyError:
pass
- @XXX #arguments("descr")
- def opimpl_new(self, size):
- self.execute_with_descr(rop.NEW, descr=size)
-
- @XXX #arguments("constbox")
- def opimpl_new_with_vtable(self, vtablebox):
- self.execute(rop.NEW_WITH_VTABLE, vtablebox)
+ @arguments("descr")
+ def opimpl_new(self, sizedescr):
+ return self.execute_with_descr(rop.NEW, sizedescr)
+
+ @arguments("descr")
+ def opimpl_new_with_vtable(self, sizevtabledescr):
+ return self.execute_with_descr(rop.NEW_WITH_VTABLE, sizevtabledescr)
@XXX #arguments("box")
def opimpl_runtimenew(self, classbox):
@@ -611,15 +611,15 @@
def opimpl_call(self, callee, varargs):
return self.perform_call(callee, varargs)
- @arguments("box", "descr", "boxes")
- def _opimpl_residual_call1(self, funcbox, calldescr, argboxes):
- return self.do_residual_call(funcbox, calldescr, argboxes, exc=True)
- @arguments("box", "descr", "boxes2")
- def _opimpl_residual_call2(self, funcbox, calldescr, argboxes):
- return self.do_residual_call(funcbox, calldescr, argboxes, exc=True)
- @arguments("box", "descr", "boxes3")
- def _opimpl_residual_call3(self, funcbox, calldescr, argboxes):
- return self.do_residual_call(funcbox, calldescr, argboxes, exc=True)
+ @arguments("orgpc", "box", "descr", "boxes")
+ def _opimpl_residual_call1(self, pc, funcbox, calldescr, argboxes):
+ return self.do_residual_call(funcbox, calldescr, argboxes, exc_at=pc)
+ @arguments("orgpc", "box", "descr", "boxes2")
+ def _opimpl_residual_call2(self, pc, funcbox, calldescr, argboxes):
+ return self.do_residual_call(funcbox, calldescr, argboxes, exc_at=pc)
+ @arguments("orgpc", "box", "descr", "boxes3")
+ def _opimpl_residual_call3(self, pc, funcbox, calldescr, argboxes):
+ return self.do_residual_call(funcbox, calldescr, argboxes, exc_at=pc)
opimpl_residual_call_r_i = _opimpl_residual_call1
opimpl_residual_call_r_r = _opimpl_residual_call1
@@ -856,12 +856,10 @@
@arguments("box", "label")
def opimpl_goto_if_exception_mismatch(self, vtablebox, next_exc_target):
- # XXX use typesystem.py
- from pypy.rpython.lltypesystem import rclass
- assert self.last_exception is not None
- adr = vtablebox.getaddr(self.metainterp.cpu)
- bounding_class = llmemory.cast_adr_to_ptr(adr, rclass.CLASSTYPE)
- if not rclass.ll_isinstance(self.last_exception, bounding_class):
+ metainterp = self.metainterp
+ last_exc_value_box = metainterp.last_exc_value_box
+ assert last_exc_value_box is not None
+ if not metainterp.cpu.ts.instanceOf(last_exc_value_box, vtablebox):
self.pc = next_exc_target
@arguments("box")
@@ -1016,16 +1014,16 @@
return self.metainterp.execute_and_record(opnum, descr, *argboxes)
@specialize.arg(1)
- def execute_varargs(self, opnum, argboxes, descr, exc):
+ def execute_varargs(self, opnum, argboxes, descr, exc_at):
resbox = self.metainterp.execute_and_record_varargs(opnum, argboxes,
descr=descr)
- if exc:
- self.metainterp.handle_possible_exception()
+ if exc_at >= 0:
+ self.metainterp.handle_possible_exception(exc_at)
else:
self.metainterp.assert_no_exception()
return resbox
- def do_residual_call(self, funcbox, descr, argboxes, exc):
+ def do_residual_call(self, funcbox, descr, argboxes, exc_at):
allboxes = [funcbox] + argboxes
effectinfo = descr.get_extra_info()
if 0:# XXX effectinfo is None or effectinfo.forces_virtual_or_virtualizable:
@@ -1043,7 +1041,7 @@
else:
return self.metainterp.assert_no_exception()
else:
- return self.execute_varargs(rop.CALL, allboxes, descr, exc)
+ return self.execute_varargs(rop.CALL, allboxes, descr, exc_at)
# ____________________________________________________________
@@ -1835,26 +1833,26 @@
# mark by replacing it with ConstPtr(NULL)
self.virtualref_boxes[i+1] = self.cpu.ts.CONST_NULL
- def handle_possible_exception(self):
+ def handle_possible_exception(self, pc):
frame = self.framestack[-1]
if self.last_exc_value_box:
exception_box = self.cpu.ts.cls_of_box(self.last_exc_value_box)
- op = frame.generate_guard(frame.pc, rop.GUARD_EXCEPTION,
+ op = frame.generate_guard(pc, rop.GUARD_EXCEPTION,
None, [exception_box])
if op:
op.result = self.last_exc_value_box
self.finishframe_exception()
else:
- frame.generate_guard(frame.pc, rop.GUARD_NO_EXCEPTION, None, [])
+ frame.generate_guard(pc, rop.GUARD_NO_EXCEPTION, None, [])
- def handle_possible_overflow_error(self):
+ def handle_possible_overflow_error(self, pc):
frame = self.framestack[-1]
if self.last_exc_value_box:
- frame.generate_guard(frame.pc, rop.GUARD_OVERFLOW, None)
+ frame.generate_guard(pc, rop.GUARD_OVERFLOW, None)
assert isinstance(self.last_exc_value_box, Const)
self.finishframe_exception()
else:
- frame.generate_guard(frame.pc, rop.GUARD_NO_OVERFLOW, None)
+ frame.generate_guard(pc, rop.GUARD_NO_OVERFLOW, None)
def assert_no_exception(self):
assert not self.last_exc_value_box
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py Wed May 5 11:20:28 2010
@@ -206,7 +206,7 @@
'GETFIELD_GC/1d',
'GETFIELD_RAW/1d',
'NEW/0d',
- 'NEW_WITH_VTABLE/1',
+ 'NEW_WITH_VTABLE/0d',
'NEW_ARRAY/1d',
'FORCE_TOKEN/0',
'VIRTUAL_REF/2',
Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py (original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py Wed May 5 11:20:28 2010
@@ -44,7 +44,6 @@
BASETYPE = llmemory.GCREF
BoxRef = history.BoxPtr
ConstRef = history.ConstPtr
- ConstAddr = history.ConstAddr
loops_done_with_this_frame_ref = None # patched by compile.py
CONST_NULL = history.ConstPtr(history.ConstPtr.value)
CVAL_NULLREF = None # patched by optimizeopt.py
@@ -76,12 +75,11 @@
cls = llmemory.cast_ptr_to_adr(obj.typeptr)
return history.ConstInt(llmemory.cast_adr_to_int(cls))
- def subclassOf(self, cpu, clsbox1, clsbox2):
- adr = clsbox2.getaddr(cpu)
+ def instanceOf(self, instbox, clsbox):
+ adr = clsbox.getaddr()
bounding_class = llmemory.cast_adr_to_ptr(adr, rclass.CLASSTYPE)
- adr = clsbox1.getaddr(cpu)
- real_class = llmemory.cast_adr_to_ptr(adr, rclass.CLASSTYPE)
- return rclass.ll_issubclass(real_class, bounding_class)
+ real_instance = instbox.getref(rclass.OBJECTPTR)
+ return rclass.ll_isinstance(real_instance, bounding_class)
def get_exception_box(self, etype):
return history.ConstInt(etype)
@@ -151,7 +149,6 @@
BASETYPE = ootype.Object
BoxRef = history.BoxObj
ConstRef = history.ConstObj
- ConstAddr = history.ConstObj
loops_done_with_this_frame_ref = None # patched by compile.py
CONST_NULL = history.ConstObj(history.ConstObj.value)
CVAL_NULLREF = None # patched by optimizeopt.py
More information about the Pypy-commit
mailing list