X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/346ae1bbcbbe87e79fe2db1f019f014ea64e2175..ada81cd69cc17de9e0f15214782c8067436c5354:/src/main.c diff --git a/src/main.c b/src/main.c index 3909cb0..f74f897 100644 --- a/src/main.c +++ b/src/main.c @@ -82,8 +82,8 @@ 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_shutdown = FALSE; -static Method * shutdown_handler = NULL; +static gboolean need_dispose = FALSE; +static Method * dispose_handler = NULL; static gboolean need_finalize = FALSE; static Method * finalize_handler = NULL; @@ -142,42 +142,6 @@ make_bases (void) ptypebase = remove_sep (((Class *)class)->ptype); } -static char * -get_type (const Type *t, gboolean postfix_to_stars) -{ - char *s; - int i; - int extra; - GString *gs; - - s = remove_sep(t->name); - gs = g_string_new(s); - g_free(s); - - extra = 0; - if (postfix_to_stars) { - const char *p; - /*XXX: this is ugly perhaps we can do this whole postfix thing - in a nicer way, we just count the number of '[' s and from - that we deduce the number of dimensions, so that we can print - that many stars */ - for (p = t->postfix; p && *p; p++) - if(*p == '[') extra++; - } - g_string_append_c(gs, ' '); - - if (t->pointer != NULL) { - g_string_append (gs, t->pointer); - for (i=0; i < extra; i++) - g_string_append_c (gs, '*'); - g_string_append_c (gs, ' '); - } - - s = gs->str; - g_string_free (gs, FALSE); - return s; -} - static char * get_gtk_doc (const char *id) { @@ -346,7 +310,7 @@ make_method_nongnu_aliases(Class *c) } static void -add_bad_hack_to_avoid_unused_warnings(Class *c) +add_bad_hack_to_avoid_unused_warnings(const Class *c) { GList *li; @@ -392,7 +356,7 @@ add_bad_hack_to_avoid_unused_warnings(Class *c) } static void -put_variable(Variable *v, FILE *fp) +put_variable(const Variable *v, FILE *fp) { out_printf(fp, "\t"); print_type(fp, v->vtype, FALSE); @@ -562,7 +526,7 @@ put_prot_method(const Method *m) } static void -put_priv_method_prot(Method *m) +put_priv_method_prot(const Method *m) { if(m->method == SIGNAL_LAST_METHOD || m->method == SIGNAL_FIRST_METHOD || @@ -672,30 +636,30 @@ make_inits(Class *cl) } static void -find_shutdown(Class *cl) +find_dispose(const Class *cl) { GList *li; - shutdown_handler = NULL; + 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, "shutdown")==0) { + strcmp(m->id, "dispose")==0) { if(strcmp(m->otype, "G:Object") != 0) { error_print(GOB_ERROR, m->line_no, - "shutdown method override " + "dispose method override " "of class other then " "G:Object"); } if(g_list_length(m->args) != 1) { error_print(GOB_ERROR, m->line_no, - "shutdown method override " + "dispose method override " "with more then one " "parameter"); } - shutdown_handler = m; + dispose_handler = m; break; } } @@ -703,7 +667,7 @@ find_shutdown(Class *cl) } static void -find_finalize(Class *cl) +find_finalize(const Class *cl) { GList *li; @@ -744,7 +708,7 @@ static GList *eq_signal_methods = NULL; /* compare a list of strings */ static gboolean -is_list_equal(GList *a, GList *b) +is_list_equal(const GList *a, const GList *b) { for(;a && b; a=a->next, b=b->next) { if(strcmp(a->data, b->data)!=0) { @@ -758,7 +722,7 @@ is_list_equal(GList *a, GList *b) } static Method * -find_same_type_signal(Method *m) +find_same_type_signal(const Method *m) { GList *li; for(li=eq_signal_methods;li;li=li->next) { @@ -770,7 +734,7 @@ find_same_type_signal(Method *m) } static void -print_signal_marsal_args (Method *m) +print_signal_marsal_args (const Method *m) { if (strcmp (m->gtktypes->next->data, "NONE") != 0) { GList *li; @@ -778,8 +742,15 @@ print_signal_marsal_args (Method *m) for (i = 0, li = m->gtktypes->next; li != NULL; i++, li = li->next) { - char *get_func = g_strdup_printf - ("g_value_get_%s", (char *)li->data); + char *get_func; + + if (strcmp (li->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + get_func = g_strdup ("g_value_get_uint"); + else + get_func = g_strdup_printf + ("g_value_get_%s", (char *)li->data); + g_strdown (get_func); out_printf (out, ",\n\t\t(%s) " "%s (param_values + %d)", @@ -893,9 +864,16 @@ add_signal_prots(Method *m) gboolean take_ownership = (strcmp ((char *)m->gtktypes->data, "STRING") == 0 || strcmp ((char *)m->gtktypes->data, "BOXED") == 0); - char *set_func = g_strdup_printf ("g_value_set_%s%s", - (char *)m->gtktypes->data, - take_ownership ? + char *set_func; + + + if (strcmp (m->gtktypes->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + set_func = g_strdup ("g_value_set_uint"); + else + set_func = g_strdup_printf ("g_value_set_%s%s", + (char *)m->gtktypes->data, + take_ownership ? "_take_ownership" : ""); g_strdown (set_func); @@ -1081,7 +1059,7 @@ add_get_type(void) "%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n\n" - "\tif (type == 0) {\n" + "\tif ___GOB_UNLIKELY(type == 0) {\n" "\t\tstatic const GTypeInfo info = {\n" "\t\t\tsizeof (%sClass),\n" "\t\t\t(GBaseInitFunc) NULL,\n" @@ -1134,7 +1112,7 @@ add_bonobo_object_get_type (void) "%s_get_type (void)\n" /* 1 */ "{\n" "\tstatic GType type = 0;\n\n" - "\tif (type == 0) {\n" + "\tif ___GOB_UNLIKELY(type == 0) {\n" "\t\tstatic const GTypeInfo info = {\n" "\t\t\tsizeof (%sClass),\n" /* 2 */ "\t\t\t(GBaseInitFunc) NULL,\n" @@ -1335,8 +1313,8 @@ add_signals(Class *c) if(strcmp(m->gtktypes->data, "NONE") != 0 || ! is_none) { GList *gl, *al; - char *sep = ""; - out_printf(out, "\tif("); + const char *sep = ""; + out_printf(out, "\tif ___GOB_UNLIKELY("); if(strcmp(m->gtktypes->data, "NONE") != 0) { out_printf(out, "%s sizeof(", sep); print_type(out, m->mtype, FALSE); @@ -1407,11 +1385,11 @@ set_def_handlers(Class *c, const char *oname) s = replace_sep (m->otype, '_'); g_strdown (s); - if (need_shutdown && - shutdown_handler != NULL && - strcmp (m->id, "shutdown") == 0) - out_printf (out, "\tg_object_class->shutdown " - "= ___shutdown;\n"); + if (need_dispose && + dispose_handler != NULL && + strcmp (m->id, "dispose") == 0) + out_printf (out, "\tg_object_class->dispose " + "= ___dispose;\n"); else if (need_finalize && finalize_handler && strcmp(m->id, "finalize") == 0) @@ -1591,6 +1569,21 @@ make_argument (Argument *a) #define value_for_print(str, alt) (str != NULL ? str : alt) +static char * +make_me_type (const char *type, const char *alt) +{ + if (type == NULL) + return g_strdup (alt); + /* HACK! just in case someone made this + * work with 2.0.0 by using the TYPE + * macro directly */ + if ((strstr (type, "_TYPE_") != NULL || + strstr (type, "TYPE_") == type) && + strchr (type, ':') == NULL) + return g_strdup (type); + return make_pre_macro (type, "TYPE"); +} + static void make_property (Property *p) { @@ -1645,7 +1638,7 @@ make_property (Property *p) g_string_append (flags, ")"); - if (strcmp (p->gtktype, "CHAR") == 0) + if (strcmp (p->gtktype, "CHAR") == 0) { out_printf (out, "\tparam_spec = g_param_spec_char\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1661,7 +1654,7 @@ make_property (Property *p) value_for_print (p->maximum, "127"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "UCHAR") == 0) + } else if (strcmp (p->gtktype, "UCHAR") == 0) { out_printf (out, "\tparam_spec = g_param_spec_uchar\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1677,7 +1670,7 @@ make_property (Property *p) value_for_print (p->maximum, "0xFF"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "BOOLEAN") == 0) + } else if (strcmp (p->gtktype, "BOOLEAN") == 0) { out_printf (out, "\tparam_spec = g_param_spec_boolean\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1689,7 +1682,7 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "FALSE"), flags->str); - else if (strcmp (p->gtktype, "INT") == 0) + } else if (strcmp (p->gtktype, "INT") == 0) { out_printf (out, "\tparam_spec = g_param_spec_int\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1705,7 +1698,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXINT"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "UINT") == 0) + } else if (strcmp (p->gtktype, "UINT") == 0) { out_printf (out, "\tparam_spec = g_param_spec_uint\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1721,7 +1714,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXUINT"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "LONG") == 0) + } else if (strcmp (p->gtktype, "LONG") == 0) { out_printf (out, "\tparam_spec = g_param_spec_long\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1737,7 +1730,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXLONG"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "ULONG") == 0) + } else if (strcmp (p->gtktype, "ULONG") == 0) { out_printf (out, "\tparam_spec = g_param_spec_ulong\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1753,7 +1746,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXULONG"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "UNICHAR") == 0) + } else if (strcmp (p->gtktype, "UNICHAR") == 0) { out_printf (out, "\tparam_spec = g_param_spec_unichar\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1765,7 +1758,9 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "ENUM") == 0) + } else if (strcmp (p->gtktype, "ENUM") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_ENUM"); out_printf (out, "\tparam_spec = g_param_spec_enum\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1776,10 +1771,13 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_ENUM"), + type, value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "FLAGS") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "FLAGS") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_FLAGS"); out_printf (out, "\tparam_spec = g_param_spec_flags\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1790,10 +1788,11 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_FLAGS"), + type, value_for_print (p->default_value, "0"), flags->str); - else if (strcmp (p->gtktype, "FLOAT") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "FLOAT") == 0) { out_printf (out, "\tparam_spec = g_param_spec_float\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1809,7 +1808,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXFLOAT"), value_for_print (p->default_value, "0.0"), flags->str); - else if (strcmp (p->gtktype, "DOUBLE") == 0) + } else if (strcmp (p->gtktype, "DOUBLE") == 0) { out_printf (out, "\tparam_spec = g_param_spec_double\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1825,7 +1824,7 @@ make_property (Property *p) value_for_print (p->maximum, "G_MAXDOUBLE"), value_for_print (p->default_value, "0.0"), flags->str); - else if (strcmp (p->gtktype, "STRING") == 0) + } else if (strcmp (p->gtktype, "STRING") == 0) { out_printf (out, "\tparam_spec = g_param_spec_string\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1837,7 +1836,9 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), value_for_print (p->default_value, "NULL"), flags->str); - else if (strcmp (p->gtktype, "PARAM") == 0) + } else if (strcmp (p->gtktype, "PARAM") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_PARAM"); out_printf (out, "\tparam_spec = g_param_spec_param\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1847,9 +1848,12 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_PARAM"), + type, flags->str); - else if (strcmp (p->gtktype, "BOXED") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "BOXED") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_BOXED"); out_printf (out, "\tparam_spec = g_param_spec_boxed\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1859,9 +1863,10 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_BOXED"), + type, flags->str); - else if (strcmp (p->gtktype, "POINTER") == 0) + g_free (type); + } else if (strcmp (p->gtktype, "POINTER") == 0) { out_printf (out, "\tparam_spec = g_param_spec_pointer\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1872,7 +1877,7 @@ make_property (Property *p) value_for_print (p->blurb, "NULL"), flags->str); /* FIXME: VALUE_ARRAY */ - else if (strcmp (p->gtktype, "CLOSURE") == 0) + } else if (strcmp (p->gtktype, "CLOSURE") == 0) { out_printf (out, "\tparam_spec = g_param_spec_pointer\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1882,7 +1887,9 @@ make_property (Property *p) value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), flags->str); - else if (strcmp (p->gtktype, "OBJECT") == 0) + } else if (strcmp (p->gtktype, "OBJECT") == 0) { + char *type = make_me_type (p->extra_gtktype, + "G_TYPE_BOXED"); out_printf (out, "\tparam_spec = g_param_spec_object\n" "\t\t(\"%s\" /* name */,\n" "\t\t %s /* nick */,\n" @@ -1892,12 +1899,14 @@ make_property (Property *p) p->name, value_for_print (p->nick, "NULL"), value_for_print (p->blurb, "NULL"), - value_for_print (p->extra_gtktype, "G_TYPE_OBJECT"), + type, flags->str); - else + g_free (type); + } else { error_printf (GOB_ERROR, p->line_no, "%s type is not supported by properties", p->gtktype); + } s = g_strdup (p->name); g_strup (s); @@ -1959,7 +1968,7 @@ print_initializer(Method *m, Variable *v) static void print_destructor (Variable *v) { - char *root; + const char *root; if(v->destructor == NULL) return; @@ -2000,13 +2009,13 @@ print_destructor (Variable *v) } static void -add_shutdown (Class *c) +add_dispose (Class *c) { out_printf(out, "\nstatic void\n" - "___shutdown (GObject *obj_self)\n" + "___dispose (GObject *obj_self)\n" "{\n"); out_printf(out, - "#define __GOB_FUNCTION__ \"%s::shutdown\"\n", + "#define __GOB_FUNCTION__ \"%s::dispose\"\n", c->otype); if (unreftors > 0) { @@ -2014,18 +2023,18 @@ add_shutdown (Class *c) typebase, macrobase); } - if (shutdown_handler != NULL) { + if (dispose_handler != NULL) { /* so we get possible bad argument warning */ - if (shutdown_handler->line_no > 0) - out_addline_infile (out, shutdown_handler->line_no); - out_printf (out, "\t___%x_%s_shutdown(obj_self);\n", - (guint)shutdown_handler->unique_id, funcbase); - if (shutdown_handler->line_no > 0) + if (dispose_handler->line_no > 0) + out_addline_infile (out, dispose_handler->line_no); + out_printf (out, "\t___%x_%s_dispose(obj_self);\n", + (guint)dispose_handler->unique_id, funcbase); + if (dispose_handler->line_no > 0) out_addline_outfile (out); } else { out_printf (out, - "\tif (G_OBJECT_CLASS (parent_class)->shutdown) \\\n" - "\t\t(* G_OBJECT_CLASS (parent_class)->shutdown) (obj_self);\n"); + "\tif (G_OBJECT_CLASS (parent_class)->dispose) \\\n" + "\t\t(* G_OBJECT_CLASS (parent_class)->dispose) (obj_self);\n"); } if (unreftors > 0) { @@ -2199,7 +2208,7 @@ add_inits(Class *c) if (set_properties > 0 || get_properties > 0 || signals > 0 || - need_shutdown || + need_dispose || need_finalize) { out_printf(out, "\tGObjectClass *" @@ -2241,9 +2250,9 @@ add_inits(Class *c) /* if there are no handlers for these things, we * need to set them up here */ - if(need_shutdown && !shutdown_handler) - out_printf(out, "\tg_object_class->shutdown " - "= ___shutdown;\n"); + if(need_dispose && !dispose_handler) + out_printf(out, "\tg_object_class->dispose " + "= ___dispose;\n"); if(need_finalize && !finalize_handler) out_printf(out, "\tg_object_class->finalize = " "___finalize;\n"); @@ -2300,6 +2309,12 @@ add_argument (Argument *a, gboolean is_set) the_type_lower = g_strdup (a->gtktype); g_strdown (the_type_lower); + /* HACK because there is no g_value_set/get for unichar */ + if (strcmp (the_type_lower, "unichar") == 0) { + g_free (the_type_lower); + the_type_lower = g_strdup ("uint"); + } + if (is_set) { char *cast; @@ -2575,9 +2590,13 @@ put_signal_args (Method *m) "\tg_value_init (&___param_values[%d], G_TYPE_%s);\n", i, i, (char *)ali->data); - set_func = g_strdup_printf ("g_value_set%s_%s", - do_static ? "_static" : "", - (char *)ali->data); + if (strcmp (ali->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + set_func = g_strdup ("g_value_set_uint"); + else + set_func = g_strdup_printf ("g_value_set%s_%s", + do_static ? "_static" : "", + (char *)ali->data); g_strdown (set_func); out_printf (out, "\t%s (&___param_values[%d], (%s) %s);\n\n", @@ -2589,20 +2608,18 @@ put_signal_args (Method *m) } static char * -get_arg_names_for_macro(Method *m) +get_arg_names_for_macro (Method *m) { - char *p; + const char *sep; GList *li; GString *gs = g_string_new(NULL); - p = ""; + sep = ""; for(li=m->args;li;li=g_list_next(li)) { FuncArg *arg = li->data; - g_string_sprintfa(gs, "%s___%s", p, arg->name); - p = ","; + g_string_sprintfa (gs, "%s___%s", sep, arg->name); + sep = ","; } - p = gs->str; - g_string_free(gs, FALSE); - return p; + return g_string_free (gs, FALSE); } static void @@ -2684,9 +2701,13 @@ put_method(Method *m) if (cast == NULL) cast = get_type (m->mtype, TRUE); - set_func = g_strdup_printf ("g_value_set%s_%s", - do_static ? "_static" : "", - (char *)m->gtktypes->data); + if (strcmp (m->gtktypes->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + set_func = g_strdup ("g_value_set_uint"); + else + set_func = g_strdup_printf ("g_value_set%s_%s", + do_static ? "_static" : "", + (char *)m->gtktypes->data); g_strdown (set_func); out_printf (out, "\t%s (&___return_val, (%s) (%s));\n", @@ -2710,8 +2731,14 @@ put_method(Method *m) if (strcmp (m->gtktypes->data, "NONE") != 0) { char *cast = g_strdup (get_cast (m->gtktypes->data, FALSE)); - char *getfunc = g_strdup_printf ("g_value_get_%s", - (char *)m->gtktypes->data); + char *getfunc; + + if (strcmp (m->gtktypes->data, "UNICHAR") == 0) + /* hack because glib is braindamaged */ + getfunc = g_strdup ("g_value_get_uint"); + else + getfunc = g_strdup_printf ("g_value_get_%s", + (char *)m->gtktypes->data); g_strdown (getfunc); if (cast == NULL) @@ -3254,12 +3281,7 @@ print_class_block(Class *c) " */\n"); if ( ! overrode_get_type) { - out_printf (outh, "GType\t%s_get_type\t(void)", funcbase); - if ( ! no_gnu) { - out_printf (outh, " G_GNUC_CONST;\n"); - } else { - out_printf (outh, ";\n"); - } + out_printf (outh, "GType\t%s_get_type\t(void);\n", funcbase); } for(li = c->nodes; li != NULL; li = li->next) { @@ -3359,8 +3381,8 @@ print_class_block(Class *c) no_gnu ? "" : " G_GNUC_UNUSED", typebase, typebase, typebase, funcbase); - if (need_shutdown) - add_shutdown (c); + if (need_dispose) + add_dispose (c); if (need_finalize) add_finalize (c); @@ -3401,6 +3423,23 @@ print_useful_macros(void) out_printf (out, "#define selfp (self->_priv)\n\n"); } +static void +print_more_useful_macros (void) +{ + if (no_gnu) { + out_printf (out, "#define ___GOB_LIKELY(expr) (expr)\n"); + out_printf (out, "#define ___GOB_UNLIKELY(expr) (expr)\n"); + } else { + out_printf (out, "#ifdef G_LIKELY\n"); + out_printf (out, "#define ___GOB_LIKELY(expr) G_LIKELY(expr)\n"); + out_printf (out, "#define ___GOB_UNLIKELY(expr) G_UNLIKELY(expr)\n"); + out_printf (out, "#else /* ! G_LIKELY */\n"); + out_printf (out, "#define ___GOB_LIKELY(expr) (expr)\n"); + out_printf (out, "#define ___GOB_UNLIKELY(expr) (expr)\n"); + out_printf (out, "#endif /* G_LIKELY */\n"); + } +} + static void print_file_comments(void) { @@ -3593,7 +3632,7 @@ print_enum (EnumDef *enode) "GType\n%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n" - "\tif (type == 0)\n" + "\tif ___GOB_UNLIKELY(type == 0)\n" "\t\ttype = g_enum_register_static (\"%s\", _%s_values);\n" "\treturn type;\n" "}\n\n", @@ -3658,7 +3697,7 @@ print_flags (Flags *fnode) "GType\n%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n" - "\tif (type == 0)\n" + "\tif ___GOB_UNLIKELY(type == 0)\n" "\t\ttype = g_flags_register_static (\"%s\", _%s_values);\n" "\treturn type;\n" "}\n\n", @@ -3721,7 +3760,7 @@ print_error (Error *enode) "GType\n%s_get_type (void)\n" "{\n" "\tstatic GType type = 0;\n" - "\tif (type == 0)\n" + "\tif ___GOB_UNLIKELY(type == 0)\n" "\t\ttype = g_enum_register_static (\"%s\", _%s_values);\n" "\treturn type;\n" "}\n\n", @@ -3766,6 +3805,8 @@ generate_outfiles(void) print_includes(); + print_more_useful_macros (); + for (li = nodes; li != NULL; li = li->next) { Node *node = li->data; if (node->type == CCODE_NODE) { @@ -4066,8 +4107,8 @@ main(int argc, char *argv[]) make_bases (); make_inits ((Class *)class); if(unreftors > 0) { - need_shutdown = TRUE; - find_shutdown ((Class *)class); + need_dispose = TRUE; + find_dispose ((Class *)class); } if (destructors > 0 || privates > 0) {