You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2015/05/12 18:37:11 UTC
[2/7] lucy-clownfish git commit: Remove Class_Clone
Remove Class_Clone
Class_Clone had a fragile implementation and was only used in
Class_singleton. Replace it with an internal function to create a
simple subclass. Make sure that this function accounts for Init_Obj
zeroing the Class object.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/e0fd278f
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/e0fd278f
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/e0fd278f
Branch: refs/heads/master
Commit: e0fd278ff959458175a415a407dd5579f9b721bc
Parents: 12c4653
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Tue May 12 00:24:46 2015 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Tue May 12 18:34:59 2015 +0200
----------------------------------------------------------------------
runtime/core/Clownfish/Class.c | 45 +++++++++++++++++++----------------
runtime/core/Clownfish/Class.cfh | 3 ---
2 files changed, 25 insertions(+), 23 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/e0fd278f/runtime/core/Clownfish/Class.c
----------------------------------------------------------------------
diff --git a/runtime/core/Clownfish/Class.c b/runtime/core/Clownfish/Class.c
index e0a3ab5..d35fb94 100644
--- a/runtime/core/Clownfish/Class.c
+++ b/runtime/core/Clownfish/Class.c
@@ -215,18 +215,6 @@ Class_Destroy_IMP(Class *self) {
THROW(ERR, "Insane attempt to destroy Class for class '%o'", self->name);
}
-Class*
-Class_Clone_IMP(Class *self) {
- Class *twin
- = (Class*)Memory_wrapped_calloc(self->class_alloc_size, 1);
-
- memcpy(twin, self, self->class_alloc_size);
- Class_Init_Obj(self->klass, twin); // Set refcount.
- twin->name = Str_Clone(self->name);
-
- return twin;
-}
-
void
Class_Override_IMP(Class *self, cfish_method_t method, size_t offset) {
union { char *char_ptr; cfish_method_t *func_ptr; } pointer;
@@ -271,6 +259,30 @@ Class_init_registry() {
}
}
+static Class*
+S_simple_subclass(Class *parent, String *name) {
+ Class *subclass
+ = (Class*)Memory_wrapped_calloc(parent->class_alloc_size, 1);
+ Class_Init_Obj(parent->klass, subclass);
+
+ subclass->parent = parent;
+ subclass->flags = parent->flags;
+ subclass->parcel_id = parent->parcel_id;
+ subclass->obj_alloc_size = parent->obj_alloc_size;
+ subclass->class_alloc_size = parent->class_alloc_size;
+ subclass->methods = (Method**)CALLOCATE(1, sizeof(Method*));
+
+ subclass->name_internal = Str_Clone(name);
+ subclass->name
+ = Str_new_wrap_trusted_utf8(Str_Get_Ptr8(subclass->name_internal),
+ Str_Get_Size(subclass->name_internal));
+
+ memcpy(subclass->vtable, parent->vtable,
+ parent->class_alloc_size - offsetof(Class, vtable));
+
+ return subclass;
+}
+
Class*
Class_singleton(String *class_name, Class *parent) {
if (Class_registry == NULL) {
@@ -294,14 +306,7 @@ Class_singleton(String *class_name, Class *parent) {
}
}
- // Copy source class.
- singleton = Class_Clone(parent);
-
- // Turn clone into child.
- singleton->parent = parent;
- DECREF(singleton->name);
- singleton->name = Str_Clone(class_name);
- singleton->methods = (Method**)CALLOCATE(1, sizeof(Method*));
+ singleton = S_simple_subclass(parent, class_name);
// Allow host methods to override.
fresh_host_methods = Class_fresh_host_methods(class_name);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/e0fd278f/runtime/core/Clownfish/Class.cfh
----------------------------------------------------------------------
diff --git a/runtime/core/Clownfish/Class.cfh b/runtime/core/Clownfish/Class.cfh
index 94c89a5..be8520e 100644
--- a/runtime/core/Clownfish/Class.cfh
+++ b/runtime/core/Clownfish/Class.cfh
@@ -135,9 +135,6 @@ final class Clownfish::Class inherits Clownfish::Obj {
Vector*
Get_Methods(Class *self);
- public incremented Class*
- Clone(Class *self);
-
public void
Destroy(Class *self);
}