X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/77fd2f2194af12f95959506910f3babe842c5f1f..2753ff6cefbe916211d543f1029879e2a075d111:/src/main.c diff --git a/src/main.c b/src/main.c index 6b233d7..0cdd6ff 100644 --- a/src/main.c +++ b/src/main.c @@ -67,6 +67,7 @@ static int privates = 0; /* number of private data members */ static int protecteds = 0; /* number of protected methods */ static int destructors = 0; /* number of variable destructors */ static int initializers = 0; /* number of variable initializers */ +static gboolean overrode_get_type = FALSE; /* provided your won _get_type */ static gboolean made_aliases = FALSE; /* if we made any shorthand aliases and need the REALLY UGLY HACK to @@ -93,7 +94,7 @@ gboolean no_gnu = FALSE; gboolean exit_on_warn = FALSE; gboolean exit_on_error = TRUE; gboolean got_error = FALSE; -gint private_header = PRIVATE_HEADER_ALWAYS; +gint private_header = PRIVATE_HEADER_ONDEMAND; gboolean no_extern_c = FALSE; gboolean no_write = FALSE; gboolean no_lines = FALSE; @@ -558,7 +559,8 @@ make_inits(Class *cl) NULL, NULL, NULL, g_strdup("class_init"), make_func_arg(cl->otype, TRUE, g_strdup("c")), NULL, NULL, NULL, 0, 0, FALSE, - method_unique_id++); + method_unique_id++, + FALSE /*bonobo_x_func*/); cl->nodes = g_list_prepend(cl->nodes, node); } if(!got_init) { @@ -568,7 +570,8 @@ make_inits(Class *cl) NULL, NULL, NULL, g_strdup("init"), make_func_arg(cl->otype, FALSE, g_strdup("o")), NULL, NULL, NULL, 0, 0, FALSE, - method_unique_id++); + method_unique_id++, + FALSE /*bonobo_x_func*/); cl->nodes = g_list_prepend(cl->nodes, node); } } @@ -751,14 +754,17 @@ add_signal_prots(Method *m) "\t(*rfunc)((%s *)object", s, s, typebase); } else { const char *retcast = get_cast(m->gtktypes->data, FALSE); + gboolean is_none = (strcmp(m->gtktypes->next->data, "NONE")==0); out_printf(out, "\t___%s rfunc;\n\t" "%s *retval;\n\n" "\trfunc = (___%s)func;\n\n" "\tretval = GTK_RETLOC_%s(args[%d]);\n\n" "\t*retval = (*rfunc)((%s *)object", - s, retcast, s, (char *)m->gtktypes->data, - g_list_length(m->gtktypes)-1, typebase); + s, retcast, s, + (char *)m->gtktypes->data, + g_list_length(m->gtktypes) - (is_none ? 2 : 1), + typebase); } print_signal_marsal_args(m); @@ -818,8 +824,8 @@ add_get_type(void) "GtkType\n" "%s_get_type (void)\n" "{\n" - "\tstatic guint type = 0;\n\n" - "\tif ( ! type) {\n" + "\tstatic GtkType type = 0;\n\n" + "\tif (type == 0) {\n" "\t\tstatic const GtkTypeInfo info = {\n" "\t\t\t\"%s\",\n" "\t\t\tsizeof (%s),\n" @@ -846,6 +852,49 @@ add_get_type(void) "}\n\n"); } +static void +add_bonobo_x_get_type (void) +{ + char *chunk_size = ((Class*)class)->chunk_size; + + out_printf(out, + "GtkType\n" + "%s_get_type (void)\n" + "{\n" + "\tstatic GtkType type = 0;\n\n" + "\tif (type == 0) {\n" + "\t\tstatic const GtkTypeInfo info = {\n" + "\t\t\t\"%s\",\n" + "\t\t\tsizeof (%s),\n" + "\t\t\tsizeof (%sClass),\n" + "\t\t\t(GtkClassInitFunc) %s_class_init,\n" + "\t\t\t(GtkObjectInitFunc) %s_init,\n" + "\t\t\t/* reserved_1 */ NULL,\n" + "\t\t\t/* reserved_2 */ NULL,\n" + "\t\t\t(GtkClassInitFunc) NULL\n" + "\t\t};\n\n" + "\t\ttype = bonobo_x_type_unique\n" + "\t\t\t(%s_get_type (),\n" + "\t\t\tPOA_%s__init, NULL,\n" + "\t\t\tGTK_STRUCT_OFFSET (%sClass, _epv),\n" + "\t\t\t&info);\n", + funcbase, typebase, typebase, typebase, + funcbase, funcbase, pfuncbase, + ((Class*)class)->bonobo_x_class, + typebase); + if(chunk_size) { + out_printf(out, + "#if %s > 0\n" + "\t\tgtk_type_set_chunk_alloc(type, %s);\n" + "#endif\n", + chunk_size, chunk_size); + } + out_printf(out, + "\t}\n\n" + "\treturn type;\n" + "}\n\n"); +} + static void add_overrides(Class *c, const char *oname, gboolean did_base_obj) { @@ -1352,6 +1401,36 @@ add_finalize(Class *c) "#undef __GOB_FUNCTION__\n\n"); } +static void +make_bonobo_x_epv (Class *c, const char *classname) +{ + GList *li; + gboolean added_line = FALSE; + + for (li = c->nodes; li != NULL; li = li->next) { + Node *n = li->data; + Method *m = (Method *)n; + if(n->type != METHOD_NODE || + m->method == OVERRIDE_METHOD) + continue; + + if (m->bonobo_x_func) { + if(m->line_no > 0) { + out_addline_infile(out, m->line_no); + added_line = TRUE; + } else if (m->line_no == 0 && + added_line) { + out_addline_outfile(out); + added_line = FALSE; + } + out_printf (out, "\t%s->_epv.%s = %s;\n", + classname, m->id, m->id); + } + } + if (added_line) + out_addline_outfile(out); +} + static void add_inits(Class *c) { @@ -1475,6 +1554,9 @@ add_inits(Class *c) if(get_arguments > 0 || set_arguments > 0) make_arguments(c); + if (c->bonobo_x_class != NULL) { + make_bonobo_x_epv (c, ((FuncArg *)m->args->data)->name); + } } else continue; @@ -1673,6 +1755,8 @@ print_preconditions(Method *m) static void print_method_body(Method *m, int pre) { + if (m->line_no > 0) + out_addline_outfile(out); out_printf(out, "{\n" "#define __GOB_FUNCTION__ \"%s::%s\"\n", ((Class *)class)->otype, @@ -2165,6 +2249,7 @@ print_class_block(Class *c) out_printf(out, "#define SELF(x) %s(x)\n", macrobase); out_printf(out, "#define SELF_CONST(x) %s_CONST(x)\n", macrobase); out_printf(out, "#define IS_SELF(x) %s(x)\n", macrois); + out_printf(out, "#define TYPE_SELF %s\n", macrotype); out_printf(out, "#define SELF_CLASS(x) %s_CLASS(x)\n\n", macrobase); out_printf(out, "#define SELF_GET_CLASS(x) %s_GET_CLASS(x)\n\n", @@ -2274,6 +2359,13 @@ print_class_block(Class *c) if(n->type == METHOD_NODE) put_vs_method((Method *)n); } + /* If BonoboX type class put down the epv */ + if (c->bonobo_x_class != NULL) { + out_printf (outh, + "\t/* Bonobo object epv */\n" + "\tPOA_%s__epv _epv;\n", + c->bonobo_x_class); + } /* put class scope variables */ for(l = c->nodes; l != NULL; l = l->next) { Node *n = l->data; @@ -2300,11 +2392,13 @@ print_class_block(Class *c) " * Public methods\n" " */\n"); - out_printf(outh, "GtkType\t%s_get_type\t(void)", funcbase); - if ( ! no_gnu) { - out_printf(outh, " G_GNUC_CONST;\n"); - } else { - out_printf(outh, ";\n"); + if ( ! overrode_get_type) { + out_printf(outh, "GtkType\t%s_get_type\t(void)", funcbase); + if ( ! no_gnu) { + out_printf(outh, " G_GNUC_CONST;\n"); + } else { + out_printf(outh, ";\n"); + } } for(l = c->nodes; l != NULL; l = l->next) { @@ -2358,7 +2452,12 @@ print_class_block(Class *c) add_enums(c); - add_get_type(); + if ( ! overrode_get_type) { + if (c->bonobo_x_class != NULL) + add_bonobo_x_get_type (); + else + add_get_type (); + } if(any_method_to_alias(c)) { if( ! no_gnu) { @@ -2773,6 +2872,7 @@ main(int argc, char *argv[]) protecteds = count_protecteds((Class *)class); destructors = count_destructors((Class *)class); initializers = count_initializers((Class *)class); + overrode_get_type = find_get_type((Class *)class); make_bases(); make_inits((Class *)class);