From a3bf3977d82f6dcd54c2a38bffe63858fd4da24c Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 8 Nov 2012 17:17:52 +0000 Subject: add warning switch to control warning output at generation time --- src/jsapi-libdom-operator.c | 67 +++++++++++++++++++++++++++++++-------------- src/jsapi-libdom-property.c | 51 +++++++++++++++++++++------------- src/nsgenbind.c | 6 +++- src/options.h | 17 ++++++++++-- 4 files changed, 98 insertions(+), 43 deletions(-) diff --git a/src/jsapi-libdom-operator.c b/src/jsapi-libdom-operator.c index fccf4d1..2bb64d4 100644 --- a/src/jsapi-libdom-operator.c +++ b/src/jsapi-libdom-operator.c @@ -17,9 +17,6 @@ #include "webidl-ast.h" #include "jsapi-libdom.h" -#define WARN(msg, args...) fprintf(stderr, "%s: warning:"msg"\n", __func__, ## args); - - static int webidl_func_spec_cb(struct webidl_node *node, void *ctx) { struct binding *binding = ctx; @@ -173,11 +170,11 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_BYTE: - WARN("Unhandled type WEBIDL_TYPE_BYTE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_BYTE"); break; case WEBIDL_TYPE_OCTET: - WARN("Unhandled type WEBIDL_TYPE_OCTET"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_OCTET"); break; case WEBIDL_TYPE_FLOAT: @@ -189,11 +186,12 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_SHORT: - WARN("Unhandled type WEBIDL_TYPE_SHORT"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_SHORT"); break; case WEBIDL_TYPE_LONGLONG: - WARN("Unhandled type WEBIDL_TYPE_LONGLONG"); + WARN(WARNING_UNIMPLEMENTED, + "Unhandled type WEBIDL_TYPE_LONGLONG"); break; case WEBIDL_TYPE_LONG: @@ -211,7 +209,8 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_SEQUENCE: - WARN("Unhandled type WEBIDL_TYPE_SEQUENCE"); + WARN(WARNING_UNIMPLEMENTED, + "Unhandled type WEBIDL_TYPE_SEQUENCE"); break; case WEBIDL_TYPE_OBJECT: @@ -222,7 +221,8 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_DATE: - WARN("Unhandled type WEBIDL_TYPE_DATE"); + WARN(WARNING_UNIMPLEMENTED, + "Unhandled type WEBIDL_TYPE_DATE"); break; case WEBIDL_TYPE_VOID: @@ -288,11 +288,11 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_BYTE: - WARN("Unhandled type WEBIDL_TYPE_BYTE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_BYTE"); break; case WEBIDL_TYPE_OCTET: - WARN("Unhandled type WEBIDL_TYPE_OCTET"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_OCTET"); break; case WEBIDL_TYPE_FLOAT: @@ -302,11 +302,12 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_SHORT: - WARN("Unhandled type WEBIDL_TYPE_SHORT"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_SHORT"); break; case WEBIDL_TYPE_LONGLONG: - WARN("Unhandled type WEBIDL_TYPE_LONGLONG"); + WARN(WARNING_UNIMPLEMENTED, + "Unhandled type WEBIDL_TYPE_LONGLONG"); break; case WEBIDL_TYPE_LONG: @@ -330,7 +331,8 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_SEQUENCE: - WARN("Unhandled type WEBIDL_TYPE_SEQUENCE"); + WARN(WARNING_UNIMPLEMENTED, + "Unhandled type WEBIDL_TYPE_SEQUENCE"); break; case WEBIDL_TYPE_OBJECT: @@ -339,7 +341,7 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_DATE: - WARN("Unhandled type WEBIDL_TYPE_DATE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_DATE"); break; case WEBIDL_TYPE_VOID: @@ -576,8 +578,10 @@ output_operation_input(struct binding *binding, switch (webidl_arg_type) { case WEBIDL_TYPE_USER: fprintf(binding->outfile, - "\tif ((!JSVAL_IS_NULL(argv[%d])) ||\n" - "\t\t(JSVAL_IS_PRIMITIVE(argv[%d]))) {\n" + "\tif (!JSAPI_JSVAL_IS_OBJECT(argv[%d])) {\n" + "\t\tJSType argtype;\n" + "\t\targtype = JS_TypeOfValue(cx, argv[%d]);\n" + "\t\tJSLOG(\"User argument is type %%s not an object\", JS_GetTypeName(cx, argtype));\n" "\t\treturn JS_FALSE;\n" "\t}\n" "\t%s = JSVAL_TO_OBJECT(argv[%d]);\n", @@ -680,6 +684,26 @@ output_operation_input(struct binding *binding, } +static int +output_operator_placeholder(struct binding *binding, + struct webidl_node *oplist, + struct webidl_node *ident_node) +{ + oplist = oplist; + + WARN(WARNING_UNIMPLEMENTED, + "operation %s.%s has no implementation\n", + binding->interface, + webidl_node_gettext(ident_node)); + + fprintf(binding->outfile, + "\tJSLOG(\"operation %s.%s has no implementation\");\n", + binding->interface, + webidl_node_gettext(ident_node)); + + return 0; +} + static int webidl_operator_body_cb(struct webidl_node *node, void *ctx) { struct binding *binding = ctx; @@ -695,6 +719,10 @@ static int webidl_operator_body_cb(struct webidl_node *node, void *ctx) /* 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); + } else { /* normal operation with identifier */ @@ -734,10 +762,7 @@ static int webidl_operator_body_cb(struct webidl_node *node, void *ctx) genbind_node_getnode(operation_node)); } else { - fprintf(stderr, - "warning: operation %s.%s has no implementation\n", - binding->interface, - webidl_node_gettext(ident_node)); + output_operator_placeholder(binding, webidl_node_getnode(node), ident_node); } output_return(binding, "jsret", webidl_node_getnode(node)); diff --git a/src/jsapi-libdom-property.c b/src/jsapi-libdom-property.c index 6bd698d..2bc3a79 100644 --- a/src/jsapi-libdom-property.c +++ b/src/jsapi-libdom-property.c @@ -17,9 +17,6 @@ #include "webidl-ast.h" #include "jsapi-libdom.h" -#define WARN(msg, args...) fprintf(stderr, "%s: warning:"msg"\n", __func__, ## args); - - static int webidl_property_spec_cb(struct webidl_node *node, void *ctx) { struct binding *binding = ctx; @@ -179,11 +176,11 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_BYTE: - WARN("Unhandled type WEBIDL_TYPE_BYTE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_BYTE"); break; case WEBIDL_TYPE_OCTET: - WARN("Unhandled type WEBIDL_TYPE_OCTET"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_OCTET"); break; case WEBIDL_TYPE_FLOAT: @@ -195,11 +192,11 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_SHORT: - WARN("Unhandled type WEBIDL_TYPE_SHORT"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_SHORT"); break; case WEBIDL_TYPE_LONGLONG: - WARN("Unhandled type WEBIDL_TYPE_LONGLONG"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_LONGLONG"); break; case WEBIDL_TYPE_LONG: @@ -217,7 +214,7 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_SEQUENCE: - WARN("Unhandled type WEBIDL_TYPE_SEQUENCE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_SEQUENCE"); break; case WEBIDL_TYPE_OBJECT: @@ -228,7 +225,7 @@ static int output_return(struct binding *binding, break; case WEBIDL_TYPE_DATE: - WARN("Unhandled type WEBIDL_TYPE_DATE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_DATE"); break; case WEBIDL_TYPE_VOID: @@ -284,11 +281,11 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_BYTE: - WARN("Unhandled type WEBIDL_TYPE_BYTE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_BYTE"); break; case WEBIDL_TYPE_OCTET: - WARN("Unhandled type WEBIDL_TYPE_OCTET"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_OCTET"); break; case WEBIDL_TYPE_FLOAT: @@ -298,11 +295,11 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_SHORT: - WARN("Unhandled type WEBIDL_TYPE_SHORT"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_SHORT"); break; case WEBIDL_TYPE_LONGLONG: - WARN("Unhandled type WEBIDL_TYPE_LONGLONG"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_LONGLONG"); break; case WEBIDL_TYPE_LONG: @@ -331,7 +328,7 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_SEQUENCE: - WARN("Unhandled type WEBIDL_TYPE_SEQUENCE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_SEQUENCE"); break; case WEBIDL_TYPE_OBJECT: @@ -340,7 +337,7 @@ static int output_return_declaration(struct binding *binding, break; case WEBIDL_TYPE_DATE: - WARN("Unhandled type WEBIDL_TYPE_DATE"); + WARN(WARNING_UNIMPLEMENTED, "Unhandled type WEBIDL_TYPE_DATE"); break; case WEBIDL_TYPE_VOID: @@ -353,6 +350,25 @@ static int output_return_declaration(struct binding *binding, return 0; } +static int +output_property_placeholder(struct binding *binding, + struct webidl_node* oplist, + const char *ident) +{ + oplist=oplist; + + WARN(WARNING_UNIMPLEMENTED, + "property %s.%s has no implementation\n", + binding->interface, + ident); + + fprintf(binding->outfile, + "\tJSLOG(\"property %s.%s has no implementation\");\n", + binding->interface, + ident); + return 0; +} + static int output_property_getter(struct binding *binding, struct webidl_node *node, const char *ident) @@ -412,10 +428,7 @@ static int output_property_getter(struct binding *binding, "\tjsret = private->%s;\n", ident); } else { - fprintf(stderr, - "warning: attribute getter %s.%s has no implementation\n", - binding->interface, - ident); + output_property_placeholder(binding, node, ident); } } diff --git a/src/nsgenbind.c b/src/nsgenbind.c index 66292a9..0f549f9 100644 --- a/src/nsgenbind.c +++ b/src/nsgenbind.c @@ -30,7 +30,7 @@ static struct options* process_cmdline(int argc, char **argv) return NULL; } - while ((opt = getopt(argc, argv, "vDd:I:o:")) != -1) { + while ((opt = getopt(argc, argv, "vDW::d:I:o:")) != -1) { switch (opt) { case 'I': options->idlpath = strdup(optarg); @@ -52,6 +52,10 @@ static struct options* process_cmdline(int argc, char **argv) options->debug = true; break; + case 'W': + options->warnings = 1; /* warning flags */ + break; + default: /* '?' */ fprintf(stderr, "Usage: %s [-d depfilename] [-I idlpath] [-o filename] inputfile\n", diff --git a/src/options.h b/src/options.h index ba43084..5ded73a 100644 --- a/src/options.h +++ b/src/options.h @@ -15,10 +15,23 @@ struct options { char *depfilename; FILE *depfilehandle; char *idlpath; - bool verbose; - bool debug; + bool verbose; /* verbose processing */ + bool debug; /* debug enabled */ + unsigned int warnings; /* warning flags */ }; extern struct options *options; +enum opt_warnings { + WARNING_UNIMPLEMENTED = 1, +}; + +#define WARNING_ALL (WARNING_UNIMPLEMENTED) + +#define WARN(flags, msg, args...) do { \ + if ((options->warnings & flags) != 0) { \ + fprintf(stderr, "%s: warning:"msg"\n", __func__, ## args); \ + } \ + } while(0) + #endif -- cgit v1.2.3