Author: Philip Jenvey <[email protected]>
Branch: py3k
Changeset: r60507:331eda1c7211
Date: 2013-01-26 15:25 -0800
http://bitbucket.org/pypy/pypy/changeset/331eda1c7211/
Log: merge default
diff --git a/py/_code/source.py b/py/_code/source.py
--- a/py/_code/source.py
+++ b/py/_code/source.py
@@ -141,6 +141,8 @@
trysource = self[start:end]
if trysource.isparseable():
return start, end
+ if end == start + 100: # XXX otherwise, it takes forever
+ break # XXX
if end is None:
raise IndexError("no valid source range around line %d " %
(lineno,))
return start, end
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
@@ -43,3 +43,7 @@
.. branch: fix-lookinside-iff-oopspec
Fixed the interaction between two internal tools for controlling the JIT.
+
+.. branch: inline-virtualref-2
+Better optimized certain types of frame accesses in the JIT, particularly
+around exceptions that escape the function they were raised in.
diff --git a/pypy/module/sys/version.py b/pypy/module/sys/version.py
--- a/pypy/module/sys/version.py
+++ b/pypy/module/sys/version.py
@@ -29,7 +29,7 @@
import pypy
pypydir = os.path.dirname(os.path.abspath(pypy.__file__))
del pypy
-from pypy.tool.version import get_repo_version_info
+from rpython.tool.version import get_repo_version_info
import time as t
gmtime = t.gmtime()
diff --git a/pypy/module/sys/vm.py b/pypy/module/sys/vm.py
--- a/pypy/module/sys/vm.py
+++ b/pypy/module/sys/vm.py
@@ -95,7 +95,7 @@
def exc_info_with_tb(space):
operror = space.getexecutioncontext().sys_exc_info()
if operror is None:
- return space.newtuple([space.w_None,space.w_None,space.w_None])
+ return space.newtuple([space.w_None, space.w_None, space.w_None])
else:
return space.newtuple([operror.w_type, operror.get_w_value(space),
space.wrap(operror.get_traceback())])
diff --git a/pypy/tool/jitlogparser/parser.py b/pypy/tool/jitlogparser/parser.py
--- a/pypy/tool/jitlogparser/parser.py
+++ b/pypy/tool/jitlogparser/parser.py
@@ -215,6 +215,7 @@
_lineset = None
is_bytecode = False
inline_level = None
+ bytecode_name = None
# factory method
TraceForOpcode = TraceForOpcode
@@ -244,23 +245,29 @@
return ",".join([str(len(v)) for v in stack])
def append_to_res(bc):
- if not stack:
- stack.append([])
- else:
- if bc.inline_level is not None and bc.inline_level + 1 !=
len(stack):
- if bc.inline_level < len(stack):
+ if bc.inline_level is not None:
+ if bc.inline_level == len(stack) - 1:
+ pass
+ elif bc.inline_level > len(stack) - 1:
+ stack.append([])
+ else:
+ while bc.inline_level + 1 < len(stack):
last = stack.pop()
stack[-1].append(cls(last, getpath(stack), storage))
- else:
- stack.append([])
stack[-1].append(bc)
so_far = []
stack = []
+ nothing_yet = True
for op in operations:
if op.name == 'debug_merge_point':
if so_far:
- append_to_res(cls.TraceForOpcode(so_far, storage,
loopname))
+ opc = cls.TraceForOpcode(so_far, storage, loopname)
+ if nothing_yet:
+ nothing_yet = False
+ for i in xrange(opc.inline_level + 1):
+ stack.append([])
+ append_to_res(opc)
if limit:
break
so_far = []
diff --git a/pypy/tool/jitlogparser/test/test_parser.py
b/pypy/tool/jitlogparser/test/test_parser.py
--- a/pypy/tool/jitlogparser/test/test_parser.py
+++ b/pypy/tool/jitlogparser/test/test_parser.py
@@ -354,3 +354,25 @@
f = Function.from_operations(loop.operations, LoopStorage())
assert f.chunks[-1].filename == 'x.py'
assert f.filename is None
+
+def test_parse_2_levels_up():
+ loop = parse("""
+ []
+ debug_merge_point(0, 0, 'one')
+ debug_merge_point(1, 0, 'two')
+ debug_merge_point(2, 0, 'three')
+ debug_merge_point(0, 0, 'one')
+ """)
+ f = Function.from_operations(loop.operations, LoopStorage())
+ assert len(f.chunks) == 3
+
+def test_parse_from_inside():
+ loop = parse("""
+ []
+ debug_merge_point(1, 0, 'two')
+ debug_merge_point(2, 0, 'three')
+ debug_merge_point(0, 0, 'one')
+ """)
+ f = Function.from_operations(loop.operations, LoopStorage())
+ assert len(f.chunks) == 2
+
diff --git a/pypy/tool/release/package.py b/pypy/tool/release/package.py
--- a/pypy/tool/release/package.py
+++ b/pypy/tool/release/package.py
@@ -13,7 +13,7 @@
import sys
import os
#Add toplevel repository dir to sys.path
-sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))))
+sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
import py
import fnmatch
from rpython.tool.udir import udir
diff --git a/rpython/jit/backend/x86/runner.py
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -64,6 +64,7 @@
def setup_once(self):
self.profile_agent.startup()
self.assembler.setup_once()
+ self.gc_set_extra_threshold()
def finish_once(self):
self.assembler.finish_once()
diff --git a/rpython/rlib/rrandom.py b/rpython/rlib/rrandom.py
--- a/rpython/rlib/rrandom.py
+++ b/rpython/rlib/rrandom.py
@@ -100,9 +100,20 @@
def jumpahead(self, n):
mt = self.state
- for i in range(N - 1, 0, -1):
+ for i in range(N - 1, 1, -1):
j = n % i
mt[i], mt[j] = mt[j], mt[i]
- for i in range(N):
+ nonzero = False
+ for i in range(1, N):
mt[i] += r_uint(i + 1)
+ mt[i] &= r_uint(0xffffffff)
+ nonzero |= bool(mt[i])
+ # Ensure the state is nonzero: in the unlikely event that mt[1] through
+ # mt[N-1] are all zero, set the MSB of mt[0] (see issue #14591). In the
+ # normal case, we fall back to the pre-issue 14591 behaviour for mt[0].
+ if nonzero:
+ mt[0] += r_uint(1)
+ mt[0] &= r_uint(0xffffffff)
+ else:
+ mt[0] = r_uint(0x80000000)
self.index = N
diff --git a/rpython/rlib/rsocket.py b/rpython/rlib/rsocket.py
--- a/rpython/rlib/rsocket.py
+++ b/rpython/rlib/rsocket.py
@@ -1059,6 +1059,13 @@
def dup(fd):
return _c.dup(fd)
+ def fromfd(fd, family, type, proto=0, SocketClass=RSocket):
+ # Dup the fd so it and the socket can be closed independently
+ fd = _c.dup(fd)
+ if fd < 0:
+ raise last_error()
+ return make_socket(fd, family, type, proto, SocketClass)
+
def getdefaulttimeout():
return defaults.timeout
diff --git a/rpython/rlib/test/test_jit.py b/rpython/rlib/test/test_jit.py
--- a/rpython/rlib/test/test_jit.py
+++ b/rpython/rlib/test/test_jit.py
@@ -21,8 +21,6 @@
assert driver.reds == []
assert driver.numreds is None
py.test.raises(TypeError, "driver.can_enter_jit(foo='something')")
- #
- py.test.raises(AssertionError, "JitDriver(greens=['foo'], reds='auto',
get_printable_location='something')")
py.test.raises(AssertionError, "JitDriver(greens=['foo'], reds='auto',
confirm_enter_jit='something')")
def test_jitdriver_numreds():
diff --git a/rpython/rlib/test/test_rrandom.py
b/rpython/rlib/test/test_rrandom.py
--- a/rpython/rlib/test/test_rrandom.py
+++ b/rpython/rlib/test/test_rrandom.py
@@ -46,6 +46,15 @@
assert tuple(rnd.state) + (rnd.index, ) == cpyrandom.getstate()
+def test_jumpahead_badstate():
+ rnd = Random()
+ s, j = 4043161618, 2674112291824205302
+ rnd.init_by_array([s])
+ rnd.jumpahead(j)
+ for i in range(500):
+ r = rnd.random()
+ assert r <= 1.0, (r, i)
+
def test_translate():
def f(x, y):
x = r_uint(x)
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
@@ -373,6 +373,15 @@
assert s.fd != s2.fd
assert s.getsockname().eq(s2.getsockname())
+def test_c_dup():
+ # rsocket.dup() duplicates fd, it also works on Windows
+ # (but only on socket handles!)
+ s = RSocket(AF_INET, SOCK_STREAM)
+ s.setsockopt_int(SOL_SOCKET, SO_REUSEADDR, 1)
+ s.bind(INETAddress('localhost', 50007))
+ fd2 = dup(s.fd)
+ assert s.fd != fd2
+
def test_inet_aton():
assert inet_aton('1.2.3.4') == '\x01\x02\x03\x04'
assert inet_aton('127.0.0.1') == '\x7f\x00\x00\x01'
diff --git a/rpython/rtyper/rlist.py b/rpython/rtyper/rlist.py
--- a/rpython/rtyper/rlist.py
+++ b/rpython/rtyper/rlist.py
@@ -1025,11 +1025,7 @@
res._ll_resize(resultlen)
j = length
while j < resultlen:
- i = 0
- while i < length:
- p = j + i
- res.ll_setitem_fast(p, l.ll_getitem_fast(i))
- i += 1
+ ll_arraycopy(l, res, 0, j, length)
j += length
return res
ll_inplace_mul.oopspec = 'list.inplace_mul(l, factor)'
@@ -1046,11 +1042,7 @@
res = RESLIST.ll_newlist(resultlen)
j = 0
while j < resultlen:
- i = 0
- while i < length:
- p = j + i
- res.ll_setitem_fast(p, l.ll_getitem_fast(i))
- i += 1
+ ll_arraycopy(l, res, 0, j, length)
j += length
return res
# not inlined by the JIT -- contains a loop
diff --git a/pypy/tool/test/test_version.py b/rpython/tool/test/test_version.py
rename from pypy/tool/test/test_version.py
rename to rpython/tool/test/test_version.py
--- a/pypy/tool/test/test_version.py
+++ b/rpython/tool/test/test_version.py
@@ -1,6 +1,6 @@
import os, sys
import py
-from pypy.tool.version import get_repo_version_info, _get_hg_archive_version
+from rpython.tool.version import get_repo_version_info, _get_hg_archive_version
def test_hg_archival_version(tmpdir):
def version_for(name, **kw):
@@ -11,14 +11,14 @@
assert version_for('release',
tag='release-123',
node='000',
- ) == ('PyPy', 'release-123', '000')
+ ) == ('RPython', 'release-123', '000')
assert version_for('somebranch',
node='000',
branch='something',
- ) == ('PyPy', 'something', '000')
+ ) == ('RPython', 'something', '000')
def test_get_repo_version_info():
assert get_repo_version_info(None)
- assert get_repo_version_info(os.devnull) == ('PyPy', '?', '?')
- assert get_repo_version_info(sys.executable) == ('PyPy', '?', '?')
+ assert get_repo_version_info(os.devnull) == ('RPython', '?', '?')
+ assert get_repo_version_info(sys.executable) == ('RPython', '?', '?')
diff --git a/rpython/tool/udir.py b/rpython/tool/udir.py
--- a/rpython/tool/udir.py
+++ b/rpython/tool/udir.py
@@ -20,6 +20,7 @@
import os, sys
import py
+from rpython.tool.version import get_repo_version_info
from py.path import local
PYPY_KEEP = int(os.environ.get('PYPY_USESSION_KEEP', '3'))
@@ -28,7 +29,17 @@
if dir is not None:
dir = local(dir)
if basename is None:
- basename = ''
+ info = get_repo_version_info()
+ if info:
+ project, hgtag, hgid = info
+ basename = hgtag
+ if basename == '?':
+ basename = 'unknown' # directories with ? are not fun
+ # especially on windows
+ if isinstance(basename, unicode):
+ basename = basename.encode(sys.getdefaultencoding())
+ else:
+ basename = ''
basename = basename.replace('/', '--')
if not basename.startswith('-'):
basename = '-' + basename
diff --git a/pypy/tool/version.py b/rpython/tool/version.py
rename from pypy/tool/version.py
rename to rpython/tool/version.py
--- a/pypy/tool/version.py
+++ b/rpython/tool/version.py
@@ -1,10 +1,10 @@
import py
import os
from subprocess import Popen, PIPE
-import pypy
-pypydir = os.path.dirname(os.path.abspath(pypy.__file__))
-pypyroot = os.path.dirname(pypydir)
-default_retval = 'PyPy', '?', '?'
+import rpython
+rpythondir = os.path.dirname(os.path.abspath(rpython.__file__))
+rpythonroot = os.path.dirname(rpythondir)
+default_retval = 'RPython', '?', '?'
def maywarn(err, repo_type='Mercurial'):
if not err:
@@ -20,16 +20,16 @@
# Try to see if we can get info from Git if hgexe is not specified.
if not hgexe:
- if os.path.isdir(os.path.join(pypyroot, '.git')):
+ if os.path.isdir(os.path.join(rpythonroot, '.git')):
return _get_git_version()
# Fallback to trying Mercurial.
if hgexe is None:
hgexe = py.path.local.sysfind('hg')
- if os.path.isfile(os.path.join(pypyroot, '.hg_archival.txt')):
- return _get_hg_archive_version(os.path.join(pypyroot,
'.hg_archival.txt'))
- elif not os.path.isdir(os.path.join(pypyroot, '.hg')):
+ if os.path.isfile(os.path.join(rpythonroot, '.hg_archival.txt')):
+ return _get_hg_archive_version(os.path.join(rpythonroot,
'.hg_archival.txt'))
+ elif not os.path.isdir(os.path.join(rpythonroot, '.hg')):
maywarn('Not running from a Mercurial repository!')
return default_retval
elif not hgexe:
@@ -57,14 +57,14 @@
maywarn('command does not identify itself as Mercurial')
return default_retval
- p = Popen([str(hgexe), 'id', '-i', pypyroot],
+ p = Popen([str(hgexe), 'id', '-i', rpythonroot],
stdout=PIPE, stderr=PIPE, env=env)
hgid = p.stdout.read().strip()
maywarn(p.stderr.read())
if p.wait() != 0:
hgid = '?'
- p = Popen([str(hgexe), 'id', '-t', pypyroot],
+ p = Popen([str(hgexe), 'id', '-t', rpythonroot],
stdout=PIPE, stderr=PIPE, env=env)
hgtags = [t for t in p.stdout.read().strip().split() if t != 'tip']
maywarn(p.stderr.read())
@@ -72,15 +72,15 @@
hgtags = ['?']
if hgtags:
- return 'PyPy', hgtags[0], hgid
+ return 'RPython', hgtags[0], hgid
else:
# use the branch instead
- p = Popen([str(hgexe), 'id', '-b', pypyroot],
+ p = Popen([str(hgexe), 'id', '-b', rpythonroot],
stdout=PIPE, stderr=PIPE, env=env)
hgbranch = p.stdout.read().strip()
maywarn(p.stderr.read())
- return 'PyPy', hgbranch, hgid
+ return 'RPython', hgbranch, hgid
def _get_hg_archive_version(path):
@@ -90,9 +90,9 @@
finally:
fp.close()
if 'tag' in data:
- return 'PyPy', data['tag'], data['node']
+ return 'RPython', data['tag'], data['node']
else:
- return 'PyPy', data['branch'], data['node']
+ return 'RPython', data['branch'], data['node']
def _get_git_version():
@@ -105,7 +105,7 @@
try:
p = Popen(
[str(gitexe), 'rev-parse', 'HEAD'],
- stdout=PIPE, stderr=PIPE, cwd=pypyroot
+ stdout=PIPE, stderr=PIPE, cwd=rpythonroot
)
except OSError, e:
maywarn(e, 'Git')
@@ -116,16 +116,16 @@
revision_id = p.stdout.read().strip()[:12]
p = Popen(
[str(gitexe), 'describe', '--tags', '--exact-match'],
- stdout=PIPE, stderr=PIPE, cwd=pypyroot
+ stdout=PIPE, stderr=PIPE, cwd=rpythonroot
)
if p.wait() != 0:
p = Popen(
[str(gitexe), 'branch'], stdout=PIPE, stderr=PIPE,
- cwd=pypyroot
+ cwd=rpythonroot
)
if p.wait() != 0:
maywarn(p.stderr.read(), 'Git')
- return 'PyPy', '?', revision_id
+ return 'RPython', '?', revision_id
branch = '?'
for line in p.stdout.read().strip().split('\n'):
if line.startswith('* '):
@@ -133,8 +133,8 @@
if branch == '(no branch)':
branch = '?'
break
- return 'PyPy', branch, revision_id
- return 'PyPy', p.stdout.read().strip(), revision_id
+ return 'RPython', branch, revision_id
+ return 'RPython', p.stdout.read().strip(), revision_id
if __name__ == '__main__':
diff --git a/rpython/translator/platform/posix.py
b/rpython/translator/platform/posix.py
--- a/rpython/translator/platform/posix.py
+++ b/rpython/translator/platform/posix.py
@@ -115,7 +115,7 @@
cflags = self.cflags + self.standalone_only
m = GnuMakefile(path)
- m.exe_name = exe_name
+ m.exe_name = path.join(target_name)
m.eci = eci
def rpyrel(fpath):
diff --git a/rpython/translator/platform/windows.py
b/rpython/translator/platform/windows.py
--- a/rpython/translator/platform/windows.py
+++ b/rpython/translator/platform/windows.py
@@ -261,8 +261,15 @@
else:
exe_name = exe_name.new(ext=self.exe_ext)
+ if shared:
+ so_name = exe_name.new(purebasename='lib' + exe_name.purebasename,
+ ext=self.so_ext)
+ target_name = so_name.basename
+ else:
+ target_name = exe_name.basename
+
m = NMakefile(path)
- m.exe_name = exe_name
+ m.exe_name = path.join(target_name)
m.eci = eci
linkflags = list(self.link_flags)
@@ -274,13 +281,6 @@
# This is required for the JIT.
linkflags.append('/opt:noicf')
- if shared:
- so_name = exe_name.new(purebasename='lib' + exe_name.purebasename,
- ext=self.so_ext)
- target_name = so_name.basename
- else:
- target_name = exe_name.basename
-
def rpyrel(fpath):
rel = py.path.local(fpath).relto(rpypath)
if rel:
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit