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/py_exp13 Commit: 50c98b1faeb6f8966b769ac7dbff811e3808bc1e Parents: c6c74d2 Author: Marvin Humphrey <[email protected]> Authored: Mon Feb 1 16:47:41 2016 -0800 Committer: Marvin Humphrey <[email protected]> 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
