[pypy-commit] pypy testing-cleanup-py3k: hg merge py3k
rlamy
pypy.commits at gmail.com
Mon Jun 20 15:19:24 EDT 2016
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch: testing-cleanup-py3k
Changeset: r85262:2713931662a9
Date: 2016-06-20 20:17 +0100
http://bitbucket.org/pypy/pypy/changeset/2713931662a9/
Log: hg merge py3k
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
@@ -5,6 +5,9 @@
.. this is a revision shortly after release-pypy2.7-v5.3
.. startrev: 873218a739f1
+.. pull request #455
+Add sys.{get,set}dlopenflags, for cpyext extensions.
+
.. branch: fix-gen-dfa
Resolves an issue with the generator script to build the dfa for Python syntax.
@@ -22,3 +25,9 @@
.. branch: incminimark-ll_assert
.. branch: vmprof-openbsd
+
+.. branch: testing-cleanup
+
+Simplify handling of interp-level tests and make it more forward-
+compatible.
+
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
@@ -1524,7 +1524,7 @@
try:
ll_libname = rffi.str2charp(path)
try:
- dll = rdynload.dlopen(ll_libname)
+ dll = rdynload.dlopen(ll_libname, space.sys.dlopenflags)
finally:
lltype.free(ll_libname, flavor='raw')
except rdynload.DLOpenError as e:
diff --git a/pypy/module/cpyext/test/test_structseq.py b/pypy/module/cpyext/test/test_structseq.py
--- a/pypy/module/cpyext/test/test_structseq.py
+++ b/pypy/module/cpyext/test/test_structseq.py
@@ -6,6 +6,7 @@
class AppTestStructSeq(AppTestCpythonExtensionBase):
def test_StructSeq(self):
+ skip("XXX: https://bugs.pypy.org/issue1557")
module = self.import_extension('foo',
prologue="""
#include <structseq.h>
diff --git a/pypy/module/sys/__init__.py b/pypy/module/sys/__init__.py
--- a/pypy/module/sys/__init__.py
+++ b/pypy/module/sys/__init__.py
@@ -1,6 +1,7 @@
from pypy.interpreter.mixedmodule import MixedModule
from pypy.interpreter.error import OperationError
from rpython.rlib.objectmodel import we_are_translated
+from rpython.rlib import rdynload
import sys
_WIN = sys.platform == 'win32'
@@ -18,6 +19,7 @@
self.defaultencoding = "utf-8"
self.filesystemencoding = None
self.debug = True
+ self.dlopenflags = rdynload._dlopen_default_mode()
interpleveldefs = {
'__name__' : '(space.wrap("sys"))',
@@ -79,6 +81,8 @@
'int_info' : 'system.get_int_info(space)',
'hash_info' : 'system.get_hash_info(space)',
'float_repr_style' : 'system.get_float_repr_style(space)',
+ 'getdlopenflags' : 'system.getdlopenflags',
+ 'setdlopenflags' : 'system.setdlopenflags',
}
if sys.platform == 'win32':
diff --git a/pypy/module/sys/system.py b/pypy/module/sys/system.py
--- a/pypy/module/sys/system.py
+++ b/pypy/module/sys/system.py
@@ -108,3 +108,9 @@
]
w_thread_info = app.wget(space, "thread_info")
return space.call_function(w_thread_info, space.newtuple(info_w))
+
+def getdlopenflags(space):
+ return space.wrap(space.sys.dlopenflags)
+
+def setdlopenflags(space, w_flags):
+ space.sys.dlopenflags = space.int_w(w_flags)
diff --git a/pypy/module/sys/test/test_sysmodule.py b/pypy/module/sys/test/test_sysmodule.py
--- a/pypy/module/sys/test/test_sysmodule.py
+++ b/pypy/module/sys/test/test_sysmodule.py
@@ -478,14 +478,12 @@
def test_dlopenflags(self):
import sys
- if hasattr(sys, "setdlopenflags"):
- assert hasattr(sys, "getdlopenflags")
- raises(TypeError, sys.getdlopenflags, 42)
- oldflags = sys.getdlopenflags()
- raises(TypeError, sys.setdlopenflags)
- sys.setdlopenflags(oldflags+1)
- assert sys.getdlopenflags() == oldflags+1
- sys.setdlopenflags(oldflags)
+ raises(TypeError, sys.getdlopenflags, 42)
+ oldflags = sys.getdlopenflags()
+ raises(TypeError, sys.setdlopenflags)
+ sys.setdlopenflags(oldflags+1)
+ assert sys.getdlopenflags() == oldflags+1
+ sys.setdlopenflags(oldflags)
def test_refcount(self):
import sys
@@ -661,7 +659,7 @@
class AppTestSysSettracePortedFromCpython(object):
def test_sys_settrace(self):
import sys
-
+
class Tracer:
def __init__(self):
self.events = []
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -427,11 +427,11 @@
class FakeModule(W_Root):
def __init__(self):
self.w_dict = w_some_obj()
-
def get(self, name):
name + "xx" # check that it's a string
return w_some_obj()
FakeObjSpace.sys = FakeModule()
FakeObjSpace.sys.filesystemencoding = 'foobar'
FakeObjSpace.sys.defaultencoding = 'ascii'
+FakeObjSpace.sys.dlopenflags = 123
FakeObjSpace.builtin = FakeModule()
diff --git a/pypy/objspace/std/stringmethods.py b/pypy/objspace/std/stringmethods.py
--- a/pypy/objspace/std/stringmethods.py
+++ b/pypy/objspace/std/stringmethods.py
@@ -181,6 +181,7 @@
return space.newint(value.count(sub, start, end))
else:
res = count(value, sub, start, end)
+ assert res >= 0
return space.wrap(max(res, 0))
def descr_decode(self, space, w_encoding=None, w_errors=None):
diff --git a/pypy/objspace/std/test/test_bytearrayobject.py b/pypy/objspace/std/test/test_bytearrayobject.py
--- a/pypy/objspace/std/test/test_bytearrayobject.py
+++ b/pypy/objspace/std/test/test_bytearrayobject.py
@@ -218,6 +218,7 @@
check(bytearray(b'abc').replace(b'b', bytearray(b'd')), b'adc')
check(bytearray(b'abc').replace(b'b', b'd'), b'adc')
+ check(bytearray(b'').replace(b'a', b'ab'), b'')
check(bytearray(b'abc').upper(), b'ABC')
check(bytearray(b'ABC').lower(), b'abc')
diff --git a/rpython/rlib/rdynload.py b/rpython/rlib/rdynload.py
--- a/rpython/rlib/rdynload.py
+++ b/rpython/rlib/rdynload.py
@@ -26,7 +26,7 @@
if _MAC_OS:
pre_include_bits = ['#define MACOSX']
-else:
+else:
pre_include_bits = []
if _FREEBSD or _NETBSD or _WIN32:
@@ -145,15 +145,20 @@
else:
return lltype.nullptr(rffi.VOIDP.TO)
+ def _dlopen_default_mode():
+ """ The default dlopen mode if it hasn't been changed by the user.
+ """
+ mode = RTLD_NOW
+ if RTLD_LOCAL is not None:
+ mode |= RTLD_LOCAL
+ return mode
+
def dlopen(name, mode=-1):
""" Wrapper around C-level dlopen
"""
if mode == -1:
- if RTLD_LOCAL is not None:
- mode = RTLD_LOCAL
- else:
- mode = 0
- if (mode & (RTLD_LAZY | RTLD_NOW)) == 0:
+ mode = _dlopen_default_mode()
+ elif (mode & (RTLD_LAZY | RTLD_NOW)) == 0:
mode |= RTLD_NOW
res = c_dlopen(name, rffi.cast(rffi.INT, mode))
if not res:
@@ -193,6 +198,11 @@
DLLHANDLE = rwin32.HMODULE
RTLD_GLOBAL = None
+ def _dlopen_default_mode():
+ """ The default dlopen mode if it hasn't been changed by the user.
+ """
+ return 0
+
def dlopen(name, mode=-1):
# mode is unused on windows, but a consistant signature
res = rwin32.LoadLibrary(name)
diff --git a/rpython/rlib/rstring.py b/rpython/rlib/rstring.py
--- a/rpython/rlib/rstring.py
+++ b/rpython/rlib/rstring.py
@@ -291,6 +291,7 @@
return _search(value, other, start, end, SEARCH_COUNT)
# -------------- substring searching helper ----------------
+# XXX a lot of code duplication with lltypesystem.rstr :-(
SEARCH_COUNT = 0
SEARCH_FIND = 1
@@ -309,6 +310,8 @@
if end > len(value):
end = len(value)
if start > end:
+ if mode == SEARCH_COUNT:
+ return 0
return -1
count = 0
@@ -326,6 +329,8 @@
w = n - m
if w < 0:
+ if mode == SEARCH_COUNT:
+ return 0
return -1
mlast = m - 1
@@ -570,18 +575,20 @@
class ByteListBuilder(object):
def __init__(self, init_size=INIT_SIZE):
+ assert init_size >= 0
self.l = newlist_hint(init_size)
@specialize.argtype(1)
def append(self, s):
+ l = self.l
for c in s:
- self.l.append(c)
+ l.append(c)
@specialize.argtype(1)
def append_slice(self, s, start, end):
- assert 0 <= start <= end <= len(s)
- for c in s[start:end]:
- self.l.append(c)
+ l = self.l
+ for i in xrange(start, end):
+ l.append(s[i])
def append_multiple_char(self, c, times):
assert isinstance(c, str)
@@ -589,8 +596,9 @@
def append_charpsize(self, s, size):
assert size >= 0
+ l = self.l
for i in xrange(size):
- self.l.append(s[i])
+ l.append(s[i])
def build(self):
return self.l
diff --git a/rpython/rlib/test/test_rstring.py b/rpython/rlib/test/test_rstring.py
--- a/rpython/rlib/test/test_rstring.py
+++ b/rpython/rlib/test/test_rstring.py
@@ -231,6 +231,10 @@
check_search(count, 'one two three', 'e', 0, 1, res=0)
check_search(count, 'one two three', '', 0, 13, res=14)
+ check_search(count, '', 'ab', 0, 0, res=0)
+ check_search(count, 'a', 'ab', 0, 1, res=0)
+ check_search(count, 'ac', 'ab', 0, 2, res=0)
+
class TestTranslates(BaseRtypingTest):
def test_split_rsplit(self):
diff --git a/rpython/rtyper/annlowlevel.py b/rpython/rtyper/annlowlevel.py
--- a/rpython/rtyper/annlowlevel.py
+++ b/rpython/rtyper/annlowlevel.py
@@ -348,19 +348,30 @@
_about_ = llhelper
def compute_result_annotation(self, s_F, s_callable):
+ from rpython.annotator.description import FunctionDesc
assert s_F.is_constant()
- assert s_callable.is_constant()
+ assert isinstance(s_callable, annmodel.SomePBC)
F = s_F.const
FUNC = F.TO
args_s = [lltype_to_annotation(T) for T in FUNC.ARGS]
- key = (llhelper, s_callable.const)
- s_res = self.bookkeeper.emulate_pbc_call(key, s_callable, args_s)
- assert lltype_to_annotation(FUNC.RESULT).contains(s_res)
+ for desc in s_callable.descriptions:
+ assert isinstance(desc, FunctionDesc)
+ assert desc.pyobj is not None
+ if s_callable.is_constant():
+ assert s_callable.const is desc.pyobj
+ key = (llhelper, desc.pyobj)
+ s_res = self.bookkeeper.emulate_pbc_call(key, s_callable, args_s)
+ assert lltype_to_annotation(FUNC.RESULT).contains(s_res)
return SomePtr(F)
def specialize_call(self, hop):
hop.exception_cannot_occur()
- return hop.args_r[1].get_unique_llfn()
+ if hop.args_s[1].is_constant():
+ return hop.args_r[1].get_unique_llfn()
+ else:
+ F = hop.args_s[0].const
+ assert hop.args_r[1].lowleveltype == F
+ return hop.inputarg(hop.args_r[1], 1)
# ____________________________________________________________
diff --git a/rpython/rtyper/rpbc.py b/rpython/rtyper/rpbc.py
--- a/rpython/rtyper/rpbc.py
+++ b/rpython/rtyper/rpbc.py
@@ -414,7 +414,7 @@
if self.s_pbc.can_be_None:
self.descriptions.insert(0, None)
POINTER_TABLE = Array(self.pointer_repr.lowleveltype,
- hints={'nolength': True})
+ hints={'nolength': True, 'immutable': True})
pointer_table = malloc(POINTER_TABLE, len(self.descriptions),
immortal=True)
for i, desc in enumerate(self.descriptions):
@@ -564,7 +564,7 @@
if r_to in r_from._conversion_tables:
return r_from._conversion_tables[r_to]
else:
- t = malloc(Array(Char, hints={'nolength': True}),
+ t = malloc(Array(Char, hints={'nolength': True, 'immutable': True}),
len(r_from.descriptions), immortal=True)
l = []
for i, d in enumerate(r_from.descriptions):
@@ -577,7 +577,7 @@
if l == range(len(r_from.descriptions)):
r = None
else:
- r = inputconst(Ptr(Array(Char, hints={'nolength': True})), t)
+ r = inputconst(typeOf(t), t)
r_from._conversion_tables[r_to] = r
return r
diff --git a/rpython/rtyper/test/test_llann.py b/rpython/rtyper/test/test_llann.py
--- a/rpython/rtyper/test/test_llann.py
+++ b/rpython/rtyper/test/test_llann.py
@@ -462,6 +462,30 @@
res = interpret(h, [8, 5, 2])
assert res == 99
+def test_llhelper_multiple_functions():
+ S = GcStruct('S', ('x', Signed), ('y', Signed))
+ def f(s):
+ return s.x - s.y
+ def g(s):
+ return s.x + s.y
+
+ F = Ptr(FuncType([Ptr(S)], Signed))
+
+ myfuncs = [f, g]
+
+ def h(x, y, z):
+ s = malloc(S)
+ s.x = x
+ s.y = y
+ fptr = llhelper(F, myfuncs[z])
+ assert typeOf(fptr) == F
+ return fptr(s)
+
+ res = interpret(h, [80, 5, 0])
+ assert res == 75
+ res = interpret(h, [80, 5, 1])
+ assert res == 85
+
def test_cast_instance_to_base_ptr():
class A:
diff --git a/rpython/rtyper/test/test_rpbc.py b/rpython/rtyper/test/test_rpbc.py
--- a/rpython/rtyper/test/test_rpbc.py
+++ b/rpython/rtyper/test/test_rpbc.py
@@ -2012,6 +2012,36 @@
e = py.test.raises(ValueError, self.interpret, f, [3])
assert str(e.value).startswith(r"exit case '\xff' not found")
+ @py.test.mark.parametrize('limit', [3, 5])
+ def test_conversion_table(self, limit):
+ # with limit==3, check conversion from Char to Ptr(Func).
+ # with limit>3, check conversion from Char to Char.
+ def f1():
+ return 111
+ def f2():
+ return 222
+ def f3():
+ return 333
+ def g(n):
+ if n & 1:
+ return f1
+ else:
+ return f2
+ def f(n):
+ x = g(n) # can be f1 or f2
+ if n > 10:
+ x = f3 # now can be f1 or f2 or f3
+ return x()
+
+ from rpython.config.translationoption import get_combined_translation_config
+ self.config = get_combined_translation_config(translating=True)
+ self.config.translation.withsmallfuncsets = limit
+ assert self.interpret(f, [3]) == 111
+ assert self.interpret(f, [4]) == 222
+ assert self.interpret(f, [13]) == 333
+ assert self.interpret(f, [14]) == 333
+
+
def test_smallfuncsets_basic():
from rpython.translator.translator import TranslationContext, graphof
from rpython.config.translationoption import get_combined_translation_config
diff --git a/rpython/rtyper/test/test_rstr.py b/rpython/rtyper/test/test_rstr.py
--- a/rpython/rtyper/test/test_rstr.py
+++ b/rpython/rtyper/test/test_rstr.py
@@ -972,6 +972,13 @@
s.count(s, -10)
py.test.raises(AnnotatorError, self.interpret, f, ())
+ def test_count_in_empty_string(self):
+ const = self.const
+ def fn():
+ return const('').count(const('ab'))
+ res = self.interpret(fn, [])
+ assert res == 0
+
def test_getitem_exc(self):
const = self.const
def f(x):
More information about the pypy-commit
mailing list