Author: Daniel Roberts <[email protected]>
Branch:
Changeset: r45296:afde3d9955e7
Date: 2011-07-02 20:30 -0700
http://bitbucket.org/pypy/pypy/changeset/afde3d9955e7/
Log: Merge heads.
diff --git a/pypy/interpreter/test/test_typedef.py
b/pypy/interpreter/test/test_typedef.py
--- a/pypy/interpreter/test/test_typedef.py
+++ b/pypy/interpreter/test/test_typedef.py
@@ -203,3 +203,16 @@
lst = seen[:]
assert lst == [5, 10, 2]
raises(OSError, os.lseek, fd, 7, 0)
+
+ def test_method_attrs(self):
+ class A(object):
+ def m(self):
+ "aaa"
+ m.x = 3
+
+ bm = A().m
+ assert bm.__func__ is bm.im_func
+ assert bm.__self__ is bm.im_self
+ assert bm.__doc__ == "aaa"
+ assert bm.x == 3
+ raises(AttributeError, setattr, bm, 'x', 15)
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -761,12 +761,15 @@
)
Function.typedef.acceptable_as_base_class = False
-Method.typedef = TypeDef("method",
+Method.typedef = TypeDef(
+ "method",
__new__ = interp2app(Method.descr_method__new__.im_func),
__call__ = interp2app(Method.descr_method_call),
__get__ = interp2app(Method.descr_method_get),
im_func = interp_attrproperty_w('w_function', cls=Method),
+ __func__ = interp_attrproperty_w('w_function', cls=Method),
im_self = interp_attrproperty_w('w_instance', cls=Method),
+ __self__ = interp_attrproperty_w('w_instance', cls=Method),
im_class = interp_attrproperty_w('w_class', cls=Method),
__getattribute__ = interp2app(Method.descr_method_getattribute),
__eq__ = interp2app(Method.descr_method_eq),
diff --git a/pypy/jit/backend/x86/assembler.py
b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -703,22 +703,28 @@
# we need to put two words into the shadowstack: the MARKER
# and the address of the frame (ebp, actually)
rst = gcrootmap.get_root_stack_top_addr()
- assert rx86.fits_in_32bits(rst)
- if IS_X86_64:
- # cannot use rdx here, it's used to pass arguments!
- tmp = X86_64_SCRATCH_REG
+ if rx86.fits_in_32bits(rst):
+ self.mc.MOV_rj(eax.value, rst) # MOV eax, [rootstacktop]
else:
- tmp = edx
- self.mc.MOV_rj(eax.value, rst) # MOV eax, [rootstacktop]
- self.mc.LEA_rm(tmp.value, (eax.value, 2*WORD)) # LEA edx, [eax+2*WORD]
+ self.mc.MOV_ri(r13.value, rst) # MOV r13, rootstacktop
+ self.mc.MOV_rm(eax.value, (r13.value, 0)) # MOV eax, [r13]
+ #
+ self.mc.LEA_rm(ebx.value, (eax.value, 2*WORD)) # LEA ebx, [eax+2*WORD]
self.mc.MOV_mi((eax.value, 0), gcrootmap.MARKER) # MOV [eax], MARKER
self.mc.MOV_mr((eax.value, WORD), ebp.value) # MOV [eax+WORD], ebp
- self.mc.MOV_jr(rst, tmp.value) # MOV [rootstacktop], edx
+ #
+ if rx86.fits_in_32bits(rst):
+ self.mc.MOV_jr(rst, ebx.value) # MOV [rootstacktop], ebx
+ else:
+ self.mc.MOV_mr((r13.value, 0), ebx.value) # MOV [r13], ebx
def _call_footer_shadowstack(self, gcrootmap):
rst = gcrootmap.get_root_stack_top_addr()
- assert rx86.fits_in_32bits(rst)
- self.mc.SUB_ji8(rst, 2*WORD) # SUB [rootstacktop], 2*WORD
+ if rx86.fits_in_32bits(rst):
+ self.mc.SUB_ji8(rst, 2*WORD) # SUB [rootstacktop], 2*WORD
+ else:
+ self.mc.MOV_ri(ebx.value, rst) # MOV ebx, rootstacktop
+ self.mc.SUB_mi8((ebx.value, 0), 2*WORD) # SUB [ebx], 2*WORD
def _assemble_bootstrap_direct_call(self, arglocs, jmppos, stackdepth):
if IS_X86_64:
diff --git a/pypy/jit/backend/x86/regloc.py b/pypy/jit/backend/x86/regloc.py
--- a/pypy/jit/backend/x86/regloc.py
+++ b/pypy/jit/backend/x86/regloc.py
@@ -318,7 +318,9 @@
# must be careful not to combine it with location types that
# might need to use the scratch register themselves.
if loc2 is X86_64_SCRATCH_REG:
- assert code1 != 'j'
+ if code1 == 'j':
+ assert (name.startswith("MOV") and
+ rx86.fits_in_32bits(loc1.value_j()))
if loc1 is X86_64_SCRATCH_REG and not name.startswith("MOV"):
assert code2 not in ('j', 'i')
diff --git a/pypy/jit/backend/x86/rx86.py b/pypy/jit/backend/x86/rx86.py
--- a/pypy/jit/backend/x86/rx86.py
+++ b/pypy/jit/backend/x86/rx86.py
@@ -283,7 +283,7 @@
# with immediate(argnum)).
def encode_abs(mc, _1, _2, orbyte):
- # expands to either '\x05' on 32-bit, or '\x04\x25' or 64-bit
+ # expands to either '\x05' on 32-bit, or '\x04\x25' on 64-bit
if mc.WORD == 8:
mc.writechar(chr(0x04 | orbyte))
mc.writechar(chr(0x25))
@@ -370,6 +370,8 @@
INSN_rj = insn(rex_w, chr(base+3), register(1,8), abs_, immediate(2))
INSN_ji8 = insn(rex_w, '\x83', orbyte(base), abs_, immediate(1),
immediate(2,'b'))
+ INSN_mi8 = insn(rex_w, '\x83', orbyte(base), mem_reg_plus_const(1),
+ immediate(2,'b'))
INSN_bi8 = insn(rex_w, '\x83', orbyte(base), stack_bp(1), immediate(2,'b'))
INSN_bi32= insn(rex_w, '\x81', orbyte(base), stack_bp(1), immediate(2))
@@ -388,7 +390,7 @@
INSN_bi._always_inline_ = True # try to constant-fold single_byte()
return (INSN_ri, INSN_rr, INSN_rb, INSN_bi, INSN_br, INSN_rm, INSN_rj,
- INSN_ji8)
+ INSN_ji8, INSN_mi8)
def select_8_or_32_bit_immed(insn_8, insn_32):
def INSN(*args):
@@ -467,13 +469,13 @@
# ------------------------------ Arithmetic ------------------------------
- ADD_ri, ADD_rr, ADD_rb, _, _, ADD_rm, ADD_rj, _ = common_modes(0)
- OR_ri, OR_rr, OR_rb, _, _, OR_rm, OR_rj, _ = common_modes(1)
- AND_ri, AND_rr, AND_rb, _, _, AND_rm, AND_rj, _ = common_modes(4)
- SUB_ri, SUB_rr, SUB_rb, _, _, SUB_rm, SUB_rj, SUB_ji8 = common_modes(5)
- SBB_ri, SBB_rr, SBB_rb, _, _, SBB_rm, SBB_rj, _ = common_modes(3)
- XOR_ri, XOR_rr, XOR_rb, _, _, XOR_rm, XOR_rj, _ = common_modes(6)
- CMP_ri, CMP_rr, CMP_rb, CMP_bi, CMP_br, CMP_rm, CMP_rj, _ = common_modes(7)
+ ADD_ri,ADD_rr,ADD_rb,_,_,ADD_rm,ADD_rj,_,_ = common_modes(0)
+ OR_ri, OR_rr, OR_rb, _,_,OR_rm, OR_rj, _,_ = common_modes(1)
+ AND_ri,AND_rr,AND_rb,_,_,AND_rm,AND_rj,_,_ = common_modes(4)
+ SUB_ri,SUB_rr,SUB_rb,_,_,SUB_rm,SUB_rj,SUB_ji8,SUB_mi8 = common_modes(5)
+ SBB_ri,SBB_rr,SBB_rb,_,_,SBB_rm,SBB_rj,_,_ = common_modes(3)
+ XOR_ri,XOR_rr,XOR_rb,_,_,XOR_rm,XOR_rj,_,_ = common_modes(6)
+ CMP_ri,CMP_rr,CMP_rb,CMP_bi,CMP_br,CMP_rm,CMP_rj,_,_ = common_modes(7)
CMP_mi8 = insn(rex_w, '\x83', orbyte(7<<3), mem_reg_plus_const(1),
immediate(2, 'b'))
CMP_mi32 = insn(rex_w, '\x81', orbyte(7<<3), mem_reg_plus_const(1),
immediate(2))
diff --git a/pypy/jit/backend/x86/test/test_runner.py
b/pypy/jit/backend/x86/test/test_runner.py
--- a/pypy/jit/backend/x86/test/test_runner.py
+++ b/pypy/jit/backend/x86/test/test_runner.py
@@ -6,6 +6,7 @@
ConstPtr, Box, BoxFloat,
BasicFailDescr)
from pypy.jit.backend.detect_cpu import getcpuclass
from pypy.jit.backend.x86.arch import WORD
+from pypy.jit.backend.x86.rx86 import fits_in_32bits
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.executor import execute
@@ -241,6 +242,23 @@
c = self.execute_operation(rop.GETFIELD_GC, [res], 'int', ofsc3)
assert c.value == 3
+ def test_bug_setfield_64bit(self):
+ if WORD == 4:
+ py.test.skip("only for 64 bits")
+ TP = lltype.GcStruct('S', ('i', lltype.Signed))
+ ofsi = self.cpu.fielddescrof(TP, 'i')
+ for i in range(500):
+ p = lltype.malloc(TP)
+ addr = rffi.cast(lltype.Signed, p)
+ if fits_in_32bits(addr):
+ break # fitting in 32 bits, good
+ else:
+ py.test.skip("cannot get a 32-bit pointer")
+ res = ConstPtr(rffi.cast(llmemory.GCREF, addr))
+ self.execute_operation(rop.SETFIELD_RAW, [res, ConstInt(3**33)],
+ 'void', ofsi)
+ assert p.i == 3**33
+
def test_nullity_with_guard(self):
allops = [rop.INT_IS_TRUE]
guards = [rop.GUARD_TRUE, rop.GUARD_FALSE]
diff --git a/pypy/jit/backend/x86/test/test_rx86.py
b/pypy/jit/backend/x86/test/test_rx86.py
--- a/pypy/jit/backend/x86/test/test_rx86.py
+++ b/pypy/jit/backend/x86/test/test_rx86.py
@@ -185,6 +185,13 @@
cb = CodeBuilder32
assert_encodes_as(cb, 'PUSH_i32', (9,), '\x68\x09\x00\x00\x00')
+def test_sub_ji8():
+ cb = CodeBuilder32
+ assert_encodes_as(cb, 'SUB_ji8', (11223344, 55),
+ '\x83\x2D\x30\x41\xAB\x00\x37')
+ assert_encodes_as(cb, 'SUB_mi8', ((edx, 16), 55),
+ '\x83\x6A\x10\x37')
+
class CodeBuilder64(CodeBuilderMixin, X86_64_CodeBuilder):
pass
diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py
--- a/pypy/jit/metainterp/blackhole.py
+++ b/pypy/jit/metainterp/blackhole.py
@@ -3,7 +3,7 @@
from pypy.rlib.rarithmetic import intmask, LONG_BIT, r_uint, ovfcheck
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib.debug import debug_start, debug_stop
-from pypy.rlib.debug import make_sure_not_resized, fatalerror
+from pypy.rlib.debug import make_sure_not_resized
from pypy.rpython.lltypesystem import lltype, llmemory, rclass
from pypy.rpython.lltypesystem.lloperation import llop
from pypy.rpython.llinterp import LLException
diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py
--- a/pypy/jit/metainterp/history.py
+++ b/pypy/jit/metainterp/history.py
@@ -791,6 +791,7 @@
def dump(self):
self.compiled_loop_token.cpu.dump_loop_token(self)
+
class TreeLoop(object):
inputargs = None
operations = None
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py
b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -1,7 +1,7 @@
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, CONST_1,
CONST_0
from pypy.jit.metainterp.optimizeopt.util import _findall
-from pypy.jit.metainterp.optimizeopt.intutils import IntBound, IntUnbounded, \
- IntLowerBound, IntUpperBound
+from pypy.jit.metainterp.optimizeopt.intutils import (IntBound, IntUnbounded,
+ IntLowerBound, IntUpperBound)
from pypy.jit.metainterp.history import Const, ConstInt
from pypy.jit.metainterp.resoperation import rop, ResOperation
@@ -373,6 +373,15 @@
if v2.intbound.intersect(v1.intbound):
self.propagate_bounds_backward(op.getarg(1))
+ def propagate_bounds_INT_IS_TRUE(self, op):
+ r = self.getvalue(op.result)
+ if r.is_constant():
+ if r.box.same_constant(CONST_1):
+ v1 = self.getvalue(op.getarg(0))
+ if v1.intbound.known_ge(IntBound(0, 0)):
+ v1.intbound.make_gt(IntBound(0, 0))
+ self.propagate_bounds_backward(op.getarg(0))
+
def propagate_bounds_INT_ADD(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
@@ -418,5 +427,6 @@
propagate_bounds_INT_SUB_OVF = propagate_bounds_INT_SUB
propagate_bounds_INT_MUL_OVF = propagate_bounds_INT_MUL
+
optimize_ops = _findall(OptIntBounds, 'optimize_')
propagate_bounds_ops = _findall(OptIntBounds, 'propagate_bounds_')
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -121,6 +121,41 @@
print '\n'.join([str(o) for o in loop.operations])
self.assert_equal(loop, expected)
+ def setup_method(self, meth=None):
+ class FailDescr(compile.ResumeGuardDescr):
+ oparse = None
+ def _oparser_uses_descr_of_guard(self, oparse, fail_args):
+ # typically called 3 times: once when parsing 'ops',
+ # once when parsing 'preamble', once when parsing 'expected'.
+ self.oparse = oparse
+ self.rd_frame_info_list, self.rd_snapshot = snapshot(fail_args)
+ def _clone_if_mutable(self):
+ assert self is fdescr
+ return fdescr2
+ def __repr__(self):
+ if self is fdescr:
+ return 'fdescr'
+ if self is fdescr2:
+ return 'fdescr2'
+ return compile.ResumeGuardDescr.__repr__(self)
+ #
+ def snapshot(fail_args, got=[]):
+ if not got: # only the first time, i.e. when parsing 'ops'
+ rd_frame_info_list = resume.FrameInfo(None, "code", 11)
+ rd_snapshot = resume.Snapshot(None, fail_args)
+ got.append(rd_frame_info_list)
+ got.append(rd_snapshot)
+ return got
+ #
+ fdescr = instantiate(FailDescr)
+ self.namespace['fdescr'] = fdescr
+ fdescr2 = instantiate(FailDescr)
+ self.namespace['fdescr2'] = fdescr2
+
+ def teardown_method(self, meth):
+ self.namespace.pop('fdescr', None)
+ self.namespace.pop('fdescr2', None)
+
class BaseTestOptimizeBasic(BaseTestBasic):
@@ -1875,7 +1910,6 @@
self.optimize_loop(ops, expected)
def test_merge_guard_nonnull_guard_class(self):
- self.make_fail_descr()
ops = """
[p1, i0, i1, i2, p2]
guard_nonnull(p1, descr=fdescr) [i0]
@@ -1893,7 +1927,6 @@
self.check_expanded_fail_descr("i0", rop.GUARD_NONNULL_CLASS)
def test_merge_guard_nonnull_guard_value(self):
- self.make_fail_descr()
ops = """
[p1, i0, i1, i2, p2]
guard_nonnull(p1, descr=fdescr) [i0]
@@ -1911,7 +1944,6 @@
self.check_expanded_fail_descr("i0", rop.GUARD_VALUE)
def test_merge_guard_nonnull_guard_class_guard_value(self):
- self.make_fail_descr()
ops = """
[p1, i0, i1, i2, p2]
guard_nonnull(p1, descr=fdescr) [i0]
@@ -2204,23 +2236,6 @@
# ----------
- def make_fail_descr(self):
- class FailDescr(compile.ResumeGuardDescr):
- oparse = None
- def _oparser_uses_descr_of_guard(self, oparse, fail_args):
- # typically called twice, before and after optimization
- if self.oparse is None:
- fdescr.rd_frame_info_list = resume.FrameInfo(None,
- "code", 11)
- fdescr.rd_snapshot = resume.Snapshot(None, fail_args)
- self.oparse = oparse
- #
- fdescr = instantiate(FailDescr)
- self.namespace['fdescr'] = fdescr
-
- def teardown_method(self, meth):
- self.namespace.pop('fdescr', None)
-
def _verify_fail_args(self, boxes, oparse, text):
import re
r = re.compile(r"\bwhere\s+(\w+)\s+is a\s+(\w+)")
@@ -2329,7 +2344,6 @@
self._verify_fail_args(boxes, fdescr.oparse, expectedtext)
def test_expand_fail_1(self):
- self.make_fail_descr()
ops = """
[i1, i3]
# first rename i3 into i4
@@ -2350,7 +2364,6 @@
self.check_expanded_fail_descr('15, i3', rop.GUARD_TRUE)
def test_expand_fail_2(self):
- self.make_fail_descr()
ops = """
[i1, i2]
p1 = new_with_vtable(ConstClass(node_vtable))
@@ -2370,7 +2383,6 @@
''', rop.GUARD_TRUE)
def test_expand_fail_3(self):
- self.make_fail_descr()
ops = """
[i1, i2, i3, p3]
p1 = new_with_vtable(ConstClass(node_vtable))
@@ -2396,7 +2408,7 @@
def test_expand_fail_4(self):
for arg in ['p1', 'i2,p1', 'p1,p2', 'p2,p1',
'i2,p1,p2', 'i2,p2,p1']:
- self.make_fail_descr()
+ self.setup_method() # humpf
ops = """
[i1, i2, i3]
p1 = new_with_vtable(ConstClass(node_vtable))
@@ -2421,7 +2433,6 @@
rop.GUARD_TRUE)
def test_expand_fail_5(self):
- self.make_fail_descr()
ops = """
[i1, i2, i3, i4]
p1 = new_with_vtable(ConstClass(node_vtable))
@@ -2445,7 +2456,6 @@
''', rop.GUARD_TRUE)
def test_expand_fail_6(self):
- self.make_fail_descr()
ops = """
[p0, i0, i1]
guard_true(i0, descr=fdescr) [p0]
@@ -2466,7 +2476,6 @@
''', rop.GUARD_TRUE)
def test_expand_fail_varray(self):
- self.make_fail_descr()
ops = """
[i1]
p1 = new_array(3, descr=arraydescr)
@@ -2487,7 +2496,6 @@
''', rop.GUARD_TRUE)
def test_expand_fail_vstruct(self):
- self.make_fail_descr()
ops = """
[i1, p1]
p2 = new(descr=ssize)
@@ -2509,7 +2517,6 @@
''', rop.GUARD_TRUE)
def test_expand_fail_v_all_1(self):
- self.make_fail_descr()
ops = """
[i1, p1a, i2]
p6s = getarrayitem_gc(p1a, 0, descr=arraydescr2)
@@ -2551,7 +2558,6 @@
''', rop.GUARD_TRUE)
def test_expand_fail_lazy_setfield_1(self):
- self.make_fail_descr()
ops = """
[p1, i2, i3]
p2 = new_with_vtable(ConstClass(node_vtable))
@@ -2577,7 +2583,6 @@
''', rop.GUARD_TRUE)
def test_expand_fail_lazy_setfield_2(self):
- self.make_fail_descr()
ops = """
[i2, i3]
p2 = new_with_vtable(ConstClass(node_vtable))
@@ -2601,9 +2606,6 @@
where p2 is a node_vtable, valuedescr=i2
''', rop.GUARD_TRUE)
-
-class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
-
def test_residual_call_does_not_invalidate_caches(self):
ops = """
[p1, p2]
@@ -2895,7 +2897,6 @@
self.optimize_loop(ops, expected)
def test_vref_virtual_2(self):
- self.make_fail_descr()
ops = """
[p0, i1]
#
@@ -2941,7 +2942,6 @@
''', rop.GUARD_NOT_FORCED)
def test_vref_virtual_and_lazy_setfield(self):
- self.make_fail_descr()
ops = """
[p0, i1]
#
@@ -2980,7 +2980,6 @@
''', rop.GUARD_NO_EXCEPTION)
def test_vref_virtual_after_finish(self):
- self.make_fail_descr()
ops = """
[i1]
p1 = new_with_vtable(ConstClass(node_vtable))
@@ -3007,7 +3006,6 @@
self.optimize_loop(ops, expected)
def test_vref_nonvirtual_and_lazy_setfield(self):
- self.make_fail_descr()
ops = """
[i1, p1]
p2 = virtual_ref(p1, 23)
@@ -4499,6 +4497,29 @@
"""
self.optimize_loop(ops, expected)
+ def test_int_is_true_bounds(self):
+ ops = """
+ [p0]
+ i0 = strlen(p0)
+ i1 = int_is_true(i0)
+ guard_true(i1) []
+ i2 = int_ge(0, i0)
+ guard_false(i2) []
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ i0 = strlen(p0)
+ i1 = int_is_true(i0)
+ guard_true(i1) []
+ jump(p0)
+ """
+ self.optimize_loop(ops, expected)
+
+
+class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
+ pass
+
##class TestOOtype(BaseTestOptimizeBasic, OOtypeMixin):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -2742,8 +2742,6 @@
# ----------
-class TestLLtype(OptimizeOptTest, LLtypeMixin):
-
def test_residual_call_does_not_invalidate_caches(self):
ops = """
[p1, p2]
@@ -5899,3 +5897,6 @@
jump(i0, i1)
"""
self.optimize_loop(ops, expected)
+
+class TestLLtype(OptimizeOptTest, LLtypeMixin):
+ pass
diff --git a/pypy/jit/tool/pypytrace-mode.el b/pypy/jit/tool/pypytrace-mode.el
--- a/pypy/jit/tool/pypytrace-mode.el
+++ b/pypy/jit/tool/pypytrace-mode.el
@@ -32,7 +32,7 @@
("<.*FieldDescr \\([^ ]*\\)" (1 'font-lock-variable-name-face))
;; comment out debug_merge_point, but then highlight specific part of it
("^debug_merge_point.*" . font-lock-comment-face)
- ("^\\(debug_merge_point\\).*code object\\(.*\\), file \\('.*'\\), \\(line
.*\\)> \\(.*\\)"
+ ("^\\(debug_merge_point\\).*code object\\(.*\\). file \\('.*'\\). \\(line
.*\\)> \\(.*\\)"
(1 'compilation-warning t)
(2 'escape-glyph t)
(3 'font-lock-string-face t)
diff --git a/pypy/module/_ssl/interp_ssl.py b/pypy/module/_ssl/interp_ssl.py
--- a/pypy/module/_ssl/interp_ssl.py
+++ b/pypy/module/_ssl/interp_ssl.py
@@ -900,7 +900,7 @@
def _ssl_thread_id_function():
from pypy.module.thread import ll_thread
- return rffi.cast(rffi.INT, ll_thread.get_ident())
+ return rffi.cast(rffi.LONG, ll_thread.get_ident())
def setup_ssl_threads():
from pypy.module.thread import ll_thread
diff --git a/pypy/module/pypyjit/test_pypy_c/test_00_model.py
b/pypy/module/pypyjit/test_pypy_c/test_00_model.py
--- a/pypy/module/pypyjit/test_pypy_c/test_00_model.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_00_model.py
@@ -58,6 +58,8 @@
stdout, stderr = pipe.communicate()
if stderr.startswith('SKIP:'):
py.test.skip(stderr)
+ if stderr.startswith('debug_alloc.h:'): # lldebug builds
+ stderr = ''
assert not stderr
#
# parse the JIT log
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
@@ -46,7 +46,7 @@
guard_no_overflow(descr=<Guard4>)
i18 = int_add(i7, 1)
--TICK--
- jump(p0, p1, p2, p3, p4, p5, p6, i18, i16, i9, i10, descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, p5, i18, i16, p8, i9, i10, descr=<Loop0>)
""")
def test_array_intimg(self):
@@ -83,7 +83,7 @@
setarrayitem_raw(i11, i8, _, descr=<.*ArrayNoLengthDescr>)
i28 = int_add(i8, 1)
--TICK--
- jump(p0, p1, p2, p3, p4, p5, p6, p7, i28, i15, i10, i11,
descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, p5, p6, i28, i15, p9, i10, i11,
descr=<Loop0>)
""")
diff --git a/pypy/module/pypyjit/test_pypy_c/test_call.py
b/pypy/module/pypyjit/test_pypy_c/test_call.py
--- a/pypy/module/pypyjit/test_pypy_c/test_call.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_call.py
@@ -187,7 +187,7 @@
guard_no_overflow(descr=<Guard5>)
i18 = force_token()
--TICK--
- jump(p0, p1, p2, p3, p4, p5, i8, p7, i17, i9, p10, p11, p12,
descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, i8, p7, i17, p8, i9, p10, p11, p12,
descr=<Loop0>)
""")
def test_default_and_kw(self):
diff --git a/pypy/module/pypyjit/test_pypy_c/test_intbound.py
b/pypy/module/pypyjit/test_pypy_c/test_intbound.py
--- a/pypy/module/pypyjit/test_pypy_c/test_intbound.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_intbound.py
@@ -97,7 +97,7 @@
guard_no_overflow(descr=...)
i17 = int_add(i8, 1)
--TICK--
- jump(p0, p1, p2, p3, p4, p5, i14, i12, i17, i9, descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, i14, i12, i17, p8, i9, descr=<Loop0>)
""")
def test_intbound_sub_lt(self):
@@ -149,7 +149,7 @@
guard_no_overflow(descr=...)
i19 = int_add(i8, 1)
--TICK--
- jump(p0, p1, p2, p3, p4, p5, i16, i14, i19, i9, descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, i16, i14, i19, p8, i9, descr=<Loop0>)
""")
def test_intbound_addmul_ge(self):
@@ -177,7 +177,7 @@
guard_no_overflow(descr=...)
i21 = int_add(i8, 1)
--TICK--
- jump(p0, p1, p2, p3, p4, p5, i18, i14, i21, descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, i18, i14, i21, p8, descr=<Loop0>)
""")
def test_intbound_eq(self):
@@ -209,7 +209,7 @@
guard_no_overflow(descr=...)
i16 = int_add(i8, 1)
--TICK--
- jump(p0, p1, p2, p3, p4, p5, p6, i14, i16, descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, p6, i14, i16, p8, descr=<Loop0>)
""")
def test_intbound_mul(self):
diff --git a/pypy/module/pypyjit/test_pypy_c/test_misc.py
b/pypy/module/pypyjit/test_pypy_c/test_misc.py
--- a/pypy/module/pypyjit/test_pypy_c/test_misc.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_misc.py
@@ -167,7 +167,7 @@
guard_false(i16, descr=<Guard3>)
p17 = getarrayitem_gc(p15, i12, descr=<GcPtrArrayDescr>)
i19 = int_add(i12, 1)
- setfield_gc(p4, i19, descr=<SignedFieldDescr
.*W_AbstractSeqIterObject.inst_index .*>)
+ setfield_gc(p9, i19, descr=<SignedFieldDescr
.*W_AbstractSeqIterObject.inst_index .*>)
guard_nonnull_class(p17, 146982464, descr=<Guard4>)
i21 = getfield_gc(p17, descr=<SignedFieldDescr
.*W_ArrayTypei.inst_len .*>)
i23 = int_lt(0, i21)
@@ -179,7 +179,7 @@
i28 = int_add_ovf(i10, i25)
guard_no_overflow(descr=<Guard7>)
--TICK--
- jump(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, i28, i25, i19, i13,
p14, p15, descr=<Loop0>)
+ jump(p0, p1, p2, p3, p4, p5, p6, i28, i25, p9, p10, p11, i19, i13,
p14, p15, descr=<Loop0>)
""")
diff --git a/pypy/rlib/ropenssl.py b/pypy/rlib/ropenssl.py
--- a/pypy/rlib/ropenssl.py
+++ b/pypy/rlib/ropenssl.py
@@ -151,7 +151,7 @@
[rffi.INT, rffi.INT, rffi.CCHARP, rffi.INT], lltype.Void))],
lltype.Void)
ssl_external('CRYPTO_set_id_callback',
- [lltype.Ptr(lltype.FuncType([], rffi.INT))],
+ [lltype.Ptr(lltype.FuncType([], rffi.LONG))],
lltype.Void)
if HAVE_OPENSSL_RAND:
diff --git a/pypy/rlib/rsdl/RMix.py b/pypy/rlib/rsdl/RMix.py
--- a/pypy/rlib/rsdl/RMix.py
+++ b/pypy/rlib/rsdl/RMix.py
@@ -52,7 +52,8 @@
ChunkPtr)
def LoadWAV(filename_ccharp):
- return LoadWAV_RW(RSDL.RWFromFile(filename_ccharp, rffi.str2charp('rb')),
1)
+ with rffi.scoped_str2charp('rb') as mode:
+ return LoadWAV_RW(RSDL.RWFromFile(filename_ccharp, mode), 1)
PlayChannelTimed = external('Mix_PlayChannelTimed',
@@ -64,4 +65,4 @@
"""Returns zero if the channel is not playing.
Otherwise if you passed in -1, the number of channels playing is returned"""
-ChannelPlaying = external('Mix_Playing', [ rffi.INT])
\ No newline at end of file
+ChannelPlaying = external('Mix_Playing', [rffi.INT], rffi.INT)
diff --git a/pypy/rpython/lltypesystem/ll2ctypes.py
b/pypy/rpython/lltypesystem/ll2ctypes.py
--- a/pypy/rpython/lltypesystem/ll2ctypes.py
+++ b/pypy/rpython/lltypesystem/ll2ctypes.py
@@ -37,7 +37,9 @@
if far_regions:
import random
pieces = far_regions._ll2ctypes_pieces
- num = random.randrange(len(pieces))
+ num = random.randrange(len(pieces)+1)
+ if num == len(pieces):
+ return ctype()
i1, stop = pieces[num]
i2 = i1 + ((ctypes.sizeof(ctype) or 1) + 7) & ~7
if i2 > stop:
diff --git a/pypy/rpython/memory/gc/minimark.py
b/pypy/rpython/memory/gc/minimark.py
--- a/pypy/rpython/memory/gc/minimark.py
+++ b/pypy/rpython/memory/gc/minimark.py
@@ -1107,8 +1107,11 @@
return True
# ^^^ a fast path of write-barrier
#
- if (source_hdr.tid & GCFLAG_NO_YOUNG_PTRS == 0 or
- source_hdr.tid & GCFLAG_CARDS_SET != 0):
+ if source_hdr.tid & GCFLAG_CARDS_SET != 0:
+ # there might be young objects, let ll_arraycopy find them
+ return False
+ #
+ if source_hdr.tid & GCFLAG_NO_YOUNG_PTRS == 0:
# there might be in source a pointer to a young object
self.old_objects_pointing_to_young.append(dest_addr)
dest_hdr.tid &= ~GCFLAG_NO_YOUNG_PTRS
diff --git a/pypy/rpython/memory/gc/test/test_direct.py
b/pypy/rpython/memory/gc/test/test_direct.py
--- a/pypy/rpython/memory/gc/test/test_direct.py
+++ b/pypy/rpython/memory/gc/test/test_direct.py
@@ -522,5 +522,44 @@
self.stackroots.pop()
test_card_marker.GC_PARAMS = {"card_page_indices": 4}
+ def test_writebarrier_before_copy(self):
+ from pypy.rpython.memory.gc import minimark
+ largeobj_size = self.gc.nonlarge_max + 1
+ p_src = self.malloc(VAR, largeobj_size)
+ p_dst = self.malloc(VAR, largeobj_size)
+ # make them old
+ self.stackroots.append(p_src)
+ self.stackroots.append(p_dst)
+ self.gc.collect()
+ p_dst = self.stackroots.pop()
+ p_src = self.stackroots.pop()
+ #
+ addr_src = llmemory.cast_ptr_to_adr(p_src)
+ addr_dst = llmemory.cast_ptr_to_adr(p_dst)
+ hdr_src = self.gc.header(addr_src)
+ hdr_dst = self.gc.header(addr_dst)
+ #
+ assert hdr_src.tid & minimark.GCFLAG_NO_YOUNG_PTRS
+ assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS
+ #
+ res = self.gc.writebarrier_before_copy(addr_src, addr_dst)
+ assert res
+ assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS
+ #
+ hdr_src.tid &= ~minimark.GCFLAG_NO_YOUNG_PTRS # pretend we have young
ptrs
+ res = self.gc.writebarrier_before_copy(addr_src, addr_dst)
+ assert res # we optimized it
+ assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS == 0 # and we
copied the flag
+ #
+ # in this case, we have cards, so GCFLAG_NO_YOUNG_PTRS is set (because
+ # cards takes precedence over it)
+ hdr_src.tid |= minimark.GCFLAG_NO_YOUNG_PTRS
+ hdr_dst.tid |= minimark.GCFLAG_NO_YOUNG_PTRS
+ hdr_src.tid |= minimark.GCFLAG_CARDS_SET
+ res = self.gc.writebarrier_before_copy(addr_src, addr_dst)
+ assert not res # there might be young ptrs, let ll_arraycopy to find
them
+ assert hdr_dst.tid & minimark.GCFLAG_NO_YOUNG_PTRS
+
+
class TestMiniMarkGCFull(DirectGCTest):
from pypy.rpython.memory.gc.minimark import MiniMarkGC as GCClass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit