summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vincent.sanders@collabora.co.uk>2012-10-04 19:48:32 +0100
committerVincent Sanders <vincent.sanders@collabora.co.uk>2012-10-04 19:48:32 +0100
commitfbd184fe421591851e1224518a3c9430dd37dce8 (patch)
tree583578eb6d9f6aec338605ca4afd5a691051e4fc
parent56c66282650a7a5ac83e549d11839d26deaa1528 (diff)
downloadnsgenbind-fbd184fe421591851e1224518a3c9430dd37dce8.tar.gz
nsgenbind-fbd184fe421591851e1224518a3c9430dd37dce8.tar.bz2
allow teh binding to specify contents for operations
-rw-r--r--src/genjsbind-ast.c5
-rw-r--r--src/genjsbind-ast.h2
-rw-r--r--src/genjsbind-lexer.l10
-rw-r--r--src/genjsbind-parser.y21
-rw-r--r--test/data/bindings/htmldocument.bnd59
5 files changed, 56 insertions, 41 deletions
diff --git a/src/genjsbind-ast.c b/src/genjsbind-ast.c
index bcba958..2927eab 100644
--- a/src/genjsbind-ast.c
+++ b/src/genjsbind-ast.c
@@ -132,6 +132,7 @@ char *genbind_node_gettext(struct genbind_node *node)
case GENBIND_NODE_TYPE_IDENT:
case GENBIND_NODE_TYPE_BINDING_TYPE:
case GENBIND_NODE_TYPE_BINDING_INTERFACE:
+ case GENBIND_NODE_TYPE_CBLOCK:
return node->r.text;
default:
@@ -145,6 +146,7 @@ struct genbind_node *genbind_node_getnode(struct genbind_node *node)
case GENBIND_NODE_TYPE_HDRCOMMENT:
case GENBIND_NODE_TYPE_BINDING:
case GENBIND_NODE_TYPE_BINDING_PRIVATE:
+ case GENBIND_NODE_TYPE_OPERATION:
return node->r.node;
default:
@@ -185,6 +187,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_OPERATION:
+ return "Operation";
+
default:
return "Unknown";
}
diff --git a/src/genjsbind-ast.h b/src/genjsbind-ast.h
index 6256414..0772169 100644
--- a/src/genjsbind-ast.h
+++ b/src/genjsbind-ast.h
@@ -12,6 +12,7 @@
enum genbind_node_type {
GENBIND_NODE_TYPE_ROOT = 0,
GENBIND_NODE_TYPE_IDENT,
+ GENBIND_NODE_TYPE_CBLOCK,
GENBIND_NODE_TYPE_WEBIDLFILE,
GENBIND_NODE_TYPE_HDRCOMMENT,
GENBIND_NODE_TYPE_STRING,
@@ -20,6 +21,7 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_BINDING_TYPE,
GENBIND_NODE_TYPE_BINDING_PRIVATE,
GENBIND_NODE_TYPE_BINDING_INTERFACE,
+ GENBIND_NODE_TYPE_OPERATION,
};
diff --git a/src/genjsbind-lexer.l b/src/genjsbind-lexer.l
index dcd47d5..2282c5e 100644
--- a/src/genjsbind-lexer.l
+++ b/src/genjsbind-lexer.l
@@ -56,9 +56,9 @@ identifier [A-Z_a-z][0-9A-Z_a-z]*
other [^\t\n\r 0-9A-Z_a-z]
-cblockopen \[\[\[
+cblockopen \%\{
-cblockclose \]\]\]
+cblockclose \%\}
%x cblock
@@ -88,6 +88,8 @@ type return TOK_TYPE;
private return TOK_PRIVATE;
+operation return TOK_OPERATION;
+
{cblockopen} BEGIN(cblock);
{identifier} {
@@ -106,8 +108,8 @@ private return TOK_PRIVATE;
. /* nothing */
-<cblock>[^\]]* yylval->text = strdup(yytext); return TOK_CCODE_LITERAL;
+<cblock>[^\%]* yylval->text = strdup(yytext); return TOK_CCODE_LITERAL;
<cblock>{cblockclose} BEGIN(INITIAL);
-<cblock>\]+ yylval->text = strdup(yytext); return TOK_CCODE_LITERAL;
+<cblock>\% yylval->text = strdup(yytext); return TOK_CCODE_LITERAL;
%%
diff --git a/src/genjsbind-parser.y b/src/genjsbind-parser.y
index 3177c87..0950dc9 100644
--- a/src/genjsbind-parser.y
+++ b/src/genjsbind-parser.y
@@ -43,6 +43,7 @@ char *errtxt;
%token TOK_PREAMBLE
%token TOK_BINDING
+%token TOK_OPERATION
%token TOK_INTERFACE
%token TOK_TYPE
%token TOK_PRIVATE
@@ -65,6 +66,7 @@ char *errtxt;
%type <node> Type
%type <node> Private
%type <node> Interface
+%type <node> Operation
%%
@@ -103,6 +105,8 @@ Statement
Preamble
|
Binding
+ |
+ Operation
;
/* [3] load a web IDL file */
@@ -137,7 +141,7 @@ Strings
Preamble
:
- TOK_PREAMBLE CBlock ';'
+ TOK_PREAMBLE CBlock
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PREAMBLE, NULL, $2);
}
@@ -153,9 +157,22 @@ CBlock
}
;
+Operation
+ :
+ TOK_OPERATION TOK_IDENTIFIER CBlock
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_OPERATION,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_CBLOCK,
+ NULL,
+ $3),
+ $2));
+ }
+
Binding
:
- TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' ';'
+ TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
NULL,
diff --git a/test/data/bindings/htmldocument.bnd b/test/data/bindings/htmldocument.bnd
index 6c470e4..8d35df9 100644
--- a/test/data/bindings/htmldocument.bnd
+++ b/test/data/bindings/htmldocument.bnd
@@ -12,55 +12,44 @@ hdrcomment "multi"
hdrcomment "IDL http://www.whatwg.org/specs/web-apps/current-work/#the-document-object";
-preamble [[[
+preamble %{
#include <dom/dom.h>
-
+
#include "utils/config.h"
#include "utils/log.h"
#include "javascript/jsapi.h"
-static JSBool JSAPI_NATIVE(write, JSContext *cx, uintN argc, jsval *vp)
-{
- JSString* u16_txt;
- char *txt;
- unsigned long length;
- struct jsclass_document_priv *document;
-
- document = JS_GetInstancePrivate(cx, JS_THIS_OBJECT(cx,vp), &JSCLASS_OBJECT, NULL);
- if (document == NULL) {
- return JS_FALSE;
- }
- if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt)) {
- return JS_FALSE;
- }
+ %}
- JSString_to_char(u16_txt, txt, length);
+operation write %{
- LOG(("content %p parser %p writing %s",
- document->htmlc, document->htmlc->parser, txt));
- if (document->htmlc->parser != NULL) {
- dom_hubbub_parser_insert_chunk(document->htmlc->parser, (uint8_t *)txt, length);
- }
- JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
+ if (!JS_ConvertArguments(cx, argc, JSAPI_ARGV(cx, vp), "S", &u16_txt)) {
+ return JS_FALSE;
+ }
- foo[23] = bar[n +[x]];
+ JSString_to_char(u16_txt, txt, length);
- return JS_TRUE;
-}
+ LOG(("content %p parser %p writing %s",
+ document->htmlc, document->htmlc->parser, txt));
+ if (document->htmlc->parser != NULL) {
+ dom_hubbub_parser_insert_chunk(document->htmlc->parser, (uint8_t *)txt, length);
+ }
+ JSAPI_SET_RVAL(cx, vp, JSVAL_VOID);
-]]];
+ return JS_TRUE;
+ %}
binding document {
- type js_libdom; /* the binding type */
+ type js_libdom; /* the binding type */
- /* parameters to constructor value stored in private
- * context structure.
- */
- private "dom_document *node";
- private "struct html_content *htmlc";
+ /* 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 */
-};
+ interface Document; /* Web IDL interface to generate */
+}