From 74982d6fefe23c42544ce89591fb8e2cda971a26 Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Fri, 22 Feb 2013 13:42:05 -0600 Subject: [PATCH] Adapt to work in python2.6 --- llvmpy/capsule.cpp | 4 +- llvmpy/gen/gen.py | 2 + llvmpy/include/capsulethunk.h | 108 ++++++++++++++++++ llvmpy/include/llvm_binding/capsule_context.h | 20 +++- llvmpy/src/ADT/__init__.py | 12 +- llvmpy/src/Analysis/__init__.py | 12 +- llvmpy/src/Assembly/__init__.py | 12 +- llvmpy/src/Bitcode/__init__.py | 12 +- llvmpy/src/CodeGen/__init__.py | 12 +- llvmpy/src/ExecutionEngine/__init__.py | 12 +- llvmpy/src/Support/__init__.py | 12 +- llvmpy/src/Target/__init__.py | 12 +- llvmpy/src/Transforms/Utils/__init__.py | 17 +-- llvmpy/src/Transforms/__init__.py | 17 +-- llvmpy/src/__init__.py | 9 +- 15 files changed, 154 insertions(+), 119 deletions(-) create mode 100644 llvmpy/include/capsulethunk.h diff --git a/llvmpy/capsule.cpp b/llvmpy/capsule.cpp index e7e4932..b7fa81b 100644 --- a/llvmpy/capsule.cpp +++ b/llvmpy/capsule.cpp @@ -1,4 +1,5 @@ #include +#include #include static @@ -53,12 +54,13 @@ CapsuleContext* getContext(PyObject* self, PyObject* args) { PyErr_SetString(PyExc_TypeError, "PyCapsule has no context."); return NULL; } - return (CapsuleContext*)context; + return static_cast(context); } static PyObject* getClassName(PyObject* self, PyObject* args) { CapsuleContext* context = getContext(self, args); + //Assert(context->_magic == 0xdead); if (!context) { return NULL; } else { diff --git a/llvmpy/gen/gen.py b/llvmpy/gen/gen.py index c5d30de..066ed23 100644 --- a/llvmpy/gen/gen.py +++ b/llvmpy/gen/gen.py @@ -40,6 +40,8 @@ populate_submodules(module, submodule_%(ns)s); def populate_headers(println): includes = [ 'cstring', + 'Python.h', + 'capsulethunk.h', 'llvm_binding/conversion.h', 'llvm_binding/binding.h', 'llvm_binding/capsule_context.h', diff --git a/llvmpy/include/capsulethunk.h b/llvmpy/include/capsulethunk.h new file mode 100644 index 0000000..9061782 --- /dev/null +++ b/llvmpy/include/capsulethunk.h @@ -0,0 +1,108 @@ +/** + + This is a modified version of capsulethunk.h for use in llvmpy + +**/ + +#ifndef __CAPSULETHUNK_H +#define __CAPSULETHUNK_H + +//#define Assert(X) do_assert(!!(X), #X, __FILE__, __LINE__) +#define Assert(X) + +static +void do_assert(int cond, const char * msg, const char *file, unsigned line){ + if (not cond) { + fprintf(stderr, "Assertion failed %s:%d\n%s\n", file, line, msg); + exit(1); + } +} + +#if ( (PY_VERSION_HEX < 0x02070000) \ + || ((PY_VERSION_HEX >= 0x03000000) \ + && (PY_VERSION_HEX < 0x03010000)) ) + +typedef void (*PyCapsule_Destructor)(PyObject *); + +struct FakePyCapsule_Desc { + const char *name; + void *context; + PyCapsule_Destructor dtor; + PyObject *parent; + + FakePyCapsule_Desc() : name(0), context(0), dtor(0) {} +}; + +static +FakePyCapsule_Desc* get_pycobj_desc(PyObject *p){ + void *desc = ((PyCObject*)p)->desc; + Assert(desc && "No desc in PyCObject"); + return static_cast(desc); +} + +static +void pycobject_pycapsule_dtor(void *p, void *desc){ + Assert(desc); + Assert(p); + FakePyCapsule_Desc *fpc_desc = static_cast(desc); + Assert(fpc_desc->parent); + Assert(PyCObject_Check(fpc_desc->parent)); + fpc_desc->dtor(static_cast(fpc_desc->parent)); + delete fpc_desc; +} + +static +PyObject* PyCapsule_New(void* ptr, const char *name, PyCapsule_Destructor dtor) +{ + FakePyCapsule_Desc *desc = new FakePyCapsule_Desc; + desc->name = name; + desc->context = NULL; + desc->dtor = dtor; + PyObject *p = PyCObject_FromVoidPtrAndDesc(ptr, desc, + pycobject_pycapsule_dtor); + desc->parent = p; + return p; +} + +static +int PyCapsule_CheckExact(PyObject *p) +{ + return PyCObject_Check(p); +} + +static +void* PyCapsule_GetPointer(PyObject *p, const char *name) +{ + Assert(PyCapsule_CheckExact(p)); + if (strcmp(get_pycobj_desc(p)->name, name) != 0) { + PyErr_SetString(PyExc_ValueError, "Invalid PyCapsule object"); + } + return PyCObject_AsVoidPtr(p); +} + +static +void* PyCapsule_GetContext(PyObject *p) +{ + Assert(p); + Assert(PyCapsule_CheckExact(p)); + return get_pycobj_desc(p)->context; +} + +static +int PyCapsule_SetContext(PyObject *p, void *context) +{ + Assert(PyCapsule_CheckExact(p)); + get_pycobj_desc(p)->context = context; + return 0; +} + +static +const char * PyCapsule_GetName(PyObject *p) +{ +// Assert(PyCapsule_CheckExact(p)); + return get_pycobj_desc(p)->name; +} + +#endif /* #if PY_VERSION_HEX < 0x02070000 */ + +#endif /* __CAPSULETHUNK_H */ diff --git a/llvmpy/include/llvm_binding/capsule_context.h b/llvmpy/include/llvm_binding/capsule_context.h index 6ed1381..0256088 100644 --- a/llvmpy/include/llvm_binding/capsule_context.h +++ b/llvmpy/include/llvm_binding/capsule_context.h @@ -3,10 +3,10 @@ #include #include - -typedef PyObject* Destructor_Fn; +#include "capsulethunk.h" struct CapsuleContext { + //const unsigned _magic; const char* className; CapsuleContext(const char* cn) @@ -14,6 +14,17 @@ struct CapsuleContext { { } }; +static +void pycapsule_dtor_free_context(PyObject *pycap) +{ + void * context = PyCapsule_GetContext(pycap); + Assert(context); + CapsuleContext* cc = static_cast(context); + //Assert(cc->_magic == 0xdead); + delete cc; +} + + static PyObject* pycapsule_new(void* ptr, @@ -26,15 +37,16 @@ PyObject* pycapsule_new(void* ptr, if (!ptr) { Py_RETURN_NONE; } - PyObject* cap = PyCapsule_New(ptr, basename, NULL); + PyObject* cap = PyCapsule_New(ptr, basename, pycapsule_dtor_free_context); if (!cap) { PyErr_SetString(PyExc_TypeError, "Error creating new PyCapsule"); return NULL; } CapsuleContext* context = new CapsuleContext(classname); - if (PyCapsule_SetContext(cap, context)) { + if (0 != PyCapsule_SetContext(cap, context)) { return NULL; } + //Assert(context->_magic == 0xdead); return cap; } diff --git a/llvmpy/src/ADT/__init__.py b/llvmpy/src/ADT/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/ADT/__init__.py +++ b/llvmpy/src/ADT/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/Analysis/__init__.py b/llvmpy/src/Analysis/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/Analysis/__init__.py +++ b/llvmpy/src/Analysis/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/Assembly/__init__.py b/llvmpy/src/Assembly/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/Assembly/__init__.py +++ b/llvmpy/src/Assembly/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/Bitcode/__init__.py b/llvmpy/src/Bitcode/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/Bitcode/__init__.py +++ b/llvmpy/src/Bitcode/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/CodeGen/__init__.py b/llvmpy/src/CodeGen/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/CodeGen/__init__.py +++ b/llvmpy/src/CodeGen/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/ExecutionEngine/__init__.py b/llvmpy/src/ExecutionEngine/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/ExecutionEngine/__init__.py +++ b/llvmpy/src/ExecutionEngine/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/Support/__init__.py b/llvmpy/src/Support/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/Support/__init__.py +++ b/llvmpy/src/Support/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/Target/__init__.py b/llvmpy/src/Target/__init__.py index da0beed..944426e 100644 --- a/llvmpy/src/Target/__init__.py +++ b/llvmpy/src/Target/__init__.py @@ -1,10 +1,2 @@ -import os.path, importlib - -def _init(): - for fname in os.listdir(os.path.dirname(__file__)): - if ((fname.endswith('.py') or fname.endswith('.pyc')) and - not fname.startswith('__init__')): - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/Transforms/Utils/__init__.py b/llvmpy/src/Transforms/Utils/__init__.py index 98c06fc..944426e 100644 --- a/llvmpy/src/Transforms/Utils/__init__.py +++ b/llvmpy/src/Transforms/Utils/__init__.py @@ -1,15 +1,2 @@ -import os.path, importlib - -def _init(): - base = os.path.dirname(__file__) - for fname in os.listdir(base): - print fname - is_python_script = fname.endswith('.py') or fname.endswith('.pyc') - is_init_script = fname.startswith('__init__') - is_directory = os.path.isdir(os.path.join(base, fname)) - if (is_directory or is_python_script) and not is_init_script : - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() - +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/Transforms/__init__.py b/llvmpy/src/Transforms/__init__.py index 98c06fc..944426e 100644 --- a/llvmpy/src/Transforms/__init__.py +++ b/llvmpy/src/Transforms/__init__.py @@ -1,15 +1,2 @@ -import os.path, importlib - -def _init(): - base = os.path.dirname(__file__) - for fname in os.listdir(base): - print fname - is_python_script = fname.endswith('.py') or fname.endswith('.pyc') - is_init_script = fname.startswith('__init__') - is_directory = os.path.isdir(os.path.join(base, fname)) - if (is_directory or is_python_script) and not is_init_script : - modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) - -_init() - +from src import _init +_init(__name__, __file__) diff --git a/llvmpy/src/__init__.py b/llvmpy/src/__init__.py index 98c06fc..ed34608 100644 --- a/llvmpy/src/__init__.py +++ b/llvmpy/src/__init__.py @@ -1,7 +1,7 @@ -import os.path, importlib +import os.path -def _init(): - base = os.path.dirname(__file__) +def _init(root=__name__, file=__file__): + base = os.path.dirname(file) for fname in os.listdir(base): print fname is_python_script = fname.endswith('.py') or fname.endswith('.pyc') @@ -9,7 +9,8 @@ def _init(): is_directory = os.path.isdir(os.path.join(base, fname)) if (is_directory or is_python_script) and not is_init_script : modname = os.path.basename(fname).rsplit('.', 1)[0] - importlib.import_module('.' + modname, __name__) + #importlib.import_module('.' + modname, __name__) + __import__('.'.join([root, modname])) _init()