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 23:40:28 UTC
[13/17] lucy-clownfish git commit: Tell Python about obj alloc sizes.
Tell Python about obj alloc sizes.
As a consequence of Clownfish using Python object allocation internally
under the Python bindings, bootstrapping Clownfish Classes and Python
type objects requires some intricate interplay.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/c6c74d27
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/c6c74d27
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/c6c74d27
Branch: refs/heads/master
Commit: c6c74d2718fdac87eb9c2330f75eca93dbaa94da
Parents: 3e9cd9e
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Mon Feb 1 16:43:49 2016 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Wed Feb 24 15:20:38 2016 -0800
----------------------------------------------------------------------
compiler/src/CFCPython.c | 1 +
runtime/core/Clownfish/Class.c | 4 ++++
runtime/core/Clownfish/Class.cfh | 8 ++++++++
runtime/python/cfext/CFBind.c | 33 +++++++++++++++++++++++++++++++++
runtime/python/cfext/CFBind.h | 3 +++
5 files changed, 49 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c6c74d27/compiler/src/CFCPython.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPython.c b/compiler/src/CFCPython.c
index 15f835f..7921fbe 100644
--- a/compiler/src/CFCPython.c
+++ b/compiler/src/CFCPython.c
@@ -491,6 +491,7 @@ S_write_module_file(CFCPython *self, CFCParcel *parcel, const char *dest) {
"\n"
"PyMODINIT_FUNC\n"
"PyInit__%s(void) {\n"
+ " cfish_Class_bootstrap_hook1 = CFBind_class_bootstrap_hook1;\n"
" S_link_py_types();\n"
" PyObject *module = PyModule_Create(&module_def);\n"
" return module;\n"
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c6c74d27/runtime/core/Clownfish/Class.c
----------------------------------------------------------------------
diff --git a/runtime/core/Clownfish/Class.c b/runtime/core/Clownfish/Class.c
index ba83928..68258c6 100644
--- a/runtime/core/Clownfish/Class.c
+++ b/runtime/core/Clownfish/Class.c
@@ -54,6 +54,7 @@ static int32_t
S_claim_parcel_id(void);
static LockFreeRegistry *Class_registry;
+cfish_Class_bootstrap_hook1_t cfish_Class_bootstrap_hook1;
void
Class_bootstrap(const cfish_ClassSpec *specs, size_t num_specs,
@@ -146,6 +147,9 @@ Class_bootstrap(const cfish_ClassSpec *specs, size_t num_specs,
else {
klass->obj_alloc_size = ivars_offset + spec->ivars_size;
}
+ if (cfish_Class_bootstrap_hook1 != NULL) {
+ cfish_Class_bootstrap_hook1(klass);
+ }
klass->flags = 0;
if (klass == CLASS
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c6c74d27/runtime/core/Clownfish/Class.cfh
----------------------------------------------------------------------
diff --git a/runtime/core/Clownfish/Class.cfh b/runtime/core/Clownfish/Class.cfh
index c87964f..a5c83ab 100644
--- a/runtime/core/Clownfish/Class.cfh
+++ b/runtime/core/Clownfish/Class.cfh
@@ -149,5 +149,13 @@ __C__
#define CFISH_ALLOCA_OBJ(class) \
cfish_alloca(CFISH_Class_Get_Obj_Alloc_Size(class))
+/** Bootstrapping hook/hack needed by the Python bindings.
+ *
+ * TODO: Refactor this away in favor of a more general solution.
+ */
+typedef void
+(*cfish_Class_bootstrap_hook1_t)(cfish_Class *self);
+extern cfish_Class_bootstrap_hook1_t cfish_Class_bootstrap_hook1;
+
__END_C__
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c6c74d27/runtime/python/cfext/CFBind.c
----------------------------------------------------------------------
diff --git a/runtime/python/cfext/CFBind.c b/runtime/python/cfext/CFBind.c
index 99ad069..2471487 100644
--- a/runtime/python/cfext/CFBind.c
+++ b/runtime/python/cfext/CFBind.c
@@ -857,6 +857,39 @@ CFISH_Obj_To_Host_IMP(cfish_Obj *self) {
/**** Class ****************************************************************/
+/* Tell Python about the size of Clownfish objects, by copying
+ * `cfclass->obj_alloc_size` into `pytype->tp_basicsize`.
+ * **THIS MUST BE RUN BEFORE Class_Make_Obj IS CALLED** because under the
+ * Python bindings, Clownfish uses Python object allocation internally.
+ * Furthermore, `tp_basicsize` is supposed to be set before `PyType_Ready()`
+ * is called.
+ *
+ * Ideally we would set `tp_basicsize` from within `Class_register_with_host`,
+ * but it doesn't get called until too late.
+ */
+void
+CFBind_class_bootstrap_hook1(cfish_Class *self) {
+ PyTypeObject *py_type = S_get_cached_py_type(self);
+ if (PyType_HasFeature(py_type, Py_TPFLAGS_READY)) {
+ if (py_type->tp_basicsize != (Py_ssize_t)self->obj_alloc_size) {
+ fprintf(stderr, "PyType for %s readied with wrong alloc size\n",
+ py_type->tp_name),
+ exit(1);
+ }
+ }
+ else {
+ if (self->parent) {
+ py_type->tp_base = S_get_cached_py_type(self->parent);
+ }
+ py_type->tp_basicsize = self->obj_alloc_size;
+ if (PyType_Ready(py_type) < 0) {
+ fprintf(stderr, "PyType_Ready failed for %s\n",
+ py_type->tp_name),
+ exit(1);
+ }
+ }
+}
+
/* Check the Class object for its associated PyTypeObject, which is stored in
* `klass->host_type`. If it is not there yet, search the class mapping and
* cache it in the object. Return the PyTypeObject.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/c6c74d27/runtime/python/cfext/CFBind.h
----------------------------------------------------------------------
diff --git a/runtime/python/cfext/CFBind.h b/runtime/python/cfext/CFBind.h
index 0064985..9c8d53f 100644
--- a/runtime/python/cfext/CFBind.h
+++ b/runtime/python/cfext/CFBind.h
@@ -219,6 +219,9 @@ CFBind_maybe_convert_float(PyObject *input, float *ptr);
int
CFBind_maybe_convert_double(PyObject *input, double *ptr);
+void
+CFBind_class_bootstrap_hook1(struct cfish_Class *self);
+
#ifdef __cplusplus
}
#endif