summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-01-01 18:31:37 +0000
committerVincent Sanders <vince@kyllikki.org>2014-05-16 14:38:56 +0100
commit188c8f049581143a92e3a710203d9c1d6598056b (patch)
tree516d49d87f71bfcfa064759ab64efcd43a931502
parent0d89adf43b0c3b85d698e333c157e7589f51beb7 (diff)
downloadnsgenbind-188c8f049581143a92e3a710203d9c1d6598056b.tar.gz
nsgenbind-188c8f049581143a92e3a710203d9c1d6598056b.tar.bz2
add function and property enumerations to the interface map
-rw-r--r--src/jsapi-libdom-function.c16
-rw-r--r--src/jsapi-libdom-property.c14
-rw-r--r--src/jsapi-libdom.c47
-rw-r--r--src/webidl-ast.c20
-rw-r--r--src/webidl-ast.h2
5 files changed, 83 insertions, 16 deletions
diff --git a/src/jsapi-libdom-function.c b/src/jsapi-libdom-function.c
index 594a100..0196c58 100644
--- a/src/jsapi-libdom-function.c
+++ b/src/jsapi-libdom-function.c
@@ -837,10 +837,10 @@ output_function_body(struct binding *binding, const char *interface)
return -1;
}
- members_node = webidl_node_find(webidl_node_getnode(interface_node),
- NULL,
- webidl_cmp_node_type,
- (void *)WEBIDL_NODE_TYPE_LIST);
+ 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);
@@ -851,10 +851,10 @@ output_function_body(struct binding *binding, const char *interface)
webidl_operator_body_cb,
binding);
- members_node = webidl_node_find(webidl_node_getnode(interface_node),
- members_node,
- webidl_cmp_node_type,
- (void *)WEBIDL_NODE_TYPE_LIST);
+ members_node = webidl_node_find_type(
+ webidl_node_getnode(interface_node),
+ members_node,
+ WEBIDL_NODE_TYPE_LIST);
}
/* check for inherited nodes and insert them too */
diff --git a/src/jsapi-libdom-property.c b/src/jsapi-libdom-property.c
index 7e67bae..df296cf 100644
--- a/src/jsapi-libdom-property.c
+++ b/src/jsapi-libdom-property.c
@@ -986,9 +986,10 @@ generate_property_body(struct binding *binding, const char *interface)
}
/* generate property bodies */
- members_node = webidl_node_find_type(webidl_node_getnode(interface_node),
- NULL,
- WEBIDL_NODE_TYPE_LIST);
+ 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);
@@ -1000,9 +1001,10 @@ generate_property_body(struct binding *binding, const char *interface)
binding);
- members_node = webidl_node_find_type(webidl_node_getnode(interface_node),
- members_node,
- WEBIDL_NODE_TYPE_LIST);
+ members_node = webidl_node_find_type(
+ webidl_node_getnode(interface_node),
+ members_node,
+ WEBIDL_NODE_TYPE_LIST);
}
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c
index bd1dbbe..2edfc83 100644
--- a/src/jsapi-libdom.c
+++ b/src/jsapi-libdom.c
@@ -819,6 +819,33 @@ binding_has_private(struct genbind_node *binding_list)
return false;
}
+
+/** count the number of methods or properties for an interface */
+static int
+enumerate_interface_own(struct webidl_node *interface_node,
+ enum webidl_node_type node_type)
+{
+ int count = 0;
+ struct webidl_node *members_node;
+
+ members_node = webidl_node_find_type(
+ webidl_node_getnode(interface_node),
+ NULL,
+ WEBIDL_NODE_TYPE_LIST);
+ while (members_node != NULL) {
+ count += webidl_node_enumerate_type(
+ webidl_node_getnode(members_node),
+ node_type);
+
+ members_node = webidl_node_find_type(
+ webidl_node_getnode(interface_node),
+ members_node,
+ WEBIDL_NODE_TYPE_LIST);
+ }
+
+ return count;
+}
+
/* build interface map and return the first interface */
static struct genbind_node *
build_interface_map(struct genbind_node *binding_node,
@@ -881,6 +908,17 @@ build_interface_map(struct genbind_node *binding_node,
return NULL;
}
+ /* enumerate the number of functions */
+ interfaces[idx].own_functions = enumerate_interface_own(
+ interfaces[idx].widl_node,
+ WEBIDL_NODE_TYPE_OPERATION);
+
+ /* enumerate the number of properties */
+ interfaces[idx].own_properties = enumerate_interface_own(
+ interfaces[idx].widl_node,
+ WEBIDL_NODE_TYPE_ATTRIBUTE);
+
+ /* extract the name of the inherited interface (if any) */
interfaces[idx].inherit_name = webidl_node_gettext(
webidl_node_find_type(
webidl_node_getnode(interfaces[idx].widl_node),
@@ -923,14 +961,19 @@ build_interface_map(struct genbind_node *binding_node,
/* show the interface map */
if (options->verbose) {
for (idx = 0; idx < interfacec; idx++ ) {
- printf("interface num:%d name:%s node:%p widl:%p inherit:%s inherit idx:%d refcount:%d\n",
+ printf("interface num:%d\n"
+ " name:%s node:%p widl:%p\n"
+ " inherit:%s inherit idx:%d refcount:%d\n"
+ " own functions:%d own properties:%d\n",
idx,
interfaces[idx].name,
interfaces[idx].node,
interfaces[idx].widl_node,
interfaces[idx].inherit_name,
interfaces[idx].inherit_idx,
- interfaces[idx].refcount);
+ interfaces[idx].refcount,
+ interfaces[idx].own_functions,
+ interfaces[idx].own_properties);
}
}
diff --git a/src/webidl-ast.c b/src/webidl-ast.c
index d75a186..8acb2fb 100644
--- a/src/webidl-ast.c
+++ b/src/webidl-ast.c
@@ -162,6 +162,26 @@ int webidl_cmp_node_type(struct webidl_node *node, void *ctx)
return 0;
}
+static int webidl_enumerate_node(struct webidl_node *node, void *ctx)
+{
+ node = node;
+ (*((int *)ctx))++;
+ return 0;
+}
+
+/* exported interface defined in nsgenbind-ast.h */
+int
+webidl_node_enumerate_type(struct webidl_node *node,
+ enum webidl_node_type type)
+{
+ int count = 0;
+ webidl_node_for_each_type(node,
+ type,
+ webidl_enumerate_node,
+ &count);
+ return count;
+}
+
/* exported interface defined in webidl-ast.h */
struct webidl_node *
webidl_node_find(struct webidl_node *node,
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 70518fd..eaa8d44 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -95,6 +95,8 @@ int webidl_node_for_each_type(struct webidl_node *node,
webidl_callback_t *cb,
void *ctx);
+int webidl_node_enumerate_type(struct webidl_node *node, enum webidl_node_type type);
+
struct webidl_node *
webidl_node_find(struct webidl_node *node,
struct webidl_node *prev,