[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