Author: Philip Jenvey <[email protected]>
Branch: py3k
Changeset: r59271:078592628907
Date: 2012-12-02 15:14 -0800
http://bitbucket.org/pypy/pypy/changeset/078592628907/
Log: merge
diff --git a/lib_pypy/_testcapimodule.c b/lib_pypy/_testcapimodule.c
--- a/lib_pypy/_testcapimodule.c
+++ b/lib_pypy/_testcapimodule.c
@@ -1,5 +1,4 @@
-/* Verbatim copy of Modules/_testcapimodule.c from CPython 3.2 w/ use
- of PyInstanceMethod disabled */
+/* Verbatim copy of Modules/_testcapimodule.c from CPython 3.2 */
/*
* C Extension module to test Python interpreter C APIs.
*
@@ -2626,10 +2625,8 @@
PyModule_AddObject(m, "PY_SSIZE_T_MAX",
PyLong_FromSsize_t(PY_SSIZE_T_MAX));
PyModule_AddObject(m, "PY_SSIZE_T_MIN",
PyLong_FromSsize_t(PY_SSIZE_T_MIN));
PyModule_AddObject(m, "SIZEOF_PYGC_HEAD",
PyLong_FromSsize_t(sizeof(PyGC_Head)));
-#if 0 /* XXX: disabled for PyPy (for now) */
Py_INCREF(&PyInstanceMethod_Type);
PyModule_AddObject(m, "instancemethod", (PyObject
*)&PyInstanceMethod_Type);
-#endif
TestError = PyErr_NewException("_testcapi.error", NULL, NULL);
Py_INCREF(TestError);
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
@@ -650,8 +650,12 @@
lambda space: init_capsule(),
])
from pypy.module.posix.interp_posix import add_fork_hook
- reinit_tls = rffi.llexternal('PyThread_ReInitTLS', [], lltype.Void,
- compilation_info=eci)
+ if we_are_translated():
+ reinit_tls = rffi.llexternal('PyThread_ReInitTLS', [], lltype.Void,
+ compilation_info=eci)
+ else:
+ reinit_tls = rffi.llexternal('PyPyThread_ReInitTLS', [], lltype.Void,
+ compilation_info=eci)
add_fork_hook('child', reinit_tls)
def init_function(func):
diff --git a/pypy/module/cpyext/buffer.py b/pypy/module/cpyext/buffer.py
--- a/pypy/module/cpyext/buffer.py
+++ b/pypy/module/cpyext/buffer.py
@@ -1,8 +1,8 @@
-from pypy.interpreter.error import OperationError
from pypy.rpython.lltypesystem import rffi, lltype
from pypy.module.cpyext.api import (
cpython_api, CANNOT_FAIL, Py_buffer)
-from pypy.module.cpyext.pyobject import PyObject
+from pypy.module.cpyext.pyobject import PyObject, Py_DecRef
+from pypy.interpreter import buffer
@cpython_api([lltype.Ptr(Py_buffer), lltype.Char], rffi.INT_real,
error=CANNOT_FAIL)
def PyBuffer_IsContiguous(space, view, fortran):
@@ -11,3 +11,27 @@
(fortran is 'A'). Return 0 otherwise."""
# PyPy only supports contiguous Py_buffers for now.
return 1
+
+class CBufferMixin(object):
+ _mixin_ = True
+
+ def __init__(self, space, c_buf, c_len, w_obj):
+ self.space = space
+ self.c_buf = c_buf
+ self.c_len = c_len
+ self.w_obj = w_obj
+
+ def __del__(self):
+ Py_DecRef(self.space, self.w_obj)
+
+ def getlength(self):
+ return self.c_len
+
+ def getitem(self, index):
+ return self.c_buf[index]
+
+ def as_str(self):
+ return rffi.charpsize2str(self.c_buf, self.c_len)
+
+class CBuffer(CBufferMixin, buffer.Buffer):
+ pass
diff --git a/pypy/module/cpyext/memoryobject.py
b/pypy/module/cpyext/memoryobject.py
--- a/pypy/module/cpyext/memoryobject.py
+++ b/pypy/module/cpyext/memoryobject.py
@@ -1,6 +1,19 @@
-from pypy.module.cpyext.api import cpython_api
-from pypy.module.cpyext.pyobject import PyObject
+from pypy.module.cpyext.api import cpython_api, Py_buffer
+from pypy.module.cpyext.pyobject import PyObject, from_ref
+from pypy.module.cpyext.buffer import CBuffer
+from pypy.rpython.lltypesystem import rffi, lltype
+from pypy.module.__builtin__.interp_memoryview import W_MemoryView
@cpython_api([PyObject], PyObject)
def PyMemoryView_FromObject(space, w_obj):
return space.call_method(space.builtin, "memoryview", w_obj)
+
+@cpython_api([lltype.Ptr(Py_buffer)], PyObject)
+def PyMemoryView_FromBuffer(space, view):
+ """Create a memoryview object wrapping the given buffer structure view.
+ The memoryview object then owns the buffer represented by view, which
+ means you shouldn't try to call PyBuffer_Release() yourself: it
+ will be done on deallocation of the memoryview object."""
+ w_obj = from_ref(space, view.c_obj)
+ buf = CBuffer(space, view.c_buf, view.c_len, w_obj)
+ return space.wrap(W_MemoryView(space.wrap(buf)))
diff --git a/pypy/module/cpyext/stubs.py b/pypy/module/cpyext/stubs.py
--- a/pypy/module/cpyext/stubs.py
+++ b/pypy/module/cpyext/stubs.py
@@ -1610,15 +1610,6 @@
raise NotImplementedError
-@cpython_api([Py_buffer], PyObject)
-def PyMemoryView_FromBuffer(space, view):
- """Create a memoryview object wrapping the given buffer structure view.
- The memoryview object then owns the buffer represented by view, which
- means you shouldn't try to call PyBuffer_Release() yourself: it
- will be done on deallocation of the memoryview object."""
- raise NotImplementedError
-
-
@cpython_api([PyObject, rffi.INT_real, lltype.Char], PyObject)
def PyMemoryView_GetContiguous(space, obj, buffertype, order):
"""Create a memoryview object to a contiguous chunk of memory (in either
@@ -1645,33 +1636,6 @@
raise NotImplementedError
-@cpython_api([PyObject], rffi.INT_real, error=CANNOT_FAIL)
-def PyInstanceMethod_Check(space, o):
- """Return true if o is an instance method object (has type
- PyInstanceMethod_Type). The parameter must not be NULL."""
- raise NotImplementedError
-
-
-@cpython_api([PyObject], PyObject)
-def PyInstanceMethod_New(space, func):
- """Return a new instance method object, with func being any callable object
- func is the function that will be called when the instance method is
- called."""
- raise NotImplementedError
-
-
-@cpython_api([PyObject], PyObject)
-def PyInstanceMethod_Function(space, im):
- """Return the function object associated with the instance method im."""
- raise NotImplementedError
-
-
-@cpython_api([PyObject], PyObject)
-def PyInstanceMethod_GET_FUNCTION(space, im):
- """Macro version of PyInstanceMethod_Function() which avoids error
checking."""
- raise NotImplementedError
-
-
@cpython_api([], rffi.INT_real, error=-1)
def PyMethod_ClearFreeList(space, ):
"""Clear the free list. Return the total number of freed items."""
diff --git a/pypy/module/cpyext/test/test_memoryobject.py
b/pypy/module/cpyext/test/test_memoryobject.py
--- a/pypy/module/cpyext/test/test_memoryobject.py
+++ b/pypy/module/cpyext/test/test_memoryobject.py
@@ -1,5 +1,6 @@
import py
from pypy.module.cpyext.test.test_api import BaseApiTest
+from pypy.module.cpyext.test.test_cpyext import AppTestCpythonExtensionBase
class TestMemoryViewObject(BaseApiTest):
def test_fromobject(self, space, api):
@@ -11,3 +12,29 @@
w_view = api.PyMemoryView_FromObject(w_hello)
w_bytes = space.call_method(w_view, "tobytes")
assert space.unwrap(w_bytes) == "hello"
+
+class AppTestPyBuffer_FillInfo(AppTestCpythonExtensionBase):
+ def test_fillWithObject(self):
+ module = self.import_extension('foo', [
+ ("fillinfo", "METH_VARARGS",
+ """
+ Py_buffer buf;
+ PyObject *str = PyBytes_FromString("hello, world.");
+ PyObject *result;
+
+ if (PyBuffer_FillInfo(&buf, str, PyBytes_AsString(str), 13,
+ 0, 0)) {
+ return NULL;
+ }
+
+ /* Get rid of our own reference to the object, but
+ * the Py_buffer should still have a reference.
+ */
+ Py_DECREF(str);
+
+ return PyMemoryView_FromBuffer(&buf);
+ """)])
+ result = module.fillinfo()
+ assert b"hello, world." == result
+
+
diff --git a/pypy/module/imp/interp_imp.py b/pypy/module/imp/interp_imp.py
--- a/pypy/module/imp/interp_imp.py
+++ b/pypy/module/imp/interp_imp.py
@@ -73,14 +73,15 @@
stream = find_info.stream
if stream is not None:
- # try to find the declared encoding
encoding = None
- firstline = stream.readline()
- stream.seek(0, 0) # reset position
- if firstline.startswith('#'):
- encoding = pytokenizer.match_encoding_declaration(firstline)
- if encoding is None:
- encoding = unicodetype.getdefaultencoding(space)
+ if find_info.modtype == importing.PY_SOURCE:
+ # try to find the declared encoding
+ firstline = stream.readline()
+ stream.seek(0, 0) # reset position
+ if firstline.startswith('#'):
+ encoding = pytokenizer.match_encoding_declaration(firstline)
+ if encoding is None:
+ encoding = unicodetype.getdefaultencoding(space)
#
# in python2, both CPython and PyPy pass the filename to
# open(). However, CPython 3 just passes the fd, so the returned file
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
@@ -50,7 +50,6 @@
self.FrameClass = frame.build_frame(self)
self.StringObjectCls = W_StringObject
-
self.UnicodeObjectCls = W_UnicodeObject
self._install_multimethods()
diff --git a/pypy/tool/pytest/objspace.py b/pypy/tool/pytest/objspace.py
--- a/pypy/tool/pytest/objspace.py
+++ b/pypy/tool/pytest/objspace.py
@@ -10,7 +10,7 @@
""" helper for instantiating and caching space's for testing.
"""
try:
- config = make_config(option,**kwds)
+ config = make_config(option, **kwds)
except ConflictConfigError as e:
# this exception is typically only raised if a module is not available.
# in this case the test should be skipped
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit