diff options
author | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-11-20 13:44:27 +0000 |
---|---|---|
committer | Vincent Sanders <vincent.sanders@collabora.co.uk> | 2012-11-20 13:44:27 +0000 |
commit | e510204a381a7253d2cf69deeed01b043a4b80ad (patch) | |
tree | 7d956d8d7fe867511305a8c1d4d92c5862d20fb4 | |
parent | a044206384cb02aaaaab65f813878ddcd44b1dd1 (diff) | |
download | nsgenbind-e510204a381a7253d2cf69deeed01b043a4b80ad.tar.gz nsgenbind-e510204a381a7253d2cf69deeed01b043a4b80ad.tar.bz2 |
add unshared option
-rw-r--r-- | src/jsapi-libdom.c | 2 | ||||
-rw-r--r-- | src/nsgenbind-ast.c | 8 | ||||
-rw-r--r-- | src/nsgenbind-ast.h | 6 | ||||
-rw-r--r-- | src/nsgenbind-lexer.l | 2 | ||||
-rw-r--r-- | src/nsgenbind-parser.y | 14 | ||||
-rw-r--r-- | test/data/bindings/window.bnd | 51 |
6 files changed, 69 insertions, 14 deletions
diff --git a/src/jsapi-libdom.c b/src/jsapi-libdom.c index df36be8..fb8080f 100644 --- a/src/jsapi-libdom.c +++ b/src/jsapi-libdom.c @@ -536,7 +536,7 @@ output_private_declaration(struct binding *binding) type_node = genbind_node_find(genbind_node_getnode(binding_node), NULL, genbind_cmp_node_type, - (void *)GENBIND_NODE_TYPE_BINDING_TYPE); + (void *)GENBIND_NODE_TYPE_TYPE); if (type_node == NULL) { return -1; diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c index 52febaa..09ce8ce 100644 --- a/src/nsgenbind-ast.c +++ b/src/nsgenbind-ast.c @@ -173,7 +173,7 @@ 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_BINDING_TYPE: + case GENBIND_NODE_TYPE_TYPE: case GENBIND_NODE_TYPE_BINDING_INTERFACE: case GENBIND_NODE_TYPE_CBLOCK: return node->r.text; @@ -190,6 +190,7 @@ struct genbind_node *genbind_node_getnode(struct genbind_node *node) case GENBIND_NODE_TYPE_BINDING: case GENBIND_NODE_TYPE_BINDING_PRIVATE: case GENBIND_NODE_TYPE_BINDING_INTERNAL: + case GENBIND_NODE_TYPE_BINDING_UNSHARED: case GENBIND_NODE_TYPE_OPERATION: case GENBIND_NODE_TYPE_API: case GENBIND_NODE_TYPE_GETTER: @@ -225,7 +226,7 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type) case GENBIND_NODE_TYPE_BINDING: return "Binding"; - case GENBIND_NODE_TYPE_BINDING_TYPE: + case GENBIND_NODE_TYPE_TYPE: return "Type"; case GENBIND_NODE_TYPE_BINDING_PRIVATE: @@ -237,6 +238,9 @@ static const char *genbind_node_type_to_str(enum genbind_node_type type) case GENBIND_NODE_TYPE_BINDING_INTERFACE: return "Interface"; + case GENBIND_NODE_TYPE_BINDING_UNSHARED: + return "Unshared"; + case GENBIND_NODE_TYPE_OPERATION: return "Operation"; diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h index 54a49d2..5ae21b4 100644 --- a/src/nsgenbind-ast.h +++ b/src/nsgenbind-ast.h @@ -11,17 +11,19 @@ enum genbind_node_type { GENBIND_NODE_TYPE_ROOT = 0, - GENBIND_NODE_TYPE_IDENT, + GENBIND_NODE_TYPE_IDENT, /* generic identifier string */ + GENBIND_NODE_TYPE_TYPE, /* generic type string */ + GENBIND_NODE_TYPE_CBLOCK, GENBIND_NODE_TYPE_WEBIDLFILE, GENBIND_NODE_TYPE_HDRCOMMENT, GENBIND_NODE_TYPE_STRING, GENBIND_NODE_TYPE_PREAMBLE, GENBIND_NODE_TYPE_BINDING, - GENBIND_NODE_TYPE_BINDING_TYPE, GENBIND_NODE_TYPE_BINDING_PRIVATE, GENBIND_NODE_TYPE_BINDING_INTERNAL, GENBIND_NODE_TYPE_BINDING_INTERFACE, + GENBIND_NODE_TYPE_BINDING_UNSHARED, GENBIND_NODE_TYPE_API, GENBIND_NODE_TYPE_OPERATION, GENBIND_NODE_TYPE_GETTER, diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l index 61aee7e..aea68ee 100644 --- a/src/nsgenbind-lexer.l +++ b/src/nsgenbind-lexer.l @@ -96,6 +96,8 @@ private return TOK_PRIVATE; internal return TOK_INTERNAL; +unshared return TOK_UNSHARED; + operation return TOK_OPERATION; api return TOK_API; diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y index 1ffab7a..e64d255 100644 --- a/src/nsgenbind-parser.y +++ b/src/nsgenbind-parser.y @@ -51,6 +51,7 @@ char *errtxt; %token TOK_TYPE %token TOK_PRIVATE %token TOK_INTERNAL +%token TOK_UNSHARED %token <text> TOK_IDENTIFIER %token <text> TOK_STRING_LITERAL @@ -71,6 +72,7 @@ char *errtxt; %type <node> Private %type <node> Internal %type <node> Interface +%type <node> Unshared %type <node> Operation %type <node> Api %type <node> Getter @@ -252,13 +254,15 @@ BindingArg Internal | Interface + | + Unshared ; Type : TOK_TYPE TOK_IDENTIFIER ';' { - $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_TYPE, NULL, $2); + $$ = genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $2); } ; @@ -290,4 +294,12 @@ Interface } ; +Unshared + : + TOK_UNSHARED TOK_TYPE TOK_IDENTIFIER ';' + { + $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING_UNSHARED, NULL, + genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $3)); + } + ; %% diff --git a/test/data/bindings/window.bnd b/test/data/bindings/window.bnd index 956932c..b843aaf 100644 --- a/test/data/bindings/window.bnd +++ b/test/data/bindings/window.bnd @@ -23,21 +23,36 @@ binding window { interface Window; /* Web IDL interface to generate */ - /* private are parameters to constructor stored in private - * context structure. - * - * internal are value stored in private context structure but not - * passed to constructor but are considered for property - * getters/setters. - */ private "struct browser_window *" bw; private "struct html_content *" htmlc; + internal "JSObject *" document; internal "JSObject *" navigator; internal "JSObject *" console; internal "JSObject *" location; + + unshared type EventHandler; } +api mark %{ + if (private != NULL) { + if (private->document != NULL) { + JSAPI_GCMARK(private->document); + } + if (private->navigator != NULL) { + JSAPI_GCMARK(private->navigator); + } + if (private->console != NULL) { + JSAPI_GCMARK(private->console); + } + if (private->location != NULL) { + JSAPI_GCMARK(private->location); + } + } +%} + +api global %{ +%} api init %{ JSObject *user_proto; @@ -101,6 +116,26 @@ api init %{ return NULL; } + user_proto = jsapi_InitClass_HTMLCollection(cx, prototype); + if (user_proto == NULL) { + return NULL; + } + + user_proto = jsapi_InitClass_NodeList(cx, prototype); + if (user_proto == NULL) { + return NULL; + } + + user_proto = jsapi_InitClass_Text(cx, prototype); + if (user_proto == NULL) { + return NULL; + } + + user_proto = jsapi_InitClass_Node(cx, prototype); + if (user_proto == NULL) { + return NULL; + } + %} api new %{ @@ -114,7 +149,7 @@ api new %{ private->document = jsapi_new_Document(cx, NULL, newobject, - htmlc->document, + (dom_document *)dom_node_ref(htmlc->document), htmlc); if (private->document == NULL) { free(private); |