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 2015/07/27 18:35:30 UTC
[2/4] lucy-clownfish git commit: Don't use cross-DLL pointers in
global initialization
Don't use cross-DLL pointers in global initialization
Initialize global pointers to objects from other DLLs manually at runtime.
Fixes build of Clownfish projects with MSVC in C mode.
Fixes CLOWNFISH-53.
Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/05068aab
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/05068aab
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/05068aab
Branch: refs/heads/master
Commit: 05068aabc4425d91f62de6f0205e6a892c954ac0
Parents: 2b3ed29
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Fri Jul 24 13:32:39 2015 +0200
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Mon Jul 27 18:26:18 2015 +0200
----------------------------------------------------------------------
compiler/src/CFCBindSpecs.c | 82 ++++++++++++++++++++++++++++++++--------
1 file changed, 66 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/05068aab/compiler/src/CFCBindSpecs.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCBindSpecs.c b/compiler/src/CFCBindSpecs.c
index 513806b..ff64eca 100644
--- a/compiler/src/CFCBindSpecs.c
+++ b/compiler/src/CFCBindSpecs.c
@@ -32,6 +32,7 @@ struct CFCBindSpecs {
char *overridden_specs;
char *inherited_specs;
char *class_specs;
+ char *init_code;
int num_novel;
int num_overridden;
@@ -43,16 +44,20 @@ static char*
S_ivars_size(CFCClass *klass);
static char*
-S_novel_meth(CFCMethod *method, CFCClass *klass);
+S_novel_meth(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ int meth_index);
static char*
-S_parent_offset(CFCMethod *method, CFCClass *klass);
+S_parent_offset(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ const char *meth_type, int meth_index);
static char*
-S_overridden_meth(CFCMethod *method, CFCClass *klass);
+S_overridden_meth(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ int meth_index);
static char*
-S_inherited_meth(CFCMethod *method, CFCClass *klass);
+S_inherited_meth(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ int meth_index);
static const CFCMeta CFCBINDSPECS_META = {
"Clownfish::CFC::Binding::Core::Specs",
@@ -72,6 +77,7 @@ CFCBindSpecs_init(CFCBindSpecs *self) {
self->overridden_specs = CFCUtil_strdup("");
self->inherited_specs = CFCUtil_strdup("");
self->class_specs = CFCUtil_strdup("");
+ self->init_code = CFCUtil_strdup("");
return self;
}
@@ -82,6 +88,7 @@ CFCBindSpecs_destroy(CFCBindSpecs *self) {
FREEMEM(self->overridden_specs);
FREEMEM(self->inherited_specs);
FREEMEM(self->class_specs);
+ FREEMEM(self->init_code);
CFCBase_destroy((CFCBase*)self);
}
@@ -141,7 +148,23 @@ CFCBindSpecs_add_class(CFCBindSpecs *self, CFCClass *klass) {
parent_ptr = CFCUtil_strdup("NULL");
}
else {
- parent_ptr = CFCUtil_sprintf("&%s", CFCClass_full_class_var(parent));
+ if (CFCClass_get_parcel(klass) == CFCClass_get_parcel(parent)) {
+ parent_ptr
+ = CFCUtil_sprintf("&%s", CFCClass_full_class_var(parent));
+ }
+ else {
+ parent_ptr = CFCUtil_strdup("NULL");
+
+ const char *class_name = CFCClass_get_name(klass);
+ const char *parent_var = CFCClass_full_class_var(parent);
+ const char *pattern =
+ " /* %s */\n"
+ " class_specs[%d].parent = &%s;\n";
+ char *init_code = CFCUtil_sprintf(pattern, class_name,
+ self->num_specs, parent_var);
+ self->init_code = CFCUtil_cat(self->init_code, init_code, NULL);
+ FREEMEM(init_code);
+ }
}
char *novel_specs = CFCUtil_strdup("");
@@ -158,14 +181,15 @@ CFCBindSpecs_add_class(CFCBindSpecs *self, CFCClass *klass) {
if (CFCMethod_is_fresh(method, klass)) {
if (CFCMethod_novel(method)) {
const char *sep = num_new_novel == 0 ? "" : ",\n";
- char *def = S_novel_meth(method, klass);
+ char *def = S_novel_meth(self, method, klass, num_new_novel);
novel_specs = CFCUtil_cat(novel_specs, sep, def, NULL);
FREEMEM(def);
++num_new_novel;
}
else {
const char *sep = num_new_overridden == 0 ? "" : ",\n";
- char *def = S_overridden_meth(method, klass);
+ char *def = S_overridden_meth(self, method, klass,
+ num_new_overridden);
overridden_specs = CFCUtil_cat(overridden_specs, sep, def,
NULL);
FREEMEM(def);
@@ -174,7 +198,8 @@ CFCBindSpecs_add_class(CFCBindSpecs *self, CFCClass *klass) {
}
else {
const char *sep = num_new_inherited == 0 ? "" : ",\n";
- char *def = S_inherited_meth(method, klass);
+ char *def = S_inherited_meth(self, method, klass,
+ num_new_inherited);
inherited_specs = CFCUtil_cat(inherited_specs, sep, def, NULL);
FREEMEM(def);
++num_new_inherited;
@@ -301,9 +326,11 @@ CFCBindSpecs_init_func_def(CFCBindSpecs *self) {
const char *pattern =
"static void\n"
"S_bootstrap_specs() {\n"
+ "%s"
+ "\n"
" cfish_Class_bootstrap(class_specs, %d);\n"
"}\n";
- return CFCUtil_sprintf(pattern, self->num_specs);
+ return CFCUtil_sprintf(pattern, self->init_code, self->num_specs);
}
static char*
@@ -333,7 +360,10 @@ S_ivars_size(CFCClass *klass) {
}
static char*
-S_novel_meth(CFCMethod *method, CFCClass *klass) {
+S_novel_meth(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ int meth_index) {
+ CHY_UNUSED_VAR(self);
+ CHY_UNUSED_VAR(meth_index);
const char *meth_name = CFCMethod_get_name(method);
char *full_override_sym;
@@ -365,25 +395,43 @@ S_novel_meth(CFCMethod *method, CFCClass *klass) {
}
static char*
-S_parent_offset(CFCMethod *method, CFCClass *klass) {
+S_parent_offset(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ const char *meth_type, int meth_index) {
CFCClass *parent = CFCClass_get_parent(klass);
if (!parent) {
return CFCUtil_strdup("NULL");
}
+ char *parent_offset = NULL;
char *parent_offset_sym = CFCMethod_full_offset_sym(method, parent);
- char *parent_offset = CFCUtil_sprintf("&%s", parent_offset_sym);
+
+ if (CFCClass_get_parcel(parent) == CFCClass_get_parcel(klass)) {
+ parent_offset = CFCUtil_sprintf("&%s", parent_offset_sym);
+ }
+ else {
+ parent_offset = CFCUtil_strdup("NULL");
+
+ const char *class_var = CFCClass_full_class_var(klass);
+ char pattern[] = " %s_%s_METHS[%d].parent_offset = &%s;\n";
+ char *code = CFCUtil_sprintf(pattern, class_var, meth_type, meth_index,
+ parent_offset_sym);
+ self->init_code = CFCUtil_cat(self->init_code, code, NULL);
+ FREEMEM(code);
+ }
+
FREEMEM(parent_offset_sym);
return parent_offset;
}
static char*
-S_overridden_meth(CFCMethod *method, CFCClass *klass) {
+S_overridden_meth(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ int meth_index) {
char *imp_func = CFCMethod_imp_func(method, klass);
char *full_offset_sym = CFCMethod_full_offset_sym(method, klass);
- char *parent_offset = S_parent_offset(method, klass);
+ char *parent_offset = S_parent_offset(self, method, klass, "OVERRIDDEN",
+ meth_index);
char pattern[] =
" {\n"
@@ -401,9 +449,11 @@ S_overridden_meth(CFCMethod *method, CFCClass *klass) {
}
static char*
-S_inherited_meth(CFCMethod *method, CFCClass *klass) {
+S_inherited_meth(CFCBindSpecs *self, CFCMethod *method, CFCClass *klass,
+ int meth_index) {
char *full_offset_sym = CFCMethod_full_offset_sym(method, klass);
- char *parent_offset = S_parent_offset(method, klass);
+ char *parent_offset = S_parent_offset(self, method, klass, "INHERITED",
+ meth_index);
char pattern[] =
" {\n"