[Zope3-checkins] CVS: Zope3/src/zope/interface - _zope_interface_ospec.c:1.8

Jeremy Hylton jeremy@zope.com
Sat, 21 Jun 2003 17:52:08 -0400


Update of /cvs-repository/Zope3/src/zope/interface
In directory cvs.zope.org:/tmp/cvs-serv7873/src/zope/interface

Modified Files:
	_zope_interface_ospec.c 
Log Message:
Rearrange imports and definitions to avoid circular import problem.

Puzzling case.  I only see the failures on Windows, but looking at the code I don't see how it ever works.  Regardless, the changes allow things to work on Windows and all the tests pass.


=== Zope3/src/zope/interface/_zope_interface_ospec.c 1.7 => 1.8 ===
--- Zope3/src/zope/interface/_zope_interface_ospec.c:1.7	Mon Jun  2 07:07:41 2003
+++ Zope3/src/zope/interface/_zope_interface_ospec.c	Sat Jun 21 17:52:08 2003
@@ -601,88 +601,97 @@
         /* tp_descr_get      */ (descrgetfunc)OSpecDescr_descr_get,
 };
 
-static struct PyMethodDef module_methods[] = {
-	{"getObjectSpecification",  (PyCFunction)getObjectSpecification,
-         METH_O, "internal function to compute an object spec"},
-	{"providedBy",  (PyCFunction)providedBy, METH_O, 
-         "Return a specification for the interfaces of an object"},
-	{NULL,	 (PyCFunction)NULL, 0, NULL}		/* sentinel */
-};
-
-
-static char _zope_interface_ospec_module_documentation[] = 
-"C implementation of parts of zope.interface.declarations"
-;
-
-#ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
-#define PyMODINIT_FUNC void
-#endif
-PyMODINIT_FUNC
-init_zope_interface_ospec(void)
+int
+init_globals(void)
 {
-  PyObject *module;
-
   str___implements__ = PyString_FromString("__implements__");
   if (str___implements__ == NULL)
-    return;
+    return -1;
   
   str___provides__ = PyString_FromString("__provides__");
   if (str___provides__ == NULL)
-    return;
+    return -1;
   
   str___providedBy__ = PyString_FromString("__providedBy__");
   if (str___providedBy__ == NULL)
-    return;
+    return -1;
   
   str___class__ = PyString_FromString("__class__");
   if (str___class__ == NULL)
-    return;
+    return -1;
   
   str___dict__ = PyString_FromString("__dict__");
   if (str___dict__ == NULL)
-    return;
+    return -1;
   
   str___signature__ = PyString_FromString("__signature__");
   if (str___signature__ == NULL)
-    return;
+    return -1;
   
   str_flattened = PyString_FromString("flattened");
   if (str_flattened == NULL)
-    return;
+    return -1;
   
   str_extends = PyString_FromString("extends");
   if (str_extends == NULL)
-    return;
+    return -1;
   
   str_only = PyString_FromString("only");
   if (str_only == NULL)
-    return;
+    return -1;
   
   _implements_reg = PyDict_New();
   if (_implements_reg == NULL)
-    return;
+    return -1;
+
+  return 0;
+}
 
+int
+init_declarations(void)
+{
   declarations = PyImport_ImportModule("zope.interface.declarations");
-  if (declarations == NULL) 
-    return;
+  if (declarations == NULL)
+    return -1;
 
   classImplements = PyObject_GetAttrString(declarations, "classImplements");
   if (classImplements == NULL)
-    return;
+    return -1;
 
   proxySig = PyObject_GetAttrString(declarations, "proxySig");
   if (proxySig == NULL)
-    return;
+    return -1;
 
   oldSpecSig = PyObject_GetAttrString(declarations, "oldSpecSig");
   if (oldSpecSig == NULL)
-    return;
+    return -1;
 
   combinedSpec = PyObject_GetAttrString(declarations, "combinedSpec");
   if (combinedSpec == NULL)
-    return;
- 
-  
+    return -1;
+  return 0;
+}
+
+static struct PyMethodDef module_methods[] = {
+	{"getObjectSpecification",  (PyCFunction)getObjectSpecification,
+         METH_O, "internal function to compute an object spec"},
+	{"providedBy",  (PyCFunction)providedBy, METH_O, 
+         "Return a specification for the interfaces of an object"},
+	{NULL,	 (PyCFunction)NULL, 0, NULL}		/* sentinel */
+};
+
+static char _zope_interface_ospec_module_documentation[] = 
+"C implementation of parts of zope.interface.declarations"
+;
+
+#ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
+#define PyMODINIT_FUNC void
+#endif
+PyMODINIT_FUNC
+init_zope_interface_ospec(void)
+{
+  PyObject *module;
+
   /* Initialize types: */  
 
   ISBType.tp_new = PyType_GenericNew;
@@ -701,28 +710,40 @@
 
  
   OSpecDescrType.tp_new = PyType_GenericNew;
-    if (PyType_Ready(&OSpecDescrType) < 0)
+  if (PyType_Ready(&OSpecDescrType) < 0)
     return;
 
-
+  if (init_globals() < 0)
+    return;
+  
   /* Create the module and add the functions */
   module = Py_InitModule3("_zope_interface_ospec", module_methods,
                           _zope_interface_ospec_module_documentation);
   
   if (module == NULL)
     return;
-  
+
   /* Add types: */
   if (PyModule_AddObject(module, "InterfaceSpecificationBase", 
                          (PyObject *)&ISBType) < 0)
     return;
+
   if (PyModule_AddObject(module, "ObjectSpecification", 
                          (PyObject *)&OSpecType) < 0)
     return;
+
   if (PyModule_AddObject(module, "ObjectSpecificationDescriptor", 
                          (PyObject *)&OSpecDescrType) < 0)
     return;
+
   if (PyModule_AddObject(module, "_implements_reg", _implements_reg) < 0)
     return;
+
+  /* init_declarations() loads objects from zope.interface.declarations,
+     which circularly depends on the objects defined in this module.
+     Call init_declarations() last to ensure that the necessary names
+     are bound.
+  */
+  init_declarations();
 }