[pypy-commit] pypy gil-improvement: merge heads
arigo
noreply at buildbot.pypy.org
Sun Oct 2 16:23:47 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: gil-improvement
Changeset: r47768:6edcd8cac15a
Date: 2011-10-02 16:23 +0200
http://bitbucket.org/pypy/pypy/changeset/6edcd8cac15a/
Log: merge heads
diff --git a/pypy/annotation/test/test_annrpython.py b/pypy/annotation/test/test_annrpython.py
--- a/pypy/annotation/test/test_annrpython.py
+++ b/pypy/annotation/test/test_annrpython.py
@@ -3204,6 +3204,8 @@
s = a.build_types(f, [])
assert isinstance(s, annmodel.SomeList)
assert not s.listdef.listitem.resized
+ assert not s.listdef.listitem.immutable
+ assert s.listdef.listitem.mutated
def test_delslice(self):
def f():
diff --git a/pypy/annotation/unaryop.py b/pypy/annotation/unaryop.py
--- a/pypy/annotation/unaryop.py
+++ b/pypy/annotation/unaryop.py
@@ -352,6 +352,7 @@
check_negative_slice(s_start, s_stop)
if not isinstance(s_iterable, SomeList):
raise Exception("list[start:stop] = x: x must be a list")
+ lst.listdef.mutate()
lst.listdef.agree(s_iterable.listdef)
# note that setslice is not allowed to resize a list in RPython
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -182,7 +182,8 @@
EffectInfo.EF_FORCES_VIRTUAL_OR_VIRTUALIZABLE,
can_invalidate=True))
arraycopydescr = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT,
- EffectInfo([], [], [], [], oopspecindex=EffectInfo.OS_ARRAYCOPY))
+ EffectInfo([], [arraydescr], [], [arraydescr],
+ oopspecindex=EffectInfo.OS_ARRAYCOPY))
for _name, _os in [
('strconcatdescr', 'OS_STR_CONCAT'),
diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py
--- a/pypy/objspace/std/intobject.py
+++ b/pypy/objspace/std/intobject.py
@@ -1,12 +1,13 @@
from pypy.interpreter.error import OperationError
from pypy.objspace.std import newformat
+from pypy.objspace.std.inttype import wrapint
from pypy.objspace.std.model import registerimplementation, W_Object
-from pypy.objspace.std.register_all import register_all
from pypy.objspace.std.multimethod import FailedToImplementArgs
from pypy.objspace.std.noneobject import W_NoneObject
+from pypy.objspace.std.register_all import register_all
+from pypy.rlib import jit
from pypy.rlib.rarithmetic import ovfcheck, ovfcheck_lshift, LONG_BIT, r_uint
from pypy.rlib.rbigint import rbigint
-from pypy.objspace.std.inttype import wrapint
"""
In order to have the same behavior running
@@ -169,7 +170,8 @@
# helper for pow()
-def _impl_int_int_pow(space, iv, iw, iz=0):
+ at jit.look_inside_iff(lambda space, iv, iw, iz: jit.isconstant(iw) and jit.isconstant(iz))
+def _impl_int_int_pow(space, iv, iw, iz):
if iw < 0:
if iz != 0:
raise OperationError(space.w_TypeError,
@@ -211,7 +213,7 @@
def pow__Int_Int_None(space, w_int1, w_int2, w_int3):
x = w_int1.intval
y = w_int2.intval
- return space.wrap(_impl_int_int_pow(space, x, y))
+ return space.wrap(_impl_int_int_pow(space, x, y, 0))
def neg__Int(space, w_int1):
a = w_int1.intval
diff --git a/pypy/objspace/std/listobject.py b/pypy/objspace/std/listobject.py
--- a/pypy/objspace/std/listobject.py
+++ b/pypy/objspace/std/listobject.py
@@ -386,7 +386,11 @@
if len(items)== 0:
raise OperationError(space.w_IndexError,
space.wrap("pop from empty list"))
- idx = space.int_w(w_idx)
+ if space.isinstance_w(w_idx, space.w_float):
+ raise OperationError(space.w_TypeError,
+ space.wrap("integer argument expected, got float")
+ )
+ idx = space.int_w(space.int(w_idx))
try:
return items.pop(idx)
except IndexError:
diff --git a/pypy/objspace/std/test/test_listobject.py b/pypy/objspace/std/test/test_listobject.py
--- a/pypy/objspace/std/test/test_listobject.py
+++ b/pypy/objspace/std/test/test_listobject.py
@@ -705,6 +705,20 @@
l.pop()
assert l == range(9)
+ def test_pop_custom_int(self):
+ class A(object):
+ def __init__(self, x):
+ self.x = x
+
+ def __int__(self):
+ return self.x
+
+ l = range(10)
+ x = l.pop(A(-1))
+ assert x == 9
+ assert l == range(9)
+ raises(TypeError, range(10).pop, 1.0)
+
def test_remove(self):
c = list('hello world')
c.remove('l')
diff --git a/pypy/objspace/std/test/test_typeobject.py b/pypy/objspace/std/test/test_typeobject.py
--- a/pypy/objspace/std/test/test_typeobject.py
+++ b/pypy/objspace/std/test/test_typeobject.py
@@ -126,6 +126,12 @@
raises(TypeError, type, 'test', 42, {})
raises(TypeError, type, 'test', (object,), 42)
+ def test_call_type_subclass(self):
+ class A(type):
+ pass
+
+ assert A("hello") is str
+
def test_bases(self):
assert int.__bases__ == (object,)
class X:
diff --git a/pypy/objspace/std/typeobject.py b/pypy/objspace/std/typeobject.py
--- a/pypy/objspace/std/typeobject.py
+++ b/pypy/objspace/std/typeobject.py
@@ -822,14 +822,6 @@
def call__Type(space, w_type, __args__):
promote(w_type)
- # special case for type(x)
- if space.is_w(w_type, space.w_type):
- try:
- w_obj, = __args__.fixedunpack(1)
- except ValueError:
- pass
- else:
- return space.type(w_obj)
# invoke the __new__ of the type
if not we_are_jitted():
# note that the annotator will figure out that w_type.w_bltin_new can
diff --git a/pypy/objspace/std/typetype.py b/pypy/objspace/std/typetype.py
--- a/pypy/objspace/std/typetype.py
+++ b/pypy/objspace/std/typetype.py
@@ -1,17 +1,28 @@
-from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter import gateway
from pypy.interpreter.argument import Arguments
+from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.typedef import (GetSetProperty, descr_get_dict,
weakref_descr)
from pypy.objspace.std.stdtypedef import StdTypeDef
-def descr__new__(space, w_typetype, w_name, w_bases, w_dict):
+
+def descr__new__(space, w_typetype, w_name, w_bases=gateway.NoneNotWrapped,
+ w_dict=gateway.NoneNotWrapped):
+
"This is used to create user-defined classes only."
from pypy.objspace.std.typeobject import W_TypeObject
# XXX check types
w_typetype = _precheck_for_new(space, w_typetype)
+ # special case for type(x)
+ if (space.is_w(space.type(w_typetype), space.w_type) and w_bases is None and
+ w_dict is None):
+ return space.type(w_name)
+ elif w_bases is None or w_dict is None:
+ raise OperationError(space.w_TypeError, space.wrap("type() takes 1 or 3 arguments"))
+
+
bases_w = space.fixedview(w_bases)
w_winner = w_typetype
diff --git a/pypy/rlib/jit.py b/pypy/rlib/jit.py
--- a/pypy/rlib/jit.py
+++ b/pypy/rlib/jit.py
@@ -167,10 +167,7 @@
This is for advanced usage only.
"""
- # I hate the annotator so much.
- if NonConstant(False):
- return True
- return False
+ return NonConstant(False)
@oopspec("jit.isvirtual(value)")
@specialize.ll()
diff --git a/pypy/rlib/rgc.py b/pypy/rlib/rgc.py
--- a/pypy/rlib/rgc.py
+++ b/pypy/rlib/rgc.py
@@ -3,6 +3,7 @@
from pypy.rlib import jit
from pypy.rlib.objectmodel import we_are_translated, enforceargs, specialize
+from pypy.rlib.nonconst import NonConstant
from pypy.rpython.extregistry import ExtRegistryEntry
from pypy.rpython.lltypesystem import lltype, llmemory
@@ -143,6 +144,10 @@
from pypy.rpython.lltypesystem.lloperation import llop
from pypy.rlib.objectmodel import keepalive_until_here
+ # XXX: Hack to ensure that we get a proper effectinfo.write_descrs_arrays
+ if NonConstant(False):
+ dest[dest_start] = source[source_start]
+
# supports non-overlapping copies only
if not we_are_translated():
if source == dest:
diff --git a/pypy/rlib/test/test_jit.py b/pypy/rlib/test/test_jit.py
--- a/pypy/rlib/test/test_jit.py
+++ b/pypy/rlib/test/test_jit.py
@@ -1,7 +1,7 @@
import py
from pypy.conftest import option
from pypy.rlib.jit import hint, we_are_jitted, JitDriver, elidable_promote
-from pypy.rlib.jit import JitHintError, oopspec
+from pypy.rlib.jit import JitHintError, oopspec, isconstant
from pypy.translator.translator import TranslationContext, graphof
from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin, OORtypeMixin
from pypy.rpython.lltypesystem import lltype
@@ -137,6 +137,16 @@
t.view()
# assert did not raise
+ def test_isconstant(self):
+ def f(n):
+ assert n >= 0
+ assert isconstant(n) is False
+ l = []
+ l.append(n)
+ return len(l)
+ res = self.interpret(f, [234])
+ assert res == 1
+
class TestJITLLtype(BaseTestJIT, LLRtypeMixin):
pass
diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py
--- a/pypy/translator/c/genc.py
+++ b/pypy/translator/c/genc.py
@@ -563,7 +563,10 @@
else:
mk.definition('PYPY_MAIN_FUNCTION', "main")
- if sys.platform == 'win32':
+ if (py.path.local.sysfind('python') or
+ py.path.local.sysfind('python.exe')):
+ python = 'python '
+ elif sys.platform == 'win32':
python = sys.executable.replace('\\', '/') + ' '
else:
python = sys.executable + ' '
More information about the pypy-commit
mailing list