From 74ea37fbd83a0d381ae928c7f7e30d0ded875cc0 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 25 Sep 2012 18:51:04 +0100 Subject: put return type in argument list so we can have multiple prototypes per operation (method) --- src/jsapi-libdom.c | 12 ++++++------ src/webidl-ast.c | 6 +++--- src/webidl-ast.h | 2 +- src/webidl-parser.y | 53 +++++++++++++++++++++++++++++------------------------ 4 files changed, 39 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index 13af77b..00b56a9 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -153,7 +153,7 @@ generate_property_spec(FILE *outfile, members_node = webidl_node_find(webidl_node_getnode(interface_node), NULL, webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS); + (void *)WEBIDL_NODE_TYPE_LIST); while (members_node != NULL) { @@ -170,7 +170,7 @@ generate_property_spec(FILE *outfile, members_node = webidl_node_find(webidl_node_getnode(interface_node), members_node, webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS); + (void *)WEBIDL_NODE_TYPE_LIST); } /* check for inherited nodes and insert them too */ @@ -253,7 +253,7 @@ generate_function_spec(FILE *outfile, members_node = webidl_node_find(webidl_node_getnode(interface_node), NULL, webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS); + (void *)WEBIDL_NODE_TYPE_LIST); while (members_node != NULL) { fprintf(outfile," /**** %s ****/\n", interface); @@ -267,7 +267,7 @@ generate_function_spec(FILE *outfile, members_node = webidl_node_find(webidl_node_getnode(interface_node), members_node, webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS); + (void *)WEBIDL_NODE_TYPE_LIST); } /* check for inherited nodes and insert them too */ @@ -352,7 +352,7 @@ generate_function_body(FILE *outfile, members_node = webidl_node_find(webidl_node_getnode(interface_node), NULL, webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS); + (void *)WEBIDL_NODE_TYPE_LIST); while (members_node != NULL) { fprintf(outfile,"/**** %s ****/\n", interface); @@ -366,7 +366,7 @@ generate_function_body(FILE *outfile, members_node = webidl_node_find(webidl_node_getnode(interface_node), members_node, webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS); + (void *)WEBIDL_NODE_TYPE_LIST); } /* check for inherited nodes and insert them too */ diff --git a/src/webidl-ast.c b/src/webidl-ast.c index 91da839..a5f2d23 100644 --- a/src/webidl-ast.c +++ b/src/webidl-ast.c @@ -195,7 +195,7 @@ struct webidl_node *webidl_node_getnode(struct webidl_node *node) switch (node->type) { case WEBIDL_NODE_TYPE_ROOT: case WEBIDL_NODE_TYPE_INTERFACE: - case WEBIDL_NODE_TYPE_INTERFACE_MEMBERS: + case WEBIDL_NODE_TYPE_LIST: case WEBIDL_NODE_TYPE_ATTRIBUTE: case WEBIDL_NODE_TYPE_OPERATION: case WEBIDL_NODE_TYPE_OPTIONAL_ARGUMENT: @@ -225,8 +225,8 @@ static const char *webidl_node_type_to_str(enum webidl_node_type type) case WEBIDL_NODE_TYPE_INTERFACE: return "Interface"; - case WEBIDL_NODE_TYPE_INTERFACE_MEMBERS: - return "Members"; + case WEBIDL_NODE_TYPE_LIST: + return "List"; case WEBIDL_NODE_TYPE_ATTRIBUTE: return "Attribute"; diff --git a/src/webidl-ast.h b/src/webidl-ast.h index c41149d..ac3586f 100644 --- a/src/webidl-ast.h +++ b/src/webidl-ast.h @@ -13,7 +13,7 @@ enum webidl_node_type { WEBIDL_NODE_TYPE_ROOT = 0, WEBIDL_NODE_TYPE_IDENT, WEBIDL_NODE_TYPE_INTERFACE, - WEBIDL_NODE_TYPE_INTERFACE_MEMBERS, + WEBIDL_NODE_TYPE_LIST, /* a list of nodes (interface members, arguments) */ WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE, WEBIDL_NODE_TYPE_ATTRIBUTE, WEBIDL_NODE_TYPE_OPERATION, diff --git a/src/webidl-parser.y b/src/webidl-parser.y index 69fbef5..fef57dd 100644 --- a/src/webidl-parser.y +++ b/src/webidl-parser.y @@ -168,8 +168,8 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char *str) /* default rule to add built AST to passed in one */ Input: Definitions - { - *webidl_ast = webidl_node_prepend(*webidl_ast, $1); + { + *webidl_ast = webidl_node_prepend(*webidl_ast, $1); } | error @@ -235,8 +235,8 @@ Interface: /* extend interface with additional members */ struct webidl_node *interface_node; interface_node = webidl_node_find_type_ident(*webidl_ast, - WEBIDL_NODE_TYPE_INTERFACE, - $2); + WEBIDL_NODE_TYPE_INTERFACE, + $2); if (interface_node == NULL) { struct webidl_node *members; struct webidl_node *ident; @@ -246,7 +246,7 @@ Interface: inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE, NULL, $3); } - members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS, inheritance, $5); + members = webidl_node_new(WEBIDL_NODE_TYPE_LIST, inheritance, $5); ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2); @@ -259,13 +259,13 @@ Interface: inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE, inheritance, $3); } - members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS, + members = webidl_node_new(WEBIDL_NODE_TYPE_LIST, inheritance, $5); /* link member node into interfaces_node */ - webidl_node_set(interface_node, - WEBIDL_NODE_TYPE_INTERFACE, + webidl_node_set(interface_node, + WEBIDL_NODE_TYPE_INTERFACE, members); $$ = NULL; /* updated existing interface do not add it again */ } @@ -294,14 +294,14 @@ PartialInterface: /* extend interface with additional members */ struct webidl_node *interface_node; interface_node = webidl_node_find_type_ident(*webidl_ast, - WEBIDL_NODE_TYPE_INTERFACE, - $2); + WEBIDL_NODE_TYPE_INTERFACE, + $2); if (interface_node == NULL) { /* doesnt already exist so create it */ struct webidl_node *members; struct webidl_node *ident; - members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS, NULL, $4); + members = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $4); ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2); @@ -309,13 +309,13 @@ PartialInterface: } else { struct webidl_node *members; - members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS, + members = webidl_node_new(WEBIDL_NODE_TYPE_LIST, webidl_node_getnode(interface_node), $4); /* link member node into interfaces_node */ - webidl_node_set(interface_node, - WEBIDL_NODE_TYPE_INTERFACE, + webidl_node_set(interface_node, + WEBIDL_NODE_TYPE_INTERFACE, members); $$ = NULL; /* updated existing interface do not add it again */ @@ -580,9 +580,14 @@ Special: OperationRest: ReturnType OptionalIdentifier '(' ArgumentList ')' ';' { - struct webidl_node *operation = $4; /* argument list */ + struct webidl_node *operation; + struct webidl_node *arglist; + + /* put return type in argument list */ + arglist = webidl_node_prepend($4, $1); - operation = webidl_node_prepend(operation, $1); /* return type */ + /* argument list */ + operation = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, arglist); operation = webidl_node_prepend(operation, $2); /* identifier */ @@ -605,7 +610,7 @@ OptionalIdentifier: /* [41] an empty list or a list of non empty comma separated arguments, note - * this is right associative so the tree build is ass backwards + * this is right associative so the tree build is ass backwards */ ArgumentList: /* empty */ @@ -922,7 +927,7 @@ OtherOrComma: Type: SingleType { - $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE, NULL, $1); + $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE, NULL, $1); } | UnionType TypeSuffix @@ -1031,8 +1036,8 @@ PrimitiveType: UnrestrictedFloatType: TOK_UNRESTRICTED FloatType { - $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_MODIFIER, - $2, + $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_MODIFIER, + $2, (void *)WEBIDL_TYPE_MODIFIER_UNRESTRICTED); } | @@ -1056,8 +1061,8 @@ FloatType: UnsignedIntegerType: TOK_UNSIGNED IntegerType { - $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_MODIFIER, - $2, + $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_MODIFIER, + $2, (void *)WEBIDL_TYPE_MODIFIER_UNSIGNED); } | @@ -1086,7 +1091,7 @@ OptionalLong: /* empty */ { $$ = false; - } + } | TOK_LONG { @@ -1125,7 +1130,7 @@ ReturnType: { struct webidl_node *type; type = webidl_node_new(WEBIDL_NODE_TYPE_TYPE_BASE, NULL, (void *)WEBIDL_TYPE_VOID); - $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE, NULL, type); + $$ = webidl_node_new(WEBIDL_NODE_TYPE_TYPE, NULL, type); } ; -- cgit v1.2.3