Author: Christian Tismer <tis...@stackless.com> Branch: win64-stage1 Changeset: r53643:29df57a1a3a9 Date: 2012-03-14 19:38 -0700 http://bitbucket.org/pypy/pypy/changeset/29df57a1a3a9/
Log: merge default diff --git a/pypy/bin/rpython b/pypy/bin/rpython new file mode 100755 --- /dev/null +++ b/pypy/bin/rpython @@ -0,0 +1,18 @@ +#!/usr/bin/env pypy + +"""RPython translation usage: + +rpython <translation options> target <targetoptions> + +run with --help for more information +""" + +import sys +from pypy.translator.goal.translate import main + +# no implicit targets +if len(sys.argv) == 1: + print __doc__ + sys.exit(1) + +main() diff --git a/pypy/interpreter/test/test_compiler.py b/pypy/interpreter/test/test_compiler.py --- a/pypy/interpreter/test/test_compiler.py +++ b/pypy/interpreter/test/test_compiler.py @@ -794,7 +794,7 @@ def test_tuple_constants(self): ns = {} exec "x = (1, 0); y = (1L, 0L)" in ns - assert isinstance(ns["x"][0], (int, long)) + assert isinstance(ns["x"][0], int) assert isinstance(ns["y"][0], long) def test_division_folding(self): diff --git a/pypy/module/cpyext/api.py b/pypy/module/cpyext/api.py --- a/pypy/module/cpyext/api.py +++ b/pypy/module/cpyext/api.py @@ -824,6 +824,8 @@ pypy_decls.append("#ifdef __cplusplus") pypy_decls.append("extern \"C\" {") pypy_decls.append("#endif\n") + pypy_decls.append('#define Signed long /* xxx temporary fix */\n') + pypy_decls.append('#define Unsigned unsigned long /* xxx temporary fix */\n') for decl in FORWARD_DECLS: pypy_decls.append("%s;" % (decl,)) @@ -855,6 +857,8 @@ typ = 'PyObject*' pypy_decls.append('PyAPI_DATA(%s) %s;' % (typ, name)) + pypy_decls.append('#undef Signed /* xxx temporary fix */\n') + pypy_decls.append('#undef Unsigned /* xxx temporary fix */\n') pypy_decls.append("#ifdef __cplusplus") pypy_decls.append("}") pypy_decls.append("#endif") diff --git a/pypy/module/cpyext/stringobject.py b/pypy/module/cpyext/stringobject.py --- a/pypy/module/cpyext/stringobject.py +++ b/pypy/module/cpyext/stringobject.py @@ -130,6 +130,11 @@ @cpython_api([PyObject], rffi.CCHARP, error=0) def PyString_AsString(space, ref): + if from_ref(space, rffi.cast(PyObject, ref.c_ob_type)) is space.w_str: + pass # typecheck returned "ok" without forcing 'ref' at all + elif not PyString_Check(space, ref): # otherwise, use the alternate way + raise OperationError(space.w_TypeError, space.wrap( + "PyString_AsString only support strings")) ref_str = rffi.cast(PyStringObject, ref) if not ref_str.c_buffer: # copy string buffer diff --git a/pypy/module/cpyext/test/test_longobject.py b/pypy/module/cpyext/test/test_longobject.py --- a/pypy/module/cpyext/test/test_longobject.py +++ b/pypy/module/cpyext/test/test_longobject.py @@ -101,9 +101,9 @@ space.wrap((2, 7)))): py.test.skip("unsupported before Python 2.7") - assert api._PyLong_Sign(space.wrap(0L)) == 0 - assert api._PyLong_Sign(space.wrap(2L)) == 1 - assert api._PyLong_Sign(space.wrap(-2L)) == -1 + assert api._PyLong_Sign(space.wraplong(0L)) == 0 + assert api._PyLong_Sign(space.wraplong(2L)) == 1 + assert api._PyLong_Sign(space.wraplong(-2L)) == -1 assert api._PyLong_NumBits(space.wrap(0)) == 0 assert api._PyLong_NumBits(space.wrap(1)) == 1 diff --git a/pypy/module/cpyext/test/test_number.py b/pypy/module/cpyext/test/test_number.py --- a/pypy/module/cpyext/test/test_number.py +++ b/pypy/module/cpyext/test/test_number.py @@ -6,12 +6,12 @@ class TestIterator(BaseApiTest): def test_check(self, space, api): assert api.PyIndex_Check(space.wrap(12)) - assert api.PyIndex_Check(space.wrap(-12L)) + assert api.PyIndex_Check(space.wraplong(-12L)) assert not api.PyIndex_Check(space.wrap(12.1)) assert not api.PyIndex_Check(space.wrap('12')) assert api.PyNumber_Check(space.wrap(12)) - assert api.PyNumber_Check(space.wrap(-12L)) + assert api.PyNumber_Check(space.wraplong(-12L)) assert api.PyNumber_Check(space.wrap(12.1)) assert not api.PyNumber_Check(space.wrap('12')) assert not api.PyNumber_Check(space.wrap(1+3j)) @@ -21,7 +21,7 @@ assert api.PyLong_CheckExact(w_l) def test_number_int(self, space, api): - w_l = api.PyNumber_Int(space.wrap(123L)) + w_l = api.PyNumber_Int(space.wraplong(123L)) assert api.PyInt_CheckExact(w_l) w_l = api.PyNumber_Int(space.wrap(2 << 65)) assert api.PyLong_CheckExact(w_l) @@ -29,7 +29,7 @@ assert api.PyInt_CheckExact(w_l) def test_number_index(self, space, api): - w_l = api.PyNumber_Index(space.wrap(123L)) + w_l = api.PyNumber_Index(space.wraplong(123L)) assert api.PyLong_CheckExact(w_l) w_l = api.PyNumber_Index(space.wrap(42.3)) assert w_l is None 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 @@ -6,7 +6,7 @@ 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, LONG_BIT, r_uint +from pypy.rlib.rarithmetic import ovfcheck, LONG_BIT, r_uint, is_valid_int from pypy.rlib.rbigint import rbigint """ @@ -42,6 +42,7 @@ from pypy.objspace.std.inttype import int_typedef as typedef def __init__(w_self, intval): + assert is_valid_int(intval) w_self.intval = intval def __repr__(w_self): diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py --- a/pypy/objspace/std/objspace.py +++ b/pypy/objspace/std/objspace.py @@ -9,7 +9,7 @@ from pypy.objspace.descroperation import DescrOperation, raiseattrerror from pypy.rlib.objectmodel import instantiate, r_dict, specialize, is_annotation_constant from pypy.rlib.debug import make_sure_not_resized -from pypy.rlib.rarithmetic import base_int, widen, maxint +from pypy.rlib.rarithmetic import base_int, widen, maxint, is_valid_int from pypy.rlib.objectmodel import we_are_translated from pypy.rlib import jit @@ -165,10 +165,6 @@ return self.newbool(x) else: return self.newint(x) - # this is an inlined 'is_valid_int' which cannot be used - # due to the special annotation nature of 'wrap'. - if isinstance(x, long) and (-maxint - 1 <= x <= maxint): - return self.newint(x) if isinstance(x, str): return wrapstr(self, x) if isinstance(x, unicode): @@ -199,6 +195,11 @@ "NOT_RPYTHON" # _____ this code is here to support testing only _____ + # we might get there in non-translated versions if 'x' is + # a long that fits the correct range. + if is_valid_int(x): + return self.newint(x) + # wrap() of a container works on CPython, but the code is # not RPython. Don't use -- it is kept around mostly for tests. # Use instead newdict(), newlist(), newtuple(). @@ -217,17 +218,7 @@ # The following cases are even stranger. # Really really only for tests. if type(x) is long: - if self.config.objspace.std.withsmalllong: - from pypy.rlib.rarithmetic import r_longlong - try: - rx = r_longlong(x) - except OverflowError: - pass - else: - from pypy.objspace.std.smalllongobject import \ - W_SmallLongObject - return W_SmallLongObject(rx) - return W_LongObject.fromlong(x) + return self.wraplong(x) if isinstance(x, slice): return W_SliceObject(self.wrap(x.start), self.wrap(x.stop), @@ -268,6 +259,20 @@ return w_result return None + def wraplong(self, x): + "NOT_RPYTHON" + if self.config.objspace.std.withsmalllong: + from pypy.rlib.rarithmetic import r_longlong + try: + rx = r_longlong(x) + except OverflowError: + pass + else: + from pypy.objspace.std.smalllongobject import \ + W_SmallLongObject + return W_SmallLongObject(rx) + return W_LongObject.fromlong(x) + def unwrap(self, w_obj): """NOT_RPYTHON""" if isinstance(w_obj, Wrappable): diff --git a/pypy/objspace/std/test/test_stringobject.py b/pypy/objspace/std/test/test_stringobject.py --- a/pypy/objspace/std/test/test_stringobject.py +++ b/pypy/objspace/std/test/test_stringobject.py @@ -508,6 +508,8 @@ # Need default encoding utf-8, but sys.setdefaultencoding # is removed after startup. import sys + if not hasattr(sys, 'setdefaultencoding'): + skip("sys.setdefaultencoding() not available") old_encoding = sys.getdefaultencoding() # Duplicate unittest.test_support.CleanImport logic because it won't # import. diff --git a/pypy/rlib/rarithmetic.py b/pypy/rlib/rarithmetic.py --- a/pypy/rlib/rarithmetic.py +++ b/pypy/rlib/rarithmetic.py @@ -140,8 +140,11 @@ maxint = int(LONG_TEST - 1) def is_valid_int(r): - return isinstance(r, (int, long)) and ( + if objectmodel.we_are_translated(): + return isinstance(r, int) + return type(r) in (int, long, bool) and ( -maxint - 1 <= r <= maxint) +is_valid_int._annspecialcase_ = 'specialize:argtype(0)' def ovfcheck(r): "NOT_RPYTHON" diff --git a/pypy/rlib/test/test_rarithmetic.py b/pypy/rlib/test/test_rarithmetic.py --- a/pypy/rlib/test/test_rarithmetic.py +++ b/pypy/rlib/test/test_rarithmetic.py @@ -330,6 +330,15 @@ return a == b py.test.raises(MissingRTypeOperation, "self.interpret(f, [42.0])") + def test_is_valid_int(self): + def f(x): + return (is_valid_int(x) * 4 + + is_valid_int(x > 0) * 2 + + is_valid_int(x + 0.5)) + assert f(123) == 4 + 2 + res = self.interpret(f, [123]) + assert res == 4 + 2 + class TestLLtype(BaseTestRarithmetic, LLRtypeMixin): pass diff --git a/pypy/translator/oosupport/test_template/overflow.py b/pypy/translator/oosupport/test_template/overflow.py --- a/pypy/translator/oosupport/test_template/overflow.py +++ b/pypy/translator/oosupport/test_template/overflow.py @@ -3,9 +3,12 @@ class BaseTestOverflow: - def check(self, fn, args): + def check(self, fn, args, expected=None): res1 = self.interpret(fn, args) - res2 = fn(*args) + if expected is not None: + res2 = expected + else: + res2 = fn(*args) assert res1 == res2 def test_add(self): @@ -63,7 +66,9 @@ return ovfcheck(x % y) except OverflowError: return 42 - self.check(fn, [-sys.maxint-1, -1]) + # force the expected result to be 42, because direct run of ovfcheck() + # cannot detect this particular overflow case + self.check(fn, [-sys.maxint-1, -1], expected=42) def test_div(self): def fn(x, y): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit