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 2014/03/17 18:27:48 UTC
[lucy-commits] [01/10] git commit: Add prerequisites to parcel definitions
Repository: lucy-clownfish
Updated Branches:
refs/heads/explicit-dependencies-wip2 [created] b7189acf0
Add prerequisites to parcel definitions
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/ba21f487
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/ba21f487
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/ba21f487
Branch: refs/heads/explicit-dependencies-wip2
Commit: ba21f487cd05eeee9d3c0b85bd8041f627012df8
Parents: 98f6b71
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Mar 12 16:38:55 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:29 2014 +0100
----------------------------------------------------------------------
compiler/c/t/cfext/AnimalExtension.cfp | 5 ++++-
compiler/perl/t/cfext/AnimalExtension.cfp | 5 ++++-
runtime/core/TestClownfish.cfp | 5 ++++-
3 files changed, 12 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ba21f487/compiler/c/t/cfext/AnimalExtension.cfp
----------------------------------------------------------------------
diff --git a/compiler/c/t/cfext/AnimalExtension.cfp b/compiler/c/t/cfext/AnimalExtension.cfp
index 76f31d3..8b8e75b 100644
--- a/compiler/c/t/cfext/AnimalExtension.cfp
+++ b/compiler/c/t/cfext/AnimalExtension.cfp
@@ -1,5 +1,8 @@
{
"name": "AnimalExtension",
"nickname": "AniExt",
- "version": "v0.1.0"
+ "version": "v0.1.0",
+ "prerequisites": {
+ "Animal": null
+ }
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ba21f487/compiler/perl/t/cfext/AnimalExtension.cfp
----------------------------------------------------------------------
diff --git a/compiler/perl/t/cfext/AnimalExtension.cfp b/compiler/perl/t/cfext/AnimalExtension.cfp
index 76f31d3..8b8e75b 100644
--- a/compiler/perl/t/cfext/AnimalExtension.cfp
+++ b/compiler/perl/t/cfext/AnimalExtension.cfp
@@ -1,5 +1,8 @@
{
"name": "AnimalExtension",
"nickname": "AniExt",
- "version": "v0.1.0"
+ "version": "v0.1.0",
+ "prerequisites": {
+ "Animal": null
+ }
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/ba21f487/runtime/core/TestClownfish.cfp
----------------------------------------------------------------------
diff --git a/runtime/core/TestClownfish.cfp b/runtime/core/TestClownfish.cfp
index f1c9411..f15309f 100644
--- a/runtime/core/TestClownfish.cfp
+++ b/runtime/core/TestClownfish.cfp
@@ -1,5 +1,8 @@
{
"name": "TestClownfish",
"nickname": "TestCfish",
- "version": "v0.3.0"
+ "version": "v0.3.0",
+ "prerequisites": {
+ "Clownfish": "v0.3.0"
+ }
}
[lucy-commits] [03/10] git commit: .cfp validity checks
Posted by nw...@apache.org.
.cfp validity checks
- Check that .cfp contains a hash.
- Simplify check for invalid keys.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/eb4d676e
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/eb4d676e
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/eb4d676e
Branch: refs/heads/explicit-dependencies-wip2
Commit: eb4d676e830bd9bc7947e47a6551f9273c678793
Parents: c596e63
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Mar 12 13:09:06 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:29 2014 +0100
----------------------------------------------------------------------
compiler/src/CFCParcel.c | 21 +++++++--------------
1 file changed, 7 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/eb4d676e/compiler/src/CFCParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c
index bb6eb56..7674d05 100644
--- a/compiler/src/CFCParcel.c
+++ b/compiler/src/CFCParcel.c
@@ -256,6 +256,9 @@ S_new_from_json(const char *json, const char *path, int is_included) {
if (!parsed) {
CFCUtil_die("Invalid JSON parcel definition in '%s'", path);
}
+ if (parsed->type != JSON_HASH) {
+ CFCUtil_die("Parcel definition must be a hash in '%s'", path);
+ }
const char *name = NULL;
const char *nickname = NULL;
CFCVersion *version = NULL;
@@ -285,6 +288,10 @@ S_new_from_json(const char *json, const char *path, int is_included) {
}
version = CFCVersion_new(value->string);
}
+ else {
+ CFCUtil_die("Unrecognized key: '%s' (filepath '%s')",
+ key->string, path);
+ }
}
if (!name) {
CFCUtil_die("Missing required key 'name' (filepath '%s')", path);
@@ -295,20 +302,6 @@ S_new_from_json(const char *json, const char *path, int is_included) {
CFCParcel *self = CFCParcel_new(name, nickname, version, is_included);
CFCBase_decref((CFCBase*)version);
- for (size_t i = 0, max = parsed->num_kids; i < max; i += 2) {
- JSONNode *key = parsed->kids[i];
- if (strcmp(key->string, "name") == 0
- || strcmp(key->string, "nickname") == 0
- || strcmp(key->string, "version") == 0
- ) {
- ;
- }
- else {
- CFCUtil_die("Unrecognized key: '%s' (filepath '%s')",
- key->string, path);
- }
- }
-
S_destroy_json(parsed);
return self;
}
[lucy-commits] [04/10] git commit: Support null values in .cfp JSON parser
Posted by nw...@apache.org.
Support null values in .cfp JSON parser
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/daab988c
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/daab988c
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/daab988c
Branch: refs/heads/explicit-dependencies-wip2
Commit: daab988cf2c6668af6d3c370d71c3061cbcf3e51
Parents: eb4d676
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Mar 12 13:22:47 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:29 2014 +0100
----------------------------------------------------------------------
compiler/src/CFCParcel.c | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/daab988c/compiler/src/CFCParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c
index 7674d05..2b3bead 100644
--- a/compiler/src/CFCParcel.c
+++ b/compiler/src/CFCParcel.c
@@ -49,6 +49,7 @@ static CFCParcel *default_parcel = NULL;
#define JSON_STRING 1
#define JSON_HASH 2
+#define JSON_NULL 3
typedef struct JSONNode {
int type;
@@ -66,6 +67,9 @@ S_parse_json_hash(const char **json);
static JSONNode*
S_parse_json_string(const char **json);
+static JSONNode*
+S_parse_json_null(const char **json);
+
static void
S_skip_whitespace(const char **json);
@@ -543,6 +547,9 @@ S_parse_json_hash(const char **json) {
else if (*text == '{') {
value = S_parse_json_hash(&text);
}
+ else if (*text == 'n') {
+ value = S_parse_json_null(&text);
+ }
if (!value) {
S_destroy_json(node);
return NULL;
@@ -596,6 +603,24 @@ S_parse_json_string(const char **json) {
return node;
}
+// Parse a JSON null value.
+static JSONNode*
+S_parse_json_null(const char **json) {
+ static const char null_str[] = "null";
+
+ if (strncmp(*json, null_str, sizeof(null_str) - 1) != 0) {
+ return NULL;
+ }
+
+ JSONNode *node = (JSONNode*)calloc(1, sizeof(JSONNode));
+ node->type = JSON_NULL;
+
+ // Move pointer.
+ *json += sizeof(null_str) - 1;
+
+ return node;
+}
+
static void
S_skip_whitespace(const char **json) {
while (isspace(json[0][0])) { *json = *json + 1; }
[lucy-commits] [07/10] git commit: Only search prerequisites for unqualified type
specifiers
Posted by nw...@apache.org.
Only search prerequisites for unqualified type specifiers
Don't search all classes for unqualified type specifiers. This should
allow to have classes with the same struct_sym in different parcels.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/5bdf3139
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/5bdf3139
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/5bdf3139
Branch: refs/heads/explicit-dependencies-wip2
Commit: 5bdf3139d5249eeff4c21bd729d487eabebab76e
Parents: 170f5f9
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Mar 12 15:54:56 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:30 2014 +0100
----------------------------------------------------------------------
compiler/src/CFCClass.c | 2 ++
compiler/src/CFCParcel.c | 51 +++++++++++++++++++++++++++++++++++++++
compiler/src/CFCParcel.h | 9 +++++++
compiler/src/CFCTestClass.c | 1 +
compiler/src/CFCTestParcel.c | 13 +++++++++-
compiler/src/CFCType.c | 20 +++------------
6 files changed, 79 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5bdf3139/compiler/src/CFCClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCClass.c b/compiler/src/CFCClass.c
index 61a9d42..38d1c28 100644
--- a/compiler/src/CFCClass.c
+++ b/compiler/src/CFCClass.c
@@ -202,6 +202,8 @@ CFCClass_do_create(CFCClass *self, struct CFCParcel *parcel,
// Store in registry.
S_register(self);
+ CFCParcel_add_struct_sym(parcel, self->struct_sym);
+
return self;
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5bdf3139/compiler/src/CFCParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c
index e53ff01..84b95a8 100644
--- a/compiler/src/CFCParcel.c
+++ b/compiler/src/CFCParcel.c
@@ -42,6 +42,8 @@ struct CFCParcel {
int is_required;
char **inherited_parcels;
size_t num_inherited_parcels;
+ char **struct_syms;
+ size_t num_struct_syms;
CFCPrereq **prereqs;
size_t num_prereqs;
};
@@ -253,6 +255,8 @@ CFCParcel_init(CFCParcel *self, const char *name, const char *cnick,
// Initialize arrays.
self->inherited_parcels = (char**)CALLOCATE(1, sizeof(char*));
self->num_inherited_parcels = 0;
+ self->struct_syms = (char**)CALLOCATE(1, sizeof(char*));
+ self->num_struct_syms = 0;
self->prereqs = (CFCPrereq**)CALLOCATE(1, sizeof(CFCPrereq*));
self->num_prereqs = 0;
@@ -391,6 +395,10 @@ CFCParcel_destroy(CFCParcel *self) {
CFCBase_decref((CFCBase*)self->prereqs[i]);
}
FREEMEM(self->prereqs);
+ for (size_t i = 0; self->struct_syms[i]; ++i) {
+ FREEMEM(self->struct_syms[i]);
+ }
+ FREEMEM(self->struct_syms);
CFCBase_destroy((CFCBase*)self);
}
@@ -562,6 +570,49 @@ CFCParcel_has_prereq(CFCParcel *self, CFCParcel *parcel) {
return false;
}
+void
+CFCParcel_add_struct_sym(CFCParcel *self, const char *struct_sym) {
+ size_t num_struct_syms = self->num_struct_syms + 1;
+ size_t size = (num_struct_syms + 1) * sizeof(char*);
+ char **struct_syms = (char**)REALLOCATE(self->struct_syms, size);
+ struct_syms[num_struct_syms-1] = CFCUtil_strdup(struct_sym);
+ struct_syms[num_struct_syms] = NULL;
+ self->struct_syms = struct_syms;
+ self->num_struct_syms = num_struct_syms;
+}
+
+static CFCParcel*
+S_lookup_struct_sym(CFCParcel *self, const char *struct_sym) {
+ for (size_t i = 0; self->struct_syms[i]; ++i) {
+ if (strcmp(self->struct_syms[i], struct_sym) == 0) {
+ return self;
+ }
+ }
+
+ return NULL;
+}
+
+CFCParcel*
+CFCParcel_lookup_struct_sym(CFCParcel *self, const char *struct_sym) {
+ CFCParcel *parcel = S_lookup_struct_sym(self, struct_sym);
+
+ for (size_t i = 0; self->prereqs[i]; ++i) {
+ const char *prereq_name = CFCPrereq_get_name(self->prereqs[i]);
+ CFCParcel *prereq_parcel = CFCParcel_fetch(prereq_name);
+ CFCParcel *maybe_parcel
+ = S_lookup_struct_sym(prereq_parcel, struct_sym);
+
+ if (maybe_parcel) {
+ if (parcel) {
+ CFCUtil_die("Type '%s' is ambigious", struct_sym);
+ }
+ parcel = maybe_parcel;
+ }
+ }
+
+ return parcel;
+}
+
/**************************************************************************/
struct CFCPrereq {
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5bdf3139/compiler/src/CFCParcel.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.h b/compiler/src/CFCParcel.h
index 4efbdd9..4bd822d 100644
--- a/compiler/src/CFCParcel.h
+++ b/compiler/src/CFCParcel.h
@@ -161,6 +161,15 @@ CFCParcel_check_prereqs(CFCParcel *self);
int
CFCParcel_has_prereq(CFCParcel *self, CFCParcel *parcel);
+void
+CFCParcel_add_struct_sym(CFCParcel *self, const char *struct_sym);
+
+/** Search the parcel and all direct prerequisites for a class with
+ * struct_sym. Return the parcel in which the class was found or NULL.
+ */
+CFCParcel*
+CFCParcel_lookup_struct_sym(CFCParcel *self, const char *struct_sym);
+
/**************************************************************************/
CFCPrereq*
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5bdf3139/compiler/src/CFCTestClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestClass.c b/compiler/src/CFCTestClass.c
index e33d454..36bd4ee 100644
--- a/compiler/src/CFCTestClass.c
+++ b/compiler/src/CFCTestClass.c
@@ -120,6 +120,7 @@ S_run_tests(CFCTest *test) {
CFCBase_decref((CFCBase*)parsed_neato);
}
+ CFCParser_set_parcel(parser, neato);
CFCParser_set_class_name(parser, "Foo");
CFCMethod *do_stuff
= CFCTest_parse_method(test, parser, "void Do_Stuff(Foo *self);");
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5bdf3139/compiler/src/CFCTestParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParcel.c b/compiler/src/CFCTestParcel.c
index c8fb528..504f2a7 100644
--- a/compiler/src/CFCTestParcel.c
+++ b/compiler/src/CFCTestParcel.c
@@ -40,7 +40,7 @@ S_run_parcel_tests(CFCTest *test);
const CFCTestBatch CFCTEST_BATCH_PARCEL = {
"Clownfish::CFC::Model::Parcel",
- 32,
+ 35,
S_run_tests
};
@@ -215,6 +215,17 @@ S_run_parcel_tests(CFCTest *test) {
OK(test, CFCParcel_has_prereq(crust, crust), "has_prereq self");
OK(test, !CFCParcel_has_prereq(crust, foo), "has_prereq false");
+ CFCParcel_add_struct_sym(cfish, "Swim");
+ CFCParcel_add_struct_sym(crust, "Pinch");
+ CFCParcel_add_struct_sym(foo, "Bar");
+ CFCParcel *found;
+ found = CFCParcel_lookup_struct_sym(crust, "Swim");
+ OK(test, found == cfish, "lookup_struct_sym prereq");
+ found = CFCParcel_lookup_struct_sym(crust, "Pinch");
+ OK(test, found == crust, "lookup_struct_sym self");
+ found = CFCParcel_lookup_struct_sym(crust, "Bar");
+ OK(test, found == NULL, "lookup_struct_sym other");
+
FREEMEM(prereq_parcels);
CFCBase_decref((CFCBase*)crust);
CFCBase_decref((CFCBase*)cfish_version);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5bdf3139/compiler/src/CFCType.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCType.c b/compiler/src/CFCType.c
index 3ff7db7..974f33a 100644
--- a/compiler/src/CFCType.c
+++ b/compiler/src/CFCType.c
@@ -273,26 +273,14 @@ CFCType_resolve(CFCType *self, CFCClass **classes) {
char *specifier = self->specifier;
if (isupper(specifier[0])) {
- // Try to find class from class list.
- CFCClass *klass = NULL;
- for (size_t i = 0; classes[i]; ++i) {
- CFCClass *maybe_class = classes[i];
- const char *struct_sym = CFCClass_get_struct_sym(maybe_class);
-
- if (strcmp(specifier, struct_sym) == 0) {
- if (klass) {
- CFCUtil_die("Type '%s' is ambigious", specifier);
- }
- klass = maybe_class;
- }
- }
-
- if (!klass) {
+ CFCParcel *parcel
+ = CFCParcel_lookup_struct_sym(self->parcel, specifier);
+ if (!parcel) {
CFCUtil_die("No class found for type '%s'", specifier);
}
// Create actual specifier with prefix.
- const char *prefix = CFCClass_get_prefix(klass);
+ const char *prefix = CFCParcel_get_prefix(parcel);
self->specifier = CFCUtil_sprintf("%s%s", prefix, specifier);
FREEMEM(specifier);
}
[lucy-commits] [06/10] git commit: Verify prerequisite parcels
Posted by nw...@apache.org.
Verify prerequisite parcels
Recursively check that all prerequisite parcels were found and match the
required version. All visited parcels are marked with a 'required' flag.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/9abd6a8e
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/9abd6a8e
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/9abd6a8e
Branch: refs/heads/explicit-dependencies-wip2
Commit: 9abd6a8e555a233e92e0352ec89133bb38558ec7
Parents: ba21f48
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Tue Mar 11 20:06:34 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:30 2014 +0100
----------------------------------------------------------------------
compiler/src/CFCHierarchy.c | 24 ++++++++++++++++++++++
compiler/src/CFCParcel.c | 43 ++++++++++++++++++++++++++++++++++++++-
compiler/src/CFCParcel.h | 12 +++++++++++
compiler/src/CFCTestParcel.c | 35 +++++++++++++++++++++++++++++--
4 files changed, 111 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/9abd6a8e/compiler/src/CFCHierarchy.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCHierarchy.c b/compiler/src/CFCHierarchy.c
index c5ce5ec..af03016 100644
--- a/compiler/src/CFCHierarchy.c
+++ b/compiler/src/CFCHierarchy.c
@@ -67,6 +67,9 @@ static void
S_parse_parcel_files(const char *path, void *context);
static void
+S_check_prereqs(void);
+
+static void
S_do_make_path(const char *path);
static void
@@ -189,6 +192,7 @@ CFCHierarchy_add_include_dir(CFCHierarchy *self, const char *include_dir) {
void
CFCHierarchy_build(CFCHierarchy *self) {
+ // Read .cfp files.
CFCParseParcelFilesContext context;
context.is_included = false;
for (size_t i = 0; self->sources[i] != NULL; i++) {
@@ -198,15 +202,21 @@ CFCHierarchy_build(CFCHierarchy *self) {
for (size_t i = 0; self->includes[i] != NULL; i++) {
CFCUtil_walk(self->includes[i], S_parse_parcel_files, &context);
}
+
+ S_check_prereqs();
+
+ // Read .cfh files.
for (size_t i = 0; self->sources[i] != NULL; i++) {
S_parse_cf_files(self, self->sources[i], 0);
}
for (size_t i = 0; self->includes[i] != NULL; i++) {
S_parse_cf_files(self, self->includes[i], 1);
}
+
for (int i = 0; self->classes[i] != NULL; i++) {
CFCClass_resolve_types(self->classes[i], self->classes);
}
+
S_connect_classes(self);
for (size_t i = 0; self->trees[i] != NULL; i++) {
CFCClass_grow_tree(self->trees[i]);
@@ -251,6 +261,20 @@ S_parse_parcel_files(const char *path, void *arg) {
}
static void
+S_check_prereqs() {
+ CFCParcel **parcels = CFCParcel_all_parcels();
+
+ for (int i = 0; parcels[i]; ++i) {
+ CFCParcel *parcel = parcels[i];
+ if (!CFCParcel_included(parcel)) {
+ CFCParcel_check_prereqs(parcel);
+ }
+ }
+
+ FREEMEM(parcels);
+}
+
+static void
S_find_cfh(const char *path, void *context) {
char ***cfh_ptr = (char***)context;
char **cfh_list = *cfh_ptr;
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/9abd6a8e/compiler/src/CFCParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c
index cfad49a..b54e014 100644
--- a/compiler/src/CFCParcel.c
+++ b/compiler/src/CFCParcel.c
@@ -39,6 +39,7 @@ struct CFCParcel {
char *PREFIX;
char *privacy_sym;
int is_included;
+ int is_required;
char **dependent_parcels;
size_t num_dependent_parcels;
char **inherited_parcels;
@@ -247,8 +248,9 @@ CFCParcel_init(CFCParcel *self, const char *name, const char *cnick,
}
self->privacy_sym[privacy_sym_len] = '\0';
- // Set is_included.
+ // Initialize flags.
self->is_included = is_included;
+ self->is_required = false;
// Initialize dependencies.
self->dependent_parcels = (char**)CALLOCATE(1, sizeof(char*));
@@ -461,6 +463,11 @@ CFCParcel_included(CFCParcel *self) {
return self->is_included;
}
+int
+CFCParcel_required(CFCParcel *self) {
+ return self->is_required;
+}
+
void
CFCParcel_add_dependent_parcel(CFCParcel *self, CFCParcel *dependent) {
const char *name = CFCParcel_get_name(self);
@@ -537,6 +544,40 @@ CFCParcel_get_prereqs(CFCParcel *self) {
return self->prereqs;
}
+void
+CFCParcel_check_prereqs(CFCParcel *self) {
+ // This is essentially a depth-first search of the dependency graph.
+
+ if (self->is_required) { return; }
+ self->is_required = true;
+
+ const char *name = CFCParcel_get_name(self);
+
+ for (int i = 0; self->prereqs[i]; ++i) {
+ CFCPrereq *prereq = self->prereqs[i];
+
+ const char *req_name = CFCPrereq_get_name(prereq);
+ CFCParcel *req_parcel = CFCParcel_fetch(req_name);
+ if (!req_parcel) {
+ // TODO: Add include path to error message.
+ CFCUtil_die("Parcel '%s' required by '%s' not found", req_name,
+ name);
+ }
+
+ CFCVersion *version = req_parcel->version;
+ CFCVersion *req_version = CFCPrereq_get_version(prereq);
+ if (CFCVersion_compare_to(version, req_version) < 0) {
+ const char *vstring = CFCVersion_get_vstring(version);
+ const char *req_vstring = CFCVersion_get_vstring(req_version);
+ CFCUtil_die("Version %s of parcel '%s' required by '%s' is lower"
+ " than required version %s",
+ vstring, req_name, name, req_vstring);
+ }
+
+ CFCParcel_check_prereqs(req_parcel);
+ }
+}
+
/**************************************************************************/
struct CFCPrereq {
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/9abd6a8e/compiler/src/CFCParcel.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.h b/compiler/src/CFCParcel.h
index ad31c86..77e8d1b 100644
--- a/compiler/src/CFCParcel.h
+++ b/compiler/src/CFCParcel.h
@@ -121,6 +121,12 @@ CFCParcel_get_privacy_sym(CFCParcel *self);
int
CFCParcel_included(CFCParcel *self);
+/** Return true if the parcel is required. This is only valid after all
+ * prerequisites were checked.
+ */
+int
+CFCParcel_required(CFCParcel *self);
+
/** Add another Parcel that the Parcel depends on.
*/
void
@@ -149,6 +155,12 @@ CFCParcel_inherited_parcels(CFCParcel *self);
CFCPrereq**
CFCParcel_get_prereqs(CFCParcel *self);
+/** Recursively verify that all prerequisite parcels are present in the
+ * required version. Mark all needed parcels including 'self' as required.
+ */
+void
+CFCParcel_check_prereqs(CFCParcel *self);
+
/**************************************************************************/
CFCPrereq*
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/9abd6a8e/compiler/src/CFCTestParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParcel.c b/compiler/src/CFCTestParcel.c
index 5d3e5d9..2abd7c0 100644
--- a/compiler/src/CFCTestParcel.c
+++ b/compiler/src/CFCTestParcel.c
@@ -39,7 +39,7 @@ S_run_parcel_tests(CFCTest *test);
const CFCTestBatch CFCTEST_BATCH_PARCEL = {
"Clownfish::CFC::Model::Parcel",
- 23,
+ 26,
S_run_tests
};
@@ -136,6 +136,7 @@ S_run_parcel_tests(CFCTest *test) {
CFCBase_decref((CFCBase*)thing);
CFCBase_decref((CFCBase*)parcel);
+ CFCParcel_reap_singletons();
}
{
@@ -178,6 +179,36 @@ S_run_parcel_tests(CFCTest *test) {
CFCBase_decref((CFCBase*)parcel);
}
- CFCParcel_reap_singletons();
+ {
+ CFCParcel *foo = CFCParcel_new("Foo", NULL, NULL, true);
+ CFCParcel_register(foo);
+
+ CFCVersion *cfish_version = CFCVersion_new("v0.8.7");
+ CFCParcel *cfish
+ = CFCParcel_new("Clownfish", NULL, cfish_version, true);
+ CFCParcel_register(cfish);
+
+ const char *crust_json =
+ " {\n"
+ " \"name\": \"Crustacean\",\n"
+ " \"version\": \"v0.1.0\",\n"
+ " \"prerequisites\": {\n"
+ " \"Clownfish\": \"v0.8.5\",\n"
+ " }\n"
+ " }\n";
+ CFCParcel *crust = CFCParcel_new_from_json(crust_json, false);
+ CFCParcel_register(crust);
+
+ CFCParcel_check_prereqs(crust);
+ INT_EQ(test, CFCParcel_required(foo), false, "parcel not required");
+ INT_EQ(test, CFCParcel_required(cfish), true, "prereq required");
+ INT_EQ(test, CFCParcel_required(crust), true, "self required");
+
+ CFCBase_decref((CFCBase*)crust);
+ CFCBase_decref((CFCBase*)cfish_version);
+ CFCBase_decref((CFCBase*)cfish);
+ CFCBase_decref((CFCBase*)foo);
+ CFCParcel_reap_singletons();
+ }
}
[lucy-commits] [05/10] git commit: Perl bindings for CFCPrereq
Posted by nw...@apache.org.
Perl bindings for CFCPrereq
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/b7189acf
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/b7189acf
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/b7189acf
Branch: refs/heads/explicit-dependencies-wip2
Commit: b7189acf01d49a93cdb4055b46c056b2c432d87c
Parents: cd402eb
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Mon Mar 17 17:51:59 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:30 2014 +0100
----------------------------------------------------------------------
compiler/perl/lib/Clownfish/CFC.pm | 20 +++++++++++
compiler/perl/lib/Clownfish/CFC.xs | 36 ++++++++++++++++++++
compiler/perl/lib/Clownfish/CFC/Model/Prereq.pm | 20 +++++++++++
compiler/perl/t/403-parcel.t | 15 +++++++-
compiler/perl/typemap | 1 +
5 files changed, 91 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/b7189acf/compiler/perl/lib/Clownfish/CFC.pm
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.pm b/compiler/perl/lib/Clownfish/CFC.pm
index c918155..d5a070b 100644
--- a/compiler/perl/lib/Clownfish/CFC.pm
+++ b/compiler/perl/lib/Clownfish/CFC.pm
@@ -390,6 +390,26 @@ BEGIN { XSLoader::load( 'Clownfish::CFC', '0.01' ) }
}
{
+ package Clownfish::CFC::Model::Prereq;
+ BEGIN { push our @ISA, 'Clownfish::CFC::Base' }
+ use Clownfish::CFC::Util qw( verify_args );
+ use Scalar::Util qw( blessed );
+ use Carp;
+
+ our %new_PARAMS = (
+ name => undef,
+ version => undef,
+ );
+
+ sub new {
+ my ( $either, %args ) = @_;
+ verify_args( \%new_PARAMS, %args ) or confess $@;
+ confess "no subclassing allowed" unless $either eq __PACKAGE__;
+ return _new( @args{qw( name version )} );
+ }
+}
+
+{
package Clownfish::CFC::Model::Symbol;
BEGIN { push our @ISA, 'Clownfish::CFC::Base' }
use Clownfish::CFC::Util qw( verify_args );
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/b7189acf/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs
index f69dfc4..fe23b86 100644
--- a/compiler/perl/lib/Clownfish/CFC.xs
+++ b/compiler/perl/lib/Clownfish/CFC.xs
@@ -1205,6 +1205,42 @@ PPCODE:
}
+MODULE = Clownfish::CFC PACKAGE = Clownfish::CFC::Model::Prereq
+
+SV*
+_new(name_sv, version)
+ SV *name_sv;
+ CFCVersion *version;
+CODE:
+ const char *name = SvOK(name_sv) ? SvPV_nolen(name_sv) : NULL;
+ CFCPrereq *self = CFCPrereq_new(name, version);
+ RETVAL = S_cfcbase_to_perlref(self);
+ CFCBase_decref((CFCBase*)self);
+OUTPUT: RETVAL
+
+void
+_set_or_get(self, ...)
+ CFCPrereq *self;
+ALIAS:
+ get_name = 2
+ get_version = 4
+PPCODE:
+{
+ START_SET_OR_GET_SWITCH
+ case 2: {
+ const char *name = CFCPrereq_get_name(self);
+ retval = newSVpvn(name, strlen(name));
+ }
+ break;
+ case 4: {
+ CFCVersion *value = CFCPrereq_get_version(self);
+ retval = S_cfcbase_to_perlref(value);
+ }
+ break;
+ END_SET_OR_GET_SWITCH
+}
+
+
MODULE = Clownfish::CFC PACKAGE = Clownfish::CFC::Model::Symbol
SV*
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/b7189acf/compiler/perl/lib/Clownfish/CFC/Model/Prereq.pm
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC/Model/Prereq.pm b/compiler/perl/lib/Clownfish/CFC/Model/Prereq.pm
new file mode 100644
index 0000000..99a4eca
--- /dev/null
+++ b/compiler/perl/lib/Clownfish/CFC/Model/Prereq.pm
@@ -0,0 +1,20 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+package Clownfish::CFC::Model::Prereq;
+use Clownfish::CFC;
+
+1;
+
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/b7189acf/compiler/perl/t/403-parcel.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/403-parcel.t b/compiler/perl/t/403-parcel.t
index 540e6ba..fb23b08 100644
--- a/compiler/perl/t/403-parcel.t
+++ b/compiler/perl/t/403-parcel.t
@@ -16,9 +16,22 @@
use strict;
use warnings;
-use Test::More tests => 17;
+use Test::More tests => 21;
use File::Spec::Functions qw( catfile );
+BEGIN { use_ok('Clownfish::CFC::Model::Prereq') }
+
+{
+ my $version = Clownfish::CFC::Model::Version->new( vstring => 'v34.5.67' );
+ my $prereq = Clownfish::CFC::Model::Prereq->new(
+ name => 'Flour',
+ version => $version,
+ );
+ ok( $prereq, "new prereq" );
+ is( $prereq->get_name, 'Flour', 'prereq get_name' );
+ is( $prereq->get_version->compare_to($version), 0, 'prereq get_version');
+}
+
BEGIN { use_ok('Clownfish::CFC::Model::Parcel') }
my $foo = Clownfish::CFC::Model::Parcel->new( name => "Foo" );
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/b7189acf/compiler/perl/typemap
----------------------------------------------------------------------
diff --git a/compiler/perl/typemap b/compiler/perl/typemap
index d744071..a83840e 100644
--- a/compiler/perl/typemap
+++ b/compiler/perl/typemap
@@ -27,6 +27,7 @@ CFCMemPool* CLOWNFISH_TYPE
CFCParamList* CLOWNFISH_MODEL
CFCParcel* CLOWNFISH_MODEL
CFCParser* CLOWNFISH_TYPE
+CFCPrereq* CLOWNFISH_MODEL
CFCSymbol* CLOWNFISH_MODEL
CFCTest* CLOWNFISH_TYPE
CFCType* CLOWNFISH_MODEL
[lucy-commits] [08/10] git commit: Remove unneeded parameter
Posted by nw...@apache.org.
Remove unneeded parameter
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/cd402eb4
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/cd402eb4
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/cd402eb4
Branch: refs/heads/explicit-dependencies-wip2
Commit: cd402eb4dcf260867ab6e69fea4ab8bd8a44ff51
Parents: 5bdf313
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Mar 12 18:02:22 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:30 2014 +0100
----------------------------------------------------------------------
compiler/perl/lib/Clownfish/CFC.xs | 54 ++++++++-------------------------
compiler/perl/t/105-object_type.t | 18 +++++------
compiler/perl/t/300-variable.t | 6 ++--
compiler/perl/t/301-param_list.t | 4 +--
compiler/perl/t/404-file.t | 4 +--
compiler/perl/t/600-parser.t | 4 +--
compiler/src/CFCClass.c | 10 +++---
compiler/src/CFCClass.h | 2 +-
compiler/src/CFCFunction.c | 6 ++--
compiler/src/CFCFunction.h | 2 +-
compiler/src/CFCHierarchy.c | 2 +-
compiler/src/CFCMethod.c | 4 +--
compiler/src/CFCMethod.h | 2 +-
compiler/src/CFCParamList.c | 4 +--
compiler/src/CFCParamList.h | 2 +-
compiler/src/CFCTestClass.c | 9 ++----
compiler/src/CFCTestFile.c | 4 +--
compiler/src/CFCTestMethod.c | 3 +-
compiler/src/CFCTestParamList.c | 7 ++---
compiler/src/CFCTestParser.c | 2 +-
compiler/src/CFCTestType.c | 19 +++++-------
compiler/src/CFCTestVariable.c | 7 ++---
compiler/src/CFCType.c | 4 +--
compiler/src/CFCType.h | 2 +-
compiler/src/CFCVariable.c | 4 +--
compiler/src/CFCVariable.h | 2 +-
26 files changed, 73 insertions(+), 114 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs
index faa74f3..f69dfc4 100644
--- a/compiler/perl/lib/Clownfish/CFC.xs
+++ b/compiler/perl/lib/Clownfish/CFC.xs
@@ -268,15 +268,10 @@ CODE:
OUTPUT: RETVAL
void
-resolve_types(self, classes_sv)
+resolve_types(self)
CFCClass *self;
- SV *classes_sv;
PPCODE:
- CFCClass **classes
- = (CFCClass**)S_av_to_array_of_cfcbase(classes_sv,
- "Clownfish::CFC::Model::Class");
- CFCClass_resolve_types(self, classes);
- FREEMEM(classes);
+ CFCClass_resolve_types(self);
void
_set_or_get(self, ...)
@@ -662,15 +657,10 @@ CODE:
OUTPUT: RETVAL
void
-resolve_types(self, classes_sv)
+resolve_types(self)
CFCFunction *self;
- SV *classes_sv;
PPCODE:
- CFCClass **classes
- = (CFCClass**)S_av_to_array_of_cfcbase(classes_sv,
- "Clownfish::CFC::Model::Class");
- CFCFunction_resolve_types(self, classes);
- FREEMEM(classes);
+ CFCFunction_resolve_types(self);
void
_set_or_get(self, ...)
@@ -866,15 +856,10 @@ CODE:
OUTPUT: RETVAL
void
-resolve_types(self, classes_sv)
+resolve_types(self)
CFCMethod *self;
- SV *classes_sv;
PPCODE:
- CFCClass **classes
- = (CFCClass**)S_av_to_array_of_cfcbase(classes_sv,
- "Clownfish::CFC::Model::Class");
- CFCMethod_resolve_types(self, classes);
- FREEMEM(classes);
+ CFCMethod_resolve_types(self);
void
exclude_from_host(self)
@@ -996,15 +981,10 @@ PPCODE:
CFCParamList_add_param(self, variable, value);
void
-resolve_types(self, classes_sv)
+resolve_types(self)
CFCParamList *self;
- SV *classes_sv;
PPCODE:
- CFCClass **classes
- = (CFCClass**)S_av_to_array_of_cfcbase(classes_sv,
- "Clownfish::CFC::Model::Class");
- CFCParamList_resolve_types(self, classes);
- FREEMEM(classes);
+ CFCParamList_resolve_types(self);
void
_set_or_get(self, ...)
@@ -1550,15 +1530,10 @@ CODE:
OUTPUT: RETVAL
void
-resolve(self, classes_sv)
+resolve(self)
CFCType *self;
- SV *classes_sv;
PPCODE:
- CFCClass **classes
- = (CFCClass**)S_av_to_array_of_cfcbase(classes_sv,
- "Clownfish::CFC::Model::Class");
- CFCType_resolve(self, classes);
- FREEMEM(classes);
+ CFCType_resolve(self);
void
_set_or_get(self, ...)
@@ -1772,15 +1747,10 @@ CODE:
OUTPUT: RETVAL
void
-resolve_type(self, classes_sv)
+resolve_type(self)
CFCVariable *self;
- SV *classes_sv;
PPCODE:
- CFCClass **classes
- = (CFCClass**)S_av_to_array_of_cfcbase(classes_sv,
- "Clownfish::CFC::Model::Class");
- CFCVariable_resolve_type(self, classes);
- FREEMEM(classes);
+ CFCVariable_resolve_type(self);
void
_set_or_get(self, ...)
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/perl/t/105-object_type.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/105-object_type.t b/compiler/perl/t/105-object_type.t
index a9ac3fc..9bdce59 100644
--- a/compiler/perl/t/105-object_type.t
+++ b/compiler/perl/t/105-object_type.t
@@ -38,11 +38,11 @@ for my $bad_specifier (qw( foo Foo_Bar FOOBAR 1Foo 1FOO )) {
}
my @specifiers = qw( Foo FooJr FooIII Foo4th );
-my @classes = map { $parser->parse("class $_ {}") } @specifiers;
+$parser->parse("class $_ {}") for @specifiers;
for my $specifier (@specifiers) {
my $type = $parser->parse("$specifier*");
- $type->resolve(\@classes);
+ $type->resolve;
is( $type->get_specifier, "neato_$specifier",
"object_type_specifier: $specifier" );
is( $parser->parse("neato_$specifier*")->get_specifier,
@@ -81,12 +81,12 @@ my $foo_type = Clownfish::CFC::Model::Type->new_object(
parcel => 'Neato',
specifier => 'Foo',
);
-$foo_type->resolve(\@classes);
+$foo_type->resolve;
my $another_foo = Clownfish::CFC::Model::Type->new_object(
parcel => 'Neato',
specifier => 'Foo',
);
-$another_foo->resolve(\@classes);
+$another_foo->resolve;
ok( $foo_type->equals($another_foo), "equals" );
my $bar_class = Clownfish::CFC::Model::Class->create(
@@ -97,7 +97,7 @@ my $bar_type = Clownfish::CFC::Model::Type->new_object(
parcel => 'Neato',
specifier => 'Bar',
);
-$bar_type->resolve([ $bar_class ]);
+$bar_type->resolve;
ok( !$foo_type->equals($bar_type), "different specifier spoils equals" );
my $foreign_foo_class = Clownfish::CFC::Model::Class->create(
@@ -108,7 +108,7 @@ my $foreign_foo = Clownfish::CFC::Model::Type->new_object(
parcel => 'Foreign',
specifier => 'Foo',
);
-$foreign_foo->resolve([ $foreign_foo_class ]);
+$foreign_foo->resolve;
ok( !$foo_type->equals($foreign_foo), "different parcel spoils equals" );
is( $foreign_foo->get_specifier, "foreign_Foo",
"prepend parcel prefix to specifier" );
@@ -118,7 +118,7 @@ my $incremented_foo = Clownfish::CFC::Model::Type->new_object(
specifier => 'Foo',
incremented => 1,
);
-$incremented_foo->resolve(\@classes);
+$incremented_foo->resolve;
ok( $incremented_foo->incremented, "incremented" );
ok( !$foo_type->incremented, "not incremented" );
ok( !$foo_type->equals($incremented_foo),
@@ -130,7 +130,7 @@ my $decremented_foo = Clownfish::CFC::Model::Type->new_object(
specifier => 'Foo',
decremented => 1,
);
-$decremented_foo->resolve(\@classes);
+$decremented_foo->resolve;
ok( $decremented_foo->decremented, "decremented" );
ok( !$foo_type->decremented, "not decremented" );
ok( !$foo_type->equals($decremented_foo),
@@ -142,7 +142,7 @@ my $const_foo = Clownfish::CFC::Model::Type->new_object(
specifier => 'Foo',
const => 1,
);
-$const_foo->resolve(\@classes);
+$const_foo->resolve;
ok( !$foo_type->equals($const_foo), "different const spoils equals" );
like( $const_foo->to_c, qr/const/, "const included in C representation" );
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/perl/t/300-variable.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/300-variable.t b/compiler/perl/t/300-variable.t
index a5f33be..bc49d17 100644
--- a/compiler/perl/t/300-variable.t
+++ b/compiler/perl/t/300-variable.t
@@ -49,7 +49,7 @@ my $var = Clownfish::CFC::Model::Variable->new(
micro_sym => 'foo',
type => new_type('float*')
);
-$var->resolve_type([]);
+$var->resolve_type;
is( $var->local_c, 'float* foo', "local_c" );
is( $var->local_declaration, 'float* foo;', "declaration" );
ok( $var->local, "default to local access" );
@@ -58,7 +58,7 @@ $var = Clownfish::CFC::Model::Variable->new(
micro_sym => 'foo',
type => new_type('float[1]')
);
-$var->resolve_type([]);
+$var->resolve_type;
is( $var->local_c, 'float foo[1]',
"to_c appends array to var name rather than type specifier" );
@@ -70,7 +70,7 @@ $var = Clownfish::CFC::Model::Variable->new(
class_name => 'Crustacean::Lobster::LobsterClaw',
class_cnick => 'LobClaw',
);
-$var->resolve_type([ $foo_class ]);
+$var->resolve_type;
is( $var->global_c, 'neato_Foo* neato_LobClaw_foo', "global_c" );
isa_ok(
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/perl/t/301-param_list.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/301-param_list.t b/compiler/perl/t/301-param_list.t
index b315e9a..b3665c8 100644
--- a/compiler/perl/t/301-param_list.t
+++ b/compiler/perl/t/301-param_list.t
@@ -33,14 +33,14 @@ isa_ok(
my $obj_class = $parser->parse("class Obj {}");
my $param_list = $parser->parse("(Obj *self, int num)");
-$param_list->resolve_types([ $obj_class ]);
+$param_list->resolve_types;
isa_ok( $param_list, "Clownfish::CFC::Model::ParamList" );
ok( !$param_list->variadic, "not variadic" );
is( $param_list->to_c, 'neato_Obj* self, int num', "to_c" );
is( $param_list->name_list, 'self, num', "name_list" );
$param_list = $parser->parse("(Obj *self=NULL, int num, ...)");
-$param_list->resolve_types([ $obj_class ]);
+$param_list->resolve_types;
ok( $param_list->variadic, "variadic" );
is_deeply(
$param_list->get_initial_values,
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/perl/t/404-file.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/404-file.t b/compiler/perl/t/404-file.t
index 11668c4..d071c66 100644
--- a/compiler/perl/t/404-file.t
+++ b/compiler/perl/t/404-file.t
@@ -70,8 +70,8 @@ my $file_spec = Clownfish::CFC::Model::FileSpec->new(
is( scalar @$classes, 3, "classes() filters blocks" );
my $class = $classes->[0];
my ( $foo, $bar ) = @{ $class->member_vars };
- $foo->resolve_type($classes);
- $bar->resolve_type($classes);
+ $foo->resolve_type;
+ $bar->resolve_type;
is( $foo->get_type->get_specifier,
'stuff_Foo', 'file production picked up parcel def' );
is( $bar->get_type->get_specifier, 'stuff_Bar', 'parcel def is sticky' );
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/perl/t/600-parser.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/600-parser.t b/compiler/perl/t/600-parser.t
index 94dbed3..8d6e26e 100644
--- a/compiler/perl/t/600-parser.t
+++ b/compiler/perl/t/600-parser.t
@@ -57,7 +57,7 @@ isa_ok( $parser->parse("bool"),
for (qw( ByteBuf Obj ANDMatcher )) {
my $class = $parser->parse("class $_ {}");
my $type = $parser->parse("$_*");
- $type->resolve([ $class ]);
+ $type->resolve;
is( $type->get_specifier, "crust_$_", "object_type_specifier $_" );
}
@@ -134,7 +134,7 @@ ok( $parser->parse($_), "declaration statement: $_" )
for (qw( Foo FooJr FooIII Foo4th )) {
my $class = $parser->parse("class $_ {}");
my $type = $parser->parse("$_*");
- $type->resolve([ $class ]);
+ $type->resolve;
is( $type->get_specifier, "crust_$_", "object_type_specifier: $_" )
}
Clownfish::CFC::Model::Class->_clear_registry();
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCClass.c b/compiler/src/CFCClass.c
index 38d1c28..fccecf8 100644
--- a/compiler/src/CFCClass.c
+++ b/compiler/src/CFCClass.c
@@ -480,18 +480,18 @@ CFCClass_fresh_method(CFCClass *self, const char *sym) {
}
void
-CFCClass_resolve_types(CFCClass *self, CFCClass **classes) {
+CFCClass_resolve_types(CFCClass *self) {
for (size_t i = 0; self->functions[i] != NULL; i++) {
- CFCFunction_resolve_types(self->functions[i], classes);
+ CFCFunction_resolve_types(self->functions[i]);
}
for (size_t i = 0; self->methods[i] != NULL; i++) {
- CFCMethod_resolve_types(self->methods[i], classes);
+ CFCMethod_resolve_types(self->methods[i]);
}
for (size_t i = 0; self->member_vars[i] != NULL; i++) {
- CFCVariable_resolve_type(self->member_vars[i], classes);
+ CFCVariable_resolve_type(self->member_vars[i]);
}
for (size_t i = 0; self->inert_vars[i] != NULL; i++) {
- CFCVariable_resolve_type(self->inert_vars[i], classes);
+ CFCVariable_resolve_type(self->inert_vars[i]);
}
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCClass.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCClass.h b/compiler/src/CFCClass.h
index 5c52728..00e05a3 100644
--- a/compiler/src/CFCClass.h
+++ b/compiler/src/CFCClass.h
@@ -142,7 +142,7 @@ CFCClass_find_novel_method(CFCClass *self, const char *sym);
/** Find the actual class of all object variables without prefix.
*/
void
-CFCClass_resolve_types(CFCClass *self, CFCClass **classes);
+CFCClass_resolve_types(CFCClass *self);
/** Bequeath all inherited methods and members to children.
*/
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCFunction.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCFunction.c b/compiler/src/CFCFunction.c
index 6f781f4..3926164 100644
--- a/compiler/src/CFCFunction.c
+++ b/compiler/src/CFCFunction.c
@@ -84,9 +84,9 @@ CFCFunction_init(CFCFunction *self, CFCParcel *parcel, const char *exposure,
}
void
-CFCFunction_resolve_types(CFCFunction *self, struct CFCClass **classes) {
- CFCType_resolve(self->return_type, classes);
- CFCParamList_resolve_types(self->param_list, classes);
+CFCFunction_resolve_types(CFCFunction *self) {
+ CFCType_resolve(self->return_type);
+ CFCParamList_resolve_types(self->param_list);
}
void
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCFunction.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCFunction.h b/compiler/src/CFCFunction.h
index baab2c7..16a789e 100644
--- a/compiler/src/CFCFunction.h
+++ b/compiler/src/CFCFunction.h
@@ -114,7 +114,7 @@ CFCFunction_public(CFCFunction *self);
/** Find the actual class of all object variables without prefix.
*/
void
-CFCFunction_resolve_types(CFCFunction *self, struct CFCClass **classes);
+CFCFunction_resolve_types(CFCFunction *self);
#ifdef __cplusplus
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCHierarchy.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCHierarchy.c b/compiler/src/CFCHierarchy.c
index af03016..f7e9520 100644
--- a/compiler/src/CFCHierarchy.c
+++ b/compiler/src/CFCHierarchy.c
@@ -214,7 +214,7 @@ CFCHierarchy_build(CFCHierarchy *self) {
}
for (int i = 0; self->classes[i] != NULL; i++) {
- CFCClass_resolve_types(self->classes[i], self->classes);
+ CFCClass_resolve_types(self->classes[i]);
}
S_connect_classes(self);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCMethod.c b/compiler/src/CFCMethod.c
index f5780e2..97c68ae 100644
--- a/compiler/src/CFCMethod.c
+++ b/compiler/src/CFCMethod.c
@@ -149,8 +149,8 @@ CFCMethod_init(CFCMethod *self, CFCParcel *parcel, const char *exposure,
}
void
-CFCMethod_resolve_types(CFCMethod *self, struct CFCClass **classes) {
- CFCFunction_resolve_types((CFCFunction*)self, classes);
+CFCMethod_resolve_types(CFCMethod *self) {
+ CFCFunction_resolve_types((CFCFunction*)self);
}
void
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCMethod.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCMethod.h b/compiler/src/CFCMethod.h
index 0c96220..ad3294c 100644
--- a/compiler/src/CFCMethod.h
+++ b/compiler/src/CFCMethod.h
@@ -71,7 +71,7 @@ CFCMethod_init(CFCMethod *self, struct CFCParcel *parcel,
int is_abstract);
void
-CFCMethod_resolve_types(CFCMethod *self, struct CFCClass **classes);
+CFCMethod_resolve_types(CFCMethod *self);
void
CFCMethod_destroy(CFCMethod *self);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCParamList.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParamList.c b/compiler/src/CFCParamList.c
index 087030c..06b5e0e 100644
--- a/compiler/src/CFCParamList.c
+++ b/compiler/src/CFCParamList.c
@@ -61,9 +61,9 @@ CFCParamList_init(CFCParamList *self, int variadic) {
}
void
-CFCParamList_resolve_types(CFCParamList *self, struct CFCClass **classes) {
+CFCParamList_resolve_types(CFCParamList *self) {
for (size_t i = 0; self->variables[i]; ++i) {
- CFCVariable_resolve_type(self->variables[i], classes);
+ CFCVariable_resolve_type(self->variables[i]);
}
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCParamList.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParamList.h b/compiler/src/CFCParamList.h
index 886fdfe..2aaae6d 100644
--- a/compiler/src/CFCParamList.h
+++ b/compiler/src/CFCParamList.h
@@ -38,7 +38,7 @@ CFCParamList*
CFCParamList_init(CFCParamList *self, int variadic);
void
-CFCParamList_resolve_types(CFCParamList *self, struct CFCClass **classes);
+CFCParamList_resolve_types(CFCParamList *self);
void
CFCParamList_destroy(CFCParamList *self);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCTestClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestClass.c b/compiler/src/CFCTestClass.c
index 36bd4ee..aa080ae 100644
--- a/compiler/src/CFCTestClass.c
+++ b/compiler/src/CFCTestClass.c
@@ -126,12 +126,9 @@ S_run_tests(CFCTest *test) {
= CFCTest_parse_method(test, parser, "void Do_Stuff(Foo *self);");
CFCClass_add_method(foo, do_stuff);
- CFCClass *class_list[6] = {
- foo, foo_jr, final_foo, thing_class, widget_class, NULL
- };
- CFCClass_resolve_types(foo, class_list);
- CFCClass_resolve_types(foo_jr, class_list);
- CFCClass_resolve_types(final_foo, class_list);
+ CFCClass_resolve_types(foo);
+ CFCClass_resolve_types(foo_jr);
+ CFCClass_resolve_types(final_foo);
CFCClass_add_child(foo, foo_jr);
CFCClass_add_child(foo_jr, final_foo);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCTestFile.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestFile.c b/compiler/src/CFCTestFile.c
index ad1cd5c..44e6f1c 100644
--- a/compiler/src/CFCTestFile.c
+++ b/compiler/src/CFCTestFile.c
@@ -97,11 +97,11 @@ S_run_tests(CFCTest *test) {
"classes() filters blocks");
CFCVariable **member_vars = CFCClass_member_vars(classes[0]);
CFCType *foo_type = CFCVariable_get_type(member_vars[0]);
- CFCType_resolve(foo_type, classes);
+ CFCType_resolve(foo_type);
STR_EQ(test, CFCType_get_specifier(foo_type), "stuff_Foo",
"file production picked up parcel def");
CFCType *bar_type = CFCVariable_get_type(member_vars[1]);
- CFCType_resolve(bar_type, classes);
+ CFCType_resolve(bar_type);
STR_EQ(test, CFCType_get_specifier(bar_type), "stuff_Bar",
"parcel def is sticky");
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCTestMethod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestMethod.c b/compiler/src/CFCTestMethod.c
index cde5d7e..39dd8d3 100644
--- a/compiler/src/CFCTestMethod.c
+++ b/compiler/src/CFCTestMethod.c
@@ -255,7 +255,6 @@ S_run_final_tests(CFCTest *test) {
= CFCTest_parse_class(test, parser, "class Obj {}");
CFCClass *foo_class
= CFCTest_parse_class(test, parser, "class Neato::Foo {}");
- CFCClass *class_list[3] = { obj_class, foo_class, NULL };
CFCType *return_type = CFCTest_parse_type(test, parser, "Obj*");
CFCParamList *param_list
= CFCTest_parse_param_list(test, parser, "(Foo *self)");
@@ -264,7 +263,7 @@ S_run_final_tests(CFCTest *test) {
= CFCMethod_new(neato_parcel, NULL, "Neato::Foo", "Foo",
"Return_An_Obj", return_type, param_list,
NULL, 0, 0);
- CFCMethod_resolve_types(not_final, class_list);
+ CFCMethod_resolve_types(not_final);
CFCMethod *final = CFCMethod_finalize(not_final);
OK(test, CFCMethod_compatible(not_final, final),
"finalize clones properly");
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCTestParamList.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParamList.c b/compiler/src/CFCTestParamList.c
index 29ff226..9dab0b8 100644
--- a/compiler/src/CFCTestParamList.c
+++ b/compiler/src/CFCTestParamList.c
@@ -38,12 +38,11 @@ S_run_tests(CFCTest *test) {
CFCParcel *neato_parcel
= CFCTest_parse_parcel(test, parser, "parcel Neato;");
CFCClass *obj_class = CFCTest_parse_class(test, parser, "class Obj {}");
- CFCClass *class_list[2] = { obj_class, NULL };
{
CFCParamList *param_list
= CFCTest_parse_param_list(test, parser, "(Obj *self, int num)");
- CFCParamList_resolve_types(param_list, class_list);
+ CFCParamList_resolve_types(param_list);
OK(test, !CFCParamList_variadic(param_list), "not variadic");
STR_EQ(test, CFCParamList_to_c(param_list), "neato_Obj* self, int num",
"to_c");
@@ -57,7 +56,7 @@ S_run_tests(CFCTest *test) {
CFCParamList *param_list
= CFCTest_parse_param_list(test, parser,
"(Obj *self=NULL, int num, ...)");
- CFCParamList_resolve_types(param_list, class_list);
+ CFCParamList_resolve_types(param_list);
OK(test, CFCParamList_variadic(param_list), "variadic");
STR_EQ(test, CFCParamList_to_c(param_list),
"neato_Obj* self, int num, ...", "to_c");
@@ -77,7 +76,7 @@ S_run_tests(CFCTest *test) {
{
CFCParamList *param_list
= CFCTest_parse_param_list(test, parser, "()");
- CFCParamList_resolve_types(param_list, class_list);
+ CFCParamList_resolve_types(param_list);
STR_EQ(test, CFCParamList_to_c(param_list), "void", "to_c");
INT_EQ(test, CFCParamList_num_vars(param_list), 0, "num_vars");
CFCVariable **variables = CFCParamList_get_variables(param_list);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCTestParser.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParser.c b/compiler/src/CFCTestParser.c
index 556a135..f377baa 100644
--- a/compiler/src/CFCTestParser.c
+++ b/compiler/src/CFCTestParser.c
@@ -127,7 +127,7 @@ S_run_tests(CFCTest *test) {
char *src = CFCUtil_sprintf("%s*", class_name);
char *expected = CFCUtil_sprintf("crust_%s", class_name);
CFCType *type = CFCTest_parse_type(test, parser, src);
- CFCType_resolve(type, class_list);
+ CFCType_resolve(type);
STR_EQ(test, CFCType_get_specifier(type), expected,
"object_type_specifier: %s", class_name);
FREEMEM(src);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCTestType.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestType.c b/compiler/src/CFCTestType.c
index f0ce2d6..693613f 100644
--- a/compiler/src/CFCTestType.c
+++ b/compiler/src/CFCTestType.c
@@ -290,7 +290,6 @@ S_run_object_tests(CFCTest *test) {
char *class_code = CFCUtil_sprintf("class %s {}", specifier);
CFCClass *klass = CFCTest_parse_class(test, parser, class_code);
- CFCClass *class_list[2] = { klass, NULL };
FREEMEM(class_code);
static const char *prefixes[2] = { "", "neato_" };
@@ -298,7 +297,7 @@ S_run_object_tests(CFCTest *test) {
for (int j = 0; j < 2; ++j) {
char *src = CFCUtil_sprintf("%s%s*", prefixes[j], specifier);
CFCType *type = CFCTest_parse_type(test, parser, src);
- CFCType_resolve(type, class_list);
+ CFCType_resolve(type);
STR_EQ(test, CFCType_get_specifier(type), expect,
"object_type_specifier: %s", src);
OK(test, CFCType_is_object(type), "%s is_object", src);
@@ -332,13 +331,12 @@ S_run_object_tests(CFCTest *test) {
CFCClass *foo_class
= CFCClass_create(neato_parcel, NULL, "Foo", NULL, NULL, NULL, NULL,
NULL, false, false);
- CFCClass *class_list[2] = { foo_class, NULL };
CFCType *foo = CFCType_new_object(0, neato_parcel, "Foo", 1);
- CFCType_resolve(foo, class_list);
+ CFCType_resolve(foo);
{
CFCType *another_foo = CFCType_new_object(0, neato_parcel, "Foo", 1);
- CFCType_resolve(another_foo, class_list);
+ CFCType_resolve(another_foo);
OK(test, CFCType_equals(foo, another_foo), "equals");
CFCBase_decref((CFCBase*)another_foo);
}
@@ -348,8 +346,7 @@ S_run_object_tests(CFCTest *test) {
= CFCClass_create(neato_parcel, NULL, "Bar", NULL, NULL, NULL,
NULL, NULL, false, false);
CFCType *bar = CFCType_new_object(0, neato_parcel, "Bar", 1);
- CFCClass *bar_class_list[2] = { bar_class, NULL };
- CFCType_resolve(bar, bar_class_list);
+ CFCType_resolve(bar);
OK(test, !CFCType_equals(foo, bar),
"different specifier spoils equals");
CFCBase_decref((CFCBase*)bar);
@@ -362,9 +359,8 @@ S_run_object_tests(CFCTest *test) {
CFCClass *foreign_foo_class
= CFCClass_create(foreign_parcel, NULL, "Foreign::Foo", NULL, NULL,
NULL, NULL, NULL, false, false);
- CFCClass *foreign_class_list[2] = { foreign_foo_class, NULL };
CFCType *foreign_foo = CFCType_new_object(0, foreign_parcel, "Foo", 1);
- CFCType_resolve(foreign_foo, foreign_class_list);
+ CFCType_resolve(foreign_foo);
OK(test, !CFCType_equals(foo, foreign_foo),
"different parcel spoils equals");
STR_EQ(test, CFCType_get_specifier(foreign_foo), "foreign_Foo",
@@ -378,7 +374,7 @@ S_run_object_tests(CFCTest *test) {
for (int i = 0; i < 4; ++i) {
CFCType *modified_foo
= CFCType_new_object(flags[i], neato_parcel, "Foo", 1);
- CFCType_resolve(modified_foo, class_list);
+ CFCType_resolve(modified_foo);
OK(test, accessors[i](modified_foo), "%s", modifiers[i]);
OK(test, !accessors[i](foo), "not %s", modifiers[i]);
OK(test, !CFCType_equals(foo, modified_foo),
@@ -518,9 +514,8 @@ S_run_composite_tests(CFCTest *test) {
}
{
- CFCClass *class_list[1] = { NULL };
CFCType *foo_array = CFCTest_parse_type(test, parser, "foo_t[]");
- CFCType_resolve(foo_array, class_list);
+ CFCType_resolve(foo_array);
STR_EQ(test, CFCType_get_array(foo_array), "[]", "get_array");
STR_EQ(test, CFCType_to_c(foo_array), "foo_t",
"array subscripts not included by to_c");
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCTestVariable.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestVariable.c b/compiler/src/CFCTestVariable.c
index e8096e7..022db0b 100644
--- a/compiler/src/CFCTestVariable.c
+++ b/compiler/src/CFCTestVariable.c
@@ -39,13 +39,12 @@ S_run_tests(CFCTest *test) {
CFCParcel *neato_parcel
= CFCTest_parse_parcel(test, parser, "parcel Neato;");
CFCClass *foo_class = CFCTest_parse_class(test, parser, "class Foo {}");
- CFCClass *class_list[2] = { foo_class, NULL };
{
CFCType *type = CFCTest_parse_type(test, parser, "float*");
CFCVariable *var
= CFCVariable_new(NULL, NULL, NULL, NULL, "foo", type, 0);
- CFCVariable_resolve_type(var, class_list);
+ CFCVariable_resolve_type(var);
STR_EQ(test, CFCVariable_local_c(var), "float* foo", "local_c");
STR_EQ(test, CFCVariable_local_declaration(var), "float* foo;",
"local_declaration");
@@ -59,7 +58,7 @@ S_run_tests(CFCTest *test) {
CFCType *type = CFCTest_parse_type(test, parser, "float[1]");
CFCVariable *var
= CFCVariable_new(NULL, NULL, NULL, NULL, "foo", type, 0);
- CFCVariable_resolve_type(var, class_list);
+ CFCVariable_resolve_type(var);
STR_EQ(test, CFCVariable_local_c(var), "float foo[1]",
"to_c appends array to var name rather than type specifier");
@@ -73,7 +72,7 @@ S_run_tests(CFCTest *test) {
= CFCVariable_new(neato_parcel, NULL,
"Crustacean::Lobster::LobsterClaw", "LobClaw",
"foo", type, 0);
- CFCVariable_resolve_type(var, class_list);
+ CFCVariable_resolve_type(var);
STR_EQ(test, CFCVariable_global_c(var), "neato_Foo* neato_LobClaw_foo",
"global_c");
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCType.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCType.c b/compiler/src/CFCType.c
index 974f33a..8a3d774 100644
--- a/compiler/src/CFCType.c
+++ b/compiler/src/CFCType.c
@@ -262,9 +262,9 @@ CFCType_new_arbitrary(CFCParcel *parcel, const char *specifier) {
}
void
-CFCType_resolve(CFCType *self, CFCClass **classes) {
+CFCType_resolve(CFCType *self) {
if (CFCType_is_composite(self)) {
- CFCType_resolve(self->child, classes);
+ CFCType_resolve(self->child);
return;
}
if (!CFCType_is_object(self)) {
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCType.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCType.h b/compiler/src/CFCType.h
index fbf18e7..53916c1 100644
--- a/compiler/src/CFCType.h
+++ b/compiler/src/CFCType.h
@@ -176,7 +176,7 @@ CFCType_new_arbitrary(struct CFCParcel *parcel, const char *specifier);
/** Find the actual class of an object variable without prefix.
*/
void
-CFCType_resolve(CFCType *self, struct CFCClass **classes);
+CFCType_resolve(CFCType *self);
void
CFCType_destroy(CFCType *self);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCVariable.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCVariable.c b/compiler/src/CFCVariable.c
index 4292e35..71e3473 100644
--- a/compiler/src/CFCVariable.c
+++ b/compiler/src/CFCVariable.c
@@ -85,8 +85,8 @@ CFCVariable_init(CFCVariable *self, struct CFCParcel *parcel,
}
void
-CFCVariable_resolve_type(CFCVariable *self, struct CFCClass **classes) {
- CFCType_resolve(self->type, classes);
+CFCVariable_resolve_type(CFCVariable *self) {
+ CFCType_resolve(self->type);
}
void
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/cd402eb4/compiler/src/CFCVariable.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCVariable.h b/compiler/src/CFCVariable.h
index 7263de7..c67d3c6 100644
--- a/compiler/src/CFCVariable.h
+++ b/compiler/src/CFCVariable.h
@@ -57,7 +57,7 @@ CFCVariable_init(CFCVariable *self, struct CFCParcel *parcel,
struct CFCType *type, int inert);
void
-CFCVariable_resolve_type(CFCVariable *self, struct CFCClass **classes);
+CFCVariable_resolve_type(CFCVariable *self);
void
CFCVariable_destroy(CFCVariable *self);
[lucy-commits] [09/10] git commit: Switch from implicit to explicit dependencies
Posted by nw...@apache.org.
Switch from implicit to explicit dependencies
Stop inferring the dependencies from the types used in a parcel. Use the
prerequisites from the parcel definition instead.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/0b2d24ed
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/0b2d24ed
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/0b2d24ed
Branch: refs/heads/explicit-dependencies-wip2
Commit: 0b2d24ede7c81cb8ce22a6a81624c22e09df38f1
Parents: 9abd6a8
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Wed Mar 12 17:01:08 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:30 2014 +0100
----------------------------------------------------------------------
compiler/perl/lib/Clownfish/CFC.xs | 11 +----
compiler/perl/t/403-parcel.t | 12 +----
compiler/src/CFCBindCore.c | 39 ++++++++--------
compiler/src/CFCClass.c | 8 ++++
compiler/src/CFCParcel.c | 80 +++++++++++++--------------------
compiler/src/CFCParcel.h | 24 +++++-----
compiler/src/CFCTestParcel.c | 14 +++++-
compiler/src/CFCType.c | 26 ++---------
8 files changed, 91 insertions(+), 123 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/perl/lib/Clownfish/CFC.xs
----------------------------------------------------------------------
diff --git a/compiler/perl/lib/Clownfish/CFC.xs b/compiler/perl/lib/Clownfish/CFC.xs
index 410658d..faa74f3 100644
--- a/compiler/perl/lib/Clownfish/CFC.xs
+++ b/compiler/perl/lib/Clownfish/CFC.xs
@@ -1148,13 +1148,6 @@ CODE:
OUTPUT: RETVAL
void
-add_dependent_parcel(self, dependent)
- CFCParcel *self;
- CFCParcel *dependent;
-PPCODE:
- CFCParcel_add_dependent_parcel(self, dependent);
-
-void
add_inherited_parcel(self, inherited)
CFCParcel *self;
CFCParcel *inherited;
@@ -1178,7 +1171,7 @@ ALIAS:
get_PREFIX = 10
get_version = 12
included = 14
- dependent_parcels = 16
+ prereq_parcels = 16
inherited_parcels = 18
PPCODE:
{
@@ -1217,7 +1210,7 @@ PPCODE:
retval = newSViv(CFCParcel_included(self));
break;
case 16: {
- CFCParcel **parcels = CFCParcel_dependent_parcels(self);
+ CFCParcel **parcels = CFCParcel_prereq_parcels(self);
retval = S_array_of_cfcbase_to_av((CFCBase**)parcels);
FREEMEM(parcels);
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/perl/t/403-parcel.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/403-parcel.t b/compiler/perl/t/403-parcel.t
index c311987..540e6ba 100644
--- a/compiler/perl/t/403-parcel.t
+++ b/compiler/perl/t/403-parcel.t
@@ -16,7 +16,7 @@
use strict;
use warnings;
-use Test::More tests => 18;
+use Test::More tests => 17;
use File::Spec::Functions qw( catfile );
BEGIN { use_ok('Clownfish::CFC::Model::Parcel') }
@@ -50,17 +50,7 @@ my $parcels = Clownfish::CFC::Model::Parcel->all_parcels;
my @names = sort(map { $_->get_name } @$parcels);
is_deeply( \@names, [ "Foo", "IncludedFoo" ], "all_parcels" );
-my $dependent_foo = Clownfish::CFC::Model::Parcel->new(
- name => "DependentFoo",
- is_included => 1,
-);
-$dependent_foo->register;
-
$foo->add_inherited_parcel($included_foo);
-$foo->add_dependent_parcel($dependent_foo);
-my @dep_names = sort(map { $_->get_name } @{ $foo->dependent_parcels });
-is_deeply( \@dep_names, [ "DependentFoo", "IncludedFoo" ],
- "dependent_parcels" );
my @inh_names = sort(map { $_->get_name } @{ $foo->inherited_parcels });
is_deeply( \@inh_names, [ "IncludedFoo" ], "inherited_parcels" );
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/src/CFCBindCore.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindCore.c b/compiler/src/CFCBindCore.c
index 5ae8ac6..e8d49e6 100644
--- a/compiler/src/CFCBindCore.c
+++ b/compiler/src/CFCBindCore.c
@@ -283,14 +283,15 @@ S_write_parcel_h(CFCBindCore *self, CFCParcel *parcel) {
extra_defs = "";
extra_includes = CFCUtil_strdup("");
- // Include parcel.h of dependent parcels.
- CFCParcel **dep_parcels = CFCParcel_dependent_parcels(parcel);
- for (size_t i = 0; dep_parcels[i]; ++i) {
- const char *dep_prefix = CFCParcel_get_prefix(dep_parcels[i]);
+ // Include parcel.h of prerequisite parcels.
+ CFCParcel **prereq_parcels = CFCParcel_prereq_parcels(parcel);
+ for (size_t i = 0; prereq_parcels[i]; ++i) {
+ const char *prereq_prefix
+ = CFCParcel_get_prefix(prereq_parcels[i]);
extra_includes = CFCUtil_cat(extra_includes, "#include <",
- dep_prefix, "parcel.h>\n", NULL);
+ prereq_prefix, "parcel.h>\n", NULL);
}
- FREEMEM(dep_parcels);
+ FREEMEM(prereq_parcels);
}
const char pattern[] =
@@ -392,18 +393,18 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
vt_specs = CFCUtil_cat(vt_specs, "\n};\n", NULL);
FREEMEM(ordered);
- // Bootstrapping code for dependent parcels.
+ // Bootstrapping code for prerequisite parcels.
//
// bootstrap_inheritance() first calls bootstrap_inheritance() for all
// parcels from which classes are inherited. Then the VTables of the parcel
// are initialized. It aborts on recursive invocation.
//
// bootstrap_parcel() first calls bootstrap_inheritance() of its own
- // parcel. Then it calls bootstrap_parcel() for all dependent parcels.
+ // parcel. Then it calls bootstrap_parcel() for all prerequisite parcels.
// Finally, it calls init_parcel(). Recursive invocation is allowed.
- char *inh_bootstrap = CFCUtil_strdup("");
- char *dep_bootstrap = CFCUtil_strdup("");
+ char *inh_bootstrap = CFCUtil_strdup("");
+ char *prereq_bootstrap = CFCUtil_strdup("");
CFCParcel **inh_parcels = CFCParcel_inherited_parcels(parcel);
for (size_t i = 0; inh_parcels[i]; ++i) {
const char *inh_prefix = CFCParcel_get_prefix(inh_parcels[i]);
@@ -411,13 +412,13 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
"bootstrap_inheritance();\n", NULL);
}
FREEMEM(inh_parcels);
- CFCParcel **dep_parcels = CFCParcel_dependent_parcels(parcel);
- for (size_t i = 0; dep_parcels[i]; ++i) {
- const char *dep_prefix = CFCParcel_get_prefix(dep_parcels[i]);
- dep_bootstrap = CFCUtil_cat(dep_bootstrap, " ", dep_prefix,
- "bootstrap_parcel();\n", NULL);
+ CFCParcel **prereq_parcels = CFCParcel_prereq_parcels(parcel);
+ for (size_t i = 0; prereq_parcels[i]; ++i) {
+ const char *prereq_prefix = CFCParcel_get_prefix(prereq_parcels[i]);
+ prereq_bootstrap = CFCUtil_cat(prereq_bootstrap, " ", prereq_prefix,
+ "bootstrap_parcel();\n", NULL);
}
- FREEMEM(dep_parcels);
+ FREEMEM(prereq_parcels);
char pattern[] =
"%s\n"
@@ -462,7 +463,7 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
" if (bootstrap_state >= 3) { return; }\n"
" %sbootstrap_inheritance();\n"
" bootstrap_state = 3;\n"
- "%s" // Finish bootstrapping of all dependent parcels.
+ "%s" // Finish bootstrapping of all prerequisite parcels.
" %sinit_parcel();\n"
"}\n"
"\n"
@@ -470,7 +471,7 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
char *file_content
= CFCUtil_sprintf(pattern, self->header, privacy_syms, prefix,
includes, c_data, vt_specs, prefix, inh_bootstrap,
- num_specs, prefix, prefix, dep_bootstrap, prefix,
+ num_specs, prefix, prefix, prereq_bootstrap, prefix,
self->footer);
// Unlink then open file.
@@ -486,7 +487,7 @@ S_write_parcel_c(CFCBindCore *self, CFCParcel *parcel) {
FREEMEM(c_data);
FREEMEM(vt_specs);
FREEMEM(inh_bootstrap);
- FREEMEM(dep_bootstrap);
+ FREEMEM(prereq_bootstrap);
FREEMEM(file_content);
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/src/CFCClass.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCClass.c b/compiler/src/CFCClass.c
index c2d5a2b..61a9d42 100644
--- a/compiler/src/CFCClass.c
+++ b/compiler/src/CFCClass.c
@@ -361,6 +361,14 @@ CFCClass_add_child(CFCClass *self, CFCClass *child) {
// Add parcel dependency.
CFCParcel *parcel = CFCClass_get_parcel(self);
CFCParcel *child_parcel = CFCClass_get_parcel(child);
+ if (!CFCParcel_has_prereq(child_parcel, parcel)) {
+ CFCUtil_die("Class '%s' inherits from '%s', but parcel '%s' is not a"
+ " prerequisite of '%s'",
+ CFCClass_get_class_name(child),
+ CFCClass_get_class_name(self),
+ CFCParcel_get_name(parcel),
+ CFCParcel_get_name(child_parcel));
+ }
CFCParcel_add_inherited_parcel(child_parcel, parcel);
}
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/src/CFCParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c
index b54e014..e53ff01 100644
--- a/compiler/src/CFCParcel.c
+++ b/compiler/src/CFCParcel.c
@@ -40,8 +40,6 @@ struct CFCParcel {
char *privacy_sym;
int is_included;
int is_required;
- char **dependent_parcels;
- size_t num_dependent_parcels;
char **inherited_parcels;
size_t num_inherited_parcels;
CFCPrereq **prereqs;
@@ -252,13 +250,9 @@ CFCParcel_init(CFCParcel *self, const char *name, const char *cnick,
self->is_included = is_included;
self->is_required = false;
- // Initialize dependencies.
- self->dependent_parcels = (char**)CALLOCATE(1, sizeof(char*));
- self->num_dependent_parcels = 0;
+ // Initialize arrays.
self->inherited_parcels = (char**)CALLOCATE(1, sizeof(char*));
self->num_inherited_parcels = 0;
-
- // Initialize prereqs.
self->prereqs = (CFCPrereq**)CALLOCATE(1, sizeof(CFCPrereq*));
self->num_prereqs = 0;
@@ -389,10 +383,6 @@ CFCParcel_destroy(CFCParcel *self) {
FREEMEM(self->Prefix);
FREEMEM(self->PREFIX);
FREEMEM(self->privacy_sym);
- for (size_t i = 0; self->dependent_parcels[i]; ++i) {
- FREEMEM(self->dependent_parcels[i]);
- }
- FREEMEM(self->dependent_parcels);
for (size_t i = 0; self->inherited_parcels[i]; ++i) {
FREEMEM(self->inherited_parcels[i]);
}
@@ -469,27 +459,6 @@ CFCParcel_required(CFCParcel *self) {
}
void
-CFCParcel_add_dependent_parcel(CFCParcel *self, CFCParcel *dependent) {
- const char *name = CFCParcel_get_name(self);
- const char *dep_name = CFCParcel_get_name(dependent);
-
- if (strcmp(name, dep_name) == 0) { return; }
-
- for (size_t i = 0; self->dependent_parcels[i]; ++i) {
- const char *other_name = self->dependent_parcels[i];
- if (strcmp(other_name, dep_name) == 0) { return; }
- }
-
- size_t num_parcels = self->num_dependent_parcels;
- self->dependent_parcels
- = (char**)REALLOCATE(self->dependent_parcels,
- (num_parcels + 2) * sizeof(char*));
- self->dependent_parcels[num_parcels] = CFCUtil_strdup(dep_name);
- self->dependent_parcels[num_parcels+1] = NULL;
- self->num_dependent_parcels = num_parcels + 1;
-}
-
-void
CFCParcel_add_inherited_parcel(CFCParcel *self, CFCParcel *inherited) {
const char *name = CFCParcel_get_name(self);
const char *inh_name = CFCParcel_get_name(inherited);
@@ -508,22 +477,6 @@ CFCParcel_add_inherited_parcel(CFCParcel *self, CFCParcel *inherited) {
self->inherited_parcels[num_parcels] = CFCUtil_strdup(inh_name);
self->inherited_parcels[num_parcels+1] = NULL;
self->num_inherited_parcels = num_parcels + 1;
-
- // Add to dependent parcels.
- CFCParcel_add_dependent_parcel(self, inherited);
-}
-
-CFCParcel**
-CFCParcel_dependent_parcels(CFCParcel *self) {
- CFCParcel **parcels
- = (CFCParcel**)CALLOCATE(self->num_dependent_parcels + 1,
- sizeof(CFCParcel*));
-
- for (size_t i = 0; self->dependent_parcels[i]; ++i) {
- parcels[i] = CFCParcel_fetch(self->dependent_parcels[i]);
- }
-
- return parcels;
}
CFCParcel**
@@ -544,6 +497,19 @@ CFCParcel_get_prereqs(CFCParcel *self) {
return self->prereqs;
}
+CFCParcel**
+CFCParcel_prereq_parcels(CFCParcel *self) {
+ CFCParcel **parcels
+ = (CFCParcel**)CALLOCATE(self->num_prereqs + 1, sizeof(CFCParcel*));
+
+ for (size_t i = 0; self->prereqs[i]; ++i) {
+ const char *name = CFCPrereq_get_name(self->prereqs[i]);
+ parcels[i] = CFCParcel_fetch(name);
+ }
+
+ return parcels;
+}
+
void
CFCParcel_check_prereqs(CFCParcel *self) {
// This is essentially a depth-first search of the dependency graph.
@@ -578,6 +544,24 @@ CFCParcel_check_prereqs(CFCParcel *self) {
}
}
+int
+CFCParcel_has_prereq(CFCParcel *self, CFCParcel *parcel) {
+ const char *name = CFCParcel_get_name(parcel);
+
+ if (strcmp(CFCParcel_get_name(self), name) == 0) {
+ return true;
+ }
+
+ for (int i = 0; self->prereqs[i]; ++i) {
+ const char *prereq_name = CFCPrereq_get_name(self->prereqs[i]);
+ if (strcmp(prereq_name, name) == 0) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
/**************************************************************************/
struct CFCPrereq {
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/src/CFCParcel.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.h b/compiler/src/CFCParcel.h
index 77e8d1b..4efbdd9 100644
--- a/compiler/src/CFCParcel.h
+++ b/compiler/src/CFCParcel.h
@@ -127,23 +127,12 @@ CFCParcel_included(CFCParcel *self);
int
CFCParcel_required(CFCParcel *self);
-/** Add another Parcel that the Parcel depends on.
- */
-void
-CFCParcel_add_dependent_parcel(CFCParcel *self, CFCParcel *dependent);
-
/** Add another Parcel containing superclasses that subclasses in the Parcel
- * extend. Also adds the other Parcel to the Parcel's dependencies.
+ * extend.
*/
void
CFCParcel_add_inherited_parcel(CFCParcel *self, CFCParcel *inherited);
-/** Return a NULL-terminated array of all Parcels that the Parcel depends on.
- * Must be freed by the caller.
- */
-CFCParcel**
-CFCParcel_dependent_parcels(CFCParcel *self);
-
/** Return a NULL-terminated array of all Parcels containing superclasses that
* subclasses in the Parcel extend. Must be freed by the caller.
*/
@@ -155,12 +144,23 @@ CFCParcel_inherited_parcels(CFCParcel *self);
CFCPrereq**
CFCParcel_get_prereqs(CFCParcel *self);
+/** Return a NULL-terminated array of all prerequisite Parcels. Must be freed
+ * by the caller.
+ */
+CFCParcel**
+CFCParcel_prereq_parcels(CFCParcel *self);
+
/** Recursively verify that all prerequisite parcels are present in the
* required version. Mark all needed parcels including 'self' as required.
*/
void
CFCParcel_check_prereqs(CFCParcel *self);
+/** Return true if parcel equals self or is a direct prerequisite of self.
+ */
+int
+CFCParcel_has_prereq(CFCParcel *self, CFCParcel *parcel);
+
/**************************************************************************/
CFCPrereq*
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/src/CFCTestParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParcel.c b/compiler/src/CFCTestParcel.c
index 2abd7c0..c8fb528 100644
--- a/compiler/src/CFCTestParcel.c
+++ b/compiler/src/CFCTestParcel.c
@@ -20,6 +20,7 @@
#include "CFCBase.h"
#include "CFCParcel.h"
#include "CFCSymbol.h"
+#include "CFCUtil.h"
#include "CFCVersion.h"
#include "CFCTest.h"
@@ -39,7 +40,7 @@ S_run_parcel_tests(CFCTest *test);
const CFCTestBatch CFCTEST_BATCH_PARCEL = {
"Clownfish::CFC::Model::Parcel",
- 26,
+ 32,
S_run_tests
};
@@ -204,6 +205,17 @@ S_run_parcel_tests(CFCTest *test) {
INT_EQ(test, CFCParcel_required(cfish), true, "prereq required");
INT_EQ(test, CFCParcel_required(crust), true, "self required");
+ CFCParcel **prereq_parcels = CFCParcel_prereq_parcels(crust);
+ OK(test, prereq_parcels[0] != NULL, "prereq_parcels[0]");
+ const char *name = CFCParcel_get_name(prereq_parcels[0]);
+ STR_EQ(test, name, "Clownfish", "prereq_parcels[0] name");
+ OK(test, prereq_parcels[1] == NULL, "prereq_parcels[0]");
+
+ OK(test, CFCParcel_has_prereq(crust, cfish), "has_prereq");
+ OK(test, CFCParcel_has_prereq(crust, crust), "has_prereq self");
+ OK(test, !CFCParcel_has_prereq(crust, foo), "has_prereq false");
+
+ FREEMEM(prereq_parcels);
CFCBase_decref((CFCBase*)crust);
CFCBase_decref((CFCBase*)cfish_version);
CFCBase_decref((CFCBase*)cfish);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/0b2d24ed/compiler/src/CFCType.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCType.c b/compiler/src/CFCType.c
index a41ecbd..3ff7db7 100644
--- a/compiler/src/CFCType.c
+++ b/compiler/src/CFCType.c
@@ -271,11 +271,10 @@ CFCType_resolve(CFCType *self, CFCClass **classes) {
return;
}
- CFCClass *klass = NULL;
- char *specifier = self->specifier;
-
- if (isupper(self->specifier[0])) {
+ char *specifier = self->specifier;
+ if (isupper(specifier[0])) {
// Try to find class from class list.
+ CFCClass *klass = NULL;
for (size_t i = 0; classes[i]; ++i) {
CFCClass *maybe_class = classes[i];
const char *struct_sym = CFCClass_get_struct_sym(maybe_class);
@@ -297,25 +296,6 @@ CFCType_resolve(CFCType *self, CFCClass **classes) {
self->specifier = CFCUtil_sprintf("%s%s", prefix, specifier);
FREEMEM(specifier);
}
- else {
- // Try to find class from class list.
- for (size_t i = 0; classes[i]; ++i) {
- CFCClass *maybe_class = classes[i];
- const char *full_struct_sym
- = CFCClass_full_struct_sym(maybe_class);
-
- if (strcmp(specifier, full_struct_sym) == 0) {
- klass = maybe_class;
- break;
- }
- }
- }
-
- // Add parcel dependency.
- if (klass) {
- CFCParcel *class_parcel = CFCClass_get_parcel(klass);
- CFCParcel_add_dependent_parcel(self->parcel, class_parcel);
- }
}
void
[lucy-commits] [02/10] git commit: Add field 'prerequisites' to .cfp parcel
definition
Posted by nw...@apache.org.
Add field 'prerequisites' to .cfp parcel definition
The value is a hash where the keys are parcel names and the values are
version strings:
"prereqs": {
"ParcelA": "v1.2.1",
"ParcelB": "v4.0.3"
}
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/98f6b71a
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/98f6b71a
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/98f6b71a
Branch: refs/heads/explicit-dependencies-wip2
Commit: 98f6b71a01eb37b66d75901e4bb9a3cbb090a3af
Parents: daab988
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Tue Mar 11 18:25:44 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:29 2014 +0100
----------------------------------------------------------------------
compiler/src/CFCParcel.c | 119 ++++++++++++++++++++++++++++++++++++++
compiler/src/CFCParcel.h | 23 ++++++++
compiler/src/CFCTestParcel.c | 79 ++++++++++++++++++++++++-
3 files changed, 220 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/98f6b71a/compiler/src/CFCParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.c b/compiler/src/CFCParcel.c
index 2b3bead..cfad49a 100644
--- a/compiler/src/CFCParcel.c
+++ b/compiler/src/CFCParcel.c
@@ -43,6 +43,8 @@ struct CFCParcel {
size_t num_dependent_parcels;
char **inherited_parcels;
size_t num_inherited_parcels;
+ CFCPrereq **prereqs;
+ size_t num_prereqs;
};
static CFCParcel *default_parcel = NULL;
@@ -58,6 +60,9 @@ typedef struct JSONNode {
size_t num_kids;
} JSONNode;
+static void
+S_set_prereqs(CFCParcel *self, JSONNode *node, const char *path);
+
static JSONNode*
S_parse_json_for_parcel(const char *json);
@@ -251,6 +256,10 @@ CFCParcel_init(CFCParcel *self, const char *name, const char *cnick,
self->inherited_parcels = (char**)CALLOCATE(1, sizeof(char*));
self->num_inherited_parcels = 0;
+ // Initialize prereqs.
+ self->prereqs = (CFCPrereq**)CALLOCATE(1, sizeof(CFCPrereq*));
+ self->num_prereqs = 0;
+
return self;
}
@@ -266,6 +275,7 @@ S_new_from_json(const char *json, const char *path, int is_included) {
const char *name = NULL;
const char *nickname = NULL;
CFCVersion *version = NULL;
+ JSONNode *prereqs = NULL;
for (size_t i = 0, max = parsed->num_kids; i < max; i += 2) {
JSONNode *key = parsed->kids[i];
JSONNode *value = parsed->kids[i + 1];
@@ -292,6 +302,13 @@ S_new_from_json(const char *json, const char *path, int is_included) {
}
version = CFCVersion_new(value->string);
}
+ else if (strcmp(key->string, "prerequisites") == 0) {
+ if (value->type != JSON_HASH) {
+ CFCUtil_die("'prerequisites' must be a hash (filepath %s)",
+ path);
+ }
+ prereqs = value;
+ }
else {
CFCUtil_die("Unrecognized key: '%s' (filepath '%s')",
key->string, path);
@@ -304,12 +321,49 @@ S_new_from_json(const char *json, const char *path, int is_included) {
CFCUtil_die("Missing required key 'version' (filepath '%s')", path);
}
CFCParcel *self = CFCParcel_new(name, nickname, version, is_included);
+ if (prereqs) {
+ S_set_prereqs(self, prereqs, path);
+ }
CFCBase_decref((CFCBase*)version);
S_destroy_json(parsed);
return self;
}
+static void
+S_set_prereqs(CFCParcel *self, JSONNode *node, const char *path) {
+ size_t num_prereqs = node->num_kids / 2;
+ CFCPrereq **prereqs
+ = (CFCPrereq**)MALLOCATE((num_prereqs + 1) * sizeof(CFCPrereq*));
+
+ for (size_t i = 0; i < num_prereqs; ++i) {
+ JSONNode *key = node->kids[2*i];
+ if (key->type != JSON_STRING) {
+ CFCUtil_die("Prereq key must be a string (filepath '%s')", path);
+ }
+ const char *name = key->string;
+
+ JSONNode *value = node->kids[2*i+1];
+ CFCVersion *version = NULL;
+ if (value->type == JSON_STRING) {
+ version = CFCVersion_new(value->string);
+ }
+ else if (value->type != JSON_NULL) {
+ CFCUtil_die("Invalid prereq value (filepath '%s')", path);
+ }
+
+ prereqs[i] = CFCPrereq_new(name, version);
+
+ CFCBase_decref((CFCBase*)version);
+ }
+ prereqs[num_prereqs] = NULL;
+
+ // Assume that prereqs are empty.
+ FREEMEM(self->prereqs);
+ self->prereqs = prereqs;
+ self->num_prereqs = num_prereqs;
+}
+
CFCParcel*
CFCParcel_new_from_json(const char *json, int is_included) {
return S_new_from_json(json, "[NULL]", is_included);
@@ -341,6 +395,10 @@ CFCParcel_destroy(CFCParcel *self) {
FREEMEM(self->inherited_parcels[i]);
}
FREEMEM(self->inherited_parcels);
+ for (size_t i = 0; self->prereqs[i]; ++i) {
+ CFCBase_decref((CFCBase*)self->prereqs[i]);
+ }
+ FREEMEM(self->prereqs);
CFCBase_destroy((CFCBase*)self);
}
@@ -474,6 +532,67 @@ CFCParcel_inherited_parcels(CFCParcel *self) {
return parcels;
}
+CFCPrereq**
+CFCParcel_get_prereqs(CFCParcel *self) {
+ return self->prereqs;
+}
+
+/**************************************************************************/
+
+struct CFCPrereq {
+ CFCBase base;
+ char *name;
+ CFCVersion *version;
+};
+
+static const CFCMeta CFCPREREQ_META = {
+ "Clownfish::CFC::Model::Prereq",
+ sizeof(CFCPrereq),
+ (CFCBase_destroy_t)CFCPrereq_destroy
+};
+
+CFCPrereq*
+CFCPrereq_new(const char *name, CFCVersion *version) {
+ CFCPrereq *self = (CFCPrereq*)CFCBase_allocate(&CFCPREREQ_META);
+ return CFCPrereq_init(self, name, version);
+}
+
+CFCPrereq*
+CFCPrereq_init(CFCPrereq *self, const char *name, CFCVersion *version) {
+ // Validate name.
+ if (!name || !S_validate_name_or_cnick(name)) {
+ CFCUtil_die("Invalid name: '%s'", name ? name : "[NULL]");
+ }
+ self->name = CFCUtil_strdup(name);
+
+ // Default to version v0.
+ if (version) {
+ self->version = (CFCVersion*)CFCBase_incref((CFCBase*)version);
+ }
+ else {
+ self->version = CFCVersion_new("v0");
+ }
+
+ return self;
+}
+
+void
+CFCPrereq_destroy(CFCPrereq *self) {
+ FREEMEM(self->name);
+ CFCBase_decref((CFCBase*)self->version);
+ CFCBase_destroy((CFCBase*)self);
+}
+
+const char*
+CFCPrereq_get_name(CFCPrereq *self) {
+ return self->name;
+}
+
+CFCVersion*
+CFCPrereq_get_version(CFCPrereq *self) {
+ return self->version;
+}
+
/*****************************************************************************
* The hack JSON parser coded up below is only meant to parse Clownfish parcel
* file content. It is limited in its capabilities because so little is legal
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/98f6b71a/compiler/src/CFCParcel.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCParcel.h b/compiler/src/CFCParcel.h
index d5cdb5f..ad31c86 100644
--- a/compiler/src/CFCParcel.h
+++ b/compiler/src/CFCParcel.h
@@ -37,6 +37,7 @@ extern "C" {
#endif
typedef struct CFCParcel CFCParcel;
+typedef struct CFCPrereq CFCPrereq;
struct CFCVersion;
/** Return the parcel which has been registered for <code>name</code>.
@@ -143,6 +144,28 @@ CFCParcel_dependent_parcels(CFCParcel *self);
CFCParcel**
CFCParcel_inherited_parcels(CFCParcel *self);
+/** Return a NULL-terminated array of all prerequisites.
+ */
+CFCPrereq**
+CFCParcel_get_prereqs(CFCParcel *self);
+
+/**************************************************************************/
+
+CFCPrereq*
+CFCPrereq_new(const char *name, struct CFCVersion *version);
+
+CFCPrereq*
+CFCPrereq_init(CFCPrereq *self, const char *name, struct CFCVersion *version);
+
+void
+CFCPrereq_destroy(CFCPrereq *self);
+
+const char*
+CFCPrereq_get_name(CFCPrereq *self);
+
+struct CFCVersion*
+CFCPrereq_get_version(CFCPrereq *self);
+
#ifdef __cplusplus
}
#endif
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/98f6b71a/compiler/src/CFCTestParcel.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestParcel.c b/compiler/src/CFCTestParcel.c
index d91a271..5d3e5d9 100644
--- a/compiler/src/CFCTestParcel.c
+++ b/compiler/src/CFCTestParcel.c
@@ -31,14 +31,51 @@
static void
S_run_tests(CFCTest *test);
+static void
+S_run_prereq_tests(CFCTest *test);
+
+static void
+S_run_parcel_tests(CFCTest *test);
+
const CFCTestBatch CFCTEST_BATCH_PARCEL = {
"Clownfish::CFC::Model::Parcel",
- 12,
+ 23,
S_run_tests
};
static void
S_run_tests(CFCTest *test) {
+ S_run_prereq_tests(test);
+ S_run_parcel_tests(test);
+}
+
+static void
+S_run_prereq_tests(CFCTest *test) {
+ {
+ CFCVersion *v77_66_55 = CFCVersion_new("v77.66.55");
+ CFCPrereq *prereq = CFCPrereq_new("Flour", v77_66_55);
+ const char *name = CFCPrereq_get_name(prereq);
+ STR_EQ(test, name, "Flour", "prereq get_name");
+ CFCVersion *version = CFCPrereq_get_version(prereq);
+ INT_EQ(test, CFCVersion_compare_to(version, v77_66_55), 0,
+ "prereq get_version");
+ CFCBase_decref((CFCBase*)prereq);
+ CFCBase_decref((CFCBase*)v77_66_55);
+ }
+
+ {
+ CFCVersion *v0 = CFCVersion_new("v0");
+ CFCPrereq *prereq = CFCPrereq_new("Sugar", NULL);
+ CFCVersion *version = CFCPrereq_get_version(prereq);
+ INT_EQ(test, CFCVersion_compare_to(version, v0), 0,
+ "prereq with default version");
+ CFCBase_decref((CFCBase*)prereq);
+ CFCBase_decref((CFCBase*)v0);
+ }
+}
+
+static void
+S_run_parcel_tests(CFCTest *test) {
{
CFCParcel *parcel = CFCParcel_new("Foo", NULL, NULL, false);
OK(test, parcel != NULL, "new");
@@ -101,6 +138,46 @@ S_run_tests(CFCTest *test) {
CFCBase_decref((CFCBase*)parcel);
}
+ {
+ const char *json =
+ " {\n"
+ " \"name\": \"Crustacean\",\n"
+ " \"version\": \"v0.1.0\",\n"
+ " \"prerequisites\": {\n"
+ " \"Clownfish\": null,\n"
+ " \"Arthropod\": \"v30.104.5\"\n"
+ " }\n"
+ " }\n";
+ CFCParcel *parcel = CFCParcel_new_from_json(json, false);
+
+ CFCPrereq **prereqs = CFCParcel_get_prereqs(parcel);
+ OK(test, prereqs != NULL, "prereqs");
+
+ CFCPrereq *cfish = prereqs[0];
+ OK(test, cfish != NULL, "prereqs[0]");
+ const char *cfish_name = CFCPrereq_get_name(cfish);
+ STR_EQ(test, cfish_name, "Clownfish", "prereqs[0] name");
+ CFCVersion *v0 = CFCVersion_new("v0");
+ CFCVersion *cfish_version = CFCPrereq_get_version(cfish);
+ INT_EQ(test, CFCVersion_compare_to(cfish_version, v0), 0,
+ "prereqs[0] version");
+
+ CFCPrereq *apod = prereqs[1];
+ OK(test, apod != NULL, "prereqs[1]");
+ const char *apod_name = CFCPrereq_get_name(apod);
+ STR_EQ(test, apod_name, "Arthropod", "prereqs[1] name");
+ CFCVersion *v30_104_5 = CFCVersion_new("v30.104.5");
+ CFCVersion *apod_version = CFCPrereq_get_version(apod);
+ INT_EQ(test, CFCVersion_compare_to(apod_version, v30_104_5), 0,
+ "prereqs[1] version");
+
+ OK(test, prereqs[2] == NULL, "prereqs[2]");
+
+ CFCBase_decref((CFCBase*)v30_104_5);
+ CFCBase_decref((CFCBase*)v0);
+ CFCBase_decref((CFCBase*)parcel);
+ }
+
CFCParcel_reap_singletons();
}
[lucy-commits] [10/10] git commit: Fix CFC type tests
Posted by nw...@apache.org.
Fix CFC type tests
Make sure to resolve types before running the equality tests. Otherwise
they pass for the wrong reason. Also set the parcel for some types to
prepare for upcoming changes to type resolution.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/170f5f90
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/170f5f90
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/170f5f90
Branch: refs/heads/explicit-dependencies-wip2
Commit: 170f5f907636eeb38fc332933ebf3d157014a973
Parents: 0b2d24e
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Mon Mar 17 16:43:20 2014 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Mar 17 18:25:30 2014 +0100
----------------------------------------------------------------------
compiler/perl/t/105-object_type.t | 31 ++++++++++++++++++++++++++-----
compiler/src/CFCTestType.c | 15 +++++++++++----
2 files changed, 37 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/170f5f90/compiler/perl/t/105-object_type.t
----------------------------------------------------------------------
diff --git a/compiler/perl/t/105-object_type.t b/compiler/perl/t/105-object_type.t
index 6bf4c65..a9ac3fc 100644
--- a/compiler/perl/t/105-object_type.t
+++ b/compiler/perl/t/105-object_type.t
@@ -69,6 +69,7 @@ like( $@, qr/specifier/i, "specifier required" );
for ( 0, 2 ) {
eval {
my $type = Clownfish::CFC::Model::Type->new_object(
+ parcel => 'Neato',
specifier => 'Foo',
indirection => $_,
);
@@ -76,12 +77,27 @@ for ( 0, 2 ) {
like( $@, qr/indirection/i, "invalid indirection of $_" );
}
-my $foo_type = Clownfish::CFC::Model::Type->new_object( specifier => 'Foo' );
-my $another_foo
- = Clownfish::CFC::Model::Type->new_object( specifier => 'Foo' );
+my $foo_type = Clownfish::CFC::Model::Type->new_object(
+ parcel => 'Neato',
+ specifier => 'Foo',
+);
+$foo_type->resolve(\@classes);
+my $another_foo = Clownfish::CFC::Model::Type->new_object(
+ parcel => 'Neato',
+ specifier => 'Foo',
+);
+$another_foo->resolve(\@classes);
ok( $foo_type->equals($another_foo), "equals" );
-my $bar_type = Clownfish::CFC::Model::Type->new_object( specifier => 'Bar' );
+my $bar_class = Clownfish::CFC::Model::Class->create(
+ parcel => 'Neato',
+ class_name => 'Bar',
+);
+my $bar_type = Clownfish::CFC::Model::Type->new_object(
+ parcel => 'Neato',
+ specifier => 'Bar',
+);
+$bar_type->resolve([ $bar_class ]);
ok( !$foo_type->equals($bar_type), "different specifier spoils equals" );
my $foreign_foo_class = Clownfish::CFC::Model::Class->create(
@@ -89,8 +105,8 @@ my $foreign_foo_class = Clownfish::CFC::Model::Class->create(
class_name => 'Foreign::Foo',
);
my $foreign_foo = Clownfish::CFC::Model::Type->new_object(
- specifier => 'Foo',
parcel => 'Foreign',
+ specifier => 'Foo',
);
$foreign_foo->resolve([ $foreign_foo_class ]);
ok( !$foo_type->equals($foreign_foo), "different parcel spoils equals" );
@@ -98,9 +114,11 @@ is( $foreign_foo->get_specifier, "foreign_Foo",
"prepend parcel prefix to specifier" );
my $incremented_foo = Clownfish::CFC::Model::Type->new_object(
+ parcel => 'Neato',
specifier => 'Foo',
incremented => 1,
);
+$incremented_foo->resolve(\@classes);
ok( $incremented_foo->incremented, "incremented" );
ok( !$foo_type->incremented, "not incremented" );
ok( !$foo_type->equals($incremented_foo),
@@ -108,9 +126,11 @@ ok( !$foo_type->equals($incremented_foo),
);
my $decremented_foo = Clownfish::CFC::Model::Type->new_object(
+ parcel => 'Neato',
specifier => 'Foo',
decremented => 1,
);
+$decremented_foo->resolve(\@classes);
ok( $decremented_foo->decremented, "decremented" );
ok( !$foo_type->decremented, "not decremented" );
ok( !$foo_type->equals($decremented_foo),
@@ -118,6 +138,7 @@ ok( !$foo_type->equals($decremented_foo),
);
my $const_foo = Clownfish::CFC::Model::Type->new_object(
+ parcel => 'Neato',
specifier => 'Foo',
const => 1,
);
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/170f5f90/compiler/src/CFCTestType.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestType.c b/compiler/src/CFCTestType.c
index f452767..f0ce2d6 100644
--- a/compiler/src/CFCTestType.c
+++ b/compiler/src/CFCTestType.c
@@ -333,21 +333,27 @@ S_run_object_tests(CFCTest *test) {
= CFCClass_create(neato_parcel, NULL, "Foo", NULL, NULL, NULL, NULL,
NULL, false, false);
CFCClass *class_list[2] = { foo_class, NULL };
- CFCType *foo = CFCType_new_object(0, NULL, "Foo", 1);
+ CFCType *foo = CFCType_new_object(0, neato_parcel, "Foo", 1);
CFCType_resolve(foo, class_list);
{
- CFCType *another_foo = CFCType_new_object(0, NULL, "Foo", 1);
+ CFCType *another_foo = CFCType_new_object(0, neato_parcel, "Foo", 1);
CFCType_resolve(another_foo, class_list);
OK(test, CFCType_equals(foo, another_foo), "equals");
CFCBase_decref((CFCBase*)another_foo);
}
{
- CFCType *bar = CFCType_new_object(0, NULL, "Bar", 1);
+ CFCClass *bar_class
+ = CFCClass_create(neato_parcel, NULL, "Bar", NULL, NULL, NULL,
+ NULL, NULL, false, false);
+ CFCType *bar = CFCType_new_object(0, neato_parcel, "Bar", 1);
+ CFCClass *bar_class_list[2] = { bar_class, NULL };
+ CFCType_resolve(bar, bar_class_list);
OK(test, !CFCType_equals(foo, bar),
"different specifier spoils equals");
CFCBase_decref((CFCBase*)bar);
+ CFCBase_decref((CFCBase*)bar_class);
}
{
@@ -371,7 +377,8 @@ S_run_object_tests(CFCTest *test) {
{
for (int i = 0; i < 4; ++i) {
CFCType *modified_foo
- = CFCType_new_object(flags[i], NULL, "Foo", 1);
+ = CFCType_new_object(flags[i], neato_parcel, "Foo", 1);
+ CFCType_resolve(modified_foo, class_list);
OK(test, accessors[i](modified_foo), "%s", modifiers[i]);
OK(test, !accessors[i](foo), "not %s", modifiers[i]);
OK(test, !CFCType_equals(foo, modified_foo),