summaryrefslogtreecommitdiff
path: root/src/duk-libdom.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-08-09 11:07:11 +0100
committerVincent Sanders <vince@kyllikki.org>2015-08-09 11:07:11 +0100
commita9e5295d8735ff4ffe10e63f48728380edf6d7a0 (patch)
tree2ab8872a172bc11ac1a4c2b62b13170d9363bb58 /src/duk-libdom.c
parente78ea8b28064181d9081e7ff0143830c4ec37d7f (diff)
downloadnsgenbind-a9e5295d8735ff4ffe10e63f48728380edf6d7a0.tar.gz
nsgenbind-a9e5295d8735ff4ffe10e63f48728380edf6d7a0.tar.bz2
Update the interface map to contain all operation arguments
This extends the interface map (the intermediate representation) to have information on every operations arguments including overloading and optional arguments. This is important to allow automated checking of passed parameters numbers and types in future.
Diffstat (limited to 'src/duk-libdom.c')
-rw-r--r--src/duk-libdom.c108
1 files changed, 28 insertions, 80 deletions
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index a2d65af..195f4a4 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -160,19 +160,13 @@ output_dump_stack(FILE* outf)
static int
output_add_method(FILE* outf,
const char *class_name,
- const char *method,
- int argc)
+ const char *method)
{
fprintf(outf, "\t/* Add a method */\n");
fprintf(outf, "\tduk_dup(ctx, 0);\n");
fprintf(outf, "\tduk_push_string(ctx, \"%s\");\n", method);
- fprintf(outf, "\tduk_push_c_function(ctx, %s_%s_%s, ",
+ fprintf(outf, "\tduk_push_c_function(ctx, %s_%s_%s, DUK_VARARGS);\n",
DLPFX, class_name, method);
- if (argc == -1) {
- fprintf(outf, "DUK_VARARGS);\n");
- } else {
- fprintf(outf, "%d);\n", argc);
- }
output_dump_stack(outf);
fprintf(outf, "\tduk_def_prop(ctx, -3,\n");
fprintf(outf, "\t DUK_DEFPROP_HAVE_VALUE |\n");
@@ -700,35 +694,6 @@ output_interface_fini(FILE* outf,
/**
- * count the number of arguments to an operation
- *
- * \todo this needs to consider multiple lists (overloaded calls?), varadic
- * parameters.
- *
- * \retuen number of arguments or -1 if variable
- */
-static int count_operation_arguments(struct webidl_node *node)
-{
- int argc;
- struct webidl_node *list_node;
- list_node = webidl_node_find_type(
- webidl_node_getnode(node),
- NULL,
- WEBIDL_NODE_TYPE_LIST);
- if (list_node == NULL) {
- /** \todo is having no argument list an error or a warning? */
- return 0;
- }
- argc = webidl_node_enumerate_type(webidl_node_getnode(list_node),
- WEBIDL_NODE_TYPE_OPTIONAL_ARGUMENT);
- if (argc != 0) {
- return -1;
- }
- return webidl_node_enumerate_type(webidl_node_getnode(list_node),
- WEBIDL_NODE_TYPE_ARGUMENT);
-}
-
-/**
* generate a prototype add for a single class method
*/
static int
@@ -736,23 +701,12 @@ output_prototype_method(FILE* outf,
struct interface_map_entry *interfacee,
struct interface_map_operation_entry *operatione)
{
- int op_argc;
-
- if (operatione->overloadc > 1) {
- /* only generate a method for the first occourance of an
- * overloaded method
- */
- return 0;
- }
if (operatione->name != NULL) {
- /* normal method of prototype */
- op_argc = count_operation_arguments(operatione->node);
-
+ /* normal method on prototype */
output_add_method(outf,
interfacee->class_name,
- operatione->name,
- op_argc);
+ operatione->name);
} else {
/* special method on prototype */
fprintf(outf,
@@ -929,44 +883,38 @@ output_interface_operation(FILE* outf,
struct interface_map_entry *interfacee,
struct interface_map_operation_entry *operatione)
{
- if (operatione->overloadc > 1) {
- /* only generate a method for the first occourance of an
- * overloaded method
- */
+ int cdatac; /* cdata blocks output */
+
+ if (operatione->name == NULL) {
+ /* special method definition */
+ fprintf(outf,
+ "/* Special method definition - UNIMPLEMENTED */\n\n");
return 0;
}
- if (operatione->name != NULL) {
- /* normal method definition */
+ /* normal method definition */
- int cdatac; /* cdata blocks output */
+ fprintf(outf,
+ "static duk_ret_t %s_%s_%s(duk_context *ctx)\n",
+ DLPFX, interfacee->class_name, operatione->name);
+ fprintf(outf,"{\n");
- fprintf(outf,
- "static duk_ret_t %s_%s_%s(duk_context *ctx)\n",
- DLPFX, interfacee->class_name, operatione->name);
- fprintf(outf,"{\n");
-
- output_get_method_private(outf, interfacee->class_name);
-
- cdatac = output_cdata(outf,
- operatione->method,
- GENBIND_NODE_TYPE_CDATA);
-
- if (cdatac == 0) {
- /* no implementation so generate default */
- WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: method %s::%s();",
- interfacee->name, operatione->name);
- fprintf(outf,"\treturn 0;\n");
- }
+ output_get_method_private(outf, interfacee->class_name);
- fprintf(outf, "}\n\n");
- } else {
- /* special method definition */
- fprintf(outf,
- "/* Special method definition - UNIMPLEMENTED */\n\n");
+ cdatac = output_cdata(outf,
+ operatione->method,
+ GENBIND_NODE_TYPE_CDATA);
+
+ if (cdatac == 0) {
+ /* no implementation so generate default */
+ WARN(WARNING_UNIMPLEMENTED,
+ "Unimplemented: method %s::%s();",
+ interfacee->name, operatione->name);
+ fprintf(outf,"\treturn 0;\n");
}
+ fprintf(outf, "}\n\n");
+
return 0;
}