summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2015-06-04 12:30:06 -0600
committerCharles Harris <charlesr.harris@gmail.com>2015-06-04 16:23:16 -0600
commit403d61d1448eb8ee6a2ddc81865d9ebaf1ef73df (patch)
tree71da0b78e413453f325fafd2998086f325520b4f
parent36b940497f194b1b90e9ff48c58a01a6e74c09de (diff)
downloadnumpy-403d61d1448eb8ee6a2ddc81865d9ebaf1ef73df.tar.gz
ENH: Add inline C function to import and cache Python functions.
A new inline function 'npy_cache_pyfunc' is provided for the common operation of inporting and caching a Python function in static variables. The intended usage is as follows. int myfunc() { static PyObject *cache = NULL: npy_cache_pyfunc("the.module.name", "function", &cache); ... } Errors are not recoverable, so checked with assert for debugging.
-rw-r--r--numpy/core/src/private/npy_import.h33
1 files changed, 33 insertions, 0 deletions
diff --git a/numpy/core/src/private/npy_import.h b/numpy/core/src/private/npy_import.h
new file mode 100644
index 000000000..e618e121e
--- /dev/null
+++ b/numpy/core/src/private/npy_import.h
@@ -0,0 +1,33 @@
+#ifndef NPY_IMPORT_H
+#define NPY_IMPORT_H
+
+#include <Python.h>
+#include <assert.h>
+
+/*! \brief Fetch and cache Python function.
+ *
+ * Import a Python function and cache it for use. The function checks if
+ * cache is NULL, and if not NULL imports the Python function specified by
+ * \a module and \a function, increments its reference count, and stores
+ * the result in \a cache. Usually \a cache will be a static variable and
+ * should be initialized to NULL. On error \a cache will contain NULL on
+ * exit,
+ *
+ * @param module Absolute module name.
+ * @param function Function name.
+ * @param cache Storage location for imported function.
+ */
+NPY_INLINE void
+npy_cache_pyfunc(const char *module, const char *function, PyObject **cache)
+{
+ if (*cache == NULL) {
+ PyObject *mod = PyImport_ImportModule(module);
+
+ if (mod != NULL) {
+ *cache = PyObject_GetAttrString(mod, function);
+ Py_DECREF(mod);
+ }
+ }
+}
+
+#endif