[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® 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