Author: Antonio Cuni <[email protected]>
Branch: faster-rstruct-2
Changeset: r91336:5dbafd0b241b
Date: 2017-05-18 17:26 +0200
http://bitbucket.org/pypy/pypy/changeset/5dbafd0b241b/
Log: hg merge default
diff --git a/pypy/config/pypyoption.py b/pypy/config/pypyoption.py
--- a/pypy/config/pypyoption.py
+++ b/pypy/config/pypyoption.py
@@ -42,8 +42,9 @@
from rpython.jit.backend import detect_cpu
try:
if detect_cpu.autodetect().startswith('x86'):
- working_modules.add('_vmprof')
- working_modules.add('faulthandler')
+ if not sys.platform.startswith('openbsd'):
+ working_modules.add('_vmprof')
+ working_modules.add('faulthandler')
except detect_cpu.ProcessorAutodetectError:
pass
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
@@ -677,7 +677,7 @@
register_global(cpyname, 'PyTypeObject*', pypyexpr, header=pypy_decl)
for cpyname in '''PyMethodObject PyListObject PyLongObject
- PyClassObject'''.split():
+ PyClassObject PyBaseExceptionObject'''.split():
FORWARD_DECLS.append('typedef struct { PyObject_HEAD } %s'
% (cpyname, ))
build_exported_objects()
diff --git a/pypy/module/cpyext/dictobject.py b/pypy/module/cpyext/dictobject.py
--- a/pypy/module/cpyext/dictobject.py
+++ b/pypy/module/cpyext/dictobject.py
@@ -257,7 +257,8 @@
if w_dict is None:
return 0
-
+ if not space.isinstance_w(w_dict, space.w_dict):
+ return 0
pos = ppos[0]
py_obj = as_pyobj(space, w_dict)
py_dict = rffi.cast(PyDictObject, py_obj)
@@ -268,6 +269,9 @@
py_dict.c__tmpkeys = create_ref(space, w_keys)
Py_IncRef(space, py_dict.c__tmpkeys)
else:
+ if not py_dict.c__tmpkeys:
+ # pos should have been 0, cannot fail so return 0
+ return 0;
w_keys = from_ref(space, py_dict.c__tmpkeys)
ppos[0] += 1
if pos >= space.len_w(w_keys):
diff --git a/pypy/module/cpyext/slotdefs.py b/pypy/module/cpyext/slotdefs.py
--- a/pypy/module/cpyext/slotdefs.py
+++ b/pypy/module/cpyext/slotdefs.py
@@ -14,7 +14,7 @@
ssizessizeargfunc, ssizeobjargproc, iternextfunc, initproc, richcmpfunc,
cmpfunc, hashfunc, descrgetfunc, descrsetfunc, objobjproc, objobjargproc,
readbufferproc, getbufferproc, releasebufferproc, ssizessizeobjargproc)
-from pypy.module.cpyext.pyobject import make_ref, decref, as_pyobj
+from pypy.module.cpyext.pyobject import make_ref, decref, as_pyobj, from_ref
from pypy.module.cpyext.pyerrors import PyErr_Occurred
from pypy.module.cpyext.memoryobject import fill_Py_buffer
from pypy.module.cpyext.state import State
@@ -264,7 +264,7 @@
check_num_args(space, w_args, 1)
args_w = space.fixedview(w_args)
index = space.int_w(space.index(args_w[0]))
- null = lltype.nullptr(PyObject.TO)
+ null = rffi.cast(PyObject, 0)
res = generic_cpy_call(space, func_target, w_self, index, null)
if rffi.cast(lltype.Signed, res) == -1:
space.fromcache(State).check_and_raise_exception(always=True)
@@ -293,7 +293,8 @@
func_target = rffi.cast(objobjargproc, func)
check_num_args(space, w_args, 1)
w_key, = space.fixedview(w_args)
- res = generic_cpy_call(space, func_target, w_self, w_key, None)
+ null = rffi.cast(PyObject, 0)
+ res = generic_cpy_call(space, func_target, w_self, w_key, null)
if rffi.cast(lltype.Signed, res) == -1:
space.fromcache(State).check_and_raise_exception(always=True)
return space.w_None
@@ -611,6 +612,8 @@
handled = True
for tp_name, attr in [('tp_hash', '__hash__'),
+ ('tp_as_sequence.c_sq_length', '__len__'),
+ ('tp_as_mapping.c_mp_length', '__len__'),
]:
if name == tp_name:
slot_fn = w_type.getdictvalue(space, attr)
@@ -636,7 +639,8 @@
('tp_as_number.c_nb_xor', '__xor__'),
('tp_as_number.c_nb_or', '__or__'),
('tp_as_sequence.c_sq_concat', '__add__'),
- ('tp_as_sequence.c_sq_inplace_concat', '__iadd__')
+ ('tp_as_sequence.c_sq_inplace_concat', '__iadd__'),
+ ('tp_as_mapping.c_mp_subscript', '__getitem__'),
]:
if name == tp_name:
slot_fn = w_type.getdictvalue(space, attr)
@@ -650,7 +654,7 @@
handled = True
# binary-with-Py_ssize_t-type
- for tp_name, attr in [('tp_as_sequence.c_sq_item', '__getitem'),
+ for tp_name, attr in [('tp_as_sequence.c_sq_item', '__getitem__'),
('tp_as_sequence.c_sq_repeat', '__mul__'),
('tp_as_sequence.c_sq_repeat', '__mul__'),
('tp_as_sequence.c_sq_inplace_repeat', '__imul__'),
@@ -679,7 +683,48 @@
def slot_func(space, w_self, w_arg1, w_arg2):
return space.call_function(slot_fn, w_self, w_arg1, w_arg2)
handled = True
+ # ternary-with-void returning-Py_size_t-type
+ for tp_name, attr in [('tp_as_mapping.c_mp_ass_subscript', '__setitem__'),
+ ]:
+ if name == tp_name:
+ slot_ass = w_type.getdictvalue(space, attr)
+ if slot_ass is None:
+ return
+ slot_del = w_type.getdictvalue(space, '__delitem__')
+ if slot_del is None:
+ return
+ @slot_function([PyObject, PyObject, PyObject], rffi.INT_real,
error=-1)
+ @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'),
typedef.name))
+ def slot_func(space, w_self, w_arg1, arg2):
+ if arg2:
+ w_arg2 = from_ref(space, rffi.cast(PyObject, arg2))
+ space.call_function(slot_ass, w_self, w_arg1, w_arg2)
+ else:
+ space.call_function(slot_del, w_self, w_arg1)
+ return 0
+ handled = True
+ # ternary-Py_size_t-void returning-Py_size_t-type
+ for tp_name, attr in [('tp_as_sequence.c_sq_ass_item', '__setitem__'),
+ ]:
+ if name == tp_name:
+ slot_ass = w_type.getdictvalue(space, attr)
+ if slot_ass is None:
+ return
+ slot_del = w_type.getdictvalue(space, '__delitem__')
+ if slot_del is None:
+ return
+
+ @slot_function([PyObject, lltype.Signed, PyObject], rffi.INT_real,
error=-1)
+ @func_renamer("cpyext_%s_%s" % (name.replace('.', '_'),
typedef.name))
+ def slot_func(space, w_self, arg1, arg2):
+ if arg2:
+ w_arg2 = from_ref(space, rffi.cast(PyObject, arg2))
+ space.call_function(slot_ass, w_self, space.newint(arg1),
w_arg2)
+ else:
+ space.call_function(slot_del, w_self, space.newint(arg1))
+ return 0
+ handled = True
if handled:
pass
elif name == 'tp_setattro':
diff --git a/pypy/module/cpyext/test/test_dictobject.py
b/pypy/module/cpyext/test/test_dictobject.py
--- a/pypy/module/cpyext/test/test_dictobject.py
+++ b/pypy/module/cpyext/test/test_dictobject.py
@@ -255,4 +255,60 @@
])
d = module.get_type_dict(1)
assert d['real'].__get__(1, 1) == 1
-
+ def test_advanced(self):
+ module = self.import_extension('foo', [
+ ("dict_len", "METH_O",
+ '''
+ int ret = args->ob_type->tp_as_mapping->mp_length(args);
+ return PyLong_FromLong(ret);
+ '''),
+ ("dict_setitem", "METH_VARARGS",
+ '''
+ int ret;
+ PyObject * dict = PyTuple_GetItem(args, 0);
+ if (PyTuple_Size(args) < 3 || !dict ||
+ !dict->ob_type->tp_as_mapping ||
+ !dict->ob_type->tp_as_mapping->mp_ass_subscript)
+ return PyLong_FromLong(-1);
+ ret = dict->ob_type->tp_as_mapping->mp_ass_subscript(
+ dict, PyTuple_GetItem(args, 1),
+ PyTuple_GetItem(args, 2));
+ return PyLong_FromLong(ret);
+ '''),
+ ("dict_delitem", "METH_VARARGS",
+ '''
+ int ret;
+ PyObject * dict = PyTuple_GetItem(args, 0);
+ if (PyTuple_Size(args) < 2 || !dict ||
+ !dict->ob_type->tp_as_mapping ||
+ !dict->ob_type->tp_as_mapping->mp_ass_subscript)
+ return PyLong_FromLong(-1);
+ ret = dict->ob_type->tp_as_mapping->mp_ass_subscript(
+ dict, PyTuple_GetItem(args, 1), NULL);
+ return PyLong_FromLong(ret);
+ '''),
+ ("dict_next", "METH_VARARGS",
+ '''
+ PyObject *key, *value;
+ PyObject *arg = NULL;
+ Py_ssize_t pos = 0;
+ int ret = 0;
+ if ((PyArg_ParseTuple(args, "|O", &arg))) {
+ if (arg && PyDict_Check(arg)) {
+ while (PyDict_Next(arg, &pos, &key, &value))
+ ret ++;
+ /* test no crash if pos is not reset to 0*/
+ while (PyDict_Next(arg, &pos, &key, &value))
+ ret ++;
+ }
+ }
+ return PyLong_FromLong(ret);
+ '''),
+ ])
+ d = {'a': 1, 'b':2}
+ assert module.dict_len(d) == 2
+ assert module.dict_setitem(d, 'a', 'c') == 0
+ assert d['a'] == 'c'
+ assert module.dict_delitem(d, 'a') == 0
+ r = module.dict_next({'a': 1, 'b': 2})
+ assert r == 2
diff --git a/pypy/module/cpyext/unicodeobject.py
b/pypy/module/cpyext/unicodeobject.py
--- a/pypy/module/cpyext/unicodeobject.py
+++ b/pypy/module/cpyext/unicodeobject.py
@@ -520,7 +520,7 @@
if sys.platform == 'win32':
make_conversion_functions('MBCS', 'mbcs')
-@cpython_api([rffi.CCHARP, Py_ssize_t, rffi.CCHARP, rffi.INTP], PyObject)
+@cpython_api([rffi.CCHARP, Py_ssize_t, CONST_STRING, rffi.INTP], PyObject)
def PyUnicode_DecodeUTF16(space, s, size, llerrors, pbyteorder):
"""Decode length bytes from a UTF-16 encoded buffer string and return the
corresponding Unicode object. errors (if non-NULL) defines the error
diff --git a/pypy/module/test_lib_pypy/README.txt
b/pypy/module/test_lib_pypy/README.txt
new file mode 100644
--- /dev/null
+++ b/pypy/module/test_lib_pypy/README.txt
@@ -0,0 +1,4 @@
+This directory contains app-level tests are supposed to be run *after*
+translation. So you run them by saying:
+
+pypy pytest.py <testfile.py>
diff --git a/rpython/rlib/rposix.py b/rpython/rlib/rposix.py
--- a/rpython/rlib/rposix.py
+++ b/rpython/rlib/rposix.py
@@ -239,7 +239,7 @@
'signal.h', 'sys/utsname.h', _ptyh]
if sys.platform.startswith('linux'):
includes.append('sys/sysmacros.h')
- if sys.platform.startswith('freebsd'):
+ if sys.platform.startswith('freebsd') or
sys.platform.startswith('openbsd'):
includes.append('sys/ttycom.h')
libraries = ['util']
eci = ExternalCompilationInfo(
diff --git a/rpython/rlib/rvmprof/src/shared/machine.c
b/rpython/rlib/rvmprof/src/shared/machine.c
--- a/rpython/rlib/rvmprof/src/shared/machine.c
+++ b/rpython/rlib/rvmprof/src/shared/machine.c
@@ -4,6 +4,7 @@
#include <stdio.h>
#ifdef VMPROF_UNIX
+#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#endif
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit