summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent Sanders <vincent.sanders@collabora.co.uk>2012-09-27 19:11:35 +0100
committerVincent Sanders <vincent.sanders@collabora.co.uk>2012-09-27 19:11:35 +0100
commit35f2b9fc8120776bbd5e6f2aa3ddf68ddb46bf33 (patch)
treefd27c6e4ce2df7ac07fc9ccc7b8594b54e1ab06a /src
parent1186c51cc953d95ffb0d1029d735ae7ff269d7a2 (diff)
downloadnsgenbind-35f2b9fc8120776bbd5e6f2aa3ddf68ddb46bf33.tar.gz
nsgenbind-35f2b9fc8120776bbd5e6f2aa3ddf68ddb46bf33.tar.bz2
fix private data geenration and use
Diffstat (limited to 'src')
-rw-r--r--src/genjsbind-ast.c18
-rw-r--r--src/genjsbind-ast.h7
-rw-r--r--src/genjsbind-lexer.l4
-rw-r--r--src/genjsbind-parser.y41
-rw-r--r--src/jsapi-libdom.c72
5 files changed, 75 insertions, 67 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;