X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/56beb0d2b20edc2f0ac8716c020053f8a103577d..3e833eea9cb9822f04c639e143212c4b6f7940d4:/src/main.c?ds=sidebyside diff --git a/src/main.c b/src/main.c index e1cfe4b..f3142ad 100644 --- a/src/main.c +++ b/src/main.c @@ -1,7 +1,7 @@ /* GOB C Preprocessor * Copyright (C) 1999,2000 the Free Software Foundation. * Copyright (C) 2000 Eazel, Inc. - * Copyright (C) 2001-2004 George (Jiri) Lebl + * Copyright (C) 2001-2009 George (Jiri) Lebl * * Author: George (Jiri) Lebl * @@ -92,11 +92,16 @@ static gboolean made_aliases = FALSE; /* if we made any shorthand aliases static gboolean special_array[SPECIAL_LAST] = {0}; static gboolean any_special = FALSE; +static gboolean need_constructor = FALSE; +static Method * user_constructor = NULL; + static gboolean need_dispose = FALSE; static Method * dispose_handler = NULL; - +static Method * user_dispose_method = NULL; + static gboolean need_finalize = FALSE; static Method * finalize_handler = NULL; +static Method * user_finalize_method = NULL; FILE *out = NULL; FILE *outh = NULL; @@ -199,6 +204,7 @@ print_method (FILE *fp, const char *afterargs, const char *postfix, const Method *m, + gboolean print_funcattrs, gboolean one_arg_per_line, gboolean no_funcbase, gboolean kill_underscore, @@ -254,7 +260,28 @@ print_method (FILE *fp, } else { out_printf(fp, "void"); } - out_printf(fp, "%s)%s", afterargs, postfix); + /* Slightly icky: sometimes we are called st m->funcattrs + hasn't been set, but if so it should be NULL since its been + zero-initialized. */ + if(print_funcattrs && m->funcattrs != NULL + && strlen(m->funcattrs) > 0) { + /* To keep the output neat, we trim off the trailing '\n' + from the end of funcattrs for a moment. */ + size_t funcattrs_len = strlen(m->funcattrs); + gboolean funcattrs_chomped = FALSE; + if((m->funcattrs)[funcattrs_len - 1] == '\n') { + m->funcattrs[funcattrs_len - 1] = '\0'; + funcattrs_chomped = TRUE; + } + out_printf(fp, "%s)\n%s%s", afterargs, m->funcattrs, postfix); + /* Put it back like it was (though it shouldn't matter). */ + if (funcattrs_chomped) { + (m->funcattrs)[funcattrs_len - 1] = '\n'; + } + } + else { + out_printf(fp, "%s)%s", afterargs, postfix); + } } static gboolean @@ -269,6 +296,9 @@ any_method_to_alias(Class *c) if(m->method == INIT_METHOD || m->method == CLASS_INIT_METHOD || + m->method == CONSTRUCTOR_METHOD || + m->method == DISPOSE_METHOD || + m->method == FINALIZE_METHOD || m->method == OVERRIDE_METHOD) continue; @@ -291,6 +321,9 @@ make_method_aliases (Class *c) if(m->method == INIT_METHOD || m->method == CLASS_INIT_METHOD || + m->method == CONSTRUCTOR_METHOD || + m->method == DISPOSE_METHOD || + m->method == FINALIZE_METHOD || m->method == OVERRIDE_METHOD) continue; @@ -330,6 +363,9 @@ add_bad_hack_to_avoid_unused_warnings(const Class *c) if(m->method == INIT_METHOD || m->method == CLASS_INIT_METHOD || + m->method == CONSTRUCTOR_METHOD || + m->method == DISPOSE_METHOD || + m->method == FINALIZE_METHOD || m->method == OVERRIDE_METHOD) continue; @@ -371,11 +407,12 @@ put_vs_method(const Method *m) /* if a signal mark it as such */ if(m->method != VIRTUAL_METHOD) - print_method(outh, "\t/*signal*/", "(* ", "", ") ", "", ";\n", - m, FALSE, TRUE, TRUE, FALSE, FALSE); + print_method(outh, "\t/*signal*/", "(* ", "", ") ", "", ";\n", + m, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE); else - print_method(outh, "\t", "(* ", "", ") ", "", ";\n", - m, FALSE, TRUE, TRUE, FALSE, FALSE); + print_method(outh, "\t", "(* ", "", ") ", "", ";\n", + m, FALSE, FALSE, TRUE, TRUE, FALSE, FALSE); + } static void @@ -384,8 +421,10 @@ put_pub_method(const Method *m) if(m->scope != PUBLIC_SCOPE) return; + out_addline_infile(outh, m->line_no); print_method(outh, "", "\t", "", "\t", "", ";\n", m, - TRUE, FALSE, TRUE, FALSE, FALSE); + TRUE, TRUE, FALSE, TRUE, FALSE, FALSE); + out_addline_outfile(outh); } static void @@ -423,7 +462,7 @@ put_signal_macro (const Method *m, gboolean gnu) "(GCallback) __extension__ ({", funcbase, m->id, macrobase, typebase, m->id); print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ", - " = (func); ", m, FALSE, TRUE, TRUE, FALSE, TRUE); + " = (func); ", m, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE); out_printf (outh, "___%s; }), (data))\n", m->id); /* connect_after */ @@ -434,7 +473,7 @@ put_signal_macro (const Method *m, gboolean gnu) "(GCallback) __extension__ ({", funcbase, m->id, macrobase, typebase, m->id); print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ", - " = (func); ", m, FALSE, TRUE, TRUE, FALSE, TRUE); + " = (func); ", m, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE); out_printf (outh, "___%s; }), (data))\n", m->id); /* connect_data */ @@ -446,7 +485,7 @@ put_signal_macro (const Method *m, gboolean gnu) "(GCallback) __extension__ ({", funcbase, m->id, macrobase, typebase, m->id); print_method (outh, "", "(* ___", "", ") ", ", gpointer ___data ", - " = (func); ", m, FALSE, TRUE, TRUE, FALSE, TRUE); + " = (func); ", m, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE); out_printf (outh, "___%s; }), (data), (destroy_data), (GConnectFlags)(flags))\n", m->id); } } @@ -508,15 +547,17 @@ put_local_signal_macros (const Class *c) static void put_prot_method(const Method *m) { - if(m->scope != PROTECTED_SCOPE) - return; + FILE *f; - if(outph) - print_method(outph, "", "\t", "", "\t", "", ";\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); - else - print_method(out, "", "\t", "", "\t", "", ";\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + if(m->scope != PROTECTED_SCOPE) + return; + + f = outph ? outph : out; + + out_addline_infile(f, m->line_no); + print_method(f, "", "\t", "", "\t", "", ";\n", + m, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE); + out_addline_outfile(f); } static void @@ -528,7 +569,7 @@ put_priv_method_prot(const Method *m) if(m->cbuf) print_method(out, "static ", "___real_", "", " ", "", ";\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); } /* no else, here, it might still have a private prototype, it's not * exclusive */ @@ -537,16 +578,23 @@ put_priv_method_prot(const Method *m) m->cbuf)) { /* add unique ID */ char *s = g_strdup_printf("___%x_", (guint)m->unique_id); + out_addline_infile(out, m->line_no); print_method(out, "static ", s, "", " ", "", no_gnu?";\n":" G_GNUC_UNUSED;\n", - m, FALSE, FALSE, FALSE, FALSE, FALSE); + m, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE); + out_addline_outfile(out); g_free(s); } else if(m->scope == PRIVATE_SCOPE || m->method == INIT_METHOD || - m->method == CLASS_INIT_METHOD) { + m->method == CLASS_INIT_METHOD || + m->method == CONSTRUCTOR_METHOD || + m->method == DISPOSE_METHOD || + m->method == FINALIZE_METHOD) { + out_addline_infile(out, m->line_no); print_method(out, "static ", "", "", " ", "", no_gnu?";\n":" G_GNUC_UNUSED;\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + m, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE); + out_addline_outfile(out); } } @@ -629,66 +677,68 @@ make_inits(Class *cl) } } -static void -find_dispose(const Class *cl) +static Method * +find_method(const Class *cl, int method, const char *id) { GList *li; - dispose_handler = NULL; for(li=cl->nodes;li;li=g_list_next(li)) { Node *n = li->data; if(n->type == METHOD_NODE) { Method *m = (Method *)n; - if(m->method == OVERRIDE_METHOD && - strcmp(m->id, "dispose")==0) { - if(strcmp(m->otype, "G:Object") != 0) { - error_print(GOB_ERROR, m->line_no, - "dispose method override " - "of class other then " - "G:Object"); - } - if(g_list_length(m->args) != 1) { - error_print(GOB_ERROR, m->line_no, - "dispose method override " - "with more then one " - "parameter"); - } - dispose_handler = m; - break; - } + if (m->method == method + && (id == NULL || strcmp(m->id, id)==0)) + return m; } } + + return NULL; } static void -find_finalize(const Class *cl) +find_constructor(const Class *cl) { - GList *li; + user_constructor = find_method(cl, CONSTRUCTOR_METHOD, NULL); +} - finalize_handler = NULL; - for(li=cl->nodes;li;li=g_list_next(li)) { - Node *n = li->data; - if(n->type == METHOD_NODE) { - Method *m = (Method *)n; - if(m->method == OVERRIDE_METHOD && - strcmp(m->id, "finalize")==0) { - if(strcmp(m->otype, "G:Object") != 0) { - error_print(GOB_ERROR, m->line_no, - "finalize method override " - "of class other then " - "G:Object"); - } - if(g_list_length(m->args) != 1) { - error_print(GOB_ERROR, m->line_no, - "finalize method override " - "with more then one " - "parameter"); - } - finalize_handler = m; - break; - } - } +static void +find_dispose(const Class *cl) +{ + dispose_handler = find_method(cl, OVERRIDE_METHOD, "dispose"); + if (dispose_handler != NULL) { + if(strcmp(dispose_handler->otype, "G:Object") != 0) + error_print(GOB_ERROR, dispose_handler->line_no, + "dispose method override " + "of class other then " + "G:Object"); + if(g_list_length(dispose_handler->args) != 1) + error_print(GOB_ERROR, dispose_handler->line_no, + "dispose method override " + "with more then one " + "parameter"); + } + + user_dispose_method = find_method(cl, DISPOSE_METHOD, NULL); +} + +static void +find_finalize(const Class *cl) +{ + finalize_handler = find_method(cl, OVERRIDE_METHOD, "finalize"); + if (finalize_handler != NULL) { + if(strcmp(finalize_handler->otype, "G:Object") != 0) + error_print(GOB_ERROR, finalize_handler->line_no, + "finalize method override " + "of class other then " + "G:Object"); + if(g_list_length(finalize_handler->args) != 1) + error_print(GOB_ERROR, finalize_handler->line_no, + "finalize method override " + "with more then one " + "parameter"); } + + user_finalize_method = find_method(cl, FINALIZE_METHOD, NULL); } @@ -2033,10 +2083,12 @@ print_initializer(Method *m, Variable *v) if (v->initializer_simple) out_printf(out, "\t%s->%s = %s;\n", root, v->id, v->initializer); - else if (!strcmp(v->id, "_glade_xml")) + else if (strcmp(v->id, "_glade_xml") == 0) + /* This is OK, this v->initializer string is set internally + and it will eat exactly one string! */ out_printf(out,v->initializer, ((FuncArg *)m->args->data)->name); else - out_printf(out,v->initializer); + out_printf(out, "%s", v->initializer); if(v->initializer_line > 0) out_addline_outfile(out); @@ -2117,6 +2169,33 @@ print_destructor (Variable *v) } } +static void +add_constructor (Class *c) +{ + out_printf(out, "\nstatic GObject *\n" + "___constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)\n" + "{\n"); + out_printf(out, + "#define __GOB_FUNCTION__ \"%s::constructor\"\n", + c->otype); + + out_printf(out, "\tGObject *obj_self;\n"); + out_printf(out, "\t%s *self;\n", typebase); + + out_printf(out, "\tobj_self = G_OBJECT_CLASS (parent_class)->constructor (type, n_construct_properties, construct_properties);\n"); + out_printf(out, "\tself = %s (obj_self);\n", macrobase); + + if (user_constructor->line_no > 0) + out_addline_infile (out, user_constructor->line_no); + out_printf (out, "\t%s_constructor (self);\n", funcbase); + if (user_constructor->line_no > 0) + out_addline_outfile (out); + + out_printf(out, "\treturn obj_self;\n"); + out_printf(out, "}\n" + "#undef __GOB_FUNCTION__\n\n"); +} + static void add_dispose (Class *c) { @@ -2127,7 +2206,7 @@ add_dispose (Class *c) "#define __GOB_FUNCTION__ \"%s::dispose\"\n", c->otype); - if (unreftors > 0) { + if (unreftors > 0 || user_dispose_method != NULL) { out_printf (out, "\t%s *self%s = %s (obj_self);\n", typebase, ! no_gnu ? " G_GNUC_UNUSED" : "", @@ -2143,6 +2222,14 @@ add_dispose (Class *c) if (dispose_handler->line_no > 0) out_addline_outfile (out); } else { + if (user_dispose_method != NULL) { + if (user_dispose_method->line_no > 0) + out_addline_infile (out, user_dispose_method->line_no); + out_printf (out, "\t%s_dispose (self);\n", funcbase); + if (user_dispose_method->line_no > 0) + out_addline_outfile (out); + } + out_printf (out, "\tif (G_OBJECT_CLASS (parent_class)->dispose) \\\n" "\t\t(* G_OBJECT_CLASS (parent_class)->dispose) (obj_self);\n"); @@ -2178,7 +2265,8 @@ add_finalize (Class *c) c->otype); if (privates > 0 || - destructors > 0) { + destructors > 0 || + user_finalize_method != NULL) { const char *unused = ""; if ( ! no_gnu) unused = " G_GNUC_UNUSED"; @@ -2202,6 +2290,14 @@ add_finalize (Class *c) if(finalize_handler->line_no > 0) out_addline_outfile(out); } else { + if (user_finalize_method != NULL) { + if (user_finalize_method->line_no > 0) + out_addline_infile (out, user_finalize_method->line_no); + out_printf (out, "\t%s_finalize (self);\n", funcbase); + if (user_finalize_method->line_no > 0) + out_addline_outfile (out); + } + out_printf(out, "\tif(G_OBJECT_CLASS(parent_class)->finalize) \\\n" "\t\t(* G_OBJECT_CLASS(parent_class)->finalize)(obj_self);\n"); @@ -2275,10 +2371,12 @@ add_inits(Class *c) if(m->line_no > 0) out_addline_infile(out, m->line_no); print_method(out, "static ", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, TRUE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, TRUE, + FALSE); + out_printf(out, "{\n"); if(m->line_no > 0) out_addline_outfile(out); - out_printf(out, "{\n" + out_printf(out, "#define __GOB_FUNCTION__ \"%s::init\"\n", c->otype); if (privates > 0) { @@ -2324,15 +2422,18 @@ add_inits(Class *c) if(m->line_no > 0) out_addline_infile(out, m->line_no); print_method(out, "static ", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, TRUE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, TRUE, + FALSE); + out_printf(out, "{\n"); if(m->line_no > 0) out_addline_outfile(out); - out_printf(out, "{\n" + out_printf(out, "#define __GOB_FUNCTION__ \"%s::class_init\"\n", c->otype); if (set_properties > 0 || get_properties > 0 || signals > 0 || + need_constructor || need_dispose || need_finalize) { out_printf(out, @@ -2381,6 +2482,9 @@ add_inits(Class *c) /* if there are no handlers for these things, we * need to set them up here */ + if(need_constructor) + out_printf(out, "\tg_object_class->constructor " + "= ___constructor;\n"); if(need_dispose && !dispose_handler) out_printf(out, "\tg_object_class->dispose " "= ___dispose;\n"); @@ -2676,10 +2780,10 @@ print_preconditions(Method *m) static void print_method_body (Method *m, gboolean pre, gboolean unused_self) { + out_printf(out, "{\n"); if (m->line_no > 0) out_addline_outfile(out); - out_printf(out, "{\n" - "#define __GOB_FUNCTION__ \"%s::%s\"\n", + out_printf(out, "#define __GOB_FUNCTION__ \"%s::%s\"\n", ((Class *)class)->otype, m->id); if (pre) @@ -2832,10 +2936,10 @@ put_method(Method *m) out_addline_infile(out, m->line_no); if(m->scope == PRIVATE_SCOPE) print_method(out, "static ", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); else /* PUBLIC, PROTECTED */ print_method(out, "", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); print_method_body(m, TRUE, TRUE); /* the outfile line was added above */ break; @@ -2845,14 +2949,14 @@ put_method(Method *m) out_addline_infile(out, m->line_no); if(m->scope == PRIVATE_SCOPE) print_method(out, "static ", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); else /* PUBLIC, PROTECTED */ print_method(out, "", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); - out_addline_outfile (out); - + m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); out_printf (out, "{\n"); + out_addline_outfile (out); + out_printf (out, "\tGValue ___param_values[%d];\n" "\tGValue ___return_val;\n\n" @@ -2967,7 +3071,7 @@ put_method(Method *m) if(m->line_no > 0) out_addline_infile(out, m->line_no); print_method(out, "static ", "\n___real_", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, TRUE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE); print_method_body(m, FALSE, TRUE); /* the outfile line was added above */ break; @@ -2976,13 +3080,13 @@ put_method(Method *m) out_addline_infile(out, m->line_no); if(m->scope==PRIVATE_SCOPE) print_method(out, "static ", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); else /* PUBLIC, PROTECTED */ print_method(out, "", "\n", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, FALSE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE); + out_printf(out, "{\n"); out_addline_outfile(out); - out_printf(out, "{\n" - "\t%sClass *klass;\n", typebase); + out_printf(out, "\t%sClass *klass;\n", typebase); print_preconditions(m); out_printf(out, "\tklass = %s_GET_CLASS(%s);\n\n" "\tif(klass->%s)\n", @@ -3025,7 +3129,7 @@ put_method(Method *m) if(m->line_no > 0) out_addline_infile(out, m->line_no); print_method(out, "static ", "\n___real_", "", " ", "", "\n", - m, FALSE, FALSE, TRUE, TRUE, FALSE); + m, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE); print_method_body(m, FALSE, TRUE); /* the outfile line was added above */ break; @@ -3036,7 +3140,7 @@ put_method(Method *m) out_addline_infile(out, m->line_no); s = g_strdup_printf("\n___%x_", (guint)m->unique_id); print_method(out, "static ", s, "", " ", "", "\n", - m, FALSE, FALSE, FALSE, TRUE, FALSE); + m, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE); g_free(s); out_addline_outfile(out); s = replace_sep(m->otype, '_'); @@ -3064,6 +3168,15 @@ put_method(Method *m) /* the outfile line was added above */ out_printf(out, "#undef PARENT_HANDLER\n"); break; + case CONSTRUCTOR_METHOD: + case DISPOSE_METHOD: + case FINALIZE_METHOD: + if(m->line_no > 0) + out_addline_infile(out, m->line_no); + print_method(out, "static ", "\n", "", " ", "", "\n", + m, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE); + print_method_body(m, TRUE, TRUE); + /* the outfile line was added above */ default: break; } @@ -3293,6 +3406,7 @@ print_ccode_block(CCode *cc) } out_printf(fp, "%s\n", cc->cbuf); if(cc->cctype == C_CCODE || + cc->cctype == AD_CCODE || cc->cctype == A_CCODE || cc->cctype == AT_CCODE || cc->cctype == PH_CCODE) @@ -3501,7 +3615,7 @@ print_class_block(Class *c) " */\n"); if ( ! overrode_get_type) { - out_printf (outh, "GType\t%s_get_type\t(void);\n", funcbase); + out_printf (outh, "GType\t%s_get_type\t(void) G_GNUC_CONST;\n", funcbase); } for(li = c->nodes; li != NULL; li = li->next) { @@ -3633,6 +3747,18 @@ print_class_block(Class *c) funcbase); } + for (li = nodes; li != NULL; li = li->next) { + Node *node = li->data; + if (node->type == CCODE_NODE) { + CCode *cc = (CCode *)node; + if (cc->cctype == AD_CCODE) + print_ccode_block (cc); + } + } + + if (need_constructor) + add_constructor (c); + if (need_dispose) add_dispose (c); @@ -3878,7 +4004,7 @@ print_enum (EnumDef *enode) g_free (str); out_printf (outh, "%s_get_type()\n", funcprefix); - out_printf (outh, "GType %s_get_type (void);\n\n", funcprefix); + out_printf (outh, "GType %s_get_type (void) G_GNUC_CONST;\n\n", funcprefix); out_printf (out, "GType\n%s_get_type (void)\n" @@ -3943,7 +4069,7 @@ print_flags (Flags *fnode) g_free (str); out_printf (outh, "%s_get_type()\n", funcprefix); - out_printf (outh, "GType %s_get_type (void);\n\n", funcprefix); + out_printf (outh, "GType %s_get_type (void) G_GNUC_CONST;\n\n", funcprefix); out_printf (out, "GType\n%s_get_type (void)\n" @@ -4006,7 +4132,7 @@ print_error (Error *enode) g_free (str); out_printf (outh, "%s_get_type ()\n", funcprefix); - out_printf (outh, "GType %s_get_type (void);\n\n", funcprefix); + out_printf (outh, "GType %s_get_type (void) G_GNUC_CONST;\n\n", funcprefix); out_printf (out, "GType\n%s_get_type (void)\n" @@ -4064,7 +4190,8 @@ generate_outfiles(void) if (node->type == CCODE_NODE) { CCode *cc = (CCode *)node; if (cc->cctype != HT_CCODE && - cc->cctype != AT_CCODE) + cc->cctype != AT_CCODE && + cc->cctype != AD_CCODE) print_ccode_block ((CCode *)node); } else if (node->type == CLASS_NODE) { print_class_block ((Class *)node); @@ -4441,15 +4568,24 @@ main(int argc, char *argv[]) make_bases (); make_inits ((Class *)class); - if(unreftors > 0) { + + find_constructor ((Class *)class); + if (user_constructor != NULL) + need_constructor = TRUE; + + find_dispose ((Class *)class); + if (unreftors > 0 || + dispose_handler != NULL || + user_dispose_method != NULL) need_dispose = TRUE; - find_dispose ((Class *)class); - } + + find_finalize ((Class *)class); if (destructors > 0 || - privates > 0) { + privates > 0 || + user_finalize_method != NULL) { need_finalize = TRUE; - find_finalize ((Class *)class); } + check_bad_symbols ((Class *)class); check_duplicate_symbols ((Class *)class); check_duplicate_overrides ((Class *)class); @@ -4462,6 +4598,7 @@ main(int argc, char *argv[]) check_property_types ((Class *)class); check_argument_types ((Class *)class); check_func_arg_checks ((Class *)class); + check_func_attrs ((Class *)class); check_for_class_destructors ((Class *)class); exit_on_error = TRUE;