+ }
+ break;
+
+ case 54:
+#line 976 "parse.y"
+ {
+ destructor = NULL;
+ initializer = NULL;
+ }
+ break;
+
+ case 55:
+#line 982 "parse.y"
+ {
+ push_variable((yyvsp[(3) - (5)].id), the_scope,(yyvsp[(1) - (5)].line), NULL);
+ }
+ break;
+
+ case 56:
+#line 985 "parse.y"
+ {
+ push_variable((yyvsp[(3) - (6)].id), the_scope, (yyvsp[(1) - (6)].line), (yyvsp[(4) - (6)].id));
+ }
+ break;
+
+ case 57:
+#line 990 "parse.y"
+ {
+ Node *node = NULL;
+ if(strcmp((yyvsp[(6) - (12)].id),"get")==0 &&
+ strcmp((yyvsp[(9) - (12)].id),"set")==0) {
+ Type *type = pop_type();
+ g_free ((yyvsp[(6) - (12)].id));
+ g_free ((yyvsp[(9) - (12)].id));
+ node = node_new (ARGUMENT_NODE,
+ "gtktype:steal", (yyvsp[(3) - (12)].id),
+ "atype:steal", type,
+ "flags:steal", (yyvsp[(2) - (12)].list),
+ "name:steal", (yyvsp[(4) - (12)].id),
+ "get:steal", ((yyvsp[(8) - (12)].cbuf))->str,
+ "get_line", (yyvsp[(7) - (12)].line),
+ "set:steal", ((yyvsp[(11) - (12)].cbuf))->str,
+ "set_line", (yyvsp[(10) - (12)].line),
+ "line_no", (yyvsp[(1) - (12)].line),
+ NULL);
+
+ class_nodes = g_list_append(class_nodes,node);
+
+ g_string_free ((yyvsp[(8) - (12)].cbuf), FALSE);
+ g_string_free ((yyvsp[(11) - (12)].cbuf), FALSE);
+
+ } else if(strcmp((yyvsp[(6) - (12)].id),"set")==0 &&
+ strcmp((yyvsp[(9) - (12)].id),"get")==0) {
+ Type *type = pop_type();
+ g_free ((yyvsp[(6) - (12)].id));
+ g_free ((yyvsp[(9) - (12)].id));
+ node = node_new (ARGUMENT_NODE,
+ "gtktype:steal", (yyvsp[(3) - (12)].id),
+ "atype:steal", type,
+ "flags:steal", (yyvsp[(2) - (12)].list),
+ "name:steal", (yyvsp[(4) - (12)].id),
+ "get:steal", ((yyvsp[(11) - (12)].cbuf))->str,
+ "get_line", (yyvsp[(10) - (12)].line),
+ "set:steal", ((yyvsp[(8) - (12)].cbuf))->str,
+ "set_line", (yyvsp[(7) - (12)].line),
+ "line_no", (yyvsp[(1) - (12)].line),
+ NULL);
+ g_string_free ((yyvsp[(11) - (12)].cbuf), FALSE);
+ g_string_free ((yyvsp[(8) - (12)].cbuf), FALSE);
+ class_nodes = g_list_append(class_nodes,node);
+ } else {
+ g_free ((yyvsp[(3) - (12)].id));
+ g_free ((yyvsp[(4) - (12)].id));
+ g_free ((yyvsp[(6) - (12)].id));
+ g_free ((yyvsp[(9) - (12)].id));
+ g_list_foreach ((yyvsp[(2) - (12)].list), (GFunc)g_free, NULL);
+ g_list_free ((yyvsp[(2) - (12)].list));
+ g_string_free ((yyvsp[(11) - (12)].cbuf), TRUE);
+ g_string_free ((yyvsp[(8) - (12)].cbuf), TRUE);
+ yyerror (_("parse error"));
+ YYERROR;
+ }
+
+ if ((yyvsp[(5) - (12)].id) != NULL) {
+ Argument *arg = (Argument *)node;
+ export_accessors (arg->name,
+ arg->get != NULL, arg->get_line,
+ arg->set != NULL, arg->set_line,
+ arg->atype,
+ arg->gtktype,
+ arg->line_no);
+ g_free ((yyvsp[(5) - (12)].id));
+ }
+
+ }
+ break;
+
+ case 58:
+#line 1058 "parse.y"
+ {
+ Node *node = NULL;
+ if(strcmp((yyvsp[(6) - (9)].id), "get") == 0) {
+ Type *type = pop_type();
+ g_free ((yyvsp[(6) - (9)].id));
+ node = node_new (ARGUMENT_NODE,
+ "gtktype:steal", (yyvsp[(3) - (9)].id),
+ "atype:steal", type,
+ "flags:steal", (yyvsp[(2) - (9)].list),
+ "name:steal", (yyvsp[(4) - (9)].id),
+ "get:steal", ((yyvsp[(8) - (9)].cbuf))->str,
+ "get_line", (yyvsp[(7) - (9)].line),
+ "line_no", (yyvsp[(1) - (9)].line),
+ NULL);
+
+ g_string_free ((yyvsp[(8) - (9)].cbuf), FALSE);
+ class_nodes = g_list_append(class_nodes, node);
+ } else if(strcmp((yyvsp[(6) - (9)].id), "set") == 0) {
+ Type *type = pop_type();
+ g_free ((yyvsp[(6) - (9)].id));
+ node = node_new (ARGUMENT_NODE,
+ "gtktype:steal", (yyvsp[(3) - (9)].id),
+ "atype:steal", type,
+ "flags:steal", (yyvsp[(2) - (9)].list),
+ "name:steal", (yyvsp[(4) - (9)].id),
+ "set:steal", ((yyvsp[(8) - (9)].cbuf))->str,
+ "set_line", (yyvsp[(7) - (9)].line),
+ "line_no", (yyvsp[(1) - (9)].line),
+ NULL);
+
+ g_string_free ((yyvsp[(8) - (9)].cbuf), FALSE);
+ class_nodes = g_list_append (class_nodes, node);
+ } else {
+ g_free ((yyvsp[(6) - (9)].id));
+ g_free ((yyvsp[(3) - (9)].id));
+ g_free ((yyvsp[(4) - (9)].id));
+ g_list_foreach ((yyvsp[(2) - (9)].list), (GFunc)g_free, NULL);
+ g_list_free ((yyvsp[(2) - (9)].list));
+ g_string_free ((yyvsp[(8) - (9)].cbuf), TRUE);
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+
+ if ((yyvsp[(5) - (9)].id) != NULL) {
+ Argument *arg = (Argument *)node;
+ export_accessors (arg->name,
+ arg->get != NULL, arg->get_line,
+ arg->set != NULL, arg->set_line,
+ arg->atype,
+ arg->gtktype,
+ arg->line_no);
+ g_free ((yyvsp[(5) - (9)].id));
+ }
+ }
+ break;
+
+ case 59:
+#line 1112 "parse.y"
+ {
+ Node *node;
+ char *get, *set = NULL;
+ Variable *var;
+ Type *type;
+ const char *root;
+
+ if(strcmp((yyvsp[(6) - (6)].id), "link")!=0 &&
+ strcmp((yyvsp[(6) - (6)].id), "stringlink")!=0 &&
+ strcmp((yyvsp[(6) - (6)].id), "objectlink")!=0) {
+ g_free((yyvsp[(6) - (6)].id));
+ g_free((yyvsp[(3) - (6)].id));
+ g_free((yyvsp[(4) - (6)].id));
+ g_list_foreach((yyvsp[(2) - (6)].list),(GFunc)g_free,NULL);
+ g_list_free((yyvsp[(2) - (6)].list));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+
+ type = pop_type();
+
+ var = find_var_or_die((yyvsp[(4) - (6)].id), (yyvsp[(1) - (6)].line));
+ if(var->scope == PRIVATE_SCOPE) {
+ root = "self->_priv";
+ } else if(var->scope == CLASS_SCOPE) {
+ root = "SELF_GET_CLASS(self)";
+ if(no_self_alias)
+ error_print(GOB_ERROR, (yyvsp[(1) - (6)].line),
+ _("Self aliases needed when autolinking to a classwide member"));
+ } else {
+ root = "self";
+ }
+
+ if(strcmp((yyvsp[(6) - (6)].id), "link")==0) {
+ set = g_strdup_printf("%s->%s = ARG;",
+ root, (yyvsp[(4) - (6)].id));
+ } else if(strcmp((yyvsp[(6) - (6)].id), "stringlink")==0) {
+ set = g_strdup_printf("g_free (%s->%s); "
+ "%s->%s = g_strdup (ARG);",
+ root, (yyvsp[(4) - (6)].id),
+ root, (yyvsp[(4) - (6)].id));
+ } else if(strcmp((yyvsp[(6) - (6)].id), "objectlink")==0) {
+ set = g_strdup_printf(
+ "if (ARG != NULL) "
+ "g_object_ref (G_OBJECT (ARG)); "
+ "if (%s->%s != NULL) "
+ "g_object_unref (G_OBJECT (%s->%s)); "
+ "%s->%s = ARG;",
+ root, (yyvsp[(4) - (6)].id),
+ root, (yyvsp[(4) - (6)].id),
+ root, (yyvsp[(4) - (6)].id));
+ } else {
+ g_assert_not_reached();
+ }
+
+ get = g_strdup_printf("ARG = %s->%s;", root, (yyvsp[(4) - (6)].id));
+
+ g_free ((yyvsp[(6) - (6)].id));
+
+ if (type == NULL)
+ type = (Type *)node_copy ((Node *)var->vtype);
+
+ node = node_new (ARGUMENT_NODE,
+ "gtktype:steal", (yyvsp[(3) - (6)].id),
+ "atype:steal", type,
+ "flags:steal", (yyvsp[(2) - (6)].list),
+ "name:steal", (yyvsp[(4) - (6)].id),
+ "get:steal", get,
+ "get_line", (yyvsp[(1) - (6)].line),
+ "set:steal", set,
+ "set_line", (yyvsp[(1) - (6)].line),
+ "line_no", (yyvsp[(1) - (6)].line),
+ NULL);
+
+ if ((yyvsp[(5) - (6)].id) != NULL) {
+ Argument *arg = (Argument *)node;
+ export_accessors (arg->name,
+ arg->get != NULL, arg->get_line,
+ arg->set != NULL, arg->set_line,
+ arg->atype,
+ arg->gtktype,
+ arg->line_no);
+ g_free ((yyvsp[(5) - (6)].id));
+ }
+
+ class_nodes = g_list_append (class_nodes, node);
+ }
+ break;
+
+ case 60:
+#line 1201 "parse.y"
+ {
+ if (strcmp ((yyvsp[(2) - (3)].id), "export")!=0) {
+ g_free ((yyvsp[(2) - (3)].id));
+ yyerror (_("parse error"));
+ YYERROR;
+ }
+ (yyval.id) = (yyvsp[(2) - (3)].id);
+ }
+ break;
+
+ case 61:
+#line 1209 "parse.y"
+ {
+ (yyval.id) = NULL;
+ }
+ break;
+
+ case 62:
+#line 1214 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "line_no", (yyvsp[(1) - (11)].line),
+ "gtktype:steal", debool ((yyvsp[(2) - (11)].id)),
+ "name:steal", (yyvsp[(3) - (11)].id),
+ NULL);
+ if (strcmp ((yyvsp[(5) - (11)].id), "get") == 0 &&
+ strcmp ((yyvsp[(8) - (11)].id), "set") == 0) {
+ node_set ((Node *)property,
+ "get:steal", ((yyvsp[(7) - (11)].cbuf))->str,
+ "get_line", (yyvsp[(6) - (11)].line),
+ "set:steal", ((yyvsp[(10) - (11)].cbuf))->str,
+ "set_line", (yyvsp[(9) - (11)].line),
+ NULL);
+ g_string_free ((yyvsp[(7) - (11)].cbuf), FALSE);
+ g_string_free ((yyvsp[(10) - (11)].cbuf), FALSE);
+ g_free ((yyvsp[(5) - (11)].id));
+ g_free ((yyvsp[(8) - (11)].id));
+ } else if (strcmp ((yyvsp[(5) - (11)].id), "set") == 0 &&
+ strcmp ((yyvsp[(8) - (11)].id), "get") == 0) {
+ node_set ((Node *)property,
+ "get:steal", ((yyvsp[(10) - (11)].cbuf))->str,
+ "get_line", (yyvsp[(9) - (11)].line),
+ "set:steal", ((yyvsp[(7) - (11)].cbuf))->str,
+ "set_line", (yyvsp[(6) - (11)].line),
+ NULL);
+ g_string_free ((yyvsp[(7) - (11)].cbuf), FALSE);
+ g_string_free ((yyvsp[(10) - (11)].cbuf), FALSE);
+ g_free ((yyvsp[(5) - (11)].id));
+ g_free ((yyvsp[(8) - (11)].id));
+ } else {
+ g_string_free ((yyvsp[(7) - (11)].cbuf), TRUE);
+ g_string_free ((yyvsp[(10) - (11)].cbuf), TRUE);
+ g_free ((yyvsp[(5) - (11)].id));
+ g_free ((yyvsp[(8) - (11)].id));
+ node_free ((Node *)property);
+ property = NULL;
+ yyerror (_("parse error"));
+ YYERROR;
+ }
+ property_link_and_export ((Node *)property);
+ if (property != NULL) {
+ class_nodes = g_list_append (class_nodes,
+ property);
+ property = NULL;
+ }
+ }
+ break;
+
+ case 63:
+#line 1262 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "line_no", (yyvsp[(1) - (8)].line),
+ "gtktype:steal", debool ((yyvsp[(2) - (8)].id)),
+ "name:steal", (yyvsp[(3) - (8)].id),
+ NULL);
+ if (strcmp ((yyvsp[(5) - (8)].id), "get") == 0) {
+ node_set ((Node *)property,
+ "get:steal", ((yyvsp[(7) - (8)].cbuf))->str,
+ "get_line", (yyvsp[(6) - (8)].line),
+ NULL);
+ g_string_free ((yyvsp[(7) - (8)].cbuf), FALSE);
+ g_free ((yyvsp[(5) - (8)].id));
+ } else if (strcmp ((yyvsp[(5) - (8)].id), "set") == 0) {
+ node_set ((Node *)property,
+ "set:steal", ((yyvsp[(7) - (8)].cbuf))->str,
+ "set_line", (yyvsp[(6) - (8)].line),
+ NULL);
+ g_string_free ((yyvsp[(7) - (8)].cbuf), FALSE);
+ g_free ((yyvsp[(5) - (8)].id));
+ } else {
+ g_string_free ((yyvsp[(7) - (8)].cbuf), TRUE);
+ g_free ((yyvsp[(5) - (8)].id));
+ node_free ((Node *)property);
+ property = NULL;
+ yyerror (_("parse error"));
+ YYERROR;
+ }
+ property_link_and_export ((Node *)property);
+ if (property != NULL) {
+ class_nodes = g_list_append (class_nodes,
+ property);
+ property = NULL;
+ }
+ }
+ break;
+
+ case 64:
+#line 1298 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "line_no", (yyvsp[(1) - (5)].line),
+ "gtktype:steal", debool ((yyvsp[(2) - (5)].id)),
+ "name:steal", (yyvsp[(3) - (5)].id),
+ NULL);
+ property_link_and_export ((Node *)property);
+ if (property != NULL) {
+ class_nodes = g_list_append (class_nodes,
+ property);
+ property = NULL;
+ }
+ }
+ break;
+
+ case 65:
+#line 1314 "parse.y"
+ { ; }
+ break;
+
+ case 66:
+#line 1315 "parse.y"
+ { ; }
+ break;
+
+ case 67:
+#line 1318 "parse.y"
+ { ; }
+ break;
+
+ case 68:
+#line 1319 "parse.y"
+ { ; }
+ break;
+
+ case 69:
+#line 1322 "parse.y"
+ { (yyval.id) = (yyvsp[(1) - (1)].id); }
+ break;
+
+ case 70:
+#line 1323 "parse.y"
+ {
+ if (strcmp ((yyvsp[(1) - (4)].id), "_") != 0) {
+ g_free ((yyvsp[(1) - (4)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ g_free ((yyvsp[(1) - (4)].id));
+ (yyval.id) = g_strconcat ("_(", (yyvsp[(3) - (4)].id), ")", NULL);
+ g_free ((yyvsp[(3) - (4)].id));
+ }
+ break;
+
+ case 71:
+#line 1335 "parse.y"
+ { (yyval.id) = (yyvsp[(1) - (1)].id); }
+ break;
+
+ case 72:
+#line 1336 "parse.y"
+ { (yyval.id) = (yyvsp[(1) - (1)].id); }
+ break;
+
+ case 73:
+#line 1339 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "nick:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 74:
+#line 1345 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "blurb:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 75:
+#line 1351 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "maximum:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 76:
+#line 1357 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "minimum:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 77:
+#line 1363 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "default_value:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 78:
+#line 1369 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "flags:steal", (yyvsp[(3) - (3)].list),
+ NULL);
+ }
+ break;
+
+ case 79:
+#line 1375 "parse.y"
+ {
+ Type *type = pop_type ();
+ ensure_property ();
+ node_set ((Node *)property,
+ "ptype:steal", type,
+ NULL);
+ }
+ break;
+
+ case 80:
+#line 1382 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 81:
+#line 1388 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 82:
+#line 1394 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 83:
+#line 1400 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 84:
+#line 1406 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 85:
+#line 1412 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 86:
+#line 1418 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 87:
+#line 1424 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 88:
+#line 1430 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 89:
+#line 1436 "parse.y"
+ {
+ ensure_property ();
+ node_set ((Node *)property,
+ "extra_gtktype:steal", (yyvsp[(3) - (3)].id),
+ NULL);
+ }
+ break;
+
+ case 90:
+#line 1442 "parse.y"
+ {
+ ensure_property ();
+ if (strcmp ((yyvsp[(1) - (1)].id), "override") == 0) {
+ g_free((yyvsp[(1) - (1)].id));
+ node_set ((Node *)property,
+ "override", TRUE,
+ NULL);
+ } else if (strcmp ((yyvsp[(1) - (1)].id), "link") == 0) {
+ g_free((yyvsp[(1) - (1)].id));
+ node_set ((Node *)property,
+ "link", TRUE,
+ NULL);
+ } else if (strcmp ((yyvsp[(1) - (1)].id), "export") == 0) {
+ g_free((yyvsp[(1) - (1)].id));
+ node_set ((Node *)property,
+ "export", TRUE,
+ NULL);
+ } else {
+ g_free((yyvsp[(1) - (1)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 91:
+#line 1467 "parse.y"
+ {
+ if(strcmp((yyvsp[(3) - (5)].id),"type")!=0) {
+ g_free((yyvsp[(1) - (5)].id));
+ g_free((yyvsp[(3) - (5)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ (yyval.id) = debool ((yyvsp[(1) - (5)].id));
+ }
+ break;
+
+ case 92:
+#line 1476 "parse.y"
+ {
+ (yyval.id) = debool ((yyvsp[(1) - (1)].id));
+ typestack = g_list_prepend(typestack,NULL);
+ }
+ break;
+
+ case 93:
+#line 1482 "parse.y"
+ { (yyval.list) = (yyvsp[(2) - (3)].list); }
+ break;
+
+ case 94:
+#line 1483 "parse.y"
+ { (yyval.list) = NULL; }
+ break;
+
+ case 95:
+#line 1486 "parse.y"
+ {
+ (yyval.list) = g_list_append((yyvsp[(3) - (3)].list),(yyvsp[(1) - (3)].id));
+ }
+ break;
+
+ case 96:
+#line 1489 "parse.y"
+ {
+ (yyval.list) = g_list_append(NULL,(yyvsp[(1) - (1)].id));
+ }
+ break;
+
+ case 97:
+#line 1495 "parse.y"
+ {
+ Node *node = node_new (TYPE_NODE,
+ "name:steal", (yyvsp[(1) - (2)].id),
+ "pointer:steal", (yyvsp[(2) - (2)].id),
+ NULL);
+ typestack = g_list_prepend(typestack,node);
+ }
+ break;
+
+ case 98:
+#line 1502 "parse.y"
+ {
+ Node *node = node_new (TYPE_NODE,
+ "name:steal", (yyvsp[(1) - (1)].id),
+ NULL);
+ typestack = g_list_prepend(typestack,node);
+ }
+ break;
+
+ case 99:
+#line 1511 "parse.y"
+ {
+ (yyval.id) = (yyvsp[(1) - (1)].id);
+ }
+ break;
+
+ case 100:
+#line 1514 "parse.y"
+ {
+ (yyval.id) = (yyvsp[(1) - (1)].id);
+ }
+ break;
+
+ case 101:
+#line 1517 "parse.y"
+ {
+ (yyval.id) = g_strconcat("const ", (yyvsp[(2) - (2)].id), NULL);
+ g_free((yyvsp[(2) - (2)].id));
+ }
+ break;
+
+ case 102:
+#line 1521 "parse.y"
+ {
+ (yyval.id) = g_strconcat((yyvsp[(1) - (2)].id), " const", NULL);
+ g_free((yyvsp[(1) - (2)].id));
+ }
+ break;
+
+ case 103:
+#line 1525 "parse.y"
+ {
+ (yyval.id) = g_strconcat((yyvsp[(1) - (2)].id), " ", (yyvsp[(2) - (2)].id), NULL);
+ g_free((yyvsp[(2) - (2)].id));
+ }
+ break;
+
+ case 104:
+#line 1529 "parse.y"
+ {
+ (yyval.id) = g_strconcat("const ", (yyvsp[(2) - (3)].id), " ",
+ (yyvsp[(3) - (3)].id), NULL);
+ g_free((yyvsp[(3) - (3)].id));
+ }
+ break;
+
+ case 105:
+#line 1534 "parse.y"
+ {
+ (yyval.id) = g_strconcat((yyvsp[(1) - (3)].id), " ",
+ (yyvsp[(2) - (3)].id), " const", NULL);
+ g_free((yyvsp[(2) - (3)].id));
+ }
+ break;
+
+ case 106:
+#line 1542 "parse.y"
+ {
+ (yyval.id) = g_strconcat((yyvsp[(1) - (2)].id), " ", (yyvsp[(2) - (2)].id), NULL);
+ g_free((yyvsp[(2) - (2)].id));
+ }
+ break;
+
+ case 107:
+#line 1546 "parse.y"
+ {
+ (yyval.id) = g_strconcat((yyvsp[(1) - (2)].id), " ", (yyvsp[(2) - (2)].id), NULL);
+ g_free((yyvsp[(1) - (2)].id));
+ g_free((yyvsp[(2) - (2)].id));
+ }
+ break;
+
+ case 108:
+#line 1551 "parse.y"
+ {
+ (yyval.id) = g_strconcat("const ", (yyvsp[(2) - (2)].id), NULL);
+ g_free((yyvsp[(2) - (2)].id));
+ }
+ break;
+
+ case 109:
+#line 1555 "parse.y"
+ {
+ (yyval.id) = (yyvsp[(1) - (1)].id);
+ }
+ break;
+
+ case 110:
+#line 1558 "parse.y"
+ {
+ (yyval.id) = g_strconcat((yyvsp[(1) - (2)].id), " const", NULL);
+ g_free((yyvsp[(1) - (2)].id));
+ }
+ break;
+
+ case 111:
+#line 1562 "parse.y"
+ {
+ (yyval.id) = g_strdup((yyvsp[(1) - (1)].id));
+ }
+ break;
+
+ case 112:
+#line 1565 "parse.y"
+ {
+ (yyval.id) = g_strconcat((yyvsp[(1) - (2)].id), " const", NULL);
+ }
+ break;
+
+ case 113:
+#line 1570 "parse.y"
+ { (yyval.id) = "void"; }
+ break;
+
+ case 114:
+#line 1571 "parse.y"
+ { (yyval.id) = "char"; }
+ break;
+
+ case 115:
+#line 1572 "parse.y"
+ { (yyval.id) = "short"; }
+ break;
+
+ case 116:
+#line 1573 "parse.y"
+ { (yyval.id) = "int"; }
+ break;
+
+ case 117:
+#line 1574 "parse.y"
+ { (yyval.id) = "long"; }
+ break;
+
+ case 118:
+#line 1575 "parse.y"
+ { (yyval.id) = "float"; }
+ break;
+
+ case 119:
+#line 1576 "parse.y"
+ { (yyval.id) = "double"; }
+ break;
+
+ case 120:
+#line 1577 "parse.y"
+ { (yyval.id) = "signed"; }
+ break;
+
+ case 121:
+#line 1578 "parse.y"
+ { (yyval.id) = "unsigned"; }
+ break;
+
+ case 122:
+#line 1581 "parse.y"
+ { (yyval.id) = "struct"; }
+ break;
+
+ case 123:
+#line 1582 "parse.y"
+ { (yyval.id) = "union"; }
+ break;
+
+ case 124:
+#line 1583 "parse.y"
+ { (yyval.id) = "enum"; }
+ break;
+
+ case 125:
+#line 1586 "parse.y"
+ { (yyval.id) = g_strdup("*"); }
+ break;
+
+ case 126:
+#line 1587 "parse.y"
+ { (yyval.id) = g_strdup("* const"); }
+ break;
+
+ case 127:
+#line 1588 "parse.y"
+ {
+ (yyval.id) = g_strconcat("*", (yyvsp[(2) - (2)].id), NULL);
+ g_free((yyvsp[(2) - (2)].id));
+ }
+ break;
+
+ case 128:
+#line 1592 "parse.y"
+ {
+ (yyval.id) = g_strconcat("* const", (yyvsp[(3) - (3)].id), NULL);
+ g_free((yyvsp[(3) - (3)].id));
+ }
+ break;
+
+ case 129:
+#line 1599 "parse.y"
+ {
+ if(strcmp((yyvsp[(1) - (2)].id), "first")==0)
+ (yyval.sigtype) = SIGNAL_FIRST_METHOD;
+ else if(strcmp((yyvsp[(1) - (2)].id), "last")==0)
+ (yyval.sigtype) = SIGNAL_LAST_METHOD;
+ else {
+ yyerror(_("signal must be 'first' or 'last'"));
+ g_free((yyvsp[(1) - (2)].id));
+ YYERROR;
+ }
+ g_free((yyvsp[(1) - (2)].id));
+ }
+ break;
+
+ case 130:
+#line 1611 "parse.y"
+ {
+ (yyval.sigtype) = SIGNAL_LAST_METHOD;
+ }
+ break;
+
+ case 131:
+#line 1617 "parse.y"
+ {
+ if(strcmp((yyvsp[(2) - (3)].id),"first")==0)
+ (yyval.sigtype) = SIGNAL_FIRST_METHOD;
+ else if(strcmp((yyvsp[(2) - (3)].id),"last")==0)
+ (yyval.sigtype) = SIGNAL_LAST_METHOD;
+ else {
+ yyerror(_("signal must be 'first' or 'last'"));
+ g_free((yyvsp[(2) - (3)].id));
+ YYERROR;
+ }
+ g_free((yyvsp[(2) - (3)].id));
+ }
+ break;
+
+ case 132:
+#line 1629 "parse.y"
+ {
+ if(strcmp((yyvsp[(1) - (3)].id),"first")==0)
+ (yyval.sigtype) = SIGNAL_FIRST_METHOD;
+ else if(strcmp((yyvsp[(1) - (3)].id),"last")==0)
+ (yyval.sigtype) = SIGNAL_LAST_METHOD;
+ else {
+ yyerror(_("signal must be 'first' or 'last'"));
+ g_free((yyvsp[(1) - (3)].id));
+ YYERROR;
+ }
+ g_free((yyvsp[(1) - (3)].id));
+ }
+ break;
+
+ case 133:
+#line 1641 "parse.y"
+ {
+ (yyval.sigtype) = SIGNAL_LAST_METHOD;
+ }
+ break;
+
+ case 134:
+#line 1644 "parse.y"
+ {
+ /* the_scope was default thus public */
+ the_scope = PUBLIC_SCOPE;
+ }
+ break;
+
+ case 135:
+#line 1650 "parse.y"
+ {
+ gtktypes = g_list_prepend(gtktypes, debool ((yyvsp[(1) - (4)].id)));
+ }
+ break;
+
+ case 136:
+#line 1655 "parse.y"
+ {
+ gtktypes = g_list_append(gtktypes, debool ((yyvsp[(3) - (3)].id)));
+ }
+ break;
+
+ case 137:
+#line 1658 "parse.y"
+ {
+ gtktypes = g_list_append(gtktypes, debool ((yyvsp[(1) - (1)].id)));
+ }
+ break;
+
+ case 138:
+#line 1663 "parse.y"
+ { (yyval.cbuf) = (yyvsp[(2) - (2)].cbuf); }
+ break;
+
+ case 139:
+#line 1664 "parse.y"
+ { (yyval.cbuf) = NULL; }
+ break;
+
+ case 140:
+#line 1668 "parse.y"
+ {
+ if(!has_self) {
+ yyerror(_("signal without 'self' as "
+ "first parameter"));
+ free_all_global_state();
+ YYERROR;
+ }
+ if(the_scope == CLASS_SCOPE) {
+ yyerror(_("a method cannot be of class scope"));
+ free_all_global_state();
+ YYERROR;
+ }
+ push_function(the_scope, (yyvsp[(3) - (10)].sigtype),NULL,
+ (yyvsp[(5) - (10)].id), (yyvsp[(10) - (10)].cbuf),(yyvsp[(1) - (10)].line),
+ ccode_line, vararg, (yyvsp[(2) - (10)].list));
+ }
+ break;
+
+ case 141:
+#line 1684 "parse.y"
+ {
+ if(!has_self) {
+ yyerror(_("signal without 'self' as "
+ "first parameter"));
+ free_all_global_state();
+ YYERROR;
+ }
+ if(the_scope == CLASS_SCOPE) {
+ yyerror(_("a method cannot be of class scope"));
+ free_all_global_state();
+ YYERROR;
+ }
+ push_function(the_scope, (yyvsp[(4) - (11)].sigtype), NULL,
+ (yyvsp[(6) - (11)].id), (yyvsp[(11) - (11)].cbuf), (yyvsp[(2) - (11)].line),
+ ccode_line, vararg, (yyvsp[(3) - (11)].list));
+ }
+ break;
+
+ case 142:
+#line 1700 "parse.y"
+ {
+ if(!has_self) {
+ yyerror(_("virtual method without 'self' as "
+ "first parameter"));
+ free_all_global_state();
+ YYERROR;
+ }
+ if(the_scope == CLASS_SCOPE) {
+ yyerror(_("a method cannot be of class scope"));
+ free_all_global_state();
+ YYERROR;
+ }
+ push_function(the_scope, VIRTUAL_METHOD, NULL, (yyvsp[(4) - (9)].id),
+ (yyvsp[(9) - (9)].cbuf), (yyvsp[(1) - (9)].line),
+ ccode_line, vararg, NULL);
+ }
+ break;
+
+ case 143:
+#line 1716 "parse.y"
+ {
+ if(!has_self) {
+ yyerror(_("virtual method without 'self' as "
+ "first parameter"));
+ free_all_global_state();
+ YYERROR;
+ }
+ if(the_scope == CLASS_SCOPE) {
+ yyerror(_("a method cannot be of class scope"));
+ free_all_global_state();
+ YYERROR;
+ }
+ push_function(the_scope, VIRTUAL_METHOD, NULL, (yyvsp[(4) - (9)].id),
+ (yyvsp[(9) - (9)].cbuf), (yyvsp[(2) - (9)].line),
+ ccode_line, vararg, NULL);
+ }
+ break;
+
+ case 144:
+#line 1732 "parse.y"
+ {
+ if(!has_self) {
+ yyerror(_("virtual method without 'self' as "
+ "first parameter"));
+ free_all_global_state();
+ YYERROR;
+ }
+ push_function(PUBLIC_SCOPE, VIRTUAL_METHOD, NULL,
+ (yyvsp[(3) - (8)].id), (yyvsp[(8) - (8)].cbuf), (yyvsp[(1) - (8)].line),
+ ccode_line, vararg, NULL);
+ }
+ break;
+
+ case 145:
+#line 1743 "parse.y"
+ {
+ push_function(NO_SCOPE, OVERRIDE_METHOD, (yyvsp[(3) - (11)].id),
+ (yyvsp[(6) - (11)].id), (yyvsp[(11) - (11)].cbuf),
+ (yyvsp[(1) - (11)].line), ccode_line,
+ vararg, NULL);
+ }
+ break;
+
+ case 146:
+#line 1749 "parse.y"
+ {
+ if(the_scope == CLASS_SCOPE) {
+ yyerror(_("a method cannot be of class scope"));
+ free_all_global_state();
+ YYERROR;
+ }
+ push_function(the_scope, REGULAR_METHOD, NULL, (yyvsp[(3) - (8)].id),
+ (yyvsp[(8) - (8)].cbuf), (yyvsp[(1) - (8)].line), ccode_line,
+ vararg, NULL);
+ }
+ break;
+
+ case 147:
+#line 1759 "parse.y"
+ {
+ if(strcmp((yyvsp[(1) - (5)].id), "init")==0) {
+ push_init_arg((yyvsp[(3) - (5)].id),FALSE);
+ push_function(NO_SCOPE, INIT_METHOD, NULL,
+ (yyvsp[(1) - (5)].id), (yyvsp[(5) - (5)].cbuf), (yyvsp[(2) - (5)].line),
+ ccode_line, FALSE, NULL);
+ } else if(strcmp((yyvsp[(1) - (5)].id), "class_init")==0) {
+ push_init_arg((yyvsp[(3) - (5)].id),TRUE);
+ push_function(NO_SCOPE, CLASS_INIT_METHOD, NULL,
+ (yyvsp[(1) - (5)].id), (yyvsp[(5) - (5)].cbuf), (yyvsp[(2) - (5)].line),
+ ccode_line, FALSE, NULL);
+ } else {
+ g_free((yyvsp[(1) - (5)].id));
+ g_free((yyvsp[(3) - (5)].id));
+ g_string_free((yyvsp[(5) - (5)].cbuf),TRUE);
+ yyerror(_("parse error "
+ "(untyped blocks must be init or "
+ "class_init)"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 148:
+#line 1782 "parse.y"
+ {
+ g_free(onerror); onerror = NULL;
+ g_free(defreturn); defreturn = NULL;
+ if(!set_return_value((yyvsp[(1) - (2)].id), (yyvsp[(2) - (2)].id))) {
+ g_free((yyvsp[(1) - (2)].id));
+ g_free((yyvsp[(2) - (2)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ g_free((yyvsp[(1) - (2)].id));
+ }
+ break;
+
+ case 149:
+#line 1793 "parse.y"
+ {
+ g_free(onerror); onerror = NULL;
+ g_free(defreturn); defreturn = NULL;
+ if(!set_return_value((yyvsp[(1) - (4)].id), (yyvsp[(2) - (4)].id))) {
+ g_free((yyvsp[(1) - (4)].id)); g_free((yyvsp[(2) - (4)].id));
+ g_free((yyvsp[(3) - (4)].id)); g_free((yyvsp[(4) - (4)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ if(!set_return_value((yyvsp[(3) - (4)].id), (yyvsp[(4) - (4)].id))) {
+ onerror = defreturn = NULL;
+ g_free((yyvsp[(1) - (4)].id)); g_free((yyvsp[(2) - (4)].id));
+ g_free((yyvsp[(3) - (4)].id)); g_free((yyvsp[(4) - (4)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ g_free((yyvsp[(1) - (4)].id));
+ g_free((yyvsp[(3) - (4)].id));
+ }
+ break;
+
+ case 150:
+#line 1812 "parse.y"
+ {
+ g_free(onerror); onerror = NULL;
+ g_free(defreturn); defreturn = NULL;
+ }
+ break;
+
+ case 151:
+#line 1818 "parse.y"
+ { (yyval.id) = (yyvsp[(1) - (1)].id); }
+ break;
+
+ case 152:
+#line 1819 "parse.y"
+ {
+ (yyval.id) = ((yyvsp[(2) - (2)].cbuf))->str;
+ g_string_free((yyvsp[(2) - (2)].cbuf), FALSE);
+ }
+ break;
+
+ case 153:
+#line 1825 "parse.y"
+ { vararg = FALSE; has_self = FALSE; }
+ break;
+
+ case 154:
+#line 1826 "parse.y"
+ {
+ vararg = FALSE;
+ has_self = TRUE;
+ if(strcmp((yyvsp[(1) - (1)].id),"self")==0)
+ push_self((yyvsp[(1) - (1)].id), FALSE);
+ else {
+ g_free((yyvsp[(1) - (1)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 155:
+#line 1837 "parse.y"
+ {
+ vararg = FALSE;
+ has_self = TRUE;
+ if(strcmp((yyvsp[(1) - (2)].id),"self")==0)
+ push_self((yyvsp[(1) - (2)].id), TRUE);
+ else {
+ g_free((yyvsp[(1) - (2)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 156:
+#line 1848 "parse.y"
+ {
+ vararg = FALSE;
+ has_self = TRUE;
+ if(strcmp((yyvsp[(2) - (2)].id),"self")==0)
+ push_self((yyvsp[(2) - (2)].id), TRUE);
+ else {
+ g_free((yyvsp[(2) - (2)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 157:
+#line 1859 "parse.y"
+ {
+ has_self = TRUE;
+ if(strcmp((yyvsp[(1) - (3)].id),"self")==0)
+ push_self((yyvsp[(1) - (3)].id), FALSE);
+ else {
+ g_free((yyvsp[(1) - (3)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 158:
+#line 1869 "parse.y"
+ {
+ has_self = TRUE;
+ if(strcmp((yyvsp[(1) - (4)].id),"self")==0)
+ push_self((yyvsp[(1) - (4)].id), TRUE);
+ else {
+ g_free((yyvsp[(1) - (4)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 159:
+#line 1879 "parse.y"
+ {
+ has_self = TRUE;
+ if(strcmp((yyvsp[(2) - (4)].id),"self")==0)
+ push_self((yyvsp[(2) - (4)].id), TRUE);
+ else {
+ g_free((yyvsp[(2) - (4)].id));
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ }
+ break;
+
+ case 160:
+#line 1889 "parse.y"
+ { has_self = FALSE; }
+ break;
+
+ case 161:
+#line 1892 "parse.y"
+ { vararg = TRUE; }
+ break;
+
+ case 162:
+#line 1893 "parse.y"
+ { vararg = FALSE; }
+ break;
+
+ case 163:
+#line 1896 "parse.y"
+ { ; }
+ break;
+
+ case 164:
+#line 1897 "parse.y"
+ { ; }
+ break;
+
+ case 165:
+#line 1900 "parse.y"
+ {
+ push_funcarg((yyvsp[(2) - (2)].id),NULL);
+ }
+ break;
+
+ case 166:
+#line 1903 "parse.y"
+ {
+ push_funcarg((yyvsp[(2) - (3)].id),(yyvsp[(3) - (3)].id));
+ }
+ break;
+
+ case 167:
+#line 1906 "parse.y"
+ {
+ if(strcmp((yyvsp[(4) - (6)].id),"check")!=0) {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ g_free((yyvsp[(4) - (6)].id));
+ push_funcarg((yyvsp[(2) - (6)].id),NULL);
+ }
+ break;
+
+ case 168:
+#line 1914 "parse.y"
+ {
+ if(strcmp((yyvsp[(5) - (7)].id),"check")!=0) {
+ yyerror(_("parse error"));
+ YYERROR;
+ }
+ g_free((yyvsp[(5) - (7)].id));
+ push_funcarg((yyvsp[(2) - (7)].id),(yyvsp[(3) - (7)].id));
+ }
+ break;
+
+ case 169:
+#line 1924 "parse.y"
+ { ; }
+ break;
+
+ case 170:
+#line 1925 "parse.y"
+ { ; }
+ break;
+
+ case 171:
+#line 1928 "parse.y"
+ {
+ if(strcmp((yyvsp[(1) - (1)].id),"type")==0) {
+ Node *node = node_new (CHECK_NODE,
+ "chtype", TYPE_CHECK,
+ NULL);