You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2016/02/25 00:07:46 UTC

[19/20] lucy-clownfish git commit: Prepare to trap errors in Python glue code.

Prepare to trap errors in Python glue code.

Add private macro `CFBIND_TRY` and supporting routines, in an effort to
wrap Clownfish C routines and trap errors.  This will be used inside
glue code for Python, setting `sys.exc_info` when something goes wrong.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/91622dbf
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/91622dbf
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/91622dbf

Branch: refs/heads/master
Commit: 91622dbf97f1afb2a195609fd1bea2b703119211
Parents: bb7e880
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Thu Feb 18 19:31:30 2016 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Feb 23 18:22:05 2016 -0800

----------------------------------------------------------------------
 compiler/src/CFCPython.c      |  9 +++++++++
 runtime/python/cfext/CFBind.c | 22 ++++++++++++++++++++++
 runtime/python/cfext/CFBind.h | 12 ++++++++++++
 3 files changed, 43 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/91622dbf/compiler/src/CFCPython.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPython.c b/compiler/src/CFCPython.c
index b39240d..a2b13a4 100644
--- a/compiler/src/CFCPython.c
+++ b/compiler/src/CFCPython.c
@@ -149,6 +149,15 @@ S_gen_callbacks(CFCPython *self, CFCParcel *parcel, CFCClass **ordered) {
         "    va_end(args);\n"
         "    return tuple;\n"
         "}\n"
+        "#define CFBIND_TRY(routine) \\\n"
+        "    do { \\\n"
+        "        jmp_buf env; \\\n"
+        "        jmp_buf *prev_env = CFBind_swap_env(&env); \\\n"
+        "        if (!setjmp(env)) { \\\n"
+        "            routine; \\\n"
+        "        } \\\n"
+        "        CFBind_swap_env(prev_env); \\\n"
+        "    } while (0)\n"
         "\n"
         "static PyObject*\n"
         "S_call_pymeth(PyObject *self, const char *meth_name, PyObject *args,\n"

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/91622dbf/runtime/python/cfext/CFBind.c
----------------------------------------------------------------------
diff --git a/runtime/python/cfext/CFBind.c b/runtime/python/cfext/CFBind.c
index 7e7f617..48743a7 100644
--- a/runtime/python/cfext/CFBind.c
+++ b/runtime/python/cfext/CFBind.c
@@ -855,6 +855,28 @@ static cfish_Err *current_error;
 static cfish_Err *thrown_error;
 static jmp_buf  *current_env;
 
+jmp_buf*
+CFBind_swap_env(jmp_buf *env) {
+    jmp_buf *prev_env = current_env;
+    current_env = env;
+    return prev_env;
+}
+
+int
+CFBind_migrate_cferr() {
+    if (thrown_error != NULL) {
+        cfish_Err *err = thrown_error;
+        thrown_error = NULL;
+        cfish_String *mess = CFISH_Err_Get_Mess(err);
+        char *utf8 = CFISH_Str_To_Utf8(mess);
+        PyErr_SetString(PyExc_RuntimeError, utf8);
+        CFISH_FREEMEM(utf8);
+        CFISH_DECREF(err);
+        return true;
+    }
+    return false;
+}
+
 void
 cfish_Err_init_class(void) {
     Err_initialized = true;

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/91622dbf/runtime/python/cfext/CFBind.h
----------------------------------------------------------------------
diff --git a/runtime/python/cfext/CFBind.h b/runtime/python/cfext/CFBind.h
index b6e57fd..9279510 100644
--- a/runtime/python/cfext/CFBind.h
+++ b/runtime/python/cfext/CFBind.h
@@ -21,6 +21,7 @@
 extern "C" {
 #endif
 
+#include <setjmp.h>
 #include "cfish_platform.h"
 #include "Python.h"
 #include "Clownfish/Obj.h"
@@ -38,6 +39,17 @@ struct cfish_String;
 void
 CFBind_reraise_pyerr(struct cfish_Class *err_klass, struct cfish_String *mess);
 
+/** Set the current_env, return the old value (internal use only).
+  */
+jmp_buf*
+CFBind_swap_env(jmp_buf *env);
+
+/** If a Clownfish error was thrown, propagate it to Python and return true
+ * (internal use only).
+  */
+int
+CFBind_migrate_cferr(void);
+
 /** Null-safe invocation of Obj_To_Host.
   */
 static CFISH_INLINE PyObject*