summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vincent.sanders@collabora.co.uk>2012-11-20 20:29:56 +0000
committerVincent Sanders <vincent.sanders@collabora.co.uk>2012-11-20 20:29:56 +0000
commite709f23f29d7135a71923921db6eb059826955cf (patch)
tree543be5ac0ff6b3be5e7bab6bf81aad011ce12a33
parent841e93e4bc21729853e56b6d6b188d7b21450950 (diff)
downloadnsgenbind-e709f23f29d7135a71923921db6eb059826955cf.tar.gz
nsgenbind-e709f23f29d7135a71923921db6eb059826955cf.tar.bz2
generate unshared type property bodies
-rw-r--r--src/jsapi-libdom-property.c63
-rw-r--r--src/jsapi-libdom.c2
-rw-r--r--src/jsapi-libdom.h2
3 files changed, 60 insertions, 7 deletions
diff --git a/src/jsapi-libdom-property.c b/src/jsapi-libdom-property.c
index a488058..4f30011 100644
--- a/src/jsapi-libdom-property.c
+++ b/src/jsapi-libdom-property.c
@@ -17,6 +17,9 @@
#include "webidl-ast.h"
#include "jsapi-libdom.h"
+static int generate_property_spec(struct binding *binding, const char *interface);
+static int generate_property_body(struct binding *binding, const char *interface);
+
static int webidl_property_spec_cb(struct webidl_node *node, void *ctx)
{
@@ -93,7 +96,7 @@ static int webidl_property_spec_cb(struct webidl_node *node, void *ctx)
return 0;
}
-static int generate_property_spec(struct binding *binding, const char *interface);
+
/* callback to emit implements property spec */
static int webidl_property_spec_implements_cb(struct webidl_node *node, void *ctx)
{
@@ -583,11 +586,13 @@ static int webidl_implements_cb(struct webidl_node *node, void *ctx)
{
struct binding *binding = ctx;
- return output_property_body(binding, webidl_node_gettext(node));
+ return generate_property_body(binding, webidl_node_gettext(node));
}
-int
-output_property_body(struct binding *binding, const char *interface)
+
+
+static int
+generate_property_body(struct binding *binding, const char *interface)
{
struct webidl_node *interface_node;
struct webidl_node *members_node;
@@ -633,7 +638,7 @@ output_property_body(struct binding *binding, const char *interface)
WEBIDL_NODE_TYPE_INTERFACE_INHERITANCE);
if (inherit_node != NULL) {
- res = output_property_body(binding,
+ res = generate_property_body(binding,
webidl_node_gettext(inherit_node));
}
@@ -646,3 +651,51 @@ output_property_body(struct binding *binding, const char *interface)
return res;
}
+
+
+
+int unshared_property_cb(struct genbind_node *node, void *ctx)
+{
+ struct binding *binding = ctx;
+ struct genbind_node *type_node;
+
+ /* only need to generate property body for unshared types */
+ type_node = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_TYPE);
+
+ fprintf(binding->outfile,
+ "static JSBool JSAPI_PROPERTYSET(%s, JSContext *cx, JSObject *obj, jsval *vp)\n",
+ genbind_node_gettext(type_node));
+
+ fprintf(binding->outfile,
+ "{\n"
+ " return JS_FALSE;\n"
+ "}\n\n");
+
+ fprintf(binding->outfile,
+ "static JSBool JSAPI_PROPERTYGET(%s, JSContext *cx, JSObject *obj, jsval *vp)\n"
+ "{\n",
+ genbind_node_gettext(type_node));
+
+
+ return 0;
+}
+
+/* exported interface documented in jsapi-libdom.h */
+int
+output_property_body(struct binding *binding)
+{
+ int res;
+
+ res = generate_property_body(binding, binding->interface);
+
+ if (res == 0) {
+ res = genbind_node_for_each_type(binding->binding_list,
+ GENBIND_NODE_TYPE_BINDING_UNSHARED,
+ unshared_property_cb,
+ binding);
+ }
+
+ return res;
+}
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c
index e83d0ee..0ac16e8 100644
--- a/src/jsapi-libdom.c
+++ b/src/jsapi-libdom.c
@@ -724,7 +724,7 @@ int jsapi_libdom_output(char *outfilename, struct genbind_node *genbind_ast)
return 9;
}
- res = output_property_body(binding, binding->interface);
+ res = output_property_body(binding);
if (res) {
return 10;
}
diff --git a/src/jsapi-libdom.h b/src/jsapi-libdom.h
index b397e67..86214f4 100644
--- a/src/jsapi-libdom.h
+++ b/src/jsapi-libdom.h
@@ -49,7 +49,7 @@ int output_operator_body(struct binding *binding, const char *interface);
int output_function_spec(struct binding *binding);
int output_property_spec(struct binding *binding);
-int output_property_body(struct binding *binding, const char *interface);
+int output_property_body(struct binding *binding);
int output_const_defines(struct binding *binding, const char *interface);