Author: Armin Rigo <[email protected]>
Branch: py3.5
Changeset: r89331:b6b06ee0fb56
Date: 2017-01-03 10:47 +0100
http://bitbucket.org/pypy/pypy/changeset/b6b06ee0fb56/
Log: hg merge default
diff --git a/rpython/jit/codewriter/assembler.py
b/rpython/jit/codewriter/assembler.py
--- a/rpython/jit/codewriter/assembler.py
+++ b/rpython/jit/codewriter/assembler.py
@@ -5,6 +5,7 @@
from rpython.jit.codewriter.jitcode import SwitchDictDescr, JitCode
from rpython.jit.codewriter import heaptracker, longlong
from rpython.rlib.objectmodel import ComputedIntSymbolic
+from rpython.rlib.rarithmetic import r_int
from rpython.flowspace.model import Constant
from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
from rpython.rtyper import rclass
@@ -82,6 +83,8 @@
if not isinstance(value, (llmemory.AddressAsInt,
ComputedIntSymbolic)):
value = lltype.cast_primitive(lltype.Signed, value)
+ if type(value) is r_int:
+ value = int(value)
if allow_short:
try:
short_num = -128 <= value <= 127
diff --git a/rpython/jit/codewriter/jitcode.py
b/rpython/jit/codewriter/jitcode.py
--- a/rpython/jit/codewriter/jitcode.py
+++ b/rpython/jit/codewriter/jitcode.py
@@ -1,6 +1,7 @@
from rpython.jit.metainterp.history import AbstractDescr, ConstInt
from rpython.jit.codewriter import heaptracker
from rpython.rlib.objectmodel import we_are_translated
+from rpython.rlib.rarithmetic import base_int
class JitCode(AbstractDescr):
@@ -21,6 +22,10 @@
liveness=None, startpoints=None, alllabels=None,
resulttypes=None):
self.code = code
+ for x in constants_i:
+ assert not isinstance(x, base_int), (
+ "found constant %r of type %r, must not appear in "
+ "JitCode.constants_i" % (x, type(x)))
# if the following lists are empty, use a single shared empty list
self.constants_i = constants_i or self._empty_i
self.constants_r = constants_r or self._empty_r
diff --git a/rpython/jit/codewriter/test/test_assembler.py
b/rpython/jit/codewriter/test/test_assembler.py
--- a/rpython/jit/codewriter/test/test_assembler.py
+++ b/rpython/jit/codewriter/test/test_assembler.py
@@ -7,6 +7,7 @@
from rpython.jit.metainterp.history import AbstractDescr
from rpython.flowspace.model import Constant
from rpython.rtyper.lltypesystem import lltype, llmemory
+from rpython.rlib.rarithmetic import r_int, r_uint
def test_assemble_simple():
@@ -239,3 +240,17 @@
]
assembler = Assembler()
py.test.raises(AssemblerError, assembler.assemble, ssarepr)
+
+def test_assemble_r_int():
+ # r_int is a strange type, which the jit should replace with int.
+ # r_uint is also replaced with int.
+ ssarepr = SSARepr("test")
+ i0, i1, i2 = Register('int', 0), Register('int', 1), Register('int', 2)
+ ssarepr.insns = [
+ ('uint_add', i0, Constant(r_uint(42424242), lltype.Unsigned), '->',
i1),
+ ('int_add', i0, Constant(r_int(42424243), lltype.Signed), '->', i2),
+ ]
+ assembler = Assembler()
+ jitcode = assembler.assemble(ssarepr)
+ assert jitcode.constants_i == [42424242, 42424243]
+ assert map(type, jitcode.constants_i) == [int, int]
diff --git a/rpython/jit/metainterp/blackhole.py
b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -6,6 +6,7 @@
from rpython.jit.metainterp.history import MissingValue
from rpython.rlib import longlong2float
from rpython.rlib.debug import ll_assert, make_sure_not_resized
+from rpython.rlib.debug import check_annotation
from rpython.rlib.objectmodel import we_are_translated, specialize
from rpython.rlib.rarithmetic import intmask, LONG_BIT, r_uint, ovfcheck
from rpython.rlib.unroll import unrolling_iterable
@@ -183,7 +184,7 @@
if lltype.typeOf(result) is lltype.Bool:
result = int(result)
assert lltype.typeOf(result) is lltype.Signed
- self.registers_i[ord(code[position])] = result
+ self.registers_i[ord(code[position])] = plain_int(result)
position += 1
elif resulttype == 'r':
# argcode should be 'r' too
@@ -213,7 +214,7 @@
if lltype.typeOf(result) is lltype.Bool:
result = int(result)
assert lltype.typeOf(result) is lltype.Signed
- self.registers_i[ord(code[position])] = result
+ self.registers_i[ord(code[position])] = plain_int(result)
position += 1
elif resulttype == 'L':
assert result >= 0
@@ -251,6 +252,23 @@
if b < 0 or b >= LONG_BIT:
raise ValueError("Shift count, %d, not in valid range, 0 .. %d."
% (b, LONG_BIT-1))
+def check_list_of_plain_integers(s_arg, bookkeeper):
+ """Check that 'BlackhopeInterpreter.registers_i' is annotated as a
+ non-resizable list of plain integers (and not r_int's for example)."""
+ from rpython.annotator import model as annmodel
+ assert isinstance(s_arg, annmodel.SomeList)
+ s_arg.listdef.never_resize()
+ assert s_arg.listdef.listitem.s_value.knowntype is int
+
+def _check_int(s_arg, bookkeeper):
+ assert s_arg.knowntype is int
+
+def plain_int(x):
+ """Check that 'x' is annotated as a plain integer (and not r_int)"""
+ check_annotation(x, _check_int)
+ return x
+
+
class BlackholeInterpreter(object):
def __init__(self, builder, count_interpreter):
@@ -277,6 +295,7 @@
self.tmpreg_r = default_r
self.tmpreg_f = default_f
self.jitcode = None
+ check_annotation(self.registers_i, check_list_of_plain_integers)
def __repr__(self):
return '<BHInterp #%d>' % self.count_interpreter
@@ -295,7 +314,7 @@
def setarg_i(self, index, value):
assert lltype.typeOf(value) is lltype.Signed
- self.registers_i[index] = value
+ self.registers_i[index] = plain_int(value)
def setarg_r(self, index, value):
assert lltype.typeOf(value) == llmemory.GCREF
@@ -1573,7 +1592,8 @@
# 'xxx_call_yyy' instructions from the caller frame
def _setup_return_value_i(self, result):
assert lltype.typeOf(result) is lltype.Signed
- self.registers_i[ord(self.jitcode.code[self.position-1])] = result
+ self.registers_i[ord(self.jitcode.code[self.position-1])] = plain_int(
+ result)
def _setup_return_value_r(self, result):
assert lltype.typeOf(result) == llmemory.GCREF
self.registers_r[ord(self.jitcode.code[self.position-1])] = result
diff --git a/rpython/rlib/test/test_rawrefcount.py
b/rpython/rlib/test/test_rawrefcount.py
--- a/rpython/rlib/test/test_rawrefcount.py
+++ b/rpython/rlib/test/test_rawrefcount.py
@@ -1,7 +1,7 @@
import weakref
from rpython.rlib import rawrefcount, objectmodel, rgc
from rpython.rlib.rawrefcount import REFCNT_FROM_PYPY, REFCNT_FROM_PYPY_LIGHT
-from rpython.rtyper.lltypesystem import lltype, llmemory
+from rpython.rtyper.lltypesystem import lltype
from rpython.rtyper.annlowlevel import llhelper
from rpython.translator.c.test.test_standalone import StandaloneTests
from rpython.config.translationoption import get_combined_translation_config
@@ -286,55 +286,3 @@
t, cbuilder = self.compile(entry_point)
data = cbuilder.cmdexec('hi there')
assert data.startswith('OK!\n')
-
-
-class TestBoehmTranslated(StandaloneTests):
-
- def test_full_translation(self):
-
- def make_ob():
- p = W_Root(42)
- ob = lltype.malloc(PyObjectS, flavor='raw', zero=True)
- rawrefcount.create_link_pypy(p, ob)
- ob.c_ob_refcnt += REFCNT_FROM_PYPY
- assert rawrefcount.from_obj(PyObject, p) == ob
- assert rawrefcount.to_obj(W_Root, ob) == p
- return ob
-
- prebuilt_p = W_Root(-42)
- prebuilt_ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
- immortal=True)
-
- def entry_point(argv):
- rawrefcount.create_link_pypy(prebuilt_p, prebuilt_ob)
- prebuilt_ob.c_ob_refcnt += REFCNT_FROM_PYPY
- oblist = [make_ob() for i in range(50)]
- rgc.collect()
- deadlist = []
- while True:
- ob = rawrefcount.next_dead(PyObject)
- if not ob: break
- if ob.c_ob_refcnt != 1:
- print "next_dead().ob_refcnt != 1"
- return 1
- deadlist.append(ob)
- if len(deadlist) == 0:
- print "no dead object"
- return 1
- if len(deadlist) < 30:
- print "not enough dead objects"
- return 1
- for ob in deadlist:
- if ob not in oblist:
- print "unexpected value for dead pointer"
- return 1
- oblist.remove(ob)
- print "OK!"
- lltype.free(ob, flavor='raw')
- return 0
-
- self.config = get_combined_translation_config(translating=True)
- self.config.translation.gc = "boehm"
- t, cbuilder = self.compile(entry_point)
- data = cbuilder.cmdexec('hi there')
- assert data.startswith('OK!\n')
diff --git a/rpython/rlib/test/test_rawrefcount_boehm.py
b/rpython/rlib/test/test_rawrefcount_boehm.py
--- a/rpython/rlib/test/test_rawrefcount_boehm.py
+++ b/rpython/rlib/test/test_rawrefcount_boehm.py
@@ -1,19 +1,34 @@
import itertools, os, subprocess, py
from hypothesis import given, strategies
from rpython.tool.udir import udir
+from rpython.rlib import rawrefcount, rgc
+from rpython.rlib.rawrefcount import REFCNT_FROM_PYPY
+from rpython.rlib.test.test_rawrefcount import W_Root, PyObject, PyObjectS
+from rpython.rtyper.lltypesystem import lltype
+from rpython.translator.c.test.test_standalone import StandaloneTests
+from rpython.config.translationoption import get_combined_translation_config
+def compile_test(basename):
+ srcdir = os.path.dirname(os.path.dirname(
+ os.path.abspath(os.path.join(__file__))))
+ srcdir = os.path.join(srcdir, 'src')
+
+ err = os.system("cd '%s' && gcc -Werror -lgc -I%s -o %s %s.c"
+ % (udir, srcdir, basename, basename))
+ return err
+
def setup_module():
filename = str(udir.join("test-rawrefcount-boehm-check.c"))
with open(filename, "w") as f:
print >> f, '#include "gc/gc_mark.h"'
- print >> f, 'void *testing(void) {'
- print >> f, ' return &GC_set_start_callback;'
+ print >> f, '#include <stdio.h>'
+ print >> f, 'int main(void) {'
+ print >> f, ' printf("%p", &GC_set_start_callback);'
+ print >> f, ' return 0;'
print >> f, '}'
- err = os.system("cd '%s' && gcc -c test-rawrefcount-boehm-check.c"
- % (udir,))
- if err != 0:
+ if compile_test("test-rawrefcount-boehm-check") != 0:
py.test.skip("Boehm GC not installed or too old version")
@@ -180,13 +195,9 @@
print >> f, code
print >> f, '}'
- srcdir = os.path.dirname(os.path.dirname(
- os.path.abspath(os.path.join(__file__))))
- srcdir = os.path.join(srcdir, 'src')
-
- err = os.system("cd '%s' && gcc -Werror -lgc -I%s -o
test-rawrefcount-boehm"
- " test-rawrefcount-boehm.c" % (udir, srcdir))
- assert err == 0
+ err = compile_test("test-rawrefcount-boehm")
+ if err != 0:
+ raise OSError("gcc failed")
p = subprocess.Popen("./test-rawrefcount-boehm", stdout=subprocess.PIPE,
cwd=str(udir))
stdout, _ = p.communicate()
@@ -243,3 +254,55 @@
del links_p2g[p]
else:
assert False, repr(line)
+
+
+class TestBoehmTranslated(StandaloneTests):
+
+ def test_full_translation(self):
+
+ def make_ob():
+ p = W_Root(42)
+ ob = lltype.malloc(PyObjectS, flavor='raw', zero=True)
+ rawrefcount.create_link_pypy(p, ob)
+ ob.c_ob_refcnt += REFCNT_FROM_PYPY
+ assert rawrefcount.from_obj(PyObject, p) == ob
+ assert rawrefcount.to_obj(W_Root, ob) == p
+ return ob
+
+ prebuilt_p = W_Root(-42)
+ prebuilt_ob = lltype.malloc(PyObjectS, flavor='raw', zero=True,
+ immortal=True)
+
+ def entry_point(argv):
+ rawrefcount.create_link_pypy(prebuilt_p, prebuilt_ob)
+ prebuilt_ob.c_ob_refcnt += REFCNT_FROM_PYPY
+ oblist = [make_ob() for i in range(50)]
+ rgc.collect()
+ deadlist = []
+ while True:
+ ob = rawrefcount.next_dead(PyObject)
+ if not ob: break
+ if ob.c_ob_refcnt != 1:
+ print "next_dead().ob_refcnt != 1"
+ return 1
+ deadlist.append(ob)
+ if len(deadlist) == 0:
+ print "no dead object"
+ return 1
+ if len(deadlist) < 30:
+ print "not enough dead objects"
+ return 1
+ for ob in deadlist:
+ if ob not in oblist:
+ print "unexpected value for dead pointer"
+ return 1
+ oblist.remove(ob)
+ print "OK!"
+ lltype.free(ob, flavor='raw')
+ return 0
+
+ self.config = get_combined_translation_config(translating=True)
+ self.config.translation.gc = "boehm"
+ t, cbuilder = self.compile(entry_point)
+ data = cbuilder.cmdexec('hi there')
+ assert data.startswith('OK!\n')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit