Updated Branches: refs/heads/msvc6 2bebc84ff -> 94be23f76
Don't create empty MethodSpec arrays Zero-length arrays are not supported by MSVC6. Project: http://git-wip-us.apache.org/repos/asf/lucy/repo Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/94be23f7 Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/94be23f7 Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/94be23f7 Branch: refs/heads/msvc6 Commit: 94be23f7672f6ef048dd3d250011584366c3f18d Parents: b418116 Author: Nick Wellnhofer <[email protected]> Authored: Sat Nov 10 16:26:46 2012 +0100 Committer: Nick Wellnhofer <[email protected]> Committed: Sat Nov 10 16:29:04 2012 +0100 ---------------------------------------------------------------------- clownfish/compiler/src/CFCBindClass.c | 75 ++++++++++++++------------- 1 files changed, 39 insertions(+), 36 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/lucy/blob/94be23f7/clownfish/compiler/src/CFCBindClass.c ---------------------------------------------------------------------- diff --git a/clownfish/compiler/src/CFCBindClass.c b/clownfish/compiler/src/CFCBindClass.c index d92665c..03949d7 100644 --- a/clownfish/compiler/src/CFCBindClass.c +++ b/clownfish/compiler/src/CFCBindClass.c @@ -281,14 +281,7 @@ CFCBindClass_to_c_data(CFCBindClass *self) { char *offsets = CFCUtil_strdup(""); char *cb_funcs = CFCUtil_strdup(""); - - /* Start an array of cfish_MethodSpec structs. Since C89 doesn't allow us - * to initialize a pointer to an anonymous array inside a global struct, - * we have to give it a real symbol and then store a pointer to that - * symbol inside the VTableSpec struct. */ - char *ms_var = CFCUtil_strdup(""); - ms_var = CFCUtil_cat(ms_var, "static cfish_MethodSpec ", - self->method_specs_var, "[] = {\n", NULL); + char *ms_var = CFCUtil_strdup(""); for (int meth_num = 0; methods[meth_num] != NULL; meth_num++) { CFCMethod *method = methods[meth_num]; @@ -309,36 +302,45 @@ CFCBindClass_to_c_data(CFCBindClass *self) { FREEMEM(full_offset_sym); } - for (int meth_num = 0; fresh_methods[meth_num] != NULL; meth_num++) { - CFCMethod *method = fresh_methods[meth_num]; - - // Create a default implementation for abstract methods. - if (CFCMethod_abstract(method)) { - char *method_def = CFCBindMeth_abstract_method_def(method); - cb_funcs = CFCUtil_cat(cb_funcs, method_def, "\n", NULL); - FREEMEM(method_def); + if (fresh_methods[0] != NULL) { + /* Start an array of cfish_MethodSpec structs. Since C89 doesn't allow + * us to initialize a pointer to an anonymous array inside a global + * struct, we have to give it a real symbol and then store a pointer to + * that symbol inside the VTableSpec struct. */ + ms_var = CFCUtil_cat(ms_var, "static cfish_MethodSpec ", + self->method_specs_var, "[] = {\n", NULL); + + for (int meth_num = 0; fresh_methods[meth_num] != NULL; meth_num++) { + CFCMethod *method = fresh_methods[meth_num]; + + // Create a default implementation for abstract methods. + if (CFCMethod_abstract(method)) { + char *method_def = CFCBindMeth_abstract_method_def(method); + cb_funcs = CFCUtil_cat(cb_funcs, method_def, "\n", NULL); + FREEMEM(method_def); + } + + // Define callback. + if ((CFCMethod_public(method) || CFCMethod_abstract(method)) + && CFCMethod_novel(method)) { + char *cb_def = CFCBindMeth_callback_def(method); + cb_funcs = CFCUtil_cat(cb_funcs, cb_def, "\n", NULL); + FREEMEM(cb_def); + } + + // Define MethodSpec struct. + if (meth_num != 0) { + ms_var = CFCUtil_cat(ms_var, ",\n", NULL); + } + char *ms_def = CFCBindMeth_spec_def(method); + ms_var = CFCUtil_cat(ms_var, ms_def, NULL); + FREEMEM(ms_def); } - // Define callback. - if ((CFCMethod_public(method) || CFCMethod_abstract(method)) - && CFCMethod_novel(method)) { - char *cb_def = CFCBindMeth_callback_def(method); - cb_funcs = CFCUtil_cat(cb_funcs, cb_def, "\n", NULL); - FREEMEM(cb_def); - } - - // Define MethodSpec struct. - if (meth_num != 0) { - ms_var = CFCUtil_cat(ms_var, ",\n", NULL); - } - char *ms_def = CFCBindMeth_spec_def(method); - ms_var = CFCUtil_cat(ms_var, ms_def, NULL); - FREEMEM(ms_def); + // Close MethodSpec array definition. + ms_var = CFCUtil_cat(ms_var, "\n};\n", NULL); } - // Close MethodSpec array definition. - ms_var = CFCUtil_cat(ms_var, "\n};\n", NULL); - const char pattern[] = "#include \"%s\"\n" "\n" @@ -446,6 +448,7 @@ CFCBindClass_spec_def(CFCBindClass *self) { if (CFCMethod_novel(method)) { ++num_novel; } } FREEMEM(fresh_methods); + const char *ms_var = num_fresh ? self->method_specs_var : "NULL"; char pattern[] = " {\n" @@ -465,11 +468,11 @@ CFCBindClass_spec_def(CFCBindClass *self) { + strlen(struct_sym) + 10 // for num_fresh + 10 // for num_novel - + strlen(self->method_specs_var) + + strlen(ms_var) + 100; char *code = (char*)MALLOCATE(size); sprintf(code, pattern, vt_var, parent_ref, class_name, struct_sym, - num_fresh, num_novel, self->method_specs_var); + num_fresh, num_novel, ms_var); FREEMEM(parent_ref); return code;
