X-Git-Url: http://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/928c6b8da5a3677aaaf33976a7d921a1498a61df..refs/tags/v2.0.5:/src/main.c diff --git a/src/main.c b/src/main.c index 7ece9fb..6f5bf2c 100644 --- a/src/main.c +++ b/src/main.c @@ -310,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; @@ -356,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); @@ -526,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 || @@ -636,7 +636,7 @@ make_inits(Class *cl) } static void -find_dispose(Class *cl) +find_dispose(const Class *cl) { GList *li; @@ -667,7 +667,7 @@ find_dispose(Class *cl) } static void -find_finalize(Class *cl) +find_finalize(const Class *cl) { GList *li; @@ -708,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) { @@ -722,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) { @@ -734,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; @@ -742,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)", @@ -857,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); @@ -1045,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" @@ -1098,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" @@ -1299,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); @@ -1954,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; @@ -2295,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; @@ -2570,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", @@ -2583,21 +2607,38 @@ put_signal_args (Method *m) } } +static void +clear_signal_args (Method *m) +{ + GList *li; + int i; + + out_printf (out, "\n\tg_value_unset (&___param_values[0]);\n"); + + if (m->args->next == NULL) + return; + + for (li = m->args->next, i = 1; + li != NULL; + li = li->next, i++) { + out_printf (out, + "\tg_value_unset (&___param_values[%d]);\n", i); + } +} + 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 @@ -2679,9 +2720,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", @@ -2703,16 +2748,39 @@ put_method(Method *m) g_free (s); + clear_signal_args (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; + /* Hack because glib is very very braindead */ + gboolean do_dup = + (strcmp ((char *)m->gtktypes->data, "STRING") == 0 || + strcmp ((char *)m->gtktypes->data, "BOXED") == 0 || + strcmp ((char *)m->gtktypes->data, "OBJECT") == 0 || + strcmp ((char *)m->gtktypes->data, "PARAM") == 0); + + 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_%s_%s", + do_dup ? "dup" : "get", + (char *)m->gtktypes->data); g_strdown (getfunc); if (cast == NULL) cast = get_type (m->mtype, TRUE); - out_printf (out, "\n\treturn (%s) %s (&___return_val);\n", + out_printf (out, + "\n\t{\n" + "\t\t"); + print_type (out, m->mtype, TRUE); + out_printf (out, + " ___ret = (%s) %s (&___return_val);\n" + "\t\tg_value_unset (&___return_val);\n" + "\t\treturn ___ret;\n" + "\t}\n", cast, getfunc); g_free (cast); @@ -3249,12 +3317,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) { @@ -3396,6 +3459,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) { @@ -3588,7 +3668,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", @@ -3653,7 +3733,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", @@ -3716,7 +3796,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", @@ -3761,6 +3841,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) {