Use WeakPtr in CFCClass

Weaken the parcel pointer. This allows to store a class array in
CFCParcel later.

Also weaken the parent pointer, so that the circular reference doesn't
have to be broken manually.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/e0c9d8b3
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/e0c9d8b3
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/e0c9d8b3

Branch: refs/heads/master
Commit: e0c9d8b3d26a53379210f33b57a44bcfed38dec6
Parents: a86fab4
Author: Nick Wellnhofer <wellnho...@aevum.de>
Authored: Mon Feb 27 16:05:54 2017 +0100
Committer: Nick Wellnhofer <wellnho...@aevum.de>
Committed: Thu Mar 2 20:08:02 2017 +0100

----------------------------------------------------------------------
 compiler/src/CFCClass.c | 33 ++++++++++++---------------------
 1 file changed, 12 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/e0c9d8b3/compiler/src/CFCClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCClass.c b/compiler/src/CFCClass.c
index 1fb2041..360630a 100644
--- a/compiler/src/CFCClass.c
+++ b/compiler/src/CFCClass.c
@@ -45,13 +45,13 @@ S_register(CFCClass *self);
 
 struct CFCClass {
     CFCBase base;
-    struct CFCParcel *parcel;
+    CFCWeakPtr parcel;
     char *exposure;
     char *name;
     char *nickname;
     int tree_grown;
     CFCDocuComment *docucomment;
-    struct CFCClass *parent;
+    CFCWeakPtr parent;
     struct CFCClass **children;
     size_t num_kids;
     CFCFunction **functions;
@@ -225,12 +225,11 @@ CFCClass_do_create(CFCClass *self, struct CFCParcel 
*parcel,
     }
 
     // Assign.
-    self->parcel          = (CFCParcel*)CFCBase_incref((CFCBase*)parcel);
+    self->parcel          = CFCWeakPtr_new((CFCBase*)parcel);
     self->exposure        = CFCUtil_strdup(exposure);
     self->name            = CFCUtil_strdup(name);
     self->nickname        = CFCUtil_strdup(real_nickname);
     self->tree_grown      = false;
-    self->parent          = NULL;
     self->children        = (CFCClass**)CALLOCATE(1, sizeof(CFCClass*));
     self->num_kids        = 0;
     self->functions       = (CFCFunction**)CALLOCATE(1, sizeof(CFCFunction*));
@@ -326,12 +325,12 @@ S_free_cfcbase_array(CFCBase **array) {
 
 void
 CFCClass_destroy(CFCClass *self) {
-    CFCBase_decref((CFCBase*)self->parcel);
+    CFCWeakPtr_destroy(&self->parcel);
     FREEMEM(self->exposure);
     FREEMEM(self->name);
     FREEMEM(self->nickname);
     CFCBase_decref((CFCBase*)self->docucomment);
-    CFCBase_decref((CFCBase*)self->parent);
+    CFCWeakPtr_destroy(&self->parent);
     CFCBase_decref((CFCBase*)self->file_spec);
     S_free_cfcbase_array((CFCBase**)self->children);
     S_free_cfcbase_array((CFCBase**)self->functions);
@@ -425,13 +424,7 @@ CFCClass_fetch_by_struct_sym(const char *struct_sym) {
 void
 CFCClass_clear_registry(void) {
     for (size_t i = 0; i < registry_size; i++) {
-        CFCClass *klass = registry[i];
-        if (klass->parent) {
-            // Break circular ref.
-            CFCBase_decref((CFCBase*)klass->parent);
-            klass->parent = NULL;
-        }
-        CFCBase_decref((CFCBase*)klass);
+        CFCBase_decref((CFCBase*)registry[i]);
     }
     FREEMEM(registry);
     registry_size = 0;
@@ -840,14 +833,12 @@ CFCClass_get_nickname(CFCClass *self) {
 
 void
 CFCClass_set_parent(CFCClass *self, CFCClass *parent) {
-    CFCClass *old_parent = self->parent;
-    self->parent = (CFCClass*)CFCBase_incref((CFCBase*)parent);
-    CFCBase_decref((CFCBase*)old_parent);
+    CFCWeakPtr_set(&self->parent, (CFCBase*)parent);
 }
 
 CFCClass*
 CFCClass_get_parent(CFCClass *self) {
-    return self->parent;
+    return (CFCClass*)CFCWeakPtr_deref(self->parent);
 }
 
 const char*
@@ -951,22 +942,22 @@ CFCClass_include_h(CFCClass *self) {
 
 CFCParcel*
 CFCClass_get_parcel(CFCClass *self) {
-    return self->parcel;
+    return (CFCParcel*)CFCWeakPtr_deref(self->parcel);
 }
 
 const char*
 CFCClass_get_prefix(CFCClass *self) {
-    return CFCParcel_get_prefix(self->parcel);
+    return CFCParcel_get_prefix(CFCClass_get_parcel(self));
 }
 
 const char*
 CFCClass_get_Prefix(CFCClass *self) {
-    return CFCParcel_get_Prefix(self->parcel);
+    return CFCParcel_get_Prefix(CFCClass_get_parcel(self));
 }
 
 const char*
 CFCClass_get_PREFIX(CFCClass *self) {
-    return CFCParcel_get_PREFIX(self->parcel);
+    return CFCParcel_get_PREFIX(CFCClass_get_parcel(self));
 }
 
 const char*

Reply via email to