diff options
author | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-09-27 19:11:35 +0100 |
---|---|---|
committer | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-09-27 19:11:35 +0100 |
commit | 35f2b9fc8120776bbd5e6f2aa3ddf68ddb46bf33 (patch) | |
tree | fd27c6e4ce2df7ac07fc9ccc7b8594b54e1ab06a | |
parent | 1186c51cc953d95ffb0d1029d735ae7ff269d7a2 (diff) | |
download | nsgenjsbind-35f2b9fc8120776bbd5e6f2aa3ddf68ddb46bf33.tar.gz |
fix private data geenration and use
-rw-r--r-- | src/genjsbind-ast.c | 18 | ||||
-rw-r--r-- | src/genjsbind-ast.h | 7 | ||||
-rw-r--r-- | src/genjsbind-lexer.l | 4 | ||||
-rw-r--r-- | src/genjsbind-parser.y | 41 | ||||
-rw-r--r-- | src/jsapi-libdom.c | 72 | ||||
-rw-r--r-- | test/data/bindings/htmldocument.bnd | 16 |
6 files changed, 82 insertions, 76 deletions
diff --git a/src/genjsbind-ast.c b/src/genjsbind-ast.c index 32d5553..bcba958 100644 --- a/src/genjsbind-ast.c +++ b/src/genjsbind-ast.c @@ -130,8 +130,8 @@ char *genbind_node_gettext(struct genbind_node *node) case GENBIND_NODE_TYPE_STRING: case GENBIND_NODE_TYPE_PREAMBLE: case GENBIND_NODE_TYPE_IDENT: - case GENBIND_NODE_TYPE_TYPE_NODE: - case GENBIND_NODE_TYPE_TYPE_INTERFACE: + case GENBIND_NODE_TYPE_BINDING_TYPE: + case GENBIND_NODE_TYPE_BINDING_INTERFACE: return node->r.text; default: @@ -144,8 +144,7 @@ struct genbind_node *genbind_node_getnode(struct genbind_node *node) switch(node->type) { case GENBIND_NODE_TYPE_HDRCOMMENT: case GENBIND_NODE_TYPE_BINDING: - case GENBIND_NODE_TYPE_TYPE: - case GENBIND_NODE_TYPE_TYPE_EXTRA: + case GENBIND_NODE_TYPE_BINDING_PRIVATE: return node->r.node; default: @@ -177,16 +176,13 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type) case GENBIND_NODE_TYPE_BINDING: return "Binding"; - case GENBIND_NODE_TYPE_TYPE: + case GENBIND_NODE_TYPE_BINDING_TYPE: return "Type"; - case GENBIND_NODE_TYPE_TYPE_NODE: - return "Node"; + case GENBIND_NODE_TYPE_BINDING_PRIVATE: + return "Private"; - case GENBIND_NODE_TYPE_TYPE_EXTRA: - return "Extra"; - - case GENBIND_NODE_TYPE_TYPE_INTERFACE: + case GENBIND_NODE_TYPE_BINDING_INTERFACE: return "Interface"; default: diff --git a/src/genjsbind-ast.h b/src/genjsbind-ast.h index 9d25aad..6256414 100644 --- a/src/genjsbind-ast.h +++ b/src/genjsbind-ast.h @@ -17,10 +17,9 @@ enum genbind_node_type { GENBIND_NODE_TYPE_STRING, GENBIND_NODE_TYPE_PREAMBLE, GENBIND_NODE_TYPE_BINDING, - GENBIND_NODE_TYPE_TYPE, - GENBIND_NODE_TYPE_TYPE_NODE, - GENBIND_NODE_TYPE_TYPE_EXTRA, - GENBIND_NODE_TYPE_TYPE_INTERFACE, + GENBIND_NODE_TYPE_BINDING_TYPE, + GENBIND_NODE_TYPE_BINDING_PRIVATE, + GENBIND_NODE_TYPE_BINDING_INTERFACE, }; diff --git a/src/genjsbind-lexer.l b/src/genjsbind-lexer.l index 89796ad..dcd47d5 100644 --- a/src/genjsbind-lexer.l +++ b/src/genjsbind-lexer.l @@ -86,9 +86,7 @@ interface return TOK_INTERFACE; type return TOK_TYPE; -extra return TOK_EXTRA; - -node return TOK_NODE; +private return TOK_PRIVATE; {cblockopen} BEGIN(cblock); diff --git a/src/genjsbind-parser.y b/src/genjsbind-parser.y index de2bd10..3177c87 100644 --- a/src/genjsbind-parser.y +++ b/src/genjsbind-parser.y @@ -45,8 +45,7 @@ char *errtxt; %token TOK_BINDING %token TOK_INTERFACE %token TOK_TYPE -%token TOK_EXTRA -%token TOK_NODE +%token TOK_PRIVATE %token <text> TOK_IDENTIFIER %token <text> TOK_STRING_LITERAL @@ -64,10 +63,8 @@ char *errtxt; %type <node> BindingArgs %type <node> BindingArg %type <node> Type -%type <node> TypeArgs -%type <node> Extra +%type <node> Private %type <node> Interface -%type <node> Node %% @@ -180,44 +177,24 @@ BindingArg : Type | - Extra + Private | Interface ; Type : - TOK_TYPE TOK_IDENTIFIER '{' TypeArgs '}' ';' + TOK_TYPE TOK_IDENTIFIER ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_TYPE, - NULL, - genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2)); - } - ; - -TypeArgs - : - /* empty */ - { - $$ = NULL; - } - | - Node - ; - -Node - : - TOK_NODE TOK_IDENTIFIER ';' - { - $$ = genbind_new_node(GENBIND_NODE_TYPE_TYPE_NODE, NULL, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_TYPE, NULL, $2); } ; -Extra +Private : - TOK_EXTRA Strings ';' + TOK_PRIVATE Strings ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_TYPE_EXTRA, NULL, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_PRIVATE, NULL, $2); } ; @@ -225,7 +202,7 @@ Interface : TOK_INTERFACE TOK_IDENTIFIER ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_TYPE_INTERFACE, NULL, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_INTERFACE, NULL, $2); } ; diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index 4a1950b..0ff1c58 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -336,13 +336,21 @@ static int webidl_function_body_cb(struct webidl_node *node, void *ctx) fprintf(outfile, "static JSBool JSAPI_NATIVE(%s, JSContext *cx, uintN argc, jsval *vp)\n", webidl_node_gettext(ident_node)); - fprintf(outfile, "{\n"); -/* struct JSCLASS_TYPE *priv; + fprintf(outfile, + "{\n"); - priv = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL); - if (priv == NULL) - return JS_FALSE; + fprintf(outfile, + " struct jsclass_private *private;\n"); + fprintf(outfile, + " private = JS_GetInstancePrivate(cx,\n" + " JS_THIS_OBJECT(cx,vp),\n" + " &jsclass_object,\n" + " NULL);\n" + " if (priv == NULL)\n" + " return JS_FALSE;\n"); + +/* JSAPI_SET_RVAL(cx, vp, JSVAL_VOID); */ @@ -542,20 +550,33 @@ output_property_body(FILE *outfile, return res; } +static int webidl_privatestr_cb(struct genbind_node *node, void *ctx) +{ + FILE *outfile = ctx; + char *txt; + txt = genbind_node_gettext(node); + fprintf(outfile, " %s;\n", txt); + return 0; +} + +static int webidl_private_cb(struct genbind_node *node, void *ctx) +{ + genbind_node_for_each_type(genbind_node_getnode(node), + GENBIND_NODE_TYPE_STRING, + webidl_privatestr_cb, + ctx); + return 0; +} + static int output_private_declaration(FILE *outfile, struct binding *binding, struct genbind_node *genbind_ast, struct webidl_node *webidl_ast) { -/* -struct jsclass_document_priv { - struct html_content *htmlc; - dom_document *node; -}; -*/ struct genbind_node *binding_node; struct genbind_node *type_node; + struct genbind_node *node_node; binding_node = genbind_node_find(genbind_ast, NULL, @@ -569,18 +590,20 @@ struct jsclass_document_priv { type_node = genbind_node_find(genbind_node_getnode(binding_node), NULL, genbind_cmp_node_type, - (void *)GENBIND_NODE_TYPE_TYPE); + (void *)GENBIND_NODE_TYPE_BINDING_TYPE); if (type_node == NULL) { return -1; } + fprintf(outfile, "struct jsclass_private {\n"); + genbind_node_for_each_type(genbind_node_getnode(binding_node), + GENBIND_NODE_TYPE_BINDING_PRIVATE, + webidl_private_cb, + outfile); - fprintf(outfile, - "struct jsclass_private {\n" - "\n" - "};"); + fprintf(outfile, "};\n\n"); return 0; @@ -591,6 +614,21 @@ output_jsclass(FILE *outfile, struct binding *binding, struct webidl_node *webidl_ast) { + fprintf(outfile, + "static JSClass jsclass_object =\n" + "{\n" + " \"%s\",\n" + " JSCLASS_NEW_RESOLVE | JSCLASS_HAS_PRIVATE,\n" + " JS_PropertyStub,\n" + " JS_PropertyStub,\n" + " JS_PropertyStub,\n" + " JS_StrictPropertyStub,\n" + " JS_EnumerateStub,\n" + " (JSResolveOp)jsresove_node,\n" + " JS_ConvertStub,\n" + " jsfinalize_document,\n" + " JSCLASS_NO_OPTIONAL_MEMBERS\n" + "};\n\n", binding->interface); return 0; } @@ -622,7 +660,7 @@ static struct binding *binding_new(struct genbind_node *genbind_ast) interface_node = genbind_node_find(genbind_node_getnode(binding_node), NULL, genbind_cmp_node_type, - (void *)GENBIND_NODE_TYPE_TYPE_INTERFACE); + (void *)GENBIND_NODE_TYPE_BINDING_INTERFACE); if (interface_node == NULL) { return NULL; diff --git a/test/data/bindings/htmldocument.bnd b/test/data/bindings/htmldocument.bnd index 24699c1..6c470e4 100644 --- a/test/data/bindings/htmldocument.bnd +++ b/test/data/bindings/htmldocument.bnd @@ -54,15 +54,13 @@ static JSBool JSAPI_NATIVE(write, JSContext *cx, uintN argc, jsval *vp) ]]]; binding document { - type js_libdom { - node dom_document; - - }; /* the binding type and any instance specific extra data */ + type js_libdom; /* the binding type */ - extra "struct html_content *htmlc"; /* extra parameters to constructor - * value stored in private context - * structure. - */ + /* parameters to constructor value stored in private + * context structure. + */ + private "dom_document *node"; + private "struct html_content *htmlc"; interface Document; /* Web IDL interface to generate */ -};
\ No newline at end of file +}; |