X-Git-Url: https://git.draconx.ca/gitweb/gob-dx.git/blobdiff_plain/486240dc4c5d57b0afaddba60d87fe375112bed5..refs/tags/v1.0.9:/src/parse.y diff --git a/src/parse.y b/src/parse.y index 9764b67..47fdcf2 100644 --- a/src/parse.y +++ b/src/parse.y @@ -36,13 +36,15 @@ GList *nodes = NULL; static GList *class_nodes = NULL; Node *class = NULL; -char *chunk_size = NULL; +static char *chunk_size = NULL; +static char *bonobo_x_class = NULL; static GList *typestack = NULL; static GList *funcargs = NULL; static GList *checks = NULL; static int has_self = FALSE; static int vararg = FALSE; +static Method *last_added_method = NULL; /* destructor and initializer for variables */ static char *destructor = NULL; @@ -141,18 +143,18 @@ push_function(int scope, int method, char *oid, char *id, !(g_list_length(funcargs) == 1 && g_list_length(gtktypes) == 2 && strcmp(gtktypes->next->data, "NONE")==0)) { - print_error(TRUE, _("The number of GTK arguments and " - "function arguments for a signal " - "don't seem to match"), line_no); + error_print(GOB_WARN, line_no, + _("The number of GTK arguments and " + "function arguments for a signal " + "don't seem to match")); } if(g_list_length(gtktypes) > 2) { GList *li; for(li = gtktypes->next; li; li = li->next) { if(strcmp(li->data, "NONE")==0) { - print_error(FALSE, + error_print(GOB_ERROR, line_no, _("NONE can only appear in an " - "argument list by itself"), - line_no); + "argument list by itself")); } } } @@ -168,7 +170,10 @@ push_function(int scope, int method, char *oid, char *id, node = new_method(scope, method, type, oid, gtktypes, flags, id, funcargs, onerror, defreturn, c_cbuf, line_no, - ccode_line, vararg, method_unique_id++); + ccode_line, vararg, method_unique_id++, + FALSE); + + last_added_method = (Method *)node; if(cbuf) g_string_free(cbuf, @@ -235,12 +240,13 @@ push_init_arg(char *name, int is_class) } static void -push_self(char *id) +push_self(char *id, gboolean constant) { Node *node; Node *type; GList *ch = NULL; - type = new_type(g_strdup(((Class *)class)->otype), g_strdup("*"), NULL); + type = new_type(g_strdup(((Class *)class)->otype), + g_strdup(constant ? "const *" : "*"), NULL); ch = g_list_append(ch,new_check(NULL_CHECK,NULL)); ch = g_list_append(ch,new_check(TYPE_CHECK,NULL)); node = new_funcarg((Type *)type,id,ch); @@ -251,7 +257,6 @@ static Variable * find_var_or_die(const char *id, int line) { GList *li; - char *s; for(li = class_nodes; li != NULL; li = li->next) { Variable *var; @@ -263,8 +268,7 @@ find_var_or_die(const char *id, int line) return var; } - s = g_strdup_printf(_("Variable %s not defined here"), id); - print_error(FALSE, s, line); + error_printf(GOB_ERROR, line, _("Variable %s not defined here"), id); g_assert_not_reached(); return NULL; @@ -369,24 +373,32 @@ class: classdec '{' classcode '}' { } ; -classdec: CLASS TYPETOKEN FROM TYPETOKEN chunk { - class = new_class($2,$4,chunk_size,NULL); +classdec: CLASS TYPETOKEN FROM TYPETOKEN classflags { + class = new_class ($2, $4, + bonobo_x_class, chunk_size, NULL); } ; -chunk: - | '(' TOKEN TOKEN ')' { +classflags: + | '(' TOKEN TOKEN ')' classflags { if(strcmp($2,"chunks") == 0) { - chunk_size = g_strdup($4); + g_free (chunk_size); + chunk_size = g_strdup($3); + } else if(strcmp($2,"BonoboX") == 0) { + g_free (bonobo_x_class); + bonobo_x_class = g_strdup($3); } else { yyerror(_("parse error")); YYERROR; } } - | '(' TOKEN NUMBER ')' { + | '(' TOKEN NUMBER ')' classflags { if(strcmp($2,"chunks") == 0) { - if(atoi($4) != 0) - chunk_size = g_strdup($4); + g_free (chunk_size); + if(atoi($3) != 0) + chunk_size = g_strdup($3); + else + chunk_size = NULL; } else { yyerror(_("parse error")); YYERROR; @@ -399,6 +411,14 @@ classcode: classcode thing { ; } ; thing: method { ; } + | TOKEN method { + if (strcmp ($1, "BonoboX") != 0) { + g_free($1); + yyerror(_("parse error")); + YYERROR; + } + last_added_method->bonobo_x_func = TRUE; + } | variable { ; } | argument { ; } | ';' { ; } @@ -497,6 +517,7 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { g_free($3); g_free($4); g_free($5); g_free($8); g_list_foreach($2,(GFunc)g_free,NULL); + g_list_free($2); g_string_free($10,TRUE); g_string_free($7,TRUE); yyerror(_("parse error")); @@ -504,29 +525,30 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { } } | ARGUMENT flags argtype TOKEN TOKEN '{' CCODE ';' { - if(strcmp($5,"get")==0) { + if(strcmp($5, "get") == 0) { Node *node; Type *type = pop_type(); g_free($5); - node = new_argument($3,type,$2,$4, - ($7)->str,$6, - NULL,0, $1); - g_string_free($7,FALSE); - class_nodes = g_list_append(class_nodes,node); - } else if(strcmp($5,"set")==0) { + node = new_argument($3, type, $2, $4, + ($7)->str, $6, + NULL, 0, $1); + g_string_free($7, FALSE); + class_nodes = g_list_append(class_nodes, node); + } else if(strcmp($5, "set") == 0) { Node *node; Type *type = pop_type(); g_free($5); - node = new_argument($3,type,$2,$4, - NULL,0,($7)->str, + node = new_argument($3, type, $2, $4, + NULL, 0, ($7)->str, $6, $1); - g_string_free($7,FALSE); - class_nodes = g_list_append(class_nodes,node); + g_string_free($7, FALSE); + class_nodes = g_list_append(class_nodes, node); } else { g_free($5); g_free($3); g_free($4); - g_list_foreach($2,(GFunc)g_free,NULL); - g_string_free($7,TRUE); + g_list_foreach($2, (GFunc)g_free, NULL); + g_list_free($2); + g_string_free($7, TRUE); yyerror(_("parse error")); YYERROR; } @@ -544,6 +566,7 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { g_free($5); g_free($3); g_free($4); g_list_foreach($2,(GFunc)g_free,NULL); + g_list_free($2); yyerror(_("parse error")); YYERROR; } @@ -553,9 +576,12 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { var = find_var_or_die($4, $1); if(var->scope == PRIVATE_SCOPE) root = "self->_priv"; - else if(var->scope == CLASS_SCOPE) - root = "SELF_CLASS(GTK_OBJECT(self)->klass)"; - else + else if(var->scope == CLASS_SCOPE) { + root = "SELF_GET_CLASS(self)"; + if(no_self_alias) + error_print(GOB_ERROR, $1, + _("Self aliases needed when autolinking to a classwide member")); + } else root = "self"; if(strcmp($5, "link")==0) { @@ -568,13 +594,11 @@ argument: ARGUMENT flags argtype TOKEN TOKEN '{' CCODE TOKEN '{' CCODE ';' { root, $4); } else if(strcmp($5, "objectlink")==0) { set = g_strdup_printf( - "if(%s->%s) " - "gtk_object_unref(GTK_OBJECT(%s->%s)); " - "%s->%s = ARG; " - "if(%s->%s) " - "gtk_object_ref(GTK_OBJECT(%s->%s));", - root, $4, - root, $4, + "if (ARG != NULL) " + "gtk_object_ref (GTK_OBJECT (ARG)); " + "if (%s->%s != NULL) " + "gtk_object_unref (GTK_OBJECT (%s->%s)); " + "%s->%s = ARG;", root, $4, root, $4, root, $4); @@ -959,23 +983,65 @@ funcargs: VOID { vararg = FALSE; has_self = FALSE; } vararg = FALSE; has_self = TRUE; if(strcmp($1,"self")==0) - push_self($1); + push_self($1, FALSE); + else { + g_free($1); + yyerror(_("parse error")); + YYERROR; + } + } + | TOKEN CONST { + vararg = FALSE; + has_self = TRUE; + if(strcmp($1,"self")==0) + push_self($1, TRUE); else { g_free($1); yyerror(_("parse error")); YYERROR; } } + | CONST TOKEN { + vararg = FALSE; + has_self = TRUE; + if(strcmp($2,"self")==0) + push_self($2, TRUE); + else { + g_free($2); + yyerror(_("parse error")); + YYERROR; + } + } | TOKEN ',' arglist { has_self = TRUE; if(strcmp($1,"self")==0) - push_self($1); + push_self($1, FALSE); else { g_free($1); yyerror(_("parse error")); YYERROR; } } + | TOKEN CONST ',' arglist { + has_self = TRUE; + if(strcmp($1,"self")==0) + push_self($1, TRUE); + else { + g_free($1); + yyerror(_("parse error")); + YYERROR; + } + } + | CONST TOKEN ',' arglist { + has_self = TRUE; + if(strcmp($2,"self")==0) + push_self($2, TRUE); + else { + g_free($2); + yyerror(_("parse error")); + YYERROR; + } + } | arglist { has_self = FALSE; } ;