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*