diff options
author | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-11-23 13:45:32 +0000 |
---|---|---|
committer | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-11-23 13:45:32 +0000 |
commit | a1486c92cdefe045619b5ced38b3368c8f4457cf (patch) | |
tree | 1165a7f0a1e0f5a4cfc5564160d0e473f969eb5f /src/jsapi-libdom-property.c | |
parent | 81e6f212a13bb6a3984e962e466864db97e95fc8 (diff) | |
download | nsgenbind-a1486c92cdefe045619b5ced38b3368c8f4457cf.tar.gz nsgenbind-a1486c92cdefe045619b5ced38b3368c8f4457cf.tar.bz2 |
make property type getters/setetrs extract the property name
Diffstat (limited to 'src/jsapi-libdom-property.c')
-rw-r--r-- | src/jsapi-libdom-property.c | 105 |
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, |