diff options
author | Vincent Sanders <vince@kyllikki.org> | 2012-10-21 12:55:27 +0100 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2012-10-21 12:55:27 +0100 |
commit | 903f328e2ea9405a0d351c828389cf0080670b6c (patch) | |
tree | 18b4a6878a192bb3fa9949e21a7c279466248c2a | |
parent | a85a6601e5a401952b81a2da727c2f110459e6a4 (diff) | |
download | nsgenbind-903f328e2ea9405a0d351c828389cf0080670b6c.tar.gz nsgenbind-903f328e2ea9405a0d351c828389cf0080670b6c.tar.bz2 |
add basic input parameter readind
-rw-r--r-- | src/jsapi-libdom-operator.c | 163 |
1 files changed, 132 insertions, 31 deletions
diff --git a/src/jsapi-libdom-operator.c b/src/jsapi-libdom-operator.c index 20d4170..05b0239 100644 --- a/src/jsapi-libdom-operator.c +++ b/src/jsapi-libdom-operator.c @@ -17,13 +17,13 @@ #include "webidl-ast.h" #include "jsapi-libdom.h" -/** creates all the variable definitions - * +/** creates all the variable definitions + * * generate functions variables (including return value) with default - * values as appropriate + * values as appropriate */ -static void -output_variable_definitions(struct binding *binding, +static void +output_variable_definitions(struct binding *binding, struct webidl_node *operation_list) { struct webidl_node *arglist_node; @@ -64,69 +64,85 @@ output_variable_definitions(struct binding *binding, arg_type_base = webidl_node_find_type(webidl_node_getnode(arg_type), NULL, WEBIDL_NODE_TYPE_TYPE_BASE); - + webidl_arg_type = webidl_node_getint(arg_type_base); switch (webidl_arg_type) { case WEBIDL_TYPE_USER: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_USER\n"); break; case WEBIDL_TYPE_BOOL: /* JSBool */ - fprintf(binding->outfile, + fprintf(binding->outfile, "\tjsBool %s = JS_FALSE;\n", webidl_node_gettext(arg_ident)); break; case WEBIDL_TYPE_BYTE: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_BYTE\n"); + break; + case WEBIDL_TYPE_OCTET: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_OCTET\n"); break; case WEBIDL_TYPE_FLOAT: case WEBIDL_TYPE_DOUBLE: /* double */ - fprintf(binding->outfile, + fprintf(binding->outfile, "\tdouble %s = 0;\n", webidl_node_gettext(arg_ident)); break; case WEBIDL_TYPE_SHORT: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_SHORT\n"); + break; + case WEBIDL_TYPE_LONGLONG: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_LONGLONG\n"); break; case WEBIDL_TYPE_LONG: /* int32_t */ - fprintf(binding->outfile, + fprintf(binding->outfile, "\tint32_t %s = 0;\n", webidl_node_gettext(arg_ident)); break; case WEBIDL_TYPE_STRING: /* JSString * */ - fprintf(binding->outfile, - "\tJSString *%s = NULL;\n", + fprintf(binding->outfile, + "\tJSString *%1$s_jsstr = NULL;\n" + "\tint %1$s_len = 0;\n" + "\tchar *%1$s = NULL;\n", webidl_node_gettext(arg_ident)); break; case WEBIDL_TYPE_SEQUENCE: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_SEQUENCE\n"); break; case WEBIDL_TYPE_OBJECT: /* JSObject * */ - fprintf(binding->outfile, + fprintf(binding->outfile, "\tJSObject *%s = NULL;\n", webidl_node_gettext(arg_ident)); break; case WEBIDL_TYPE_DATE: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_DATE\n"); + break; + case WEBIDL_TYPE_VOID: + fprintf(stderr, "Unsupported: WEBIDL_TYPE_VOID\n"); break; default: break; } - + /* next argument */ arg_node = webidl_node_find_type(arglist, @@ -136,19 +152,25 @@ output_variable_definitions(struct binding *binding, } -static void -output_operation_input(struct binding *binding, +/** generate code to process operation input from javascript */ +static void +output_operation_input(struct binding *binding, struct webidl_node *operation_list) { - struct webidl_node *arglist_node; struct webidl_node *arglist; /* argument list */ struct webidl_node *arg_node = NULL; + struct webidl_node *arg_ident = NULL; + struct webidl_node *arg_type = NULL; + struct webidl_node *arg_type_base = NULL; + enum webidl_type webidl_arg_type; - arglist_node = webidl_node_find(operation_list, - NULL, - webidl_cmp_node_type, - (void *)WEBIDL_NODE_TYPE_LIST); + int arg_cur = 0; /* current position in the input argument vector */ + + /* input variables */ + arglist_node = webidl_node_find_type(operation_list, + NULL, + WEBIDL_NODE_TYPE_LIST); if (arglist_node == NULL) { return; /* @todo check if this is broken AST */ @@ -157,31 +179,107 @@ output_operation_input(struct binding *binding, arglist = webidl_node_getnode(arglist_node); arg_node = webidl_node_find_type(arglist, - arg_node, - WEBIDL_NODE_TYPE_ARGUMENT); + arg_node, + WEBIDL_NODE_TYPE_ARGUMENT); while (arg_node != NULL) { + /* generate variable to hold the argument */ + arg_ident = webidl_node_find_type(webidl_node_getnode(arg_node), + NULL, + WEBIDL_NODE_TYPE_IDENT); + + arg_type = webidl_node_find_type(webidl_node_getnode(arg_node), + NULL, + WEBIDL_NODE_TYPE_TYPE); + + arg_type_base = webidl_node_find_type(webidl_node_getnode(arg_type), + NULL, + WEBIDL_NODE_TYPE_TYPE_BASE); + + webidl_arg_type = webidl_node_getint(arg_type_base); + + switch (webidl_arg_type) { + case WEBIDL_TYPE_USER: + break; + + case WEBIDL_TYPE_BOOL: + /* JSBool */ + fprintf(binding->outfile, + "\tif (!JS_ValueToBoolean(cx, argv[%d], &%s)) {\n" + "\t\treturn JS_FALSE\n" + "\t}\n", + arg_cur, + webidl_node_gettext(arg_ident)); + + break; -/* - if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt)) { - return JS_FALSE; - } + case WEBIDL_TYPE_BYTE: + case WEBIDL_TYPE_OCTET: + break; - JSString_to_char(u16_txt, txt, length); + case WEBIDL_TYPE_FLOAT: + case WEBIDL_TYPE_DOUBLE: + /* double */ + fprintf(binding->outfile, + "\tdouble %s = 0;\n", + webidl_node_gettext(arg_ident)); + break; -*/ + case WEBIDL_TYPE_SHORT: + case WEBIDL_TYPE_LONGLONG: + break; + case WEBIDL_TYPE_LONG: + /* int32_t */ + fprintf(binding->outfile, + "\tint32_t %s = 0;\n", + webidl_node_gettext(arg_ident)); + break; + case WEBIDL_TYPE_STRING: + /* JSString * */ + fprintf(binding->outfile, + "\t%1$s_jsstr = JS_ValueToString(cx, argv[%2$d]);\n" + "\tif (%1$s_jsstr == NULL) {\n" + "\t\treturn JS_FALSE\n" + "\t}\n\n" + "\tJSString_to_char(%1$s_jsstr, %1$s, %1$s_len);\n", + webidl_node_gettext(arg_ident), + arg_cur); + + break; + + case WEBIDL_TYPE_SEQUENCE: + break; + + case WEBIDL_TYPE_OBJECT: + /* JSObject * */ + fprintf(binding->outfile, + "\tJSObject *%s = NULL;\n", + webidl_node_gettext(arg_ident)); + break; + + case WEBIDL_TYPE_DATE: + case WEBIDL_TYPE_VOID: + break; + + default: + break; + } + + + /* next argument */ arg_node = webidl_node_find_type(arglist, arg_node, WEBIDL_NODE_TYPE_ARGUMENT); - } + arg_cur++; + } } -static void -output_operation_code_block(struct binding *binding, +static void +output_operation_code_block(struct binding *binding, struct genbind_node *operation_list) { struct genbind_node *code_node; @@ -224,6 +322,9 @@ static int webidl_operator_body_cb(struct webidl_node *node, void *ctx) fprintf(binding->outfile, "\tstruct jsclass_private *private;\n"); + fprintf(binding->outfile, + "\tjsval *argv = JSAPI_ARGV(cx, vp);\n"); + output_variable_definitions(binding, webidl_node_getnode(node)); fprintf(binding->outfile, |