From fbd184fe421591851e1224518a3c9430dd37dce8 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Thu, 4 Oct 2012 19:48:32 +0100 Subject: allow teh binding to specify contents for operations --- src/genjsbind-ast.c | 5 ++++ src/genjsbind-ast.h | 2 ++ src/genjsbind-lexer.l | 10 ++++--- src/genjsbind-parser.y | 21 +++++++++++-- test/data/bindings/htmldocument.bnd | 59 +++++++++++++++---------------------- 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 */ -[^\]]* yylval->text = strdup(yytext); return TOK_CCODE_LITERAL; +[^\%]* yylval->text = strdup(yytext); return TOK_CCODE_LITERAL; {cblockclose} BEGIN(INITIAL); -\]+ yylval->text = strdup(yytext); return TOK_CCODE_LITERAL; +\% 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 Type %type Private %type Interface +%type 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 - + #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 */ +} -- cgit v1.2.3