]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
If a control has no refcon pointing back to the Python object we create a new
authorJack Jansen <jack.jansen@cwi.nl>
Sat, 13 Mar 1999 23:07:32 +0000 (23:07 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Sat, 13 Mar 1999 23:07:32 +0000 (23:07 +0000)
Python object. This needs a new bgenObjectDefinition.py, which implements
compare and hash functions.

Mac/Modules/ctl/Ctlmodule.c
Mac/Modules/ctl/ctlsupport.py

index 42a82d9ac8c006b6eac7c84a1a21223fe0ac96a4..895187e80dde8d48b037c4d9f20eb87223bb6693 100644 (file)
@@ -1016,6 +1016,34 @@ static PyObject *CtlObj_getattr(self, name)
 
 #define CtlObj_setattr NULL
 
+static int CtlObj_compare(self, other)
+       ControlObject *self, *other;
+{
+       unsigned long v, w;
+
+       if (!CtlObj_Check((PyObject *)other))
+       {
+               v=(unsigned long)self;
+               w=(unsigned long)other;
+       }
+       else
+       {
+               v=(unsigned long)self->ob_itself;
+               w=(unsigned long)other->ob_itself;
+       }
+       if( v < w ) return -1;
+       if( v > w ) return 1;
+       return 0;
+}
+
+#define CtlObj_repr NULL
+
+static long CtlObj_hash(self)
+       ControlObject *self;
+{
+       return (long)self->ob_itself;
+}
+
 PyTypeObject Control_Type = {
        PyObject_HEAD_INIT(&PyType_Type)
        0, /*ob_size*/
@@ -1027,6 +1055,12 @@ PyTypeObject Control_Type = {
        0, /*tp_print*/
        (getattrfunc) CtlObj_getattr, /*tp_getattr*/
        (setattrfunc) CtlObj_setattr, /*tp_setattr*/
+       (cmpfunc) CtlObj_compare, /*tp_compare*/
+       (reprfunc) CtlObj_repr, /*tp_repr*/
+       (PyNumberMethods *)0, /* tp_as_number */
+       (PySequenceMethods *)0, /* tp_as_sequence */
+       (PyMappingMethods *)0, /* tp_as_mapping */
+       (hashfunc) CtlObj_hash, /*tp_hash*/
 };
 
 /* -------------------- End object type Control --------------------- */
@@ -1388,18 +1422,33 @@ static PyMethodDef Ctl_methods[] = {
 
 
 
+PyObject *CtlObj_NewUnmanaged(itself)
+       ControlHandle itself;
+{
+       ControlObject *it;
+       if (itself == NULL) return PyMac_Error(resNotFound);
+       it = PyObject_NEW(ControlObject, &Control_Type);
+       if (it == NULL) return NULL;
+       it->ob_itself = itself;
+       return (PyObject *)it;
+}
+
 PyObject *
 CtlObj_WhichControl(ControlHandle c)
 {
        PyObject *it;
        
-       /* XXX What if we find a control belonging to some other package? */
        if (c == NULL)
-               it = NULL;
-       else
-               it = (PyObject *) GetControlReference(c);
-       if (it == NULL || ((ControlObject *)it)->ob_itself != c)
                it = Py_None;
+       else {
+               it = (PyObject *) GetControlReference(c);
+               /*
+               ** If the refcon is zero or doesn't point back to the Python object
+               ** the control is not ours. Return a temporary object.
+               */
+               if (it == NULL || ((ControlObject *)it)->ob_itself != c)
+                       return CtlObj_NewUnmanaged(c);
+       }
        Py_INCREF(it);
        return it;
 }
index 3ba67785e8fcddfb536792699e69899b20da1595..8d966f9773076631b4663a9b78821cbcfc6c0149 100644 (file)
@@ -89,18 +89,33 @@ extern void clrtrackfunc(void);     /* forward */
 """
 
 finalstuff = finalstuff + """
+PyObject *CtlObj_NewUnmanaged(itself)
+       ControlHandle itself;
+{
+       ControlObject *it;
+       if (itself == NULL) return PyMac_Error(resNotFound);
+       it = PyObject_NEW(ControlObject, &Control_Type);
+       if (it == NULL) return NULL;
+       it->ob_itself = itself;
+       return (PyObject *)it;
+}
+
 PyObject *
 CtlObj_WhichControl(ControlHandle c)
 {
        PyObject *it;
        
-       /* XXX What if we find a control belonging to some other package? */
        if (c == NULL)
-               it = NULL;
-       else
-               it = (PyObject *) GetControlReference(c);
-       if (it == NULL || ((ControlObject *)it)->ob_itself != c)
                it = Py_None;
+       else {
+               it = (PyObject *) GetControlReference(c);
+               /*
+               ** If the refcon is zero or doesn't point back to the Python object
+               ** the control is not ours. Return a temporary object.
+               */
+               if (it == NULL || ((ControlObject *)it)->ob_itself != c)
+                       return CtlObj_NewUnmanaged(c);
+       }
        Py_INCREF(it);
        return it;
 }
@@ -147,7 +162,7 @@ initstuff = initstuff + """
 mytracker_upp = NewControlActionProc(mytracker);
 """
 
-class MyObjectDefinition(GlobalObjectDefinition):
+class MyObjectDefinition(ObjectIdentityMixin, GlobalObjectDefinition):
        def outputCheckNewArg(self):
                Output("if (itself == NULL) return PyMac_Error(resNotFound);")
        def outputInitStructMembers(self):