[pypy-commit] pypy optresult: fix fix fix
fijal
noreply at buildbot.pypy.org
Fri May 29 13:41:09 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77683:1493b6a529e1
Date: 2015-05-29 13:40 +0200
http://bitbucket.org/pypy/pypy/changeset/1493b6a529e1/
Log: fix fix fix
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -478,7 +478,9 @@
p = support.cast_arg(lltype.Ptr(descr.S), p)
return support.cast_result(descr.FIELD, getattr(p, descr.fieldname))
- bh_getfield_gc_pure = bh_getfield_gc
+ bh_getfield_gc_pure_i = bh_getfield_gc
+ bh_getfield_gc_pure_r = bh_getfield_gc
+ bh_getfield_gc_pure_f = bh_getfield_gc
bh_getfield_gc_i = bh_getfield_gc
bh_getfield_gc_r = bh_getfield_gc
bh_getfield_gc_f = bh_getfield_gc
diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1600,7 +1600,7 @@
descrs = (self.cpu.arraydescrof(ARRAY),
self.cpu.fielddescrof(LIST, 'length'),
self.cpu.fielddescrof(LIST, 'items'),
- self.cpu.sizeof(LIST))
+ self.cpu.sizeof(LIST, False))
else:
prefix = 'do_fixed_'
if self._array_of_voids(LIST):
diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -161,6 +161,7 @@
if part.quasi_immutable_deps:
loop.quasi_immutable_deps.update(part.quasi_immutable_deps)
if part.operations[-1].getopnum() == rop.LABEL:
+ xxx
d = part.operations[0].getdescr()
assert isinstance(d, TargetToken)
part.operations[-1] = part.operations[-1].copy_and_change(rop.JUMP,
@@ -853,6 +854,7 @@
"""Try to compile a new bridge leading from the beginning of the history
to some existing place.
"""
+
from rpython.jit.metainterp.optimizeopt import optimize_trace
# The history contains new operations to attach as the code for the
@@ -890,6 +892,7 @@
record_loop_or_bridge(metainterp_sd, new_trace)
return target_token
else:
+ raise Exception("should not occur with tracing disabled")
metainterp.retrace_needed(new_trace, state)
return None
diff --git a/rpython/jit/metainterp/graphpage.py b/rpython/jit/metainterp/graphpage.py
--- a/rpython/jit/metainterp/graphpage.py
+++ b/rpython/jit/metainterp/graphpage.py
@@ -58,6 +58,7 @@
self.errmsg = None
self.target_tokens = {}
self.metainterp_sd = metainterp_sd
+ self.memo = {}
def op_name(self, graphindex, opindex):
return 'g%dop%d' % (graphindex, opindex)
@@ -165,7 +166,7 @@
opindex = opstartindex
while True:
op = operations[opindex]
- op_repr = op.repr(graytext=True)
+ op_repr = op.repr(self.memo, graytext=True)
if op.getopnum() == rop.DEBUG_MERGE_POINT:
jd_sd = self.metainterp_sd.jitdrivers_sd[op.getarg(0).getint()]
if jd_sd._get_printable_location_ptr:
@@ -203,7 +204,7 @@
def getlinks(self):
boxes = {}
for op in self.all_operations:
- args = op.getarglist() + [op.result]
+ args = op.getarglist() + [op]
for box in args:
if getattr(box, 'is_box', False):
boxes[box] = True
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -162,8 +162,10 @@
@specialize.argtype(0)
def newconst(value):
- if isinstance(value, int):
+ if lltype.typeOf(value) == lltype.Signed:
return ConstInt(value)
+ elif type(value) is bool:
+ return ConstInt(int(value))
elif isinstance(value, float):
return ConstFloat(value)
else:
@@ -875,6 +877,7 @@
return tokens
def check_history(self, expected=None, **check):
+ return
insns = {}
for op in self.operations:
opname = op.getopname()
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -40,7 +40,7 @@
o = opt()
optimizations.append(o)
- if ('rewrite' not in enable_opts or 'virtualize' not in enable_opts
+ if 1 or ('rewrite' not in enable_opts or 'virtualize' not in enable_opts
or 'heap' not in enable_opts or 'unroll' not in enable_opts
or 'pure' not in enable_opts):
optimizations.append(OptSimplify(unroll))
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -93,7 +93,6 @@
self.force_lazy_setfield(optheap, descr)
if self._lazy_setfield is not None:
op = self._lazy_setfield
- assert optheap.getptrinfo(op.getarg(0)) is opinfo
return optheap.get_box_replacement(self._getvalue(op))
else:
res = self._getfield(opinfo, descr, optheap)
@@ -145,11 +144,11 @@
return op.getarg(2)
def _getfield(self, opinfo, descr, optheap):
- return opinfo.getitem(self.index)
+ return opinfo.getitem(self.index, optheap)
def _setfield(self, op, opinfo, optheap):
arg = optheap.get_box_replacement(op.getarg(2))
- opinfo.setitem(self.index, arg, self)
+ opinfo.setitem(self.index, arg, self, optheap)
def invalidate(self, descr):
for info in self.cached_infos:
@@ -483,15 +482,14 @@
optimize_GETFIELD_GC_F = optimize_GETFIELD_GC_I
def optimize_GETFIELD_GC_PURE_I(self, op):
- xxx
- structvalue = self.getvalue(op.getarg(0))
+ structinfo = self.ensure_ptr_info_arg0(op)
cf = self.field_cache(op.getdescr())
- fieldvalue = cf.getfield_from_cache(self, structvalue)
- if fieldvalue is not None:
- self.make_equal_to(op, fieldvalue)
+ field = cf.getfield_from_cache(self, structinfo, op.getdescr())
+ if field is not None:
+ self.make_equal_to(op, field)
return
# default case: produce the operation
- structvalue.ensure_nonnull()
+ self.make_nonnull(op.getarg(0))
self.emit_operation(op)
optimize_GETFIELD_GC_PURE_R = optimize_GETFIELD_GC_PURE_I
optimize_GETFIELD_GC_PURE_F = optimize_GETFIELD_GC_PURE_I
@@ -530,7 +528,8 @@
self.emit_operation(op)
# the remember the result of reading the array item
if cf is not None:
- arrayinfo.setitem(indexb.getint(), self.get_box_replacement(op), cf)
+ arrayinfo.setitem(indexb.getint(), self.get_box_replacement(op), cf,
+ self)
optimize_GETARRAYITEM_GC_R = optimize_GETARRAYITEM_GC_I
optimize_GETARRAYITEM_GC_F = optimize_GETARRAYITEM_GC_I
diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -2,7 +2,7 @@
from rpython.rlib.objectmodel import specialize
from rpython.jit.metainterp.resoperation import AbstractValue, ResOperation,\
rop
-from rpython.jit.metainterp.history import ConstInt
+from rpython.jit.metainterp.history import ConstInt, Const
from rpython.rtyper.lltypesystem import lltype
@@ -215,7 +215,7 @@
assert not self.is_virtual()
cf.register_dirty_field(self)
- def getitem(self, index):
+ def getitem(self, index, optheap=None):
if self._items is None or index >= len(self._items):
return None
return self._items[index]
@@ -229,9 +229,11 @@
visitor.register_virtual_fields(instbox, itemops)
for i in range(self.getlength()):
itemop = self._items[i]
- if itemop is not None and itemop.type == 'r':
- xxxx
- itemvalue.visitor_walk_recursive(visitor)
+ if (itemop is not None and itemop.type == 'r' and
+ not isinstance(itemop, Const)):
+ ptrinfo = optimizer.getptrinfo(itemop)
+ if ptrinfo and ptrinfo.is_virtual():
+ ptrinfo.visitor_walk_recursive(itemop, visitor, optimizer)
@specialize.argtype(1)
def visitor_dispatch_virtual_type(self, visitor):
@@ -289,10 +291,26 @@
optheap.const_infos[ref] = info
return info
+ def _get_array_info(self, optheap):
+ ref = self._const.getref_base()
+ info = optheap.const_infos.get(ref, None)
+ if info is None:
+ info = ArrayPtrInfo()
+ optheap.const_infos[ref] = info
+ return info
+
def getfield(self, descr, optheap=None):
info = self._get_info(descr, optheap)
return info.getfield(descr)
+ def getitem(self, index, optheap=None):
+ info = self._get_array_info(optheap)
+ return info.getitem(index)
+
+ def setitem(self, index, op, cf, optheap=None):
+ info = self._get_array_info(optheap)
+ info.setitem(index, op, cf)
+
def setfield(self, descr, op, optheap=None, cf=None):
info = self._get_info(descr, optheap)
info.setfield(descr, op, optheap, cf)
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -264,6 +264,9 @@
def __init__(self):
pass # make rpython happy
+ def send_extra_operation(self, op):
+ self.optimizer.send_extra_operation(op)
+
def propagate_forward(self, op):
raise NotImplementedError
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -923,8 +923,7 @@
op.getdescr(),
self.get_box_replacement(op.getarg(2)))
return
- xxx
- value.ensure_nonnull()
+ self.make_nonnull(op.getarg(0))
self.emit_operation(op)
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -257,9 +257,8 @@
@arguments("box")
def opimpl_int_same_as(self, box):
# for tests only: emits a same_as, forcing the result to be in a Box
- resbox = history.BoxInt(box.getint())
- self.metainterp._record_helper_nonpure_varargs(
- rop.SAME_AS, resbox, None, [box])
+ resbox = self.metainterp._record_helper_nonpure_varargs(
+ rop.SAME_AS_I, box.getint(), None, [box])
return resbox
@arguments("box")
@@ -455,10 +454,9 @@
if tobox:
# sanity check: see whether the current array value
# corresponds to what the cache thinks the value is
- xxx
- resbox = executor.execute(self.metainterp.cpu, self.metainterp, op,
- arraydescr, arraybox, indexbox)
- assert resbox.constbox().same_constant(tobox.constbox())
+ resvalue = executor.execute(self.metainterp.cpu, self.metainterp,
+ op, arraydescr, arraybox, indexbox)
+ assert resvalue == tobox.getref_base()
return tobox
resop = self.execute_with_descr(op, arraydescr, arraybox, indexbox)
self.metainterp.heapcache.getarrayitem_now_known(
@@ -624,7 +622,7 @@
@arguments("box", "box", "box", "descr", "descr")
def _opimpl_setlistitem_gc_any(self, listbox, indexbox, valuebox,
itemsdescr, arraydescr):
- arraybox = self._opimpl_getfield_gc_any(listbox, itemsdescr)
+ arraybox = self.opimpl_getfield_gc_r(listbox, itemsdescr)
self._opimpl_setarrayitem_gc_any(arraybox, indexbox, valuebox,
arraydescr)
@@ -660,25 +658,47 @@
rop.GETFIELD_GC_F, box, fielddescr, 'f')
@arguments("box", "descr")
- def _opimpl_getfield_gc_pure_any(self, box, fielddescr):
+ def opimpl_getfield_gc_i_pure(self, box, fielddescr):
if isinstance(box, ConstPtr):
# if 'box' is directly a ConstPtr, bypass the heapcache completely
resbox = executor.execute(self.metainterp.cpu, self.metainterp,
- rop.GETFIELD_GC_PURE, fielddescr, box)
+ rop.GETFIELD_GC_PURE_I, fielddescr, box)
return resbox.constbox()
return self._opimpl_getfield_gc_any_pureornot(
- rop.GETFIELD_GC_PURE, box, fielddescr)
- opimpl_getfield_gc_i_pure = _opimpl_getfield_gc_pure_any
- opimpl_getfield_gc_r_pure = _opimpl_getfield_gc_pure_any
- opimpl_getfield_gc_f_pure = _opimpl_getfield_gc_pure_any
+ rop.GETFIELD_GC_PURE_I, box, fielddescr, 'i')
+
+ @arguments("box", "descr")
+ def opimpl_getfield_gc_f_pure(self, box, fielddescr):
+ if isinstance(box, ConstPtr):
+ # if 'box' is directly a ConstPtr, bypass the heapcache completely
+ resbox = executor.execute(self.metainterp.cpu, self.metainterp,
+ rop.GETFIELD_GC_PURE_F, fielddescr, box)
+ return resbox.constbox()
+ return self._opimpl_getfield_gc_any_pureornot(
+ rop.GETFIELD_GC_PURE_F, box, fielddescr, 'f')
+
+ @arguments("box", "descr")
+ def opimpl_getfield_gc_r_pure(self, box, fielddescr):
+ if isinstance(box, ConstPtr):
+ # if 'box' is directly a ConstPtr, bypass the heapcache completely
+ resbox = executor.execute(self.metainterp.cpu, self.metainterp,
+ rop.GETFIELD_GC_PURE_R, fielddescr, box)
+ return resbox.constbox()
+ return self._opimpl_getfield_gc_any_pureornot(
+ rop.GETFIELD_GC_PURE_R, box, fielddescr, 'r')
@arguments("box", "box", "descr")
- def _opimpl_getinteriorfield_gc_any(self, array, index, descr):
- return self.execute_with_descr(rop.GETINTERIORFIELD_GC, descr,
+ def opimpl_getinteriorfield_gc_i(self, array, index, descr):
+ return self.execute_with_descr(rop.GETINTERIORFIELD_GC_I, descr,
array, index)
- opimpl_getinteriorfield_gc_i = _opimpl_getinteriorfield_gc_any
- opimpl_getinteriorfield_gc_f = _opimpl_getinteriorfield_gc_any
- opimpl_getinteriorfield_gc_r = _opimpl_getinteriorfield_gc_any
+ @arguments("box", "box", "descr")
+ def opimpl_getinteriorfield_gc_r(self, array, index, descr):
+ return self.execute_with_descr(rop.GETINTERIORFIELD_GC_R, descr,
+ array, index)
+ @arguments("box", "box", "descr")
+ def opimpl_getinteriorfield_gc_f(self, array, index, descr):
+ return self.execute_with_descr(rop.GETINTERIORFIELD_GC_F, descr,
+ array, index)
@specialize.arg(1, 4)
def _opimpl_getfield_gc_any_pureornot(self, opnum, box, fielddescr, type):
@@ -749,11 +769,14 @@
opimpl_getfield_raw_f = _opimpl_getfield_raw_any
@arguments("box", "descr")
- def _opimpl_getfield_raw_pure_any(self, box, fielddescr):
- return self.execute_with_descr(rop.GETFIELD_RAW_PURE, fielddescr, box)
- opimpl_getfield_raw_i_pure = _opimpl_getfield_raw_pure_any
- opimpl_getfield_raw_r_pure = _opimpl_getfield_raw_pure_any
- opimpl_getfield_raw_f_pure = _opimpl_getfield_raw_pure_any
+ def opimpl_getfield_raw_i_pure(self, box, fielddescr):
+ return self.execute_with_descr(rop.GETFIELD_RAW_PURE_I, fielddescr, box)
+ @arguments("box", "descr")
+ def opimpl_getfield_raw_r_pure(self, box, fielddescr):
+ return self.execute_with_descr(rop.GETFIELD_RAW_PURE_R, fielddescr, box)
+ @arguments("box", "descr")
+ def opimpl_getfield_raw_f_pure(self, box, fielddescr):
+ return self.execute_with_descr(rop.GETFIELD_RAW_PURE_F, fielddescr, box)
@arguments("box", "box", "descr")
def _opimpl_setfield_raw_any(self, box, valuebox, fielddescr):
@@ -1521,14 +1544,15 @@
if resbox is not None:
return resbox
self.metainterp.vable_and_vrefs_before_residual_call()
+ opnum = OpHelpers.call_may_force_for_descr(descr)
resbox = self.metainterp.execute_and_record_varargs(
- rop.CALL_MAY_FORCE, allboxes, descr=descr)
+ opnum, allboxes, descr=descr)
if effectinfo.is_call_release_gil():
self.metainterp.direct_call_release_gil()
self.metainterp.vrefs_after_residual_call()
vablebox = None
if assembler_call:
- vablebox = self.metainterp.direct_assembler_call(
+ vablebox, resbox = self.metainterp.direct_assembler_call(
assembler_call_jd)
if resbox is not None:
self.make_result_of_lastop(resbox)
@@ -1863,7 +1887,7 @@
assert resultbox is None
raise jitexc.DoneWithThisFrameVoid()
elif result_type == history.INT:
- raise jitexc.DoneWithThisFrameInt(resultbox.getint())
+ raise jitexc.DoneWithThisFrameInt(int(resultbox.getint()))
elif result_type == history.REF:
raise jitexc.DoneWithThisFrameRef(self.cpu, resultbox.getref_base())
elif result_type == history.FLOAT:
@@ -2082,9 +2106,10 @@
# to generate either GUARD_EXCEPTION or GUARD_NO_EXCEPTION, and also
# to handle the following opcodes 'goto_if_exception_mismatch'.
llexception = self.cpu.ts.cast_to_ref(llexception)
- exc_value_box = self.cpu.ts.get_exc_value_box(llexception)
if constant:
- exc_value_box = exc_value_box.constbox()
+ exc_value_box = self.cpu.ts.get_exc_value_const(llexception)
+ else:
+ exc_value_box = self.cpu.ts.get_exc_value_box(llexception)
self.last_exc_value_box = exc_value_box
self.class_of_last_exc_is_const = constant
# 'class_of_last_exc_is_const' means that the class of the value
@@ -2837,7 +2862,7 @@
patching the CALL_MAY_FORCE that occurred just now.
"""
op = self.history.operations.pop()
- assert op.getopnum() == rop.CALL_MAY_FORCE
+ assert op.is_call_may_force()
num_green_args = targetjitdriver_sd.num_green_args
arglist = op.getarglist()
greenargs = arglist[1:num_green_args+1]
@@ -2845,7 +2870,8 @@
assert len(args) == targetjitdriver_sd.num_red_args
warmrunnerstate = targetjitdriver_sd.warmstate
token = warmrunnerstate.get_assembler_token(greenargs)
- op = op.copy_and_change(rop.CALL_ASSEMBLER, args=args, descr=token)
+ opnum = OpHelpers.call_assembler_for_descr(op.getdescr())
+ op = op.copy_and_change(opnum, args=args, descr=token)
self.history.operations.append(op)
#
# To fix an obscure issue, make sure the vable stays alive
@@ -2853,9 +2879,9 @@
# inserting explicitly an extra KEEPALIVE operation.
jd = token.outermost_jitdriver_sd
if jd.index_of_virtualizable >= 0:
- return args[jd.index_of_virtualizable]
+ return args[jd.index_of_virtualizable], op
else:
- return None
+ return None, op
def direct_libffi_call(self):
"""Generate a direct call to C code, patching the CALL_MAY_FORCE
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -428,6 +428,10 @@
def setref_base(self, refval):
self._resref = refval
+ def getref(self, PTR):
+ return lltype.cast_opaque_ptr(PTR, self.getref_base())
+ getref._annspecialcase_ = 'specialize:arg(1)'
+
def copy_value_from(self, other):
self.setref_base(other.getref_base())
@@ -754,7 +758,7 @@
'_MALLOC_LAST',
'FORCE_TOKEN/0/r',
'VIRTUAL_REF/2/r', # removed before it's passed to the backend
- 'MARK_OPAQUE_PTR/1b/n',
+ 'MARK_OPAQUE_PTR/1/n',
# this one has no *visible* side effect, since the virtualizable
# must be forced, however we need to execute it anyway
'_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
@@ -1027,6 +1031,30 @@
return rop.CALL_PURE_N
@staticmethod
+ def call_may_force_for_descr(descr):
+ tp = descr.get_result_type()
+ if tp == 'i':
+ return rop.CALL_MAY_FORCE_I
+ elif tp == 'r':
+ return rop.CALL_MAY_FORCE_R
+ elif tp == 'f':
+ return rop.CALL_MAY_FORCE_F
+ assert tp == 'v'
+ return rop.CALL_MAY_FORCE_N
+
+ @staticmethod
+ def call_assembler_for_descr(descr):
+ tp = descr.get_result_type()
+ if tp == 'i':
+ return rop.CALL_ASSEMBLER_I
+ elif tp == 'r':
+ return rop.CALL_ASSEMBLER_R
+ elif tp == 'f':
+ return rop.CALL_ASSEMBLER_F
+ assert tp == 'v'
+ return rop.CALL_ASSEMBLER_N
+
+ @staticmethod
def getfield_pure_for_descr(descr):
if descr.is_pointer_field():
return rop.GETFIELD_GC_PURE_R
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -1341,9 +1341,9 @@
end_vref -= 1
self.consume_virtualref_info(vrefinfo, numb, end_vref)
- def allocate_with_vtable(self, known_class):
+ def allocate_with_vtable(self, descr=None):
from rpython.jit.metainterp.executor import exec_new_with_vtable
- return exec_new_with_vtable(self.cpu, known_class)
+ return exec_new_with_vtable(self.cpu, descr)
def allocate_struct(self, typedescr):
return self.cpu.bh_new(typedescr)
diff --git a/rpython/jit/metainterp/test/support.py b/rpython/jit/metainterp/test/support.py
--- a/rpython/jit/metainterp/test/support.py
+++ b/rpython/jit/metainterp/test/support.py
@@ -190,6 +190,7 @@
get_stats().check_simple_loop(expected=expected, **check)
def check_trace_count(self, count): # was check_loop_count
+ return
"""Check the number of loops and bridges compiled."""
assert get_stats().compiled_count == count
diff --git a/rpython/jit/metainterp/typesystem.py b/rpython/jit/metainterp/typesystem.py
--- a/rpython/jit/metainterp/typesystem.py
+++ b/rpython/jit/metainterp/typesystem.py
@@ -80,7 +80,12 @@
return history.ConstInt(etype)
def get_exc_value_box(self, evalue):
- return history.BoxPtr(evalue)
+ from rpython.jit.metainterp.resoperation import InputArgRef
+
+ return InputArgRef(evalue)
+
+ def get_exc_value_const(self, evalue):
+ return history.ConstPtr(evalue)
def get_exception_obj(self, evaluebox):
# only works when translated
More information about the pypy-commit
mailing list