Gitweb links:
...log
http://git.netsurf-browser.org/nsgenjsbind.git/shortlog/d58d0289a7b7817e2...
...commit
http://git.netsurf-browser.org/nsgenjsbind.git/commit/d58d0289a7b7817e2d9...
...tree
http://git.netsurf-browser.org/nsgenjsbind.git/tree/d58d0289a7b7817e2d96f...
The branch, master has been updated
via d58d0289a7b7817e2d96f4666ebb370add8d1a81 (commit)
via 2133ce26a2ec07fb37a5f4cc6cab5326fdf49546 (commit)
from 94259becfc4441d9061c6f34f3e801dda834d01d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/nsgenjsbind.git/commitdiff/d58d0289a7b7817...
commit d58d0289a7b7817e2d96f4666ebb370add8d1a81
Author: Vincent Sanders <vincent.sanders(a)collabora.co.uk>
Commit: Vincent Sanders <vincent.sanders(a)collabora.co.uk>
cope with partial interfaces
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c
index 54c548c..aba6bdf 100644
--- a/src/jsapi-libdom.c
+++ b/src/jsapi-libdom.c
@@ -122,7 +122,7 @@ static int webidl_property_spec_cb(struct webidl_node *node, void
*ctx)
return 1;
} else {
fprintf(outfile,
- " JSAPI_PS(%s, 0, JSPROP_ENUMERATE | JSPROP_SHARED),\n",
+ " JSAPI_PS(%s, 0, JSPROP_ENUMERATE | JSPROP_SHARED),\n",
webidl_node_gettext(ident_node));
}
return 0;
@@ -137,6 +137,7 @@ generate_property_spec(FILE *outfile,
struct webidl_node *members_node;
struct webidl_node *inherit_node;
+
/* find interface in webidl with correct ident attached */
interface_node = webidl_node_find_type_ident(webidl_ast,
WEBIDL_NODE_TYPE_INTERFACE,
@@ -153,21 +154,25 @@ generate_property_spec(FILE *outfile,
NULL,
webidl_cmp_node_type,
(void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
- if (members_node == NULL) {
- fprintf(stderr,
- "Unable to find members within interface %s\n",
- interface);
- return -1;
- }
+ while (members_node != NULL) {
+
+ fprintf(outfile," /**** %s ****/\n", interface);
+
+
+ /* for each function emit a JSAPI_FS()*/
+ webidl_node_for_each_type(webidl_node_getnode(members_node),
+ WEBIDL_NODE_TYPE_ATTRIBUTE,
+ webidl_property_spec_cb,
+ outfile);
- /* for each function emit a JSAPI_FS()*/
- webidl_node_for_each_type(webidl_node_getnode(members_node),
- WEBIDL_NODE_TYPE_ATTRIBUTE,
- webidl_property_spec_cb,
- outfile);
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ members_node,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+ }
/* check for inherited nodes and insert them too */
inherit_node = webidl_node_find(webidl_node_getnode(interface_node),
NULL,
@@ -195,7 +200,7 @@ output_property_spec(FILE *outfile,
res = generate_property_spec(outfile, binding->interface, webidl_ast);
- fprintf(outfile, " JSAPI_PS_END\n};\n");
+ fprintf(outfile, " JSAPI_PS_END\n};\n");
return res;
}
@@ -217,7 +222,7 @@ static int webidl_func_spec_cb(struct webidl_node *node, void *ctx)
*/
} else {
fprintf(outfile,
- " JSAPI_FS(%s, 0, 0),\n",
+ " JSAPI_FS(%s, 0, 0),\n",
webidl_node_gettext(ident_node));
}
return 0;
@@ -232,6 +237,7 @@ generate_function_spec(FILE *outfile,
struct webidl_node *members_node;
struct webidl_node *inherit_node;
+
/* find interface in webidl with correct ident attached */
interface_node = webidl_node_find_type_ident(webidl_ast,
WEBIDL_NODE_TYPE_INTERFACE,
@@ -248,20 +254,21 @@ generate_function_spec(FILE *outfile,
NULL,
webidl_cmp_node_type,
(void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
- if (members_node == NULL) {
- fprintf(stderr,
- "Unable to find members within interface %s\n",
- interface);
- return -1;
- }
+ while (members_node != NULL) {
+ fprintf(outfile," /**** %s ****/\n", interface);
- /* for each function emit a JSAPI_FS()*/
- webidl_node_for_each_type(webidl_node_getnode(members_node),
- WEBIDL_NODE_TYPE_OPERATION,
- webidl_func_spec_cb,
- outfile);
+ /* for each function emit a JSAPI_FS()*/
+ webidl_node_for_each_type(webidl_node_getnode(members_node),
+ WEBIDL_NODE_TYPE_OPERATION,
+ webidl_func_spec_cb,
+ outfile);
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ members_node,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+ }
/* check for inherited nodes and insert them too */
inherit_node = webidl_node_find(webidl_node_getnode(interface_node),
diff --git a/src/webidl-ast.c b/src/webidl-ast.c
index 396fd4b..aa8e279 100644
--- a/src/webidl-ast.c
+++ b/src/webidl-ast.c
@@ -20,6 +20,15 @@ extern int webidl__flex_debug;
extern void webidl_restart(FILE*);
extern int webidl_parse(struct webidl_node **webidl_ast);
+struct webidl_node {
+ enum webidl_node_type type;
+ struct webidl_node *l;
+ union {
+ void *value;
+ struct webidl_node *node;
+ char *text;
+ } r;
+};
struct webidl_node *
@@ -42,6 +51,12 @@ struct webidl_node *webidl_node_new(enum webidl_node_type type, struct
webidl_no
return nn;
}
+void
+webidl_node_set(struct webidl_node *node, enum webidl_node_type type, void *r)
+{
+ node->type = type;
+ node->r.value = r;
+}
int
webidl_node_for_each_type(struct webidl_node *node,
@@ -76,7 +91,7 @@ webidl_node_find(struct webidl_node *node,
{
struct webidl_node *ret;
- if (node == NULL) {
+ if ((node == NULL) || (node == prev)){
return NULL;
}
@@ -150,17 +165,20 @@ char *webidl_node_gettext(struct webidl_node *node)
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_ATTRIBUTE:
- case WEBIDL_NODE_TYPE_OPERATION:
- return node->r.node;
-
- default:
- return NULL;
+ if (node != NULL) {
+ switch (node->type) {
+ case WEBIDL_NODE_TYPE_ROOT:
+ case WEBIDL_NODE_TYPE_INTERFACE:
+ case WEBIDL_NODE_TYPE_INTERFACE_MEMBERS:
+ case WEBIDL_NODE_TYPE_ATTRIBUTE:
+ case WEBIDL_NODE_TYPE_OPERATION:
+ return node->r.node;
+ default:
+ break;
+ }
}
+ return NULL;
+
}
static const char *webidl_node_type_to_str(enum webidl_node_type type)
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 682bb27..b421615 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -19,14 +19,7 @@ enum webidl_node_type {
WEBIDL_NODE_TYPE_OPERATION,
};
-struct webidl_node {
- enum webidl_node_type type;
- struct webidl_node *l;
- union {
- struct webidl_node *node;
- char *text;
- } r;
-};
+struct webidl_node;
/** callback for search and iteration routines */
typedef int (webidl_callback_t)(struct webidl_node *node, void *ctx);
@@ -35,6 +28,8 @@ int webidl_cmp_node_type(struct webidl_node *node, void *ctx);
struct webidl_node *webidl_node_new(enum webidl_node_type, struct webidl_node *l, void
*r);
+void webidl_node_set(struct webidl_node *node, enum webidl_node_type type, void *r);
+
struct webidl_node *webidl_node_link(struct webidl_node *tgt, struct webidl_node *src);
/* node contents acessors */
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index f0f1830..d9be0b9 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -113,7 +113,6 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const
char *str)
%type <node> Partial
%type <node> PartialDefinition
-%type <node> PartialInterface
%type <node> Dictionary
%type <node> PartialDictionary
@@ -122,9 +121,11 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const
char *str)
%type <node> Enum
%type <node> Typedef
%type <node> ImplementsStatement
+
%type <node> Interface
%type <node> InterfaceMembers
%type <node> InterfaceMember
+%type <node> PartialInterface
%type <node> CallbackOrInterface
%type <node> CallbackRest
@@ -137,7 +138,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const
char *str)
%type <node> Operation
%type <node> OperationRest
-%type <node> OptionalIdentifier
+%type <text> OptionalIdentifier
%%
@@ -206,19 +207,43 @@ CallbackRestOrInterface:
Interface:
TOK_INTERFACE TOK_IDENTIFIER Inheritance '{' InterfaceMembers '}'
';'
{
- struct webidl_node *ident;
- struct webidl_node *members;
- struct webidl_node *inheritance = NULL;
-
- if ($3 != NULL) {
- inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE,
NULL, $3);
+ /* extend interface with additional members */
+ struct webidl_node *interface_node;
+ interface_node = webidl_node_find_type_ident(*webidl_ast,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ $2);
+ if (interface_node == NULL) {
+ struct webidl_node *members;
+ struct webidl_node *ident;
+ struct webidl_node *inheritance = NULL;
+
+ if ($3 != NULL) {
+ inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE,
NULL, $3);
+ }
+
+ members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS,
inheritance, $5);
+
+ ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2);
+
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE, NULL, ident);
+ } else {
+ struct webidl_node *members;
+ struct webidl_node *inheritance = webidl_node_getnode(interface_node);
+
+ if ($3 != NULL) {
+ inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE,
inheritance, $3);
+ }
+
+ members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS,
+ inheritance,
+ $5);
+
+ /* link member node into interfaces_node */
+ webidl_node_set(interface_node,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ members);
+ $$ = NULL; /* updated existing interface do not add it again */
}
-
- members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS, inheritance,
$5);
-
- ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2);
-
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE, NULL, ident);
}
;
@@ -241,7 +266,35 @@ PartialDefinition:
PartialInterface:
TOK_INTERFACE TOK_IDENTIFIER '{' InterfaceMembers '}'
';'
{
- $$=NULL;
+ /* extend interface with additional members */
+ struct webidl_node *interface_node;
+ interface_node = webidl_node_find_type_ident(*webidl_ast,
+ 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);
+
+ ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2);
+
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE, NULL, ident);
+
+ } else {
+ struct webidl_node *members;
+ members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS,
+ webidl_node_getnode(interface_node),
+ $4);
+
+ /* link member node into interfaces_node */
+ webidl_node_set(interface_node,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ members);
+
+ $$ = NULL; /* updated existing interface do not add it again */
+ }
}
;
@@ -289,7 +342,6 @@ DictionaryMember:
PartialDictionary:
TOK_DICTIONARY TOK_IDENTIFIER '{' DictionaryMembers '}'
';'
{
- $$=NULL;
}
/* [15] */
@@ -515,7 +567,7 @@ OperationRest:
OptionalIdentifier:
/* empty */
{
- $$=NULL;
+ $$ = NULL;
}
|
TOK_IDENTIFIER
commitdiff
http://git.netsurf-browser.org/nsgenjsbind.git/commitdiff/2133ce26a2ec07f...
commit 2133ce26a2ec07fb37a5f4cc6cab5326fdf49546
Author: Vincent Sanders <vincent.sanders(a)collabora.co.uk>
Commit: Vincent Sanders <vincent.sanders(a)collabora.co.uk>
add property and function array generation
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c
index 1f5b6d4..54c548c 100644
--- a/src/jsapi-libdom.c
+++ b/src/jsapi-libdom.c
@@ -1,4 +1,4 @@
-/* binding output generator for jsapi(spidermonkey) to libdom
+/* binding output generator for jsapi(spidermonkey) to libdom
*
* This file is part of nsgenjsbind.
* Licensed under the MIT License,
@@ -34,12 +34,12 @@ static int webidl_preamble_cb(struct genbind_node *node, void *ctx)
return 0;
}
-static int
+static int
output_preamble(FILE *outfile, struct genbind_node *genbind_ast)
{
genbind_node_for_each_type(genbind_ast,
- GENBIND_NODE_TYPE_PREAMBLE,
- webidl_preamble_cb,
+ GENBIND_NODE_TYPE_PREAMBLE,
+ webidl_preamble_cb,
outfile);
return 0;
}
@@ -56,19 +56,19 @@ static int webidl_hdrcomments_cb(struct genbind_node *node, void
*ctx)
static int webidl_hdrcomment_cb(struct genbind_node *node, void *ctx)
{
genbind_node_for_each_type(genbind_node_getnode(node),
- GENBIND_NODE_TYPE_STRING,
- webidl_hdrcomments_cb,
+ GENBIND_NODE_TYPE_STRING,
+ webidl_hdrcomments_cb,
ctx);
return 0;
}
-static int
+static int
output_header_comments(FILE *outfile, struct genbind_node *genbind_ast)
{
fprintf(outfile, "/* "HDR_COMMENT_PREABLE);
genbind_node_for_each_type(genbind_ast,
- GENBIND_NODE_TYPE_HDRCOMMENT,
- webidl_hdrcomment_cb,
+ GENBIND_NODE_TYPE_HDRCOMMENT,
+ webidl_hdrcomment_cb,
outfile);
fprintf(outfile,"\n */\n\n");
return 0;
@@ -85,17 +85,17 @@ static int webidl_file_cb(struct genbind_node *node, void *ctx)
}
-static int
+static int
read_webidl(struct genbind_node *genbind_ast, struct webidl_node **webidl_ast)
{
int res;
res = genbind_node_for_each_type(genbind_ast,
- GENBIND_NODE_TYPE_WEBIDLFILE,
- webidl_file_cb,
+ GENBIND_NODE_TYPE_WEBIDLFILE,
+ webidl_file_cb,
webidl_ast);
- /* debug dump of web idl AST */
+ /* debug dump of web idl AST */
if (options->verbose) {
webidl_ast_dump(*webidl_ast, 0);
}
@@ -103,24 +103,198 @@ read_webidl(struct genbind_node *genbind_ast, struct webidl_node
**webidl_ast)
}
-static int
-output_function_spec(FILE *outfile,
- struct genbind_node *genbind_ast,
- struct binding *binding)
+
+
+static int webidl_property_spec_cb(struct webidl_node *node, void *ctx)
{
-/* find interface element with correct ident attached in webidl */
-/* for each function (WEBIDL_NODE_TYPE_OPERATION) emit a JSAPI_FS()*/
-/* static JSFunctionSpec jsfunctions_document[] = {
- JSAPI_FS_DOCUMENT,
- JSAPI_FS(write, 1, 0),
- JSAPI_FS_END
-};
-*/
- fprintf(outfile, "%s\n%s\n", binding->name, binding->interface);
+ FILE *outfile = ctx;
+ struct webidl_node *ident_node;
+
+ ident_node = webidl_node_find(webidl_node_getnode(node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_IDENT);
+ if (ident_node == NULL) {
+ /* properties must have an operator
+ *
http://www.w3.org/TR/WebIDL/#idl-attributes
+ */
+ return 1;
+ } else {
+ fprintf(outfile,
+ " JSAPI_PS(%s, 0, JSPROP_ENUMERATE | JSPROP_SHARED),\n",
+ webidl_node_gettext(ident_node));
+ }
return 0;
}
+static int
+generate_property_spec(FILE *outfile,
+ const char *interface,
+ struct webidl_node *webidl_ast)
+{
+ struct webidl_node *interface_node;
+ struct webidl_node *members_node;
+ struct webidl_node *inherit_node;
+
+ /* find interface in webidl with correct ident attached */
+ interface_node = webidl_node_find_type_ident(webidl_ast,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ interface);
+
+ if (interface_node == NULL) {
+ fprintf(stderr,
+ "Unable to find interface %s in loaded WebIDL\n",
+ interface);
+ return -1;
+ }
+
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+ if (members_node == NULL) {
+ fprintf(stderr,
+ "Unable to find members within interface %s\n",
+ interface);
+ return -1;
+ }
+
+
+ /* for each function emit a JSAPI_FS()*/
+ webidl_node_for_each_type(webidl_node_getnode(members_node),
+ WEBIDL_NODE_TYPE_ATTRIBUTE,
+ webidl_property_spec_cb,
+ outfile);
+
+
+ /* check for inherited nodes and insert them too */
+ inherit_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE);
+
+ if (inherit_node != NULL) {
+ return generate_property_spec(outfile,
+ webidl_node_gettext(inherit_node),
+ webidl_ast);
+ }
+
+ return 0;
+}
+
+static int
+output_property_spec(FILE *outfile,
+ struct binding *binding,
+ struct webidl_node *webidl_ast)
+{
+ int res;
+ fprintf(outfile,
+ "static JSPropertySpec jsproperties_%s[] = {\n",
+ binding->name);
+
+ res = generate_property_spec(outfile, binding->interface, webidl_ast);
+
+ fprintf(outfile, " JSAPI_PS_END\n};\n");
+
+ return res;
+}
+
+
+static int webidl_func_spec_cb(struct webidl_node *node, void *ctx)
+{
+ FILE *outfile = ctx;
+ struct webidl_node *ident_node;
+
+ ident_node = webidl_node_find(webidl_node_getnode(node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_IDENT);
+
+ if (ident_node == NULL) {
+ /* operation without identifier - must have special keyword
+ *
http://www.w3.org/TR/WebIDL/#idl-operations
+ */
+ } else {
+ fprintf(outfile,
+ " JSAPI_FS(%s, 0, 0),\n",
+ webidl_node_gettext(ident_node));
+ }
+ return 0;
+}
+
+static int
+generate_function_spec(FILE *outfile,
+ const char *interface,
+ struct webidl_node *webidl_ast)
+{
+ struct webidl_node *interface_node;
+ struct webidl_node *members_node;
+ struct webidl_node *inherit_node;
+
+ /* find interface in webidl with correct ident attached */
+ interface_node = webidl_node_find_type_ident(webidl_ast,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ interface);
+
+ if (interface_node == NULL) {
+ fprintf(stderr,
+ "Unable to find interface %s in loaded WebIDL\n",
+ interface);
+ return -1;
+ }
+
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+ if (members_node == NULL) {
+ fprintf(stderr,
+ "Unable to find members within interface %s\n",
+ interface);
+ return -1;
+ }
+
+
+ /* for each function emit a JSAPI_FS()*/
+ webidl_node_for_each_type(webidl_node_getnode(members_node),
+ WEBIDL_NODE_TYPE_OPERATION,
+ webidl_func_spec_cb,
+ outfile);
+
+
+ /* check for inherited nodes and insert them too */
+ inherit_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE);
+
+ if (inherit_node != NULL) {
+ return generate_function_spec(outfile,
+ webidl_node_gettext(inherit_node),
+ webidl_ast);
+ }
+
+ return 0;
+}
+
+static int
+output_function_spec(FILE *outfile,
+ struct binding *binding,
+ struct webidl_node *webidl_ast)
+{
+ int res;
+ fprintf(outfile,
+ "static JSFunctionSpec jsfunctions_%s[] = {\n",
+ binding->name);
+
+ res = generate_function_spec(outfile, binding->interface, webidl_ast);
+
+ fprintf(outfile, " JSAPI_FS_END\n};\n");
+
+ return res;
+}
+
static struct binding *binding_new(struct genbind_node *genbind_ast)
{
struct binding *nb;
@@ -165,7 +339,7 @@ static struct binding *binding_new(struct genbind_node *genbind_ast)
int jsapi_libdom_output(char *outfilename, struct genbind_node *genbind_ast)
{
- FILE *outfile = NULL;
+ FILE *outfile = NULL;
struct webidl_node *webidl_ast = NULL;
int res;
struct binding *binding;
@@ -180,7 +354,7 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node
*genbind_ast)
/* get general binding information used in output */
binding = binding_new(genbind_ast);
- /* open output file */
+ /* open output file */
if (outfilename == NULL) {
outfile = stdout;
} else {
@@ -189,7 +363,7 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node
*genbind_ast)
if (!outfile) {
fprintf(stderr, "Error opening output %s: %s\n",
- outfilename,
+ outfilename,
strerror(errno));
return 4;
}
@@ -198,9 +372,15 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node
*genbind_ast)
output_preamble(outfile, genbind_ast);
- output_function_spec(outfile, genbind_ast, binding);
+ res = output_function_spec(outfile, binding, webidl_ast);
+ if (res) {
+ return 5;
+ }
- //output_property_spec(outfile, genbind_ast);
+ res = output_property_spec(outfile, binding, webidl_ast);
+ if (res) {
+ return 5;
+ }
fclose(outfile);
diff --git a/src/webidl-ast.c b/src/webidl-ast.c
index 810ac24..396fd4b 100644
--- a/src/webidl-ast.c
+++ b/src/webidl-ast.c
@@ -67,6 +67,73 @@ webidl_node_for_each_type(struct webidl_node *node,
return 0;
}
+/* exported interface defined in genjsbind-ast.h */
+struct webidl_node *
+webidl_node_find(struct webidl_node *node,
+ struct webidl_node *prev,
+ webidl_callback_t *cb,
+ void *ctx)
+{
+ struct webidl_node *ret;
+
+ if (node == NULL) {
+ return NULL;
+ }
+
+ if (node->l != prev) {
+ ret = webidl_node_find(node->l, prev, cb, ctx);
+ if (ret != NULL) {
+ return ret;
+ }
+ }
+
+ if (cb(node, ctx) != 0) {
+ return node;
+ }
+
+ return NULL;
+}
+
+int webidl_cmp_node_type(struct webidl_node *node, void *ctx)
+{
+ if (node->type == (enum webidl_node_type)ctx)
+ return 1;
+ return 0;
+}
+
+struct webidl_node *
+webidl_node_find_type_ident(struct webidl_node *root_node,
+ enum webidl_node_type type,
+ const char *ident)
+{
+ struct webidl_node *node;
+ struct webidl_node *ident_node;
+
+ node = webidl_node_find(root_node,
+ NULL,
+ webidl_cmp_node_type,
+ (void *)type);
+
+ while (node != NULL) {
+
+ ident_node = webidl_node_find(webidl_node_getnode(node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_IDENT);
+ if (ident_node != NULL) {
+ if (strcmp(ident_node->r.text, ident) == 0)
+ break;
+ }
+
+ node = webidl_node_find(root_node,
+ node,
+ webidl_cmp_node_type,
+ (void *)type);
+
+ }
+ return node;
+}
+
char *webidl_node_gettext(struct webidl_node *node)
{
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 8af3aeb..682bb27 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -31,6 +31,7 @@ struct webidl_node {
/** callback for search and iteration routines */
typedef int (webidl_callback_t)(struct webidl_node *node, void *ctx);
+int webidl_cmp_node_type(struct webidl_node *node, void *ctx);
struct webidl_node *webidl_node_new(enum webidl_node_type, struct webidl_node *l, void
*r);
@@ -47,6 +48,18 @@ int webidl_node_for_each_type(struct webidl_node *node,
webidl_callback_t *cb,
void *ctx);
+struct webidl_node *
+webidl_node_find(struct webidl_node *node,
+ struct webidl_node *prev,
+ webidl_callback_t *cb,
+ void *ctx);
+
+struct webidl_node *
+webidl_node_find_type_ident(struct webidl_node *root_node,
+ enum webidl_node_type type,
+ const char *ident);
+
+
/* debug dump */
int webidl_ast_dump(struct webidl_node *node, int indent);
-----------------------------------------------------------------------
Summary of changes:
src/jsapi-libdom.c | 249 ++++++++++++++++++++++++++++++++++++++++++++-------
src/webidl-ast.c | 105 +++++++++++++++++++--
src/webidl-ast.h | 24 ++++--
src/webidl-parser.y | 86 ++++++++++++++----
4 files changed, 398 insertions(+), 66 deletions(-)
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c
index 1f5b6d4..aba6bdf 100644
--- a/src/jsapi-libdom.c
+++ b/src/jsapi-libdom.c
@@ -1,4 +1,4 @@
-/* binding output generator for jsapi(spidermonkey) to libdom
+/* binding output generator for jsapi(spidermonkey) to libdom
*
* This file is part of nsgenjsbind.
* Licensed under the MIT License,
@@ -34,12 +34,12 @@ static int webidl_preamble_cb(struct genbind_node *node, void *ctx)
return 0;
}
-static int
+static int
output_preamble(FILE *outfile, struct genbind_node *genbind_ast)
{
genbind_node_for_each_type(genbind_ast,
- GENBIND_NODE_TYPE_PREAMBLE,
- webidl_preamble_cb,
+ GENBIND_NODE_TYPE_PREAMBLE,
+ webidl_preamble_cb,
outfile);
return 0;
}
@@ -56,19 +56,19 @@ static int webidl_hdrcomments_cb(struct genbind_node *node, void
*ctx)
static int webidl_hdrcomment_cb(struct genbind_node *node, void *ctx)
{
genbind_node_for_each_type(genbind_node_getnode(node),
- GENBIND_NODE_TYPE_STRING,
- webidl_hdrcomments_cb,
+ GENBIND_NODE_TYPE_STRING,
+ webidl_hdrcomments_cb,
ctx);
return 0;
}
-static int
+static int
output_header_comments(FILE *outfile, struct genbind_node *genbind_ast)
{
fprintf(outfile, "/* "HDR_COMMENT_PREABLE);
genbind_node_for_each_type(genbind_ast,
- GENBIND_NODE_TYPE_HDRCOMMENT,
- webidl_hdrcomment_cb,
+ GENBIND_NODE_TYPE_HDRCOMMENT,
+ webidl_hdrcomment_cb,
outfile);
fprintf(outfile,"\n */\n\n");
return 0;
@@ -85,17 +85,17 @@ static int webidl_file_cb(struct genbind_node *node, void *ctx)
}
-static int
+static int
read_webidl(struct genbind_node *genbind_ast, struct webidl_node **webidl_ast)
{
int res;
res = genbind_node_for_each_type(genbind_ast,
- GENBIND_NODE_TYPE_WEBIDLFILE,
- webidl_file_cb,
+ GENBIND_NODE_TYPE_WEBIDLFILE,
+ webidl_file_cb,
webidl_ast);
- /* debug dump of web idl AST */
+ /* debug dump of web idl AST */
if (options->verbose) {
webidl_ast_dump(*webidl_ast, 0);
}
@@ -103,24 +103,205 @@ read_webidl(struct genbind_node *genbind_ast, struct webidl_node
**webidl_ast)
}
-static int
-output_function_spec(FILE *outfile,
- struct genbind_node *genbind_ast,
- struct binding *binding)
+
+
+static int webidl_property_spec_cb(struct webidl_node *node, void *ctx)
{
-/* find interface element with correct ident attached in webidl */
-/* for each function (WEBIDL_NODE_TYPE_OPERATION) emit a JSAPI_FS()*/
-/* static JSFunctionSpec jsfunctions_document[] = {
- JSAPI_FS_DOCUMENT,
- JSAPI_FS(write, 1, 0),
- JSAPI_FS_END
-};
-*/
- fprintf(outfile, "%s\n%s\n", binding->name, binding->interface);
+ FILE *outfile = ctx;
+ struct webidl_node *ident_node;
+
+ ident_node = webidl_node_find(webidl_node_getnode(node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_IDENT);
+ if (ident_node == NULL) {
+ /* properties must have an operator
+ *
http://www.w3.org/TR/WebIDL/#idl-attributes
+ */
+ return 1;
+ } else {
+ fprintf(outfile,
+ " JSAPI_PS(%s, 0, JSPROP_ENUMERATE | JSPROP_SHARED),\n",
+ webidl_node_gettext(ident_node));
+ }
return 0;
}
+static int
+generate_property_spec(FILE *outfile,
+ const char *interface,
+ struct webidl_node *webidl_ast)
+{
+ struct webidl_node *interface_node;
+ struct webidl_node *members_node;
+ struct webidl_node *inherit_node;
+
+
+ /* find interface in webidl with correct ident attached */
+ interface_node = webidl_node_find_type_ident(webidl_ast,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ interface);
+
+ if (interface_node == NULL) {
+ fprintf(stderr,
+ "Unable to find interface %s in loaded WebIDL\n",
+ interface);
+ return -1;
+ }
+
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+
+ while (members_node != NULL) {
+
+ fprintf(outfile," /**** %s ****/\n", interface);
+
+
+ /* for each function emit a JSAPI_FS()*/
+ webidl_node_for_each_type(webidl_node_getnode(members_node),
+ WEBIDL_NODE_TYPE_ATTRIBUTE,
+ webidl_property_spec_cb,
+ outfile);
+
+
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ members_node,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+
+ }
+ /* check for inherited nodes and insert them too */
+ inherit_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE);
+
+ if (inherit_node != NULL) {
+ return generate_property_spec(outfile,
+ webidl_node_gettext(inherit_node),
+ webidl_ast);
+ }
+
+ return 0;
+}
+
+static int
+output_property_spec(FILE *outfile,
+ struct binding *binding,
+ struct webidl_node *webidl_ast)
+{
+ int res;
+ fprintf(outfile,
+ "static JSPropertySpec jsproperties_%s[] = {\n",
+ binding->name);
+
+ res = generate_property_spec(outfile, binding->interface, webidl_ast);
+
+ fprintf(outfile, " JSAPI_PS_END\n};\n");
+
+ return res;
+}
+
+
+static int webidl_func_spec_cb(struct webidl_node *node, void *ctx)
+{
+ FILE *outfile = ctx;
+ struct webidl_node *ident_node;
+
+ ident_node = webidl_node_find(webidl_node_getnode(node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_IDENT);
+
+ if (ident_node == NULL) {
+ /* operation without identifier - must have special keyword
+ *
http://www.w3.org/TR/WebIDL/#idl-operations
+ */
+ } else {
+ fprintf(outfile,
+ " JSAPI_FS(%s, 0, 0),\n",
+ webidl_node_gettext(ident_node));
+ }
+ return 0;
+}
+
+static int
+generate_function_spec(FILE *outfile,
+ const char *interface,
+ struct webidl_node *webidl_ast)
+{
+ struct webidl_node *interface_node;
+ struct webidl_node *members_node;
+ struct webidl_node *inherit_node;
+
+
+ /* find interface in webidl with correct ident attached */
+ interface_node = webidl_node_find_type_ident(webidl_ast,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ interface);
+
+ if (interface_node == NULL) {
+ fprintf(stderr,
+ "Unable to find interface %s in loaded WebIDL\n",
+ interface);
+ return -1;
+ }
+
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+ while (members_node != NULL) {
+
+ fprintf(outfile," /**** %s ****/\n", interface);
+
+ /* for each function emit a JSAPI_FS()*/
+ webidl_node_for_each_type(webidl_node_getnode(members_node),
+ WEBIDL_NODE_TYPE_OPERATION,
+ webidl_func_spec_cb,
+ outfile);
+
+ members_node = webidl_node_find(webidl_node_getnode(interface_node),
+ members_node,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_MEMBERS);
+ }
+
+ /* check for inherited nodes and insert them too */
+ inherit_node = webidl_node_find(webidl_node_getnode(interface_node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE);
+
+ if (inherit_node != NULL) {
+ return generate_function_spec(outfile,
+ webidl_node_gettext(inherit_node),
+ webidl_ast);
+ }
+
+ return 0;
+}
+
+static int
+output_function_spec(FILE *outfile,
+ struct binding *binding,
+ struct webidl_node *webidl_ast)
+{
+ int res;
+ fprintf(outfile,
+ "static JSFunctionSpec jsfunctions_%s[] = {\n",
+ binding->name);
+
+ res = generate_function_spec(outfile, binding->interface, webidl_ast);
+
+ fprintf(outfile, " JSAPI_FS_END\n};\n");
+
+ return res;
+}
+
static struct binding *binding_new(struct genbind_node *genbind_ast)
{
struct binding *nb;
@@ -165,7 +346,7 @@ static struct binding *binding_new(struct genbind_node *genbind_ast)
int jsapi_libdom_output(char *outfilename, struct genbind_node *genbind_ast)
{
- FILE *outfile = NULL;
+ FILE *outfile = NULL;
struct webidl_node *webidl_ast = NULL;
int res;
struct binding *binding;
@@ -180,7 +361,7 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node
*genbind_ast)
/* get general binding information used in output */
binding = binding_new(genbind_ast);
- /* open output file */
+ /* open output file */
if (outfilename == NULL) {
outfile = stdout;
} else {
@@ -189,7 +370,7 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node
*genbind_ast)
if (!outfile) {
fprintf(stderr, "Error opening output %s: %s\n",
- outfilename,
+ outfilename,
strerror(errno));
return 4;
}
@@ -198,9 +379,15 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node
*genbind_ast)
output_preamble(outfile, genbind_ast);
- output_function_spec(outfile, genbind_ast, binding);
+ res = output_function_spec(outfile, binding, webidl_ast);
+ if (res) {
+ return 5;
+ }
- //output_property_spec(outfile, genbind_ast);
+ res = output_property_spec(outfile, binding, webidl_ast);
+ if (res) {
+ return 5;
+ }
fclose(outfile);
diff --git a/src/webidl-ast.c b/src/webidl-ast.c
index 810ac24..aa8e279 100644
--- a/src/webidl-ast.c
+++ b/src/webidl-ast.c
@@ -20,6 +20,15 @@ extern int webidl__flex_debug;
extern void webidl_restart(FILE*);
extern int webidl_parse(struct webidl_node **webidl_ast);
+struct webidl_node {
+ enum webidl_node_type type;
+ struct webidl_node *l;
+ union {
+ void *value;
+ struct webidl_node *node;
+ char *text;
+ } r;
+};
struct webidl_node *
@@ -42,6 +51,12 @@ struct webidl_node *webidl_node_new(enum webidl_node_type type, struct
webidl_no
return nn;
}
+void
+webidl_node_set(struct webidl_node *node, enum webidl_node_type type, void *r)
+{
+ node->type = type;
+ node->r.value = r;
+}
int
webidl_node_for_each_type(struct webidl_node *node,
@@ -67,6 +82,73 @@ webidl_node_for_each_type(struct webidl_node *node,
return 0;
}
+/* exported interface defined in genjsbind-ast.h */
+struct webidl_node *
+webidl_node_find(struct webidl_node *node,
+ struct webidl_node *prev,
+ webidl_callback_t *cb,
+ void *ctx)
+{
+ struct webidl_node *ret;
+
+ if ((node == NULL) || (node == prev)){
+ return NULL;
+ }
+
+ if (node->l != prev) {
+ ret = webidl_node_find(node->l, prev, cb, ctx);
+ if (ret != NULL) {
+ return ret;
+ }
+ }
+
+ if (cb(node, ctx) != 0) {
+ return node;
+ }
+
+ return NULL;
+}
+
+int webidl_cmp_node_type(struct webidl_node *node, void *ctx)
+{
+ if (node->type == (enum webidl_node_type)ctx)
+ return 1;
+ return 0;
+}
+
+struct webidl_node *
+webidl_node_find_type_ident(struct webidl_node *root_node,
+ enum webidl_node_type type,
+ const char *ident)
+{
+ struct webidl_node *node;
+ struct webidl_node *ident_node;
+
+ node = webidl_node_find(root_node,
+ NULL,
+ webidl_cmp_node_type,
+ (void *)type);
+
+ while (node != NULL) {
+
+ ident_node = webidl_node_find(webidl_node_getnode(node),
+ NULL,
+ webidl_cmp_node_type,
+ (void *)WEBIDL_NODE_TYPE_IDENT);
+ if (ident_node != NULL) {
+ if (strcmp(ident_node->r.text, ident) == 0)
+ break;
+ }
+
+ node = webidl_node_find(root_node,
+ node,
+ webidl_cmp_node_type,
+ (void *)type);
+
+ }
+ return node;
+}
+
char *webidl_node_gettext(struct webidl_node *node)
{
@@ -83,17 +165,20 @@ char *webidl_node_gettext(struct webidl_node *node)
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_ATTRIBUTE:
- case WEBIDL_NODE_TYPE_OPERATION:
- return node->r.node;
-
- default:
- return NULL;
+ if (node != NULL) {
+ switch (node->type) {
+ case WEBIDL_NODE_TYPE_ROOT:
+ case WEBIDL_NODE_TYPE_INTERFACE:
+ case WEBIDL_NODE_TYPE_INTERFACE_MEMBERS:
+ case WEBIDL_NODE_TYPE_ATTRIBUTE:
+ case WEBIDL_NODE_TYPE_OPERATION:
+ return node->r.node;
+ default:
+ break;
+ }
}
+ return NULL;
+
}
static const char *webidl_node_type_to_str(enum webidl_node_type type)
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 8af3aeb..b421615 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -19,21 +19,17 @@ enum webidl_node_type {
WEBIDL_NODE_TYPE_OPERATION,
};
-struct webidl_node {
- enum webidl_node_type type;
- struct webidl_node *l;
- union {
- struct webidl_node *node;
- char *text;
- } r;
-};
+struct webidl_node;
/** callback for search and iteration routines */
typedef int (webidl_callback_t)(struct webidl_node *node, void *ctx);
+int webidl_cmp_node_type(struct webidl_node *node, void *ctx);
struct webidl_node *webidl_node_new(enum webidl_node_type, struct webidl_node *l, void
*r);
+void webidl_node_set(struct webidl_node *node, enum webidl_node_type type, void *r);
+
struct webidl_node *webidl_node_link(struct webidl_node *tgt, struct webidl_node *src);
/* node contents acessors */
@@ -47,6 +43,18 @@ int webidl_node_for_each_type(struct webidl_node *node,
webidl_callback_t *cb,
void *ctx);
+struct webidl_node *
+webidl_node_find(struct webidl_node *node,
+ struct webidl_node *prev,
+ webidl_callback_t *cb,
+ void *ctx);
+
+struct webidl_node *
+webidl_node_find_type_ident(struct webidl_node *root_node,
+ enum webidl_node_type type,
+ const char *ident);
+
+
/* debug dump */
int webidl_ast_dump(struct webidl_node *node, int indent);
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index f0f1830..d9be0b9 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -113,7 +113,6 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const
char *str)
%type <node> Partial
%type <node> PartialDefinition
-%type <node> PartialInterface
%type <node> Dictionary
%type <node> PartialDictionary
@@ -122,9 +121,11 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const
char *str)
%type <node> Enum
%type <node> Typedef
%type <node> ImplementsStatement
+
%type <node> Interface
%type <node> InterfaceMembers
%type <node> InterfaceMember
+%type <node> PartialInterface
%type <node> CallbackOrInterface
%type <node> CallbackRest
@@ -137,7 +138,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const
char *str)
%type <node> Operation
%type <node> OperationRest
-%type <node> OptionalIdentifier
+%type <text> OptionalIdentifier
%%
@@ -206,19 +207,43 @@ CallbackRestOrInterface:
Interface:
TOK_INTERFACE TOK_IDENTIFIER Inheritance '{' InterfaceMembers '}'
';'
{
- struct webidl_node *ident;
- struct webidl_node *members;
- struct webidl_node *inheritance = NULL;
-
- if ($3 != NULL) {
- inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE,
NULL, $3);
+ /* extend interface with additional members */
+ struct webidl_node *interface_node;
+ interface_node = webidl_node_find_type_ident(*webidl_ast,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ $2);
+ if (interface_node == NULL) {
+ struct webidl_node *members;
+ struct webidl_node *ident;
+ struct webidl_node *inheritance = NULL;
+
+ if ($3 != NULL) {
+ inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE,
NULL, $3);
+ }
+
+ members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS,
inheritance, $5);
+
+ ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2);
+
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE, NULL, ident);
+ } else {
+ struct webidl_node *members;
+ struct webidl_node *inheritance = webidl_node_getnode(interface_node);
+
+ if ($3 != NULL) {
+ inheritance = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE,
inheritance, $3);
+ }
+
+ members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS,
+ inheritance,
+ $5);
+
+ /* link member node into interfaces_node */
+ webidl_node_set(interface_node,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ members);
+ $$ = NULL; /* updated existing interface do not add it again */
}
-
- members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS, inheritance,
$5);
-
- ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2);
-
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE, NULL, ident);
}
;
@@ -241,7 +266,35 @@ PartialDefinition:
PartialInterface:
TOK_INTERFACE TOK_IDENTIFIER '{' InterfaceMembers '}'
';'
{
- $$=NULL;
+ /* extend interface with additional members */
+ struct webidl_node *interface_node;
+ interface_node = webidl_node_find_type_ident(*webidl_ast,
+ 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);
+
+ ident = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, members, $2);
+
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE, NULL, ident);
+
+ } else {
+ struct webidl_node *members;
+ members = webidl_node_new(WEBIDL_NODE_TYPE_INTERFACE_MEMBERS,
+ webidl_node_getnode(interface_node),
+ $4);
+
+ /* link member node into interfaces_node */
+ webidl_node_set(interface_node,
+ WEBIDL_NODE_TYPE_INTERFACE,
+ members);
+
+ $$ = NULL; /* updated existing interface do not add it again */
+ }
}
;
@@ -289,7 +342,6 @@ DictionaryMember:
PartialDictionary:
TOK_DICTIONARY TOK_IDENTIFIER '{' DictionaryMembers '}'
';'
{
- $$=NULL;
}
/* [15] */
@@ -515,7 +567,7 @@ OperationRest:
OptionalIdentifier:
/* empty */
{
- $$=NULL;
+ $$ = NULL;
}
|
TOK_IDENTIFIER
--
NetSurf Generator for JavaScript bindings