Repository: lucy-clownfish Updated Branches: refs/heads/master e36a261f8 -> d73098d1e
Use a raw Method** array in Class This makes sure that the array can't be modified. It also avoids thread-safety problems that could occur from refcounting. Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/d73098d1 Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/d73098d1 Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/d73098d1 Branch: refs/heads/master Commit: d73098d1e9e3104f1e09c7e316a525dbad2bc0d9 Parents: e36a261 Author: Nick Wellnhofer <[email protected]> Authored: Tue Aug 5 13:16:23 2014 +0200 Committer: Nick Wellnhofer <[email protected]> Committed: Mon Aug 11 16:33:43 2014 +0200 ---------------------------------------------------------------------- runtime/core/Clownfish/Class.c | 29 +++++++++++++++++++---------- runtime/core/Clownfish/Class.cfh | 18 ++++++++++-------- 2 files changed, 29 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/d73098d1/runtime/core/Clownfish/Class.c ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Class.c b/runtime/core/Clownfish/Class.c index 0220b3a..81c3138 100644 --- a/runtime/core/Clownfish/Class.c +++ b/runtime/core/Clownfish/Class.c @@ -147,17 +147,21 @@ Class_bootstrap(const ClassSpec *specs, size_t num_specs) Class *klass = *spec->klass; klass->name = Str_newf("%s", spec->name); - klass->methods = VA_new(0); + klass->methods = (Method**)MALLOCATE((spec->num_novel_meths + 1) + * sizeof(Method*)); + // Only store novel methods for now. for (size_t i = 0; i < spec->num_novel_meths; ++i) { const NovelMethSpec *mspec = &spec->novel_meth_specs[i]; String *name = Str_newf("%s", mspec->name); Method *method = Method_new(name, mspec->callback_func, *mspec->offset); - VA_Push(klass->methods, (Obj*)method); + klass->methods[i] = method; DECREF(name); } + klass->methods[spec->num_novel_meths] = NULL; + Class_add_to_registry(klass); } } @@ -232,7 +236,13 @@ Class_Get_Obj_Alloc_Size_IMP(Class *self) { VArray* Class_Get_Methods_IMP(Class *self) { - return self->methods; + VArray *retval = VA_new(0); + + for (size_t i = 0; self->methods[i]; ++i) { + VA_Push(retval, INCREF(self->methods[i])); + } + + return retval; } void @@ -276,6 +286,7 @@ Class_singleton(String *class_name, Class *parent) { singleton->parent = parent; DECREF(singleton->name); singleton->name = Str_Clone(class_name); + singleton->methods = (Method**)CALLOCATE(1, sizeof(Method*)); // Allow host methods to override. fresh_host_methods = Class_fresh_host_methods(class_name); @@ -287,9 +298,8 @@ Class_singleton(String *class_name, Class *parent) { Hash_Store(meths, (Obj*)meth, (Obj*)CFISH_TRUE); } for (Class *klass = parent; klass; klass = klass->parent) { - uint32_t max = VA_Get_Size(klass->methods); - for (uint32_t i = 0; i < max; i++) { - Method *method = (Method*)VA_Fetch(klass->methods, i); + for (size_t i = 0; klass->methods[i]; i++) { + Method *method = klass->methods[i]; if (method->callback_func) { String *name = Method_Host_Name(method); if (Hash_Fetch(meths, (Obj*)name)) { @@ -390,11 +400,10 @@ Class_Exclude_Host_Method_IMP(Class *self, const char *meth_name) { static Method* S_find_method(Class *self, const char *name) { - size_t name_len = strlen(name); - uint32_t size = VA_Get_Size(self->methods); + size_t name_len = strlen(name); - for (uint32_t i = 0; i < size; i++) { - Method *method = (Method*)VA_Fetch(self->methods, i); + for (size_t i = 0; self->methods[i]; i++) { + Method *method = self->methods[i]; if (Str_Equals_Utf8(method->name, name, name_len)) { return method; } http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/d73098d1/runtime/core/Clownfish/Class.cfh ---------------------------------------------------------------------- diff --git a/runtime/core/Clownfish/Class.cfh b/runtime/core/Clownfish/Class.cfh index 3bab408..4e5c085 100644 --- a/runtime/core/Clownfish/Class.cfh +++ b/runtime/core/Clownfish/Class.cfh @@ -25,14 +25,14 @@ parcel Clownfish; class Clownfish::Class inherits Clownfish::Obj { - Class *parent; - String *name; - uint32_t flags; - int32_t parcel_id; - size_t obj_alloc_size; - size_t class_alloc_size; - VArray *methods; - cfish_method_t[1] vtable; /* flexible array */ + Class *parent; + String *name; + uint32_t flags; + int32_t parcel_id; + size_t obj_alloc_size; + size_t class_alloc_size; + Method **methods; + cfish_method_t[1] vtable; /* flexible array */ inert LockFreeRegistry *registry; inert size_t offset_of_parent; @@ -130,6 +130,8 @@ class Clownfish::Class inherits Clownfish::Obj { size_t Get_Obj_Alloc_Size(Class *self); + /** Return novel methods of the class. + */ VArray* Get_Methods(Class *self);
