/* GOB C Preprocessor
- * Copyright (C) 1999 the Free Software Foundation.
+ * Copyright (C) 1999,2000 the Free Software Foundation.
+ * Copyright (C) 2000 Eazel, Inc.
*
* Author: George Lebl
*
static gboolean special_array[SPECIAL_LAST] = {0};
static gboolean any_special = FALSE;
+static gboolean need_destroy = FALSE;
+static Method * destroy_handler = NULL;
+
+static gboolean need_finalize = FALSE;
+static Method * finalize_handler = NULL;
+
FILE *out = NULL;
FILE *outh = NULL;
FILE *outph = NULL;
gboolean no_extern_c = FALSE;
gboolean no_write = FALSE;
gboolean no_lines = FALSE;
+gboolean no_self_alias = FALSE;
+gboolean no_kill_underscores = FALSE;
+
+int method_unique_id = 1;
static void
make_bases(void)
val = g_hash_table_lookup(gtk_doc_hash, id);
if(val)
return g_strdup_printf("/**\n * %s_%s:\n%s **/\n",
- funcbase, id, val);
- s = g_strconcat(funcbase, "_", id, NULL);
+ funcbase, get_real_id(id), val);
+ s = g_strconcat(funcbase, "_", get_real_id(id), NULL);
val = g_hash_table_lookup(gtk_doc_hash, s);
g_free(s);
if(val)
return g_strdup_printf("/**\n * %s_%s:\n%s **/\n",
- funcbase, id, val);
+ funcbase, get_real_id(id), val);
return NULL;
}
char *subnameprefix,
char *namepostfix, char *postfix, Method *m,
gboolean one_arg_per_line,
- gboolean no_funcbase)
+ gboolean no_funcbase,
+ gboolean kill_underscore)
{
GList *li;
+ char *id;
out_printf(fp, "%s", typeprefix);
print_type(fp, m->mtype, TRUE);
+
+ if(kill_underscore)
+ id = get_real_id(m->id);
+ else
+ id = m->id;
+
if(no_funcbase)
out_printf(fp, "%s%s%s%s(",
- nameprefix, subnameprefix, m->id, namepostfix);
+ nameprefix, subnameprefix, id, namepostfix);
else
out_printf(fp, "%s%s_%s%s%s(",
- nameprefix, funcbase, subnameprefix, m->id,
+ nameprefix, funcbase, subnameprefix, id,
namepostfix);
if(m->args) {
out_printf(out, "static const typeof(&%s_%s) %s "
"__attribute__ ((__unused__)) "
- "= %s_%s;\n", funcbase, m->id, m->id,
- funcbase, m->id);
+ "= %s_%s;\n", funcbase, get_real_id(m->id),
+ m->id, funcbase, get_real_id(m->id));
out_printf(out, "#define %s(args...) "
- "%s_%s(##args)\n", m->id, funcbase, m->id);
+ "%s_%s(##args)\n", m->id,
+ funcbase, get_real_id(m->id));
}
}
}
continue;
print_method(out, "static ", "(* ", "", ") ", "",
- m, FALSE, TRUE);
- out_printf(out, " = %s_%s;\n", funcbase, m->id);
+ m, FALSE, TRUE, FALSE);
+ out_printf(out, " = %s_%s;\n", funcbase,
+ get_real_id(m->id));
made_aliases = TRUE;
}
/* if a signal mark it as such */
if(m->method != VIRTUAL_METHOD)
- print_method(outh, "\t/*signal*/", "(* ", "", ") ", ";\n", m,
- FALSE, TRUE);
+ print_method(outh, "\t/*signal*/", "(* ", "", ") ", ";\n",
+ m, FALSE, TRUE, TRUE);
else
- print_method(outh, "\t", "(* ", "", ") ", ";\n", m, FALSE, TRUE);
+ print_method(outh, "\t", "(* ", "", ") ", ";\n",
+ m, FALSE, TRUE, TRUE);
}
static void
if(m->scope != PUBLIC_SCOPE)
return;
- print_method(outh, "", "\t", "", "\t", ";\n", m, TRUE, FALSE);
+ print_method(outh, "", "\t", "", "\t", ";\n", m, TRUE, FALSE, TRUE);
}
/* I'm starting not to like this idea */
return;
if(outph)
- print_method(outph, "", "\t", "", "\t", ";\n", m, FALSE, FALSE);
+ print_method(outph, "", "\t", "", "\t", ";\n",
+ m, FALSE, FALSE, TRUE);
else
- print_method(out, "", "\t", "", "\t", ";\n", m, FALSE, FALSE);
+ print_method(out, "", "\t", "", "\t", ";\n",
+ m, FALSE, FALSE, TRUE);
}
static void
if(m->cbuf)
print_method(out,
"static ", "___real_", "", " ", ";\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
}
+ /* no else, here, it might still have a private prototype, it's not
+ * exclusive */
- if(m->scope == PRIVATE_SCOPE ||
+ if((m->method == OVERRIDE_METHOD &&
+ m->cbuf)) {
+ /* add unique ID */
+ char *s = g_strdup_printf("___%x_", (guint)m->unique_id);
+ print_method(out, "static ", s, "", " ",
+ no_gnu?";\n":" G_GNUC_UNUSED;\n",
+ m, FALSE, FALSE, FALSE);
+ g_free(s);
+ } else if(m->scope == PRIVATE_SCOPE ||
m->method == INIT_METHOD ||
- m->method == CLASS_INIT_METHOD ||
- (m->method == OVERRIDE_METHOD &&
- m->cbuf))
+ m->method == CLASS_INIT_METHOD)
print_method(out, "static ", "", "", " ",
no_gnu?";\n":" G_GNUC_UNUSED;\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
}
static GList *
(Type *)new_type(0, g_strdup("void"), NULL),
NULL, NULL, NULL, g_strdup("class_init"),
make_func_arg(cl->otype, TRUE, g_strdup("c")),
- NULL, NULL, NULL, 0, 0, FALSE);
+ NULL, NULL, NULL, 0, 0, FALSE,
+ method_unique_id++);
cl->nodes = g_list_prepend(cl->nodes, node);
}
if(!got_init) {
(Type *)new_type(0, g_strdup("void"), NULL),
NULL, NULL, NULL, g_strdup("init"),
make_func_arg(cl->otype, FALSE, g_strdup("o")),
- NULL, NULL, NULL, 0, 0, FALSE);
+ NULL, NULL, NULL, 0, 0, FALSE,
+ method_unique_id++);
cl->nodes = g_list_prepend(cl->nodes, node);
}
}
static void
-make_finalize(Class *cl)
+find_destroy(Class *cl)
{
- int got_finalize = FALSE;
GList *li;
Node *node;
+
+ destroy_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, "Gtk:Object")==0) {
- got_finalize = TRUE;
- break;
+ strcmp(m->id, "destroy")==0) {
+ if(strcmp(m->otype, "Gtk:Object") != 0) {
+ print_error(FALSE,
+ "destroy method override "
+ "of class other then "
+ "Gtk:Object",
+ m->line_no);
}
- print_error(FALSE, "finalize method override "
- "of class other then Gtk:Object",
- m->line_no);
+ if(g_list_length(m->args) != 1) {
+ print_error(FALSE,
+ "destroy method override "
+ "with more then one "
+ "parameter",
+ m->line_no);
+ }
+ destroy_handler = m;
+ break;
}
}
}
- if(!got_finalize) {
- node = new_method(NO_SCOPE, OVERRIDE_METHOD,
- (Type *)new_type(0, g_strdup("void"), NULL),
- g_strdup("Gtk:Object"),
- NULL, NULL, g_strdup("finalize"),
- make_func_arg("Gtk:Object", FALSE, g_strdup("o")),
- NULL, NULL,
- g_strdup("PARENT_HANDLER (o);\n"),
- 0, 0, FALSE);
- cl->nodes = g_list_append(cl->nodes, node);
- overrides++;
+}
+
+static void
+find_finalize(Class *cl)
+{
+ GList *li;
+ Node *node;
+
+ 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, "Gtk:Object") != 0) {
+ print_error(FALSE,
+ "finalize method override "
+ "of class other then "
+ "Gtk:Object",
+ m->line_no);
+ }
+ if(g_list_length(m->args) != 1) {
+ print_error(FALSE,
+ "finalize method override "
+ "with more then one "
+ "parameter",
+ m->line_no);
+ }
+ finalize_handler = m;
+ break;
+ }
+ }
}
}
Method *m = (Method *)n;
if(m->method == SIGNAL_LAST_METHOD ||
m->method == SIGNAL_FIRST_METHOD) {
- char *s = g_strdup(m->id);
+ char *s = g_strdup(get_real_id(m->id));
g_strup(s);
out_printf(out, "\t%s_SIGNAL,\n", s);
g_free(s);
if(n->type != METHOD_NODE ||
m->method != OVERRIDE_METHOD)
continue;
-
+
s = remove_sep(m->otype);
if(g_hash_table_lookup(done, s)) {
g_strdown(f);
out_printf(out, "\t%sClass *%s_class = (%sClass *)%s;\n",
- s, f, s, oname);
+ s, f, s, oname);
g_free(f);
}
mar = g_strdup("gtk_signal_default_marshaller");
is_none = (strcmp(m->gtktypes->next->data, "NONE")==0);
-
- sig = g_strdup(m->id);
+
+ sig = g_strdup(get_real_id(m->id));
g_strup(sig);
flags = make_run_signal_flags(m, last);
out_printf(out, "\tobject_signals[%s_SIGNAL] =\n"
"\t\t\tGTK_SIGNAL_OFFSET (%sClass, %s),\n"
"\t\t\t%s,\n"
"\t\t\tGTK_TYPE_%s, %d",
- sig, m->id,
+ sig, get_real_id(m->id),
flags,
- typebase, m->id, mar, (char *)m->gtktypes->data,
+ typebase, get_real_id(m->id), mar,
+ (char *)m->gtktypes->data,
is_none?0:g_list_length(m->gtktypes->next));
g_free(mar);
g_free(sig);
gboolean set_line = FALSE;
out_printf(out, "\n");
- for(li=c->nodes;li;li=g_list_next(li)) {
+ for(li = c->nodes; li; li = g_list_next(li)) {
Node *n = li->data;
Method *m = (Method *)n;
+ char *id;
+
if(n->type != METHOD_NODE ||
(m->method != SIGNAL_FIRST_METHOD &&
m->method != SIGNAL_LAST_METHOD &&
set_line = FALSE;
}
+
if(m->method == OVERRIDE_METHOD) {
char *s;
s = replace_sep(m->otype, '_');
g_strdown(s);
- if(m->cbuf)
- out_printf(out, "\t%s_class->%s = %s_%s;\n",
- s, m->id, funcbase, m->id);
+
+ if(need_destroy &&
+ destroy_handler &&
+ strcmp(m->id, "destroy") == 0)
+ out_printf(out, "\tgtk_object_class->destroy "
+ "= ___destroy;\n");
+ else if(need_finalize &&
+ finalize_handler &&
+ strcmp(m->id, "finalize") == 0)
+ out_printf(out, "\tgtk_object_class->finalize "
+ "= ___finalize;\n");
+ else if(m->cbuf)
+ out_printf(out,
+ "\t%s_class->%s = ___%x_%s_%s;\n",
+ s, m->id, (guint)m->unique_id,
+ funcbase, m->id);
else
out_printf(out, "\t%s_class->%s = NULL;\n",
s, m->id);
} else {
if(m->cbuf)
out_printf(out, "\t%s->%s = ___real_%s_%s;\n",
- oname, m->id, funcbase, m->id);
+ oname, get_real_id(m->id),
+ funcbase, get_real_id(m->id));
else
out_printf(out, "\t%s->%s = NULL;\n",
- oname, m->id);
+ oname, get_real_id(m->id));
}
}
if(set_line)
g_free(root);
}
+static void
+print_destructor(Variable *v)
+{
+ char *root;
+
+ if(v->destructor == NULL)
+ return;
+
+ if(v->scope == PRIVATE_SCOPE)
+ root = "self->_priv";
+ else
+ root = "self";
+
+ if(v->destructor_simple) {
+ if(v->destructor_line > 0)
+ out_addline_infile(out, v->destructor_line);
+
+ out_printf(out, "\tif(%s->%s) { "
+ "((*(void (*)(void *))%s)) (%s->%s); "
+ "%s->%s = NULL; }\n",
+ root, v->id, v->destructor, root, v->id,
+ root, v->id);
+
+ if(v->destructor_line > 0)
+ out_addline_outfile(out);
+ } else {
+ out_printf(out, "#define VAR (%s->%s)\n", root, v->id);
+ out_printf(out, "\t{\n");
+ if(v->destructor_line > 0)
+ out_addline_infile(out, v->destructor_line);
+
+ out_printf(out, "\t%s}\n", v->destructor);
+
+ if(v->destructor_line > 0)
+ out_addline_outfile(out);
+ out_printf(out, "\tmemset(&VAR, 0, sizeof(VAR));\n");
+ out_printf(out, "#undef VAR\n");
+ }
+}
+
+static void
+add_destroy(Class *c)
+{
+ out_printf(out, "\nstatic void\n"
+ "___destroy(GtkObject *obj_self)\n"
+ "{\n");
+
+ if(destructors > 0) {
+ out_printf(out, "\t%s *self G_GNUC_UNUSED = %s (obj_self);\n",
+ typebase, macrobase);
+ }
+
+ if(destroy_handler) {
+ /* so we get possible bad argument warning */
+ if(destroy_handler->line_no > 0)
+ out_addline_infile(out, destroy_handler->line_no);
+ out_printf(out, "\t___%x_%s_destroy(obj_self);\n",
+ (guint)destroy_handler->unique_id, funcbase);
+ if(destroy_handler->line_no > 0)
+ out_addline_outfile(out);
+ }
+
+ if(destructors > 0) {
+ GList *li;
+ for(li = ((Class *)class)->nodes;
+ li != NULL;
+ li = li->next) {
+ Node *n = li->data;
+ Variable *v = (Variable *)n;
+ if(n->type == VARIABLE_NODE &&
+ v->scope != CLASS_SCOPE)
+ print_destructor(v);
+ }
+ }
+
+ out_printf(out, "}\n\n");
+}
+
+static void
+add_finalize(Class *c)
+{
+ out_printf(out, "\nstatic void\n"
+ "___finalize(GtkObject *obj_self)\n"
+ "{\n");
+
+ if(privates > 0) {
+ out_printf(out, "\t%s *self = %s (obj_self);\n",
+ typebase, macrobase);
+ }
+
+ if(finalize_handler) {
+ /* so we get possible bad argument warning */
+ if(finalize_handler->line_no > 0)
+ out_addline_infile(out, finalize_handler->line_no);
+ out_printf(out, "\t___%x_%s_finalize(obj_self);\n",
+ (guint)finalize_handler->unique_id, funcbase);
+ if(finalize_handler->line_no > 0)
+ out_addline_outfile(out);
+ }
+
+ if(privates > 0) {
+ out_printf(out, "\tg_free (self->_priv);\n"
+ "\tself->_priv = NULL;\n");
+ }
+
+ out_printf(out, "}\n\n");
+}
+
static void
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);
+ m, FALSE, FALSE, TRUE);
if(m->line_no > 0)
out_addline_outfile(out);
out_printf(out, "{\n");
}
}
} else if(m->method == CLASS_INIT_METHOD) {
+ gboolean did_gtk_obj = FALSE;
+
if(m->line_no > 0)
out_addline_infile(out, m->line_no);
print_method(out, "static ", "\n", "", " ", "\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
if(m->line_no > 0)
out_addline_outfile(out);
out_printf(out, "{\n");
- if(signals>0 ||
- arguments>0)
+ if(signals > 0 ||
+ arguments > 0 ||
+ need_destroy ||
+ need_finalize) {
out_printf(out,
"\tGtkObjectClass *"
"gtk_object_class = "
"(GtkObjectClass*) %s;\n",
((FuncArg *)m->args->data)->name);
+ did_gtk_obj = TRUE;
+ }
- if(overrides>0)
+ if(overrides > 0)
add_overrides(c,
((FuncArg *)m->args->data)->name,
- (signals>0 || arguments>0));
+ did_gtk_obj);
if(initializers > 0) {
GList *li;
out_printf(out, "gtk_type_class (%s_get_type ());\n",
pfuncbase);
- if(signals>0)
+ if(signals > 0)
add_signals(c);
set_def_handlers(c, ((FuncArg *)m->args->data)->name);
+
+ /* if there are no handlers for these things, we
+ * need to set them up here */
+ if(need_destroy && !destroy_handler)
+ out_printf(out, "\tgtk_object_class->destroy "
+ "= ___destroy;\n");
+ if(need_finalize && !finalize_handler)
+ out_printf(out, "\tgtk_object_class->finalize "
+ "= ___finalize;\n");
- if(arguments>0)
+ if(arguments > 0)
make_arguments(c);
} else
out_addline_outfile(out);
}
-static void
-print_destructor(char *self_id, Variable *v)
-{
- char *root;
-
- if(v->destructor == NULL)
- return;
-
- if(v->scope == PRIVATE_SCOPE)
- root = g_strconcat(self_id, "->_priv", NULL);
- else
- root = g_strdup(self_id);
-
- if(v->destructor_simple) {
- if(v->destructor_line > 0)
- out_addline_infile(out, v->destructor_line);
-
- out_printf(out, "\tif(%s->%s) "
- "((*(void (*)(void *))%s)) (%s->%s);\n",
- root, v->id, v->destructor, root, v->id);
-
- if(v->destructor_line > 0)
- out_addline_outfile(out);
- } else {
- out_printf(out, "#define VAR (%s->%s)\n", root, v->id);
- out_printf(out, "\t{\n\t%s *self G_GNUC_UNUSED = %s;\n",
- typebase, self_id);
- if(v->destructor_line > 0)
- out_addline_infile(out, v->destructor_line);
-
- out_printf(out, "\t%s}\n", v->destructor);
-
- if(v->destructor_line > 0)
- out_addline_outfile(out);
- out_printf(out, "#undef VAR\n");
- }
-
- g_free(root);
-}
-
-/* put in code if it's needed */
-static void
-put_in_gen_code(Method *m)
-{
- if(m->method == OVERRIDE_METHOD &&
- strcmp(m->id, "finalize")==0) {
- if(privates > 0 || destructors > 0) {
- out_printf(out, "\t%s *___self = %s (%s);\n",
- typebase, macrobase,
- ((FuncArg *)m->args->data)->name);
- }
- if(destructors > 0) {
- GList *li;
- for(li = ((Class *)class)->nodes;
- li != NULL;
- li = li->next) {
- Node *n = li->data;
- Variable *v = (Variable *)n;
- if(n->type == VARIABLE_NODE &&
- v->scope != CLASS_SCOPE)
- print_destructor("___self", v);
- }
- }
- if(privates > 0) {
- out_printf(out, "\tg_free (___self->_priv);\n"
- "\t___self->_priv = NULL;\n",
- macrobase,
- ((FuncArg *)m->args->data)->name,
- macrobase,
- ((FuncArg *)m->args->data)->name);
- }
- }
-}
-
static void
print_method_body(Method *m, int pre)
{
if(pre)
print_preconditions(m);
- put_in_gen_code(m);
-
/* Note: the trailing }'s are on one line, this is so
that we get the no return warning correctly and point to
the correct line in the .gob file, yes this is slightly
is_void = (strcmp(m->mtype->name, "void")==0 &&
m->mtype->stars == 0);
out_printf(out, "\n");
- doc = get_gtk_doc(m->id);
- if(doc) {
- out_printf(out, "%s", doc);
- g_free(doc);
+ if(m->method != OVERRIDE_METHOD) {
+ doc = get_gtk_doc(m->id);
+ if(doc) {
+ out_printf(out, "%s", doc);
+ g_free(doc);
+ }
}
switch(m->method) {
case REGULAR_METHOD:
- if(m->line_no>0)
+ if(m->line_no > 0)
out_addline_infile(out, m->line_no);
if(m->scope == PRIVATE_SCOPE)
print_method(out, "static ", "\n", "", " ", "\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
else /* PUBLIC, PROTECTED */
print_method(out, "", "\n", "", " ", "\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
print_method_body(m, TRUE);
+ /* the outfile line was added above */
break;
case SIGNAL_FIRST_METHOD:
case SIGNAL_LAST_METHOD:
- if(m->line_no>0)
+ if(m->line_no > 0)
out_addline_infile(out, m->line_no);
if(m->scope == PRIVATE_SCOPE)
print_method(out, "static ", "\n", "", " ", "\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
else /* PUBLIC, PROTECTED */
- print_method(out, "", "\n", "", " ", "\n", m, FALSE, FALSE);
+ print_method(out, "", "\n", "", " ", "\n",
+ m, FALSE, FALSE, TRUE);
out_addline_outfile(out);
out_printf(out, "{\n");
- s = g_strdup(m->id);
+ s = g_strdup(get_real_id(m->id));
g_strup(s);
if(strcmp(m->mtype->name, "void")==0 &&
m->mtype->stars==0) {
if(!m->cbuf)
break;
- if(m->line_no>0)
+ if(m->line_no > 0)
out_addline_infile(out, m->line_no);
print_method(out, "static ", "\n___real_", "", " ", "\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
print_method_body(m, FALSE);
+ /* the outfile line was added above */
break;
case VIRTUAL_METHOD:
- if(m->line_no>0)
+ if(m->line_no > 0)
out_addline_infile(out, m->line_no);
if(m->scope==PRIVATE_SCOPE)
print_method(out, "static ", "\n", "", " ", "\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
else /* PUBLIC, PROTECTED */
- print_method(out, "", "\n", "", " ", "\n", m, FALSE, FALSE);
+ print_method(out, "", "\n", "", " ", "\n",
+ m, FALSE, FALSE, TRUE);
out_addline_outfile(out);
out_printf(out, "{\n"
"\t%sClass *klass;\n", typebase);
print_preconditions(m);
out_printf(out, "\tklass = %s_CLASS(GTK_OBJECT(%s)->klass);\n\n"
"\tif(klass->%s)\n",
- macrobase, ((FuncArg *)m->args->data)->name, m->id);
+ macrobase, ((FuncArg *)m->args->data)->name,
+ get_real_id(m->id));
if(strcmp(m->mtype->name, "void")==0 &&
m->mtype->stars==0) {
GList *li;
- out_printf(out, "\t\t(*klass->%s)(%s", m->id,
+ out_printf(out, "\t\t(*klass->%s)(%s",
+ get_real_id(m->id),
((FuncArg *)m->args->data)->name);
for(li=m->args->next;li;li=g_list_next(li)) {
FuncArg *fa = li->data;
out_printf(out, ");\n}\n");
} else {
GList *li;
- out_printf(out, "\t\treturn (*klass->%s)(%s", m->id,
+ out_printf(out, "\t\treturn (*klass->%s)(%s",
+ get_real_id(m->id),
((FuncArg *)m->args->data)->name);
for(li=m->args->next;li;li=g_list_next(li)) {
FuncArg *fa = li->data;
if(!m->cbuf)
break;
- if(m->line_no>0)
+ if(m->line_no > 0)
out_addline_infile(out, m->line_no);
print_method(out, "static ", "\n___real_", "", " ", "\n",
- m, FALSE, FALSE);
+ m, FALSE, FALSE, TRUE);
print_method_body(m, FALSE);
+ /* the outfile line was added above */
break;
case OVERRIDE_METHOD:
if(!m->cbuf)
break;
- if(m->line_no>0)
+ if(m->line_no > 0)
out_addline_infile(out, m->line_no);
- print_method(out, "static ", "\n", "", " ", "\n",
- m, FALSE, FALSE);
+ s = g_strdup_printf("\n___%x_", (guint)m->unique_id);
+ print_method(out, "static ", s, "", " ", "\n",
+ m, FALSE, FALSE, FALSE);
+ g_free(s);
+ out_addline_outfile(out);
s = replace_sep(m->otype, '_');
g_strup(s);
args = get_arg_names_for_macro(m);
g_free(args);
g_free(s);
print_method_body(m, TRUE);
+ /* the outfile line was added above */
out_printf(out, "#undef PARENT_HANDLER\n");
break;
default:
"GTK_CHECK_TYPE((obj),%s_get_type ())\n\n",
macrois, funcbase);
- out_printf(out, "/* self casting macros */\n");
- out_printf(out, "#define SELF(x) %s(x)\n", macrobase);
- out_printf(out, "#define IS_SELF(x) %s(x)\n", macrois);
- out_printf(out, "#define SELF_CLASS(x) %s_CLASS(x)\n\n", macrobase);
+ if(!no_self_alias) {
+ out_printf(out, "/* self casting macros */\n");
+ out_printf(out, "#define SELF(x) %s(x)\n", macrobase);
+ out_printf(out, "#define IS_SELF(x) %s(x)\n", macrois);
+ out_printf(out, "#define SELF_CLASS(x) %s_CLASS(x)\n\n",
+ macrobase);
- if(privates>0) {
+ out_printf(out, "/* self typedefs */\n");
+ out_printf(out, "typedef %s Self;\n", typebase);
+ out_printf(out, "typedef %sClass SelfClass;\n\n", typebase);
+ }
+
+ if(privates > 0) {
out_printf(outh, "\n/* Private structure type */\n");
out_printf(outh, "typedef struct _%sPrivate %sPrivate;\n",
typebase, typebase);
}
out_printf(outh, "};\n");
- if(privates>0) {
+ if(privates > 0) {
FILE *outfp;
/* if we are to stick this into the private
"#define GET_NEW ((%s *)gtk_type_new(%s_get_type()))\n\n",
typebase, funcbase);
+ if(need_destroy)
+ add_destroy(c);
+
+ if(need_finalize)
+ add_finalize(c);
+
add_inits(c);
if(arguments>0) {
gboolean found_header;
char *p;
+ /* We may need string.h for memset */
+ if(destructors > 0)
+ out_printf(out, "#include <string.h> /* memset() */\n\n");
+
p = g_strconcat(filebase, ".h", NULL);
found_header = TRUE;
if(!g_list_find_custom(include_files, p, (GCompareFunc)strcmp)) {
"prototypes inside c file\n"
"\t--no-write,-n Don't write output files, just "
"check syntax\n"
- "\t--no-lines Don't print '#line' to output\n");
+ "\t--no-lines Don't print '#line' to output\n"
+ "\t--no-self-alias Don't create self type and macro "
+ "aliases\n"
+ "\t--no-kill-underscores Don't remove the leading underscore "
+ "from short id names");
}
static void
no_write = TRUE;
} else if(strcmp(argv[i], "--no-lines")==0) {
no_lines = TRUE;
+ } else if(strcmp(argv[i], "--no-self-alias")==0) {
+ no_self_alias = TRUE;
+ } else if(strcmp(argv[i], "--no-kill-underscores")==0) {
+ no_kill_underscores = TRUE;
} else if(strcmp(argv[i], "--")==0) {
/*further arguments are files*/
no_opts = TRUE;
make_bases();
make_inits((Class *)class);
- if(privates>0)
- make_finalize((Class *)class);
+ if(destructors > 0) {
+ need_destroy = TRUE;
+ find_destroy((Class *)class);
+ }
+ if(privates > 0) {
+ need_finalize = TRUE;
+ find_finalize((Class *)class);
+ }
check_bad_symbols((Class *)class);
check_duplicate_symbols((Class *)class);
+ check_duplicate_overrides((Class *)class);
check_duplicate_signals_args((Class *)class);
check_public_new((Class *)class);
check_vararg((Class *)class);