]> granicus.if.org Git - python/commitdiff
Added WeakLink...Generator classes (should have done that ages ago). These check...
authorJack Jansen <jack.jansen@cwi.nl>
Sun, 1 Jul 2001 22:09:29 +0000 (22:09 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Sun, 1 Jul 2001 22:09:29 +0000 (22:09 +0000)
This allows system libs to be weak-linked, thereby allowing us to generate functions that are only available on some OS versions without getting a NULL dereference if the function isn't available.

Tools/bgen/bgen/bgenGenerator.py
Tools/bgen/bgen/macsupport.py

index 94905be22d36e75118d076f74b80ac10060fcb66..47fed8e9fb4a45630e0cab2eb66fd05431081fe8 100644 (file)
@@ -164,6 +164,7 @@ class FunctionGenerator(BaseFunctionGenerator):
        
        def functionbody(self):
                self.declarations()
+               self.precheck()
                self.getargs()
                self.callit()
                self.checkit()
@@ -194,6 +195,9 @@ class FunctionGenerator(BaseFunctionGenerator):
                                continue
                        if arg.mode in (InMode, InOutMode):
                                arg.getargsCheck()
+       
+       def precheck(self):
+               pass
 
        def callit(self):
                args = ""
index 50b2eaacc31bfde074f19cc6d8afbf030b73bae3..d8677b00410ff2ff5af2ca84430c1f2e2776f468 100644 (file)
@@ -118,6 +118,14 @@ VarVarOutBuffer = VarVarHeapOutputBufferType('char', 'long', 'l') # (buf, len, &
 includestuff = """
 #include "macglue.h"
 #include "pymactoolbox.h"
+
+/* Macro to test whether a weak-loaded CFM function exists */
+#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\\
+       PyErr_SetString(PyExc_NotImplementedError, \\
+       "Not available in this shared library/OS version"); \\
+       return NULL; \\
+    }} while(0)
+
 """
 
 # Stuff added just before the module's init function
@@ -145,6 +153,16 @@ class OSErrMixIn:
 class OSErrFunctionGenerator(OSErrMixIn, FunctionGenerator): pass
 class OSErrMethodGenerator(OSErrMixIn, MethodGenerator): pass
 
+class WeakLinkMixIn:
+       "Mix-in to test the function actually exists (!= NULL) before calling"
+       
+       def precheck(self):
+               Output('PyMac_PRECHECK(%s);', self.name)
+
+class WeakLinkFunctionGenerator(WeakLinkMixIn, FunctionGenerator): pass
+class WeakLinkMethodGenerator(WeakLinkMixIn, MethodGenerator): pass
+class OSErrWeakLinkFunctionGenerator(OSErrMixIn, WeakLinkMixIn, FunctionGenerator): pass
+class OSErrWeakLinkMethodGenerator(OSErrMixIn, WeakLinkMixIn, MethodGenerator): pass
 
 class MacModule(Module):
        "Subclass which gets the exception initializer from macglue.c"