[pypy-svn] r72733 - in pypy/branch/cpython-extension/pypy/module/cpyext: . include test
jandem at codespeak.net
jandem at codespeak.net
Wed Mar 24 17:57:28 CET 2010
Author: jandem
Date: Wed Mar 24 17:57:25 2010
New Revision: 72733
Modified:
pypy/branch/cpython-extension/pypy/module/cpyext/include/object.h
pypy/branch/cpython-extension/pypy/module/cpyext/object.py
pypy/branch/cpython-extension/pypy/module/cpyext/test/test_object.py
Log:
Add PyObject_{HasAttr, SetAttr}, simplify tests a bit
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/include/object.h
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/include/object.h (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/include/object.h Wed Mar 24 17:57:25 2010
@@ -396,5 +396,7 @@
int PyObject_IsTrue(PyObject *);
int PyObject_Not(PyObject *);
+int PyObject_HasAttr(PyObject *, PyObject *);
+int PyObject_SetAttr(PyObject *, PyObject *, PyObject *);
#endif
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/object.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/object.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/object.py Wed Mar 24 17:57:25 2010
@@ -5,7 +5,7 @@
from pypy.module.cpyext.macros import Py_INCREF, Py_DECREF
from pypy.module.cpyext.typeobject import PyTypeObjectPtr, W_PyCTypeObject, W_PyCObject
from pypy.objspace.std.objectobject import W_ObjectObject
-
+import pypy.module.__builtin__.operation as operation
@cpython_api([PyObject], PyObject)
def _PyObject_New(space, w_type):
@@ -33,3 +33,13 @@
@cpython_api([PyObject], rffi.INT_real)
def PyObject_Not(space, w_obj):
return not space.is_true(w_obj)
+
+ at cpython_api([PyObject, PyObject], rffi.INT_real)
+def PyObject_HasAttr(space, w_obj, w_name):
+ w_res = operation.hasattr(space, w_obj, w_name)
+ return space.is_true(w_res)
+
+ at cpython_api([PyObject, PyObject, PyObject], rffi.INT_real)
+def PyObject_SetAttr(space, w_obj, w_name, w_value):
+ operation.setattr(space, w_obj, w_name, w_value)
+ return 0
Modified: pypy/branch/cpython-extension/pypy/module/cpyext/test/test_object.py
==============================================================================
--- pypy/branch/cpython-extension/pypy/module/cpyext/test/test_object.py (original)
+++ pypy/branch/cpython-extension/pypy/module/cpyext/test/test_object.py Wed Mar 24 17:57:25 2010
@@ -3,29 +3,64 @@
import py
import sys
+
class AppTestObject(AppTestCpythonExtensionBase):
def test_IsTrue(self):
module = self.import_extension('foo', [
- ("test_IsTrue", "METH_VARARGS",
+ ("is_true", "METH_VARARGS",
"""
PyObject* arg = PyTuple_GetItem(args, 0);
return PyBool_FromLong(PyObject_IsTrue(arg));
"""),
])
- assert module.test_IsTrue(True)
- assert module.test_IsTrue(1.0)
- assert not module.test_IsTrue(False)
- assert not module.test_IsTrue(0)
+ assert module.is_true(True)
+ assert module.is_true(1.0)
+ assert not module.is_true(False)
+ assert not module.is_true(0)
def test_Not(self):
module = self.import_extension('foo', [
- ("test_Not", "METH_VARARGS",
+ ("not_", "METH_VARARGS",
"""
PyObject* arg = PyTuple_GetItem(args, 0);
return PyBool_FromLong(PyObject_Not(arg));
"""),
])
- assert module.test_Not(False)
- assert module.test_Not(0)
- assert not module.test_Not(True)
- assert not module.test_Not(3.14)
+ assert module.not_(False)
+ assert module.not_(0)
+ assert not module.not_(True)
+ assert not module.not_(3.14)
+
+ def test_HasAttr(self):
+ module = self.import_extension('foo', [
+ ("hasattr", "METH_VARARGS",
+ """
+ PyObject* obj = PyTuple_GetItem(args, 0);
+ PyObject* name = PyTuple_GetItem(args, 1);
+ return PyBool_FromLong(PyObject_HasAttr(obj, name));
+ """),
+ ])
+ assert module.hasattr('', '__len__')
+ assert module.hasattr(int, '__eq__')
+ assert not module.hasattr(int, 'nonexistingattr')
+
+ def test_SetAttr(self):
+ module = self.import_extension('foo', [
+ ("setattr", "METH_VARARGS",
+ """
+ PyObject* obj = PyTuple_GetItem(args, 0);
+ PyObject* name = PyTuple_GetItem(args, 1);
+ PyObject* value = PyTuple_GetItem(args, 2);
+ PyObject_SetAttr(obj, name, value);
+ Py_INCREF(Py_None);
+ return Py_None;
+ """),
+ ])
+ class X:
+ pass
+ x = X()
+ module.setattr(x, 'test', 5)
+ assert hasattr(x, 'test')
+ assert x.test == 5
+ module.setattr(x, 'test', 10)
+ assert x.test == 10
More information about the Pypy-commit
mailing list