summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2012-10-21 12:55:27 +0100
committerVincent Sanders <vince@kyllikki.org>2012-10-21 12:55:27 +0100
commit903f328e2ea9405a0d351c828389cf0080670b6c (patch)
tree18b4a6878a192bb3fa9949e21a7c279466248c2a
parenta85a6601e5a401952b81a2da727c2f110459e6a4 (diff)
downloadnsgenbind-903f328e2ea9405a0d351c828389cf0080670b6c.tar.gz
nsgenbind-903f328e2ea9405a0d351c828389cf0080670b6c.tar.bz2
add basic input parameter readind
-rw-r--r--src/jsapi-libdom-operator.c163
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,