summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vincent.sanders@collabora.co.uk>2012-11-20 13:44:27 +0000
committerVincent Sanders <vincent.sanders@collabora.co.uk>2012-11-20 13:44:27 +0000
commite510204a381a7253d2cf69deeed01b043a4b80ad (patch)
tree7d956d8d7fe867511305a8c1d4d92c5862d20fb4
parenta044206384cb02aaaaab65f813878ddcd44b1dd1 (diff)
downloadnsgenbind-e510204a381a7253d2cf69deeed01b043a4b80ad.tar.gz
nsgenbind-e510204a381a7253d2cf69deeed01b043a4b80ad.tar.bz2
add unshared option
-rw-r--r--src/jsapi-libdom.c2
-rw-r--r--src/nsgenbind-ast.c8
-rw-r--r--src/nsgenbind-ast.h6
-rw-r--r--src/nsgenbind-lexer.l2
-rw-r--r--src/nsgenbind-parser.y14
-rw-r--r--test/data/bindings/window.bnd51
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);