Perl code patch contributed by "Kurt J. Pires" <kjpires@iat.com>
[openssl.git] / perl / OpenSSL.xs
index 2267168..6ef66cc 100644 (file)
@@ -72,11 +72,38 @@ BOOT:
     boot_digest();
     boot_err();
     boot_ssl();
-    boot_OpenSSL__BN();
-    boot_OpenSSL__BIO();
-    boot_OpenSSL__Cipher();
-    boot_OpenSSL__MD();
-    boot_OpenSSL__ERR();
-    boot_OpenSSL__SSL();
-    boot_OpenSSL__X509();
+
+       /*                                                              */
+       /* The next macro is the completely correct way to call a C     */
+       /* function that uses perl calling conventions but is not       */
+       /* registered with perl.                                        */
+       /*                                                              */
+       /* The second macro seems to work for this context.  (We just   */
+       /* need a mark for the called function since we don't have      */
+       /* any local variables and what-not.)                           */
+       /*                                                              */
+       /* Unfortunately, we need to do this because these boot_*       */
+       /* functions are auto-generated by xsubpp and are normally      */
+       /* called from DyncLoader, but we're pulling them in here.      */
+       /*                                                              */
+#define FULL_callBootFunc(func) { \
+           dSP; \
+           ENTER; \
+           SAVETMPS; \
+           PUSHMARK(SP); \
+               func(); \
+           FREETMPS; \
+           LEAVE; \
+       }
+#define callBootFunc(func) { \
+           PUSHMARK(SP); \
+               func(); \
+       }
+    callBootFunc(boot_OpenSSL__BN);
+    callBootFunc(boot_OpenSSL__BIO);
+    callBootFunc(boot_OpenSSL__Cipher);
+    callBootFunc(boot_OpenSSL__MD);
+    callBootFunc(boot_OpenSSL__ERR);
+    callBootFunc(boot_OpenSSL__SSL);
+    callBootFunc(boot_OpenSSL__X509);