Gitweb links:
...log
http://git.netsurf-browser.org/nsgenbind.git/shortlog/f9dacddfe39ba67a708...
...commit
http://git.netsurf-browser.org/nsgenbind.git/commit/f9dacddfe39ba67a70890...
...tree
http://git.netsurf-browser.org/nsgenbind.git/tree/f9dacddfe39ba67a70890b2...
The branch, master has been updated
via f9dacddfe39ba67a70890b2bde2e3ddb8d1b0705 (commit)
via ac6ae0a7b545dbf3391760cfe9e6b86ce0c579db (commit)
via 476bc961ae4c490dfa0f09293c5611451bb42599 (commit)
via c80955dcc6b663c250a1f2552b626770fbd46a94 (commit)
via 767e69459ca7b4c13fe93875177040ab3eec8b56 (commit)
via 017eb2ef4da167466c05ad83eb0714129a2e46ff (commit)
via 53acb5a29b8eb4fe89dd2e8bc3b808d5e7183b81 (commit)
via 4a7185fd4a25b1456737b8fa2ac6a770a3e1721e (commit)
from 5b0ac4502fd4407d51c165e0ea4ef814b3253fa9 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=f9dacddfe39ba67a7...
commit f9dacddfe39ba67a70890b2bde2e3ddb8d1b0705
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Process extended attributes for constructors
Extended attributes for constructors and named constructors are now
parsed into the AST as operations ready to be used to generate output.
diff --git a/src/webidl-lexer.l b/src/webidl-lexer.l
index 4788610..a857654 100644
--- a/src/webidl-lexer.l
+++ b/src/webidl-lexer.l
@@ -215,6 +215,10 @@ legacyiterable return TOK_LEGACYITERABLE;
required return TOK_REQUIRED;
+Constructor return TOK_CONSTRUCTOR;
+
+NamedConstructor return TOK_NAMEDCONSTRUCTOR;
+
{identifier} {
/* A leading "_" is used to escape an identifier from
* looking like a reserved word terminal. */
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index 406962f..b48b449 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -67,6 +67,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char
*str)
%token TOK_BYTE
%token TOK_CALLBACK
%token TOK_CONST
+%token TOK_CONSTRUCTOR
%token TOK_CREATOR
%token TOK_DATE
%token TOK_DELETER
@@ -92,6 +93,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char
*str)
%token TOK_MODULE
%token TOK_NAN
%token TOK_NATIVE
+%token TOK_NAMEDCONSTRUCTOR
%token TOK_NULL_LITERAL
%token TOK_OBJECT
%token TOK_OCTET
@@ -580,12 +582,12 @@ PartialDictionary:
Default:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'=' DefaultValue
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -619,12 +621,12 @@ ExceptionMembers:
Inheritance:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
':' TOK_IDENTIFIER
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -632,7 +634,7 @@ Inheritance:
Enum:
TOK_ENUM TOK_IDENTIFIER '{' EnumValueList '}' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -662,7 +664,7 @@ EnumValueListString:
CallbackRest:
TOK_IDENTIFIER '=' ReturnType '(' ArgumentList ')'
';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -670,7 +672,7 @@ CallbackRest:
Typedef:
TOK_TYPEDEF ExtendedAttributeList Type TOK_IDENTIFIER ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -732,12 +734,14 @@ ConstValue:
|
TOK_INT_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT, NULL, (void *)$1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT,
+ NULL,
+ (void *)$1);
}
|
TOK_NULL_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
}
;
@@ -745,12 +749,16 @@ ConstValue:
BooleanLiteral:
TOK_TRUE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)true);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)true);
}
|
TOK_FALSE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)false);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)false);
}
;
@@ -758,34 +766,42 @@ BooleanLiteral:
FloatLiteral:
TOK_FLOAT_LITERAL
{
- float *value;
- value = malloc(sizeof(float));
- *value = strtof($1, NULL);
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = strtof($1, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
'-' TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = -INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = -INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_NAN
{
- float *value;
- value = malloc(sizeof(float));
- *value = NAN;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = NAN;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
;
@@ -793,7 +809,7 @@ FloatLiteral:
AttributeOrOperation:
TOK_STRINGIFIER StringifierAttributeOrOperation
{
- $$ = $2;
+ $$ = $2;
}
|
Attribute
@@ -807,13 +823,13 @@ StringifierAttributeOrOperation:
|
OperationRest
{
- /* @todo deal with stringifier */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
+ /* @todo deal with stringifier */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
}
|
';'
{
- $$=NULL;
+ $$=NULL;
}
;
@@ -915,7 +931,7 @@ AttributeName:
AttributeNameKeyword:
TOK_REQUIRED
{
- $$ = strdup("required");
+ $$ = strdup("required");
}
/* [33]
@@ -924,12 +940,12 @@ AttributeNameKeyword:
Inherit:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_INHERIT
{
- $$ = true;
+ $$ = true;
}
;
@@ -940,12 +956,12 @@ Inherit:
ReadOnly:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_READONLY
{
- $$ = true;
+ $$ = true;
}
;
@@ -999,34 +1015,39 @@ Special:
TOK_GETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_GETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_GETTER);
}
|
TOK_SETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_SETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_SETTER);
}
|
TOK_CREATOR
{
- /* second edition removed this special but teh
- specifications still use it!
- */
+ /* second edition removed this special but the
+ * specifications still use it!
+ */
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
}
|
TOK_DELETER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_DELETER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_DELETER);
}
|
TOK_LEGACYCALLER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
}
;
@@ -1034,10 +1055,10 @@ Special:
OperationRest:
OptionalIdentifier '(' ArgumentList ')' ';'
{
- /* argument list */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
+ /* argument list */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
- $$ = webidl_node_prepend($1, $$); /* identifier */
+ $$ = webidl_node_prepend($1, $$); /* identifier */
}
;
@@ -1045,12 +1066,12 @@ OperationRest:
OptionalIdentifier:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_IDENTIFIER
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
}
;
@@ -1061,12 +1082,12 @@ OptionalIdentifier:
ArgumentList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
Argument Arguments
{
- $$ = webidl_node_append($2, $1);
+ $$ = webidl_node_append($2, $1);
}
;
@@ -1074,12 +1095,12 @@ ArgumentList:
Arguments:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Argument Arguments
{
- $$ = webidl_node_append($3, $2);
+ $$ = webidl_node_append($3, $2);
}
;
@@ -1088,7 +1109,7 @@ Arguments:
Argument:
ExtendedAttributeList OptionalOrRequiredArgument
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -1124,12 +1145,12 @@ ArgumentName:
Ellipsis:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_ELLIPSIS
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
}
;
@@ -1137,12 +1158,12 @@ Ellipsis:
Iterable:
TOK_ITERABLE '<' Type OptionalType '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_LEGACYITERABLE '<' Type '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1150,12 +1171,12 @@ Iterable:
OptionalType:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Type
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1175,12 +1196,14 @@ ExceptionField:
ExtendedAttributeList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'[' ExtendedAttribute ExtendedAttributes ']'
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1188,12 +1211,14 @@ ExtendedAttributeList:
ExtendedAttributes:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' ExtendedAttribute ExtendedAttributes
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1218,10 +1243,46 @@ ExtendedAttribute:
$$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $4, $2);
}
|
+ TOK_CONSTRUCTOR
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor"));
+ }
+ |
+ TOK_CONSTRUCTOR '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ NULL,
+ $3));
+ }
+ |
+ TOK_NAMEDCONSTRUCTOR '=' TOK_IDENTIFIER '(' ArgumentList
')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+
strdup("NamedConstructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+
webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ $5));
+ }
+ |
Other ExtendedAttributeRest
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1229,12 +1290,12 @@ ExtendedAttribute:
ExtendedAttributeRest:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
ExtendedAttribute
{
- $$ = $1;
+ $$ = $1;
}
;
@@ -1242,16 +1303,16 @@ ExtendedAttributeRest:
ExtendedAttributeInner:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'(' ExtendedAttributeInner ')' ExtendedAttributeInner
{
- $$ = webidl_node_prepend(
- webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
- NULL,
- $2),
- $4);
+ $$ = webidl_node_prepend(
+ webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ NULL,
+ $2),
+ $4);
}
|
'[' ExtendedAttributeInner ']' ExtendedAttributeInner
@@ -1276,8 +1337,10 @@ ExtendedAttributeInner:
|
OtherOrComma ExtendedAttributeInner
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1285,119 +1348,119 @@ ExtendedAttributeInner:
Other:
TOK_INT_LITERAL
{
- /* @todo loosing base info here might break the attribute */
- $$ = calloc(1, 32);
- snprintf($$, 32, "%ld", $1);
+ /* @todo loosing base info here might break the attribute */
+ $$ = calloc(1, 32);
+ snprintf($$, 32, "%ld", $1);
}
|
TOK_FLOAT_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_IDENTIFIER
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_STRING_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_OTHER_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
'-'
{
- $$ = strdup("-");
+ $$ = strdup("-");
}
|
'.'
{
- $$ = strdup(".");
+ $$ = strdup(".");
}
|
TOK_ELLIPSIS
{
- $$ = strdup("...");
+ $$ = strdup("...");
}
|
':'
{
- $$ = strdup(":");
+ $$ = strdup(":");
}
|
';'
{
- $$ = strdup(";");
+ $$ = strdup(";");
}
|
'<'
{
- $$ = strdup("<");
+ $$ = strdup("<");
}
|
'='
{
- $$ = strdup("=");
+ $$ = strdup("=");
}
|
'>'
{
- $$ = strdup(">");
+ $$ = strdup(">");
}
|
'?'
{
- $$ = strdup("?");
+ $$ = strdup("?");
}
|
TOK_DATE
{
- $$ = strdup("Date");
+ $$ = strdup("Date");
}
|
TOK_STRING
{
- $$ = strdup("DOMString");
+ $$ = strdup("DOMString");
}
|
TOK_INFINITY
{
- $$ = strdup("Infinity");
+ $$ = strdup("Infinity");
}
|
TOK_NAN
{
- $$ = strdup("NaN");
+ $$ = strdup("NaN");
}
|
TOK_ANY
{
- $$ = strdup("any");
+ $$ = strdup("any");
}
|
TOK_BOOLEAN
{
- $$ = strdup("boolean");
+ $$ = strdup("boolean");
}
|
TOK_BYTE
{
- $$ = strdup("byte");
+ $$ = strdup("byte");
}
|
TOK_DOUBLE
{
- $$ = strdup("double");
+ $$ = strdup("double");
}
|
TOK_FALSE
{
- $$ = strdup("false");
+ $$ = strdup("false");
}
|
TOK_FLOAT
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=ac6ae0a7b545dbf33...
commit ac6ae0a7b545dbf3391760cfe9e6b86ce0c579db
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Implement putforwards processing.
interface attributes with the putforwards extended attribute call the
setter specified in that extended attribute.
The WebIDL is supposed to ensure the attribute is readonly before
allowing a putforwards but we only warn about this as there are
several examples where readonly is omitted.
diff --git a/src/duk-libdom-dictionary.c b/src/duk-libdom-dictionary.c
index 65a140a..09e4379 100644
--- a/src/duk-libdom-dictionary.c
+++ b/src/duk-libdom-dictionary.c
@@ -267,7 +267,7 @@ output_member_acessor(FILE* outf,
default:
WARN(WARNING_UNIMPLEMENTED,
- "Dictionary %s:%s unhandled type (%d)\n",
+ "Dictionary %s:%s unhandled type (%d)",
dictionarye->name,
membere->name,
*argument_type);
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index 0fef35b..96e41ad 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -619,7 +619,8 @@ output_prototype_attribute(FILE *outf,
struct ir_entry *interfacee,
struct ir_attribute_entry *attributee)
{
- if (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
+ if ((attributee->putforwards == NULL) &&
+ (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY)) {
return output_populate_ro_property(outf,
interfacee->class_name,
attributee->name);
@@ -1193,28 +1194,29 @@ output_interface_operations(FILE* outf, struct ir_entry *ife)
return res;
}
+
/**
- * Generate class property getter/setter for a single attribute
+ * Generate class property setter for a single attribute
*/
static int
-output_interface_attribute(FILE* outf,
- struct ir_entry *interfacee,
- struct ir_attribute_entry *atributee)
+output_attribute_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
{
int cdatac;
- /* getter definition */
+ /* setter definition */
fprintf(outf,
- "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ "static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_ccode(outf, atributee->getter);
+ cdatac = output_ccode(outf, atributee->setter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: getter %s::%s();",
+ "Unimplemented: setter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
@@ -1223,23 +1225,80 @@ output_interface_attribute(FILE* outf,
fprintf(outf, "}\n\n");
- /* readonly attributes have no setter */
- if (atributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
- return 0;
+ return 0;
+}
+
+/**
+ * Generate class property setter for a putforwards attribute
+ */
+static int
+output_putforwards_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ /* use explicit implementation in bindings if present */
+ if (atributee->setter != NULL) {
+ return output_attribute_setter(outf, interfacee, atributee);
}
- /* setter definition */
+ /* generate autogenerated putforwards */
+
fprintf(outf,
"static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
+ fprintf(outf,"\tduk_ret_t get_ret;\n\n");
+
+ fprintf(outf,
+ "\tget_ret = %s_%s_%s_getter(ctx);\n",
+ DLPFX, interfacee->class_name, atributee->name);
+
+ fprintf(outf,
+ "\tif (get_ret != 1) {\n"
+ "\t\treturn 0;\n"
+ "\t}\n\n"
+ "\t/* parameter attribute */\n\n"
+ "\tduk_swap(ctx, 0, 1);\n"
+ "\t/* attribute parameter */\n\n"
+ "\t/* call the putforward */\n");
+
+ fprintf(outf,
+ "\tduk_put_prop_string(ctx, 0, \"%s\");\n\n",
+ atributee->putforwards);
+
+ fprintf(outf,
+ "\tduk_pop(ctx);\n\n"
+ "\treturn 0;\n");
+
+ fprintf(outf, "}\n\n");
+
+ return 0;
+}
+
+/**
+ * Generate class property getter/setter for a single attribute
+ */
+static int
+output_interface_attribute(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ int cdatac;
+ int res = 0;
+
+ /* getter definition */
+ fprintf(outf,
+ "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ DLPFX, interfacee->class_name, atributee->name);
+ fprintf(outf,"{\n");
+
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_ccode(outf, atributee->setter);
+ cdatac = output_ccode(outf, atributee->getter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: setter %s::%s();",
+ "Unimplemented: getter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
@@ -1248,7 +1307,18 @@ output_interface_attribute(FILE* outf,
fprintf(outf, "}\n\n");
- return 0;
+ if (atributee->putforwards != NULL) {
+ res = output_putforwards_setter(outf, interfacee, atributee);
+ } else {
+ /* readonly attributes have no setter */
+ if (atributee->modifier != WEBIDL_TYPE_MODIFIER_READONLY) {
+ res = output_attribute_setter(outf,
+ interfacee,
+ atributee);
+ }
+ }
+
+ return res;
}
/**
diff --git a/src/ir.c b/src/ir.c
index b3631f4..6dc2d2a 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -377,6 +377,56 @@ operation_map_new(struct webidl_node *interface,
return 0;
}
+/**
+ * get the value of an extended attribute key/value item
+ */
+static char *
+get_extended_value(struct webidl_node *node, const char *key)
+{
+ char *ident;
+ struct webidl_node *ext_attr;
+ struct webidl_node *elem;
+
+ /* walk each extended attribute */
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ NULL,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ while (ext_attr != NULL) {
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ NULL,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (strcmp(ident, key) == 0)) {
+ /* first identifier matches */
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (*ident == '=')) {
+ return webidl_node_gettext(
+ webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT));
+ }
+ }
+
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ ext_attr,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ }
+
+ return NULL;
+}
+
static int
attribute_map_new(struct webidl_node *interface,
struct genbind_node *class,
@@ -399,8 +449,7 @@ attribute_map_new(struct webidl_node *interface,
return 0;
}
- attributev = calloc(attributec,
- sizeof(struct ir_attribute_entry));
+ attributev = calloc(attributec, sizeof(struct ir_attribute_entry));
if (attributev == NULL) {
return -1;
};
@@ -436,7 +485,7 @@ attribute_map_new(struct webidl_node *interface,
GENBIND_METHOD_TYPE_GETTER,
cure->name);
- /* check fo readonly attributes */
+ /* check for readonly attributes */
modifier = (enum webidl_type_modifier *)webidl_node_getint(
webidl_node_find_type(
webidl_node_getnode(at_node),
@@ -454,9 +503,20 @@ attribute_map_new(struct webidl_node *interface,
cure->name);
}
- cure++;
+ /* check for putforwards extended attribute */
+ cure->putforwards = get_extended_value(at_node,
+ "PutForwards");
+
+ if ((cure->putforwards != NULL) &&
+ (cure->modifier != WEBIDL_TYPE_MODIFIER_READONLY)) {
+ WARN(WARNING_WEBIDL,
+ "putforwards on a writable attribute (%s) is
prohibited",
+ cure->name);
+ }
/* move to next attribute */
+ cure++;
+
at_node = webidl_node_find_type(
webidl_node_getnode(list_node),
at_node,
diff --git a/src/ir.h b/src/ir.h
index 1092fab..ecedc95 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -53,6 +53,8 @@ struct ir_attribute_entry {
struct webidl_node *node; /**< AST attribute node */
enum webidl_type_modifier modifier;
+ const char *putforwards;
+
struct genbind_node *getter; /**< getter from binding */
struct genbind_node *setter; /**< getter from binding */
};
diff --git a/src/options.h b/src/options.h
index 5b7d73d..d452c17 100644
--- a/src/options.h
+++ b/src/options.h
@@ -28,9 +28,10 @@ extern struct options *options;
enum opt_warnings {
WARNING_UNIMPLEMENTED = 1,
WARNING_DUPLICATED = 2,
+ WARNING_WEBIDL = 4,
};
-#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED)
+#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED | WARNING_WEBIDL)
#define WARN(flags, msg, args...) do { \
if ((options->warnings & flags) != 0) { \
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=476bc961ae4c490df...
commit 476bc961ae4c490dfa0f09293c5611451bb42599
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Allow empty classes
diff --git a/README b/README
index f2a8bf3..4d08ff2 100644
--- a/README
+++ b/README
@@ -118,7 +118,7 @@ The binding file consists of three types of element:
but without at least one the binding is not very useful as
it will generate no output.
- preface
+ preface
This takes a cdata block. There may only be one of these per
binding, subsequent directives will be ignored.
@@ -160,6 +160,10 @@ The binding file consists of three types of element:
private member variables are declared here and header and
footer elements specific to this class.
+ Although not generally useful, because methods that reference a
+ class cause it to be implicitly created, empty definitions are
+ permitted.
+
private
variables added to the private structure for the class.
@@ -219,6 +223,54 @@ The binding file consists of three types of element:
binding but they will almost certainly have to be translated
into more suitable class names for generated output.
+
+ preface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The preface is emitted in every generated source file after
+ the binding preface and tool preamble.
+
+
+ prologue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The prologue is emitted in every generated source file after
+ the binding prologue has been generated.
+
+
+ epilogue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The epilogue is emitted after the generated code and before
+ the binding epilogue
+
+
+ postface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The postface is emitted after the binding epilogue.
+
+
init
The declarator for this method type need only identify the
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index a3e5609..88c69b1 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -55,9 +55,9 @@ typedef struct YYLTYPE {
}
%initial-action {
- yylloc.first_line = yylloc.last_line = 1;
- yylloc.first_column = yylloc.last_column = 1;
- yylloc.filename = filename;
+ yylloc.first_line = yylloc.last_line = 1;
+ yylloc.first_column = yylloc.last_column = 1;
+ yylloc.filename = filename;
}
%code {
@@ -105,7 +105,7 @@ add_method(struct genbind_node **genbind_ast,
long methodtype,
struct genbind_node *declarator,
char *cdata,
- int lineno,
+ long lineno,
char *filename)
{
struct genbind_node *res_node;
@@ -134,7 +134,6 @@ add_method(struct genbind_node **genbind_ast,
cdata);
}
-
location_node = genbind_new_node(GENBIND_NODE_TYPE_FILE,
genbind_new_node(GENBIND_NODE_TYPE_LINE,
cdata_node,
@@ -522,6 +521,11 @@ Class:
;
ClassArgs:
+ /* empty */
+ {
+ $$ = NULL;
+ }
+ |
ClassArg
|
ClassArgs ClassArg
diff --git a/test/data/bindings/browser-duk.bnd b/test/data/bindings/browser-duk.bnd
index cef3563..3113891 100644
--- a/test/data/bindings/browser-duk.bnd
+++ b/test/data/bindings/browser-duk.bnd
@@ -39,6 +39,10 @@ binding duk_libdom {
%};
};
+class empty_class {
+};
+
+
#include "HTMLUnknownElement.bnd"
/* specialisations of html_element */
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=c80955dcc6b663c25...
commit c80955dcc6b663c250a1f2552b626770fbd46a94
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
annotates binding AST with source linenumber and file
Uses annotated AST to put line directives in the generated source so
any code errors in the binding can be easily located.
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index fc62863..fb97fe3 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -58,6 +58,29 @@ int output_cdata(FILE* outf,
}
/* exported interface documented in duk-libdom.h */
+int output_ccode(FILE* outf, struct genbind_node *node)
+{
+ int *line;
+ char *filename;
+
+ line = genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_LINE));
+
+ filename = genbind_node_gettext(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_FILE));
+
+ if ((line != NULL) && (filename != NULL)) {
+ fprintf(outf, "#line %d \"%s\"\n", *line, filename);
+ }
+
+ return output_cdata(outf, node, GENBIND_NODE_TYPE_CDATA);
+}
+
+/* exported interface documented in duk-libdom.h */
int output_tool_prologue(FILE* outf)
{
char *fpath;
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index 997cb9a..0fef35b 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -517,7 +517,7 @@ output_interface_init(FILE* outf,
}
/* output the initaliser code from the binding */
- output_cdata(outf, init_node, GENBIND_NODE_TYPE_CDATA);
+ output_ccode(outf, init_node);
fprintf(outf, "}\n\n");
@@ -1157,10 +1157,7 @@ output_interface_operation(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf,
- operatione->method,
- GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, operatione->method);
if (cdatac == 0) {
/* no implementation so generate default */
WARN(WARNING_UNIMPLEMENTED,
@@ -1214,8 +1211,7 @@ output_interface_attribute(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf, atributee->getter, GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, atributee->getter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
"Unimplemented: getter %s::%s();",
@@ -1240,8 +1236,7 @@ output_interface_attribute(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf, atributee->setter, GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, atributee->setter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
"Unimplemented: setter %s::%s();",
@@ -1251,7 +1246,6 @@ output_interface_attribute(FILE* outf,
fprintf(outf,"\treturn 0;\n");
}
-
fprintf(outf, "}\n\n");
return 0;
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index b9eeea3..dd27420 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -56,6 +56,19 @@ int output_tool_prologue(FILE* outf);
*/
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type
nodetype);
+
+/**
+ * output c code with line directives if possible.
+ *
+ * used for any cdata sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_ccode(FILE* outf, struct genbind_node *node);
+
/**
* output character data of method node of given type.
*
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 749d3e8..9be8bc7 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -341,6 +341,7 @@ char *genbind_node_gettext(struct genbind_node *node)
case GENBIND_NODE_TYPE_IDENT:
case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
+ case GENBIND_NODE_TYPE_FILE:
return node->r.text;
default:
@@ -377,6 +378,7 @@ int *genbind_node_getint(struct genbind_node *node)
if (node != NULL) {
switch(node->type) {
case GENBIND_NODE_TYPE_METHOD_TYPE:
+ case GENBIND_NODE_TYPE_LINE:
case GENBIND_NODE_TYPE_MODIFIER:
return &node->r.number;
@@ -408,6 +410,12 @@ static const char *genbind_node_type_to_str(enum genbind_node_type
type)
case GENBIND_NODE_TYPE_NAME:
return "TypeName";
+ case GENBIND_NODE_TYPE_LINE:
+ return "Linenumber";
+
+ case GENBIND_NODE_TYPE_FILE:
+ return "Filename";
+
case GENBIND_NODE_TYPE_PRIVATE:
return "Private";
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index b130db2..49db23b 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -16,6 +16,8 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_MODIFIER, /**< node modifier */
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
+ GENBIND_NODE_TYPE_LINE, /**< linenumber */
+ GENBIND_NODE_TYPE_FILE, /**< file name */
GENBIND_NODE_TYPE_BINDING, /**< Binding */
GENBIND_NODE_TYPE_WEBIDL,
@@ -28,6 +30,7 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_METHOD, /**< binding method */
GENBIND_NODE_TYPE_METHOD_TYPE, /**< binding method type */
+
GENBIND_NODE_TYPE_PARAMETER, /**< method parameter */
};
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index b52d0d0..a3e5609 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -104,12 +104,15 @@ static struct genbind_node *
add_method(struct genbind_node **genbind_ast,
long methodtype,
struct genbind_node *declarator,
- char *cdata)
+ char *cdata,
+ int lineno,
+ char *filename)
{
struct genbind_node *res_node;
struct genbind_node *method_node;
struct genbind_node *class_node;
struct genbind_node *cdata_node;
+ struct genbind_node *location_node;
char *class_name;
/* extract the class name from the declarator */
@@ -131,11 +134,18 @@ add_method(struct genbind_node **genbind_ast,
cdata);
}
+
+ location_node = genbind_new_node(GENBIND_NODE_TYPE_FILE,
+ genbind_new_node(GENBIND_NODE_TYPE_LINE,
+ cdata_node,
+ (void *)lineno),
+ strdup(filename));
+
/* generate method node */
method_node = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
NULL,
genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
- cdata_node,
+ location_node,
(void *)methodtype));
class_node = genbind_node_find_type_ident(*genbind_ast,
@@ -396,12 +406,12 @@ ParameterList:
Method:
MethodType MethodDeclarator CBlock
{
- $$ = add_method(genbind_ast, $1, $2, $3);
+ $$ = add_method(genbind_ast, $1, $2, $3, @1.first_line, @1.filename);
}
|
MethodType MethodDeclarator ';'
{
- $$ = add_method(genbind_ast, $1, $2, NULL);
+ $$ = add_method(genbind_ast, $1, $2, NULL, @1.first_line, @1.filename);
}
;
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=767e69459ca7b4c13...
commit 767e69459ca7b4c13fe93875177040ab3eec8b56
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Improve the parser error reporting
The parser now reports the correct file and line number for
errors. Additionally the @n location structure in rules now has a
filename member in addition to first_line. These members are useful
for adding location information in generated source.
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 2915010..749d3e8 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -29,7 +29,7 @@ static FILE *genbind_parsetracef;
extern int nsgenbind_debug;
extern int nsgenbind__flex_debug;
extern void nsgenbind_restart(FILE*);
-extern int nsgenbind_parse(struct genbind_node **genbind_ast);
+extern int nsgenbind_parse(char *filename, struct genbind_node **genbind_ast);
/* terminal nodes have a value only */
struct genbind_node {
@@ -515,12 +515,6 @@ FILE *genbindopen(const char *filename)
}
prevfilepath = strndup(filename,fulllen);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, " \\\n\t%s",
- filename);
- }
-#endif
return genfile;
}
@@ -529,7 +523,7 @@ FILE *genbindopen(const char *filename)
fulllen = strlen(prevfilepath) + strlen(filename) + 2;
fullname = malloc(fulllen);
snprintf(fullname, fulllen, "%s/%s", prevfilepath, filename);
- if (options->debug) {
+ if (options->verbose) {
printf("Attempting to open Genbind file %s\n",
fullname);
}
genfile = fopen(fullname, "r");
@@ -537,12 +531,6 @@ FILE *genbindopen(const char *filename)
if (options->verbose) {
printf("Opened Genbind file %s\n", fullname);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, "
\\\n\t%s",
- fullname);
- }
-#endif
free(fullname);
return genfile;
}
@@ -599,7 +587,7 @@ int genbind_parsefile(char *infilename, struct genbind_node **ast)
nsgenbind_restart(infile);
/* process binding */
- ret = nsgenbind_parse(ast);
+ ret = nsgenbind_parse(infilename, ast);
/* close tracefile if open */
if (genbind_parsetracef != NULL) {
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l
index f32a948..af77368 100644
--- a/src/nsgenbind-lexer.l
+++ b/src/nsgenbind-lexer.l
@@ -15,9 +15,10 @@
#include "nsgenbind-parser.h"
#include "nsgenbind-ast.h"
-#define YY_USER_ACTION yylloc->first_line = yylloc->last_line; \
- yylloc->first_column = yylloc->last_column + 1; \
- yylloc->last_column += yyleng;
+#define YY_USER_ACTION \
+ yylloc->first_line = yylloc->last_line = yylineno; \
+ yylloc->first_column = yylloc->last_column + 1; \
+ yylloc->last_column += yyleng;
/* Ensure compatability with bison 2.6 and later */
@@ -29,6 +30,43 @@
#define YYLTYPE NSGENBIND_LTYPE
#endif
+static struct YYLTYPE *locations = NULL;
+
+static struct YYLTYPE *push_location(struct YYLTYPE *head,
+ struct YYLTYPE *loc,
+ const char *filename)
+{
+ struct YYLTYPE *res;
+ res = calloc(1, sizeof(struct YYLTYPE));
+ /* copy current location and line number */
+ *res = *loc;
+ res->start_line = yylineno;
+ res->next = head;
+
+ /* reset current location */
+ loc->first_line = loc->last_line = 1;
+ loc->first_column = loc->last_column = 1;
+ loc->filename = strdup(filename);
+ yylineno = 1;
+
+ return res;
+}
+
+static struct YYLTYPE *pop_location(struct YYLTYPE *head, struct YYLTYPE *loc)
+{
+ struct YYLTYPE *res = NULL;
+
+ if (head != NULL) {
+ res = head->next;
+ *loc = *head;
+ free(head);
+
+ yylineno = loc->start_line;
+ }
+ return res;
+}
+
+
%}
/* lexer options */
@@ -165,8 +203,10 @@ unsigned return TOK_UNSIGNED;
fprintf(stderr, "Unable to open include %s\n",
yytext);
exit(3);
}
- yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
-
+
+ locations = push_location(locations, yylloc, yytext);
+
+ yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
BEGIN(INITIAL);
}
@@ -178,9 +218,10 @@ unsigned return TOK_UNSIGNED;
yypop_buffer_state();
if ( !YY_CURRENT_BUFFER ) {
- yyterminate();
+ yyterminate();
} else {
- BEGIN(incl);
+ locations = pop_location(locations, yylloc);
+ BEGIN(incl);
}
}
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 247a047..b52d0d0 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -1,4 +1,66 @@
-%{
+/* binding parser
+ *
+ * This file is part of nsgenbind.
+ * Licensed under the MIT License,
+ *
http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
+ */
+
+ /* bison prior to 2.4 cannot cope with %define api.pure so we use the
+ * deprecated directive
+ */
+%pure-parser
+
+%locations
+
+%error-verbose
+ /* would use api.prefix but it needs to be different between bison
+ * 2.5 and 2.6
+ */
+
+%code requires {
+
+#define YYLTYPE YYLTYPE
+typedef struct YYLTYPE {
+ struct YYLTYPE *next;
+ int start_line;
+ char *filename;
+
+ int first_line;
+ int first_column;
+ int last_line;
+ int last_column;
+} YYLTYPE;
+
+
+#define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 1).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 1).start_line; \
+ } else { /* empty RHS */ \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 0).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 0).start_line; \
+ } \
+ while (0)
+
+}
+
+%initial-action {
+ yylloc.first_line = yylloc.last_line = 1;
+ yylloc.first_column = yylloc.last_column = 1;
+ yylloc.filename = filename;
+}
+
+%code {
/* parser for the binding generation config file
*
* This file is part of nsgenbind.
@@ -16,7 +78,6 @@
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
-#include "nsgenbind-parser.h"
#include "nsgenbind-lexer.h"
#include "webidl-ast.h"
#include "nsgenbind-ast.h"
@@ -24,12 +85,19 @@
char *errtxt;
static void nsgenbind_error(YYLTYPE *locp,
+ char *filename,
struct genbind_node **genbind_ast,
const char *str)
{
- locp = locp;
+ int errlen;
+ errlen = snprintf(NULL, 0, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+ errtxt = malloc(errlen + 1);
+ snprintf(errtxt, errlen + 1, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+
genbind_ast = genbind_ast;
- errtxt = strdup(str);
+ filename = filename;
}
static struct genbind_node *
@@ -91,14 +159,9 @@ add_method(struct genbind_node **genbind_ast,
return res_node;
}
-%}
+}
-%locations
- /* bison prior to 2.4 cannot cope with %define api.pure so we use the
- * deprecated directive
- */
-%pure-parser
-%error-verbose
+%parse-param { char *filename }
%parse-param { struct genbind_node **genbind_ast }
%union
@@ -188,7 +251,7 @@ Statements:
|
error ';'
{
- fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
+ fprintf(stderr, "%s\n", errtxt);
free(errtxt);
YYABORT ;
}
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=017eb2ef4da167466...
commit 017eb2ef4da167466c05ad83eb0714129a2e46ff
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Simplify genbind AST handling of preface, prologue, epilogue and postface
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index a1298e9..fc62863 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -115,3 +115,35 @@ int output_ctype(FILE *outf, struct genbind_node *node, bool
identifier)
return 0;
}
+
+/* exported interface documented in duk-libdom.h */
+int output_method_cdata(FILE* outf,
+ struct genbind_node *node,
+ enum genbind_method_type sel_method_type)
+{
+ struct genbind_node *method;
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD);
+
+ while (method != NULL) {
+ enum genbind_method_type *method_type;
+
+ method_type = (enum genbind_method_type *)genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(method),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD_TYPE));
+ if ((method_type != NULL) &&
+ (*method_type == sel_method_type)) {
+ output_cdata(outf, method, GENBIND_NODE_TYPE_CDATA);
+ }
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ method,
+ GENBIND_NODE_TYPE_METHOD);
+ }
+
+ return 0;
+}
diff --git a/src/duk-libdom-dictionary.c b/src/duk-libdom-dictionary.c
index 69ce8aa..65a140a 100644
--- a/src/duk-libdom-dictionary.c
+++ b/src/duk-libdom-dictionary.c
@@ -323,23 +323,27 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -352,20 +356,24 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, dictionarye->filename);
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index 38e1277..997cb9a 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -1296,23 +1296,27 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -1343,20 +1347,24 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, interfacee->filename);
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index ee7cc3b..fcd55da 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -136,9 +136,9 @@ static FILE *open_header(struct ir *ir, const char *name)
output_tool_preface(hdrf);
/* binding preface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* header guard */
fprintf(hdrf, "\n#ifndef %s_%s_h\n", DLPFX, name);
@@ -161,9 +161,9 @@ static int close_header(struct ir *ir,
fprintf(hdrf, "\n#endif\n");
/* binding postface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(hdrf, fname);
free(fname);
@@ -401,17 +401,17 @@ output_binding_src(struct ir *ir)
output_tool_preface(bindf);
/* binding preface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
+ /* tool prologue */
output_tool_prologue(bindf);
/* binding prologue */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
-
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(bindf, "\n");
@@ -582,9 +582,9 @@ output_binding_src(struct ir *ir)
fprintf(bindf, "}\n");
/* binding postface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(bindf, "binding.c");
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index 3b07009..b9eeea3 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -47,7 +47,7 @@ int output_tool_prologue(FILE* outf);
/**
* output character data of node of given type.
*
- * used for any cdata including pre/pro/epi/post sections
+ * used for any cdata sections
*
* \param outf The file handle to write output.
* \param node The node to search.
@@ -57,6 +57,18 @@ int output_tool_prologue(FILE* outf);
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type
nodetype);
/**
+ * output character data of method node of given type.
+ *
+ * used for any cdata including pre/pro/epi/post sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_method_cdata(FILE* outf, struct genbind_node *node, enum genbind_method_type
sel_method_type);
+
+/**
* output a C variable type
*
* Used to output c type and optionlly identifier declarations for parameters
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 6b39461..2915010 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -338,10 +338,6 @@ char *genbind_node_gettext(struct genbind_node *node)
switch(node->type) {
case GENBIND_NODE_TYPE_WEBIDL:
case GENBIND_NODE_TYPE_STRING:
- case GENBIND_NODE_TYPE_PREFACE:
- case GENBIND_NODE_TYPE_PROLOGUE:
- case GENBIND_NODE_TYPE_EPILOGUE:
- case GENBIND_NODE_TYPE_POSTFACE:
case GENBIND_NODE_TYPE_IDENT:
case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
@@ -406,18 +402,6 @@ static const char *genbind_node_type_to_str(enum genbind_node_type
type)
case GENBIND_NODE_TYPE_STRING:
return "String";
- case GENBIND_NODE_TYPE_PREFACE:
- return "Preface";
-
- case GENBIND_NODE_TYPE_POSTFACE:
- return "Postface";
-
- case GENBIND_NODE_TYPE_PROLOGUE:
- return "Prologue";
-
- case GENBIND_NODE_TYPE_EPILOGUE:
- return "Epilogue";
-
case GENBIND_NODE_TYPE_BINDING:
return "Binding";
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index 282544e..b130db2 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -17,12 +17,8 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
- GENBIND_NODE_TYPE_BINDING,
+ GENBIND_NODE_TYPE_BINDING, /**< Binding */
GENBIND_NODE_TYPE_WEBIDL,
- GENBIND_NODE_TYPE_PREFACE,
- GENBIND_NODE_TYPE_PROLOGUE,
- GENBIND_NODE_TYPE_EPILOGUE,
- GENBIND_NODE_TYPE_POSTFACE,
GENBIND_NODE_TYPE_CLASS, /**< class definition */
GENBIND_NODE_TYPE_PRIVATE,
@@ -45,12 +41,16 @@ enum genbind_type_modifier {
/* binding method types */
enum genbind_method_type {
- GENBIND_METHOD_TYPE_INIT = 0, /**< binding method is initialiser */
- GENBIND_METHOD_TYPE_FINI, /**< binding method is finalizer */
- GENBIND_METHOD_TYPE_METHOD, /**< binding method is a method */
- GENBIND_METHOD_TYPE_GETTER, /**< binding method is a getter */
- GENBIND_METHOD_TYPE_SETTER, /**< binding method is a setter */
- GENBIND_METHOD_TYPE_PROTOTYPE, /**< binding method is a prototype */
+ GENBIND_METHOD_TYPE_INIT = 0, /**< method is initialiser */
+ GENBIND_METHOD_TYPE_FINI, /**< method is finalizer */
+ GENBIND_METHOD_TYPE_METHOD, /**< method is a method */
+ GENBIND_METHOD_TYPE_GETTER, /**< method is a getter */
+ GENBIND_METHOD_TYPE_SETTER, /**< method is a setter */
+ GENBIND_METHOD_TYPE_PROTOTYPE, /**< method is a prototype */
+ GENBIND_METHOD_TYPE_PREFACE, /**< method is a preface */
+ GENBIND_METHOD_TYPE_PROLOGUE, /**< method is a prologue */
+ GENBIND_METHOD_TYPE_EPILOGUE, /**< method is a epilogue */
+ GENBIND_METHOD_TYPE_POSTFACE, /**< method is a postface */
};
struct genbind_node;
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index b883833..247a047 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -80,7 +80,6 @@ add_method(struct genbind_node **genbind_ast,
genbind_new_node(GENBIND_NODE_TYPE_IDENT,
method_node,
class_name));
-
} else {
/* update the existing class */
@@ -156,21 +155,14 @@ add_method(struct genbind_node **genbind_ast,
%type <node> Class
%type <node> ClassArgs
%type <node> ClassArg
-%type <node> ClassFlag
%type <node> ClassFlags
%type <node> Method
%type <node> MethodDeclarator
%type <value> MethodType
+%type <value> BindingAndMethodType
%type <node> WebIDL
-%type <node> Preface
-%type <node> Prologue
-%type <node> Epilogue
-%type <node> Postface
-%type <node> Private
-%type <node> Internal
-%type <node> Property
%type <node> ParameterList
%type <node> CTypeIdent
@@ -188,7 +180,7 @@ Input:
Statements:
Statement
- |
+ |
Statements Statement
{
$$ = *genbind_ast = genbind_node_prepend($2, $1);
@@ -225,23 +217,26 @@ BindingArgs:
|
BindingArgs BindingArg
{
- $$ = genbind_node_link($2, $1);
+ $$ = genbind_node_link($2, $1);
}
;
BindingArg:
WebIDL
|
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
- /* a web IDL file specifier */
+/* a web IDL file specifier */
WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
@@ -308,40 +303,42 @@ CTypeIdent:
}
;
-Preface:
- TOK_PREFACE CBlock ';'
+
+CBlock:
+ TOK_CCODE_LITERAL
+ |
+ CBlock TOK_CCODE_LITERAL
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_strapp($1, $2);
}
;
-Prologue:
- TOK_PROLOGUE CBlock ';'
+
+ParameterList:
+ CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
}
- ;
-
-Epilogue:
- TOK_EPILOGUE CBlock ';'
+ |
+ ParameterList ',' CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
+ $$ = genbind_node_prepend($1,
+ genbind_new_node(
+ GENBIND_NODE_TYPE_PARAMETER,
+ NULL,
+ $3));
}
;
-Postface:
- TOK_POSTFACE CBlock ';'
+Method:
+ MethodType MethodDeclarator CBlock
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
+ $$ = add_method(genbind_ast, $1, $2, $3);
}
- ;
-
-CBlock:
- TOK_CCODE_LITERAL
|
- CBlock TOK_CCODE_LITERAL
+ MethodType MethodDeclarator ';'
{
- $$ = genbind_strapp($1, $2);
+ $$ = add_method(genbind_ast, $1, $2, NULL);
}
;
@@ -375,21 +372,29 @@ MethodType:
{
$$ = GENBIND_METHOD_TYPE_PROTOTYPE;
}
+ |
+ BindingAndMethodType
;
-ParameterList:
- CTypeIdent
+BindingAndMethodType:
+ TOK_PREFACE
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
+ $$ = GENBIND_METHOD_TYPE_PREFACE;
}
|
- ParameterList ',' CTypeIdent
+ TOK_PROLOGUE
{
- $$ = genbind_node_prepend($1,
- genbind_new_node(
- GENBIND_NODE_TYPE_PARAMETER,
- NULL,
- $3));
+ $$ = GENBIND_METHOD_TYPE_PROLOGUE;
+ }
+ |
+ TOK_EPILOGUE
+ {
+ $$ = GENBIND_METHOD_TYPE_EPILOGUE;
+ }
+ |
+ TOK_POSTFACE
+ {
+ $$ = GENBIND_METHOD_TYPE_POSTFACE;
}
;
@@ -434,17 +439,6 @@ MethodDeclarator:
}
;
-Method:
- MethodType MethodDeclarator CBlock
- {
- $$ = add_method(genbind_ast, $1, $2, $3);
- }
- |
- MethodType MethodDeclarator ';'
- {
- $$ = add_method(genbind_ast, $1, $2, NULL);
- }
- ;
Class:
TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
@@ -464,43 +458,41 @@ ClassArgs:
;
ClassArg:
- Private
- |
- Internal
- |
- Property
- |
- ClassFlag
- |
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
- ;
-
-
-Private:
TOK_PRIVATE CTypeIdent ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
}
- ;
-
-Internal:
+ |
TOK_INTERNAL CTypeIdent ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
- ;
-
-ClassFlag:
+ |
+ TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ (void *)$2));
+ }
+ |
TOK_FLAGS ClassFlags ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
}
+ |
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
ClassFlags:
@@ -515,18 +507,6 @@ ClassFlags:
}
;
-Property:
- TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
- {
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
- genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- NULL,
- $3),
- (void *)$2));
- }
- ;
-
Modifiers:
/* empty */
{
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=53acb5a29b8eb4fe8...
commit 53acb5a29b8eb4fe89dd2e8bc3b808d5e7183b81
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Improve documentation on webidl type specifiers
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 9ae2ebb..59dfcac 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -49,21 +49,21 @@ enum webidl_node_type {
};
enum webidl_type {
- WEBIDL_TYPE_ANY, /**< The type is unconstrained */
- WEBIDL_TYPE_USER,
- WEBIDL_TYPE_BOOL,
- WEBIDL_TYPE_BYTE,
- WEBIDL_TYPE_OCTET,
- WEBIDL_TYPE_FLOAT,
- WEBIDL_TYPE_DOUBLE,
- WEBIDL_TYPE_SHORT,
- WEBIDL_TYPE_LONG,
- WEBIDL_TYPE_LONGLONG,
- WEBIDL_TYPE_STRING,
- WEBIDL_TYPE_SEQUENCE,
- WEBIDL_TYPE_OBJECT,
- WEBIDL_TYPE_DATE,
- WEBIDL_TYPE_VOID,
+ WEBIDL_TYPE_ANY, /**< 0 - The type is unconstrained */
+ WEBIDL_TYPE_USER, /**< 1 - The type is a dictionary or interface */
+ WEBIDL_TYPE_BOOL, /**< 2 - The type is boolean */
+ WEBIDL_TYPE_BYTE, /**< 3 - The type is a byte */
+ WEBIDL_TYPE_OCTET, /**< 4 - The type is a octet */
+ WEBIDL_TYPE_FLOAT, /**< 5 - The type is a float point number */
+ WEBIDL_TYPE_DOUBLE, /**< 6 - The type is a double */
+ WEBIDL_TYPE_SHORT, /**< 7 - The type is a signed 16bit */
+ WEBIDL_TYPE_LONG, /**< 8 - The type is a signed 32bit */
+ WEBIDL_TYPE_LONGLONG, /**< 9 - The type is a signed 64bit */
+ WEBIDL_TYPE_STRING, /**< 10 - The type is a string */
+ WEBIDL_TYPE_SEQUENCE, /**< 11 - The type is a sequence */
+ WEBIDL_TYPE_OBJECT, /**< 12 - The type is a object */
+ WEBIDL_TYPE_DATE, /**< 13 - The type is a date */
+ WEBIDL_TYPE_VOID, /**< 14 - The type is void */
};
/** modifiers for operations, attributes and arguments */
commitdiff
http://git.netsurf-browser.org/nsgenbind.git/commit/?id=4a7185fd4a25b1456...
commit 4a7185fd4a25b1456737b8fa2ac6a770a3e1721e
Author: Vincent Sanders <vince(a)kyllikki.org>
Commit: Vincent Sanders <vince(a)kyllikki.org>
Make the binding parser understand c types
Instead of c types being opaque strings this makes the bindig parser
understand them. This is necessary for extended attribute parsing in
future but also makes the binding more easily understandable.
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index 9a0f660..a1298e9 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -76,3 +76,42 @@ int output_tool_prologue(FILE* outf)
return 0;
}
+
+
+/* exported interface documented in duk-libdom.h */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier)
+{
+ const char *type_cdata = NULL;
+ struct genbind_node *typename_node;
+
+ typename_node = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_NAME);
+ while (typename_node != NULL) {
+ type_cdata = genbind_node_gettext(typename_node);
+
+ fprintf(outf, "%s", type_cdata);
+
+ typename_node = genbind_node_find_type(
+ genbind_node_getnode(node),
+ typename_node,
+ GENBIND_NODE_TYPE_NAME);
+
+ /* separate all but the last entry with spaces */
+ if (typename_node != NULL) {
+ fputc(' ', outf);
+ }
+ }
+
+ if (identifier) {
+ if ((type_cdata != NULL) &&
+ (type_cdata[0] != '*') &&
+ (type_cdata[0] != ' ')) {
+ fputc(' ', outf);
+ }
+
+ output_cdata(outf, node, GENBIND_NODE_TYPE_IDENT);
+ }
+
+ return 0;
+}
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index ad40741..38e1277 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -328,6 +328,42 @@ output_interface_destructor(FILE* outf, struct ir_entry *interfacee)
}
/**
+ * Compare two nodes to check their c types match.
+ */
+static bool compare_ctypes(struct genbind_node *a, struct genbind_node *b)
+{
+ struct genbind_node *ta;
+ struct genbind_node *tb;
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ NULL, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ NULL, GENBIND_NODE_TYPE_NAME);
+
+ while ((ta != NULL) && (tb != NULL)) {
+ char *txt_a;
+ char *txt_b;
+
+ txt_a = genbind_node_gettext(ta);
+ txt_b = genbind_node_gettext(tb);
+
+ if (strcmp(txt_a, txt_b) != 0) {
+ return false; /* missmatch */
+ }
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ ta, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ tb, GENBIND_NODE_TYPE_NAME);
+ }
+ if (ta != tb) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
* generate an initialisor call to parent interface
*/
static int
@@ -389,26 +425,14 @@ output_interface_inherit_init(FILE* outf,
param_name);
return -1;
} else {
- char *param_type;
- char *inh_param_type;
-
fprintf(outf, ", ");
/* cast the parameter if required */
- param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- inh_param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(inh_param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- if (strcmp(param_type, inh_param_type) != 0) {
- fprintf(outf, "(%s)", inh_param_type);
+ if (compare_ctypes(param_node,
+ inh_param_node) == false) {
+ fputc('(', outf);
+ output_ctype(outf, inh_param_node, false);
+ fputc(')', outf);
}
/* output the parameter identifier */
@@ -449,8 +473,8 @@ output_interface_init_declaration(FILE* outf,
while (param_node != NULL) {
interfacee->class_init_argc++;
fprintf(outf, ", ");
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_TYPE);
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_IDENT);
+
+ output_ctype(outf, param_node, true);
param_node = genbind_node_find_type(
genbind_node_getnode(init_node),
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index 084a68f..ee7cc3b 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -228,25 +228,10 @@ output_private_header(struct ir *ir)
NULL,
GENBIND_NODE_TYPE_PRIVATE);
while (priv_node != NULL) {
- /* generate the private variable definition ensuring
- * the type is separated from the identifier with
- * either a * or space.
- */
- const char *type_cdata;
- char cdatae;
- type_cdata = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(priv_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- fprintf(privf, "\t%s", type_cdata);
- cdatae = type_cdata[strlen(type_cdata) - 1];
- if ((cdatae != '*') && (cdatae != ' '))
{
- fputc(' ', privf);
- }
+ fprintf(privf, "\t");
+
+ output_ctype(privf, priv_node, true);
- output_cdata(privf, priv_node, GENBIND_NODE_TYPE_IDENT);
fprintf(privf, ";\n");
priv_node = genbind_node_find_type(
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index 79b440e..3b07009 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -56,4 +56,19 @@ int output_tool_prologue(FILE* outf);
*/
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type
nodetype);
+/**
+ * output a C variable type
+ *
+ * Used to output c type and optionlly identifier declarations for parameters
+ * and structure entries.
+ * If the optional identifier is output it is ensured the type is separated
+ * from the identifier with either a * or space.
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to generate content for.
+ * \param identifier If the indentifier should be output.
+ * \return 0 on success.
+ */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier);
+
#endif
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 4f0654a..6b39461 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -259,34 +259,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
return found_node;
}
-/* exported interface documented in nsgenbind-ast.h */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type type,
- const char *ident)
-{
- struct genbind_node *found_node;
- struct genbind_node *ident_node;
-
- found_node = genbind_node_find_type(node, prev, type);
-
-
- while (found_node != NULL) {
- /* look for a type node */
- ident_node = genbind_node_find_type(genbind_node_getnode(found_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE);
- if (ident_node != NULL) {
- if (strcmp(ident_node->r.text, ident) == 0)
- break;
- }
-
- /* look for next matching node */
- found_node = genbind_node_find_type(node, found_node, type);
- }
- return found_node;
-}
/* exported interface documented in nsgenbind-ast.h */
@@ -371,7 +343,7 @@ char *genbind_node_gettext(struct genbind_node *node)
case GENBIND_NODE_TYPE_EPILOGUE:
case GENBIND_NODE_TYPE_POSTFACE:
case GENBIND_NODE_TYPE_IDENT:
- case GENBIND_NODE_TYPE_TYPE:
+ case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
return node->r.text;
@@ -449,8 +421,8 @@ 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:
- return "Type";
+ case GENBIND_NODE_TYPE_NAME:
+ return "TypeName";
case GENBIND_NODE_TYPE_PRIVATE:
return "Private";
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index 2a384b2..282544e 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -12,7 +12,7 @@
enum genbind_node_type {
GENBIND_NODE_TYPE_ROOT = 0,
GENBIND_NODE_TYPE_IDENT, /**< generic identifier string */
- GENBIND_NODE_TYPE_TYPE, /**< generic type string */
+ GENBIND_NODE_TYPE_NAME, /**< generic type string */
GENBIND_NODE_TYPE_MODIFIER, /**< node modifier */
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
@@ -152,30 +152,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
/**
- * Returning node of the specified type with a GENBIND_NODE_TYPE_TYPE
- * subnode with matching text.
- *
- * This is a conveniance wrapper around nested calls to
- * genbind_node_find_type() which performs a depth first left hand
- * search returning nodes of the specified type and a child node of
- * GENBIND_NODE_TYPE_TYPE with matching text.
- *
- *
- * @param node The node to start the search from
- * @param prev The node at which to stop the search, either NULL to
- * search the full tree depth (initial search) or the result
- * of a previous search to continue.
- * @param nodetype The type of node to seach for.
- * @param type The text to match the type child node to.
- */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type nodetype,
- const char *type_text);
-
-
-/**
* Find a method node of a given method type
*
* \param node A node of type GENBIND_NODE_TYPE_CLASS to search for methods.
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l
index d092195..f32a948 100644
--- a/src/nsgenbind-lexer.l
+++ b/src/nsgenbind-lexer.l
@@ -93,50 +93,39 @@ dblcolon \:\:
/* binding terminals */
binding return TOK_BINDING;
-
webidl return TOK_WEBIDL;
-
preface return TOK_PREFACE;
-
prologue return TOK_PROLOGUE;
-
epilogue return TOK_EPILOGUE;
-
postface return TOK_POSTFACE;
/* class member terminals */
class return TOK_CLASS;
-
private return TOK_PRIVATE;
-
internal return TOK_INTERNAL;
-
flags return TOK_FLAGS;
-
type return TOK_TYPE;
-
unshared return TOK_UNSHARED;
-
shared return TOK_SHARED;
-
property return TOK_PROPERTY;
/* implementation terminals */
init return TOK_INIT;
-
fini return TOK_FINI;
-
method return TOK_METHOD;
-
getter return TOK_GETTER;
-
setter return TOK_SETTER;
-
prototype return TOK_PROTOTYPE;
+ /* c type terminals */
+
+struct return TOK_STRUCT;
+union return TOK_UNION;
+unsigned return TOK_UNSIGNED;
+
/* other terminals */
{dblcolon} return TOK_DBLCOLON;
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 1462b39..b883833 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -27,9 +27,9 @@ static void nsgenbind_error(YYLTYPE *locp,
struct genbind_node **genbind_ast,
const char *str)
{
- locp = locp;
- genbind_ast = genbind_ast;
- errtxt = strdup(str);
+ locp = locp;
+ genbind_ast = genbind_ast;
+ errtxt = strdup(str);
}
static struct genbind_node *
@@ -104,9 +104,9 @@ add_method(struct genbind_node **genbind_ast,
%union
{
- char *text;
- struct genbind_node *node;
- long value;
+ char *text;
+ struct genbind_node *node;
+ long value;
}
%token TOK_BINDING
@@ -135,6 +135,10 @@ add_method(struct genbind_node **genbind_ast,
%token TOK_DBLCOLON
+%token TOK_STRUCT
+%token TOK_UNION
+%token TOK_UNSIGNED
+
%token <text> TOK_IDENTIFIER
%token <text> TOK_STRING_LITERAL
%token <text> TOK_CCODE_LITERAL
@@ -169,38 +173,36 @@ add_method(struct genbind_node **genbind_ast,
%type <node> Property
%type <node> ParameterList
-%type <node> TypeIdent
+%type <node> CTypeIdent
+%type <node> CType
+%type <node> CTypeSpecifier
%%
-Input
- :
+Input:
Statements
- {
- *genbind_ast = $1;
+ {
+ *genbind_ast = $1;
}
;
-
-Statements
- :
- Statement
+Statements:
+ Statement
|
- Statements Statement
+ Statements Statement
{
- $$ = *genbind_ast = genbind_node_prepend($2, $1);
+ $$ = *genbind_ast = genbind_node_prepend($2, $1);
}
- |
- error ';'
- {
- fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
- free(errtxt);
- YYABORT ;
+ |
+ error ';'
+ {
+ fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
+ free(errtxt);
+ YYABORT ;
}
;
-Statement
- :
+Statement:
Binding
|
Class
@@ -208,18 +210,17 @@ Statement
Method
;
-Binding
- :
- TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}'
+Binding:
+ TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
- NULL,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, $4, $2));
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ $4, $2));
}
;
-BindingArgs
- :
+BindingArgs:
BindingArg
|
BindingArgs BindingArg
@@ -228,8 +229,7 @@ BindingArgs
}
;
-BindingArg
- :
+BindingArg:
WebIDL
|
Preface
@@ -241,71 +241,102 @@ BindingArg
Postface
;
- /* [3] a web IDL file specifier */
-WebIDL
- :
+ /* a web IDL file specifier */
+WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
}
;
+ /* parse a c type specifier. This probably also needs to cope with
+ * void, char, short, int, long, float, double, signed, enum
+ */
+CTypeSpecifier:
+ TOK_UNSIGNED TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("unsigned")),
+ $2);
+ }
+ |
+ TOK_STRUCT TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("struct")),
+ $2);
+ }
+ |
+ TOK_UNION TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("union")),
+ $2);
+ }
+ |
+ TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, NULL, $1);
+ }
+ ;
+
+CType:
+ CTypeSpecifier
+ |
+ CTypeSpecifier '*'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, $1,
strdup("*"));
+ }
/* type and identifier of a variable */
-TypeIdent
- :
- TOK_STRING_LITERAL TOK_IDENTIFIER
+CTypeIdent:
+ CType TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $1), $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2);
}
|
- TOK_STRING_LITERAL TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
+ CType TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE,
- NULL,
- $1),
- $2),
- $4);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2), $4);
}
;
-Preface
- :
+Preface:
TOK_PREFACE CBlock ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
}
;
-Prologue
- :
+Prologue:
TOK_PROLOGUE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
}
;
-Epilogue
- :
+Epilogue:
TOK_EPILOGUE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
}
;
-Postface
- :
+Postface:
TOK_POSTFACE CBlock ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
}
;
-CBlock
- :
+CBlock:
TOK_CCODE_LITERAL
|
CBlock TOK_CCODE_LITERAL
@@ -314,8 +345,7 @@ CBlock
}
;
-MethodType
- :
+MethodType:
TOK_INIT
{
$$ = GENBIND_METHOD_TYPE_INIT;
@@ -347,14 +377,13 @@ MethodType
}
;
-ParameterList
- :
- TypeIdent
+ParameterList:
+ CTypeIdent
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
}
|
- ParameterList ',' TypeIdent
+ ParameterList ',' CTypeIdent
{
$$ = genbind_node_prepend($1,
genbind_new_node(
@@ -364,8 +393,7 @@ ParameterList
}
;
-MethodDeclarator
- :
+MethodDeclarator:
TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ParameterList ')'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS,
@@ -406,8 +434,7 @@ MethodDeclarator
}
;
-Method
- :
+Method:
MethodType MethodDeclarator CBlock
{
$$ = add_method(genbind_ast, $1, $2, $3);
@@ -419,17 +446,15 @@ Method
}
;
-Class
- :
- TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}'
+Class:
+ TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL,
genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2));
}
;
-ClassArgs
- :
+ClassArgs:
ClassArg
|
ClassArgs ClassArg
@@ -438,8 +463,7 @@ ClassArgs
}
;
-ClassArg
- :
+ClassArg:
Private
|
Internal
@@ -458,45 +482,40 @@ ClassArg
;
-Private
- :
- TOK_PRIVATE TypeIdent ';'
+Private:
+ TOK_PRIVATE CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
}
;
-Internal
- :
- TOK_INTERNAL TypeIdent ';'
+Internal:
+ TOK_INTERNAL CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
;
-ClassFlag
- :
+ClassFlag:
TOK_FLAGS ClassFlags ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
}
;
-ClassFlags
- :
+ClassFlags:
TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
}
|
ClassFlags ',' TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
}
;
-Property
- :
+Property:
TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
@@ -508,8 +527,7 @@ Property
}
;
-Modifiers
- :
+Modifiers:
/* empty */
{
$$ = GENBIND_TYPE_NONE;
@@ -521,8 +539,7 @@ Modifiers
}
;
-Modifier
- :
+Modifier:
TOK_TYPE
{
$$ = GENBIND_TYPE_TYPE;
diff --git a/src/nsgenbind.c b/src/nsgenbind.c
index 135c5c0..09d4c29 100644
--- a/src/nsgenbind.c
+++ b/src/nsgenbind.c
@@ -168,7 +168,7 @@ static enum bindingtype_e genbind_get_type(struct genbind_node *node)
genbind_node_find_type(
genbind_node_getnode(binding_node),
NULL,
- GENBIND_NODE_TYPE_TYPE));
+ GENBIND_NODE_TYPE_NAME));
if (binding_type == NULL) {
fprintf(stderr, "Error: missing binding type\n");
return BINDINGTYPE_UNKNOWN;
diff --git a/test/data/bindings/HTMLUnknownElement.bnd
b/test/data/bindings/HTMLUnknownElement.bnd
index faabaec..d44018b 100644
--- a/test/data/bindings/HTMLUnknownElement.bnd
+++ b/test/data/bindings/HTMLUnknownElement.bnd
@@ -14,6 +14,6 @@ class HTMLUnknownElement {
postface %{
/* class post */
%};
-}
+};
-init HTMLUnknownElement("struct dom_html_element *"
html_unknown_element::html_element);
+init HTMLUnknownElement(struct dom_html_element *html_unknown_element::html_element);
diff --git a/test/data/bindings/browser-duk.bnd b/test/data/bindings/browser-duk.bnd
index 44497a1..cef3563 100644
--- a/test/data/bindings/browser-duk.bnd
+++ b/test/data/bindings/browser-duk.bnd
@@ -37,108 +37,108 @@ binding duk_libdom {
postface %{
/* binding postface */
%};
-}
+};
#include "HTMLUnknownElement.bnd"
/* specialisations of html_element */
-init HTMLFontElement("struct dom_html_element *"
html_font_element::html_element);
-init HTMLDirectoryElement("struct dom_html_element *"
html_directory_element::html_element);
-init HTMLFrameElement("struct dom_html_element *"
html_frame_element::html_element);
-init HTMLFrameSetElement("struct dom_html_element *"
html_frame_set_element::html_element);
-init HTMLMarqueeElement("struct dom_html_element *"
html_marquee_element::html_element);
-init HTMLAppletElement("struct dom_html_element *"
html_applet_element::html_element);
-init HTMLCanvasElement("struct dom_html_element *"
html_canvas_element::html_element);
-init HTMLTemplateElement("struct dom_html_element *"
html_template_element::html_element);
-init HTMLScriptElement("struct dom_html_element *"
html_script_element::html_element);
-init HTMLDialogElement("struct dom_html_element *"
html_dialog_element::html_element);
-init HTMLMenuItemElement("struct dom_html_element *"
html_menu_item_element::html_element);
-init HTMLMenuElement("struct dom_html_element *"
html_menu_element::html_element);
-init HTMLDetailsElement("struct dom_html_element *"
html_details_element::html_element);
-init HTMLLegendElement("struct dom_html_element *"
html_legend_element::html_element);
-init HTMLFieldSetElement("struct dom_html_element *"
html_field_set_element::html_element);
-init HTMLMeterElement("struct dom_html_element *"
html_meter_element::html_element);
-init HTMLProgressElement("struct dom_html_element *"
html_progress_element::html_element);
-init HTMLOutputElement("struct dom_html_element *"
html_output_element::html_element);
-init HTMLKeygenElement("struct dom_html_element *"
html_keygen_element::html_element);
-init HTMLTextAreaElement("struct dom_html_element *"
html_text_area_element::html_element);
-init HTMLOptionElement("struct dom_html_element *"
html_option_element::html_element);
-init HTMLOptGroupElement("struct dom_html_element *"
html_opt_group_element::html_element);
-init HTMLDataListElement("struct dom_html_element *"
html_data_list_element::html_element);
-init HTMLSelectElement("struct dom_html_element *"
html_select_element::html_element);
-init HTMLButtonElement("struct dom_html_element *"
html_button_element::html_element);
-init HTMLInputElement("struct dom_html_element *"
html_input_element::html_element);
-init HTMLLabelElement("struct dom_html_element *"
html_label_element::html_element);
-init HTMLFormElement("struct dom_html_element *"
html_form_element::html_element);
-init HTMLTableCellElement("struct dom_html_element *"
html_table_cell_element::html_element);
-init HTMLTableRowElement("struct dom_html_element *"
html_table_row_element::html_element);
-init HTMLTableSectionElement("struct dom_html_element *"
html_table_section_element::html_element);
-init HTMLTableColElement("struct dom_html_element *"
html_table_col_element::html_element);
-init HTMLTableCaptionElement("struct dom_html_element *"
html_table_caption_element::html_element);
-init HTMLTableElement("struct dom_html_element *"
html_table_element::html_element);
-init HTMLAreaElement("struct dom_html_element *"
html_area_element::html_element);
-init HTMLMapElement("struct dom_html_element *"
html_map_element::html_element);
-init HTMLMediaElement("struct dom_html_element *"
html_media_element::html_element);
-init HTMLTrackElement("struct dom_html_element *"
html_track_element::html_element);
-init HTMLParamElement("struct dom_html_element *"
html_param_element::html_element);
-init HTMLObjectElement("struct dom_html_element *"
html_object_element::html_element);
-init HTMLEmbedElement("struct dom_html_element *"
html_embed_element::html_element);
-init HTMLIFrameElement("struct dom_html_element *"
html_i_frame_element::html_element);
-init HTMLImageElement("struct dom_html_element *"
html_image_element::html_element);
-init HTMLSourceElement("struct dom_html_element *"
html_source_element::html_element);
-init HTMLPictureElement("struct dom_html_element *"
html_picture_element::html_element);
-init HTMLModElement("struct dom_html_element *"
html_mod_element::html_element);
-init HTMLBRElement("struct dom_html_element *" html_br_element::html_element);
-init HTMLSpanElement("struct dom_html_element *"
html_span_element::html_element);
-init HTMLTimeElement("struct dom_html_element *"
html_time_element::html_element);
-init HTMLDataElement("struct dom_html_element *"
html_data_element::html_element);
-init HTMLAnchorElement("struct dom_html_element *"
html_anchor_element::html_element);
-init HTMLDivElement("struct dom_html_element *"
html_div_element::html_element);
-init HTMLDListElement("struct dom_html_element *"
html_d_list_element::html_element);
-init HTMLLIElement("struct dom_html_element *" html_li_element::html_element);
-init HTMLUListElement("struct dom_html_element *"
html_u_list_element::html_element);
-init HTMLOListElement("struct dom_html_element *"
html_o_list_element::html_element);
-init HTMLQuoteElement("struct dom_html_element *"
html_quote_element::html_element);
-init HTMLPreElement("struct dom_html_element *"
html_pre_element::html_element);
-init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element);
-init HTMLParagraphElement("struct dom_html_element *"
html_paragraph_element::html_element);
-init HTMLHeadingElement("struct dom_html_element *"
html_heading_element::html_element);
-init HTMLBodyElement("struct dom_html_element *"
html_body_element::html_element);
-init HTMLStyleElement("struct dom_html_element *"
html_style_element::html_element);
-init HTMLMetaElement("struct dom_html_element *"
html_meta_element::html_element);
-init HTMLLinkElement("struct dom_html_element *"
html_link_element::html_element);
-init HTMLBaseElement("struct dom_html_element *"
html_base_element::html_element);
-init HTMLTitleElement("struct dom_html_element *"
html_title_element::html_element);
-init HTMLHeadElement("struct dom_html_element *"
html_head_element::html_element);
-init HTMLHtmlElement("struct dom_html_element *"
html_html_element::html_element);
+init HTMLFontElement(struct dom_html_element *html_font_element::html_element);
+init HTMLDirectoryElement(struct dom_html_element
*html_directory_element::html_element);
+init HTMLFrameElement(struct dom_html_element *html_frame_element::html_element);
+init HTMLFrameSetElement(struct dom_html_element *html_frame_set_element::html_element);
+init HTMLMarqueeElement(struct dom_html_element *html_marquee_element::html_element);
+init HTMLAppletElement(struct dom_html_element *html_applet_element::html_element);
+init HTMLCanvasElement(struct dom_html_element *html_canvas_element::html_element);
+init HTMLTemplateElement(struct dom_html_element *html_template_element::html_element);
+init HTMLScriptElement(struct dom_html_element *html_script_element::html_element);
+init HTMLDialogElement(struct dom_html_element *html_dialog_element::html_element);
+init HTMLMenuItemElement(struct dom_html_element *html_menu_item_element::html_element);
+init HTMLMenuElement(struct dom_html_element *html_menu_element::html_element);
+init HTMLDetailsElement(struct dom_html_element *html_details_element::html_element);
+init HTMLLegendElement(struct dom_html_element *html_legend_element::html_element);
+init HTMLFieldSetElement(struct dom_html_element *html_field_set_element::html_element);
+init HTMLMeterElement(struct dom_html_element *html_meter_element::html_element);
+init HTMLProgressElement(struct dom_html_element *html_progress_element::html_element);
+init HTMLOutputElement(struct dom_html_element *html_output_element::html_element);
+init HTMLKeygenElement(struct dom_html_element *html_keygen_element::html_element);
+init HTMLTextAreaElement(struct dom_html_element *html_text_area_element::html_element);
+init HTMLOptionElement(struct dom_html_element *html_option_element::html_element);
+init HTMLOptGroupElement(struct dom_html_element *html_opt_group_element::html_element);
+init HTMLDataListElement(struct dom_html_element *html_data_list_element::html_element);
+init HTMLSelectElement(struct dom_html_element *html_select_element::html_element);
+init HTMLButtonElement(struct dom_html_element *html_button_element::html_element);
+init HTMLInputElement(struct dom_html_element *html_input_element::html_element);
+init HTMLLabelElement(struct dom_html_element *html_label_element::html_element);
+init HTMLFormElement(struct dom_html_element *html_form_element::html_element);
+init HTMLTableCellElement(struct dom_html_element
*html_table_cell_element::html_element);
+init HTMLTableRowElement(struct dom_html_element *html_table_row_element::html_element);
+init HTMLTableSectionElement(struct dom_html_element
*html_table_section_element::html_element);
+init HTMLTableColElement(struct dom_html_element *html_table_col_element::html_element);
+init HTMLTableCaptionElement(struct dom_html_element
*html_table_caption_element::html_element);
+init HTMLTableElement(struct dom_html_element *html_table_element::html_element);
+init HTMLAreaElement(struct dom_html_element *html_area_element::html_element);
+init HTMLMapElement(struct dom_html_element *html_map_element::html_element);
+init HTMLMediaElement(struct dom_html_element *html_media_element::html_element);
+init HTMLTrackElement(struct dom_html_element *html_track_element::html_element);
+init HTMLParamElement(struct dom_html_element *html_param_element::html_element);
+init HTMLObjectElement(struct dom_html_element *html_object_element::html_element);
+init HTMLEmbedElement(struct dom_html_element *html_embed_element::html_element);
+init HTMLIFrameElement(struct dom_html_element *html_i_frame_element::html_element);
+init HTMLImageElement(struct dom_html_element *html_image_element::html_element);
+init HTMLSourceElement(struct dom_html_element *html_source_element::html_element);
+init HTMLPictureElement(struct dom_html_element *html_picture_element::html_element);
+init HTMLModElement(struct dom_html_element *html_mod_element::html_element);
+init HTMLBRElement(struct dom_html_element *html_br_element::html_element);
+init HTMLSpanElement(struct dom_html_element *html_span_element::html_element);
+init HTMLTimeElement(struct dom_html_element *html_time_element::html_element);
+init HTMLDataElement(struct dom_html_element *html_data_element::html_element);
+init HTMLAnchorElement(struct dom_html_element *html_anchor_element::html_element);
+init HTMLDivElement(struct dom_html_element *html_div_element::html_element);
+init HTMLDListElement(struct dom_html_element *html_d_list_element::html_element);
+init HTMLLIElement(struct dom_html_element *html_li_element::html_element);
+init HTMLUListElement(struct dom_html_element *html_u_list_element::html_element);
+init HTMLOListElement(struct dom_html_element *html_o_list_element::html_element);
+init HTMLQuoteElement(struct dom_html_element *html_quote_element::html_element);
+init HTMLPreElement(struct dom_html_element *html_pre_element::html_element);
+init HTMLHRElement(struct dom_html_element *html_hr_element::html_element);
+init HTMLParagraphElement(struct dom_html_element
*html_paragraph_element::html_element);
+init HTMLHeadingElement(struct dom_html_element *html_heading_element::html_element);
+init HTMLBodyElement(struct dom_html_element *html_body_element::html_element);
+init HTMLStyleElement(struct dom_html_element *html_style_element::html_element);
+init HTMLMetaElement(struct dom_html_element *html_meta_element::html_element);
+init HTMLLinkElement(struct dom_html_element *html_link_element::html_element);
+init HTMLBaseElement(struct dom_html_element *html_base_element::html_element);
+init HTMLTitleElement(struct dom_html_element *html_title_element::html_element);
+init HTMLHeadElement(struct dom_html_element *html_head_element::html_element);
+init HTMLHtmlElement(struct dom_html_element *html_html_element::html_element);
/* specialisations of HTMLTableCellElement */
-init HTMLTableHeaderCellElement("struct dom_html_element *"
html_table_header_cell_element::html_table_cell_element);
-init HTMLTableDataCellElement("struct dom_html_element *"
html_table_data_cell_element::html_table_cell_element);
+init HTMLTableHeaderCellElement(struct dom_html_element
*html_table_header_cell_element::html_table_cell_element);
+init HTMLTableDataCellElement(struct dom_html_element
*html_table_data_cell_element::html_table_cell_element);
/* specialisations of html_media_element */
-init HTMLAudioElement("struct dom_html_element *"
html_audio_element::html_media_element);
-init HTMLVideoElement("struct dom_html_element *"
html_video_element::html_media_element);
+init HTMLAudioElement(struct dom_html_element *html_audio_element::html_media_element);
+init HTMLVideoElement(struct dom_html_element *html_video_element::html_media_element);
-init HTMLElement("struct dom_html_element *" html_element::element);
+init HTMLElement(struct dom_html_element *html_element::element);
-init Text("struct dom_node_text *" text::character_data);
-init Comment("struct dom_node_comment *" comment::character_data);
-init ProcessingInstruction("struct dom_node_text *" text::character_data);
+init Text(struct dom_node_text *text::character_data);
+init Comment(struct dom_node_comment *comment::character_data);
+init ProcessingInstruction(struct dom_node_text *text::character_data);
-init XMLDocument("struct dom_document *" document);
+init XMLDocument(struct dom_document * document);
-init Element("struct dom_element *" element::node);
-init CharacterData("struct dom_node_character_data *" character_data::node);
-init DocumentFragment("struct dom_document *" document::node);
-init DocumentType("struct dom_document *" document::node);
-init Document("struct dom_document *" document::node);
+init Element(struct dom_element *element::node);
+init CharacterData(struct dom_node_character_data *character_data::node);
+init DocumentFragment(struct dom_document *document::node);
+init DocumentType(struct dom_document *document::node);
+init Document(struct dom_document *document::node);
class Node {
- private "dom_node *" node;
-}
+ private dom_node *node;
+};
-init Node("struct dom_node *" node)
+init Node(struct dom_node *node)
%{
priv->node = node;
dom_node_ref(node);
-----------------------------------------------------------------------
Summary of changes:
README | 54 +++-
src/duk-libdom-common.c | 94 ++++++
src/duk-libdom-dictionary.c | 42 +--
src/duk-libdom-interface.c | 214 ++++++++++----
src/duk-libdom.c | 53 ++--
src/duk-libdom.h | 42 ++-
src/ir.c | 68 ++++-
src/ir.h | 2 +
src/nsgenbind-ast.c | 76 +----
src/nsgenbind-ast.h | 51 +---
src/nsgenbind-lexer.l | 78 +++--
src/nsgenbind-parser.y | 456 +++++++++++++++++------------
src/nsgenbind.c | 2 +-
src/options.h | 3 +-
src/webidl-ast.h | 30 +-
src/webidl-lexer.l | 4 +
src/webidl-parser.y | 265 ++++++++++-------
test/data/bindings/HTMLUnknownElement.bnd | 4 +-
test/data/bindings/browser-duk.bnd | 178 +++++------
19 files changed, 1080 insertions(+), 636 deletions(-)
diff --git a/README b/README
index f2a8bf3..4d08ff2 100644
--- a/README
+++ b/README
@@ -118,7 +118,7 @@ The binding file consists of three types of element:
but without at least one the binding is not very useful as
it will generate no output.
- preface
+ preface
This takes a cdata block. There may only be one of these per
binding, subsequent directives will be ignored.
@@ -160,6 +160,10 @@ The binding file consists of three types of element:
private member variables are declared here and header and
footer elements specific to this class.
+ Although not generally useful, because methods that reference a
+ class cause it to be implicitly created, empty definitions are
+ permitted.
+
private
variables added to the private structure for the class.
@@ -219,6 +223,54 @@ The binding file consists of three types of element:
binding but they will almost certainly have to be translated
into more suitable class names for generated output.
+
+ preface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The preface is emitted in every generated source file after
+ the binding preface and tool preamble.
+
+
+ prologue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The prologue is emitted in every generated source file after
+ the binding prologue has been generated.
+
+
+ epilogue
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The epilogue is emitted after the generated code and before
+ the binding epilogue
+
+
+ postface
+
+ The declarator for this method type need only identify the
+ class (an identifier may be provided but will be ignored).
+
+ This takes a cdata block. There may only be one of these per
+ class, subsequent directives will be ignored.
+
+ The postface is emitted after the binding epilogue.
+
+
init
The declarator for this method type need only identify the
diff --git a/src/duk-libdom-common.c b/src/duk-libdom-common.c
index 9a0f660..fb97fe3 100644
--- a/src/duk-libdom-common.c
+++ b/src/duk-libdom-common.c
@@ -58,6 +58,29 @@ int output_cdata(FILE* outf,
}
/* exported interface documented in duk-libdom.h */
+int output_ccode(FILE* outf, struct genbind_node *node)
+{
+ int *line;
+ char *filename;
+
+ line = genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_LINE));
+
+ filename = genbind_node_gettext(
+ genbind_node_find_type(
+ genbind_node_getnode(node),
+ NULL, GENBIND_NODE_TYPE_FILE));
+
+ if ((line != NULL) && (filename != NULL)) {
+ fprintf(outf, "#line %d \"%s\"\n", *line, filename);
+ }
+
+ return output_cdata(outf, node, GENBIND_NODE_TYPE_CDATA);
+}
+
+/* exported interface documented in duk-libdom.h */
int output_tool_prologue(FILE* outf)
{
char *fpath;
@@ -76,3 +99,74 @@ int output_tool_prologue(FILE* outf)
return 0;
}
+
+
+/* exported interface documented in duk-libdom.h */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier)
+{
+ const char *type_cdata = NULL;
+ struct genbind_node *typename_node;
+
+ typename_node = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_NAME);
+ while (typename_node != NULL) {
+ type_cdata = genbind_node_gettext(typename_node);
+
+ fprintf(outf, "%s", type_cdata);
+
+ typename_node = genbind_node_find_type(
+ genbind_node_getnode(node),
+ typename_node,
+ GENBIND_NODE_TYPE_NAME);
+
+ /* separate all but the last entry with spaces */
+ if (typename_node != NULL) {
+ fputc(' ', outf);
+ }
+ }
+
+ if (identifier) {
+ if ((type_cdata != NULL) &&
+ (type_cdata[0] != '*') &&
+ (type_cdata[0] != ' ')) {
+ fputc(' ', outf);
+ }
+
+ output_cdata(outf, node, GENBIND_NODE_TYPE_IDENT);
+ }
+
+ return 0;
+}
+
+/* exported interface documented in duk-libdom.h */
+int output_method_cdata(FILE* outf,
+ struct genbind_node *node,
+ enum genbind_method_type sel_method_type)
+{
+ struct genbind_node *method;
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD);
+
+ while (method != NULL) {
+ enum genbind_method_type *method_type;
+
+ method_type = (enum genbind_method_type *)genbind_node_getint(
+ genbind_node_find_type(
+ genbind_node_getnode(method),
+ NULL,
+ GENBIND_NODE_TYPE_METHOD_TYPE));
+ if ((method_type != NULL) &&
+ (*method_type == sel_method_type)) {
+ output_cdata(outf, method, GENBIND_NODE_TYPE_CDATA);
+ }
+
+ method = genbind_node_find_type(genbind_node_getnode(node),
+ method,
+ GENBIND_NODE_TYPE_METHOD);
+ }
+
+ return 0;
+}
diff --git a/src/duk-libdom-dictionary.c b/src/duk-libdom-dictionary.c
index 69ce8aa..09e4379 100644
--- a/src/duk-libdom-dictionary.c
+++ b/src/duk-libdom-dictionary.c
@@ -267,7 +267,7 @@ output_member_acessor(FILE* outf,
default:
WARN(WARNING_UNIMPLEMENTED,
- "Dictionary %s:%s unhandled type (%d)\n",
+ "Dictionary %s:%s unhandled type (%d)",
dictionarye->name,
membere->name,
*argument_type);
@@ -323,23 +323,27 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -352,20 +356,24 @@ int output_dictionary(struct ir *ir, struct ir_entry *dictionarye)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, dictionarye->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ dictionarye->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, dictionarye->filename);
diff --git a/src/duk-libdom-interface.c b/src/duk-libdom-interface.c
index ad40741..96e41ad 100644
--- a/src/duk-libdom-interface.c
+++ b/src/duk-libdom-interface.c
@@ -328,6 +328,42 @@ output_interface_destructor(FILE* outf, struct ir_entry *interfacee)
}
/**
+ * Compare two nodes to check their c types match.
+ */
+static bool compare_ctypes(struct genbind_node *a, struct genbind_node *b)
+{
+ struct genbind_node *ta;
+ struct genbind_node *tb;
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ NULL, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ NULL, GENBIND_NODE_TYPE_NAME);
+
+ while ((ta != NULL) && (tb != NULL)) {
+ char *txt_a;
+ char *txt_b;
+
+ txt_a = genbind_node_gettext(ta);
+ txt_b = genbind_node_gettext(tb);
+
+ if (strcmp(txt_a, txt_b) != 0) {
+ return false; /* missmatch */
+ }
+
+ ta = genbind_node_find_type(genbind_node_getnode(a),
+ ta, GENBIND_NODE_TYPE_NAME);
+ tb = genbind_node_find_type(genbind_node_getnode(b),
+ tb, GENBIND_NODE_TYPE_NAME);
+ }
+ if (ta != tb) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
* generate an initialisor call to parent interface
*/
static int
@@ -389,26 +425,14 @@ output_interface_inherit_init(FILE* outf,
param_name);
return -1;
} else {
- char *param_type;
- char *inh_param_type;
-
fprintf(outf, ", ");
/* cast the parameter if required */
- param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- inh_param_type = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(inh_param_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- if (strcmp(param_type, inh_param_type) != 0) {
- fprintf(outf, "(%s)", inh_param_type);
+ if (compare_ctypes(param_node,
+ inh_param_node) == false) {
+ fputc('(', outf);
+ output_ctype(outf, inh_param_node, false);
+ fputc(')', outf);
}
/* output the parameter identifier */
@@ -449,8 +473,8 @@ output_interface_init_declaration(FILE* outf,
while (param_node != NULL) {
interfacee->class_init_argc++;
fprintf(outf, ", ");
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_TYPE);
- output_cdata(outf, param_node, GENBIND_NODE_TYPE_IDENT);
+
+ output_ctype(outf, param_node, true);
param_node = genbind_node_find_type(
genbind_node_getnode(init_node),
@@ -493,7 +517,7 @@ output_interface_init(FILE* outf,
}
/* output the initaliser code from the binding */
- output_cdata(outf, init_node, GENBIND_NODE_TYPE_CDATA);
+ output_ccode(outf, init_node);
fprintf(outf, "}\n\n");
@@ -595,7 +619,8 @@ output_prototype_attribute(FILE *outf,
struct ir_entry *interfacee,
struct ir_attribute_entry *attributee)
{
- if (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
+ if ((attributee->putforwards == NULL) &&
+ (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY)) {
return output_populate_ro_property(outf,
interfacee->class_name,
attributee->name);
@@ -1133,10 +1158,7 @@ output_interface_operation(FILE* outf,
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf,
- operatione->method,
- GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, operatione->method);
if (cdatac == 0) {
/* no implementation so generate default */
WARN(WARNING_UNIMPLEMENTED,
@@ -1172,29 +1194,29 @@ output_interface_operations(FILE* outf, struct ir_entry *ife)
return res;
}
+
/**
- * Generate class property getter/setter for a single attribute
+ * Generate class property setter for a single attribute
*/
static int
-output_interface_attribute(FILE* outf,
- struct ir_entry *interfacee,
- struct ir_attribute_entry *atributee)
+output_attribute_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
{
int cdatac;
- /* getter definition */
+ /* setter definition */
fprintf(outf,
- "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ "static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
output_get_method_private(outf, interfacee->class_name);
- cdatac = output_cdata(outf, atributee->getter, GENBIND_NODE_TYPE_CDATA);
-
+ cdatac = output_ccode(outf, atributee->setter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: getter %s::%s();",
+ "Unimplemented: setter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
@@ -1203,34 +1225,100 @@ output_interface_attribute(FILE* outf,
fprintf(outf, "}\n\n");
- /* readonly attributes have no setter */
- if (atributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
- return 0;
+ return 0;
+}
+
+/**
+ * Generate class property setter for a putforwards attribute
+ */
+static int
+output_putforwards_setter(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ /* use explicit implementation in bindings if present */
+ if (atributee->setter != NULL) {
+ return output_attribute_setter(outf, interfacee, atributee);
}
- /* setter definition */
+ /* generate autogenerated putforwards */
+
fprintf(outf,
"static duk_ret_t %s_%s_%s_setter(duk_context *ctx)\n",
DLPFX, interfacee->class_name, atributee->name);
fprintf(outf,"{\n");
- output_get_method_private(outf, interfacee->class_name);
+ fprintf(outf,"\tduk_ret_t get_ret;\n\n");
+
+ fprintf(outf,
+ "\tget_ret = %s_%s_%s_getter(ctx);\n",
+ DLPFX, interfacee->class_name, atributee->name);
+
+ fprintf(outf,
+ "\tif (get_ret != 1) {\n"
+ "\t\treturn 0;\n"
+ "\t}\n\n"
+ "\t/* parameter attribute */\n\n"
+ "\tduk_swap(ctx, 0, 1);\n"
+ "\t/* attribute parameter */\n\n"
+ "\t/* call the putforward */\n");
+
+ fprintf(outf,
+ "\tduk_put_prop_string(ctx, 0, \"%s\");\n\n",
+ atributee->putforwards);
+
+ fprintf(outf,
+ "\tduk_pop(ctx);\n\n"
+ "\treturn 0;\n");
+
+ fprintf(outf, "}\n\n");
+
+ return 0;
+}
+
+/**
+ * Generate class property getter/setter for a single attribute
+ */
+static int
+output_interface_attribute(FILE* outf,
+ struct ir_entry *interfacee,
+ struct ir_attribute_entry *atributee)
+{
+ int cdatac;
+ int res = 0;
- cdatac = output_cdata(outf, atributee->setter, GENBIND_NODE_TYPE_CDATA);
+ /* getter definition */
+ fprintf(outf,
+ "static duk_ret_t %s_%s_%s_getter(duk_context *ctx)\n",
+ DLPFX, interfacee->class_name, atributee->name);
+ fprintf(outf,"{\n");
+ output_get_method_private(outf, interfacee->class_name);
+
+ cdatac = output_ccode(outf, atributee->getter);
if (cdatac == 0) {
WARN(WARNING_UNIMPLEMENTED,
- "Unimplemented: setter %s::%s();",
+ "Unimplemented: getter %s::%s();",
interfacee->name, atributee->name);
/* no implementation so generate default */
fprintf(outf,"\treturn 0;\n");
}
-
fprintf(outf, "}\n\n");
- return 0;
+ if (atributee->putforwards != NULL) {
+ res = output_putforwards_setter(outf, interfacee, atributee);
+ } else {
+ /* readonly attributes have no setter */
+ if (atributee->modifier != WEBIDL_TYPE_MODIFIER_READONLY) {
+ res = output_attribute_setter(outf,
+ interfacee,
+ atributee);
+ }
+ }
+
+ return res;
}
/**
@@ -1272,23 +1360,27 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
output_tool_preface(ifacef);
/* binding preface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* class preface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PREFACE);
/* tool prologue */
output_tool_prologue(ifacef);
/* binding prologue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
/* class prologue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_PROLOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(ifacef, "\n");
@@ -1319,20 +1411,24 @@ int output_interface(struct ir *ir, struct ir_entry *interfacee)
fprintf(ifacef, "\n");
/* class epilogue */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* binding epilogue */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_EPILOGUE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_EPILOGUE);
/* class postface */
- output_cdata(ifacef, interfacee->class, GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ interfacee->class,
+ GENBIND_METHOD_TYPE_POSTFACE);
/* binding postface */
- output_cdata(ifacef,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(ifacef,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
op_error:
genb_fclose_tmp(ifacef, interfacee->filename);
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index 084a68f..fcd55da 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -136,9 +136,9 @@ static FILE *open_header(struct ir *ir, const char *name)
output_tool_preface(hdrf);
/* binding preface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
/* header guard */
fprintf(hdrf, "\n#ifndef %s_%s_h\n", DLPFX, name);
@@ -161,9 +161,9 @@ static int close_header(struct ir *ir,
fprintf(hdrf, "\n#endif\n");
/* binding postface */
- output_cdata(hdrf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(hdrf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(hdrf, fname);
free(fname);
@@ -228,25 +228,10 @@ output_private_header(struct ir *ir)
NULL,
GENBIND_NODE_TYPE_PRIVATE);
while (priv_node != NULL) {
- /* generate the private variable definition ensuring
- * the type is separated from the identifier with
- * either a * or space.
- */
- const char *type_cdata;
- char cdatae;
- type_cdata = genbind_node_gettext(
- genbind_node_find_type(
- genbind_node_getnode(priv_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE));
-
- fprintf(privf, "\t%s", type_cdata);
- cdatae = type_cdata[strlen(type_cdata) - 1];
- if ((cdatae != '*') && (cdatae != ' '))
{
- fputc(' ', privf);
- }
+ fprintf(privf, "\t");
+
+ output_ctype(privf, priv_node, true);
- output_cdata(privf, priv_node, GENBIND_NODE_TYPE_IDENT);
fprintf(privf, ";\n");
priv_node = genbind_node_find_type(
@@ -416,17 +401,17 @@ output_binding_src(struct ir *ir)
output_tool_preface(bindf);
/* binding preface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PREFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PREFACE);
+ /* tool prologue */
output_tool_prologue(bindf);
/* binding prologue */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_PROLOGUE);
-
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_PROLOGUE);
fprintf(bindf, "\n");
@@ -597,9 +582,9 @@ output_binding_src(struct ir *ir)
fprintf(bindf, "}\n");
/* binding postface */
- output_cdata(bindf,
- ir->binding_node,
- GENBIND_NODE_TYPE_POSTFACE);
+ output_method_cdata(bindf,
+ ir->binding_node,
+ GENBIND_METHOD_TYPE_POSTFACE);
genb_fclose_tmp(bindf, "binding.c");
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index 79b440e..dd27420 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -47,7 +47,7 @@ int output_tool_prologue(FILE* outf);
/**
* output character data of node of given type.
*
- * used for any cdata including pre/pro/epi/post sections
+ * used for any cdata sections
*
* \param outf The file handle to write output.
* \param node The node to search.
@@ -56,4 +56,44 @@ int output_tool_prologue(FILE* outf);
*/
int output_cdata(FILE* outf, struct genbind_node *node, enum genbind_node_type
nodetype);
+
+/**
+ * output c code with line directives if possible.
+ *
+ * used for any cdata sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_ccode(FILE* outf, struct genbind_node *node);
+
+/**
+ * output character data of method node of given type.
+ *
+ * used for any cdata including pre/pro/epi/post sections
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to search.
+ * \param nodetype the type of child node to search for.
+ * \return The number of nodes written or 0 for none.
+ */
+int output_method_cdata(FILE* outf, struct genbind_node *node, enum genbind_method_type
sel_method_type);
+
+/**
+ * output a C variable type
+ *
+ * Used to output c type and optionlly identifier declarations for parameters
+ * and structure entries.
+ * If the optional identifier is output it is ensured the type is separated
+ * from the identifier with either a * or space.
+ *
+ * \param outf The file handle to write output.
+ * \param node The node to generate content for.
+ * \param identifier If the indentifier should be output.
+ * \return 0 on success.
+ */
+int output_ctype(FILE *outf, struct genbind_node *node, bool identifier);
+
#endif
diff --git a/src/ir.c b/src/ir.c
index b3631f4..6dc2d2a 100644
--- a/src/ir.c
+++ b/src/ir.c
@@ -377,6 +377,56 @@ operation_map_new(struct webidl_node *interface,
return 0;
}
+/**
+ * get the value of an extended attribute key/value item
+ */
+static char *
+get_extended_value(struct webidl_node *node, const char *key)
+{
+ char *ident;
+ struct webidl_node *ext_attr;
+ struct webidl_node *elem;
+
+ /* walk each extended attribute */
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ NULL,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ while (ext_attr != NULL) {
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ NULL,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (strcmp(ident, key) == 0)) {
+ /* first identifier matches */
+
+ elem = webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT);
+ ident = webidl_node_gettext(elem);
+
+ if ((ident != NULL) && (*ident == '=')) {
+ return webidl_node_gettext(
+ webidl_node_find_type(
+ webidl_node_getnode(ext_attr),
+ elem,
+ WEBIDL_NODE_TYPE_IDENT));
+ }
+ }
+
+ ext_attr = webidl_node_find_type(
+ webidl_node_getnode(node),
+ ext_attr,
+ WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE);
+ }
+
+ return NULL;
+}
+
static int
attribute_map_new(struct webidl_node *interface,
struct genbind_node *class,
@@ -399,8 +449,7 @@ attribute_map_new(struct webidl_node *interface,
return 0;
}
- attributev = calloc(attributec,
- sizeof(struct ir_attribute_entry));
+ attributev = calloc(attributec, sizeof(struct ir_attribute_entry));
if (attributev == NULL) {
return -1;
};
@@ -436,7 +485,7 @@ attribute_map_new(struct webidl_node *interface,
GENBIND_METHOD_TYPE_GETTER,
cure->name);
- /* check fo readonly attributes */
+ /* check for readonly attributes */
modifier = (enum webidl_type_modifier *)webidl_node_getint(
webidl_node_find_type(
webidl_node_getnode(at_node),
@@ -454,9 +503,20 @@ attribute_map_new(struct webidl_node *interface,
cure->name);
}
- cure++;
+ /* check for putforwards extended attribute */
+ cure->putforwards = get_extended_value(at_node,
+ "PutForwards");
+
+ if ((cure->putforwards != NULL) &&
+ (cure->modifier != WEBIDL_TYPE_MODIFIER_READONLY)) {
+ WARN(WARNING_WEBIDL,
+ "putforwards on a writable attribute (%s) is
prohibited",
+ cure->name);
+ }
/* move to next attribute */
+ cure++;
+
at_node = webidl_node_find_type(
webidl_node_getnode(list_node),
at_node,
diff --git a/src/ir.h b/src/ir.h
index 1092fab..ecedc95 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -53,6 +53,8 @@ struct ir_attribute_entry {
struct webidl_node *node; /**< AST attribute node */
enum webidl_type_modifier modifier;
+ const char *putforwards;
+
struct genbind_node *getter; /**< getter from binding */
struct genbind_node *setter; /**< getter from binding */
};
diff --git a/src/nsgenbind-ast.c b/src/nsgenbind-ast.c
index 4f0654a..9be8bc7 100644
--- a/src/nsgenbind-ast.c
+++ b/src/nsgenbind-ast.c
@@ -29,7 +29,7 @@ static FILE *genbind_parsetracef;
extern int nsgenbind_debug;
extern int nsgenbind__flex_debug;
extern void nsgenbind_restart(FILE*);
-extern int nsgenbind_parse(struct genbind_node **genbind_ast);
+extern int nsgenbind_parse(char *filename, struct genbind_node **genbind_ast);
/* terminal nodes have a value only */
struct genbind_node {
@@ -259,34 +259,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
return found_node;
}
-/* exported interface documented in nsgenbind-ast.h */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type type,
- const char *ident)
-{
- struct genbind_node *found_node;
- struct genbind_node *ident_node;
-
- found_node = genbind_node_find_type(node, prev, type);
-
-
- while (found_node != NULL) {
- /* look for a type node */
- ident_node = genbind_node_find_type(genbind_node_getnode(found_node),
- NULL,
- GENBIND_NODE_TYPE_TYPE);
- if (ident_node != NULL) {
- if (strcmp(ident_node->r.text, ident) == 0)
- break;
- }
-
- /* look for next matching node */
- found_node = genbind_node_find_type(node, found_node, type);
- }
- return found_node;
-}
/* exported interface documented in nsgenbind-ast.h */
@@ -366,13 +338,10 @@ char *genbind_node_gettext(struct genbind_node *node)
switch(node->type) {
case GENBIND_NODE_TYPE_WEBIDL:
case GENBIND_NODE_TYPE_STRING:
- case GENBIND_NODE_TYPE_PREFACE:
- case GENBIND_NODE_TYPE_PROLOGUE:
- case GENBIND_NODE_TYPE_EPILOGUE:
- case GENBIND_NODE_TYPE_POSTFACE:
case GENBIND_NODE_TYPE_IDENT:
- case GENBIND_NODE_TYPE_TYPE:
+ case GENBIND_NODE_TYPE_NAME:
case GENBIND_NODE_TYPE_CDATA:
+ case GENBIND_NODE_TYPE_FILE:
return node->r.text;
default:
@@ -409,6 +378,7 @@ int *genbind_node_getint(struct genbind_node *node)
if (node != NULL) {
switch(node->type) {
case GENBIND_NODE_TYPE_METHOD_TYPE:
+ case GENBIND_NODE_TYPE_LINE:
case GENBIND_NODE_TYPE_MODIFIER:
return &node->r.number;
@@ -434,23 +404,17 @@ static const char *genbind_node_type_to_str(enum genbind_node_type
type)
case GENBIND_NODE_TYPE_STRING:
return "String";
- case GENBIND_NODE_TYPE_PREFACE:
- return "Preface";
-
- case GENBIND_NODE_TYPE_POSTFACE:
- return "Postface";
-
- case GENBIND_NODE_TYPE_PROLOGUE:
- return "Prologue";
-
- case GENBIND_NODE_TYPE_EPILOGUE:
- return "Epilogue";
-
case GENBIND_NODE_TYPE_BINDING:
return "Binding";
- case GENBIND_NODE_TYPE_TYPE:
- return "Type";
+ case GENBIND_NODE_TYPE_NAME:
+ return "TypeName";
+
+ case GENBIND_NODE_TYPE_LINE:
+ return "Linenumber";
+
+ case GENBIND_NODE_TYPE_FILE:
+ return "Filename";
case GENBIND_NODE_TYPE_PRIVATE:
return "Private";
@@ -559,12 +523,6 @@ FILE *genbindopen(const char *filename)
}
prevfilepath = strndup(filename,fulllen);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, " \\\n\t%s",
- filename);
- }
-#endif
return genfile;
}
@@ -573,7 +531,7 @@ FILE *genbindopen(const char *filename)
fulllen = strlen(prevfilepath) + strlen(filename) + 2;
fullname = malloc(fulllen);
snprintf(fullname, fulllen, "%s/%s", prevfilepath, filename);
- if (options->debug) {
+ if (options->verbose) {
printf("Attempting to open Genbind file %s\n",
fullname);
}
genfile = fopen(fullname, "r");
@@ -581,12 +539,6 @@ FILE *genbindopen(const char *filename)
if (options->verbose) {
printf("Opened Genbind file %s\n", fullname);
}
-#if 0
- if (options->depfilehandle != NULL) {
- fprintf(options->depfilehandle, "
\\\n\t%s",
- fullname);
- }
-#endif
free(fullname);
return genfile;
}
@@ -643,7 +595,7 @@ int genbind_parsefile(char *infilename, struct genbind_node **ast)
nsgenbind_restart(infile);
/* process binding */
- ret = nsgenbind_parse(ast);
+ ret = nsgenbind_parse(infilename, ast);
/* close tracefile if open */
if (genbind_parsetracef != NULL) {
diff --git a/src/nsgenbind-ast.h b/src/nsgenbind-ast.h
index 2a384b2..49db23b 100644
--- a/src/nsgenbind-ast.h
+++ b/src/nsgenbind-ast.h
@@ -12,17 +12,15 @@
enum genbind_node_type {
GENBIND_NODE_TYPE_ROOT = 0,
GENBIND_NODE_TYPE_IDENT, /**< generic identifier string */
- GENBIND_NODE_TYPE_TYPE, /**< generic type string */
+ GENBIND_NODE_TYPE_NAME, /**< generic type string */
GENBIND_NODE_TYPE_MODIFIER, /**< node modifier */
GENBIND_NODE_TYPE_CDATA, /**< verbatim block of character data */
GENBIND_NODE_TYPE_STRING, /**< text string */
+ GENBIND_NODE_TYPE_LINE, /**< linenumber */
+ GENBIND_NODE_TYPE_FILE, /**< file name */
- GENBIND_NODE_TYPE_BINDING,
+ GENBIND_NODE_TYPE_BINDING, /**< Binding */
GENBIND_NODE_TYPE_WEBIDL,
- GENBIND_NODE_TYPE_PREFACE,
- GENBIND_NODE_TYPE_PROLOGUE,
- GENBIND_NODE_TYPE_EPILOGUE,
- GENBIND_NODE_TYPE_POSTFACE,
GENBIND_NODE_TYPE_CLASS, /**< class definition */
GENBIND_NODE_TYPE_PRIVATE,
@@ -32,6 +30,7 @@ enum genbind_node_type {
GENBIND_NODE_TYPE_METHOD, /**< binding method */
GENBIND_NODE_TYPE_METHOD_TYPE, /**< binding method type */
+
GENBIND_NODE_TYPE_PARAMETER, /**< method parameter */
};
@@ -45,12 +44,16 @@ enum genbind_type_modifier {
/* binding method types */
enum genbind_method_type {
- GENBIND_METHOD_TYPE_INIT = 0, /**< binding method is initialiser */
- GENBIND_METHOD_TYPE_FINI, /**< binding method is finalizer */
- GENBIND_METHOD_TYPE_METHOD, /**< binding method is a method */
- GENBIND_METHOD_TYPE_GETTER, /**< binding method is a getter */
- GENBIND_METHOD_TYPE_SETTER, /**< binding method is a setter */
- GENBIND_METHOD_TYPE_PROTOTYPE, /**< binding method is a prototype */
+ GENBIND_METHOD_TYPE_INIT = 0, /**< method is initialiser */
+ GENBIND_METHOD_TYPE_FINI, /**< method is finalizer */
+ GENBIND_METHOD_TYPE_METHOD, /**< method is a method */
+ GENBIND_METHOD_TYPE_GETTER, /**< method is a getter */
+ GENBIND_METHOD_TYPE_SETTER, /**< method is a setter */
+ GENBIND_METHOD_TYPE_PROTOTYPE, /**< method is a prototype */
+ GENBIND_METHOD_TYPE_PREFACE, /**< method is a preface */
+ GENBIND_METHOD_TYPE_PROLOGUE, /**< method is a prologue */
+ GENBIND_METHOD_TYPE_EPILOGUE, /**< method is a epilogue */
+ GENBIND_METHOD_TYPE_POSTFACE, /**< method is a postface */
};
struct genbind_node;
@@ -152,30 +155,6 @@ genbind_node_find_type_ident(struct genbind_node *node,
/**
- * Returning node of the specified type with a GENBIND_NODE_TYPE_TYPE
- * subnode with matching text.
- *
- * This is a conveniance wrapper around nested calls to
- * genbind_node_find_type() which performs a depth first left hand
- * search returning nodes of the specified type and a child node of
- * GENBIND_NODE_TYPE_TYPE with matching text.
- *
- *
- * @param node The node to start the search from
- * @param prev The node at which to stop the search, either NULL to
- * search the full tree depth (initial search) or the result
- * of a previous search to continue.
- * @param nodetype The type of node to seach for.
- * @param type The text to match the type child node to.
- */
-struct genbind_node *
-genbind_node_find_type_type(struct genbind_node *node,
- struct genbind_node *prev,
- enum genbind_node_type nodetype,
- const char *type_text);
-
-
-/**
* Find a method node of a given method type
*
* \param node A node of type GENBIND_NODE_TYPE_CLASS to search for methods.
diff --git a/src/nsgenbind-lexer.l b/src/nsgenbind-lexer.l
index d092195..af77368 100644
--- a/src/nsgenbind-lexer.l
+++ b/src/nsgenbind-lexer.l
@@ -15,9 +15,10 @@
#include "nsgenbind-parser.h"
#include "nsgenbind-ast.h"
-#define YY_USER_ACTION yylloc->first_line = yylloc->last_line; \
- yylloc->first_column = yylloc->last_column + 1; \
- yylloc->last_column += yyleng;
+#define YY_USER_ACTION \
+ yylloc->first_line = yylloc->last_line = yylineno; \
+ yylloc->first_column = yylloc->last_column + 1; \
+ yylloc->last_column += yyleng;
/* Ensure compatability with bison 2.6 and later */
@@ -29,6 +30,43 @@
#define YYLTYPE NSGENBIND_LTYPE
#endif
+static struct YYLTYPE *locations = NULL;
+
+static struct YYLTYPE *push_location(struct YYLTYPE *head,
+ struct YYLTYPE *loc,
+ const char *filename)
+{
+ struct YYLTYPE *res;
+ res = calloc(1, sizeof(struct YYLTYPE));
+ /* copy current location and line number */
+ *res = *loc;
+ res->start_line = yylineno;
+ res->next = head;
+
+ /* reset current location */
+ loc->first_line = loc->last_line = 1;
+ loc->first_column = loc->last_column = 1;
+ loc->filename = strdup(filename);
+ yylineno = 1;
+
+ return res;
+}
+
+static struct YYLTYPE *pop_location(struct YYLTYPE *head, struct YYLTYPE *loc)
+{
+ struct YYLTYPE *res = NULL;
+
+ if (head != NULL) {
+ res = head->next;
+ *loc = *head;
+ free(head);
+
+ yylineno = loc->start_line;
+ }
+ return res;
+}
+
+
%}
/* lexer options */
@@ -93,50 +131,39 @@ dblcolon \:\:
/* binding terminals */
binding return TOK_BINDING;
-
webidl return TOK_WEBIDL;
-
preface return TOK_PREFACE;
-
prologue return TOK_PROLOGUE;
-
epilogue return TOK_EPILOGUE;
-
postface return TOK_POSTFACE;
/* class member terminals */
class return TOK_CLASS;
-
private return TOK_PRIVATE;
-
internal return TOK_INTERNAL;
-
flags return TOK_FLAGS;
-
type return TOK_TYPE;
-
unshared return TOK_UNSHARED;
-
shared return TOK_SHARED;
-
property return TOK_PROPERTY;
/* implementation terminals */
init return TOK_INIT;
-
fini return TOK_FINI;
-
method return TOK_METHOD;
-
getter return TOK_GETTER;
-
setter return TOK_SETTER;
-
prototype return TOK_PROTOTYPE;
+ /* c type terminals */
+
+struct return TOK_STRUCT;
+union return TOK_UNION;
+unsigned return TOK_UNSIGNED;
+
/* other terminals */
{dblcolon} return TOK_DBLCOLON;
@@ -176,8 +203,10 @@ prototype return TOK_PROTOTYPE;
fprintf(stderr, "Unable to open include %s\n",
yytext);
exit(3);
}
- yypush_buffer_state(yy_create_buffer( yyin, YY_BUF_SIZE ));
-
+
+ locations = push_location(locations, yylloc, yytext);
+
+ yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
BEGIN(INITIAL);
}
@@ -189,9 +218,10 @@ prototype return TOK_PROTOTYPE;
yypop_buffer_state();
if ( !YY_CURRENT_BUFFER ) {
- yyterminate();
+ yyterminate();
} else {
- BEGIN(incl);
+ locations = pop_location(locations, yylloc);
+ BEGIN(incl);
}
}
diff --git a/src/nsgenbind-parser.y b/src/nsgenbind-parser.y
index 1462b39..88c69b1 100644
--- a/src/nsgenbind-parser.y
+++ b/src/nsgenbind-parser.y
@@ -1,4 +1,66 @@
-%{
+/* binding parser
+ *
+ * This file is part of nsgenbind.
+ * Licensed under the MIT License,
+ *
http://www.opensource.org/licenses/mit-license.php
+ * Copyright 2012 Vincent Sanders <vince(a)netsurf-browser.org>
+ */
+
+ /* bison prior to 2.4 cannot cope with %define api.pure so we use the
+ * deprecated directive
+ */
+%pure-parser
+
+%locations
+
+%error-verbose
+ /* would use api.prefix but it needs to be different between bison
+ * 2.5 and 2.6
+ */
+
+%code requires {
+
+#define YYLTYPE YYLTYPE
+typedef struct YYLTYPE {
+ struct YYLTYPE *next;
+ int start_line;
+ char *filename;
+
+ int first_line;
+ int first_column;
+ int last_line;
+ int last_column;
+} YYLTYPE;
+
+
+#define YYLLOC_DEFAULT(Current, Rhs, N) \
+ do \
+ if (N) { \
+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 1).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 1).start_line; \
+ } else { /* empty RHS */ \
+ (Current).first_line = (Current).last_line = \
+ YYRHSLOC (Rhs, 0).last_line; \
+ (Current).first_column = (Current).last_column = \
+ YYRHSLOC (Rhs, 0).last_column; \
+ (Current).filename = YYRHSLOC (Rhs, 0).filename; \
+ (Current).start_line = YYRHSLOC (Rhs, 0).start_line; \
+ } \
+ while (0)
+
+}
+
+%initial-action {
+ yylloc.first_line = yylloc.last_line = 1;
+ yylloc.first_column = yylloc.last_column = 1;
+ yylloc.filename = filename;
+}
+
+%code {
/* parser for the binding generation config file
*
* This file is part of nsgenbind.
@@ -16,7 +78,6 @@
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
-#include "nsgenbind-parser.h"
#include "nsgenbind-lexer.h"
#include "webidl-ast.h"
#include "nsgenbind-ast.h"
@@ -24,24 +85,34 @@
char *errtxt;
static void nsgenbind_error(YYLTYPE *locp,
+ char *filename,
struct genbind_node **genbind_ast,
const char *str)
{
- locp = locp;
- genbind_ast = genbind_ast;
- errtxt = strdup(str);
+ int errlen;
+ errlen = snprintf(NULL, 0, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+ errtxt = malloc(errlen + 1);
+ snprintf(errtxt, errlen + 1, "%s:%d:%s",
+ locp->filename, locp->first_line, str);
+
+ genbind_ast = genbind_ast;
+ filename = filename;
}
static struct genbind_node *
add_method(struct genbind_node **genbind_ast,
long methodtype,
struct genbind_node *declarator,
- char *cdata)
+ char *cdata,
+ long lineno,
+ char *filename)
{
struct genbind_node *res_node;
struct genbind_node *method_node;
struct genbind_node *class_node;
struct genbind_node *cdata_node;
+ struct genbind_node *location_node;
char *class_name;
/* extract the class name from the declarator */
@@ -63,11 +134,17 @@ add_method(struct genbind_node **genbind_ast,
cdata);
}
+ location_node = genbind_new_node(GENBIND_NODE_TYPE_FILE,
+ genbind_new_node(GENBIND_NODE_TYPE_LINE,
+ cdata_node,
+ (void *)lineno),
+ strdup(filename));
+
/* generate method node */
method_node = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
NULL,
genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
- cdata_node,
+ location_node,
(void *)methodtype));
class_node = genbind_node_find_type_ident(*genbind_ast,
@@ -80,7 +157,6 @@ add_method(struct genbind_node **genbind_ast,
genbind_new_node(GENBIND_NODE_TYPE_IDENT,
method_node,
class_name));
-
} else {
/* update the existing class */
@@ -92,21 +168,16 @@ add_method(struct genbind_node **genbind_ast,
return res_node;
}
-%}
+}
-%locations
- /* bison prior to 2.4 cannot cope with %define api.pure so we use the
- * deprecated directive
- */
-%pure-parser
-%error-verbose
+%parse-param { char *filename }
%parse-param { struct genbind_node **genbind_ast }
%union
{
- char *text;
- struct genbind_node *node;
- long value;
+ char *text;
+ struct genbind_node *node;
+ long value;
}
%token TOK_BINDING
@@ -135,6 +206,10 @@ add_method(struct genbind_node **genbind_ast,
%token TOK_DBLCOLON
+%token TOK_STRUCT
+%token TOK_UNION
+%token TOK_UNSIGNED
+
%token <text> TOK_IDENTIFIER
%token <text> TOK_STRING_LITERAL
%token <text> TOK_CCODE_LITERAL
@@ -152,55 +227,46 @@ add_method(struct genbind_node **genbind_ast,
%type <node> Class
%type <node> ClassArgs
%type <node> ClassArg
-%type <node> ClassFlag
%type <node> ClassFlags
%type <node> Method
%type <node> MethodDeclarator
%type <value> MethodType
+%type <value> BindingAndMethodType
%type <node> WebIDL
-%type <node> Preface
-%type <node> Prologue
-%type <node> Epilogue
-%type <node> Postface
-%type <node> Private
-%type <node> Internal
-%type <node> Property
%type <node> ParameterList
-%type <node> TypeIdent
+%type <node> CTypeIdent
+%type <node> CType
+%type <node> CTypeSpecifier
%%
-Input
- :
+Input:
Statements
- {
- *genbind_ast = $1;
+ {
+ *genbind_ast = $1;
}
;
-
-Statements
- :
- Statement
- |
- Statements Statement
+Statements:
+ Statement
+ |
+ Statements Statement
{
- $$ = *genbind_ast = genbind_node_prepend($2, $1);
+ $$ = *genbind_ast = genbind_node_prepend($2, $1);
}
- |
- error ';'
- {
- fprintf(stderr, "%d: %s\n", yylloc.first_line, errtxt);
- free(errtxt);
- YYABORT ;
+ |
+ error ';'
+ {
+ fprintf(stderr, "%s\n", errtxt);
+ free(errtxt);
+ YYABORT ;
}
;
-Statement
- :
+Statement:
Binding
|
Class
@@ -208,114 +274,147 @@ Statement
Method
;
-Binding
- :
- TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}'
+Binding:
+ TOK_BINDING TOK_IDENTIFIER '{' BindingArgs '}' ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
- NULL,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, $4, $2));
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_BINDING,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ $4, $2));
}
;
-BindingArgs
- :
+BindingArgs:
BindingArg
|
BindingArgs BindingArg
{
- $$ = genbind_node_link($2, $1);
+ $$ = genbind_node_link($2, $1);
}
;
-BindingArg
- :
+BindingArg:
WebIDL
|
- Preface
- |
- Prologue
- |
- Epilogue
- |
- Postface
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
+ }
;
- /* [3] a web IDL file specifier */
-WebIDL
- :
+/* a web IDL file specifier */
+WebIDL:
TOK_WEBIDL TOK_STRING_LITERAL ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_WEBIDL, NULL, $2);
}
;
-
- /* type and identifier of a variable */
-TypeIdent
- :
- TOK_STRING_LITERAL TOK_IDENTIFIER
+ /* parse a c type specifier. This probably also needs to cope with
+ * void, char, short, int, long, float, double, signed, enum
+ */
+CTypeSpecifier:
+ TOK_UNSIGNED TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE, NULL, $1), $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("unsigned")),
+ $2);
}
|
- TOK_STRING_LITERAL TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
+ TOK_STRUCT TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("struct")),
+ $2);
+ }
+ |
+ TOK_UNION TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ genbind_new_node(GENBIND_NODE_TYPE_NAME,
+ NULL,
+ strdup("union")),
+ $2);
+ }
+ |
+ TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- genbind_new_node(GENBIND_NODE_TYPE_TYPE,
- NULL,
- $1),
- $2),
- $4);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, NULL, $1);
}
;
-Preface
- :
- TOK_PREFACE CBlock ';'
+CType:
+ CTypeSpecifier
+ |
+ CTypeSpecifier '*'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PREFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_NAME, $1,
strdup("*"));
}
- ;
-Prologue
- :
- TOK_PROLOGUE CBlock ';'
+ /* type and identifier of a variable */
+CTypeIdent:
+ CType TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROLOGUE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2);
+ }
+ |
+ CType TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $2), $4);
}
;
-Epilogue
- :
- TOK_EPILOGUE CBlock ';'
+
+CBlock:
+ TOK_CCODE_LITERAL
+ |
+ CBlock TOK_CCODE_LITERAL
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_EPILOGUE, NULL, $2);
+ $$ = genbind_strapp($1, $2);
}
;
-Postface
- :
- TOK_POSTFACE CBlock ';'
+
+ParameterList:
+ CTypeIdent
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_POSTFACE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
+ }
+ |
+ ParameterList ',' CTypeIdent
+ {
+ $$ = genbind_node_prepend($1,
+ genbind_new_node(
+ GENBIND_NODE_TYPE_PARAMETER,
+ NULL,
+ $3));
}
;
-CBlock
- :
- TOK_CCODE_LITERAL
+Method:
+ MethodType MethodDeclarator CBlock
+ {
+ $$ = add_method(genbind_ast, $1, $2, $3, @1.first_line, @1.filename);
+ }
|
- CBlock TOK_CCODE_LITERAL
+ MethodType MethodDeclarator ';'
{
- $$ = genbind_strapp($1, $2);
+ $$ = add_method(genbind_ast, $1, $2, NULL, @1.first_line, @1.filename);
}
;
-MethodType
- :
+MethodType:
TOK_INIT
{
$$ = GENBIND_METHOD_TYPE_INIT;
@@ -345,27 +444,33 @@ MethodType
{
$$ = GENBIND_METHOD_TYPE_PROTOTYPE;
}
+ |
+ BindingAndMethodType
;
-ParameterList
- :
- TypeIdent
+BindingAndMethodType:
+ TOK_PREFACE
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PARAMETER, NULL, $1);
+ $$ = GENBIND_METHOD_TYPE_PREFACE;
}
|
- ParameterList ',' TypeIdent
+ TOK_PROLOGUE
{
- $$ = genbind_node_prepend($1,
- genbind_new_node(
- GENBIND_NODE_TYPE_PARAMETER,
- NULL,
- $3));
+ $$ = GENBIND_METHOD_TYPE_PROLOGUE;
+ }
+ |
+ TOK_EPILOGUE
+ {
+ $$ = GENBIND_METHOD_TYPE_EPILOGUE;
+ }
+ |
+ TOK_POSTFACE
+ {
+ $$ = GENBIND_METHOD_TYPE_POSTFACE;
}
;
-MethodDeclarator
- :
+MethodDeclarator:
TOK_IDENTIFIER TOK_DBLCOLON TOK_IDENTIFIER '(' ParameterList ')'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS,
@@ -406,30 +511,21 @@ MethodDeclarator
}
;
-Method
- :
- MethodType MethodDeclarator CBlock
- {
- $$ = add_method(genbind_ast, $1, $2, $3);
- }
- |
- MethodType MethodDeclarator ';'
- {
- $$ = add_method(genbind_ast, $1, $2, NULL);
- }
- ;
-Class
- :
- TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}'
+Class:
+ TOK_CLASS TOK_IDENTIFIER '{' ClassArgs '}' ';'
{
$$ = genbind_new_node(GENBIND_NODE_TYPE_CLASS, NULL,
genbind_new_node(GENBIND_NODE_TYPE_IDENT, $4, $2));
}
;
-ClassArgs
- :
+ClassArgs:
+ /* empty */
+ {
+ $$ = NULL;
+ }
+ |
ClassArg
|
ClassArgs ClassArg
@@ -438,78 +534,57 @@ ClassArgs
}
;
-ClassArg
- :
- Private
- |
- Internal
- |
- Property
- |
- ClassFlag
- |
- Preface
- |
- Prologue
- |
- Epilogue
+ClassArg:
+ TOK_PRIVATE CTypeIdent ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
+ }
|
- Postface
- ;
-
-
-Private
- :
- TOK_PRIVATE TypeIdent ';'
+ TOK_INTERNAL CTypeIdent ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PRIVATE, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
}
- ;
-
-Internal
- :
- TOK_INTERNAL TypeIdent ';'
+ |
+ TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_INTERNAL, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
+ genbind_new_node(GENBIND_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ (void *)$2));
}
- ;
-
-ClassFlag
- :
+ |
TOK_FLAGS ClassFlags ';'
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_FLAGS, NULL, $2);
+ }
+ |
+ BindingAndMethodType CBlock ';'
+ {
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_METHOD,
+ NULL,
+ genbind_new_node(GENBIND_NODE_TYPE_METHOD_TYPE,
+ genbind_new_node(GENBIND_NODE_TYPE_CDATA,
+ NULL,
+ $2),
+ (void *)$1));
}
;
-ClassFlags
- :
+ClassFlags:
TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, NULL, $1);
}
|
ClassFlags ',' TOK_IDENTIFIER
{
- $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
- }
- ;
-
-Property
- :
- TOK_PROPERTY Modifiers TOK_IDENTIFIER ';'
- {
- $$ = genbind_new_node(GENBIND_NODE_TYPE_PROPERTY, NULL,
- genbind_new_node(GENBIND_NODE_TYPE_MODIFIER,
- genbind_new_node(GENBIND_NODE_TYPE_IDENT,
- NULL,
- $3),
- (void *)$2));
+ $$ = genbind_new_node(GENBIND_NODE_TYPE_IDENT, $1, $3);
}
;
-Modifiers
- :
+Modifiers:
/* empty */
{
$$ = GENBIND_TYPE_NONE;
@@ -521,8 +596,7 @@ Modifiers
}
;
-Modifier
- :
+Modifier:
TOK_TYPE
{
$$ = GENBIND_TYPE_TYPE;
diff --git a/src/nsgenbind.c b/src/nsgenbind.c
index 135c5c0..09d4c29 100644
--- a/src/nsgenbind.c
+++ b/src/nsgenbind.c
@@ -168,7 +168,7 @@ static enum bindingtype_e genbind_get_type(struct genbind_node *node)
genbind_node_find_type(
genbind_node_getnode(binding_node),
NULL,
- GENBIND_NODE_TYPE_TYPE));
+ GENBIND_NODE_TYPE_NAME));
if (binding_type == NULL) {
fprintf(stderr, "Error: missing binding type\n");
return BINDINGTYPE_UNKNOWN;
diff --git a/src/options.h b/src/options.h
index 5b7d73d..d452c17 100644
--- a/src/options.h
+++ b/src/options.h
@@ -28,9 +28,10 @@ extern struct options *options;
enum opt_warnings {
WARNING_UNIMPLEMENTED = 1,
WARNING_DUPLICATED = 2,
+ WARNING_WEBIDL = 4,
};
-#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED)
+#define WARNING_ALL (WARNING_UNIMPLEMENTED | WARNING_DUPLICATED | WARNING_WEBIDL)
#define WARN(flags, msg, args...) do { \
if ((options->warnings & flags) != 0) { \
diff --git a/src/webidl-ast.h b/src/webidl-ast.h
index 9ae2ebb..59dfcac 100644
--- a/src/webidl-ast.h
+++ b/src/webidl-ast.h
@@ -49,21 +49,21 @@ enum webidl_node_type {
};
enum webidl_type {
- WEBIDL_TYPE_ANY, /**< The type is unconstrained */
- WEBIDL_TYPE_USER,
- WEBIDL_TYPE_BOOL,
- WEBIDL_TYPE_BYTE,
- WEBIDL_TYPE_OCTET,
- WEBIDL_TYPE_FLOAT,
- WEBIDL_TYPE_DOUBLE,
- WEBIDL_TYPE_SHORT,
- WEBIDL_TYPE_LONG,
- WEBIDL_TYPE_LONGLONG,
- WEBIDL_TYPE_STRING,
- WEBIDL_TYPE_SEQUENCE,
- WEBIDL_TYPE_OBJECT,
- WEBIDL_TYPE_DATE,
- WEBIDL_TYPE_VOID,
+ WEBIDL_TYPE_ANY, /**< 0 - The type is unconstrained */
+ WEBIDL_TYPE_USER, /**< 1 - The type is a dictionary or interface */
+ WEBIDL_TYPE_BOOL, /**< 2 - The type is boolean */
+ WEBIDL_TYPE_BYTE, /**< 3 - The type is a byte */
+ WEBIDL_TYPE_OCTET, /**< 4 - The type is a octet */
+ WEBIDL_TYPE_FLOAT, /**< 5 - The type is a float point number */
+ WEBIDL_TYPE_DOUBLE, /**< 6 - The type is a double */
+ WEBIDL_TYPE_SHORT, /**< 7 - The type is a signed 16bit */
+ WEBIDL_TYPE_LONG, /**< 8 - The type is a signed 32bit */
+ WEBIDL_TYPE_LONGLONG, /**< 9 - The type is a signed 64bit */
+ WEBIDL_TYPE_STRING, /**< 10 - The type is a string */
+ WEBIDL_TYPE_SEQUENCE, /**< 11 - The type is a sequence */
+ WEBIDL_TYPE_OBJECT, /**< 12 - The type is a object */
+ WEBIDL_TYPE_DATE, /**< 13 - The type is a date */
+ WEBIDL_TYPE_VOID, /**< 14 - The type is void */
};
/** modifiers for operations, attributes and arguments */
diff --git a/src/webidl-lexer.l b/src/webidl-lexer.l
index 4788610..a857654 100644
--- a/src/webidl-lexer.l
+++ b/src/webidl-lexer.l
@@ -215,6 +215,10 @@ legacyiterable return TOK_LEGACYITERABLE;
required return TOK_REQUIRED;
+Constructor return TOK_CONSTRUCTOR;
+
+NamedConstructor return TOK_NAMEDCONSTRUCTOR;
+
{identifier} {
/* A leading "_" is used to escape an identifier from
* looking like a reserved word terminal. */
diff --git a/src/webidl-parser.y b/src/webidl-parser.y
index 406962f..b48b449 100644
--- a/src/webidl-parser.y
+++ b/src/webidl-parser.y
@@ -67,6 +67,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char
*str)
%token TOK_BYTE
%token TOK_CALLBACK
%token TOK_CONST
+%token TOK_CONSTRUCTOR
%token TOK_CREATOR
%token TOK_DATE
%token TOK_DELETER
@@ -92,6 +93,7 @@ webidl_error(YYLTYPE *locp, struct webidl_node **winbind_ast, const char
*str)
%token TOK_MODULE
%token TOK_NAN
%token TOK_NATIVE
+%token TOK_NAMEDCONSTRUCTOR
%token TOK_NULL_LITERAL
%token TOK_OBJECT
%token TOK_OCTET
@@ -580,12 +582,12 @@ PartialDictionary:
Default:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'=' DefaultValue
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -619,12 +621,12 @@ ExceptionMembers:
Inheritance:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
':' TOK_IDENTIFIER
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -632,7 +634,7 @@ Inheritance:
Enum:
TOK_ENUM TOK_IDENTIFIER '{' EnumValueList '}' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -662,7 +664,7 @@ EnumValueListString:
CallbackRest:
TOK_IDENTIFIER '=' ReturnType '(' ArgumentList ')'
';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -670,7 +672,7 @@ CallbackRest:
Typedef:
TOK_TYPEDEF ExtendedAttributeList Type TOK_IDENTIFIER ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -732,12 +734,14 @@ ConstValue:
|
TOK_INT_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT, NULL, (void *)$1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_INT,
+ NULL,
+ (void *)$1);
}
|
TOK_NULL_LITERAL
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_NULL, NULL, NULL);
}
;
@@ -745,12 +749,16 @@ ConstValue:
BooleanLiteral:
TOK_TRUE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)true);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)true);
}
|
TOK_FALSE
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL, NULL, (void *)false);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_BOOL,
+ NULL,
+ (void *)false);
}
;
@@ -758,34 +766,42 @@ BooleanLiteral:
FloatLiteral:
TOK_FLOAT_LITERAL
{
- float *value;
- value = malloc(sizeof(float));
- *value = strtof($1, NULL);
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = strtof($1, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
'-' TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = -INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = -INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_INFINITY
{
- float *value;
- value = malloc(sizeof(float));
- *value = INFINITY;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = INFINITY;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
|
TOK_NAN
{
- float *value;
- value = malloc(sizeof(float));
- *value = NAN;
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT, NULL, value);
+ float *value;
+ value = malloc(sizeof(float));
+ *value = NAN;
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LITERAL_FLOAT,
+ NULL,
+ value);
}
;
@@ -793,7 +809,7 @@ FloatLiteral:
AttributeOrOperation:
TOK_STRINGIFIER StringifierAttributeOrOperation
{
- $$ = $2;
+ $$ = $2;
}
|
Attribute
@@ -807,13 +823,13 @@ StringifierAttributeOrOperation:
|
OperationRest
{
- /* @todo deal with stringifier */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
+ /* @todo deal with stringifier */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION, NULL, $1);
}
|
';'
{
- $$=NULL;
+ $$=NULL;
}
;
@@ -915,7 +931,7 @@ AttributeName:
AttributeNameKeyword:
TOK_REQUIRED
{
- $$ = strdup("required");
+ $$ = strdup("required");
}
/* [33]
@@ -924,12 +940,12 @@ AttributeNameKeyword:
Inherit:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_INHERIT
{
- $$ = true;
+ $$ = true;
}
;
@@ -940,12 +956,12 @@ Inherit:
ReadOnly:
/* empty */
{
- $$ = false;
+ $$ = false;
}
|
TOK_READONLY
{
- $$ = true;
+ $$ = true;
}
;
@@ -999,34 +1015,39 @@ Special:
TOK_GETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_GETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_GETTER);
}
|
TOK_SETTER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_SETTER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_SETTER);
}
|
TOK_CREATOR
{
- /* second edition removed this special but teh
- specifications still use it!
- */
+ /* second edition removed this special but the
+ * specifications still use it!
+ */
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_CREATOR);
}
|
TOK_DELETER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_DELETER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_DELETER);
}
|
TOK_LEGACYCALLER
{
$$ = webidl_node_new(WEBIDL_NODE_TYPE_SPECIAL,
- NULL, (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
+ NULL,
+ (void *)WEBIDL_TYPE_SPECIAL_LEGACYCALLER);
}
;
@@ -1034,10 +1055,10 @@ Special:
OperationRest:
OptionalIdentifier '(' ArgumentList ')' ';'
{
- /* argument list */
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
+ /* argument list */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_LIST, NULL, $3);
- $$ = webidl_node_prepend($1, $$); /* identifier */
+ $$ = webidl_node_prepend($1, $$); /* identifier */
}
;
@@ -1045,12 +1066,12 @@ OperationRest:
OptionalIdentifier:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_IDENTIFIER
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1);
}
;
@@ -1061,12 +1082,12 @@ OptionalIdentifier:
ArgumentList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
Argument Arguments
{
- $$ = webidl_node_append($2, $1);
+ $$ = webidl_node_append($2, $1);
}
;
@@ -1074,12 +1095,12 @@ ArgumentList:
Arguments:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Argument Arguments
{
- $$ = webidl_node_append($3, $2);
+ $$ = webidl_node_append($3, $2);
}
;
@@ -1088,7 +1109,7 @@ Arguments:
Argument:
ExtendedAttributeList OptionalOrRequiredArgument
{
- $$ = $2;
+ $$ = $2;
}
;
@@ -1124,12 +1145,12 @@ ArgumentName:
Ellipsis:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_ELLIPSIS
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_ELLIPSIS, NULL, NULL);
}
;
@@ -1137,12 +1158,12 @@ Ellipsis:
Iterable:
TOK_ITERABLE '<' Type OptionalType '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
|
TOK_LEGACYITERABLE '<' Type '>' ';'
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1150,12 +1171,12 @@ Iterable:
OptionalType:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' Type
{
- $$ = NULL;
+ $$ = NULL;
}
;
@@ -1175,12 +1196,14 @@ ExceptionField:
ExtendedAttributeList:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'[' ExtendedAttribute ExtendedAttributes ']'
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1188,12 +1211,14 @@ ExtendedAttributeList:
ExtendedAttributes:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
',' ExtendedAttribute ExtendedAttributes
{
- $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $3, $2);
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ $3,
+ $2);
}
;
@@ -1218,10 +1243,46 @@ ExtendedAttribute:
$$ = webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE, $4, $2);
}
|
+ TOK_CONSTRUCTOR
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor"));
+ }
+ |
+ TOK_CONSTRUCTOR '(' ArgumentList ')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ strdup("Constructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+ NULL,
+ $3));
+ }
+ |
+ TOK_NAMEDCONSTRUCTOR '=' TOK_IDENTIFIER '(' ArgumentList
')'
+ {
+ /* Constructor */
+ $$ = webidl_node_new(WEBIDL_NODE_TYPE_OPERATION,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+
strdup("NamedConstructor")),
+ webidl_node_new(WEBIDL_NODE_TYPE_LIST,
+
webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $3),
+ $5));
+ }
+ |
Other ExtendedAttributeRest
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1229,12 +1290,12 @@ ExtendedAttribute:
ExtendedAttributeRest:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
ExtendedAttribute
{
- $$ = $1;
+ $$ = $1;
}
;
@@ -1242,16 +1303,16 @@ ExtendedAttributeRest:
ExtendedAttributeInner:
/* empty */
{
- $$ = NULL;
+ $$ = NULL;
}
|
'(' ExtendedAttributeInner ')' ExtendedAttributeInner
{
- $$ = webidl_node_prepend(
- webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
- NULL,
- $2),
- $4);
+ $$ = webidl_node_prepend(
+ webidl_node_new(WEBIDL_NODE_TYPE_EXTENDED_ATTRIBUTE,
+ NULL,
+ $2),
+ $4);
}
|
'[' ExtendedAttributeInner ']' ExtendedAttributeInner
@@ -1276,8 +1337,10 @@ ExtendedAttributeInner:
|
OtherOrComma ExtendedAttributeInner
{
- $$ = webidl_node_append($2,
- webidl_node_new(WEBIDL_NODE_TYPE_IDENT, NULL, $1));
+ $$ = webidl_node_append($2,
+ webidl_node_new(WEBIDL_NODE_TYPE_IDENT,
+ NULL,
+ $1));
}
;
@@ -1285,119 +1348,119 @@ ExtendedAttributeInner:
Other:
TOK_INT_LITERAL
{
- /* @todo loosing base info here might break the attribute */
- $$ = calloc(1, 32);
- snprintf($$, 32, "%ld", $1);
+ /* @todo loosing base info here might break the attribute */
+ $$ = calloc(1, 32);
+ snprintf($$, 32, "%ld", $1);
}
|
TOK_FLOAT_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_IDENTIFIER
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_STRING_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
TOK_OTHER_LITERAL
{
- $$ = $1;
+ $$ = $1;
}
|
'-'
{
- $$ = strdup("-");
+ $$ = strdup("-");
}
|
'.'
{
- $$ = strdup(".");
+ $$ = strdup(".");
}
|
TOK_ELLIPSIS
{
- $$ = strdup("...");
+ $$ = strdup("...");
}
|
':'
{
- $$ = strdup(":");
+ $$ = strdup(":");
}
|
';'
{
- $$ = strdup(";");
+ $$ = strdup(";");
}
|
'<'
{
- $$ = strdup("<");
+ $$ = strdup("<");
}
|
'='
{
- $$ = strdup("=");
+ $$ = strdup("=");
}
|
'>'
{
- $$ = strdup(">");
+ $$ = strdup(">");
}
|
'?'
{
- $$ = strdup("?");
+ $$ = strdup("?");
}
|
TOK_DATE
{
- $$ = strdup("Date");
+ $$ = strdup("Date");
}
|
TOK_STRING
{
- $$ = strdup("DOMString");
+ $$ = strdup("DOMString");
}
|
TOK_INFINITY
{
- $$ = strdup("Infinity");
+ $$ = strdup("Infinity");
}
|
TOK_NAN
{
- $$ = strdup("NaN");
+ $$ = strdup("NaN");
}
|
TOK_ANY
{
- $$ = strdup("any");
+ $$ = strdup("any");
}
|
TOK_BOOLEAN
{
- $$ = strdup("boolean");
+ $$ = strdup("boolean");
}
|
TOK_BYTE
{
- $$ = strdup("byte");
+ $$ = strdup("byte");
}
|
TOK_DOUBLE
{
- $$ = strdup("double");
+ $$ = strdup("double");
}
|
TOK_FALSE
{
- $$ = strdup("false");
+ $$ = strdup("false");
}
|
TOK_FLOAT
diff --git a/test/data/bindings/HTMLUnknownElement.bnd
b/test/data/bindings/HTMLUnknownElement.bnd
index faabaec..d44018b 100644
--- a/test/data/bindings/HTMLUnknownElement.bnd
+++ b/test/data/bindings/HTMLUnknownElement.bnd
@@ -14,6 +14,6 @@ class HTMLUnknownElement {
postface %{
/* class post */
%};
-}
+};
-init HTMLUnknownElement("struct dom_html_element *"
html_unknown_element::html_element);
+init HTMLUnknownElement(struct dom_html_element *html_unknown_element::html_element);
diff --git a/test/data/bindings/browser-duk.bnd b/test/data/bindings/browser-duk.bnd
index 44497a1..3113891 100644
--- a/test/data/bindings/browser-duk.bnd
+++ b/test/data/bindings/browser-duk.bnd
@@ -37,108 +37,112 @@ binding duk_libdom {
postface %{
/* binding postface */
%};
-}
+};
+
+class empty_class {
+};
+
#include "HTMLUnknownElement.bnd"
/* specialisations of html_element */
-init HTMLFontElement("struct dom_html_element *"
html_font_element::html_element);
-init HTMLDirectoryElement("struct dom_html_element *"
html_directory_element::html_element);
-init HTMLFrameElement("struct dom_html_element *"
html_frame_element::html_element);
-init HTMLFrameSetElement("struct dom_html_element *"
html_frame_set_element::html_element);
-init HTMLMarqueeElement("struct dom_html_element *"
html_marquee_element::html_element);
-init HTMLAppletElement("struct dom_html_element *"
html_applet_element::html_element);
-init HTMLCanvasElement("struct dom_html_element *"
html_canvas_element::html_element);
-init HTMLTemplateElement("struct dom_html_element *"
html_template_element::html_element);
-init HTMLScriptElement("struct dom_html_element *"
html_script_element::html_element);
-init HTMLDialogElement("struct dom_html_element *"
html_dialog_element::html_element);
-init HTMLMenuItemElement("struct dom_html_element *"
html_menu_item_element::html_element);
-init HTMLMenuElement("struct dom_html_element *"
html_menu_element::html_element);
-init HTMLDetailsElement("struct dom_html_element *"
html_details_element::html_element);
-init HTMLLegendElement("struct dom_html_element *"
html_legend_element::html_element);
-init HTMLFieldSetElement("struct dom_html_element *"
html_field_set_element::html_element);
-init HTMLMeterElement("struct dom_html_element *"
html_meter_element::html_element);
-init HTMLProgressElement("struct dom_html_element *"
html_progress_element::html_element);
-init HTMLOutputElement("struct dom_html_element *"
html_output_element::html_element);
-init HTMLKeygenElement("struct dom_html_element *"
html_keygen_element::html_element);
-init HTMLTextAreaElement("struct dom_html_element *"
html_text_area_element::html_element);
-init HTMLOptionElement("struct dom_html_element *"
html_option_element::html_element);
-init HTMLOptGroupElement("struct dom_html_element *"
html_opt_group_element::html_element);
-init HTMLDataListElement("struct dom_html_element *"
html_data_list_element::html_element);
-init HTMLSelectElement("struct dom_html_element *"
html_select_element::html_element);
-init HTMLButtonElement("struct dom_html_element *"
html_button_element::html_element);
-init HTMLInputElement("struct dom_html_element *"
html_input_element::html_element);
-init HTMLLabelElement("struct dom_html_element *"
html_label_element::html_element);
-init HTMLFormElement("struct dom_html_element *"
html_form_element::html_element);
-init HTMLTableCellElement("struct dom_html_element *"
html_table_cell_element::html_element);
-init HTMLTableRowElement("struct dom_html_element *"
html_table_row_element::html_element);
-init HTMLTableSectionElement("struct dom_html_element *"
html_table_section_element::html_element);
-init HTMLTableColElement("struct dom_html_element *"
html_table_col_element::html_element);
-init HTMLTableCaptionElement("struct dom_html_element *"
html_table_caption_element::html_element);
-init HTMLTableElement("struct dom_html_element *"
html_table_element::html_element);
-init HTMLAreaElement("struct dom_html_element *"
html_area_element::html_element);
-init HTMLMapElement("struct dom_html_element *"
html_map_element::html_element);
-init HTMLMediaElement("struct dom_html_element *"
html_media_element::html_element);
-init HTMLTrackElement("struct dom_html_element *"
html_track_element::html_element);
-init HTMLParamElement("struct dom_html_element *"
html_param_element::html_element);
-init HTMLObjectElement("struct dom_html_element *"
html_object_element::html_element);
-init HTMLEmbedElement("struct dom_html_element *"
html_embed_element::html_element);
-init HTMLIFrameElement("struct dom_html_element *"
html_i_frame_element::html_element);
-init HTMLImageElement("struct dom_html_element *"
html_image_element::html_element);
-init HTMLSourceElement("struct dom_html_element *"
html_source_element::html_element);
-init HTMLPictureElement("struct dom_html_element *"
html_picture_element::html_element);
-init HTMLModElement("struct dom_html_element *"
html_mod_element::html_element);
-init HTMLBRElement("struct dom_html_element *" html_br_element::html_element);
-init HTMLSpanElement("struct dom_html_element *"
html_span_element::html_element);
-init HTMLTimeElement("struct dom_html_element *"
html_time_element::html_element);
-init HTMLDataElement("struct dom_html_element *"
html_data_element::html_element);
-init HTMLAnchorElement("struct dom_html_element *"
html_anchor_element::html_element);
-init HTMLDivElement("struct dom_html_element *"
html_div_element::html_element);
-init HTMLDListElement("struct dom_html_element *"
html_d_list_element::html_element);
-init HTMLLIElement("struct dom_html_element *" html_li_element::html_element);
-init HTMLUListElement("struct dom_html_element *"
html_u_list_element::html_element);
-init HTMLOListElement("struct dom_html_element *"
html_o_list_element::html_element);
-init HTMLQuoteElement("struct dom_html_element *"
html_quote_element::html_element);
-init HTMLPreElement("struct dom_html_element *"
html_pre_element::html_element);
-init HTMLHRElement("struct dom_html_element *" html_hr_element::html_element);
-init HTMLParagraphElement("struct dom_html_element *"
html_paragraph_element::html_element);
-init HTMLHeadingElement("struct dom_html_element *"
html_heading_element::html_element);
-init HTMLBodyElement("struct dom_html_element *"
html_body_element::html_element);
-init HTMLStyleElement("struct dom_html_element *"
html_style_element::html_element);
-init HTMLMetaElement("struct dom_html_element *"
html_meta_element::html_element);
-init HTMLLinkElement("struct dom_html_element *"
html_link_element::html_element);
-init HTMLBaseElement("struct dom_html_element *"
html_base_element::html_element);
-init HTMLTitleElement("struct dom_html_element *"
html_title_element::html_element);
-init HTMLHeadElement("struct dom_html_element *"
html_head_element::html_element);
-init HTMLHtmlElement("struct dom_html_element *"
html_html_element::html_element);
+init HTMLFontElement(struct dom_html_element *html_font_element::html_element);
+init HTMLDirectoryElement(struct dom_html_element
*html_directory_element::html_element);
+init HTMLFrameElement(struct dom_html_element *html_frame_element::html_element);
+init HTMLFrameSetElement(struct dom_html_element *html_frame_set_element::html_element);
+init HTMLMarqueeElement(struct dom_html_element *html_marquee_element::html_element);
+init HTMLAppletElement(struct dom_html_element *html_applet_element::html_element);
+init HTMLCanvasElement(struct dom_html_element *html_canvas_element::html_element);
+init HTMLTemplateElement(struct dom_html_element *html_template_element::html_element);
+init HTMLScriptElement(struct dom_html_element *html_script_element::html_element);
+init HTMLDialogElement(struct dom_html_element *html_dialog_element::html_element);
+init HTMLMenuItemElement(struct dom_html_element *html_menu_item_element::html_element);
+init HTMLMenuElement(struct dom_html_element *html_menu_element::html_element);
+init HTMLDetailsElement(struct dom_html_element *html_details_element::html_element);
+init HTMLLegendElement(struct dom_html_element *html_legend_element::html_element);
+init HTMLFieldSetElement(struct dom_html_element *html_field_set_element::html_element);
+init HTMLMeterElement(struct dom_html_element *html_meter_element::html_element);
+init HTMLProgressElement(struct dom_html_element *html_progress_element::html_element);
+init HTMLOutputElement(struct dom_html_element *html_output_element::html_element);
+init HTMLKeygenElement(struct dom_html_element *html_keygen_element::html_element);
+init HTMLTextAreaElement(struct dom_html_element *html_text_area_element::html_element);
+init HTMLOptionElement(struct dom_html_element *html_option_element::html_element);
+init HTMLOptGroupElement(struct dom_html_element *html_opt_group_element::html_element);
+init HTMLDataListElement(struct dom_html_element *html_data_list_element::html_element);
+init HTMLSelectElement(struct dom_html_element *html_select_element::html_element);
+init HTMLButtonElement(struct dom_html_element *html_button_element::html_element);
+init HTMLInputElement(struct dom_html_element *html_input_element::html_element);
+init HTMLLabelElement(struct dom_html_element *html_label_element::html_element);
+init HTMLFormElement(struct dom_html_element *html_form_element::html_element);
+init HTMLTableCellElement(struct dom_html_element
*html_table_cell_element::html_element);
+init HTMLTableRowElement(struct dom_html_element *html_table_row_element::html_element);
+init HTMLTableSectionElement(struct dom_html_element
*html_table_section_element::html_element);
+init HTMLTableColElement(struct dom_html_element *html_table_col_element::html_element);
+init HTMLTableCaptionElement(struct dom_html_element
*html_table_caption_element::html_element);
+init HTMLTableElement(struct dom_html_element *html_table_element::html_element);
+init HTMLAreaElement(struct dom_html_element *html_area_element::html_element);
+init HTMLMapElement(struct dom_html_element *html_map_element::html_element);
+init HTMLMediaElement(struct dom_html_element *html_media_element::html_element);
+init HTMLTrackElement(struct dom_html_element *html_track_element::html_element);
+init HTMLParamElement(struct dom_html_element *html_param_element::html_element);
+init HTMLObjectElement(struct dom_html_element *html_object_element::html_element);
+init HTMLEmbedElement(struct dom_html_element *html_embed_element::html_element);
+init HTMLIFrameElement(struct dom_html_element *html_i_frame_element::html_element);
+init HTMLImageElement(struct dom_html_element *html_image_element::html_element);
+init HTMLSourceElement(struct dom_html_element *html_source_element::html_element);
+init HTMLPictureElement(struct dom_html_element *html_picture_element::html_element);
+init HTMLModElement(struct dom_html_element *html_mod_element::html_element);
+init HTMLBRElement(struct dom_html_element *html_br_element::html_element);
+init HTMLSpanElement(struct dom_html_element *html_span_element::html_element);
+init HTMLTimeElement(struct dom_html_element *html_time_element::html_element);
+init HTMLDataElement(struct dom_html_element *html_data_element::html_element);
+init HTMLAnchorElement(struct dom_html_element *html_anchor_element::html_element);
+init HTMLDivElement(struct dom_html_element *html_div_element::html_element);
+init HTMLDListElement(struct dom_html_element *html_d_list_element::html_element);
+init HTMLLIElement(struct dom_html_element *html_li_element::html_element);
+init HTMLUListElement(struct dom_html_element *html_u_list_element::html_element);
+init HTMLOListElement(struct dom_html_element *html_o_list_element::html_element);
+init HTMLQuoteElement(struct dom_html_element *html_quote_element::html_element);
+init HTMLPreElement(struct dom_html_element *html_pre_element::html_element);
+init HTMLHRElement(struct dom_html_element *html_hr_element::html_element);
+init HTMLParagraphElement(struct dom_html_element
*html_paragraph_element::html_element);
+init HTMLHeadingElement(struct dom_html_element *html_heading_element::html_element);
+init HTMLBodyElement(struct dom_html_element *html_body_element::html_element);
+init HTMLStyleElement(struct dom_html_element *html_style_element::html_element);
+init HTMLMetaElement(struct dom_html_element *html_meta_element::html_element);
+init HTMLLinkElement(struct dom_html_element *html_link_element::html_element);
+init HTMLBaseElement(struct dom_html_element *html_base_element::html_element);
+init HTMLTitleElement(struct dom_html_element *html_title_element::html_element);
+init HTMLHeadElement(struct dom_html_element *html_head_element::html_element);
+init HTMLHtmlElement(struct dom_html_element *html_html_element::html_element);
/* specialisations of HTMLTableCellElement */
-init HTMLTableHeaderCellElement("struct dom_html_element *"
html_table_header_cell_element::html_table_cell_element);
-init HTMLTableDataCellElement("struct dom_html_element *"
html_table_data_cell_element::html_table_cell_element);
+init HTMLTableHeaderCellElement(struct dom_html_element
*html_table_header_cell_element::html_table_cell_element);
+init HTMLTableDataCellElement(struct dom_html_element
*html_table_data_cell_element::html_table_cell_element);
/* specialisations of html_media_element */
-init HTMLAudioElement("struct dom_html_element *"
html_audio_element::html_media_element);
-init HTMLVideoElement("struct dom_html_element *"
html_video_element::html_media_element);
+init HTMLAudioElement(struct dom_html_element *html_audio_element::html_media_element);
+init HTMLVideoElement(struct dom_html_element *html_video_element::html_media_element);
-init HTMLElement("struct dom_html_element *" html_element::element);
+init HTMLElement(struct dom_html_element *html_element::element);
-init Text("struct dom_node_text *" text::character_data);
-init Comment("struct dom_node_comment *" comment::character_data);
-init ProcessingInstruction("struct dom_node_text *" text::character_data);
+init Text(struct dom_node_text *text::character_data);
+init Comment(struct dom_node_comment *comment::character_data);
+init ProcessingInstruction(struct dom_node_text *text::character_data);
-init XMLDocument("struct dom_document *" document);
+init XMLDocument(struct dom_document * document);
-init Element("struct dom_element *" element::node);
-init CharacterData("struct dom_node_character_data *" character_data::node);
-init DocumentFragment("struct dom_document *" document::node);
-init DocumentType("struct dom_document *" document::node);
-init Document("struct dom_document *" document::node);
+init Element(struct dom_element *element::node);
+init CharacterData(struct dom_node_character_data *character_data::node);
+init DocumentFragment(struct dom_document *document::node);
+init DocumentType(struct dom_document *document::node);
+init Document(struct dom_document *document::node);
class Node {
- private "dom_node *" node;
-}
+ private dom_node *node;
+};
-init Node("struct dom_node *" node)
+init Node(struct dom_node *node)
%{
priv->node = node;
dom_node_ref(node);
--
NetSurf Generator for JavaScript bindings