[pypy-commit] pypy operrfmt-NT: merge default
pjenvey
noreply at buildbot.pypy.org
Tue May 28 21:44:23 CEST 2013
Author: Philip Jenvey <pjenvey at underboss.org>
Branch: operrfmt-NT
Changeset: r64633:1d387bc97dc7
Date: 2013-05-28 12:38 -0700
http://bitbucket.org/pypy/pypy/changeset/1d387bc97dc7/
Log: merge default
diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst
--- a/pypy/doc/whatsnew-head.rst
+++ b/pypy/doc/whatsnew-head.rst
@@ -34,3 +34,9 @@
.. branch: remove-iter-smm
Remove multi-methods on iterators
+
+.. branch: emit-call-x86
+.. branch: emit-call-arm
+
+.. branch: on-abort-resops
+Added list of resops to the pypyjit on_abort hook.
diff --git a/pypy/module/array/interp_array.py b/pypy/module/array/interp_array.py
--- a/pypy/module/array/interp_array.py
+++ b/pypy/module/array/interp_array.py
@@ -59,7 +59,7 @@
arr_eq_driver = jit.JitDriver(greens = ['comp_func'], reds = 'auto')
EQ, NE, LT, LE, GT, GE = range(6)
-def compare_arrays(space, arr1, arr2, comp_op, comp_func):
+def compare_arrays(space, arr1, arr2, comp_op):
if (not isinstance(arr1, W_ArrayBase) or
not isinstance(arr2, W_ArrayBase)):
return space.w_NotImplemented
@@ -69,22 +69,31 @@
return space.w_True
lgt = min(arr1.len, arr2.len)
for i in range(lgt):
- arr_eq_driver.jit_merge_point(comp_func=comp_func)
+ arr_eq_driver.jit_merge_point(comp_func=comp_op)
w_elem1 = arr1.w_getitem(space, i)
w_elem2 = arr2.w_getitem(space, i)
- res = space.is_true(comp_func(w_elem1, w_elem2))
if comp_op == EQ:
+ res = space.is_true(space.eq(w_elem1, w_elem2))
if not res:
return space.w_False
elif comp_op == NE:
+ res = space.is_true(space.ne(w_elem1, w_elem2))
if res:
return space.w_True
elif comp_op == LT or comp_op == GT:
+ if comp_op == LT:
+ res = space.is_true(space.lt(w_elem1, w_elem2))
+ else:
+ res = space.is_true(space.gt(w_elem1, w_elem2))
if res:
return space.w_True
elif not space.is_true(space.eq(w_elem1, w_elem2)):
return space.w_False
else:
+ if comp_op == LE:
+ res = space.is_true(space.le(w_elem1, w_elem2))
+ else:
+ res = space.is_true(space.ge(w_elem1, w_elem2))
if not res:
return space.w_False
elif not space.is_true(space.eq(w_elem1, w_elem2)):
@@ -362,27 +371,27 @@
def descr_eq(self, space, w_arr2):
"x.__eq__(y) <==> x==y"
- return compare_arrays(space, self, w_arr2, EQ, space.eq)
+ return compare_arrays(space, self, w_arr2, EQ)
def descr_ne(self, space, w_arr2):
"x.__ne__(y) <==> x!=y"
- return compare_arrays(space, self, w_arr2, NE, space.ne)
+ return compare_arrays(space, self, w_arr2, NE)
def descr_lt(self, space, w_arr2):
"x.__lt__(y) <==> x<y"
- return compare_arrays(space, self, w_arr2, LT, space.lt)
+ return compare_arrays(space, self, w_arr2, LT)
def descr_le(self, space, w_arr2):
"x.__le__(y) <==> x<=y"
- return compare_arrays(space, self, w_arr2, LE, space.le)
+ return compare_arrays(space, self, w_arr2, LE)
def descr_gt(self, space, w_arr2):
"x.__gt__(y) <==> x>y"
- return compare_arrays(space, self, w_arr2, GT, space.gt)
+ return compare_arrays(space, self, w_arr2, GT)
def descr_ge(self, space, w_arr2):
"x.__ge__(y) <==> x>=y"
- return compare_arrays(space, self, w_arr2, GE, space.ge)
+ return compare_arrays(space, self, w_arr2, GE)
# Basic get/set/append/extend methods
diff --git a/pypy/module/micronumpy/__init__.py b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -13,6 +13,7 @@
'empty': 'interp_numarray.zeros',
'ones': 'interp_numarray.ones',
'_reconstruct' : 'interp_numarray._reconstruct',
+ 'scalar' : 'interp_numarray.build_scalar',
'dot': 'interp_arrayops.dot',
'fromstring': 'interp_support.fromstring',
'flatiter': 'interp_flatiter.W_FlatIterator',
diff --git a/pypy/module/micronumpy/interp_boxes.py b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -11,6 +11,8 @@
from rpython.rtyper.lltypesystem import rffi
from rpython.tool.sourcetools import func_with_new_name
from pypy.module.micronumpy.arrayimpl.voidbox import VoidBoxStorage
+from rpython.rlib.objectmodel import specialize
+from pypy.interpreter.mixedmodule import MixedModule
MIXIN_32 = (int_typedef,) if LONG_BIT == 32 else ()
MIXIN_64 = (int_typedef,) if LONG_BIT == 64 else ()
@@ -33,7 +35,11 @@
def new(space, w_subtype, w_value):
dtype = _get_dtype(space)
return dtype.itemtype.coerce_subtype(space, w_subtype, w_value)
- return func_with_new_name(new, name + "_box_new"), staticmethod(_get_dtype)
+
+ def descr_reduce(self, space):
+ return self.reduce(space)
+
+ return func_with_new_name(new, name + "_box_new"), staticmethod(_get_dtype), func_with_new_name(descr_reduce, "descr_reduce")
class PrimitiveBox(object):
@@ -48,6 +54,26 @@
def __repr__(self):
return '%s(%s)' % (self.__class__.__name__, self.value)
+ def reduce(self, space):
+ from rpython.rlib.rstring import StringBuilder
+ from rpython.rtyper.lltypesystem import rffi, lltype
+
+ numpypy = space.getbuiltinmodule("_numpypy")
+ assert isinstance(numpypy, MixedModule)
+ multiarray = numpypy.get("multiarray")
+ assert isinstance(multiarray, MixedModule)
+ scalar = multiarray.get("scalar")
+
+ value = lltype.malloc(rffi.CArray(lltype.typeOf(self.value)), 1, flavor="raw")
+ value[0] = self.value
+
+ builder = StringBuilder()
+ builder.append_charpsize(rffi.cast(rffi.CCHARP, value), rffi.sizeof(lltype.typeOf(self.value)))
+
+ ret = space.newtuple([scalar, space.newtuple([space.wrap(self._get_dtype(space)), space.wrap(builder.build())])])
+ lltype.free(value, flavor="raw")
+ return ret
+
class ComplexBox(object):
_mixin_ = True
@@ -64,6 +90,26 @@
def convert_imag_to(self, dtype):
return dtype.box(self.imag)
+ def reduce(self, space):
+ from rpython.rlib.rstring import StringBuilder
+ from rpython.rtyper.lltypesystem import rffi, lltype
+
+ numpypy = space.getbuiltinmodule("_numpypy")
+ assert isinstance(numpypy, MixedModule)
+ multiarray = numpypy.get("multiarray")
+ assert isinstance(multiarray, MixedModule)
+ scalar = multiarray.get("scalar")
+
+ value = lltype.malloc(rffi.CArray(lltype.typeOf(self.real)), 2, flavor="raw")
+ value[0] = self.real
+ value[1] = self.imag
+
+ builder = StringBuilder()
+ builder.append_charpsize(rffi.cast(rffi.CCHARP, value), rffi.sizeof(lltype.typeOf(self.real)) * 2)
+
+ ret = space.newtuple([scalar, space.newtuple([space.wrap(self._get_dtype(space)), space.wrap(builder.build())])])
+ lltype.free(value, flavor="raw")
+ return ret
class W_GenericBox(W_Root):
_attrs_ = ()
@@ -187,7 +233,7 @@
return convert_to_array(space, w_values)
class W_BoolBox(W_GenericBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("bool")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("bool")
class W_NumberBox(W_GenericBox):
_attrs_ = ()
@@ -203,40 +249,40 @@
pass
class W_Int8Box(W_SignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("int8")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("int8")
class W_UInt8Box(W_UnsignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("uint8")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("uint8")
class W_Int16Box(W_SignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("int16")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("int16")
class W_UInt16Box(W_UnsignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("uint16")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("uint16")
class W_Int32Box(W_SignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("int32")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("int32")
class W_UInt32Box(W_UnsignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("uint32")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("uint32")
class W_LongBox(W_SignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("long")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("long")
class W_ULongBox(W_UnsignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("ulong")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("ulong")
class W_Int64Box(W_SignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("int64")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("int64")
class W_LongLongBox(W_SignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter('longlong')
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter('longlong')
class W_UInt64Box(W_UnsignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("uint64")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("uint64")
class W_ULongLongBox(W_SignedIntegerBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter('ulonglong')
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter('ulonglong')
class W_InexactBox(W_NumberBox):
_attrs_ = ()
@@ -245,13 +291,13 @@
_attrs_ = ()
class W_Float16Box(W_FloatingBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("float16")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("float16")
class W_Float32Box(W_FloatingBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("float32")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("float32")
class W_Float64Box(W_FloatingBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("float64")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("float64")
class W_FlexibleBox(W_GenericBox):
_attrs_ = ['ofs', 'dtype', 'arr']
@@ -356,33 +402,33 @@
class W_Complex64Box(ComplexBox, W_ComplexFloatingBox):
- descr__new__, _get_dtype = new_dtype_getter("complex64")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("complex64")
_COMPONENTS_BOX = W_Float32Box
class W_Complex128Box(ComplexBox, W_ComplexFloatingBox):
- descr__new__, _get_dtype = new_dtype_getter("complex128")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("complex128")
_COMPONENTS_BOX = W_Float64Box
if ENABLED_LONG_DOUBLE and long_double_size == 12:
class W_Float96Box(W_FloatingBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("float96")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("float96")
W_LongDoubleBox = W_Float96Box
class W_Complex192Box(ComplexBox, W_ComplexFloatingBox):
- descr__new__, _get_dtype = new_dtype_getter("complex192")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("complex192")
_COMPONENTS_BOX = W_Float96Box
W_CLongDoubleBox = W_Complex192Box
elif ENABLED_LONG_DOUBLE and long_double_size == 16:
class W_Float128Box(W_FloatingBox, PrimitiveBox):
- descr__new__, _get_dtype = new_dtype_getter("float128")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("float128")
W_LongDoubleBox = W_Float128Box
class W_Complex256Box(ComplexBox, W_ComplexFloatingBox):
- descr__new__, _get_dtype = new_dtype_getter("complex256")
+ descr__new__, _get_dtype, descr_reduce = new_dtype_getter("complex256")
_COMPONENTS_BOX = W_Float128Box
W_CLongDoubleBox = W_Complex256Box
@@ -458,6 +504,7 @@
__module__ = "numpypy",
__new__ = interp2app(W_BoolBox.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_BoolBox.descr_reduce),
)
W_NumberBox.typedef = TypeDef("number", W_GenericBox.typedef,
@@ -480,42 +527,49 @@
__module__ = "numpypy",
__new__ = interp2app(W_Int8Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_Int8Box.descr_reduce),
)
W_UInt8Box.typedef = TypeDef("uint8", W_UnsignedIntegerBox.typedef,
__module__ = "numpypy",
__new__ = interp2app(W_UInt8Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_UInt8Box.descr_reduce),
)
W_Int16Box.typedef = TypeDef("int16", W_SignedIntegerBox.typedef,
__module__ = "numpypy",
__new__ = interp2app(W_Int16Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_Int16Box.descr_reduce),
)
W_UInt16Box.typedef = TypeDef("uint16", W_UnsignedIntegerBox.typedef,
__module__ = "numpypy",
__new__ = interp2app(W_UInt16Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_UInt16Box.descr_reduce),
)
W_Int32Box.typedef = TypeDef("int32", (W_SignedIntegerBox.typedef,) + MIXIN_32,
__module__ = "numpypy",
__new__ = interp2app(W_Int32Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_Int32Box.descr_reduce),
)
W_UInt32Box.typedef = TypeDef("uint32", W_UnsignedIntegerBox.typedef,
__module__ = "numpypy",
__new__ = interp2app(W_UInt32Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_UInt32Box.descr_reduce),
)
W_Int64Box.typedef = TypeDef("int64", (W_SignedIntegerBox.typedef,) + MIXIN_64,
__module__ = "numpypy",
__new__ = interp2app(W_Int64Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_Int64Box.descr_reduce),
)
if LONG_BIT == 32:
@@ -529,6 +583,7 @@
__module__ = "numpypy",
__new__ = interp2app(W_UInt64Box.descr__new__.im_func),
__index__ = interp2app(descr_index),
+ __reduce__ = interp2app(W_UInt64Box.descr_reduce),
)
W_InexactBox.typedef = TypeDef("inexact", W_NumberBox.typedef,
@@ -543,23 +598,27 @@
__module__ = "numpypy",
__new__ = interp2app(W_Float16Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Float16Box.descr_reduce),
)
W_Float32Box.typedef = TypeDef("float32", W_FloatingBox.typedef,
__module__ = "numpypy",
__new__ = interp2app(W_Float32Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Float32Box.descr_reduce),
)
W_Float64Box.typedef = TypeDef("float64", (W_FloatingBox.typedef, float_typedef),
__module__ = "numpypy",
__new__ = interp2app(W_Float64Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Float64Box.descr_reduce),
)
if ENABLED_LONG_DOUBLE and long_double_size == 12:
W_Float96Box.typedef = TypeDef("float96", (W_FloatingBox.typedef),
__module__ = "numpypy",
+ __reduce__ = interp2app(W_Float96Box.descr_reduce),
__new__ = interp2app(W_Float96Box.descr__new__.im_func),
)
@@ -567,6 +626,7 @@
W_Complex192Box.typedef = TypeDef("complex192", (W_ComplexFloatingBox.typedef, complex_typedef),
__module__ = "numpypy",
__new__ = interp2app(W_Complex192Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Complex192Box.descr_reduce),
real = GetSetProperty(W_ComplexFloatingBox.descr_get_real),
imag = GetSetProperty(W_ComplexFloatingBox.descr_get_imag),
)
@@ -576,11 +636,13 @@
__module__ = "numpypy",
__new__ = interp2app(W_Float128Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Float128Box.descr_reduce),
)
W_Complex256Box.typedef = TypeDef("complex256", (W_ComplexFloatingBox.typedef, complex_typedef),
__module__ = "numpypy",
__new__ = interp2app(W_Complex256Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Complex256Box.descr_reduce),
real = GetSetProperty(W_ComplexFloatingBox.descr_get_real),
imag = GetSetProperty(W_ComplexFloatingBox.descr_get_imag),
)
@@ -618,6 +680,7 @@
W_Complex128Box.typedef = TypeDef("complex128", (W_ComplexFloatingBox.typedef, complex_typedef),
__module__ = "numpypy",
__new__ = interp2app(W_Complex128Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Complex128Box.descr_reduce),
real = GetSetProperty(W_ComplexFloatingBox.descr_get_real),
imag = GetSetProperty(W_ComplexFloatingBox.descr_get_imag),
)
@@ -625,6 +688,7 @@
W_Complex64Box.typedef = TypeDef("complex64", (W_ComplexFloatingBox.typedef),
__module__ = "numpypy",
__new__ = interp2app(W_Complex64Box.descr__new__.im_func),
+ __reduce__ = interp2app(W_Complex64Box.descr_reduce),
real = GetSetProperty(W_ComplexFloatingBox .descr_get_real),
imag = GetSetProperty(W_ComplexFloatingBox.descr_get_imag),
)
diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -1051,6 +1051,17 @@
def _reconstruct(space, w_subtype, w_shape, w_dtype):
return descr_new_array(space, w_subtype, w_shape, w_dtype)
+def build_scalar(space, w_dtype, w_state):
+ from rpython.rtyper.lltypesystem import rffi, lltype
+
+ assert isinstance(w_dtype, interp_dtype.W_Dtype)
+
+ state = rffi.str2charp(space.str_w(w_state))
+ box = w_dtype.itemtype.box_raw_data(state)
+ lltype.free(state, flavor="raw")
+ return box
+
+
W_FlatIterator.typedef = TypeDef(
'flatiter',
__iter__ = interp2app(W_FlatIterator.descr_iter),
diff --git a/pypy/module/micronumpy/test/test_scalar.py b/pypy/module/micronumpy/test/test_scalar.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/micronumpy/test/test_scalar.py
@@ -0,0 +1,23 @@
+from pypy.module.micronumpy.test.test_base import BaseNumpyAppTest
+
+class AppTestScalar(BaseNumpyAppTest):
+ spaceconfig = dict(usemodules=["micronumpy", "binascii", "struct"])
+
+ def test_pickle(self):
+ from numpypy import dtype, int32, float64, complex128, zeros, sum
+ from numpypy.core.multiarray import scalar
+ from cPickle import loads, dumps
+ i = int32(1337)
+ f = float64(13.37)
+ c = complex128(13 + 37.j)
+
+ assert i.__reduce__() == (scalar, (dtype('int32'), '9\x05\x00\x00'))
+ assert f.__reduce__() == (scalar, (dtype('float64'), '=\n\xd7\xa3p\xbd*@'))
+ assert c.__reduce__() == (scalar, (dtype('complex128'), '\x00\x00\x00\x00\x00\x00*@\x00\x00\x00\x00\x00\x80B@'))
+
+ assert loads(dumps(i)) == i
+ assert loads(dumps(f)) == f
+ assert loads(dumps(c)) == c
+
+ a = zeros(3)
+ assert loads(dumps(sum(a))) == sum(a)
diff --git a/pypy/module/micronumpy/types.py b/pypy/module/micronumpy/types.py
--- a/pypy/module/micronumpy/types.py
+++ b/pypy/module/micronumpy/types.py
@@ -145,6 +145,11 @@
#XXX this is the place to display a warning
return self.box(real)
+ def box_raw_data(self, data):
+ # For pickle
+ array = rffi.cast(rffi.CArrayPtr(self.T), data)
+ return self.box(array[0])
+
@specialize.argtype(1)
def unbox(self, box):
assert isinstance(box, self.BoxType)
@@ -1108,6 +1113,11 @@
rffi.cast(self.T, real),
rffi.cast(self.T, imag))
+ def box_raw_data(self, data):
+ # For pickle
+ array = rffi.cast(rffi.CArrayPtr(self.T), data)
+ return self.box_complex(array[0], array[1])
+
def unbox(self, box):
assert isinstance(box, self.BoxType)
# do this in two stages since real, imag are read only
diff --git a/pypy/module/pypyjit/test_pypy_c/test_array.py b/pypy/module/pypyjit/test_pypy_c/test_array.py
--- a/pypy/module/pypyjit/test_pypy_c/test_array.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_array.py
@@ -39,7 +39,7 @@
assert log.result == 19507200
loop, = log.loops_by_filename(self.filepath)
assert loop.match("""
- guard_not_invalidated(descr=...)
+ guard_not_invalidated?
i13 = int_lt(i7, i9)
guard_true(i13, descr=...)
i15 = getarrayitem_raw(i10, i7, descr=<ArrayS .>)
@@ -105,6 +105,7 @@
assert loop.match("""
i10 = int_lt(i6, 1000)
guard_true(i10, descr=...)
+ guard_not_invalidated?
i11 = int_lt(i6, i7)
guard_true(i11, descr=...)
f13 = getarrayitem_raw(i8, i6, descr=<ArrayF 8>)
@@ -141,6 +142,7 @@
assert loop.match("""
i10 = int_lt(i6, 1000)
guard_true(i10, descr=...)
+ guard_not_invalidated?
i11 = int_lt(i6, i7)
guard_true(i11, descr=...)
i13 = getarrayitem_raw(i8, i6, descr=<Array. 4>)
diff --git a/pypy/module/pypyjit/test_pypy_c/test_bug.py b/pypy/module/pypyjit/test_pypy_c/test_bug.py
--- a/pypy/module/pypyjit/test_pypy_c/test_bug.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_bug.py
@@ -9,6 +9,7 @@
cmdline = ['taskset', '-c', '0',
sys.executable, os.path.join(localdir, 'bug1.py')]
- popen = subprocess.Popen(cmdline)
+ popen = subprocess.Popen(cmdline, stderr=subprocess.PIPE)
+ errmsg = popen.stderr.read()
err = popen.wait()
- assert err == 0
+ assert err == 0, "err = %r, errmsg:\n%s" % (err, errmsg)
diff --git a/pypy/module/pypyjit/test_pypy_c/test_getframe.py b/pypy/module/pypyjit/test_pypy_c/test_getframe.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/pypyjit/test_pypy_c/test_getframe.py
@@ -0,0 +1,25 @@
+from pypy.module.pypyjit.test_pypy_c.test_00_model import BaseTestPyPyC
+
+
+class TestGetFrame(BaseTestPyPyC):
+ def test_getframe_one(self):
+ def main(n):
+ import sys
+
+ i = 0
+ while i < n:
+ assert sys._getframe(0).f_code.co_filename == __file__
+ i += 1
+ return i
+
+ log = self.run(main, [300])
+ assert log.result == 300
+ loop, = log.loops_by_filename(self.filepath)
+ assert loop.match("""
+ i54 = int_lt(i47, i28)
+ guard_true(i54, descr=...)
+ guard_not_invalidated(descr=...)
+ i55 = int_add(i47, 1)
+ --TICK--
+ jump(..., descr=...)
+ """)
diff --git a/pypy/module/sys/vm.py b/pypy/module/sys/vm.py
--- a/pypy/module/sys/vm.py
+++ b/pypy/module/sys/vm.py
@@ -1,14 +1,18 @@
"""
Implementation of interpreter-level 'sys' routines.
"""
-from pypy.interpreter import gateway
-from pypy.interpreter.error import OperationError
-from pypy.interpreter.gateway import unwrap_spec, WrappedDefault
+
from rpython.rlib import jit
from rpython.rlib.runicode import MAXUNICODE
+from pypy.interpreter import gateway
+from pypy.interpreter.error import OperationError
+from pypy.interpreter.gateway import unwrap_spec
+
+
# ____________________________________________________________
+
@unwrap_spec(depth=int)
def _getframe(space, depth=0):
"""Return a frame object from the call stack. If optional integer depth is
@@ -21,6 +25,11 @@
if depth < 0:
raise OperationError(space.w_ValueError,
space.wrap("frame index must not be negative"))
+ return getframe(space, depth)
+
+
+ at jit.look_inside_iff(lambda space, depth: jit.isconstant(depth))
+def getframe(space, depth):
ec = space.getexecutioncontext()
f = ec.gettopframe_nohidden()
while True:
@@ -28,11 +37,11 @@
raise OperationError(space.w_ValueError,
space.wrap("call stack is not deep enough"))
if depth == 0:
- break
+ f.mark_as_escaped()
+ return space.wrap(f)
depth -= 1
f = ec.getnextframe_nohidden(f)
- f.mark_as_escaped()
- return space.wrap(f)
+
@unwrap_spec(new_limit="c_int")
def setrecursionlimit(space, new_limit):
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -412,7 +412,7 @@
# No more items to compare -- compare sizes
return space.newbool(op(self.length(), w_list2.length()))
- return func_with_new_name(compare_unwrappeditems, name + '__List_List')
+ return func_with_new_name(compare_unwrappeditems, 'descr_' + name)
descr_lt = _make_list_comparison('lt')
descr_le = _make_list_comparison('le')
diff --git a/pypy/objspace/std/stringtype.py b/pypy/objspace/std/stringtype.py
--- a/pypy/objspace/std/stringtype.py
+++ b/pypy/objspace/std/stringtype.py
@@ -1,13 +1,14 @@
+from sys import maxint
+
+from rpython.rlib import jit
+from rpython.rlib.objectmodel import specialize
+
from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
from pypy.objspace.std.stdtypedef import StdTypeDef, SMM
from pypy.objspace.std.basestringtype import basestring_typedef
from pypy.objspace.std.register_all import register_all
-from sys import maxint
-from rpython.rlib.objectmodel import specialize
-from rpython.rlib.jit import we_are_jitted
-
def wrapstr(space, s):
from pypy.objspace.std.stringobject import W_StringObject
if space.config.objspace.std.sharesmallstr:
@@ -27,7 +28,7 @@
def wrapchar(space, c):
from pypy.objspace.std.stringobject import W_StringObject
- if space.config.objspace.std.withprebuiltchar and not we_are_jitted():
+ if space.config.objspace.std.withprebuiltchar and not jit.we_are_jitted():
return W_StringObject.PREBUILT[ord(c)]
else:
return W_StringObject(c)
@@ -293,11 +294,13 @@
str_typedef.registermethods(globals())
+
# ____________________________________________________________
# Helpers for several string implementations
@specialize.argtype(0)
+ at jit.elidable
def stringendswith(u_self, suffix, start, end):
begin = end - len(suffix)
if begin < start:
@@ -308,6 +311,7 @@
return True
@specialize.argtype(0)
+ at jit.elidable
def stringstartswith(u_self, prefix, start, end):
stop = start + len(prefix)
if stop > end:
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
@@ -156,7 +156,7 @@
iteritems = self._fields.iteritems()
if not we_are_translated(): #random order is fine, except for tests
iteritems = list(iteritems)
- iteritems.sort(key = lambda (x,y): x.sort_key())
+ iteritems.sort(key=lambda (x, y): x.sort_key())
for ofs, value in iteritems:
if value.is_null():
continue
@@ -353,7 +353,7 @@
# random order is fine, except for tests
if not we_are_translated():
iteritems = list(iteritems)
- iteritems.sort(key = lambda (x, y): x.sort_key())
+ iteritems.sort(key=lambda (x, y): x.sort_key())
for descr, value in iteritems:
subbox = value.force_box(optforce)
op = ResOperation(rop.SETINTERIORFIELD_GC,
@@ -426,7 +426,7 @@
if not we_are_translated():
op.name = 'FORCE ' + self.source_op.name
optforce.emit_operation(self.source_op)
- self.box = box = self.source_op.result
+ self.box = self.source_op.result
for i in range(len(self.buffer.offsets)):
# get a pointer to self.box+offset
offset = self.buffer.offsets[i]
@@ -533,8 +533,6 @@
self.emit_operation(op)
def optimize_VIRTUAL_REF(self, op):
- indexbox = op.getarg(1)
- #
# get some constants
vrefinfo = self.optimizer.metainterp_sd.virtualref_info
c_cls = vrefinfo.jit_virtual_ref_const_class
@@ -570,7 +568,7 @@
objbox = op.getarg(1)
if not CONST_NULL.same_constant(objbox):
seo(ResOperation(rop.SETFIELD_GC, op.getarglist(), None,
- descr = vrefinfo.descr_forced))
+ descr=vrefinfo.descr_forced))
# - set 'virtual_token' to TOKEN_NONE (== NULL)
args = [op.getarg(0), CONST_NULL]
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
@@ -1158,6 +1158,7 @@
obj = box.getref_base()
vref = vrefinfo.virtual_ref_during_tracing(obj)
resbox = history.BoxPtr(vref)
+ self.metainterp.heapcache.new(resbox)
cindex = history.ConstInt(len(metainterp.virtualref_boxes) // 2)
metainterp.history.record(rop.VIRTUAL_REF, [box, cindex], resbox)
# Note: we allocate a JIT_VIRTUAL_REF here
More information about the pypy-commit
mailing list