]> git.draconx.ca Git - gob-dx.git/blobdiff - src/main.c
Release 2.0.4
[gob-dx.git] / src / main.c
index 7ece9fb6481228e7757add93c2ed5cced65667d0..f74f89775a288a562e9010673149822c16b7e069 100644 (file)
@@ -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",
@@ -2584,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
@@ -2679,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",
@@ -2705,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)
@@ -3249,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) {
@@ -3396,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)
 {
@@ -3588,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",
@@ -3653,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",
@@ -3716,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",
@@ -3761,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) {