summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vincent.sanders@collabora.co.uk>2012-11-23 13:45:32 +0000
committerVincent Sanders <vincent.sanders@collabora.co.uk>2012-11-23 13:45:32 +0000
commita1486c92cdefe045619b5ced38b3368c8f4457cf (patch)
tree1165a7f0a1e0f5a4cfc5564160d0e473f969eb5f
parent81e6f212a13bb6a3984e962e466864db97e95fc8 (diff)
downloadnsgenbind-a1486c92cdefe045619b5ced38b3368c8f4457cf.tar.gz
nsgenbind-a1486c92cdefe045619b5ced38b3368c8f4457cf.tar.bz2
make property type getters/setetrs extract the property name
-rw-r--r--src/jsapi-libdom-property.c105
1 files changed, 64 insertions, 41 deletions
diff --git a/src/jsapi-libdom-property.c b/src/jsapi-libdom-property.c
index 4ce6984..4e67120 100644
--- a/src/jsapi-libdom-property.c
+++ b/src/jsapi-libdom-property.c
@@ -21,6 +21,53 @@ static int generate_property_spec(struct binding *binding, const char *interface
static int generate_property_body(struct binding *binding, const char *interface);
+/* generate context data fetcher if the binding has private data */
+static inline int
+output_private_get(struct binding *binding, const char *argname)
+{
+ if (!binding->has_private) {
+ return 0;
+ }
+
+ return fprintf(binding->outfile,
+ "\tstruct jsclass_private *%s;\n"
+ "\n"
+ "\t%s = JS_GetInstancePrivate(cx, obj, &JSClass_%s, NULL);\n"
+ "\tif (%s == NULL) {\n"
+ "\t\treturn JS_FALSE;\n"
+ "\t}\n\n",
+ argname, argname, binding->interface, argname);
+}
+
+/* generate vars for property name getter */
+static inline int
+output_property_name_get_vars(struct binding *binding, const char *argname)
+{
+ /* get property name */
+ return fprintf(binding->outfile,
+ "\tjsval %s_jsval;\n"
+ "\tJSString *%s_jsstr = NULL;\n"
+ "\tint %s_len = 0;\n"
+ "\tchar *%s = NULL;\n",
+ argname, argname, argname, argname);
+}
+
+/* generate property name getter */
+static inline int
+output_property_name_get(struct binding *binding, const char *argname)
+{
+ /* get property name */
+ return fprintf(binding->outfile,
+ "\t /* obtain property name */\n"
+ "\tJSAPI_PROP_IDVAL(cx, &%s_jsval);\n"
+ "\t%s_jsstr = JS_ValueToString(cx, %s_jsval);\n"
+ "\tif (%s_jsstr != NULL) {\n"
+ "\t\tJSString_to_char(%s_jsstr, %s, %s_len);\n"
+ "\t}\n\n",
+ argname,argname,argname,argname,argname,argname,argname);
+}
+
+
/* search binding for property sharing modifier */
static enum genbind_type_modifier
get_binding_shared_modifier(struct binding *binding, const char *type, const char *ident)
@@ -488,19 +535,7 @@ static int output_property_getter(struct binding *binding,
/* return value declaration */
output_return_declaration(binding, "jsret", node);
- if (binding->has_private) {
- /* get context */
- fprintf(binding->outfile,
- "\tstruct jsclass_private *private;\n"
- "\n"
- "\tprivate = JS_GetInstancePrivate(cx,\n"
- "\t\tobj,\n"
- "\t\t&JSClass_%s,\n"
- "\t\tNULL);\n"
- "\tif (private == NULL)\n"
- "\t\treturn JS_FALSE;\n\n",
- binding->interface);
- }
+ output_private_get(binding, "private");
property_node = genbind_node_find_type_ident(binding->gb_ast,
NULL,
@@ -696,8 +731,8 @@ generate_property_body(struct binding *binding, const char *interface)
return res;
}
- /* setter for type handler */
+/* setter for type handler */
static int output_property_type_setter(struct binding *binding, struct genbind_node *node, const char *type)
{
struct genbind_node *property_node;
@@ -707,20 +742,14 @@ static int output_property_type_setter(struct binding *binding, struct genbind_n
"{\n",
type);
- if (binding->has_private) {
- /* get context */
- fprintf(binding->outfile,
- "\tstruct jsclass_private *private;\n"
- "\n"
- "\tprivate = JS_GetInstancePrivate(cx,\n"
- "\t\tobj,\n"
- "\t\t&JSClass_%s,\n"
- "\t\tNULL);\n"
- "\tif (private == NULL)\n"
- "\t\treturn JS_FALSE;\n\n",
- binding->interface);
- }
+ /* property name vars */
+ output_property_name_get_vars(binding, "propname");
+ /* context data */
+ output_private_get(binding, "private");
+ /* property name */
+ output_property_name_get(binding, "propname");
+ /* output binding code block */
property_node = genbind_node_find_type_ident(binding->gb_ast,
NULL,
GENBIND_NODE_TYPE_SETTER,
@@ -732,7 +761,7 @@ static int output_property_type_setter(struct binding *binding, struct genbind_n
}
fprintf(binding->outfile,
- " return JS_TRUE;\n"
+ "\treturn JS_TRUE;\n"
"}\n\n");
return 0;
@@ -749,20 +778,14 @@ static int output_property_type_getter(struct binding *binding, struct genbind_n
"{\n",
type);
- if (binding->has_private) {
- /* get context */
- fprintf(binding->outfile,
- "\tstruct jsclass_private *private;\n"
- "\n"
- "\tprivate = JS_GetInstancePrivate(cx,\n"
- "\t\tobj,\n"
- "\t\t&JSClass_%s,\n"
- "\t\tNULL);\n"
- "\tif (private == NULL)\n"
- "\t\treturn JS_FALSE;\n\n",
- binding->interface);
- }
+ /* property name vars */
+ output_property_name_get_vars(binding, "propname");
+ /* context data */
+ output_private_get(binding, "private");
+ /* property name */
+ output_property_name_get(binding, "propname");
+ /* output binding code block */
property_node = genbind_node_find_type_ident(binding->gb_ast,
NULL,
GENBIND_NODE_TYPE_GETTER,