Use WeakPtr in CFCType

Weaken the parcel pointer, allowing to store a class array in CFCParcel
later.


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

Branch: refs/heads/master
Commit: 7ce20fd218f45f2a647a102e5c1f0d3711f2ee05
Parents: e0c9d8b
Author: Nick Wellnhofer <wellnho...@aevum.de>
Authored: Mon Feb 27 16:58:47 2017 +0100
Committer: Nick Wellnhofer <wellnho...@aevum.de>
Committed: Thu Mar 2 20:08:02 2017 +0100

----------------------------------------------------------------------
 compiler/src/CFCType.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/7ce20fd2/compiler/src/CFCType.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCType.c b/compiler/src/CFCType.c
index 5dd3136..5df5705 100644
--- a/compiler/src/CFCType.c
+++ b/compiler/src/CFCType.c
@@ -37,7 +37,7 @@ struct CFCType {
     char    *specifier;
     char    *class_var;
     int      indirection;
-    struct CFCParcel *parcel;
+    CFCWeakPtr parcel;
     char    *c_string;
     size_t   width;
     char    *array;
@@ -92,7 +92,7 @@ CFCType*
 CFCType_init(CFCType *self, int flags, struct CFCParcel *parcel,
              const char *specifier, int indirection) {
     self->flags       = flags;
-    self->parcel      = (CFCParcel*)CFCBase_incref((CFCBase*)parcel);
+    self->parcel      = CFCWeakPtr_new((CFCBase*)parcel);
     self->specifier   = CFCUtil_strdup(specifier);
     self->indirection = indirection;
     self->c_string    = NULL;
@@ -295,8 +295,9 @@ CFCType_resolve(CFCType *self) {
 
     char *specifier = self->specifier;
     if (CFCUtil_isupper(specifier[0])) {
+        CFCParcel *src_parcel = CFCType_get_parcel(self);
         CFCParcel *parcel
-            = CFCParcel_lookup_struct_sym(self->parcel, specifier);
+            = CFCParcel_lookup_struct_sym(src_parcel, specifier);
         if (!parcel) {
             CFCUtil_die("No class found for type '%s'", specifier);
         }
@@ -313,7 +314,7 @@ CFCType_destroy(CFCType *self) {
     if (self->child) {
         CFCBase_decref((CFCBase*)self->child);
     }
-    CFCBase_decref((CFCBase*)self->parcel);
+    CFCWeakPtr_destroy(&self->parcel);
     FREEMEM(self->specifier);
     FREEMEM(self->c_string);
     FREEMEM(self->array);
@@ -396,7 +397,7 @@ CFCType_get_indirection(CFCType *self) {
 
 struct CFCParcel*
 CFCType_get_parcel(CFCType *self) {
-    return self->parcel;
+    return (CFCParcel*)CFCWeakPtr_deref(self->parcel);
 }
 
 const char*

Reply via email to