Author: Christian Tismer <tis...@stackless.com> Branch: win64_gborg Changeset: r48939:64b52e0ecfcc Date: 2011-11-07 17:26 +0100 http://bitbucket.org/pypy/pypy/changeset/64b52e0ecfcc/
Log: Merge with default 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 @@ -392,6 +392,7 @@ 'Slice': 'space.gettypeobject(W_SliceObject.typedef)', 'StaticMethod': 'space.gettypeobject(StaticMethod.typedef)', 'CFunction': 'space.gettypeobject(cpyext.methodobject.W_PyCFunctionObject.typedef)', + 'WrapperDescr': 'space.gettypeobject(cpyext.methodobject.W_PyCMethodObject.typedef)' }.items(): GLOBALS['Py%s_Type#' % (cpyname, )] = ('PyTypeObject*', pypyexpr) diff --git a/pypy/module/cpyext/methodobject.py b/pypy/module/cpyext/methodobject.py --- a/pypy/module/cpyext/methodobject.py +++ b/pypy/module/cpyext/methodobject.py @@ -240,6 +240,7 @@ def PyStaticMethod_New(space, w_func): return space.wrap(StaticMethod(w_func)) +@cpython_api([PyObject, lltype.Ptr(PyMethodDef)], PyObject) def PyDescr_NewMethod(space, w_type, method): return space.wrap(W_PyCMethodObject(space, method, w_type)) 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 @@ -586,10 +586,6 @@ def PyDescr_NewMember(space, type, meth): raise NotImplementedError -@cpython_api([PyTypeObjectPtr, PyMethodDef], PyObject) -def PyDescr_NewMethod(space, type, meth): - raise NotImplementedError - @cpython_api([PyTypeObjectPtr, wrapperbase, rffi.VOIDP], PyObject) def PyDescr_NewWrapper(space, type, wrapper, wrapped): raise NotImplementedError @@ -610,14 +606,6 @@ def PyWrapper_New(space, w_d, w_self): raise NotImplementedError -@cpython_api([PyObject], PyObject) -def PyDictProxy_New(space, dict): - """Return a proxy object for a mapping which enforces read-only behavior. - This is normally used to create a proxy to prevent modification of the - dictionary for non-dynamic class types. - """ - raise NotImplementedError - @cpython_api([PyObject, PyObject, rffi.INT_real], rffi.INT_real, error=-1) def PyDict_Merge(space, a, b, override): """Iterate over mapping object b adding key-value pairs to dictionary a. @@ -2293,15 +2281,6 @@ changes in your code for properly supporting 64-bit systems.""" raise NotImplementedError -@cpython_api([rffi.CWCHARP, Py_ssize_t, rffi.CCHARP], PyObject) -def PyUnicode_EncodeUTF8(space, s, size, errors): - """Encode the Py_UNICODE buffer of the given size using UTF-8 and return a - Python string object. Return NULL if an exception was raised by the codec. - - This function used an int type for size. This might require - changes in your code for properly supporting 64-bit systems.""" - raise NotImplementedError - @cpython_api([rffi.CCHARP, Py_ssize_t, rffi.CCHARP, rffi.INTP], PyObject) def PyUnicode_DecodeUTF32(space, s, size, errors, byteorder): """Decode length bytes from a UTF-32 encoded buffer string and return the @@ -2481,31 +2460,6 @@ was raised by the codec.""" raise NotImplementedError -@cpython_api([rffi.CCHARP, Py_ssize_t, rffi.CCHARP], PyObject) -def PyUnicode_DecodeLatin1(space, s, size, errors): - """Create a Unicode object by decoding size bytes of the Latin-1 encoded string - s. Return NULL if an exception was raised by the codec. - - This function used an int type for size. This might require - changes in your code for properly supporting 64-bit systems.""" - raise NotImplementedError - -@cpython_api([rffi.CWCHARP, Py_ssize_t, rffi.CCHARP], PyObject) -def PyUnicode_EncodeLatin1(space, s, size, errors): - """Encode the Py_UNICODE buffer of the given size using Latin-1 and return - a Python string object. Return NULL if an exception was raised by the codec. - - This function used an int type for size. This might require - changes in your code for properly supporting 64-bit systems.""" - raise NotImplementedError - -@cpython_api([PyObject], PyObject) -def PyUnicode_AsLatin1String(space, unicode): - """Encode a Unicode object using Latin-1 and return the result as Python string - object. Error handling is "strict". Return NULL if an exception was raised - by the codec.""" - raise NotImplementedError - @cpython_api([rffi.CCHARP, Py_ssize_t, PyObject, rffi.CCHARP], PyObject) def PyUnicode_DecodeCharmap(space, s, size, mapping, errors): """Create a Unicode object by decoding size bytes of the encoded string s using @@ -2564,13 +2518,6 @@ """ raise NotImplementedError -@cpython_api([PyObject], PyObject) -def PyUnicode_AsMBCSString(space, unicode): - """Encode a Unicode object using MBCS and return the result as Python string - object. Error handling is "strict". Return NULL if an exception was raised - by the codec.""" - raise NotImplementedError - @cpython_api([PyObject, PyObject], PyObject) def PyUnicode_Concat(space, left, right): """Concat two strings giving a new Unicode string.""" @@ -2912,16 +2859,3 @@ """Return true if ob is a proxy object. """ raise NotImplementedError - -@cpython_api([PyObject, PyObject], PyObject) -def PyWeakref_NewProxy(space, ob, callback): - """Return a weak reference proxy object for the object ob. This will always - return a new reference, but is not guaranteed to create a new object; an - existing proxy object may be returned. The second parameter, callback, can - be a callable object that receives notification when ob is garbage - collected; it should accept a single parameter, which will be the weak - reference object itself. callback may also be None or NULL. If ob - is not a weakly-referencable object, or if callback is not callable, - None, or NULL, this will return NULL and raise TypeError. - """ - raise NotImplementedError diff --git a/pypy/module/cpyext/test/test_methodobject.py b/pypy/module/cpyext/test/test_methodobject.py --- a/pypy/module/cpyext/test/test_methodobject.py +++ b/pypy/module/cpyext/test/test_methodobject.py @@ -79,7 +79,7 @@ raises(TypeError, mod.isSameFunction, 1) class TestPyCMethodObject(BaseApiTest): - def test_repr(self, space): + def test_repr(self, space, api): """ W_PyCMethodObject has a repr string which describes it as a method and gives its name and the name of its class. @@ -94,7 +94,7 @@ ml.c_ml_meth = rffi.cast(PyCFunction_typedef, c_func.get_llhelper(space)) - method = PyDescr_NewMethod(space, space.w_str, ml) + method = api.PyDescr_NewMethod(space.w_str, ml) assert repr(method).startswith( "<built-in method 'func' of 'str' object ") diff --git a/pypy/module/cpyext/test/test_unicodeobject.py b/pypy/module/cpyext/test/test_unicodeobject.py --- a/pypy/module/cpyext/test/test_unicodeobject.py +++ b/pypy/module/cpyext/test/test_unicodeobject.py @@ -188,6 +188,12 @@ assert space.unwrap(w_u) == 'sp' rffi.free_charp(u) + def test_encode_utf8(self, space, api): + u = rffi.unicode2wcharp(u'sp�m') + w_s = api.PyUnicode_EncodeUTF8(u, 4, None) + assert space.unwrap(w_s) == u'sp�m'.encode('utf-8') + rffi.free_wcharp(u) + def test_IS(self, space, api): for char in [0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x85, 0xa0, 0x1680, 0x2000, 0x2001, 0x2002, @@ -385,6 +391,24 @@ data, len(u), lltype.nullptr(rffi.CCHARP.TO)) rffi.free_wcharp(data) + def test_latin1(self, space, api): + s = 'abcdefg' + data = rffi.str2charp(s) + w_u = api.PyUnicode_DecodeLatin1(data, len(s), lltype.nullptr(rffi.CCHARP.TO)) + assert space.eq_w(w_u, space.wrap(u"abcdefg")) + rffi.free_charp(data) + + uni = u'abcdefg' + data = rffi.unicode2wcharp(uni) + w_s = api.PyUnicode_EncodeLatin1(data, len(uni), lltype.nullptr(rffi.CCHARP.TO)) + assert space.eq_w(space.wrap("abcdefg"), w_s) + rffi.free_wcharp(data) + + ustr = "abcdef" + w_ustr = space.wrap(ustr.decode("ascii")) + result = api.PyUnicode_AsLatin1String(w_ustr) + assert space.eq_w(space.wrap(ustr), result) + def test_format(self, space, api): w_format = space.wrap(u'hi %s') w_args = space.wrap((u'test',)) diff --git a/pypy/module/cpyext/test/test_weakref.py b/pypy/module/cpyext/test/test_weakref.py --- a/pypy/module/cpyext/test/test_weakref.py +++ b/pypy/module/cpyext/test/test_weakref.py @@ -15,6 +15,12 @@ assert api.PyErr_Occurred() is space.w_TypeError api.PyErr_Clear() + def test_proxy(self, space, api): + w_obj = space.w_Warning # some weakrefable object + w_proxy = api.PyWeakref_NewProxy(w_obj, None) + assert space.unwrap(space.str(w_proxy)) == "<type 'exceptions.Warning'>" + assert space.unwrap(space.repr(w_proxy)).startswith('<weak') + def test_weakref_lockobject(self, space, api): # some new weakrefable object w_obj = space.call_function(space.w_type, space.wrap("newtype"), 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 @@ -14,6 +14,7 @@ from pypy.module.sys.interp_encoding import setdefaultencoding from pypy.objspace.std import unicodeobject, unicodetype from pypy.rlib import runicode +from pypy.tool.sourcetools import func_renamer import sys ## See comment in stringobject.py. @@ -417,26 +418,49 @@ ref[0] = rffi.cast(PyObject, py_newuni) return 0 -@cpython_api([PyObject], PyObject) -def PyUnicode_AsUTF8String(space, w_unicode): - """Encode a Unicode object using UTF-8 and return the result as Python string - object. Error handling is "strict". Return NULL if an exception was raised - by the codec.""" - if not PyUnicode_Check(space, w_unicode): - PyErr_BadArgument(space) - return unicodetype.encode_object(space, w_unicode, "utf-8", "strict") +def make_conversion_functions(suffix, encoding): + @cpython_api([PyObject], PyObject) + @func_renamer('PyUnicode_As%sString' % suffix) + def PyUnicode_AsXXXString(space, w_unicode): + """Encode a Unicode object and return the result as Python + string object. Error handling is "strict". Return NULL if an + exception was raised by the codec.""" + if not PyUnicode_Check(space, w_unicode): + PyErr_BadArgument(space) + return unicodetype.encode_object(space, w_unicode, encoding, "strict") -@cpython_api([CONST_STRING, Py_ssize_t, CONST_STRING], PyObject) -def PyUnicode_DecodeUTF8(space, s, size, errors): - """Create a Unicode object by decoding size bytes of the UTF-8 encoded string - s. Return NULL if an exception was raised by the codec. - """ - w_str = space.wrap(rffi.charpsize2str(s, size)) - if errors: - w_errors = space.wrap(rffi.charp2str(errors)) - else: - w_errors = space.w_None - return space.call_method(w_str, 'decode', space.wrap("utf-8"), w_errors) + @cpython_api([CONST_STRING, Py_ssize_t, CONST_STRING], PyObject) + @func_renamer('PyUnicode_Decode%s' % suffix) + def PyUnicode_DecodeXXX(space, s, size, errors): + """Create a Unicode object by decoding size bytes of the + encoded string s. Return NULL if an exception was raised by + the codec. + """ + w_s = space.wrap(rffi.charpsize2str(s, size)) + if errors: + w_errors = space.wrap(rffi.charp2str(errors)) + else: + w_errors = space.w_None + return space.call_method(w_s, 'decode', space.wrap(encoding), w_errors) + + @cpython_api([CONST_WSTRING, Py_ssize_t, CONST_STRING], PyObject) + @func_renamer('PyUnicode_Encode%s' % suffix) + def PyUnicode_EncodeXXX(space, s, size, errors): + """Encode the Py_UNICODE buffer of the given size and return a + Python string object. Return NULL if an exception was raised + by the codec.""" + w_u = space.wrap(rffi.wcharpsize2unicode(s, size)) + if errors: + w_errors = space.wrap(rffi.charp2str(errors)) + else: + w_errors = space.w_None + return space.call_method(w_u, 'encode', space.wrap(encoding), w_errors) + +make_conversion_functions('UTF8', 'utf-8') +make_conversion_functions('ASCII', 'ascii') +make_conversion_functions('Latin1', 'latin-1') +if sys.platform == 'win32': + make_conversion_functions('MBCS', 'mbcs') @cpython_api([rffi.CCHARP, Py_ssize_t, rffi.CCHARP, rffi.INTP], PyObject) def PyUnicode_DecodeUTF16(space, s, size, llerrors, pbyteorder): @@ -493,56 +517,6 @@ return space.wrap(result) -@cpython_api([PyObject], PyObject) -def PyUnicode_AsASCIIString(space, w_unicode): - """Encode a Unicode object using ASCII and return the result as Python string - object. Error handling is "strict". Return NULL if an exception was raised - by the codec.""" - return space.call_method(w_unicode, 'encode', space.wrap('ascii')) #space.w_None for errors? - -@cpython_api([rffi.CCHARP, Py_ssize_t, rffi.CCHARP], PyObject) -def PyUnicode_DecodeASCII(space, s, size, errors): - """Create a Unicode object by decoding size bytes of the ASCII encoded string - s. Return NULL if an exception was raised by the codec.""" - w_s = space.wrap(rffi.charpsize2str(s, size)) - return space.call_method(w_s, 'decode', space.wrap('ascii')) - -@cpython_api([rffi.CWCHARP, Py_ssize_t, rffi.CCHARP], PyObject) -def PyUnicode_EncodeASCII(space, s, size, errors): - """Encode the Py_UNICODE buffer of the given size using ASCII and return a - Python string object. Return NULL if an exception was raised by the codec. - """ - - w_s = space.wrap(rffi.wcharpsize2unicode(s, size)) - return space.call_method(w_s, 'encode', space.wrap('ascii')) - -if sys.platform == 'win32': - @cpython_api([CONST_WSTRING, Py_ssize_t, CONST_STRING], PyObject) - def PyUnicode_EncodeMBCS(space, wchar_p, length, errors): - """Encode the Py_UNICODE buffer of the given size using MBCS and return a - Python string object. Return NULL if an exception was raised by the codec. - """ - w_unicode = space.wrap(rffi.wcharpsize2unicode(wchar_p, length)) - if errors: - w_errors = space.wrap(rffi.charp2str(errors)) - else: - w_errors = space.w_None - return space.call_method(w_unicode, "encode", - space.wrap("mbcs"), w_errors) - - @cpython_api([CONST_STRING, Py_ssize_t, CONST_STRING], PyObject) - def PyUnicode_DecodeMBCS(space, s, size, errors): - """Create a Unicode object by decoding size bytes of the MBCS encoded string s. - Return NULL if an exception was raised by the codec. - """ - w_str = space.wrap(rffi.charpsize2str(s, size)) - w_encoding = space.wrap("mbcs") - if errors: - w_errors = space.wrap(rffi.charp2str(errors)) - else: - w_errors = space.w_None - return space.call_method(w_str, 'decode', w_encoding, w_errors) - @cpython_api([PyObject, PyObject], rffi.INT_real, error=-2) def PyUnicode_Compare(space, w_left, w_right): """Compare two strings and return -1, 0, 1 for less than, equal, and greater diff --git a/pypy/module/cpyext/weakrefobject.py b/pypy/module/cpyext/weakrefobject.py --- a/pypy/module/cpyext/weakrefobject.py +++ b/pypy/module/cpyext/weakrefobject.py @@ -1,6 +1,6 @@ from pypy.module.cpyext.api import cpython_api from pypy.module.cpyext.pyobject import PyObject, borrow_from -from pypy.module._weakref.interp__weakref import W_Weakref +from pypy.module._weakref.interp__weakref import W_Weakref, proxy @cpython_api([PyObject, PyObject], PyObject) def PyWeakref_NewRef(space, w_obj, w_callback): @@ -16,6 +16,20 @@ w_weakref = space.gettypeobject(W_Weakref.typedef) return space.call_function(w_weakref, w_obj, w_callback) +@cpython_api([PyObject, PyObject], PyObject) +def PyWeakref_NewProxy(space, w_obj, w_callback): + """Return a weak reference proxy object for the object *ob*. This will + alwas return a new reference, but is not guaranteed to create a new + object; an existing proxy object may be returned. The second parameter, + *callback*, can be a callable object that receives notification when *ob* + is garbage collected; it should accept a single parameter, which will be + the weak reference object itself. *callback* may also be ``None`` or + *NULL*. If *ob* is not a weakly-referencable object, or if *callback* is + not callable, ``None``, or *NULL*, this will return *NULL* and raise + :exc:`TypeError`. + """ + return proxy(space, w_obj, w_callback) + @cpython_api([PyObject], PyObject) def PyWeakref_GetObject(space, w_ref): """Return the referenced object from a weak reference. If the referent is 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 @@ -202,7 +202,7 @@ return space.newtuple([self.descr_len(space)]) def descr_get_size(self, space): - return space.wrap(self.size) + return space.wrap(self.find_size()) def descr_copy(self, space): return space.call_function(space.gettypefor(BaseArray), self, self.find_dtype()) 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 @@ -21,7 +21,9 @@ from numpy import array # XXX fixed on multidim branch #assert array(3).size == 1 - assert array([1, 2, 3]).size == 3 + a = array([1, 2, 3]) + assert a.size == 3 + assert (a + a).size == 3 def test_empty(self): """ _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit