diff options
author | Vincent Sanders <vince@kyllikki.org> | 2013-12-21 22:29:42 +0000 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2014-05-16 14:38:56 +0100 |
commit | c25cc0e348a1abf0ee0719cf30515b3cc07f1848 (patch) | |
tree | 08458682835c7d4177ad785f423467e64e51fcc0 /src/jsapi-libdom.c | |
parent | abec5defbb553588dce1c317b74570061705f6d0 (diff) | |
download | nsgenbind-c25cc0e348a1abf0ee0719cf30515b3cc07f1848.tar.gz nsgenbind-c25cc0e348a1abf0ee0719cf30515b3cc07f1848.tar.bz2 |
move flag indicating jsapi object for an interface should be a global from api definition to the interface flags
Diffstat (limited to 'src/jsapi-libdom.c')
-rw-r--r-- | src/jsapi-libdom.c | 94 |
1 files changed, 58 insertions, 36 deletions
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index 2389a57..f0dc5a3 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -47,7 +47,7 @@ read_webidl(struct genbind_node *genbind_ast, struct webidl_node **webidl_ast) { int res; - res = genbind_node_for_each_type(genbind_ast, + res = genbind_node_foreach_type(genbind_ast, GENBIND_NODE_TYPE_WEBIDLFILE, webidl_file_cb, webidl_ast); @@ -101,7 +101,7 @@ 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_foreach_type(genbind_node_getnode(node), GENBIND_NODE_TYPE_STRING, webidl_hdrcomments_cb, ctx); @@ -187,7 +187,7 @@ static int webidl_private_assign_cb(struct genbind_node *node, void *ctx) static int output_epilogue(struct binding *binding) { - genbind_node_for_each_type(binding->gb_ast, + genbind_node_foreach_type(binding->gb_ast, GENBIND_NODE_TYPE_EPILOGUE, webidl_epilogue_cb, binding); @@ -215,7 +215,7 @@ output_prologue(struct binding *binding) fprintf(binding->outfile, "static JSPropertySpec jsclass_properties[];\n\n"); - genbind_node_for_each_type(binding->gb_ast, + genbind_node_foreach_type(binding->gb_ast, GENBIND_NODE_TYPE_PROLOGUE, webidl_prologue_cb, binding); @@ -604,7 +604,7 @@ output_class_new(struct binding *binding) "\t\tJSObject *parent", binding->interface); - genbind_node_for_each_type(binding->binding_list, + genbind_node_foreach_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_PRIVATE, webidl_private_param_cb, binding); @@ -621,7 +621,7 @@ output_class_new(struct binding *binding) "\t\tJSObject *parent", binding->interface); - genbind_node_for_each_type(binding->binding_list, + genbind_node_foreach_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_PRIVATE, webidl_private_param_cb, binding); @@ -641,7 +641,7 @@ output_class_new(struct binding *binding) "\t\treturn NULL;\n" "\t}\n"); - genbind_node_for_each_type(binding->binding_list, + genbind_node_foreach_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_PRIVATE, webidl_private_assign_cb, binding); @@ -785,21 +785,48 @@ output_forward_declarations(struct binding *binding) return 0; } -static int -output_jsclass(struct binding *binding) +static bool interface_is_global(struct genbind_node *interface_node) { + if (genbind_node_find_type_ident( + genbind_node_getnode(interface_node), + NULL, + GENBIND_NODE_TYPE_BINDING_INTERFACE_FLAGS, + "global") != NULL) { + return true; + } + + return false; +} + +static int output_jsclass(struct genbind_node *interface_node, void *ctx) +{ + struct binding *binding = ctx; + struct genbind_node *interface_list; + const char *interface_ident; + + interface_list = genbind_node_getnode(interface_node); + if (interface_list == NULL) + return -1; /* bad AST */ + + interface_ident = genbind_node_gettext( + genbind_node_find_type(interface_list, + NULL, + GENBIND_NODE_TYPE_IDENT)); + if (interface_ident == NULL) + return -1; /* bad AST */ + /* output the class declaration */ - HDROUTF(binding, "JSClass JSClass_%s;\n", binding->interface); + HDROUTF(binding, "JSClass JSClass_%s;\n", interface_ident); /* output the class definition */ fprintf(binding->outfile, "JSClass JSClass_%s = {\n" "\t\"%s\",\n", - binding->interface, - binding->interface); + interface_ident, + interface_ident); /* generate class flags */ - if (binding->has_global) { + if (interface_is_global(interface_node)) { fprintf(binding->outfile, "\tJSCLASS_GLOBAL_FLAGS"); } else { fprintf(binding->outfile, "\t0"); @@ -901,9 +928,21 @@ output_jsclass(struct binding *binding) fprintf(binding->outfile, "\tJSAPI_CLASS_NO_INTERNAL_MEMBERS\n" "};\n\n"); + return 0; } +static int +output_jsclasses(struct binding *binding) +{ + + return genbind_node_foreach_type(binding->binding_list, + GENBIND_NODE_TYPE_BINDING_INTERFACE, + output_jsclass, + binding); + +} + /** generate structure definition for internal class data * * Every javascript object instance has an internal context to keep @@ -927,12 +966,12 @@ output_private_declaration(struct binding *binding) fprintf(binding->outfile, "struct jsclass_private {\n"); - genbind_node_for_each_type(binding->binding_list, + genbind_node_foreach_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_PRIVATE, webidl_private_cb, binding); - genbind_node_for_each_type(binding->binding_list, + genbind_node_foreach_type(binding->binding_list, GENBIND_NODE_TYPE_BINDING_INTERNAL, webidl_private_cb, binding); @@ -946,7 +985,7 @@ output_private_declaration(struct binding *binding) static int output_preamble(struct binding *binding) { - genbind_node_for_each_type(binding->gb_ast, + genbind_node_foreach_type(binding->gb_ast, GENBIND_NODE_TYPE_PREAMBLE, webidl_preamble_cb, binding); @@ -976,7 +1015,7 @@ output_header_comments(struct binding *binding) const char *preamble = HDR_COMMENT_PREAMBLE; fprintf(binding->outfile, preamble, options->infilename); - genbind_node_for_each_type(binding->gb_ast, + genbind_node_foreach_type(binding->gb_ast, GENBIND_NODE_TYPE_HDRCOMMENT, webidl_hdrcomment_cb, binding); @@ -988,7 +1027,7 @@ output_header_comments(struct binding *binding) fprintf(binding->outfile, preamble, options->infilename); - genbind_node_for_each_type(binding->gb_ast, + genbind_node_foreach_type(binding->gb_ast, GENBIND_NODE_TYPE_HDRCOMMENT, webidl_hdrcomment_cb, binding); @@ -1022,22 +1061,6 @@ binding_has_private(struct genbind_node *binding_list) return false; } -/* determine if the binding has a global api marker */ -static bool -binding_has_global(struct binding *binding) -{ - struct genbind_node *api_node; - - api_node = genbind_node_find_type_ident(binding->gb_ast, - NULL, - GENBIND_NODE_TYPE_API, - "global"); - if (api_node != NULL) { - return true; - } - return false; -} - static struct binding * binding_new(struct options *options, struct genbind_node *genbind_ast, @@ -1109,7 +1132,6 @@ binding_new(struct options *options, nb->hdrfile = options->hdrfilehandle; nb->hdrguard = hdrguard; nb->has_private = binding_has_private(binding_list); - nb->has_global = binding_has_global(nb); nb->binding_list = binding_list; /* class API */ @@ -1191,7 +1213,7 @@ jsapi_libdom_output(struct options *options, return 75; } - res = output_jsclass(binding); + res = output_jsclasses(binding); if (res) { return 80; } |