From 202be5081e4b201a3937407b2aff3328139ef1a3 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 2 Jan 2014 13:13:20 +0000 Subject: generate function bodies for all interfaces --- src/jsapi-libdom-function.c | 208 +++++++++++++++++++++++++------------------- src/jsapi-libdom.c | 2 +- src/jsapi-libdom.h | 3 +- 3 files changed, 121 insertions(+), 92 deletions(-) diff --git a/src/jsapi-libdom-function.c b/src/jsapi-libdom-function.c index 0196c58..4970b48 100644 --- a/src/jsapi-libdom-function.c +++ b/src/jsapi-libdom-function.c @@ -17,6 +17,8 @@ #include "webidl-ast.h" #include "jsapi-libdom.h" +static int output_function_body(struct binding *binding, struct webidl_node *node); + static int webidl_func_spec_cb(struct webidl_node *node, void *ctx) { struct binding *binding = ctx; @@ -307,7 +309,7 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_LONGLONG: - WARN(WARNING_UNIMPLEMENTED, + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_LONGLONG"); break; @@ -316,7 +318,7 @@ static int output_return_declaration(struct binding *binding, type_mod = webidl_node_find_type(webidl_node_getnode(type_node), NULL, WEBIDL_NODE_TYPE_MODIFIER); - if ((type_mod != NULL) && + if ((type_mod != NULL) && (webidl_node_getint(type_mod) == WEBIDL_TYPE_MODIFIER_UNSIGNED)) { fprintf(binding->outfile, "\tuint32_t %s = 0;\n", ident); } else { @@ -332,7 +334,7 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_SEQUENCE: - WARN(WARNING_UNIMPLEMENTED, + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_SEQUENCE"); break; @@ -474,14 +476,14 @@ output_variable_definitions(struct binding *binding, type_mod = webidl_node_find_type(webidl_node_getnode(arg_type), NULL, WEBIDL_NODE_TYPE_MODIFIER); - if ((type_mod != NULL) && + if ((type_mod != NULL) && (webidl_node_getint(type_mod) == WEBIDL_TYPE_MODIFIER_UNSIGNED)) { - fprintf(binding->outfile, - "\tuint32_t %s = 0;\n", + fprintf(binding->outfile, + "\tuint32_t %s = 0;\n", webidl_node_gettext(arg_ident)); } else { - fprintf(binding->outfile, - "\tint32_t %s = 0;\n", + fprintf(binding->outfile, + "\tint32_t %s = 0;\n", webidl_node_gettext(arg_ident)); } @@ -624,15 +626,15 @@ output_operation_input(struct binding *binding, type_mod = webidl_node_find_type(webidl_node_getnode(arg_type), NULL, WEBIDL_NODE_TYPE_MODIFIER); - if ((type_mod != NULL) && + if ((type_mod != NULL) && (webidl_node_getint(type_mod) == WEBIDL_TYPE_MODIFIER_UNSIGNED)) { - fprintf(binding->outfile, - "\tJS_ValueToECMAUint32(cx, argv[%d], &%s);\n", + fprintf(binding->outfile, + "\tJS_ValueToECMAUint32(cx, argv[%d], &%s);\n", arg_cur, webidl_node_gettext(arg_ident)); } else { - fprintf(binding->outfile, - "\tJS_ValueToECMAInt32(cx, argv[%d], &%s);\n", + fprintf(binding->outfile, + "\tJS_ValueToECMAInt32(cx, argv[%d], &%s);\n", arg_cur, webidl_node_gettext(arg_ident)); } @@ -690,14 +692,14 @@ output_operation_input(struct binding *binding, } -static int -output_operator_placeholder(struct binding *binding, - struct webidl_node *oplist, +static int +output_operator_placeholder(struct binding *binding, + struct webidl_node *oplist, struct webidl_node *ident_node) { oplist = oplist; - WARN(WARNING_UNIMPLEMENTED, + WARN(WARNING_UNIMPLEMENTED, "operation %s.%s has no implementation\n", binding->interface, webidl_node_gettext(ident_node)); @@ -748,103 +750,79 @@ output_private_get(struct binding *binding, const char *argname) return ret; } -static int webidl_operator_body_cb(struct webidl_node *node, void *ctx) +static int +webidl_operator_body_cb(struct webidl_node *node, void *ctx) { struct binding *binding = ctx; struct webidl_node *ident_node; struct genbind_node *operation_node; - ident_node = webidl_node_find(webidl_node_getnode(node), - NULL, - webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_IDENT); + ident_node = webidl_node_find_type(webidl_node_getnode(node), + NULL, + WEBIDL_NODE_TYPE_IDENT); if (ident_node == NULL) { /* operation without identifier - must have special keyword * http://www.w3.org/TR/WebIDL/#idl-operations */ WARN(WARNING_UNIMPLEMENTED, - "Unhandled operation with no name on %s\n", - binding->interface); + "Unhandled operation with no name on %s\n", + binding->interface); - } else { - /* normal operation with identifier */ - - fprintf(binding->outfile, - "static JSBool JSAPI_FUNC(%s, JSContext *cx, uintN argc, jsval *vp)\n", - webidl_node_gettext(ident_node)); - fprintf(binding->outfile, - "{\n"); + return 0; + } - /* return value declaration */ - output_return_declaration(binding, "jsret", webidl_node_getnode(node)); + /* normal operation with identifier */ - output_variable_definitions(binding, webidl_node_getnode(node)); + fprintf(binding->outfile, + "static JSBool JSAPI_FUNC(%s, JSContext *cx, uintN argc, jsval *vp)\n", + webidl_node_gettext(ident_node)); + fprintf(binding->outfile, "{\n"); - output_private_get(binding, "private"); + /* return value declaration */ + output_return_declaration(binding, "jsret", webidl_node_getnode(node)); - output_operation_input(binding, webidl_node_getnode(node)); + output_variable_definitions(binding, webidl_node_getnode(node)); - operation_node = genbind_node_find_type_ident(binding->gb_ast, - NULL, - GENBIND_NODE_TYPE_OPERATION, - webidl_node_gettext(ident_node)); + output_private_get(binding, "private"); - if (operation_node != NULL) { - output_code_block(binding, - genbind_node_getnode(operation_node)); + output_operation_input(binding, webidl_node_getnode(node)); - } else { - output_operator_placeholder(binding, webidl_node_getnode(node), ident_node); - } + operation_node = genbind_node_find_type_ident(binding->gb_ast, + NULL, + GENBIND_NODE_TYPE_OPERATION, + webidl_node_gettext(ident_node)); - output_return(binding, "jsret", webidl_node_getnode(node)); + if (operation_node != NULL) { + output_code_block(binding, + genbind_node_getnode(operation_node)); - /* set return value an return true */ - fprintf(binding->outfile, - "\treturn JS_TRUE;\n" - "}\n\n"); + } else { + output_operator_placeholder(binding, webidl_node_getnode(node), ident_node); } - return 0; -} -/* callback to emit implements operator bodys */ -static int webidl_implements_cb(struct webidl_node *node, void *ctx) -{ - struct binding *binding = ctx; + output_return(binding, "jsret", webidl_node_getnode(node)); - return output_function_body(binding, webidl_node_gettext(node)); + /* set return value an return true */ + fprintf(binding->outfile, + "\treturn JS_TRUE;\n" + "}\n\n"); + + return 0; } -/* exported interface documented in jsapi-libdom.h */ -int -output_function_body(struct binding *binding, const char *interface) +static int +output_interface_functions(struct binding *binding, + struct webidl_node *interface_node) { - struct webidl_node *interface_node; struct webidl_node *members_node; - struct webidl_node *inherit_node; - int res = 0; - - /* find interface in webidl with correct ident attached */ - interface_node = webidl_node_find_type_ident(binding->wi_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_type( webidl_node_getnode(interface_node), NULL, WEBIDL_NODE_TYPE_LIST); - while (members_node != NULL) { - - fprintf(binding->outfile,"/**** %s ****/\n", interface); + while (members_node != NULL) { /* for each function emit a JSAPI_FS()*/ webidl_node_for_each_type(webidl_node_getnode(members_node), WEBIDL_NODE_TYPE_OPERATION, @@ -856,23 +834,75 @@ output_function_body(struct binding *binding, const char *interface) members_node, WEBIDL_NODE_TYPE_LIST); } + return 0; +} + +/* callback to emit implements operator bodys */ +static int webidl_implements_cb(struct webidl_node *node, void *ctx) +{ + struct binding *binding = ctx; + struct webidl_node *interface_node; + + interface_node = webidl_node_find_type_ident(binding->wi_ast, + WEBIDL_NODE_TYPE_INTERFACE, + webidl_node_gettext(node)); + + return output_function_body(binding, interface_node); +} + +/* exported interface documented in jsapi-libdom.h */ +static int +output_function_body(struct binding *binding, + struct webidl_node *interface_node) +{ + struct webidl_node *inherit_node; + int res = 0; + + res = output_interface_functions(binding, interface_node); + + fprintf(binding->outfile, + "/**** %s ****/\n", + webidl_node_gettext( + webidl_node_find_type( + webidl_node_getnode(interface_node), + NULL, + WEBIDL_NODE_TYPE_IDENT))); /* check for inherited nodes and insert them too */ - inherit_node = webidl_node_find_type(webidl_node_getnode(interface_node), - NULL, - WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE); + inherit_node = webidl_node_find_type( + webidl_node_getnode(interface_node), + NULL, + WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE); if (inherit_node != NULL) { - res = output_function_body(binding, - webidl_node_gettext(inherit_node)); + res = webidl_implements_cb(inherit_node, binding); } if (res == 0) { - res = webidl_node_for_each_type(webidl_node_getnode(interface_node), - WEBIDL_NODE_TYPE_INTERFACE_IMPLEMENTS, - webidl_implements_cb, - binding); + res = webidl_node_for_each_type( + webidl_node_getnode(interface_node), + WEBIDL_NODE_TYPE_INTERFACE_IMPLEMENTS, + webidl_implements_cb, + binding); } return res; } + +int +output_function_bodies(struct binding *binding) +{ + int inf; + int res; + + for (inf=0; inf < binding->interfacec; inf++) { + if (binding->interfaces[inf].inherit_idx == -1) { + res = output_function_body(binding, + binding->interfaces[inf].widl_node); + } else { + res = output_interface_functions(binding, + binding->interfaces[inf].widl_node); + } + } + return res; +} diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index 2edfc83..547e66e 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -1160,7 +1160,7 @@ jsapi_libdom_output(struct options *options, /* method (function) and property body generation */ - res = output_function_body(binding, binding->interface); + res = output_function_bodies(binding); if (res) { return 90; } diff --git a/src/jsapi-libdom.h b/src/jsapi-libdom.h index 13a5276..ce50589 100644 --- a/src/jsapi-libdom.h +++ b/src/jsapi-libdom.h @@ -77,9 +77,8 @@ int output_function_spec(struct binding *binding); * block in the binding definition. * * @param binding The binding information - * @param interface The interface to generate operator bodys for */ -int output_function_body(struct binding *binding, const char *interface); +int output_function_bodies(struct binding *binding); /** generate property tinyid enum */ int output_property_tinyid(struct binding *binding); -- cgit v1.2.3