[PyObjC-svn] r2410 - in trunk/pyobjc/pyobjc-core: Lib/objc Modules/objc PyObjCTest

[email protected] Tue, 02 Mar 2010 16:35:21 -0600
Newsgroups gmane.comp.python.pyobjc.cvs
Message-ID <[email protected]>
Author: ronaldoussoren
Date: Tue Mar  2 16:35:21 2010
New Revision: 2410

Log:
* Improve test coverage for 'objc.object_property'
* Fix issues uncovered by the additional tests


Modified:
   trunk/pyobjc/pyobjc-core/Lib/objc/_properties.py
   trunk/pyobjc/pyobjc-core/Modules/objc/class-builder.m
   trunk/pyobjc/pyobjc-core/Modules/objc/module.m
   trunk/pyobjc/pyobjc-core/Modules/objc/objc-class.m
   trunk/pyobjc/pyobjc-core/PyObjCTest/test_splitsig.py

Modified: trunk/pyobjc/pyobjc-core/Lib/objc/_properties.py
==============================================================================
--- trunk/pyobjc/pyobjc-core/Lib/objc/_properties.py	(original)
+++ trunk/pyobjc/pyobjc-core/Lib/objc/_properties.py	Tue Mar  2 16:35:21 2010
@@ -28,13 +28,13 @@
 
 def _dynamic_getter(name):
     def getter(object):
-        m = getatrr(object.pyobjc_instanceMethods, name)
+        m = getattr(object.pyobjc_instanceMethods, name)
         return m()
     return getter
 
 def _dynamic_setter(name):
     def setter(object, value):
-        m = getatrr(object.pyobjc_instanceMethods, name)
+        m = getattr(object.pyobjc_instanceMethods, name)
         return m(value)
     return setter
 
@@ -68,8 +68,8 @@
                 ivar=self._ivar, typestr=self._typestr, depends_on=None)
         v.__inherit = True
 
-        v.__getprop = self.__getter
-        v.__setprop = self.__setter
+        v.__getprop = self.__getprop
+        v.__setprop = self.__setprop
         v.__parent = self
 
         return v
@@ -93,14 +93,15 @@
             self._setter = None
 
         else:
-            setterName = 'set%s%s:'%(name[0].upper(), name[1:])
-            signature = 'v@:' + self._typestr
+            setterName = b'set%s%s:'%(name[0].upper().encode('latin1'), name[1:].encode('latin1'))
+            signature = b'v@:' + self._typestr
             if self._setter is None:
                 if self.__inherit:
                     pass
 
                 elif self._dynamic:
                     self.__setprop = _dynamic_setter(setterName)
+                    instance_methods.add(setterName)
 
                 else:
 
@@ -126,9 +127,9 @@
                 instance_methods.add(self.__setprop)
 
         if self._typestr in (_C_NSBOOL, _C_BOOL):
-            getterName = 'is%s%s'%(name[0].upper(), name[:1])
+            getterName = b'is%s%s'%(name[0].upper().encode('latin1'), name[:1].encode('latin1'))
         else:
-            getterName = self._name
+            getterName = self._name.encode('latin1')
 
         if self._getter is None:
             if self.__inherit:
@@ -136,6 +137,7 @@
 
             elif self._dynamic:
                 self.__getprop = _dynamic_getter(getterName)
+                instance_methods.add(getterName)
 
             else:
                 if self._ivar is NULL:
@@ -158,11 +160,11 @@
             instance_methods.add(self.__getprop)
 
         if self._validate is not None:
-            selName = 'validate%s%s:error:'%(
-                    self._name[0].upper(), self._name[1:])
-            signature = _NSBOOL + '@:N^@o^@'
+            selName = b'validate%s%s:error:'%(
+                    self._name[0].upper().encode('latin'), self._name[1:].encode('latin'))
+            signature = _C_NSBOOL + b'@:N^@o^@'
             validate = selector(
-                    self.validate,
+                    self._validate,
                     selector=selName,
                     signature=signature)
             validate.isHidden = True
@@ -181,12 +183,14 @@
                         self._name[0].upper(), self._name[1:]),
                     signature = '@@:',
                     isClassMethod=True)
-            #affecting.isHidden = True
+            affecting.isHidden = True
             class_dict[affecting.selector] = affecting
             class_methods.add(affecting)
-                   
+
 
     def __get__(self, object, owner):
+        if object is None:
+            return self
         return self.__getprop(object)
 
     def __set__(self, object, value):
@@ -213,14 +217,16 @@
         return self
 
     def setter(self, function):
-        if self._ro:
-            raise ValueError("Defining settter for read-only property")
 
         if self.__created:
             v = self._clone()
+            v._ro = False
             v._setter = function
             return v
 
+        if self._ro:
+            raise ValueError("Defining settter for read-only property")
+
         self._setter = function
         return self
 

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/class-builder.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/class-builder.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/class-builder.m	Tue Mar  2 16:35:21 2010
@@ -1163,6 +1163,13 @@
 	for (i = 0; i < PySequence_Fast_GET_SIZE(instance_methods); i++) {
 		value = PySequence_Fast_GET_ITEM(instance_methods, i);
 
+		if (PyBytes_Check(value)) {
+			int r = PySet_Add(hiddenSelectors, value);
+			if (r == -1) {
+				goto error_cleanup;
+			}
+		}
+
 		if (!PyObjCSelector_Check(value)) {
 			continue;
 		}

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/module.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/module.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/module.m	Tue Mar  2 16:35:21 2010
@@ -347,15 +347,20 @@
 		}
 #endif
 
-		if (PyObjCSelector_IsClassMethod(aMethod)) {
-			r = PyDict_SetItem(metaDict, name, aMethod);
+		if (!PyObjCClass_HiddenSelector(classObject, objcMethod->name)) {
+			if (PyObjCSelector_IsClassMethod(aMethod)) {
+				r = PyDict_SetItem(metaDict, name, aMethod);
+			} else {
+				r = PyDict_SetItem(extraDict, name, aMethod);
+			}
+			Py_DECREF(name); name = NULL;
+			Py_DECREF(aMethod); aMethod = NULL;
+			if (r == -1) {
+				goto cleanup_and_return_error;
+			}
 		} else {
-			r = PyDict_SetItem(extraDict, name, aMethod);
-		}
-		Py_DECREF(name); name = NULL;
-		Py_DECREF(aMethod); aMethod = NULL;
-		if (r == -1) {
-			goto cleanup_and_return_error;
+			Py_DECREF(name); name = NULL;
+			Py_DECREF(aMethod); aMethod = NULL;
 		}
 	}
 

Modified: trunk/pyobjc/pyobjc-core/Modules/objc/objc-class.m
==============================================================================
--- trunk/pyobjc/pyobjc-core/Modules/objc/objc-class.m	(original)
+++ trunk/pyobjc/pyobjc-core/Modules/objc/objc-class.m	Tue Mar  2 16:35:21 2010
@@ -924,7 +924,6 @@
 class_getattro(PyObject* self, PyObject* name)
 {
 	PyObject* result = NULL;
-
 	/* Python will look for a number of "private" attributes during 
 	 * normal operations, such as when building subclasses. Avoid a
 	 * method rescan when that happens.
@@ -960,7 +959,6 @@
 		PyErr_Clear();
 	}
 #endif
-
 	PyObjCClass_CheckMethodList(self, 1);
 	
 	result = PyType_Type.tp_getattro(self, name);
@@ -975,10 +973,19 @@
 		if (bytes == NULL) {
 			return NULL;
 		}
+		if (PyObjCClass_HiddenSelector(self, sel_getUid(PyString_AsString(bytes)))) {
+			Py_DECREF(bytes);
+			PyErr_SetObject(PyExc_AttributeError, name);
+			return NULL;
+		}
 		result = PyObjCSelector_FindNative(self, PyBytes_AsString(bytes));
 		Py_DECREF(bytes);
 #if PY_MAJOR_VERSION == 2
 	} else if (PyString_Check(name)) {
+		if (PyObjCClass_HiddenSelector(self, sel_getUid(PyString_AsString(name)))) {
+			PyErr_SetObject(PyExc_AttributeError, name);
+			return NULL;
+		}
 		result = PyObjCSelector_FindNative(self, PyString_AsString(name));
 #endif
 	} else {
@@ -1108,16 +1115,21 @@
 			}
 		}
 
-		if (PyObjCSelector_IsClassMethod(newVal)) {
-			r = PyDict_SetItem(Py_TYPE(self)->tp_dict, name, newVal);
 
+		if (PyObjCClass_HiddenSelector(self, PyObjCSelector_GetSelector(newVal))) {
+			Py_DECREF(newVal);
 		} else {
-			r = PyDict_SetItem(((PyTypeObject*)self)->tp_dict, name, newVal);
-		}
-		Py_DECREF(newVal);
-		if (r == -1) {
-			PyErr_NoMemory();
-			return -1;
+			if (PyObjCSelector_IsClassMethod(newVal)) {
+				r = PyDict_SetItem(Py_TYPE(self)->tp_dict, name, newVal);
+
+			} else {
+				r = PyDict_SetItem(((PyTypeObject*)self)->tp_dict, name, newVal);
+			}
+			Py_DECREF(newVal);
+			if (r == -1) {
+				PyErr_NoMemory();
+				return -1;
+			}
 		}
 		return 0;
 	}
@@ -1469,10 +1481,12 @@
 		}
 
 		/* Check if the selector should be hidden */
-		if (PyObjCClass_HiddenSelector(py_class, method_getName(methods[i]))) {
+		if (PyObjCClass_HiddenSelector(py_class, 
+					method_getName(methods[i]))) {
 			continue;
 		}
 
+
 		name = (char*)PyObjC_SELToPythonName(
 					method_getName(methods[i]), 
 					selbuf, 
@@ -1520,6 +1534,12 @@
 
 		dict = classDict;
 
+		/* Check if the selector should be hidden */
+		if (PyObjCClass_HiddenSelector(py_class, 
+					method_getName(methods[i]))) {
+			continue;
+		}
+
 		name = PyObjC_SELToPythonName(
 			method_getName(methods[i]), 
 			selbuf, 

Modified: trunk/pyobjc/pyobjc-core/PyObjCTest/test_splitsig.py
==============================================================================
--- trunk/pyobjc/pyobjc-core/PyObjCTest/test_splitsig.py	(original)
+++ trunk/pyobjc/pyobjc-core/PyObjCTest/test_splitsig.py	Tue Mar  2 16:35:21 2010
@@ -92,7 +92,8 @@
         ]
 
         for cls in objc.getClassList():
-            if cls.__name__.startswith('OC_'): continue
+            #if cls.__name__.startswith('OC_'): continue
+            if cls.__name__.startswith('OC'): continue
             for selName in cls.__dict__.keys():
                 self.assertIsInstance(selName, str)
                 if selName in EXCEPTIONS: continue

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev