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:24 UTC
[09/17] lucy-clownfish git commit: Implement Make_Obj and Init_Obj
for Python.
Implement Make_Obj and Init_Obj for Python.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/50c98b1f
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/50c98b1f
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/50c98b1f
Branch: refs/heads/master
Commit: 50c98b1faeb6f8966b769ac7dbff811e3808bc1e
Parents: c6c74d2
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Mon Feb 1 16:47:41 2016 -0800
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Wed Feb 24 15:20:38 2016 -0800
----------------------------------------------------------------------
runtime/python/cfext/CFBind.c | 25 ++++++++++++++++++-------
1 file changed, 18 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/50c98b1f/runtime/python/cfext/CFBind.c
----------------------------------------------------------------------
diff --git a/runtime/python/cfext/CFBind.c b/runtime/python/cfext/CFBind.c
index 2471487..a1e47eb 100644
--- a/runtime/python/cfext/CFBind.c
+++ b/runtime/python/cfext/CFBind.c
@@ -930,17 +930,28 @@ S_get_cached_py_type(cfish_Class *self) {
cfish_Obj*
CFISH_Class_Make_Obj_IMP(cfish_Class *self) {
- CFISH_UNUSED_VAR(self);
- CFISH_THROW(CFISH_ERR, "TODO");
- CFISH_UNREACHABLE_RETURN(cfish_Obj*);
+ PyTypeObject *py_type = S_get_cached_py_type(self);
+ cfish_Obj *obj = (cfish_Obj*)py_type->tp_alloc(py_type, 0);
+ obj->klass = self;
+ return obj;
}
cfish_Obj*
CFISH_Class_Init_Obj_IMP(cfish_Class *self, void *allocation) {
- CFISH_UNUSED_VAR(self);
- CFISH_UNUSED_VAR(allocation);
- CFISH_THROW(CFISH_ERR, "TODO");
- CFISH_UNREACHABLE_RETURN(cfish_Obj*);
+ PyTypeObject *py_type = S_get_cached_py_type(self);
+ // It would be nice if we could call PyObject_Init() here and feel
+ // confident that we have performed all Python-specific initialization
+ // under all possible configurations, but that's not possible. In
+ // addition to setting ob_refcnt and ob_type, PyObject_Init() performs
+ // tracking for heap allocated objects under special builds -- but
+ // Class_Init_Obj() may be called on non-heap memory, such as
+ // stack-allocated Clownfish Strings. Therefore, we must perform a subset
+ // of tasks selected from PyObject_Init() manually.
+ cfish_Obj *obj = (cfish_Obj*)allocation;
+ obj->ob_base.ob_refcnt = 1;
+ obj->ob_base.ob_type = py_type;
+ obj->klass = self;
+ return obj;
}
void