Author: Philip Jenvey <pjen...@underboss.org> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit