[pypy-commit] pypy py3.5: hg merge default
arigo
pypy.commits at gmail.com
Wed Nov 9 10:50:56 EST 2016
Author: Armin Rigo <arigo at tunes.org>
Branch: py3.5
Changeset: r88272:5980a1419dc2
Date: 2016-11-09 15:04 +0100
http://bitbucket.org/pypy/pypy/changeset/5980a1419dc2/
Log: hg merge default
diff --git a/pypy/goal/targetpypystandalone.py b/pypy/goal/targetpypystandalone.py
--- a/pypy/goal/targetpypystandalone.py
+++ b/pypy/goal/targetpypystandalone.py
@@ -34,7 +34,12 @@
if w_dict is not None: # for tests
w_entry_point = space.getitem(w_dict, space.wrap('entry_point'))
w_run_toplevel = space.getitem(w_dict, space.wrap('run_toplevel'))
+ w_initstdio = space.getitem(w_dict, space.wrap('initstdio'))
withjit = space.config.objspace.usemodules.pypyjit
+ else:
+ w_initstdio = space.appexec([], """():
+ return lambda unbuffered: None
+ """)
def entry_point(argv):
if withjit:
@@ -110,18 +115,23 @@
" not found in %s or in any parent directory" % home1)
return rffi.cast(rffi.INT, 1)
space.startup()
- space.appexec([w_path], """(path):
- import sys
- sys.path[:] = path
- """)
- # import site
+ must_leave = space.threadlocals.try_enter_thread(space)
try:
- space.setattr(space.getbuiltinmodule('sys'),
- space.wrap('executable'),
- space.wrap(home))
- import_ = space.getattr(space.getbuiltinmodule('builtins'),
- space.wrap('__import__'))
- space.call_function(import_, space.wrap('site'))
+ # initialize sys.{path,executable,stdin,stdout,stderr}
+ # (in unbuffered mode, to avoid troubles) and import site
+ space.appexec([w_path, space.wrap(home), w_initstdio],
+ r"""(path, home, initstdio):
+ import sys
+ sys.path[:] = path
+ sys.executable = home
+ initstdio(unbuffered=True)
+ try:
+ import site
+ except Exception as e:
+ sys.stderr.write("'import site' failed:\n")
+ import traceback
+ traceback.print_exc()
+ """)
return rffi.cast(rffi.INT, 0)
except OperationError as e:
if verbose:
@@ -129,6 +139,9 @@
debug(" operror-type: " + e.w_type.getname(space).encode('utf-8'))
debug(" operror-value: " + space.str_w(space.str(e.get_w_value(space))))
return rffi.cast(rffi.INT, -1)
+ finally:
+ if must_leave:
+ space.threadlocals.leave_thread(space)
@entrypoint_highlevel('main', [rffi.CCHARP], c_name='pypy_execute_source')
def pypy_execute_source(ll_source):
diff --git a/pypy/interpreter/test/test_targetpypy.py b/pypy/interpreter/test/test_targetpypy.py
--- a/pypy/interpreter/test/test_targetpypy.py
+++ b/pypy/interpreter/test/test_targetpypy.py
@@ -20,7 +20,7 @@
space.wrap('modules')),
space.wrap('xyz')))
assert x == 3
- lls = rffi.str2charp("sys")
+ lls = rffi.str2charp("sys # should give a NameError")
execute_source(lls)
lltype.free(lls, flavor='raw')
# did not crash - the same globals
diff --git a/pypy/module/_cffi_backend/__init__.py b/pypy/module/_cffi_backend/__init__.py
--- a/pypy/module/_cffi_backend/__init__.py
+++ b/pypy/module/_cffi_backend/__init__.py
@@ -71,7 +71,6 @@
def startup(self, space):
from pypy.module._cffi_backend import embedding
embedding.glob.space = space
- embedding.glob.patched_sys = False
def get_dict_rtld_constants():
diff --git a/pypy/module/_cffi_backend/embedding.py b/pypy/module/_cffi_backend/embedding.py
--- a/pypy/module/_cffi_backend/embedding.py
+++ b/pypy/module/_cffi_backend/embedding.py
@@ -45,25 +45,6 @@
pass
glob = Global()
-def patch_sys(space):
- # Annoying: CPython would just use the C-level std{in,out,err} as
- # configured by the main application, for example in binary mode
- # on Windows or with buffering turned off. We can't easily do the
- # same. Instead, go for the safest bet (but possibly bad for
- # performance) and open sys.std{in,out,err} unbuffered. On
- # Windows I guess binary mode is a better default choice.
- #
- # XXX if needed, we could add support for a flag passed to
- # pypy_init_embedded_cffi_module().
- if not glob.patched_sys:
- space.appexec([], """():
- import os, sys
- sys.stdin = sys.__stdin__ = os.fdopen(0, 'rb', 0)
- sys.stdout = sys.__stdout__ = os.fdopen(1, 'wb', 0)
- sys.stderr = sys.__stderr__ = os.fdopen(2, 'wb', 0)
- """)
- glob.patched_sys = True
-
def pypy_init_embedded_cffi_module(version, init_struct):
# called from __init__.py
@@ -76,7 +57,6 @@
must_leave = False
try:
must_leave = space.threadlocals.try_enter_thread(space)
- patch_sys(space)
load_embedded_cffi_module(space, version, init_struct)
res = 0
except OperationError as operr:
diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -18,7 +18,7 @@
from rpython.rtyper import rclass
from rpython.rlib.clibffi import FFI_DEFAULT_ABI
-from rpython.rlib.rarithmetic import ovfcheck, r_uint, r_ulonglong
+from rpython.rlib.rarithmetic import ovfcheck, r_uint, r_ulonglong, intmask
from rpython.rlib.objectmodel import Symbolic
class LLAsmInfo(object):
@@ -840,6 +840,11 @@
vector_arith_code = """
def bh_vec_{0}_{1}(self, vx, vy, count):
assert len(vx) == len(vy) == count
+ return [intmask(_vx {2} _vy) for _vx,_vy in zip(vx,vy)]
+ """
+ vector_float_arith_code = """
+ def bh_vec_{0}_{1}(self, vx, vy, count):
+ assert len(vx) == len(vy) == count
return [_vx {2} _vy for _vx,_vy in zip(vx,vy)]
"""
exec py.code.Source(vector_arith_code.format('int','add','+')).compile()
@@ -847,11 +852,12 @@
exec py.code.Source(vector_arith_code.format('int','mul','*')).compile()
exec py.code.Source(vector_arith_code.format('int','and','&')).compile()
exec py.code.Source(vector_arith_code.format('int','or','|')).compile()
- exec py.code.Source(vector_arith_code.format('float','add','+')).compile()
- exec py.code.Source(vector_arith_code.format('float','sub','-')).compile()
- exec py.code.Source(vector_arith_code.format('float','mul','*')).compile()
- exec py.code.Source(vector_arith_code.format('float','truediv','/')).compile()
- exec py.code.Source(vector_arith_code.format('float','eq','==')).compile()
+
+ exec py.code.Source(vector_float_arith_code.format('float','add','+')).compile()
+ exec py.code.Source(vector_float_arith_code.format('float','sub','-')).compile()
+ exec py.code.Source(vector_float_arith_code.format('float','mul','*')).compile()
+ exec py.code.Source(vector_float_arith_code.format('float','truediv','/')).compile()
+ exec py.code.Source(vector_float_arith_code.format('float','eq','==')).compile()
def bh_vec_float_neg(self, vx, count):
return [e * -1 for e in vx]
@@ -891,9 +897,6 @@
return [longlong.getfloatstorage(float(longlong.int2singlefloat(v)))
for v in vx]
- a = float(a)
- return longlong.getfloatstorage(a)
-
def bh_vec_cast_float_to_int(self, vx, count):
return [int(x) for x in vx]
@@ -934,27 +937,26 @@
return [heaptracker.int_signext(_vx, ext) for _vx in vx]
def build_load(func):
- def method(self, struct, offset, scale, disp, descr, _count):
+ def load(self, struct, offset, scale, disp, descr, _count):
values = []
count = self.vector_ext.vec_size() // descr.get_item_size_in_bytes()
assert _count == count
assert count > 0
- adr = struct + (offset * scale + disp)
+ adr = support.addr_add_bytes(struct, (offset * scale + disp))
a = support.cast_arg(lltype.Ptr(descr.A), adr)
array = a._obj
for i in range(count):
val = support.cast_result(descr.A.OF, array.getitem(i))
values.append(val)
return values
- return method
+ return load
bh_vec_load_i = build_load(bh_getarrayitem_raw)
bh_vec_load_f = build_load(bh_getarrayitem_raw)
del build_load
def bh_vec_store(self, struct, offset, newvalues, scale, disp, descr, count):
- stride = descr.get_item_size_in_bytes()
- adr = struct + (offset * scale + disp)
+ adr = support.addr_add_bytes(struct, offset * scale + disp)
a = support.cast_arg(lltype.Ptr(descr.A), adr)
array = a._obj
for i,n in enumerate(newvalues):
@@ -1557,7 +1559,7 @@
if opname.startswith('vec_'):
# pre vector op
count = self.current_op.count
- assert count >= 1
+ assert count >= 0
new_args = new_args + (count,)
result = getattr(self.cpu, 'bh_' + opname)(*new_args)
if isinstance(result, list):
diff --git a/rpython/jit/backend/llgraph/support.py b/rpython/jit/backend/llgraph/support.py
--- a/rpython/jit/backend/llgraph/support.py
+++ b/rpython/jit/backend/llgraph/support.py
@@ -156,3 +156,11 @@
call_args.append(n)
assert i == len(args)
return call_args
+
+def addr_add_bytes(addr, ofs):
+ if (isinstance(ofs, int) and
+ getattr(addr.adr.ptr._TYPE.TO, 'OF', None) == lltype.Char):
+ return addr + ofs
+ ptr = rffi.cast(rffi.CCHARP, addr.adr)
+ ptr = lltype.direct_ptradd(ptr, ofs)
+ return cast_to_int(ptr)
diff --git a/rpython/jit/backend/ppc/test/test_form.py b/rpython/jit/backend/ppc/test/test_form.py
--- a/rpython/jit/backend/ppc/test/test_form.py
+++ b/rpython/jit/backend/ppc/test/test_form.py
@@ -1,6 +1,3 @@
-from rpython.jit.backend.ppc.codebuilder import b
-import random
-import sys
from py.test import raises
from rpython.jit.backend.ppc.form import Form, FormException
@@ -28,18 +25,18 @@
w = a.insts[-1].assemble()
return struct.pack('>i', w)
-class TestForm(Form):
+class TForm(Form):
fieldmap = test_fieldmap
class TestForms(object):
def test_bitclash(self):
- raises(FormException, TestForm, 'h', 'hh')
- raises(FormException, TestForm,
+ raises(FormException, TForm, 'h', 'hh')
+ raises(FormException, TForm,
Field('t1', 0, 0), Field('t2', 0, 0))
def test_basic(self):
class T(Assembler):
- i = TestForm('h', 'l')()
+ i = TForm('h', 'l')()
j = i(h=1)
k = i(l=3)
raises(FormException, k, l=0)
@@ -56,7 +53,7 @@
def test_defdesc(self):
class T(Assembler):
- i = TestForm('hh', 'hl', 'lh', 'll')()
+ i = TForm('hh', 'hl', 'lh', 'll')()
i.default(hl=0).default(hh=1)
insts = []
a = T()
diff --git a/rpython/jit/backend/ppc/test/test_ppc.py b/rpython/jit/backend/ppc/test/test_ppc.py
--- a/rpython/jit/backend/ppc/test/test_ppc.py
+++ b/rpython/jit/backend/ppc/test/test_ppc.py
@@ -199,9 +199,9 @@
a.load_imm(r10, call_addr)
elif IS_BIG_ENDIAN:
# load the 3-words descriptor
- a.load_from_addr(r10, call_addr)
- a.load_from_addr(r2, call_addr+WORD)
- a.load_from_addr(r11, call_addr+2*WORD)
+ a.load_from_addr(r10, SCRATCH2, call_addr)
+ a.load_from_addr(r2, SCRATCH2, call_addr+WORD)
+ a.load_from_addr(r11, SCRATCH2, call_addr+2*WORD)
else:
# no descriptor on little-endian, but the ABI says r12 must
# contain the function pointer
@@ -304,7 +304,7 @@
addr = rffi.cast(lltype.Signed, p)
p[0] = rffi.cast(rffi.LONG, 200)
- a.load_from_addr(r3, addr)
+ a.load_from_addr(r3, SCRATCH2, addr)
a.blr()
f = a.get_assembler_function()
assert f() == 200
diff --git a/rpython/jit/backend/ppc/test/test_regalloc_3.py b/rpython/jit/backend/ppc/test/test_regalloc_3.py
--- a/rpython/jit/backend/ppc/test/test_regalloc_3.py
+++ b/rpython/jit/backend/ppc/test/test_regalloc_3.py
@@ -55,7 +55,7 @@
i22 = int_or(i3, i9)
i41 = int_and(i11, -4)
i42 = int_or(i41, 1)
- i23 = int_mod(i12, i42)
+ i23 = int_mul(i12, 0)
i24 = int_is_true(i6)
i25 = uint_rshift(i15, 6)
i26 = int_or(-4, i25)
@@ -63,11 +63,11 @@
i28 = int_sub(-113, i11)
i29 = int_neg(i7)
i30 = int_neg(i24)
- i31 = int_floordiv(i3, 53)
+ i31 = int_mul(i3, 53)
i32 = int_mul(i28, i27)
i43 = int_and(i18, -4)
i44 = int_or(i43, 1)
- i33 = int_mod(i26, i44)
+ i33 = int_mul(i26, i44)
i34 = int_or(i27, i19)
i35 = uint_lt(i13, 1)
i45 = int_and(i21, 31)
@@ -84,7 +84,7 @@
assert cpu.get_int_value(deadframe, 0) == 0
assert cpu.get_int_value(deadframe, 1) == 0
assert cpu.get_int_value(deadframe, 2) == 0
- assert cpu.get_int_value(deadframe, 3) == 0
+ assert cpu.get_int_value(deadframe, 3) == 530
assert cpu.get_int_value(deadframe, 4) == 1
assert cpu.get_int_value(deadframe, 5) == -7
assert cpu.get_int_value(deadframe, 6) == 1
@@ -94,7 +94,7 @@
assert cpu.get_int_value(deadframe, 10) == 1
assert cpu.get_int_value(deadframe, 11) == 18
assert cpu.get_int_value(deadframe, 12) == -1
- assert cpu.get_int_value(deadframe, 13) == 0
+ assert cpu.get_int_value(deadframe, 13) == 1
def test_bug_1():
cpu, deadframe = run([17, -20, -6, 6, 1, 13, 13, 9, 49, 8], '''
@@ -112,7 +112,7 @@
i43 = int_and(i14, 31)
i19 = int_lshift(7, i43)
i20 = int_neg(i19)
- i21 = int_mod(i3, 1)
+ i21 = int_and(i3, 0)
i22 = uint_ge(i15, i1)
i44 = int_and(i16, 31)
i23 = int_lshift(i8, i44)
diff --git a/rpython/jit/backend/ppc/vector_ext.py b/rpython/jit/backend/ppc/vector_ext.py
--- a/rpython/jit/backend/ppc/vector_ext.py
+++ b/rpython/jit/backend/ppc/vector_ext.py
@@ -38,13 +38,10 @@
# if v2 == 0 unpacks index 0 of param 2
# if v2 == 1 unpacks index 1 of param 2
mask = 0
- if IS_BIG_ENDIAN:
- not_implemented("no big endian support (yet)")
- else:
- if v1 == 0: mask |= 0b01
- if v1 == 1: mask |= 0b00
- if v2 == 0: mask |= 0b10
- if v2 == 1: mask |= 0b00
+ if v1 == 0: mask |= 0b01
+ if v1 == 1: mask |= 0b00
+ if v2 == 0: mask |= 0b10
+ if v2 == 1: mask |= 0b00
return mask
@@ -230,26 +227,19 @@
self.mc.stvx(src, r.SCRATCH2.value, r.SP.value)
self.mc.load_imm(r.SCRATCH2, PARAM_SAVE_AREA_OFFSET+16)
self.mc.stvx(res, r.SCRATCH2.value, r.SP.value)
- for i in range(2): # at most 2 operations
- if IS_BIG_ENDIAN:
- srcoff = (i * osize)
- resoff = (i * nsize)
- else:
- if osize == 4:
- srcoff = 8 + (i * osize)
- resoff = (i * nsize)
- else:
- srcoff = (i * osize)
- resoff = 8 + (i * nsize)
- if osize == 8:
- self.mc.load(r.SCRATCH.value, r.SP.value, srcoff + PARAM_SAVE_AREA_OFFSET)
- else:
- self.mc.lwa(r.SCRATCH.value, r.SP.value, srcoff + PARAM_SAVE_AREA_OFFSET)
- if nsize == 8:
- self.mc.store(r.SCRATCH.value, r.SP.value, resoff + PARAM_SAVE_AREA_OFFSET+16)
- else:
- self.mc.stw(r.SCRATCH.value, r.SP.value, resoff + PARAM_SAVE_AREA_OFFSET+16)
-
+ for j in range(2): # at most 2 operations
+ off = PARAM_SAVE_AREA_OFFSET
+ i = j
+ if not IS_BIG_ENDIAN:
+ i = (16 // osize) - 1 - i
+ off += osize * i
+ self._load_from_sp(r.SCRATCH.value, osize, off)
+ off = PARAM_SAVE_AREA_OFFSET
+ i = j
+ if not IS_BIG_ENDIAN:
+ i = (16 // nsize) - 1 - i
+ off += nsize * i
+ self._store_to_sp(r.SCRATCH.value, nsize, off+16)
self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
def emit_vec_float_abs(self, op, arglocs, regalloc):
@@ -313,10 +303,7 @@
acc = accumloc.value
if arg.type == FLOAT:
# r = (r[0]+r[1],r[0]+r[1])
- if IS_BIG_ENDIAN:
- self.mc.xxpermdi(tgt, acc, acc, 0b00)
- else:
- self.mc.xxpermdi(tgt, acc, acc, 0b10)
+ self.mc.xxpermdi(tgt, acc, acc, 0b10)
if op == '+':
self.mc.xsadddp(tgt, tgt, acc)
elif op == '*':
@@ -471,23 +458,26 @@
res, l0, off = arglocs
size = op.bytesize
+ idx = 0
+ size = op.bytesize
+ if not IS_BIG_ENDIAN:
+ idx = (16 // size) - 1 - idx
+ idx *= size
+ self._store_to_sp(l0.value, size, idx+PARAM_SAVE_AREA_OFFSET)
+ if size == 8:
+ idx = 1
+ if not IS_BIG_ENDIAN:
+ idx = (16 // size) - 1 - idx
+ idx *= size
+ self._store_to_sp(l0.value, size, idx+PARAM_SAVE_AREA_OFFSET)
self.mc.load_imm(r.SCRATCH2, off.value)
self.mc.lvx(res.value, r.SCRATCH2.value, r.SP.value)
if size == 1:
- if IS_BIG_ENDIAN:
- self.mc.vspltb(res.value, res.value, 0b0000)
- else:
- self.mc.vspltb(res.value, res.value, 0b1111)
+ self.mc.vspltb(res.value, res.value, 0b0000)
elif size == 2:
- if IS_BIG_ENDIAN:
- self.mc.vsplth(res.value, res.value, 0b000)
- else:
- self.mc.vsplth(res.value, res.value, 0b111)
+ self.mc.vsplth(res.value, res.value, 0b000)
elif size == 4:
- if IS_BIG_ENDIAN:
- self.mc.vspltw(res.value, res.value, 0b00)
- else:
- self.mc.vspltw(res.value, res.value, 0b11)
+ self.mc.vspltw(res.value, res.value, 0b00)
elif size == 8:
pass
else:
@@ -496,7 +486,6 @@
def emit_vec_pack_i(self, op, arglocs, regalloc):
assert isinstance(op, VectorOp)
resultloc, vloc, sourceloc, residxloc, srcidxloc, countloc = arglocs
- srcidx = srcidxloc.value
residx = residxloc.value
count = countloc.value
res = resultloc.value
@@ -531,6 +520,37 @@
self.mc.stb(src, r.SP.value, PARAM_SAVE_AREA_OFFSET+idx)
self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
+ def _load_from_sp(self, res, size, off):
+ if size == 8:
+ self.mc.load(res, r.SP.value, off)
+ return True
+ elif size == 4:
+ self.mc.lwa(res, r.SP.value, off)
+ return True
+ elif size == 2:
+ self.mc.lha(res, r.SP.value, off)
+ return True
+ elif size == 1:
+ self.mc.lbz(res, r.SP.value, off)
+ self.mc.extsb(res, res)
+ return True
+ return False
+
+ def _store_to_sp(self, res, size, off):
+ if size == 8:
+ self.mc.store(res, r.SP.value, off)
+ return True
+ elif size == 4:
+ self.mc.stw(res, r.SP.value, off)
+ return True
+ elif size == 2:
+ self.mc.sth(res, r.SP.value, off)
+ return True
+ elif size == 1:
+ self.mc.stb(res, r.SP.value, off)
+ return True
+ return False
+
def emit_vec_unpack_i(self, op, arglocs, regalloc):
assert isinstance(op, VectorOp)
resloc, srcloc, idxloc, countloc, sizeloc = arglocs
@@ -539,6 +559,7 @@
src = srcloc.value
size = sizeloc.value
count = countloc.value
+ newsize = op.bytesize
if count == 1:
assert srcloc.is_vector_reg()
assert not resloc.is_vector_reg()
@@ -548,18 +569,7 @@
if not IS_BIG_ENDIAN:
idx = (16 // size) - 1 - idx
off += size * idx
- if size == 8:
- self.mc.load(res, r.SP.value, off)
- return
- elif size == 4:
- self.mc.lwa(res, r.SP.value, off)
- return
- elif size == 2:
- self.mc.lha(res, r.SP.value, off)
- return
- elif size == 1:
- self.mc.lbz(res, r.SP.value, off)
- self.mc.extsb(res, res)
+ if self._load_from_sp(res, size, off):
return
else:
# count is not 1, but only 2 is supported for i32
@@ -571,16 +581,21 @@
self.mc.stvx(src, r.SCRATCH2.value, r.SP.value)
self.mc.load_imm(r.SCRATCH2, PARAM_SAVE_AREA_OFFSET+16)
self.mc.stvx(res, r.SCRATCH2.value, r.SP.value)
- if count * size == 8:
+ for j in range(count):
+ off = PARAM_SAVE_AREA_OFFSET
+ i = j+idx
if not IS_BIG_ENDIAN:
- endian_off = 8
+ i = (16 // size) - 1 - i
+ off += size * i
+ self._load_from_sp(r.SCRATCH.value, size, off)
off = PARAM_SAVE_AREA_OFFSET
- off = off + endian_off - (idx * size)
- assert idx * size + 8 <= 16
- self.mc.load(r.SCRATCH.value, r.SP.value, off)
- self.mc.store(r.SCRATCH.value, r.SP.value, PARAM_SAVE_AREA_OFFSET+16+endian_off)
- self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
- return
+ i = j
+ if not IS_BIG_ENDIAN:
+ i = (16 // size) - 1 - i
+ off += size * i
+ self._store_to_sp(r.SCRATCH.value, newsize, off+16)
+ self.mc.lvx(res, r.SCRATCH2.value, r.SP.value)
+ return
not_implemented("%d bit integer, count %d" % \
(size*8, count))
@@ -591,10 +606,8 @@
vec = vloc.value
res = resloc.value
src = srcloc.value
- count = countloc.value
residx = residxloc.value
srcidx = srcidxloc.value
- size = op.bytesize
# srcloc is always a floating point register f, this means it is
# vsr[0] == valueof(f)
if srcidx == 0:
@@ -864,10 +877,6 @@
mc.load_imm(l0, arg.value)
else:
l0 = self.ensure_reg(arg)
- mc.store(l0.value, r.SP.value, PARAM_SAVE_AREA_OFFSET)
- size = op.bytesize
- if size == 8:
- mc.store(l0.value, r.SP.value, PARAM_SAVE_AREA_OFFSET+8)
res = self.force_allocate_vector_reg(op)
return [res, l0, imm(PARAM_SAVE_AREA_OFFSET)]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vecopt.py
@@ -1397,5 +1397,6 @@
assert op not in dups
dups.add(op)
+
class TestLLtype(BaseTestVectorize, LLtypeMixin):
pass
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -1190,6 +1190,8 @@
# Uh, that should be moved to vector_ext really!
_cast_ops['CAST_FLOAT_TO_INT'] = ('f', 8, 'i', 8, 2)
_cast_ops['VEC_CAST_FLOAT_TO_INT'] = ('f', 8, 'i', 8, 2)
+ _cast_ops['CAST_INT_TO_FLOAT'] = ('i', 8, 'f', 8, 2)
+ _cast_ops['VEC_CAST_INT_TO_FLOAT'] = ('i', 8, 'f', 8, 2)
# ____________________________________________________________
diff --git a/rpython/jit/metainterp/test/test_vector.py b/rpython/jit/metainterp/test/test_vector.py
--- a/rpython/jit/metainterp/test/test_vector.py
+++ b/rpython/jit/metainterp/test/test_vector.py
@@ -75,16 +75,6 @@
request.cls.a
return rs
-
-def rdiv(v1,v2):
- # TODO unused, interpeting this on top of llgraph does not work correctly
- try:
- return v1 / v2
- except ZeroDivisionError:
- if v1 == v2 == 0.0:
- return rfloat.NAN
- return rfloat.copysign(rfloat.INFINITY, v1 * v2)
-
class VectorizeTests(object):
enable_opts = 'intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll'
@@ -292,7 +282,7 @@
myjitdriver.jit_merge_point()
a = va[i]
b = vb[i]
- ec = intmask(a) + intmask(b)
+ ec = intmask(intmask(a) + intmask(b))
va[i] = rffi.r_short(ec)
i += 1
@@ -544,33 +534,6 @@
res = self.meta_interp(f, [i], vec=True)
assert res == f(i)
- @py.test.mark.parametrize('i,v1,v2',[(25,2.5,0.3),(25,2.5,0.3)])
- def test_list_vectorize(self,i,v1,v2):
- myjitdriver = JitDriver(greens = [],
- reds = 'auto')
- class ListF(object):
- def __init__(self, size, init):
- self.list = [init] * size
- def __getitem__(self, key):
- return self.list[key]
- def __setitem__(self, key, value):
- self.list[key] = value
- def f(d, v1, v2):
- a = ListF(d, v1)
- b = ListF(d, v2)
- i = 0
- while i < d:
- myjitdriver.jit_merge_point()
- a[i] = a[i] + b[i]
- i += 1
- s = 0
- for i in range(d):
- s += a[i]
- return s
- res = self.meta_interp(f, [i,v1,v2], vec=True, vec_all=True)
- # sum helps to generate the rounding error of floating points
- # return 69.999 ... instead of 70, (v1+v2)*i == 70.0
- assert res == f(i,v1,v2) == sum([v1+v2]*i)
@py.test.mark.parametrize('size',[12])
def test_body_multiple_accesses(self, size):
@@ -880,17 +843,18 @@
j += 4
i += 8
- va = alloc_raw_storage(4*30, zero=True)
- vb = alloc_raw_storage(8*30, zero=True)
- for i,v in enumerate([1]*30):
+ count = 32
+ va = alloc_raw_storage(4*count, zero=True)
+ vb = alloc_raw_storage(8*count, zero=True)
+ for i,v in enumerate([1,2,3,4]*(count/4)):
raw_storage_setitem(va, i*4, rffi.cast(rffi.INT,v))
- for i,v in enumerate([-9.0]*30):
+ for i,v in enumerate([-1.0,-2.0,-3.0,-4.0]*(count/4)):
raw_storage_setitem(vb, i*8, rffi.cast(rffi.DOUBLE,v))
- vc = alloc_raw_storage(8*30, zero=True)
- self.meta_interp(f, [8*30, va, vb, vc], vec=True)
+ vc = alloc_raw_storage(8*count, zero=True)
+ self.meta_interp(f, [8*count, va, vb, vc], vec=True)
- for i in range(30):
- assert raw_storage_getitem(rffi.DOUBLE,vc,i*8) == -8.0
+ for i in range(count):
+ assert raw_storage_getitem(rffi.DOUBLE,vc,i*8) == 0.0
free_raw_storage(va)
free_raw_storage(vb)
@@ -898,4 +862,14 @@
class TestLLtype(LLJitMixin, VectorizeTests):
- pass
+ # skip some tests on this backend
+ def test_unpack_f(self):
+ pass
+ def test_unpack_i64(self):
+ pass
+ def test_unpack_i(self):
+ pass
+ def test_unpack_several(self):
+ pass
+ def test_vec_int_sum(self):
+ pass
diff --git a/rpython/rlib/rarithmetic.py b/rpython/rlib/rarithmetic.py
--- a/rpython/rlib/rarithmetic.py
+++ b/rpython/rlib/rarithmetic.py
@@ -323,50 +323,48 @@
def __add__(self, other):
x = long(self)
- y = long(other)
+ y = other # may be a float
return self._widen(other, x + y)
__radd__ = __add__
def __sub__(self, other):
x = long(self)
- y = long(other)
+ y = other # may be a float
return self._widen(other, x - y)
def __rsub__(self, other):
y = long(self)
- x = long(other)
+ x = other # may be a float
return self._widen(other, x - y)
def __mul__(self, other):
x = long(self)
- if not isinstance(other, (int, long)):
- return x * other
- y = long(other)
+ y = other # may be a float
return self._widen(other, x * y)
__rmul__ = __mul__
def __div__(self, other):
x = long(self)
- y = long(other)
- return self._widen(other, x // y)
+ y = other # may be a float
+ return self._widen(other, x / y)
__floordiv__ = __div__
def __rdiv__(self, other):
y = long(self)
- x = long(other)
- return self._widen(other, x // y)
+ x = other # may be a float
+ return self._widen(other, x / y)
__rfloordiv__ = __rdiv__
def __mod__(self, other):
x = long(self)
- y = long(other)
+ y = other # not rpython if it is a float
return self._widen(other, x % y)
def __rmod__(self, other):
y = long(self)
- x = long(other)
+ x = other # not rpython if it is a float
return self._widen(other, x % y)
def __divmod__(self, other):
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -679,21 +679,22 @@
raise OSError(error, "readdir failed")
return result
-def fdlistdir(dirfd):
- """
- Like listdir(), except that the directory is specified as an open
- file descriptor.
+if not _WIN32:
+ def fdlistdir(dirfd):
+ """
+ Like listdir(), except that the directory is specified as an open
+ file descriptor.
- Note: fdlistdir() closes the file descriptor. To emulate the
- Python 3.x 'os.opendir(dirfd)', you must first duplicate the
- file descriptor.
- """
- dirp = c_fdopendir(dirfd)
- if not dirp:
- error = get_saved_errno()
- c_close(dirfd)
- raise OSError(error, "opendir failed")
- return _listdir(dirp, rewind=True)
+ Note: fdlistdir() closes the file descriptor. To emulate the
+ Python 3.x 'os.opendir(dirfd)', you must first duplicate the
+ file descriptor.
+ """
+ dirp = c_fdopendir(dirfd)
+ if not dirp:
+ error = get_saved_errno()
+ c_close(dirfd)
+ raise OSError(error, "opendir failed")
+ return _listdir(dirp, rewind=True)
@replace_os_function('listdir')
@specialize.argtype(0)
@@ -1166,6 +1167,10 @@
@replace_os_function('pipe')
def pipe(flags=0):
# 'flags' might be ignored. Check the result.
+ # The handles returned are always inheritable on Posix.
+ # The situation on Windows is not completely clear: I think
+ # it should always return non-inheritable handles, but CPython
+ # uses SECURITY_ATTRIBUTES to ensure that and we don't.
if _WIN32:
# 'flags' ignored
ralloc = lltype.scoped_alloc(rwin32.LPHANDLE.TO, 1)
@@ -2146,8 +2151,9 @@
handle_posix_error('mknodat', error)
-eci_inheritable = eci.merge(ExternalCompilationInfo(
- separate_module_sources=[r"""
+if not _WIN32:
+ eci_inheritable = eci.merge(ExternalCompilationInfo(
+ separate_module_sources=[r"""
#include <errno.h>
#include <sys/ioctl.h>
@@ -2200,10 +2206,6 @@
RPY_EXTERN
int rpy_dup_noninheritable(int fd)
{
-#ifdef _WIN32
-#error NotImplementedError
-#endif
-
#ifdef F_DUPFD_CLOEXEC
return fcntl(fd, F_DUPFD_CLOEXEC, 0);
#else
@@ -2221,10 +2223,6 @@
RPY_EXTERN
int rpy_dup2_noninheritable(int fd, int fd2)
{
-#ifdef _WIN32
-#error NotImplementedError
-#endif
-
#ifdef F_DUP2FD_CLOEXEC
return fcntl(fd, F_DUP2FD_CLOEXEC, fd2);
@@ -2249,33 +2247,41 @@
return 0;
#endif
}
- """ % {'HAVE_DUP3': HAVE_DUP3}],
- post_include_bits=['RPY_EXTERN int rpy_set_inheritable(int, int);\n'
- 'RPY_EXTERN int rpy_get_inheritable(int);\n'
- 'RPY_EXTERN int rpy_dup_noninheritable(int);\n'
- 'RPY_EXTERN int rpy_dup2_noninheritable(int, int);\n']))
+ """ % {'HAVE_DUP3': HAVE_DUP3}],
+ post_include_bits=['RPY_EXTERN int rpy_set_inheritable(int, int);\n'
+ 'RPY_EXTERN int rpy_get_inheritable(int);\n'
+ 'RPY_EXTERN int rpy_dup_noninheritable(int);\n'
+ 'RPY_EXTERN int rpy_dup2_noninheritable(int, int);\n'
+ ]))
-c_set_inheritable = external('rpy_set_inheritable', [rffi.INT, rffi.INT],
- rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
- compilation_info=eci_inheritable)
-c_get_inheritable = external('rpy_get_inheritable', [rffi.INT],
- rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
- compilation_info=eci_inheritable)
-c_dup_noninheritable = external('rpy_dup_noninheritable', [rffi.INT],
- rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
- compilation_info=eci_inheritable)
-c_dup2_noninheritable = external('rpy_dup2_noninheritable', [rffi.INT,rffi.INT],
- rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
- compilation_info=eci_inheritable)
+ _c_set_inheritable = external('rpy_set_inheritable', [rffi.INT, rffi.INT],
+ rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
+ compilation_info=eci_inheritable)
+ _c_get_inheritable = external('rpy_get_inheritable', [rffi.INT],
+ rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
+ compilation_info=eci_inheritable)
+ c_dup_noninheritable = external('rpy_dup_noninheritable', [rffi.INT],
+ rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
+ compilation_info=eci_inheritable)
+ c_dup2_noninheritable = external('rpy_dup2_noninheritable', [rffi.INT,rffi.INT],
+ rffi.INT, save_err=rffi.RFFI_SAVE_ERRNO,
+ compilation_info=eci_inheritable)
-def set_inheritable(fd, inheritable):
- result = c_set_inheritable(fd, inheritable)
- handle_posix_error('set_inheritable', result)
+ def set_inheritable(fd, inheritable):
+ result = _c_set_inheritable(fd, inheritable)
+ handle_posix_error('set_inheritable', result)
-def get_inheritable(fd):
- res = c_get_inheritable(fd)
- res = handle_posix_error('get_inheritable', res)
- return res != 0
+ def get_inheritable(fd):
+ res = _c_get_inheritable(fd)
+ res = handle_posix_error('get_inheritable', res)
+ return res != 0
+
+else:
+ # _WIN32
+ from rpython.rlib.rwin32 import set_inheritable, get_inheritable
+ from rpython.rlib.rwin32 import c_dup_noninheritable
+ from rpython.rlib.rwin32 import c_dup2_noninheritable
+
class SetNonInheritableCache(object):
"""Make one prebuilt instance of this for each path that creates
@@ -2315,20 +2321,20 @@
_pipe2_syscall = ENoSysCache()
-post_include_bits=['RPY_EXTERN int _cpu_count(void);']
+post_include_bits=['RPY_EXTERN int rpy_cpu_count(void);']
# cpu count for linux, windows and mac (+ bsds)
# note that the code is copied from cpython and split up here
if sys.platform.startswith('linux'):
cpucount_eci = ExternalCompilationInfo(includes=["unistd.h"],
separate_module_sources=["""
- RPY_EXTERN int _cpu_count(void) {
+ RPY_EXTERN int rpy_cpu_count(void) {
return sysconf(_SC_NPROCESSORS_ONLN);
}
"""], post_include_bits=post_include_bits)
elif sys.platform == "win32":
cpucount_eci = ExternalCompilationInfo(includes=["Windows.h"],
separate_module_sources=["""
- RPY_EXTERN int _cpu_count(void) {
+ RPY_EXTERN int rpy_cpu_count(void) {
SYSTEM_INFO sysinfo;
GetSystemInfo(&sysinfo);
return sysinfo.dwNumberOfProcessors;
@@ -2337,7 +2343,7 @@
else:
cpucount_eci = ExternalCompilationInfo(includes=["sys/types.h", "sys/sysctl.h"],
separate_module_sources=["""
- RPY_EXTERN int _cpu_count(void) {
+ RPY_EXTERN int rpy_cpu_count(void) {
int ncpu = 0;
#if defined(__DragonFly__) || \
defined(__OpenBSD__) || \
@@ -2355,7 +2361,7 @@
}
"""], post_include_bits=post_include_bits)
-_cpu_count = rffi.llexternal('_cpu_count', [], rffi.INT_real,
+_cpu_count = rffi.llexternal('rpy_cpu_count', [], rffi.INT_real,
compilation_info=cpucount_eci)
def cpu_count():
diff --git a/rpython/rlib/rposix_environ.py b/rpython/rlib/rposix_environ.py
--- a/rpython/rlib/rposix_environ.py
+++ b/rpython/rlib/rposix_environ.py
@@ -201,6 +201,8 @@
# default implementation for platforms without a real unsetenv()
r_putenv(name, '')
+REAL_UNSETENV = False
+
if hasattr(__import__(os.name), 'unsetenv'):
os_unsetenv = rffi.llexternal('unsetenv', [rffi.CCHARP], rffi.INT,
save_err=rffi.RFFI_SAVE_ERRNO)
@@ -222,3 +224,4 @@
register_external(r_unsetenv, [str0], annmodel.s_None,
export_name='ll_os.ll_os_unsetenv',
llimpl=unsetenv_llimpl)
+ REAL_UNSETENV = True
diff --git a/rpython/rlib/rposix_stat.py b/rpython/rlib/rposix_stat.py
--- a/rpython/rlib/rposix_stat.py
+++ b/rpython/rlib/rposix_stat.py
@@ -641,6 +641,7 @@
@specialize.arg(0)
def win32_xstat(traits, path, traverse=False):
+ # XXX 'traverse' is ignored
win32traits = make_win32_traits(traits)
with lltype.scoped_alloc(
win32traits.WIN32_FILE_ATTRIBUTE_DATA) as data:
diff --git a/rpython/rlib/rsocket.py b/rpython/rlib/rsocket.py
--- a/rpython/rlib/rsocket.py
+++ b/rpython/rlib/rsocket.py
@@ -1062,11 +1062,32 @@
return result
make_socket._annspecialcase_ = 'specialize:arg(4)'
-def sock_set_inheritable(fd, inheritable):
- try:
- rposix.set_inheritable(fd, inheritable)
- except OSError as e:
- raise CSocketError(e.errno)
+if _c.WIN32:
+ def sock_set_inheritable(fd, inheritable):
+ handle = rffi.cast(rwin32.HANDLE, fd)
+ try:
+ rwin32.set_handle_inheritable(handle, inheritable)
+ except WindowsError:
+ raise RSocketError("SetHandleInformation failed") # xxx
+
+ def sock_get_inheritable(fd):
+ handle = rffi.cast(rwin32.HANDLE, fd)
+ try:
+ return rwin32.get_handle_inheritable(handle)
+ except WindowsError:
+ raise RSocketError("GetHandleInformation failed") # xxx
+else:
+ def sock_set_inheritable(fd, inheritable):
+ try:
+ rposix.set_inheritable(fd, inheritable)
+ except OSError as e:
+ raise CSocketError(e.errno)
+
+ def sock_get_inheritable(fd):
+ try:
+ return rposix.get_inheritable(fd)
+ except OSError as e:
+ raise CSocketError(e.errno)
class SocketError(Exception):
applevelerrcls = 'error'
diff --git a/rpython/rlib/rwin32.py b/rpython/rlib/rwin32.py
--- a/rpython/rlib/rwin32.py
+++ b/rpython/rlib/rwin32.py
@@ -112,7 +112,7 @@
CTRL_C_EVENT CTRL_BREAK_EVENT
MB_ERR_INVALID_CHARS ERROR_NO_UNICODE_TRANSLATION
WC_NO_BEST_FIT_CHARS STD_INPUT_HANDLE STD_OUTPUT_HANDLE
- STD_ERROR_HANDLE
+ STD_ERROR_HANDLE HANDLE_FLAG_INHERIT FILE_TYPE_CHAR
"""
from rpython.translator.platform import host_factory
static_platform = host_factory()
@@ -473,3 +473,64 @@
CONSOLE_SCREEN_BUFFER_INFO_P = lltype.Ptr(CONSOLE_SCREEN_BUFFER_INFO)
GetConsoleScreenBufferInfo = winexternal(
"GetConsoleScreenBufferInfo", [HANDLE, CONSOLE_SCREEN_BUFFER_INFO_P], BOOL)
+
+ _GetHandleInformation = winexternal(
+ 'GetHandleInformation', [HANDLE, LPDWORD], BOOL)
+ _SetHandleInformation = winexternal(
+ 'SetHandleInformation', [HANDLE, DWORD, DWORD], BOOL)
+
+ def set_inheritable(fd, inheritable):
+ handle = get_osfhandle(fd)
+ set_handle_inheritable(handle, inheritable)
+
+ def set_handle_inheritable(handle, inheritable):
+ assert lltype.typeOf(handle) is HANDLE
+ if inheritable:
+ flags = HANDLE_FLAG_INHERIT
+ else:
+ flags = 0
+ if not _SetHandleInformation(handle, HANDLE_FLAG_INHERIT, flags):
+ raise lastSavedWindowsError("SetHandleInformation")
+
+ def get_inheritable(fd):
+ handle = get_osfhandle(fd)
+ return get_handle_inheritable(handle)
+
+ def get_handle_inheritable(handle):
+ assert lltype.typeOf(handle) is HANDLE
+ pflags = lltype.malloc(LPDWORD.TO, 1, flavor='raw')
+ try:
+ if not _GetHandleInformation(handle, pflags):
+ raise lastSavedWindowsError("GetHandleInformation")
+ flags = pflags[0]
+ finally:
+ lltype.free(pflags, flavor='raw')
+ return (flags & HANDLE_FLAG_INHERIT) != 0
+
+ _GetFileType = winexternal('GetFileType', [HANDLE], DWORD)
+
+ def c_dup_noninheritable(fd1):
+ from rpython.rlib.rposix import c_dup
+
+ ftype = _GetFileType(get_osfhandle(fd1))
+ fd2 = c_dup(fd1) # the inheritable version
+ if fd2 >= 0 and ftype != FILE_TYPE_CHAR:
+ try:
+ set_inheritable(fd2, False)
+ except:
+ os.close(fd2)
+ raise
+ return fd2
+
+ def c_dup2_noninheritable(fd1, fd2):
+ from rpython.rlib.rposix import c_dup2
+
+ ftype = _GetFileType(get_osfhandle(fd1))
+ res = c_dup2(fd1, fd2) # the inheritable version
+ if res >= 0 and ftype != FILE_TYPE_CHAR:
+ try:
+ set_inheritable(fd2, False)
+ except:
+ os.close(fd2)
+ raise
+ return res
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
@@ -602,3 +602,12 @@
assert r_uint64(self._64_umax) + r_uint64(1) == r_uint64(0)
assert r_uint64(0) - r_uint64(1) == r_uint64(self._64_umax)
+
+ def test_operation_with_float(self):
+ def f(x):
+ assert r_longlong(x) + 0.5 == 43.5
+ assert r_longlong(x) - 0.5 == 42.5
+ assert r_longlong(x) * 0.5 == 21.5
+ assert r_longlong(x) / 0.8 == 53.75
+ f(43)
+ interpret(f, [43])
diff --git a/rpython/rlib/test/test_rposix.py b/rpython/rlib/test/test_rposix.py
--- a/rpython/rlib/test/test_rposix.py
+++ b/rpython/rlib/test/test_rposix.py
@@ -470,11 +470,18 @@
assert rposix.is_valid_fd(fd) == 0
def test_putenv(self):
+ from rpython.rlib import rposix_environ
+
def f():
rposix.putenv(self.path, self.path)
rposix.unsetenv(self.path)
- interpret(f, []) # does not crash
+ interpret(f, [], # does not crash
+ malloc_check=rposix_environ.REAL_UNSETENV)
+ # If we have a real unsetenv(), check that it frees the string
+ # kept alive by putenv(). Otherwise, we can't check that,
+ # because unsetenv() will keep another string alive itself.
+ test_putenv.dont_track_allocations = True
class TestPosixAscii(BasePosixUnicodeOrAscii):
@@ -604,6 +611,9 @@
def test_SetNonInheritableCache():
cache = rposix.SetNonInheritableCache()
fd1, fd2 = os.pipe()
+ if sys.platform == 'win32':
+ rposix.set_inheritable(fd1, True)
+ rposix.set_inheritable(fd2, True)
assert rposix.get_inheritable(fd1) == True
assert rposix.get_inheritable(fd1) == True
assert cache.cached_inheritable == -1
@@ -616,6 +626,24 @@
os.close(fd1)
os.close(fd2)
+def test_dup_dup2_non_inheritable():
+ for preset in [False, True]:
+ fd1, fd2 = os.pipe()
+ rposix.set_inheritable(fd1, preset)
+ rposix.set_inheritable(fd2, preset)
+ fd3 = rposix.dup(fd1, True)
+ assert rposix.get_inheritable(fd3) == True
+ fd4 = rposix.dup(fd1, False)
+ assert rposix.get_inheritable(fd4) == False
+ rposix.dup2(fd2, fd4, False)
+ assert rposix.get_inheritable(fd4) == False
+ rposix.dup2(fd2, fd3, True)
+ assert rposix.get_inheritable(fd3) == True
+ os.close(fd1)
+ os.close(fd2)
+ os.close(fd3)
+ os.close(fd4)
+
def test_sync():
if sys.platform != 'win32':
rposix.sync()
diff --git a/rpython/rlib/test/test_rsocket.py b/rpython/rlib/test/test_rsocket.py
--- a/rpython/rlib/test/test_rsocket.py
+++ b/rpython/rlib/test/test_rsocket.py
@@ -124,8 +124,8 @@
py.test.skip('No socketpair on Windows')
for inh in [False, True]:
s1, s2 = socketpair(inheritable=inh)
- assert rposix.get_inheritable(s1.fd) == inh
- assert rposix.get_inheritable(s2.fd) == inh
+ assert sock_get_inheritable(s1.fd) == inh
+ assert sock_get_inheritable(s2.fd) == inh
s1.close()
s2.close()
@@ -391,7 +391,7 @@
def test_inheritable():
for inh in [False, True]:
s1 = RSocket(inheritable=inh)
- assert rposix.get_inheritable(s1.fd) == inh
+ assert sock_get_inheritable(s1.fd) == inh
s1.close()
def test_getaddrinfo_http():
diff --git a/rpython/tool/jitlogparser/storage.py b/rpython/tool/jitlogparser/storage.py
--- a/rpython/tool/jitlogparser/storage.py
+++ b/rpython/tool/jitlogparser/storage.py
@@ -62,7 +62,7 @@
guard_dict = {}
for loop_no, loop in enumerate(loops):
for op in loop.operations:
- if op.name.startswith('guard_'):
+ if op.name.startswith('guard_') or op.name.startswith('vec_guard_'):
guard_dict[int(op.descr[len('<Guard0x'):-1], 16)] = (op, loop)
for loop in loops:
if loop.comment:
More information about the pypy-commit
mailing list