Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3k
Changeset: r60410:792caad9d5ca
Date: 2013-01-23 23:58 +0100
http://bitbucket.org/pypy/pypy/changeset/792caad9d5ca/
Log: hg merge default
diff --git a/rpython/jit/codewriter/effectinfo.py
b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -79,9 +79,11 @@
OS_RAW_MALLOC_VARSIZE = 110
OS_RAW_FREE = 111
+ OS_JIT_FORCE_VIRTUAL = 120
+
# for debugging:
_OS_CANRAISE = set([OS_NONE, OS_STR2UNICODE, OS_LIBFFI_CALL,
- OS_RAW_MALLOC_VARSIZE])
+ OS_RAW_MALLOC_VARSIZE, OS_JIT_FORCE_VIRTUAL])
def __new__(cls, readonly_descrs_fields, readonly_descrs_arrays,
write_descrs_fields, write_descrs_arrays,
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
@@ -1393,6 +1393,8 @@
elif oopspec_name == 'jit.isvirtual':
kind = getkind(args[0].concretetype)
return SpaceOperation('%s_isvirtual' % kind, args, op.result)
+ elif oopspec_name == 'jit.force_virtual':
+ return self._handle_oopspec_call(op, args,
EffectInfo.OS_JIT_FORCE_VIRTUAL, EffectInfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE)
else:
raise AssertionError("missing support for %r" % oopspec_name)
diff --git a/rpython/jit/codewriter/support.py
b/rpython/jit/codewriter/support.py
--- a/rpython/jit/codewriter/support.py
+++ b/rpython/jit/codewriter/support.py
@@ -1,24 +1,24 @@
import sys
-from rpython.rtyper.lltypesystem import lltype, rclass, rffi, llmemory
-from rpython.rtyper.ootypesystem import ootype
-from rpython.rtyper import rlist
-from rpython.rtyper.lltypesystem import rstr as ll_rstr, rdict as ll_rdict
-from rpython.rtyper.lltypesystem.module import ll_math
-from rpython.rtyper.lltypesystem.lloperation import llop
-from rpython.rtyper.ootypesystem import rdict as oo_rdict
-from rpython.rtyper.llinterp import LLInterpreter
-from rpython.rtyper.extregistry import ExtRegistryEntry
-from rpython.translator.simplify import get_funcobj
-from rpython.translator.unsimplify import split_block
+
+from rpython.annotator import model as annmodel
+from rpython.annotator.policy import AnnotatorPolicy
from rpython.flowspace.model import Variable, Constant
-from rpython.translator.translator import TranslationContext
-from rpython.annotator.policy import AnnotatorPolicy
-from rpython.annotator import model as annmodel
-from rpython.rtyper.annlowlevel import MixLevelHelperAnnotator
from rpython.jit.metainterp.typesystem import deref
from rpython.rlib import rgc
-from rpython.rlib.jit import elidable
+from rpython.rlib.jit import elidable, oopspec
from rpython.rlib.rarithmetic import r_longlong, r_ulonglong, r_uint, intmask
+from rpython.rtyper import rlist
+from rpython.rtyper.annlowlevel import MixLevelHelperAnnotator
+from rpython.rtyper.extregistry import ExtRegistryEntry
+from rpython.rtyper.llinterp import LLInterpreter
+from rpython.rtyper.lltypesystem import lltype, rclass, rffi, llmemory, rstr
as ll_rstr, rdict as ll_rdict
+from rpython.rtyper.lltypesystem.lloperation import llop
+from rpython.rtyper.lltypesystem.module import ll_math
+from rpython.rtyper.ootypesystem import ootype, rdict as oo_rdict
+from rpython.translator.simplify import get_funcobj
+from rpython.translator.translator import TranslationContext
+from rpython.translator.unsimplify import split_block
+
def getargtypes(annotator, values):
if values is None: # for backend tests producing stand-alone exe's
@@ -213,10 +213,12 @@
_ll_5_list_ll_arraycopy = rgc.ll_arraycopy
+
@elidable
def _ll_1_gc_identityhash(x):
return lltype.identityhash(x)
+
# the following function should not be "@elidable": I can think of
# a corner case in which id(const) is constant-folded, and then 'const'
# disappears and is collected too early (possibly causing another object
@@ -224,6 +226,8 @@
def _ll_1_gc_id(ptr):
return llop.gc_id(lltype.Signed, ptr)
+
+@oopspec("jit.force_virtual(inst)")
def _ll_1_jit_force_virtual(inst):
return llop.jit_force_virtual(lltype.typeOf(inst), inst)
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
@@ -978,11 +978,9 @@
def get_all_jitcell_tokens(self):
tokens = [t() for t in self.jitcell_token_wrefs]
if None in tokens:
- assert False, "get_all_jitcell_tokens will not work as "+\
- "loops have been freed"
+ assert False, ("get_all_jitcell_tokens will not work as "
+ "loops have been freed")
return tokens
-
-
def check_history(self, expected=None, **check):
insns = {}
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
@@ -1,12 +1,13 @@
+from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.jit.metainterp.executor import execute
from rpython.jit.codewriter.heaptracker import vtable2descr
-from rpython.jit.metainterp.executor import execute
from rpython.jit.metainterp.history import Const, ConstInt, BoxInt
from rpython.jit.metainterp.optimizeopt import optimizer
+from rpython.jit.metainterp.optimizeopt.optimizer import OptValue, REMOVED
from rpython.jit.metainterp.optimizeopt.util import (make_dispatcher_method,
descrlist_dict, sort_descrs)
from rpython.jit.metainterp.resoperation import rop, ResOperation
from rpython.rlib.objectmodel import we_are_translated
-from rpython.jit.metainterp.optimizeopt.optimizer import OptValue
class AbstractVirtualValue(optimizer.OptValue):
@@ -386,6 +387,24 @@
self.make_equal_to(box, vvalue)
return vvalue
+ def optimize_GUARD_NO_EXCEPTION(self, op):
+ if self.last_emitted_operation is REMOVED:
+ return
+ self.emit_operation(op)
+
+ def optimize_GUARD_NOT_FORCED(self, op):
+ if self.last_emitted_operation is REMOVED:
+ return
+ self.emit_operation(op)
+
+ def optimize_CALL_MAY_FORCE(self, op):
+ effectinfo = op.getdescr().get_extra_info()
+ oopspecindex = effectinfo.oopspecindex
+ if oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUAL:
+ if self._optimize_JIT_FORCE_VIRTUAL(op):
+ return
+ self.emit_operation(op)
+
def optimize_VIRTUAL_REF(self, op):
indexbox = op.getarg(1)
#
@@ -429,7 +448,7 @@
# - set 'virtual_token' to TOKEN_NONE
args = [op.getarg(0), ConstInt(vrefinfo.TOKEN_NONE)]
seo(ResOperation(rop.SETFIELD_GC, args, None,
- descr = vrefinfo.descr_virtual_token))
+ descr=vrefinfo.descr_virtual_token))
# Note that in some cases the virtual in op.getarg(1) has been forced
# already. This is fine. In that case, and *if* a residual
# CALL_MAY_FORCE suddenly turns out to access it, then it will
@@ -437,6 +456,20 @@
# will work too (but just be a little pointless, as the structure
# was already forced).
+ def _optimize_JIT_FORCE_VIRTUAL(self, op):
+ vref = self.getvalue(op.getarg(1))
+ vrefinfo = self.optimizer.metainterp_sd.virtualref_info
+ if vref.is_virtual():
+ tokenvalue = vref.getfield(vrefinfo.descr_virtual_token, None)
+ if (tokenvalue is not None and tokenvalue.is_constant() and
+ tokenvalue.box.getint() == vrefinfo.TOKEN_NONE):
+ forcedvalue = vref.getfield(vrefinfo.descr_forced, None)
+ if forcedvalue is not None and not forcedvalue.is_null():
+ self.make_equal_to(op.result, forcedvalue)
+ self.last_emitted_operation = REMOVED
+ return True
+ return False
+
def optimize_GETFIELD_GC(self, op):
value = self.getvalue(op.getarg(0))
# If this is an immutable field (as indicated by op.is_always_pure())
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
@@ -160,16 +160,17 @@
class JitMixin:
basic = True
+
def check_resops(self, expected=None, **check):
get_stats().check_resops(expected=expected, **check)
+
def check_simple_loop(self, expected=None, **check):
get_stats().check_simple_loop(expected=expected, **check)
-
-
def check_trace_count(self, count): # was check_loop_count
# The number of traces compiled
assert get_stats().compiled_count == count
+
def check_trace_count_at_most(self, count):
assert get_stats().compiled_count <= count
@@ -178,11 +179,12 @@
def check_target_token_count(self, count):
tokens = get_stats().get_all_jitcell_tokens()
- n = sum ([len(t.target_tokens) for t in tokens])
+ n = sum([len(t.target_tokens) for t in tokens])
assert n == count
def check_enter_count(self, count):
assert get_stats().enter_count == count
+
def check_enter_count_at_most(self, count):
assert get_stats().enter_count <= count
@@ -192,6 +194,7 @@
def check_aborted_count(self, count):
assert get_stats().aborted_count == count
+
def check_aborted_count_at_least(self, count):
assert get_stats().aborted_count >= count
diff --git a/rpython/jit/metainterp/test/test_virtualref.py
b/rpython/jit/metainterp/test/test_virtualref.py
--- a/rpython/jit/metainterp/test/test_virtualref.py
+++ b/rpython/jit/metainterp/test/test_virtualref.py
@@ -1,19 +1,20 @@
import py
-from rpython.rtyper.lltypesystem import lltype, llmemory, lloperation
+
+from rpython.rtyper.lltypesystem import lltype, lloperation
from rpython.rtyper.exceptiondata import UnknownException
from rpython.rlib.jit import JitDriver, dont_look_inside, vref_None
from rpython.rlib.jit import virtual_ref, virtual_ref_finish, InvalidVirtualRef
from rpython.rlib.jit import non_virtual_ref
from rpython.rlib.objectmodel import compute_unique_id
-from rpython.jit.metainterp.test.support import LLJitMixin, OOJitMixin,
_get_jitcodes
+from rpython.jit.metainterp.test.support import LLJitMixin, _get_jitcodes
from rpython.jit.metainterp.resoperation import rop
from rpython.jit.metainterp.virtualref import VirtualRefInfo
+
debug_print = lloperation.llop.debug_print
-class VRefTests:
-
+class VRefTests(object):
def finish_setup_for_interp_operations(self):
self.vrefinfo = VirtualRefInfo(self.warmrunnerstate)
self.cw.setup_vrefinfo(self.vrefinfo)
@@ -115,8 +116,8 @@
from rpython.jit.metainterp.resume import ResumeDataDirectReader
cpu = self.metainterp.cpu
cpu.get_latest_value_count = lambda df: len(guard_op.getfailargs())
- cpu.get_latest_value_int = lambda
df,i:guard_op.getfailargs()[i].getint()
- cpu.get_latest_value_ref = lambda
df,i:guard_op.getfailargs()[i].getref_base()
+ cpu.get_latest_value_int = lambda df, i:
guard_op.getfailargs()[i].getint()
+ cpu.get_latest_value_ref = lambda df, i:
guard_op.getfailargs()[i].getref_base()
cpu.clear_latest_values = lambda count: None
class FakeMetaInterpSd:
callinfocollection = None
@@ -418,15 +419,18 @@
self.check_aborted_count(0)
def test_jit_force_virtual_seen(self):
- myjitdriver = JitDriver(greens = [], reds = ['n'])
- #
+ myjitdriver = JitDriver(greens=[], reds=['n'])
+
A = lltype.GcArray(lltype.Signed)
- class XY:
+
+ class XY(object):
pass
- class ExCtx:
+
+ class ExCtx(object):
pass
exctx = ExCtx()
- #
+ escapes = []
+
def f(n):
while n > 0:
myjitdriver.can_enter_jit(n=n)
@@ -434,16 +438,16 @@
xy = XY()
xy.n = n
exctx.topframeref = vref = virtual_ref(xy)
+ escapes.append(xy)
xy.next1 = lltype.malloc(A, 0)
n = exctx.topframeref().n - 1
- xy.next1 = lltype.nullptr(A)
exctx.topframeref = vref_None
virtual_ref_finish(vref, xy)
return 1
#
res = self.meta_interp(f, [15])
assert res == 1
- self.check_resops(new_with_vtable=4, # vref, xy
+ self.check_resops(new_with_vtable=2, # xy
new_array=2) # next1
self.check_aborted_count(0)
@@ -656,6 +660,34 @@
res = self.meta_interp(f, [10])
assert res == 0
+ def test_force_virtual_vref(self):
+ myjitdriver = JitDriver(greens=[], reds=['n', 'ec'])
+
+ class ExecutionContext(object):
+ pass
+
+ class Frame(object):
+ def __init__(self, x):
+ self.x = x
+
+ def f(n):
+ ec = ExecutionContext()
+ while n > 0:
+ myjitdriver.jit_merge_point(n=n, ec=ec)
+ frame = Frame(1)
+ ec.topframeref = virtual_ref(frame)
+ n -= ec.topframeref().x
+ frame_vref = ec.topframeref
+ ec.topframeref = vref_None
+ virtual_ref_finish(frame_vref, frame)
+ return n
+ res = self.meta_interp(f, [10])
+ assert res == 0
+ self.check_resops({
+ 'int_sub': 2, 'int_gt': 2, 'jump': 1, 'guard_true': 2,
+ 'force_token': 2, 'setfield_gc': 1
+ })
+
class TestLLtype(VRefTests, LLJitMixin):
pass
diff --git a/rpython/rlib/unicodedata/test/test_ucd.py
b/rpython/rlib/unicodedata/test/test_ucd.py
--- a/rpython/rlib/unicodedata/test/test_ucd.py
+++ b/rpython/rlib/unicodedata/test/test_ucd.py
@@ -1,9 +1,9 @@
+from rpython.rlib.runicode import code_to_unichr
+from rpython.rlib.unicodedata import unicodedb_5_2_0
from rpython.rtyper.test.tool import BaseRtypingTest, LLRtypeMixin
-from rpython.rlib.unicodedata import unicodedb_5_2_0
-from rpython.rlib.unicodedata.ucd import code_to_unichr
+
class TestTranslated(BaseRtypingTest, LLRtypeMixin):
-
def test_translated(self):
def f(n):
if n == 0:
diff --git a/rpython/rlib/unicodedata/test/test_unicodedata.py
b/rpython/rlib/unicodedata/test/test_unicodedata.py
--- a/rpython/rlib/unicodedata/test/test_unicodedata.py
+++ b/rpython/rlib/unicodedata/test/test_unicodedata.py
@@ -1,11 +1,15 @@
+import random
+import unicodedata
+
import py
+
from rpython.rlib.unicodedata import unicodedb_3_2_0, unicodedb_5_2_0
+
class TestUnicodeData(object):
def setup_class(cls):
- import random, unicodedata
if unicodedata.unidata_version != '5.2.0':
- skip('Needs python with unicode 5.2.0 database.')
+ py.test.skip('Needs python with unicode 5.2.0 database.')
seed = random.getrandbits(32)
print "random seed: ", seed
@@ -39,14 +43,12 @@
assert not unicodedb_5_2_0.isprintable(0xE0020) # TAG SPACE
def test_compare_functions(self):
- import unicodedata # CPython implementation
-
def getX(fun, code):
try:
return getattr(unicodedb_5_2_0, fun)(code)
except KeyError:
return -1
-
+
for code in range(0x10000):
char = unichr(code)
assert unicodedata.digit(char, -1) == getX('digit', code)
@@ -83,5 +85,3 @@
assert unicodedb_5_2_0.lookup('BENZENE RING WITH CIRCLE') == 9187
py.test.raises(KeyError, unicodedb_3_2_0.lookup, 'BENZENE RING WITH
CIRCLE')
py.test.raises(KeyError, unicodedb_3_2_0.name, 9187)
-
-
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit