Author: Philip Jenvey <[email protected]>
Branch: py3k
Changeset: r60355:99491555f303
Date: 2013-01-22 18:10 -0800
http://bitbucket.org/pypy/pypy/changeset/99491555f303/
Log: merge default
diff --git a/pypy/doc/arm.rst b/pypy/doc/arm.rst
--- a/pypy/doc/arm.rst
+++ b/pypy/doc/arm.rst
@@ -130,15 +130,7 @@
export SB2=/srv/chroot/precise_arm
export SB2OPT='-t ARM'
-Once this is set, you can call the translator
-
-::
-
- pypy ~/path_to_pypy_checkout/pypy/translator/goal/translate.py -O1
--platform=arm target.py
-
-If everything worked correctly this should yield an ARM binary. Running this
binary in the ARM chroot or on an ARM device should produce the output ``"Hello
World"``.
-
-.. _`this`:
+Once this is set, you can call the translator. For example save this file
::
@@ -148,3 +140,22 @@
def target(*args):
return main, None
+
+and call the translator
+
+::
+
+ pypy ~/path_to_pypy_checkout/pypy/translator/goal/translate.py -O1
--platform=arm target.py
+
+If everything worked correctly this should yield an ARM binary. Running this
binary in the ARM chroot or on an ARM device should produce the output ``"Hello
World"``.
+
+To translate the full python pypy interpreter with a jit, you can cd into
pypy/goal and call
+
+::
+
+ pypy <path to rpython>/rpython/translator/goal/translate.py -Ojit
--platform=arm --gcrootfinder=shadowstack --jit-backend=arm
targetpypystandalone.py
+
+The gcrootfinder option is needed to work around `issue 1377`_ and the
jit-backend works around `issue 1376`_
+
+.. _`issue 1377`: https://bugs.pypy.org/issue1377
+.. _`issue 1376`: https://bugs.pypy.org/issue1376
diff --git a/pypy/goal/__init__.py b/pypy/goal/__init__.py
new file mode 100644
--- /dev/null
+++ b/pypy/goal/__init__.py
@@ -0,0 +1,1 @@
+#empty
diff --git a/pypy/interpreter/astcompiler/codegen.py
b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -985,8 +985,9 @@
def visit_Set(self, s):
self.update_position(s.lineno)
+ elt_count = len(s.elts) if s.elts is not None else 0
self.visit_sequence(s.elts)
- self.emit_op_arg(ops.BUILD_SET, len(s.elts))
+ self.emit_op_arg(ops.BUILD_SET, elt_count)
def visit_Name(self, name):
self.update_position(name.lineno)
diff --git a/pypy/interpreter/test2/test_targetpypy.py
b/pypy/interpreter/test2/test_targetpypy.py
--- a/pypy/interpreter/test2/test_targetpypy.py
+++ b/pypy/interpreter/test2/test_targetpypy.py
@@ -1,6 +1,6 @@
import py
-from goal.targetpypystandalone import get_entry_point
+from pypy.goal.targetpypystandalone import get_entry_point
from pypy.config.pypyoption import get_pypy_config
class TestTargetPyPy(object):
diff --git a/pypy/module/_ast/test/test_ast.py
b/pypy/module/_ast/test/test_ast.py
--- a/pypy/module/_ast/test/test_ast.py
+++ b/pypy/module/_ast/test/test_ast.py
@@ -282,6 +282,12 @@
])
exec(compile(body, '<string>', 'exec'))
+ def test_empty_set(self):
+ import ast
+ m = ast.Module(body=[ast.Expr(value=ast.Set(elts=[]))])
+ ast.fix_missing_locations(m)
+ compile(m, "<test>", "exec")
+
def test_invalid_sum(self):
import _ast as ast
pos = dict(lineno=2, col_offset=3)
diff --git a/pypy/module/cpyext/include/ceval.h
b/pypy/module/cpyext/include/ceval.h
new file mode 100644
--- /dev/null
+++ b/pypy/module/cpyext/include/ceval.h
@@ -0,0 +1,1 @@
+/* empty */
diff --git a/pypy/module/cpyext/test/conftest.py
b/pypy/module/cpyext/test/conftest.py
--- a/pypy/module/cpyext/test/conftest.py
+++ b/pypy/module/cpyext/test/conftest.py
@@ -1,6 +1,15 @@
import py
import pytest
+def pytest_configure(config):
+ from pypy.tool.pytest.objspace import gettestobjspace
+ # For some reason (probably a ll2ctypes cache issue on linux64)
+ # it's necessary to run "import time" at least once before any
+ # other cpyext test, otherwise the same statement will fail in
+ # test_datetime.py.
+ space = gettestobjspace(usemodules=['rctime'])
+ space.getbuiltinmodule("time")
+
def pytest_ignore_collect(path, config):
if config.option.runappdirect:
return True # "cannot be run by py.test -A"
diff --git a/pypy/module/micronumpy/arrayimpl/scalar.py
b/pypy/module/micronumpy/arrayimpl/scalar.py
--- a/pypy/module/micronumpy/arrayimpl/scalar.py
+++ b/pypy/module/micronumpy/arrayimpl/scalar.py
@@ -34,6 +34,9 @@
def get_shape(self):
return []
+ def get_strides(self):
+ return []
+
def create_iter(self, shape=None):
return ScalarIterator(self.value)
diff --git a/pypy/module/micronumpy/interp_numarray.py
b/pypy/module/micronumpy/interp_numarray.py
--- a/pypy/module/micronumpy/interp_numarray.py
+++ b/pypy/module/micronumpy/interp_numarray.py
@@ -40,6 +40,10 @@
self.implementation = self.implementation.set_shape(space,
get_shape_from_iterable(space, self.get_size(), w_new_shape))
+ def descr_get_strides(self, space):
+ strides = self.implementation.get_strides()
+ return space.newtuple([space.wrap(i) for i in strides])
+
def get_dtype(self):
return self.implementation.dtype
@@ -645,6 +649,7 @@
dtype = GetSetProperty(W_NDimArray.descr_get_dtype),
shape = GetSetProperty(W_NDimArray.descr_get_shape,
W_NDimArray.descr_set_shape),
+ strides = GetSetProperty(W_NDimArray.descr_get_strides),
ndim = GetSetProperty(W_NDimArray.descr_get_ndim),
size = GetSetProperty(W_NDimArray.descr_get_size),
itemsize = GetSetProperty(W_NDimArray.descr_get_itemsize),
diff --git a/pypy/module/micronumpy/test/test_numarray.py
b/pypy/module/micronumpy/test/test_numarray.py
--- a/pypy/module/micronumpy/test/test_numarray.py
+++ b/pypy/module/micronumpy/test/test_numarray.py
@@ -684,6 +684,18 @@
assert a.reshape([1]).shape == (1,)
raises(ValueError, "a.reshape(3)")
+ def test_strides(self):
+ from _numpypy import array
+ a = array([[1.0, 2.0],
+ [3.0, 4.0]])
+ assert a.strides == (16, 8)
+ assert a[1:].strides == (16, 8)
+
+ def test_strides_scalar(self):
+ from _numpypy import array
+ a = array(42)
+ assert a.strides == ()
+
def test_add(self):
from _numpypy import array
a = array(range(5))
diff --git a/pypy/module/rctime/interp_time.py
b/pypy/module/rctime/interp_time.py
--- a/pypy/module/rctime/interp_time.py
+++ b/pypy/module/rctime/interp_time.py
@@ -447,10 +447,6 @@
space.warn("Century info guessed for a 2-digit year.",
space.w_DeprecationWarning)
- if rffi.getintfield(glob_buf, 'c_tm_wday') < 0:
- raise OperationError(space.w_ValueError,
- space.wrap("day of week out of range"))
-
rffi.setintfield(glob_buf, 'c_tm_year', y - 1900)
rffi.setintfield(glob_buf, 'c_tm_mon',
rffi.getintfield(glob_buf, 'c_tm_mon') - 1)
@@ -459,6 +455,12 @@
rffi.setintfield(glob_buf, 'c_tm_yday',
rffi.getintfield(glob_buf, 'c_tm_yday') - 1)
+ # tm_wday does not need checking of its upper-bound since taking "%
+ # 7" in gettmarg() automatically restricts the range.
+ if rffi.getintfield(glob_buf, 'c_tm_wday') < 0:
+ raise OperationError(space.w_ValueError,
+ space.wrap("day of week out of range"))
+
return glob_buf
def time(space):
diff --git a/pypy/module/rctime/test/test_rctime.py
b/pypy/module/rctime/test/test_rctime.py
--- a/pypy/module/rctime/test/test_rctime.py
+++ b/pypy/module/rctime/test/test_rctime.py
@@ -113,6 +113,9 @@
if os.name != 'nt':
assert rctime.mktime(rctime.localtime(-1)) == -1
+ res = rctime.mktime((2000, 1, 1, 0, 0, 0, -1, -1, -1))
+ assert rctime.ctime(res) == 'Sat Jan 1 00:00:00 2000'
+
def test_asctime(self):
import time as rctime
rctime.asctime()
diff --git a/pypy/module/unicodedata/test/test_unicodedata.py
b/pypy/module/unicodedata/test/test_unicodedata.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/unicodedata/test/test_unicodedata.py
@@ -0,0 +1,105 @@
+import py
+import sys
+
+class AppTestUnicodeData:
+ spaceconfig = dict(usemodules=('unicodedata',))
+
+ def test_hangul_syllables(self):
+ import unicodedata
+ # Test all leading, vowel and trailing jamo
+ # but not every combination of them.
+ for code, name in ((0xAC00, 'HANGUL SYLLABLE GA'),
+ (0xAE69, 'HANGUL SYLLABLE GGAEG'),
+ (0xB0D2, 'HANGUL SYLLABLE NYAGG'),
+ (0xB33B, 'HANGUL SYLLABLE DYAEGS'),
+ (0xB5A4, 'HANGUL SYLLABLE DDEON'),
+ (0xB80D, 'HANGUL SYLLABLE RENJ'),
+ (0xBA76, 'HANGUL SYLLABLE MYEONH'),
+ (0xBCDF, 'HANGUL SYLLABLE BYED'),
+ (0xBF48, 'HANGUL SYLLABLE BBOL'),
+ (0xC1B1, 'HANGUL SYLLABLE SWALG'),
+ (0xC41A, 'HANGUL SYLLABLE SSWAELM'),
+ (0xC683, 'HANGUL SYLLABLE OELB'),
+ (0xC8EC, 'HANGUL SYLLABLE JYOLS'),
+ (0xCB55, 'HANGUL SYLLABLE JJULT'),
+ (0xCDBE, 'HANGUL SYLLABLE CWEOLP'),
+ (0xD027, 'HANGUL SYLLABLE KWELH'),
+ (0xD290, 'HANGUL SYLLABLE TWIM'),
+ (0xD4F9, 'HANGUL SYLLABLE PYUB'),
+ (0xD762, 'HANGUL SYLLABLE HEUBS'),
+ (0xAE27, 'HANGUL SYLLABLE GYIS'),
+ (0xB090, 'HANGUL SYLLABLE GGISS'),
+ (0xB0AD, 'HANGUL SYLLABLE NANG'),
+ (0xB316, 'HANGUL SYLLABLE DAEJ'),
+ (0xB57F, 'HANGUL SYLLABLE DDYAC'),
+ (0xB7E8, 'HANGUL SYLLABLE RYAEK'),
+ (0xBA51, 'HANGUL SYLLABLE MEOT'),
+ (0xBCBA, 'HANGUL SYLLABLE BEP'),
+ (0xBF23, 'HANGUL SYLLABLE BBYEOH'),
+ (0xD7A3, 'HANGUL SYLLABLE HIH')):
+ assert unicodedata.name(chr(code)) == name
+ assert unicodedata.lookup(name) == chr(code)
+ # Test outside the range
+ raises(ValueError, unicodedata.name, chr(0xAC00 - 1))
+ raises(ValueError, unicodedata.name, chr(0xD7A3 + 1))
+
+ def test_cjk(self):
+ import sys
+ import unicodedata
+ cases = ((0x3400, 0x4DB5),
+ (0x4E00, 0x9FA5))
+ if unicodedata.unidata_version >= "5": # don't know the exact limit
+ cases = ((0x3400, 0x4DB5),
+ (0x4E00, 0x9FCB),
+ (0x20000, 0x2A6D6),
+ (0x2A700, 0x2B734))
+ elif unicodedata.unidata_version >= "4.1":
+ cases = ((0x3400, 0x4DB5),
+ (0x4E00, 0x9FBB),
+ (0x20000, 0x2A6D6))
+ for first, last in cases:
+ # Test at and inside the boundary
+ for i in (first, first + 1, last - 1, last):
+ charname = 'CJK UNIFIED IDEOGRAPH-%X'%i
+ char = chr(i)
+ assert unicodedata.name(char) == charname
+ assert unicodedata.lookup(charname) == char
+ # Test outside the boundary
+ for i in first - 1, last + 1:
+ charname = 'CJK UNIFIED IDEOGRAPH-%X'%i
+ char = chr(i)
+ try:
+ unicodedata.name(char)
+ except ValueError as e:
+ assert e.message == 'no such name'
+ raises(KeyError, unicodedata.lookup, charname)
+
+ def test_bug_1704793(self): # from CPython
+ import unicodedata
+ assert unicodedata.lookup("GOTHIC LETTER FAIHU") == '\U00010346'
+
+ def test_normalize(self):
+ import unicodedata
+ raises(TypeError, unicodedata.normalize, 'x')
+
+ @py.test.mark.skipif("sys.maxunicode < 0x10ffff",
+ reason="requires a 'wide' python build.")
+ def test_normalize_wide(self):
+ import unicodedata
+ assert unicodedata.normalize('NFC', '\U000110a5\U000110ba') ==
u'\U000110ab'
+
+ def test_linebreaks(self):
+ linebreaks = (0x0a, 0x0b, 0x0c, 0x0d, 0x85,
+ 0x1c, 0x1d, 0x1e, 0x2028, 0x2029)
+ for i in linebreaks:
+ for j in range(-2, 3):
+ lines = (chr(i + j) + 'A').splitlines()
+ if i + j in linebreaks:
+ assert len(lines) == 2
+ else:
+ assert len(lines) == 1
+
+ def test_mirrored(self):
+ import unicodedata
+ # For no reason, unicodedata.mirrored() returns an int, not a bool
+ assert repr(unicodedata.mirrored(' ')) == '0'
diff --git a/pypy/module/unicodedata/test_unicodedata.py
b/pypy/module/unicodedata/test_unicodedata.py
deleted file mode 100644
--- a/pypy/module/unicodedata/test_unicodedata.py
+++ /dev/null
@@ -1,103 +0,0 @@
-
-class AppTestUnicodeData:
- spaceconfig = dict(usemodules=('unicodedata',))
-
- def test_hangul_syllables(self):
- import unicodedata
- # Test all leading, vowel and trailing jamo
- # but not every combination of them.
- for code, name in ((0xAC00, 'HANGUL SYLLABLE GA'),
- (0xAE69, 'HANGUL SYLLABLE GGAEG'),
- (0xB0D2, 'HANGUL SYLLABLE NYAGG'),
- (0xB33B, 'HANGUL SYLLABLE DYAEGS'),
- (0xB5A4, 'HANGUL SYLLABLE DDEON'),
- (0xB80D, 'HANGUL SYLLABLE RENJ'),
- (0xBA76, 'HANGUL SYLLABLE MYEONH'),
- (0xBCDF, 'HANGUL SYLLABLE BYED'),
- (0xBF48, 'HANGUL SYLLABLE BBOL'),
- (0xC1B1, 'HANGUL SYLLABLE SWALG'),
- (0xC41A, 'HANGUL SYLLABLE SSWAELM'),
- (0xC683, 'HANGUL SYLLABLE OELB'),
- (0xC8EC, 'HANGUL SYLLABLE JYOLS'),
- (0xCB55, 'HANGUL SYLLABLE JJULT'),
- (0xCDBE, 'HANGUL SYLLABLE CWEOLP'),
- (0xD027, 'HANGUL SYLLABLE KWELH'),
- (0xD290, 'HANGUL SYLLABLE TWIM'),
- (0xD4F9, 'HANGUL SYLLABLE PYUB'),
- (0xD762, 'HANGUL SYLLABLE HEUBS'),
- (0xAE27, 'HANGUL SYLLABLE GYIS'),
- (0xB090, 'HANGUL SYLLABLE GGISS'),
- (0xB0AD, 'HANGUL SYLLABLE NANG'),
- (0xB316, 'HANGUL SYLLABLE DAEJ'),
- (0xB57F, 'HANGUL SYLLABLE DDYAC'),
- (0xB7E8, 'HANGUL SYLLABLE RYAEK'),
- (0xBA51, 'HANGUL SYLLABLE MEOT'),
- (0xBCBA, 'HANGUL SYLLABLE BEP'),
- (0xBF23, 'HANGUL SYLLABLE BBYEOH'),
- (0xD7A3, 'HANGUL SYLLABLE HIH')):
- assert unicodedata.name(chr(code)) == name
- assert unicodedata.lookup(name) == chr(code)
- # Test outside the range
- raises(ValueError, unicodedata.name, chr(0xAC00 - 1))
- raises(ValueError, unicodedata.name, chr(0xD7A3 + 1))
-
- def test_cjk(self):
- import sys
- import unicodedata
- cases = ((0x3400, 0x4DB5),
- (0x4E00, 0x9FA5))
- if unicodedata.unidata_version >= "5": # don't know the exact limit
- cases = ((0x3400, 0x4DB5),
- (0x4E00, 0x9FCB),
- (0x20000, 0x2A6D6),
- (0x2A700, 0x2B734))
- elif unicodedata.unidata_version >= "4.1":
- cases = ((0x3400, 0x4DB5),
- (0x4E00, 0x9FBB),
- (0x20000, 0x2A6D6))
- for first, last in cases:
- # Test at and inside the boundary
- for i in (first, first + 1, last - 1, last):
- charname = 'CJK UNIFIED IDEOGRAPH-%X'%i
- char = chr(i)
- assert unicodedata.name(char) == charname
- assert unicodedata.lookup(charname) == char
- # Test outside the boundary
- for i in first - 1, last + 1:
- charname = 'CJK UNIFIED IDEOGRAPH-%X'%i
- char = chr(i)
- try:
- unicodedata.name(char)
- except ValueError as e:
- assert e.message == 'no such name'
- raises(KeyError, unicodedata.lookup, charname)
-
- def test_bug_1704793(self): # from CPython
- import unicodedata
- assert unicodedata.lookup("GOTHIC LETTER FAIHU") == '\U00010346'
-
- def test_normalize(self):
- import unicodedata
- raises(TypeError, unicodedata.normalize, 'x')
-
- def test_normalize_wide(self):
- import sys, unicodedata
- if sys.maxunicode < 0x10ffff:
- skip("requires a 'wide' python build.")
- assert unicodedata.normalize('NFC', '\U000110a5\U000110ba') ==
'\U000110ab'
-
- def test_linebreaks(self):
- linebreaks = (0x0a, 0x0b, 0x0c, 0x0d, 0x85,
- 0x1c, 0x1d, 0x1e, 0x2028, 0x2029)
- for i in linebreaks:
- for j in range(-2, 3):
- lines = (chr(i + j) + 'A').splitlines()
- if i + j in linebreaks:
- assert len(lines) == 2
- else:
- assert len(lines) == 1
-
- def test_mirrored(self):
- import unicodedata
- # For no reason, unicodedata.mirrored() returns an int, not a bool
- assert repr(unicodedata.mirrored(' ')) == '0'
diff --git a/pypy/pytest-A.cfg b/pypy/pytest-A.cfg
--- a/pypy/pytest-A.cfg
+++ b/pypy/pytest-A.cfg
@@ -1,5 +1,5 @@
cherrypick = ['interpreter', 'objspace/test', 'objspace/std', 'module']
-interp = ['translator/goal/pypy-c']
+interp = ['goal/pypy-c']
test_driver = ['test_all.py', '-A']
diff --git a/pypy/test_all.py b/pypy/test_all.py
--- a/pypy/test_all.py
+++ b/pypy/test_all.py
@@ -23,7 +23,8 @@
if len(sys.argv) == 1 and os.path.dirname(sys.argv[0]) in '.':
print >> sys.stderr, __doc__
sys.exit(2)
-
+ #Add toplevel repository dir to sys.path
+ sys.path.insert(0,os.path.dirname(os.path.dirname(__file__)))
import pytest
import pytest_cov
sys.exit(pytest.main(plugins=[pytest_cov]))
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
@@ -11,8 +11,10 @@
import shutil
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__)))))
import py
-import os
import fnmatch
from rpython.tool.udir import udir
diff --git a/pypy/bin/translatorshell.py b/rpython/bin/translatorshell.py
rename from pypy/bin/translatorshell.py
rename to rpython/bin/translatorshell.py
diff --git a/rpython/jit/backend/arm/test/support.py
b/rpython/jit/backend/arm/test/support.py
--- a/rpython/jit/backend/arm/test/support.py
+++ b/rpython/jit/backend/arm/test/support.py
@@ -14,6 +14,9 @@
def check_jumps(self, maxcount):
pass
+if not getattr(os, 'uname', None):
+ pytest.skip('cannot run arm tests on non-posix platform')
+
if os.uname()[1] == 'llaima.local':
AS =
'~/Code/arm-jit/android/android-ndk-r4b//build/prebuilt/darwin-x86/arm-eabi-4.4.0/arm-eabi/bin/as'
else:
diff --git a/rpython/rlib/parsing/test/test_pcre_regtest.py
b/rpython/rlib/parsing/test/test_pcre_regtest.py
--- a/rpython/rlib/parsing/test/test_pcre_regtest.py
+++ b/rpython/rlib/parsing/test/test_pcre_regtest.py
@@ -84,8 +84,7 @@
from rpython.rlib.parsing.regexparse import make_runner, unescape
import string
import re
-import os
-this_dir = py.path.local(os.path.realpath(os.path.dirname(__file__)))
+this_dir = py.path.local(__file__).join('..')
#py.test.skip("Still in progress")
diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -131,7 +131,7 @@
self.secondary_entrypoints = secondary_entrypoints
def get_eci(self):
- pypy_include_dir =
py.path.local(os.path.realpath(os.path.dirname(__file__)))
+ pypy_include_dir = py.path.local(__file__).join('..')
include_dirs = [pypy_include_dir]
return ExternalCompilationInfo(include_dirs=include_dirs)
@@ -753,7 +753,7 @@
defines['PYPY_LONGLONG_BIT'] = LONGLONG_BIT
def add_extra_files(eci):
- srcdir =
py.path.local(os.path.realpath(os.path.dirname(__file__))).join('src')
+ srcdir = py.path.local(__file__).join('..', 'src')
files = [
srcdir / 'entrypoint.c', # ifdef PYPY_STANDALONE
srcdir / 'allocator.c', # ifdef PYPY_STANDALONE
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
@@ -5,7 +5,7 @@
from rpython.translator.platform import Platform, log, _run_subprocess
import rpython
-rpydir = os.path.dirname(rpython.__file__)
+rpydir = str(py.path.local(rpython.__file__).join('..'))
class BasePosix(Platform):
exe_ext = ''
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
@@ -7,7 +7,7 @@
from rpython.translator.platform import Platform, posix
import rpython
-rpydir = os.path.dirname(rpython.__file__)
+rpydir = str(py.path.local(rpython.__file__).join('..'))
def _get_compiler_type(cc, x64_flag):
import subprocess
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit