[pypy-commit] pypy ppc-vsx-support: merge default
plan_rich
pypy.commits at gmail.com
Wed Aug 3 07:34:42 EDT 2016
Author: Richard Plangger <planrichi at gmail.com>
Branch: ppc-vsx-support
Changeset: r86000:8ec827c25980
Date: 2016-08-02 09:29 +0200
http://bitbucket.org/pypy/pypy/changeset/8ec827c25980/
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
@@ -101,3 +101,11 @@
.. branch: jitlog-32bit
Resolve issues to use the new logging facility on a 32bit system
+
+.. branch: ep2016sprint
+
+Trying harder to make hash(-1) return -2, like it does on CPython
+
+.. branch: jitlog-exact-source-lines
+
+Log exact line positions in debug merge points.
diff --git a/pypy/module/_jitlog/test/test__jitlog.py b/pypy/module/_jitlog/test/test__jitlog.py
--- a/pypy/module/_jitlog/test/test__jitlog.py
+++ b/pypy/module/_jitlog/test/test__jitlog.py
@@ -1,8 +1,9 @@
-
import sys
+import platform
from rpython.tool.udir import udir
from pypy.tool.pytest.objspace import gettestobjspace
from rpython.rlib.rjitlog import rjitlog as jl
+from rpython.jit.metainterp.resoperation import opname
class AppTestJitLog(object):
spaceconfig = {'usemodules': ['_jitlog', 'struct']}
@@ -12,6 +13,11 @@
cls.w_mark_header = cls.space.wrap(jl.MARK_JITLOG_HEADER)
cls.w_version = cls.space.wrap(jl.JITLOG_VERSION_16BIT_LE)
cls.w_is_32bit = cls.space.wrap(sys.maxint == 2**31-1)
+ cls.w_machine = cls.space.wrap(platform.machine())
+ cls.w_resops = cls.space.newdict()
+ space = cls.space
+ for key, value in opname.items():
+ space.setitem(cls.w_resops, space.wrap(key), space.wrap(value))
def test_enable(self):
import _jitlog, struct
@@ -25,8 +31,22 @@
assert fd.read(1) == self.mark_header
assert fd.read(2) == self.version
assert bool(ord(fd.read(1))) == self.is_32bit
+ strcount, = struct.unpack('<i', fd.read(4))
+ machine = fd.read(strcount)
+ assert machine == self.machine
+ # resoperations
count, = struct.unpack('<h', fd.read(2))
+ opnames = set()
for i in range(count):
opnum = struct.unpack('<h', fd.read(2))
- strcount = struct.unpack('<i', fd.read(4))
- fd.read(strcount)
+ strcount, = struct.unpack('<i', fd.read(4))
+ opname = fd.read(strcount)
+ opnames.append((opnum, opname))
+
+ for opnum, opname in opnames:
+ # must be known resoperation
+ assert opnum in self.resops
+ # the name must equal
+ assert self.resops[opnum] == opname
+
+
diff --git a/pypy/module/cpyext/include/pyport.h b/pypy/module/cpyext/include/pyport.h
--- a/pypy/module/cpyext/include/pyport.h
+++ b/pypy/module/cpyext/include/pyport.h
@@ -64,13 +64,6 @@
# error "Python needs a typedef for Py_uintptr_t in pyport.h."
#endif /* HAVE_UINTPTR_T */
-/* Py_hash_t is the same size as a pointer. */
-#define SIZEOF_PY_HASH_T SIZEOF_SIZE_T
-typedef Py_ssize_t Py_hash_t;
-/* Py_uhash_t is the unsigned equivalent needed to calculate numeric hash. */
-#define SIZEOF_PY_UHASH_T SIZEOF_SIZE_T
-typedef size_t Py_uhash_t;
-
/*******************************
* stat() and fstat() fiddling *
diff --git a/pypy/module/cpyext/number.py b/pypy/module/cpyext/number.py
--- a/pypy/module/cpyext/number.py
+++ b/pypy/module/cpyext/number.py
@@ -20,16 +20,12 @@
def PyNumber_Check(space, w_obj):
"""Returns 1 if the object o provides numeric protocols, and false otherwise.
This function always succeeds."""
- try:
- space.float_w(w_obj)
+ # According to CPython, this means: w_obj is not None, and
+ # the type of w_obj has got a method __int__ or __float__.
+ if w_obj is None:
+ return 0
+ if space.lookup(w_obj, '__int__') or space.lookup(w_obj, '__float__'):
return 1
- except OperationError:
- pass
- try:
- space.int_w(w_obj)
- return 1
- except OperationError:
- pass
return 0
@cpython_api([PyObject, PyObject], Py_ssize_t, error=-1)
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -381,6 +381,7 @@
('tp_as_number.c_nb_invert', '__invert__'),
('tp_as_number.c_nb_index', '__index__'),
('tp_as_number.c_nb_hex', '__hex__'),
+ ('tp_as_number.c_nb_oct', '__oct__'),
('tp_str', '__str__'),
('tp_repr', '__repr__'),
('tp_iter', '__iter__'),
diff --git a/pypy/module/cpyext/test/test_longobject.py b/pypy/module/cpyext/test/test_longobject.py
--- a/pypy/module/cpyext/test/test_longobject.py
+++ b/pypy/module/cpyext/test/test_longobject.py
@@ -259,8 +259,19 @@
ret = PyLong_FromLong(-1);
Py_DECREF(obj);
return ret;
+ """),
+ ("has_oct", "METH_NOARGS",
+ """
+ PyObject *ret, *obj = PyLong_FromLong(42);
+ if (obj->ob_type->tp_as_number->nb_oct)
+ ret = obj->ob_type->tp_as_number->nb_oct(obj);
+ else
+ ret = PyLong_FromLong(-1);
+ Py_DECREF(obj);
+ return ret;
""")])
assert module.has_sub() == 0
assert module.has_pow() == 0
assert module.has_hex() == '0x2aL'
+ assert module.has_oct() == '052L'
diff --git a/pypy/module/cpyext/test/test_number.py b/pypy/module/cpyext/test/test_number.py
--- a/pypy/module/cpyext/test/test_number.py
+++ b/pypy/module/cpyext/test/test_number.py
@@ -15,7 +15,7 @@
assert api.PyNumber_Check(space.wraplong(-12L))
assert api.PyNumber_Check(space.wrap(12.1))
assert not api.PyNumber_Check(space.wrap('12'))
- assert not api.PyNumber_Check(space.wrap(1+3j))
+ assert api.PyNumber_Check(space.wrap(1+3j))
def test_number_long(self, space, api):
w_l = api.PyNumber_Long(space.wrap(123))
@@ -151,7 +151,6 @@
'''
PyObject *obj = PyTuple_GET_ITEM(args, 0);
int val = PyNumber_Check(obj);
- Py_DECREF(obj);
return PyInt_FromLong(val);
''')])
val = mod.test_PyNumber_Check(10)
diff --git a/pypy/module/cpyext/test/test_typeobject.py b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -800,7 +800,7 @@
IntLike_Type.tp_as_number = &intlike_as_number;
intlike_as_number.nb_nonzero = intlike_nb_nonzero;
intlike_as_number.nb_int = intlike_nb_int;
- if (PyType_Ready(&IntLike_Type) < 0) return NULL;
+ PyType_Ready(&IntLike_Type);
""")
assert not bool(module.newInt(0))
assert bool(module.newInt(1))
diff --git a/pypy/module/pypyjit/interp_jit.py b/pypy/module/pypyjit/interp_jit.py
--- a/pypy/module/pypyjit/interp_jit.py
+++ b/pypy/module/pypyjit/interp_jit.py
@@ -46,6 +46,7 @@
jl.MP_SCOPE, jl.MP_INDEX, jl.MP_OPCODE)
def get_location(next_instr, is_being_profiled, bytecode):
from pypy.tool.stdlib_opcode import opcode_method_names
+ from rpython.tool.error import offset2lineno
bcindex = ord(bytecode.co_code[next_instr])
opname = ""
if 0 <= bcindex < len(opcode_method_names):
@@ -53,7 +54,8 @@
name = bytecode.co_name
if not name:
name = ""
- return (bytecode.co_filename, bytecode.co_firstlineno,
+ line = offset2lineno(bytecode, intmask(next_instr))
+ return (bytecode.co_filename, line,
name, intmask(next_instr), opname)
def should_unroll_one_iteration(next_instr, is_being_profiled, bytecode):
diff --git a/pypy/module/thread/os_lock.py b/pypy/module/thread/os_lock.py
--- a/pypy/module/thread/os_lock.py
+++ b/pypy/module/thread/os_lock.py
@@ -26,8 +26,7 @@
elif timeout == -1.0:
microseconds = -1
else:
- # 0.0 => 0.0, but otherwise tends to round up
- timeout = timeout * 1e6 + 0.999
+ timeout *= 1e6
try:
microseconds = ovfcheck_float_to_longlong(timeout)
except OverflowError:
diff --git a/pypy/module/thread/test/test_lock.py b/pypy/module/thread/test/test_lock.py
--- a/pypy/module/thread/test/test_lock.py
+++ b/pypy/module/thread/test/test_lock.py
@@ -81,7 +81,7 @@
else:
got_ovf = False
lock.release()
- assert (i, got_ovf) == (i, int(timeout * 1e6 + 0.999) > maxint)
+ assert (i, got_ovf) == (i, int(timeout * 1e6) > maxint)
@py.test.mark.xfail(machine()=='s390x', reason='may fail under heavy load')
def test_ping_pong(self):
diff --git a/pypy/objspace/descroperation.py b/pypy/objspace/descroperation.py
--- a/pypy/objspace/descroperation.py
+++ b/pypy/objspace/descroperation.py
@@ -424,29 +424,20 @@
raise oefmt(space.w_TypeError,
"'%T' objects are unhashable", w_obj)
w_result = space.get_and_call_function(w_hash, w_obj)
- w_resulttype = space.type(w_result)
# issue 2346 : returns now -2 for hashing -1 like cpython
- if space.is_w(w_resulttype, space.w_int):
- if space.int_w(w_result) == -1:
- return space.wrap(-2)
- return w_result
- elif space.isinstance_w(w_result, space.w_int):
- # be careful about subclasses of 'int'...
- int_result = space.int_w(w_result)
- if int_result == -1:
- int_result == -2
- return space.wrap(int_result)
+ if space.isinstance_w(w_result, space.w_int):
+ h = space.int_w(w_result)
elif space.isinstance_w(w_result, space.w_long):
- # be careful about subclasses of 'long'...
bigint = space.bigint_w(w_result)
h = bigint.hash()
- if h == -1:
- h = -2
- return space.wrap(h)
else:
raise oefmt(space.w_TypeError,
"__hash__() should return an int or long")
+ # turn -1 into -2 without using a condition, which would
+ # create a potential bridge in the JIT
+ h -= (h == -1)
+ return space.wrap(h)
def cmp(space, w_v, w_w):
diff --git a/pypy/objspace/std/test/test_stdobjspace.py b/pypy/objspace/std/test/test_stdobjspace.py
--- a/pypy/objspace/std/test/test_stdobjspace.py
+++ b/pypy/objspace/std/test/test_stdobjspace.py
@@ -66,17 +66,18 @@
def test_wrap_various_unsigned_types(self):
import sys
+ from rpython.rlib.rarithmetic import r_uint
from rpython.rtyper.lltypesystem import lltype, rffi
space = self.space
value = sys.maxint * 2
- x = rffi.cast(lltype.Unsigned, value)
+ x = r_uint(value)
assert space.eq_w(space.wrap(value), space.wrap(x))
- x = rffi.cast(rffi.UINTPTR_T, value)
+ x = rffi.cast(rffi.UINTPTR_T, r_uint(value))
assert x > 0
assert space.eq_w(space.wrap(value), space.wrap(x))
value = 60000
- x = rffi.cast(rffi.USHORT, value)
+ x = rffi.cast(rffi.USHORT, r_uint(value))
assert space.eq_w(space.wrap(value), space.wrap(x))
value = 200
- x = rffi.cast(rffi.UCHAR, value)
+ x = rffi.cast(rffi.UCHAR, r_uint(value))
assert space.eq_w(space.wrap(value), space.wrap(x))
diff --git a/pypy/tool/pytest/objspace.py b/pypy/tool/pytest/objspace.py
--- a/pypy/tool/pytest/objspace.py
+++ b/pypy/tool/pytest/objspace.py
@@ -128,3 +128,5 @@
def is_w(self, obj1, obj2):
return obj1 is obj2
+ def setitem(self, obj, key, value):
+ obj[key] = value
diff --git a/rpython/annotator/binaryop.py b/rpython/annotator/binaryop.py
--- a/rpython/annotator/binaryop.py
+++ b/rpython/annotator/binaryop.py
@@ -401,6 +401,9 @@
class __extend__(pairtype(SomeString, SomeTuple),
pairtype(SomeUnicodeString, SomeTuple)):
def mod((s_string, s_tuple)):
+ if not s_string.is_constant():
+ raise AnnotatorError("string formatting requires a constant "
+ "string/unicode on the left of '%'")
is_string = isinstance(s_string, SomeString)
is_unicode = isinstance(s_string, SomeUnicodeString)
assert is_string or is_unicode
diff --git a/rpython/annotator/test/test_annrpython.py b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -4623,6 +4623,14 @@
a = self.RPythonAnnotator()
a.build_types(main, [int])
+ def test_string_mod_nonconstant(self):
+ def f(x):
+ return x % 5
+ a = self.RPythonAnnotator()
+ e = py.test.raises(AnnotatorError, a.build_types, f, [str])
+ assert ('string formatting requires a constant string/unicode'
+ in str(e.value))
+
def g(n):
return [0, 1, 2, n]
diff --git a/rpython/jit/backend/x86/test/test_regloc.py b/rpython/jit/backend/x86/test/test_regloc.py
--- a/rpython/jit/backend/x86/test/test_regloc.py
+++ b/rpython/jit/backend/x86/test/test_regloc.py
@@ -147,7 +147,7 @@
py.test.skip()
def test_reuse_scratch_register(self):
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.begin_reuse_scratch_register()
cb.MOV(ecx, heap(base_addr))
@@ -167,7 +167,7 @@
# ------------------------------------------------------------
def test_64bit_address_1(self):
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.CMP(ecx, AddressLoc(ImmedLoc(0), ImmedLoc(0), 0, base_addr))
# this case is a CMP_rj
@@ -181,7 +181,7 @@
assert cb.getvalue() == expected_instructions
def test_64bit_address_2(self):
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(ecx, AddressLoc(ImmedLoc(0), edx, 3, base_addr))
# this case is a CMP_ra
@@ -195,7 +195,7 @@
assert cb.getvalue() == expected_instructions
def test_64bit_address_3(self):
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(ecx, AddressLoc(edx, ImmedLoc(0), 0, base_addr))
# this case is a CMP_rm
@@ -211,7 +211,7 @@
assert cb.getvalue() == expected_instructions
def test_64bit_address_4(self):
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.begin_reuse_scratch_register()
assert cb._reuse_scratch_register is True
@@ -234,7 +234,7 @@
# ------------------------------------------------------------
def test_MOV_64bit_constant_into_r11(self):
- base_constant = 0xFEDCBA9876543210
+ base_constant = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(r11, imm(base_constant))
@@ -245,7 +245,7 @@
assert cb.getvalue() == expected_instructions
def test_MOV_64bit_constant_into_rax(self):
- base_constant = 0xFEDCBA9876543210
+ base_constant = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(eax, imm(base_constant))
@@ -256,7 +256,7 @@
assert cb.getvalue() == expected_instructions
def test_MOV_64bit_address_into_r11(self):
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(r11, heap(base_addr))
@@ -270,7 +270,7 @@
def test_MOV_immed32_into_64bit_address_1(self):
immed = -0x01234567
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(ImmedLoc(0), ImmedLoc(0), 0, base_addr),
ImmedLoc(immed))
@@ -286,7 +286,7 @@
def test_MOV_immed32_into_64bit_address_2(self):
immed = -0x01234567
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(ImmedLoc(0), edx, 3, base_addr),
ImmedLoc(immed))
@@ -302,7 +302,7 @@
def test_MOV_immed32_into_64bit_address_3(self):
immed = -0x01234567
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(edx, ImmedLoc(0), 0, base_addr),
ImmedLoc(immed))
@@ -320,7 +320,7 @@
def test_MOV_immed32_into_64bit_address_4(self):
immed = -0x01234567
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(edx, esi, 2, base_addr), ImmedLoc(immed))
# this case is a MOV_ai
@@ -339,7 +339,7 @@
def test_MOV_immed64_into_64bit_address_1(self):
immed = 0x0123456789ABCDEF
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(ImmedLoc(0), ImmedLoc(0), 0, base_addr),
ImmedLoc(immed))
@@ -361,7 +361,7 @@
def test_MOV_immed64_into_64bit_address_2(self):
immed = 0x0123456789ABCDEF
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(ImmedLoc(0), edx, 3, base_addr),
ImmedLoc(immed))
@@ -383,7 +383,7 @@
def test_MOV_immed64_into_64bit_address_3(self):
immed = 0x0123456789ABCDEF
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(eax, ImmedLoc(0), 0, base_addr),
ImmedLoc(immed))
@@ -407,7 +407,7 @@
def test_MOV_immed64_into_64bit_address_4(self):
immed = 0x0123456789ABCDEF
- base_addr = 0xFEDCBA9876543210
+ base_addr = intmask(0xFEDCBA9876543210)
cb = LocationCodeBuilder64()
cb.MOV(AddressLoc(edx, eax, 2, base_addr), ImmedLoc(immed))
# this case is a MOV_ai
diff --git a/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py b/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py
--- a/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py
+++ b/rpython/jit/backend/x86/test/test_ztranslation_call_assembler.py
@@ -4,6 +4,16 @@
from rpython.jit.backend.x86.arch import WORD
import sys
+
+# On Windows, this test crashes obscurely, but only if compiled with
+# Boehm, not if run with no GC at all. So for now we'll assume it is
+# really a Boehm bug, or maybe a Boehm-on-Windows-specific issue, and
+# skip.
+if sys.platform == 'win32':
+ import py
+ py.test.skip("crashes on Windows (Boehm issue?)")
+
+
class TestTranslationCallAssemblerX86(TranslationTestCallAssembler):
def _check_cbuilder(self, cbuilder):
#We assume here that we have sse2. If not, the CPUClass
diff --git a/rpython/jit/backend/zarch/test/test_assembler.py b/rpython/jit/backend/zarch/test/test_assembler.py
--- a/rpython/jit/backend/zarch/test/test_assembler.py
+++ b/rpython/jit/backend/zarch/test/test_assembler.py
@@ -21,6 +21,7 @@
from rpython.rlib.debug import ll_assert
from rpython.rlib.longlong2float import (float2longlong,
DOUBLE_ARRAY_PTR, singlefloat2uint_emulator)
+from rpython.rlib.rarithmetic import r_uint, intmask
import ctypes
CPU = getcpuclass()
@@ -168,7 +169,7 @@
def test_load_byte_zero_extend(self):
adr = self.a.datablockwrapper.malloc_aligned(16, 16)
data = rffi.cast(rffi.CArrayPtr(rffi.ULONG), adr)
- data[0] = rffi.cast(rffi.ULONG,0xffffFFFFffffFF02)
+ data[0] = rffi.cast(rffi.ULONG, intmask(0xffffFFFFffffFF02))
self.a.mc.load_imm(r.r3, adr+7)
self.a.mc.LLGC(r.r2, loc.addr(0,r.r3))
self.a.mc.BCR(con.ANY, r.r14)
@@ -177,7 +178,7 @@
def test_load_byte_and_imm(self):
adr = self.a.datablockwrapper.malloc_aligned(16, 16)
data = rffi.cast(rffi.CArrayPtr(rffi.ULONG), adr)
- data[0] = rffi.cast(rffi.ULONG,0xffffFFFFffff0001)
+ data[0] = rffi.cast(rffi.ULONG, intmask(0xffffFFFFffff0001))
self.a.mc.load_imm(r.r3, adr)
self.a.mc.LG(r.r2, loc.addr(0,r.r3))
self.a.mc.LLGC(r.r2, loc.addr(7,r.r3))
diff --git a/rpython/jit/metainterp/test/test_fficall.py b/rpython/jit/metainterp/test/test_fficall.py
--- a/rpython/jit/metainterp/test/test_fficall.py
+++ b/rpython/jit/metainterp/test/test_fficall.py
@@ -11,7 +11,7 @@
from rpython.rlib.jit_libffi import (types, CIF_DESCRIPTION, FFI_TYPE_PP,
jit_ffi_call)
from rpython.rlib.unroll import unrolling_iterable
-from rpython.rlib.rarithmetic import intmask, r_longlong, r_singlefloat
+from rpython.rlib.rarithmetic import intmask, r_longlong, r_singlefloat, r_uint
from rpython.rlib.longlong2float import float2longlong
def get_description(atypes, rtype):
@@ -230,8 +230,8 @@
def test_handle_unsigned(self):
self._run([types.ulong], types.ulong,
- [rffi.cast(rffi.ULONG, sys.maxint + 91348)],
- rffi.cast(rffi.ULONG, sys.maxint + 4242))
+ [rffi.cast(rffi.ULONG, r_uint(sys.maxint + 91348))],
+ rffi.cast(rffi.ULONG, r_uint(sys.maxint + 4242)))
def test_handle_unsignedchar(self):
self._run([types.uint8], types.uint8,
diff --git a/rpython/jit/metainterp/test/test_memmgr.py b/rpython/jit/metainterp/test/test_memmgr.py
--- a/rpython/jit/metainterp/test/test_memmgr.py
+++ b/rpython/jit/metainterp/test/test_memmgr.py
@@ -248,8 +248,8 @@
tokens = [t() for t in get_stats().jitcell_token_wrefs]
# Some loops have been freed
assert None in tokens
- # Loop with number 0, h(), has not been freed
- assert 0 in [t.number for t in tokens if t]
+ # Loop with number 1, h(), has not been freed
+ assert 1 in [t.number for t in tokens if t]
# ____________________________________________________________
diff --git a/rpython/jit/tl/tla/targettla.py b/rpython/jit/tl/tla/targettla.py
--- a/rpython/jit/tl/tla/targettla.py
+++ b/rpython/jit/tl/tla/targettla.py
@@ -4,9 +4,16 @@
def entry_point(args):
- """Main entry point of the stand-alone executable:
- takes a list of strings and returns the exit code.
- """
+ for i in range(len(argv)):
+ if argv[i] == "--jit":
+ if len(argv) == i + 1:
+ print "missing argument after --jit"
+ return 2
+ jitarg = argv[i + 1]
+ del argv[i:i+2]
+ jit.set_user_param(jitdriver, jitarg)
+ break
+
if len(args) < 3:
print "Usage: %s filename x" % (args[0],)
return 2
@@ -26,7 +33,7 @@
return bytecode
def target(driver, args):
- return entry_point, None
+ return entry_point
# ____________________________________________________________
diff --git a/rpython/jit/tl/tla/tla.py b/rpython/jit/tl/tla/tla.py
--- a/rpython/jit/tl/tla/tla.py
+++ b/rpython/jit/tl/tla/tla.py
@@ -60,19 +60,34 @@
# ____________________________________________________________
-CONST_INT = 1
-POP = 2
-ADD = 3
-RETURN = 4
-JUMP_IF = 5
-DUP = 6
-SUB = 7
-NEWSTR = 8
+OPNAMES = []
+HASARG = []
+
+def define_op(name, has_arg=False):
+ globals()[name] = len(OPNAMES)
+ OPNAMES.append(name)
+ HASARG.append(has_arg)
+
+define_op("CONST_INT", True)
+define_op("POP")
+define_op("ADD")
+define_op("RETURN")
+define_op("JUMP_IF", True)
+define_op("DUP")
+define_op("SUB")
+define_op("NEWSTR", True)
+
# ____________________________________________________________
def get_printable_location(pc, bytecode):
- return str(pc)
+ op = ord(bytecode[pc])
+ name = OPNAMES[op]
+ if HASARG[op]:
+ arg = str(ord(bytecode[pc + 1]))
+ else:
+ arg = ''
+ return "%s: %s %s" % (pc, name, arg)
jitdriver = JitDriver(greens=['pc', 'bytecode'],
reds=['self'],
diff --git a/rpython/rlib/rjitlog/rjitlog.py b/rpython/rlib/rjitlog/rjitlog.py
--- a/rpython/rlib/rjitlog/rjitlog.py
+++ b/rpython/rlib/rjitlog/rjitlog.py
@@ -3,6 +3,7 @@
import weakref
import struct
import os
+import platform
from rpython.rlib import jit
from rpython.tool.udir import udir
from rpython.tool.version import rpythonroot
@@ -282,14 +283,16 @@
IS_32_BIT = sys.maxint == 2**31-1
+MACHINE_NAME = platform.machine()
+
def assemble_header():
version = JITLOG_VERSION_16BIT_LE
count = len(resoperations.opname)
is_32bit = chr(0x1)
if not IS_32_BIT:
is_32bit = chr(0x0)
- content = [version, is_32bit, MARK_RESOP_META,
- encode_le_16bit(count)]
+ content = [version, is_32bit, encode_str(MACHINE_NAME),
+ MARK_RESOP_META, encode_le_16bit(count)]
for opnum, opname in resoperations.opname.items():
content.append(encode_le_16bit(opnum))
content.append(encode_str(opname.lower()))
diff --git a/rpython/rlib/test/test_rarithmetic.py b/rpython/rlib/test/test_rarithmetic.py
--- a/rpython/rlib/test/test_rarithmetic.py
+++ b/rpython/rlib/test/test_rarithmetic.py
@@ -404,6 +404,8 @@
def test_int_c_div_mod(x, y):
assert int_c_div(~x, y) == -(abs(~x) // y)
assert int_c_div( x,-y) == -(x // y)
+ if (x, y) == (sys.maxint, 1):
+ py.test.skip("would overflow")
assert int_c_div(~x,-y) == +(abs(~x) // y)
for x1 in [x, ~x]:
for y1 in [y, -y]:
diff --git a/rpython/rtyper/lltypesystem/lltype.py b/rpython/rtyper/lltypesystem/lltype.py
--- a/rpython/rtyper/lltypesystem/lltype.py
+++ b/rpython/rtyper/lltypesystem/lltype.py
@@ -812,8 +812,10 @@
if tp is long:
if -maxint-1 <= val <= maxint:
return Signed
+ elif longlongmask(val) == val:
+ return SignedLongLong
else:
- return SignedLongLong
+ raise OverflowError("integer %r is out of bounds" % (val,))
if tp is bool:
return Bool
if issubclass(tp, base_int):
diff --git a/rpython/rtyper/rrange.py b/rpython/rtyper/rrange.py
--- a/rpython/rtyper/rrange.py
+++ b/rpython/rtyper/rrange.py
@@ -199,8 +199,11 @@
self.r_baseiter = r_baseiter
self.lowleveltype = r_baseiter.lowleveltype
# only supports for now enumerate() on sequence types whose iterators
- # have a method ll_getnextindex. It's easy to add one for most
- # iterator types, but I didn't do it so far.
+ # have a method ll_getnextindex. It could be added for most
+ # iterator types, but it's a bit messy for no clear benefit.
+ if not hasattr(r_baseiter, 'll_getnextindex'):
+ raise TyperError("not implemented for now: enumerate(x) where x "
+ "is not a regular list (got %r)" % (r_baseiter,))
self.ll_getnextindex = r_baseiter.ll_getnextindex
def rtype_next(self, hop):
diff --git a/rpython/rtyper/rstr.py b/rpython/rtyper/rstr.py
--- a/rpython/rtyper/rstr.py
+++ b/rpython/rtyper/rstr.py
@@ -591,7 +591,9 @@
class __extend__(pairtype(IntegerRepr, AbstractStringRepr)):
def rtype_mul((r_int, r_str), hop):
- return pair(r_str, r_int).rtype_mul(hop)
+ str_repr = r_str.repr
+ v_int, v_str = hop.inputargs(Signed, str_repr)
+ return hop.gendirectcall(r_str.ll.ll_str_mul, v_str, v_int)
rtype_inplace_mul = rtype_mul
diff --git a/rpython/rtyper/test/test_rstr.py b/rpython/rtyper/test/test_rstr.py
--- a/rpython/rtyper/test/test_rstr.py
+++ b/rpython/rtyper/test/test_rstr.py
@@ -220,11 +220,12 @@
const = self.const
def fn(i, mul):
s = ["", "a", "aba"][i]
- return s * mul
+ return s * mul + mul * s
for i in xrange(3):
for m in [0, 1, 4]:
+ res1 = fn(i, m)
res = self.interpret(fn, [i, m])
- assert self.ll_to_string(res) == fn(i, m)
+ assert self.ll_to_string(res) == res1
def test_is_none(self):
const = self.const
diff --git a/rpython/tool/error.py b/rpython/tool/error.py
--- a/rpython/tool/error.py
+++ b/rpython/tool/error.py
@@ -158,6 +158,8 @@
@jit.elidable
def offset2lineno(c, stopat):
+ # even position in lnotab denote byte increments, odd line increments.
+ # see dis.findlinestarts in the python std. library for more details
tab = c.co_lnotab
line = c.co_firstlineno
addr = 0
diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -422,14 +422,11 @@
mk.definition('PROFOPT', profopt)
rules = [
- ('clean', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES) *.gc?? ../module_cache/*.gc??'),
- ('clean_noprof', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES)'),
('debug', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT" debug_target'),
('debug_exc', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DDO_LOG_EXC" debug_target'),
('debug_mem', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DPYPY_USE_TRIVIAL_MALLOC" debug_target'),
('llsafer', '', '$(MAKE) CFLAGS="-O2 -DRPY_LL_ASSERT" $(DEFAULT_TARGET)'),
('lldebug', '', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'),
- ('lldebug0','', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -O0 -DMAX_STACK_SIZE=8192000 -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'),
('profile', '', '$(MAKE) CFLAGS="-g -O1 -pg $(CFLAGS) -fno-omit-frame-pointer" LDFLAGS="-pg $(LDFLAGS)" $(DEFAULT_TARGET)'),
]
if self.has_profopt():
@@ -443,6 +440,17 @@
for rule in rules:
mk.rule(*rule)
+ if self.translator.platform.name == 'msvc':
+ mk.rule('lldebug0','', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -Od -DMAX_STACK_SIZE=8192000 -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'),
+ wildcards = '..\*.obj ..\*.pdb ..\*.lib ..\*.dll ..\*.manifest ..\*.exp *.pch'
+ cmd = r'del /s %s $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES)' % wildcards
+ mk.rule('clean', '', cmd + ' *.gc?? ..\module_cache\*.gc??')
+ mk.rule('clean_noprof', '', cmd)
+ else:
+ mk.rule('lldebug0','', '$(MAKE) CFLAGS="$(DEBUGFLAGS) -O0 -DMAX_STACK_SIZE=8192000 -DRPY_ASSERT -DRPY_LL_ASSERT" debug_target'),
+ mk.rule('clean', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES) *.gc?? ../module_cache/*.gc??')
+ mk.rule('clean_noprof', '', 'rm -f $(OBJECTS) $(DEFAULT_TARGET) $(TARGET) $(GCMAPFILES) $(ASMFILES)')
+
#XXX: this conditional part is not tested at all
if self.config.translation.gcrootfinder == 'asmgcc':
if self.translator.platform.name == 'msvc':
@@ -507,7 +515,7 @@
else:
mk.definition('DEBUGFLAGS', '-O1 -g')
if self.translator.platform.name == 'msvc':
- mk.rule('debug_target', '$(DEFAULT_TARGET)', 'rem')
+ mk.rule('debug_target', '$(DEFAULT_TARGET) $(WTARGET)', 'rem')
else:
mk.rule('debug_target', '$(DEFAULT_TARGET)', '#')
mk.write()
More information about the pypy-commit
mailing list