From f2578192d04f4bc0ad70abaf070fffd5d1cf63ab Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Tue, 20 Nov 2012 18:20:28 +0000 Subject: keep the binding node list in the state object --- src/jsapi-libdom-property.c | 14 +++---------- src/jsapi-libdom.c | 50 ++++++++++++++++----------------------------- src/jsapi-libdom.h | 2 ++ 3 files changed, 23 insertions(+), 43 deletions(-) diff --git a/src/jsapi-libdom-property.c b/src/jsapi-libdom-property.c index 9fbd281..f97d352 100644 --- a/src/jsapi-libdom-property.c +++ b/src/jsapi-libdom-property.c @@ -21,20 +21,12 @@ static int webidl_property_spec_cb(struct webidl_node *node, void *ctx) { struct binding *binding = ctx; - struct genbind_node *binding_node; struct genbind_node *unshared_node; struct webidl_node *type_node; struct webidl_node *ident_node; const char *ident; struct webidl_node *modifier_node; - binding_node = genbind_node_find_type(binding->gb_ast, - NULL, - GENBIND_NODE_TYPE_BINDING); - if (binding_node == NULL) { - return -1; - } - ident_node = webidl_node_find_type(webidl_node_getnode(node), NULL, WEBIDL_NODE_TYPE_IDENT); @@ -56,7 +48,7 @@ static int webidl_property_spec_cb(struct webidl_node *node, void *ctx) fprintf(binding->outfile, "\tJSAPI_PS("); } - unshared_node = genbind_node_find_type_ident(genbind_node_getnode(binding_node), + unshared_node = genbind_node_find_type_ident(binding->binding_list, NULL, GENBIND_NODE_TYPE_BINDING_UNSHARED, ident); @@ -75,7 +67,7 @@ static int webidl_property_spec_cb(struct webidl_node *node, void *ctx) WEBIDL_NODE_TYPE_IDENT); if (ident_node != NULL) { - unshared_node = genbind_node_find_type_type(genbind_node_getnode(binding_node), + unshared_node = genbind_node_find_type_type(binding->binding_list, NULL, GENBIND_NODE_TYPE_BINDING_UNSHARED, webidl_node_gettext(ident_node)); @@ -601,7 +593,7 @@ output_property_body(struct binding *binding, const char *interface) if (inherit_node != NULL) { res = output_property_body(binding, - webidl_node_gettext(inherit_node)); + webidl_node_gettext(inherit_node)); } if (res == 0) { diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index fb8080f..e83d0ee 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -292,19 +292,8 @@ static int output_class_new(struct binding *binding) { int res = 0; - struct genbind_node *binding_node; struct genbind_node *api_node; - binding_node = genbind_node_find(binding->gb_ast, - NULL, - genbind_cmp_node_type, - (void *)GENBIND_NODE_TYPE_BINDING); - - if (binding_node == NULL) { - return -1; - } - - /* constructor */ fprintf(binding->outfile, "JSObject *jsapi_new_%s(JSContext *cx,\n" @@ -312,7 +301,7 @@ output_class_new(struct binding *binding) "\t\tJSObject *parent", binding->interface); - genbind_node_for_each_type(genbind_node_getnode(binding_node), + genbind_node_for_each_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_PRIVATE, webidl_private_param_cb, binding); @@ -332,7 +321,7 @@ output_class_new(struct binding *binding) "\t\treturn NULL;\n" "\t}\n"); - genbind_node_for_each_type(genbind_node_getnode(binding_node), + genbind_node_for_each_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_PRIVATE, webidl_private_assign_cb, binding); @@ -517,23 +506,13 @@ output_jsclass(struct binding *binding) static int output_private_declaration(struct binding *binding) { - struct genbind_node *binding_node; struct genbind_node *type_node; if (!binding->has_private) { return 0; } - binding_node = genbind_node_find(binding->gb_ast, - NULL, - genbind_cmp_node_type, - (void *)GENBIND_NODE_TYPE_BINDING); - - if (binding_node == NULL) { - return -1; - } - - type_node = genbind_node_find(genbind_node_getnode(binding_node), + type_node = genbind_node_find(binding->binding_list, NULL, genbind_cmp_node_type, (void *)GENBIND_NODE_TYPE_TYPE); @@ -544,12 +523,12 @@ output_private_declaration(struct binding *binding) fprintf(binding->outfile, "struct jsclass_private {\n"); - genbind_node_for_each_type(genbind_node_getnode(binding_node), + genbind_node_for_each_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_PRIVATE, webidl_private_cb, binding); - genbind_node_for_each_type(genbind_node_getnode(binding_node), + genbind_node_for_each_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_INTERNAL, webidl_private_cb, binding); @@ -588,11 +567,11 @@ output_header_comments(struct binding *binding) } static bool -binding_has_private(struct genbind_node *binding_node) +binding_has_private(struct genbind_node *binding_list) { struct genbind_node *node; - node = genbind_node_find_type(genbind_node_getnode(binding_node), + node = genbind_node_find_type(binding_list, NULL, GENBIND_NODE_TYPE_BINDING_PRIVATE); @@ -600,7 +579,7 @@ binding_has_private(struct genbind_node *binding_node) return true; } - node = genbind_node_find_type(genbind_node_getnode(binding_node), + node = genbind_node_find_type(binding_list, NULL, GENBIND_NODE_TYPE_BINDING_INTERNAL); if (node != NULL) { @@ -629,6 +608,7 @@ binding_new(char *outfilename, struct genbind_node *genbind_ast) { struct binding *nb; struct genbind_node *binding_node; + struct genbind_node *binding_list; struct genbind_node *ident_node; struct genbind_node *interface_node; FILE *outfile ; /* output file */ @@ -642,14 +622,19 @@ binding_new(char *outfilename, struct genbind_node *genbind_ast) return NULL; } - ident_node = genbind_node_find_type(genbind_node_getnode(binding_node), + binding_list = genbind_node_getnode(binding_node); + if (binding_list == NULL) { + return NULL; + } + + ident_node = genbind_node_find_type(binding_list, NULL, GENBIND_NODE_TYPE_IDENT); if (ident_node == NULL) { return NULL; } - interface_node = genbind_node_find_type(genbind_node_getnode(binding_node), + interface_node = genbind_node_find_type(binding_list, NULL, GENBIND_NODE_TYPE_BINDING_INTERFACE); if (interface_node == NULL) { @@ -683,8 +668,9 @@ binding_new(char *outfilename, struct genbind_node *genbind_ast) nb->name = genbind_node_gettext(ident_node); nb->interface = genbind_node_gettext(interface_node); nb->outfile = outfile; - nb->has_private = binding_has_private(binding_node); + nb->has_private = binding_has_private(binding_list); nb->has_global = binding_has_global(nb); + nb->binding_list = binding_list; nb->resolve = genbind_node_find_type_ident(genbind_ast, NULL, GENBIND_NODE_TYPE_API, diff --git a/src/jsapi-libdom.h b/src/jsapi-libdom.h index 8d005c8..b397e67 100644 --- a/src/jsapi-libdom.h +++ b/src/jsapi-libdom.h @@ -13,11 +13,13 @@ struct binding { struct genbind_node *gb_ast; /* root node of binding AST */ struct webidl_node *wi_ast; /* root node of webidl AST */ + const char *name; /* name of the binding */ const char *interface; /* webidl interface binding is for */ bool has_private; /* true if the binding requires a private structure */ bool has_global; /* true if the binding is for a global */ + struct genbind_node *binding_list; /* node list of the binding */ struct genbind_node *resolve; /* binding api resolve node or NULL */ struct genbind_node *finalise; /* binding api finalise node or NULL */ struct genbind_node *mark; /* binding api mark node or NULL */ -- cgit v1.2.3