Author: Richard Plangger <[email protected]>
Branch: py3.5-ssl
Changeset: r88948:a94a5155d64a
Date: 2016-12-07 16:31 +0100
http://bitbucket.org/pypy/pypy/changeset/a94a5155d64a/
Log: merge py3.5
diff --git a/lib-python/3/test/test_builtin.py
b/lib-python/3/test/test_builtin.py
--- a/lib-python/3/test/test_builtin.py
+++ b/lib-python/3/test/test_builtin.py
@@ -16,7 +16,8 @@
import warnings
from operator import neg
from test.support import (
- TESTFN, unlink, run_unittest, check_warnings, check_impl_detail)
+ TESTFN, unlink, run_unittest, check_warnings, check_impl_detail,
+ cpython_only)
from test.support.script_helper import assert_python_ok
try:
import pty, signal
@@ -1640,6 +1641,8 @@
class ShutdownTest(unittest.TestCase):
+ # PyPy doesn't do a gc.collect() at shutdown
+ @cpython_only
def test_cleanup(self):
# Issue #19255: builtins are still available at shutdown
code = """if 1:
diff --git a/lib-python/3/test/test_exceptions.py
b/lib-python/3/test/test_exceptions.py
--- a/lib-python/3/test/test_exceptions.py
+++ b/lib-python/3/test/test_exceptions.py
@@ -1049,6 +1049,7 @@
obj = test_class()
with captured_stderr() as stderr:
del obj
+ gc_collect()
report = stderr.getvalue()
self.assertIn("Exception ignored", report)
if test_class is BrokenRepr:
@@ -1059,7 +1060,12 @@
self.assertIn("raise exc", report)
if test_class is BrokenExceptionDel:
self.assertIn("BrokenStrException", report)
- self.assertIn("<exception str() failed>", report)
+ if check_impl_detail(pypy=False):
+ self.assertIn("<exception str() failed>", report)
+ else:
+ # pypy: this is what lib-python's traceback.py gives
+ self.assertIn("<unprintable BrokenExceptionDel
object>",
+ report)
else:
self.assertIn("ValueError", report)
self.assertIn("del is broken", report)
@@ -1081,7 +1087,12 @@
self.assertIn("raise exc", report)
self.assertIn(exc_type.__name__, report)
if exc_type is BrokenStrException:
- self.assertIn("<exception str() failed>", report)
+ if check_impl_detail(pypy=False):
+ self.assertIn("<exception str() failed>", report)
+ else:
+ # pypy: this is what lib-python's traceback.py gives
+ self.assertIn("<unprintable BrokenStrException
object>",
+ report)
else:
self.assertIn("test message", report)
self.assertTrue(report.endswith("\n"))
diff --git a/lib-python/3/test/test_super.py b/lib-python/3/test/test_super.py
--- a/lib-python/3/test/test_super.py
+++ b/lib-python/3/test/test_super.py
@@ -105,14 +105,16 @@
def f():
__class__""", globals(), {})
self.assertIs(type(e.exception), NameError) # Not UnboundLocalError
- class X:
- global __class__
- __class__ = 42
- def f():
- __class__
- self.assertEqual(globals()["__class__"], 42)
- del globals()["__class__"]
- self.assertNotIn("__class__", X.__dict__)
+ # XXX the following uses 'global __class__', which pypy doesn't
+ # XXX implement at all for now
+ #class X:
+ # global __class__
+ # __class__ = 42
+ # def f():
+ # __class__
+ #self.assertEqual(globals()["__class__"], 42)
+ #del globals()["__class__"]
+ #self.assertNotIn("__class__", X.__dict__)
class X:
nonlocal __class__
__class__ = 42
diff --git a/lib_pypy/audioop.py b/lib_pypy/audioop.py
--- a/lib_pypy/audioop.py
+++ b/lib_pypy/audioop.py
@@ -375,7 +375,7 @@
sample_count = _sample_count(cp, size)
rv = ffi.new("unsigned char[]", len(cp) * 2)
- lib.tostereo(rv, cp, len(cp), size, fac1, fac2)
+ lib.tostereo(rv, ffi.from_buffer(cp), len(cp), size, fac1, fac2)
return ffi.buffer(rv)[:]
@@ -386,7 +386,7 @@
raise error("Lengths should be the same")
rv = ffi.new("unsigned char[]", len(cp1))
- lib.add(rv, cp1, cp2, len(cp1), size)
+ lib.add(rv, ffi.from_buffer(cp1), ffi.from_buffer(cp2), len(cp1), size)
return ffi.buffer(rv)[:]
@@ -569,7 +569,7 @@
state = _check_state(state)
rv = ffi.new("unsigned char[]", len(cp) * size * 2)
state_ptr = ffi.new("int[]", state)
- lib.adcpm2lin(rv, cp, len(cp), size, state_ptr)
+ lib.adcpm2lin(rv, ffi.from_buffer(cp), len(cp), size, state_ptr)
return ffi.buffer(rv)[:], tuple(state_ptr)
def byteswap(cp, size):
diff --git a/pypy/interpreter/astcompiler/assemble.py
b/pypy/interpreter/astcompiler/assemble.py
--- a/pypy/interpreter/astcompiler/assemble.py
+++ b/pypy/interpreter/astcompiler/assemble.py
@@ -137,11 +137,11 @@
return ''.join(code)
-def _make_index_dict_filter(syms, flag):
+def _make_index_dict_filter(syms, flag1, flag2):
i = 0
result = {}
for name, scope in syms.iteritems():
- if scope == flag:
+ if scope in (flag1, flag2):
result[name] = i
i += 1
return result
@@ -170,7 +170,8 @@
self.names = {}
self.var_names = _iter_to_dict(scope.varnames)
self.cell_vars = _make_index_dict_filter(scope.symbols,
- symtable.SCOPE_CELL)
+ symtable.SCOPE_CELL,
+ symtable.SCOPE_CELL_CLASS)
self.free_vars = _iter_to_dict(scope.free_vars, len(self.cell_vars))
self.w_consts = space.newdict()
self.argcount = 0
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
@@ -317,7 +317,8 @@
# Load cell and free vars to pass on.
for free in code.co_freevars:
free_scope = self.scope.lookup(free)
- if free_scope == symtable.SCOPE_CELL:
+ if free_scope in (symtable.SCOPE_CELL,
+ symtable.SCOPE_CELL_CLASS):
index = self.cell_vars[free]
else:
index = self.free_vars[free]
@@ -1626,7 +1627,7 @@
self._handle_body(cls.body)
# return the (empty) __class__ cell
scope = self.scope.lookup("__class__")
- if scope == symtable.SCOPE_CELL:
+ if scope == symtable.SCOPE_CELL_CLASS:
# Return the cell where to store __class__
self.emit_op_arg(ops.LOAD_CLOSURE, self.cell_vars["__class__"])
else:
diff --git a/pypy/interpreter/astcompiler/symtable.py
b/pypy/interpreter/astcompiler/symtable.py
--- a/pypy/interpreter/astcompiler/symtable.py
+++ b/pypy/interpreter/astcompiler/symtable.py
@@ -21,6 +21,7 @@
SCOPE_LOCAL = 3
SCOPE_FREE = 4
SCOPE_CELL = 5
+SCOPE_CELL_CLASS = 6 # for "__class__" inside class bodies only
class Scope(object):
@@ -336,7 +337,7 @@
def _finalize_cells(self, free):
for name, role in self.symbols.iteritems():
if role == SCOPE_LOCAL and name in free and name == '__class__':
- self.symbols[name] = SCOPE_CELL
+ self.symbols[name] = SCOPE_CELL_CLASS
del free[name]
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
@@ -398,6 +398,13 @@
# in CPython 3.5.2. Looks like a bug to me
def testing():
return 42
+''', '''
+class Y:
+ def f():
+ __class__
+ __class__ = 42
+def testing():
+ return Y.__dict__['__class__']
'''
]:
space.call_args(w_filterwarnings, filter_arg)
diff --git a/pypy/module/posix/app_posix.py b/pypy/module/posix/app_posix.py
--- a/pypy/module/posix/app_posix.py
+++ b/pypy/module/posix/app_posix.py
@@ -80,7 +80,8 @@
class statvfs_result(metaclass=structseqtype):
- name = osname + ".statvfs_result"
+ name = "os.statvfs_result"
+ __module__ = "os"
f_bsize = structseqfield(0)
f_frsize = structseqfield(1)
@@ -96,7 +97,7 @@
class uname_result(metaclass=structseqtype):
- name = osname + ".uname_result"
+ name = osname + ".uname_result" # and NOT "os.uname_result"
sysname = structseqfield(0, "operating system name")
nodename = structseqfield(1, "name of machine on network "
@@ -108,6 +109,7 @@
class terminal_size(metaclass=structseqtype):
name = "os.terminal_size"
+ __module__ = "os"
columns = structseqfield(0, "width of the terminal window in characters")
lines = structseqfield(1, "height of the terminal window in characters")
diff --git a/pypy/module/posix/interp_posix.py
b/pypy/module/posix/interp_posix.py
--- a/pypy/module/posix/interp_posix.py
+++ b/pypy/module/posix/interp_posix.py
@@ -325,7 +325,7 @@
if space.isinstance_w(w_path, space.w_int):
w_fd = w_path
else:
- w_fd = open(space, w_path, os.O_RDWR | os.O_CREAT)
+ w_fd = open(space, w_path, os.O_WRONLY)
allocated_fd = True
fd = space.c_filedescriptor_w(w_fd)
diff --git a/pypy/module/posix/test/test_posix2.py
b/pypy/module/posix/test/test_posix2.py
--- a/pypy/module/posix/test/test_posix2.py
+++ b/pypy/module/posix/test/test_posix2.py
@@ -1067,6 +1067,10 @@
posix.truncate(dest, 1)
assert 1 == posix.stat(dest).st_size
+ # File does not exist
+ e = raises(OSError, posix.truncate, dest + '-DOESNT-EXIST', 0)
+ assert e.value.filename == dest + '-DOESNT-EXIST'
+
try:
os.getlogin()
except (AttributeError, OSError):
diff --git a/pypy/objspace/std/longobject.py b/pypy/objspace/std/longobject.py
--- a/pypy/objspace/std/longobject.py
+++ b/pypy/objspace/std/longobject.py
@@ -187,7 +187,7 @@
return space.w_NotImplemented
if w_exponent.asbigint().sign < 0:
- raise oefmt(space.w_TypeError,
+ raise oefmt(space.w_ValueError,
"pow() 2nd argument cannot be negative when 3rd "
"argument specified")
try:
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
@@ -667,6 +667,11 @@
b.abc = "awesomer"
assert b.abc == "awesomer"
+ def test_bad_slots(self):
+ raises(TypeError, type, 'A', (), {'__slots__': b'x'})
+ raises(TypeError, type, 'A', (), {'__slots__': 42})
+ raises(TypeError, type, 'A', (), {'__slots__': '2_x'})
+
def test_base_attr(self):
# check the '__base__'
class A(object):
@@ -936,6 +941,22 @@
else:
assert False
+ def test_qualname(self):
+ A = type('A', (), {'__qualname__': 'B.C'})
+ assert A.__name__ == 'A'
+ assert A.__qualname__ == 'B.C'
+ raises(TypeError, type, 'A', (), {'__qualname__': b'B'})
+ assert A.__qualname__ == 'B.C'
+
+ A.__qualname__ = 'D.E'
+ assert A.__name__ == 'A'
+ assert A.__qualname__ == 'D.E'
+
+ C = type('C', (), {})
+ C.__name__ = 'A'
+ assert C.__name__ == 'A'
+ assert C.__qualname__ == 'C'
+
def test_compare(self):
class A(object):
pass
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
@@ -166,7 +166,7 @@
overridetypedef=None, force_new_layout=False):
self.space = space
self.name = name
- self.qualname = None
+ self.qualname = name.decode('utf-8')
self.bases_w = bases_w
self.dict_w = dict_w
self.hasdict = False
@@ -545,7 +545,7 @@
return result.decode('utf-8')
def getqualname(self, space):
- return self.qualname or self.getname(space)
+ return self.qualname
def add_subclass(self, w_subclass):
space = self.space
@@ -1057,6 +1057,14 @@
w_self.weakrefable = w_self.weakrefable or w_base.weakrefable
return hasoldstylebase
+def slot_w(space, w_name):
+ from pypy.objspace.std.unicodeobject import _isidentifier
+ if not space.isinstance_w(w_name, space.w_text):
+ raise oefmt(space.w_TypeError,
+ "__slots__ items must be strings, not '%T'", w_name)
+ if not _isidentifier(w_name._value):
+ raise oefmt(space.w_TypeError, "__slots__ must be identifiers")
+ return w_name.identifier_w(space)
def create_all_slots(w_self, hasoldstylebase, w_bestbase, force_new_layout):
from pypy.objspace.std.listobject import StringSort
@@ -1073,13 +1081,12 @@
wantdict = False
wantweakref = False
w_slots = dict_w['__slots__']
- if (space.isinstance_w(w_slots, space.w_str) or
- space.isinstance_w(w_slots, space.w_unicode)):
+ if space.isinstance_w(w_slots, space.w_text):
slot_names_w = [w_slots]
else:
slot_names_w = space.unpackiterable(w_slots)
for w_slot_name in slot_names_w:
- slot_name = space.str_w(w_slot_name)
+ slot_name = slot_w(space, w_slot_name)
if slot_name == '__dict__':
if wantdict or w_bestbase.hasdict:
raise oefmt(space.w_TypeError,
@@ -1124,8 +1131,6 @@
def create_slot(w_self, slot_name, index_next_extra_slot):
space = w_self.space
- if not valid_slot_name(slot_name):
- raise oefmt(space.w_TypeError, "__slots__ must be identifiers")
# create member
slot_name = mangle(slot_name, w_self.name)
if slot_name not in w_self.dict_w:
@@ -1156,14 +1161,6 @@
w_self.space.wrap(weakref_descr))
w_self.weakrefable = True
-def valid_slot_name(slot_name):
- if len(slot_name) == 0 or slot_name[0].isdigit():
- return False
- for c in slot_name:
- if not c.isalnum() and c != '_':
- return False
- return True
-
def setup_user_defined_type(w_self, force_new_layout):
if len(w_self.bases_w) == 0:
w_self.bases_w = [w_self.space.w_object]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit