summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile4
-rw-r--r--src/duk-libdom.c190
-rw-r--r--src/duk-libdom.h2
-rw-r--r--src/ir.c (renamed from src/interface-map.c)124
-rw-r--r--src/ir.h (renamed from src/interface-map.h)56
-rw-r--r--src/nsgenbind.c16
6 files changed, 201 insertions, 191 deletions
diff --git a/src/Makefile b/src/Makefile
index 8b034fe..9905baf 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,8 +1,8 @@
CFLAGS := $(CFLAGS) -I$(BUILDDIR) -Isrc/ -g -DYYENABLE_NLS=0
# Sources in this directory
-DIR_SOURCES := nsgenbind.c utils.c webidl-ast.c nsgenbind-ast.c \
- interface-map.c duk-libdom.c
+DIR_SOURCES := nsgenbind.c utils.c webidl-ast.c nsgenbind-ast.c ir.c \
+ duk-libdom.c
# jsapi-libdom.c jsapi-libdom-function.c jsapi-libdom-property.c jsapi-libdom-init.c jsapi-libdom-new.c jsapi-libdom-infmap.c jsapi-libdom-jsclass.c
SOURCES := $(SOURCES) $(BUILDDIR)/nsgenbind-parser.c $(BUILDDIR)/nsgenbind-lexer.c $(BUILDDIR)/webidl-parser.c $(BUILDDIR)/webidl-lexer.c
diff --git a/src/duk-libdom.c b/src/duk-libdom.c
index aad7bb6..046f741 100644
--- a/src/duk-libdom.c
+++ b/src/duk-libdom.c
@@ -19,7 +19,7 @@
#include "utils.h"
#include "nsgenbind-ast.h"
#include "webidl-ast.h"
-#include "interface-map.h"
+#include "ir.h"
#include "duk-libdom.h"
/** prefix for all generated functions */
@@ -293,7 +293,7 @@ static int output_tool_preface(FILE* outf)
* - if the previous character in the input name was uppercase and the current
* one is lowercase insert an underscore before the *previous* character.
*/
-static char *gen_class_name(struct interface_map_entry *interfacee)
+static char *gen_class_name(struct ir_interface_entry *interfacee)
{
const char *inc;
char *outc;
@@ -373,7 +373,7 @@ output_cdata(FILE* outf,
return res;
}
-static FILE *open_header(struct interface_map *interface_map, const char *name)
+static FILE *open_header(struct ir *ir, const char *name)
{
FILE *hdrf;
char *fname;
@@ -392,7 +392,7 @@ static FILE *open_header(struct interface_map *interface_map, const char *name)
/* binding preface */
output_cdata(hdrf,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_PREFACE);
/* tool preface */
@@ -405,7 +405,7 @@ static FILE *open_header(struct interface_map *interface_map, const char *name)
return hdrf;
}
-static int close_header(struct interface_map *interface_map,
+static int close_header(struct ir *ir,
FILE *hdrf,
const char *name)
{
@@ -420,7 +420,7 @@ static int close_header(struct interface_map *interface_map,
/* binding postface */
output_cdata(hdrf,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_POSTFACE);
genb_fclose_tmp(hdrf, fname);
@@ -434,7 +434,7 @@ static int close_header(struct interface_map *interface_map,
* generate the interface constructor
*/
static int
-output_interface_constructor(FILE* outf, struct interface_map_entry *interfacee)
+output_interface_constructor(FILE* outf, struct ir_interface_entry *interfacee)
{
int init_argc;
@@ -470,7 +470,7 @@ output_interface_constructor(FILE* outf, struct interface_map_entry *interfacee)
* generate the interface destructor
*/
static int
-output_interface_destructor(FILE* outf, struct interface_map_entry *interfacee)
+output_interface_destructor(FILE* outf, struct ir_interface_entry *interfacee)
{
/* destructor definition */
fprintf(outf,
@@ -498,8 +498,8 @@ output_interface_destructor(FILE* outf, struct interface_map_entry *interfacee)
*/
static int
output_interface_inherit_init(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_entry *inherite)
+ struct ir_interface_entry *interfacee,
+ struct ir_interface_entry *inherite)
{
struct genbind_node *init_node;
struct genbind_node *inh_init_node;
@@ -593,7 +593,7 @@ output_interface_inherit_init(FILE* outf,
static int
output_interface_init_declaration(FILE* outf,
- struct interface_map_entry *interfacee,
+ struct ir_interface_entry *interfacee,
struct genbind_node *init_node)
{
struct genbind_node *param_node;
@@ -627,8 +627,8 @@ output_interface_init_declaration(FILE* outf,
static int
output_interface_init(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_entry *inherite)
+ struct ir_interface_entry *interfacee,
+ struct ir_interface_entry *inherite)
{
struct genbind_node *init_node;
int res;
@@ -666,8 +666,8 @@ output_interface_init(FILE* outf,
static int
output_interface_fini(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_entry *inherite)
+ struct ir_interface_entry *interfacee,
+ struct ir_interface_entry *inherite)
{
struct genbind_node *fini_node;
@@ -708,8 +708,8 @@ output_interface_fini(FILE* outf,
*/
static int
output_prototype_method(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_operation_entry *operatione)
+ struct ir_interface_entry *interfacee,
+ struct ir_operation_entry *operatione)
{
if (operatione->name != NULL) {
@@ -730,7 +730,7 @@ output_prototype_method(FILE* outf,
* generate prototype method definitions
*/
static int
-output_prototype_methods(FILE *outf, struct interface_map_entry *interfacee)
+output_prototype_methods(FILE *outf, struct ir_interface_entry *interfacee)
{
int opc;
int res = 0;
@@ -750,8 +750,8 @@ output_prototype_methods(FILE *outf, struct interface_map_entry *interfacee)
static int
output_prototype_attribute(FILE *outf,
- struct interface_map_entry *interfacee,
- struct interface_map_attribute_entry *attributee)
+ struct ir_interface_entry *interfacee,
+ struct ir_attribute_entry *attributee)
{
if (attributee->modifier == WEBIDL_TYPE_MODIFIER_READONLY) {
return output_populate_ro_property(outf,
@@ -767,7 +767,7 @@ output_prototype_attribute(FILE *outf,
* generate prototype attribute definitions
*/
static int
-output_prototype_attributes(FILE *outf, struct interface_map_entry *interfacee)
+output_prototype_attributes(FILE *outf, struct ir_interface_entry *interfacee)
{
int attrc;
int res = 0;
@@ -791,7 +791,7 @@ output_prototype_attributes(FILE *outf, struct interface_map_entry *interfacee)
*/
static int
output_prototype_constant(FILE *outf,
- struct interface_map_constant_entry *constante)
+ struct ir_constant_entry *constante)
{
int *value;
@@ -810,7 +810,7 @@ output_prototype_constant(FILE *outf,
* generate prototype constant definitions
*/
static int
-output_prototype_constants(FILE *outf, struct interface_map_entry *interfacee)
+output_prototype_constants(FILE *outf, struct ir_interface_entry *interfacee)
{
int attrc;
int res = 0;
@@ -831,9 +831,9 @@ output_prototype_constants(FILE *outf, struct interface_map_entry *interfacee)
*/
static int
output_interface_prototype(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_entry *inherite,
- struct interface_map *interface_map)
+ struct ir_interface_entry *interfacee,
+ struct ir_interface_entry *inherite,
+ struct ir *ir)
{
struct genbind_node *proto_node;
@@ -874,10 +874,10 @@ output_interface_prototype(FILE* outf,
*/
if (interfacee->primary_global) {
fprintf(outf, "\t/* Create interface objects */\n");
- for (int idx = 0; idx < interface_map->entryc; idx++) {
- struct interface_map_entry *interfacep;
+ for (int idx = 0; idx < ir->interfacec; idx++) {
+ struct ir_interface_entry *interfacep;
- interfacep = interface_map->entries + idx;
+ interfacep = ir->interfaces + idx;
if (interfacep->noobject) continue;
if (interfacep == interfacee)
fprintf(outf, "\tduk_dup(ctx, 0);\n");
@@ -910,8 +910,8 @@ output_interface_prototype(FILE* outf,
*/
static int
output_interface_elipsis_operation(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_operation_entry *operatione)
+ struct ir_interface_entry *interfacee,
+ struct ir_operation_entry *operatione)
{
int cdatac; /* cdata blocks output */
@@ -953,8 +953,8 @@ output_interface_elipsis_operation(FILE* outf,
*/
static int
output_interface_overloaded_operation(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_operation_entry *operatione)
+ struct ir_interface_entry *interfacee,
+ struct ir_operation_entry *operatione)
{
int cdatac; /* cdata blocks output */
@@ -992,8 +992,8 @@ output_interface_overloaded_operation(FILE* outf,
*/
static int
output_interface_special_operation(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_operation_entry *operatione)
+ struct ir_interface_entry *interfacee,
+ struct ir_operation_entry *operatione)
{
/* special method definition */
fprintf(outf, "/* Special method definition - UNIMPLEMENTED */\n\n");
@@ -1011,12 +1011,12 @@ output_interface_special_operation(FILE* outf,
*/
static int
output_operation_optional_defaults(FILE* outf,
- struct interface_map_operation_argument_entry *argumentv,
+ struct ir_operation_argument_entry *argumentv,
int argumentc)
{
int argc;
for (argc = 0; argc < argumentc; argc++) {
- struct interface_map_operation_argument_entry *cure;
+ struct ir_operation_argument_entry *cure;
struct webidl_node *lit_node; /* literal node */
enum webidl_node_type lit_type;
int *lit_int;
@@ -1077,12 +1077,12 @@ output_operation_optional_defaults(FILE* outf,
static int
output_operation_argument_type_check(
FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_operation_entry *operatione,
- struct interface_map_operation_overload_entry *overloade,
+ struct ir_interface_entry *interfacee,
+ struct ir_operation_entry *operatione,
+ struct ir_operation_overload_entry *overloade,
int argidx)
{
- struct interface_map_operation_argument_entry *argumente;
+ struct ir_operation_argument_entry *argumente;
struct webidl_node *type_node;
enum webidl_type *argument_type;
@@ -1168,11 +1168,11 @@ output_operation_argument_type_check(
*/
static int
output_interface_operation(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_operation_entry *operatione)
+ struct ir_interface_entry *interfacee,
+ struct ir_operation_entry *operatione)
{
int cdatac; /* cdata blocks output */
- struct interface_map_operation_overload_entry *overloade;
+ struct ir_operation_overload_entry *overloade;
int fixedargc; /* number of non optional arguments */
int argidx; /* loop counter for arguments */
int optargc; /* loop counter for optional arguments */
@@ -1287,7 +1287,7 @@ output_interface_operation(FILE* outf,
* generate class methods for each interface operation
*/
static int
-output_interface_operations(FILE* outf, struct interface_map_entry *interfacee)
+output_interface_operations(FILE* outf, struct ir_interface_entry *interfacee)
{
int opc;
int res = 0;
@@ -1309,8 +1309,8 @@ output_interface_operations(FILE* outf, struct interface_map_entry *interfacee)
*/
static int
output_interface_attribute(FILE* outf,
- struct interface_map_entry *interfacee,
- struct interface_map_attribute_entry *atributee)
+ struct ir_interface_entry *interfacee,
+ struct ir_attribute_entry *atributee)
{
int cdatac;
@@ -1370,7 +1370,7 @@ output_interface_attribute(FILE* outf,
*/
static int
output_interface_attributes(FILE* outf,
- struct interface_map_entry *interfacee)
+ struct ir_interface_entry *interfacee)
{
int attrc;
@@ -1409,12 +1409,12 @@ static int output_tool_prologue(FILE* outf)
/**
* generate a source file to implement an interface using duk and libdom.
*/
-static int output_interface(struct interface_map *interface_map,
- struct interface_map_entry *interfacee)
+static int output_interface(struct ir *ir,
+ struct ir_interface_entry *interfacee)
{
FILE *ifacef;
int ifacenamelen;
- struct interface_map_entry *inherite;
+ struct ir_interface_entry *inherite;
int res = 0;
/* do not generate class for interfaces marked no output */
@@ -1438,14 +1438,14 @@ static int output_interface(struct interface_map *interface_map,
}
/* find parent interface entry */
- inherite = interface_map_inherit_entry(interface_map, interfacee);
+ inherite = ir_inherit_entry(ir, interfacee);
/* tool preface */
output_tool_preface(ifacef);
/* binding preface */
output_cdata(ifacef,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_PREFACE);
/* class preface */
@@ -1456,7 +1456,7 @@ static int output_interface(struct interface_map *interface_map,
/* binding prologue */
output_cdata(ifacef,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_PROLOGUE);
/* class prologue */
@@ -1486,7 +1486,7 @@ static int output_interface(struct interface_map *interface_map,
output_interface_attributes(ifacef, interfacee);
/* prototype */
- output_interface_prototype(ifacef, interfacee, inherite, interface_map);
+ output_interface_prototype(ifacef, interfacee, inherite, ir);
fprintf(ifacef, "\n");
@@ -1495,7 +1495,7 @@ static int output_interface(struct interface_map *interface_map,
/* binding epilogue */
output_cdata(ifacef,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_EPILOGUE);
/* class postface */
@@ -1503,7 +1503,7 @@ static int output_interface(struct interface_map *interface_map,
/* binding postface */
output_cdata(ifacef,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_POSTFACE);
op_error:
@@ -1516,20 +1516,20 @@ op_error:
* generate private header
*/
static int
-output_private_header(struct interface_map *interface_map)
+output_private_header(struct ir *ir)
{
int idx;
FILE *privf;
/* open header */
- privf = open_header(interface_map, "private");
+ privf = open_header(ir, "private");
- for (idx = 0; idx < interface_map->entryc; idx++) {
- struct interface_map_entry *interfacee;
- struct interface_map_entry *inherite;
+ for (idx = 0; idx < ir->interfacec; idx++) {
+ struct ir_interface_entry *interfacee;
+ struct ir_interface_entry *inherite;
struct genbind_node *priv_node;
- interfacee = interface_map->entries + idx;
+ interfacee = ir->interfaces + idx;
/* do not generate private structs for interfaces marked no
* output
@@ -1539,7 +1539,7 @@ output_private_header(struct interface_map *interface_map)
}
/* find parent interface entry */
- inherite = interface_map_inherit_entry(interface_map,
+ inherite = ir_inherit_entry(ir,
interfacee);
fprintf(privf, "typedef struct {\n");
@@ -1585,7 +1585,7 @@ output_private_header(struct interface_map *interface_map)
}
- close_header(interface_map, privf, "private");
+ close_header(ir, privf, "private");
return 0;
}
@@ -1594,19 +1594,19 @@ output_private_header(struct interface_map *interface_map)
* generate prototype header
*/
static int
-output_prototype_header(struct interface_map *interface_map)
+output_prototype_header(struct ir *ir)
{
int idx;
FILE *protof;
/* open header */
- protof = open_header(interface_map, "prototype");
+ protof = open_header(ir, "prototype");
- for (idx = 0; idx < interface_map->entryc; idx++) {
- struct interface_map_entry *interfacee;
+ for (idx = 0; idx < ir->interfacec; idx++) {
+ struct ir_interface_entry *interfacee;
struct genbind_node *init_node;
- interfacee = interface_map->entries + idx;
+ interfacee = ir->interfaces + idx;
/* do not generate prototype declarations for interfaces marked
* no output
@@ -1641,7 +1641,7 @@ output_prototype_header(struct interface_map *interface_map)
fprintf(protof, ";\n\n");
}
- close_header(interface_map, protof, "prototype");
+ close_header(ir, protof, "prototype");
return 0;
}
@@ -1650,7 +1650,7 @@ output_prototype_header(struct interface_map *interface_map)
* generate makefile fragment
*/
static int
-output_makefile(struct interface_map *interface_map)
+output_makefile(struct ir *ir)
{
int idx;
FILE *makef;
@@ -1664,10 +1664,10 @@ output_makefile(struct interface_map *interface_map)
fprintf(makef, "# duk libdom makefile fragment\n\n");
fprintf(makef, "NSGENBIND_SOURCES:=binding.c ");
- for (idx = 0; idx < interface_map->entryc; idx++) {
- struct interface_map_entry *interfacee;
+ for (idx = 0; idx < ir->interfacec; idx++) {
+ struct ir_interface_entry *interfacee;
- interfacee = interface_map->entries + idx;
+ interfacee = ir->interfaces + idx;
/* no source for interfaces marked no output */
if (interfacee->noobject) {
@@ -1695,12 +1695,12 @@ output_makefile(struct interface_map *interface_map)
* the primary global (if any) generated last.
*/
static int
-output_binding_header(struct interface_map *interface_map)
+output_binding_header(struct ir *ir)
{
FILE *bindf;
/* open header */
- bindf = open_header(interface_map, "binding");
+ bindf = open_header(ir, "binding");
fprintf(bindf,
"#define _MAGIC(S) (\"%s\" S)\n"
@@ -1735,7 +1735,7 @@ output_binding_header(struct interface_map *interface_map)
fprintf(bindf,
"duk_ret_t %s_create_prototypes(duk_context *ctx);\n", DLPFX);
- close_header(interface_map, bindf, "binding");
+ close_header(ir, bindf, "binding");
return 0;
}
@@ -1748,11 +1748,11 @@ output_binding_header(struct interface_map *interface_map)
* implementations.
*/
static int
-output_binding_src(struct interface_map *interface_map)
+output_binding_src(struct ir *ir)
{
int idx;
FILE *bindf;
- struct interface_map_entry *pglobale = NULL;
+ struct ir_interface_entry *pglobale = NULL;
char *proto_name;
/* open output file */
@@ -1766,14 +1766,14 @@ output_binding_src(struct interface_map *interface_map)
/* binding preface */
output_cdata(bindf,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_PREFACE);
output_tool_prologue(bindf);
/* binding prologue */
output_cdata(bindf,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_PROLOGUE);
@@ -1893,10 +1893,10 @@ output_binding_src(struct interface_map *interface_map)
fprintf(bindf, "{\n");
- for (idx = 0; idx < interface_map->entryc; idx++) {
- struct interface_map_entry *interfacee;
+ for (idx = 0; idx < ir->interfacec; idx++) {
+ struct ir_interface_entry *interfacee;
- interfacee = interface_map->entries + idx;
+ interfacee = ir->interfaces + idx;
/* do not generate prototype calls for interfaces marked
* no output
@@ -1943,7 +1943,7 @@ output_binding_src(struct interface_map *interface_map)
/* binding postface */
output_cdata(bindf,
- interface_map->binding_node,
+ ir->binding_node,
GENBIND_NODE_TYPE_POSTFACE);
genb_fclose_tmp(bindf, "binding.c");
@@ -1951,46 +1951,46 @@ output_binding_src(struct interface_map *interface_map)
return 0;
}
-int duk_libdom_output(struct interface_map *interface_map)
+int duk_libdom_output(struct ir *ir)
{
int idx;
int res = 0;
/* generate interfaces */
- for (idx = 0; idx < interface_map->entryc; idx++) {
- res = output_interface(interface_map,
- interface_map->entries + idx);
+ for (idx = 0; idx < ir->interfacec; idx++) {
+ res = output_interface(ir,
+ ir->interfaces + idx);
if (res != 0) {
goto output_err;
}
}
/* generate private header */
- res = output_private_header(interface_map);
+ res = output_private_header(ir);
if (res != 0) {
goto output_err;
}
/* generate prototype header */
- res = output_prototype_header(interface_map);
+ res = output_prototype_header(ir);
if (res != 0) {
goto output_err;
}
/* generate binding header */
- res = output_binding_header(interface_map);
+ res = output_binding_header(ir);
if (res != 0) {
goto output_err;
}
/* generate binding source */
- res = output_binding_src(interface_map);
+ res = output_binding_src(ir);
if (res != 0) {
goto output_err;
}
/* generate makefile fragment */
- res = output_makefile(interface_map);
+ res = output_makefile(ir);
output_err:
diff --git a/src/duk-libdom.h b/src/duk-libdom.h
index e1dd2c4..2ecd482 100644
--- a/src/duk-libdom.h
+++ b/src/duk-libdom.h
@@ -9,6 +9,6 @@
#ifndef nsgenbind_duk_libdom_h
#define nsgenbind_duk_libdom_h
-int duk_libdom_output(struct interface_map *interface_map);
+int duk_libdom_output(struct ir *ir);
#endif
diff --git a/src/interface-map.c b/src/ir.c
index 822892f..ab2add7 100644
--- a/src/interface-map.c
+++ b/src/ir.c
@@ -1,4 +1,4 @@
-/* interface mapping
+/* intermediate representation of WebIDL and binding data
*
* This file is part of nsgenbind.
* Published under the MIT License,
@@ -17,7 +17,7 @@
#include "utils.h"
#include "nsgenbind-ast.h"
#include "webidl-ast.h"
-#include "interface-map.h"
+#include "ir.h"
/** count the number of nodes of a given type on an interface */
static int
@@ -49,7 +49,7 @@ enumerate_interface_type(struct webidl_node *interface_node,
* binding also maintain refcounts
*/
static void
-compute_inherit_refcount(struct interface_map_entry *entries, int entryc)
+compute_inherit_refcount(struct ir_interface_entry *entries, int entryc)
{
int idx;
int inf;
@@ -81,14 +81,14 @@ compute_inherit_refcount(struct interface_map_entry *entries, int entryc)
* reduce refcount on inherit index if !=-1
* remove entry from source map
*/
-static struct interface_map_entry *
-interface_topoligical_sort(struct interface_map_entry *srcinf, int infc)
+static struct ir_interface_entry *
+interface_topoligical_sort(struct ir_interface_entry *srcinf, int infc)
{
- struct interface_map_entry *dstinf;
+ struct ir_interface_entry *dstinf;
int idx;
int inf;
- dstinf = calloc(infc, sizeof(struct interface_map_entry));
+ dstinf = calloc(infc, sizeof(struct ir_interface_entry));
if (dstinf == NULL) {
return NULL;
}
@@ -132,12 +132,12 @@ interface_topoligical_sort(struct interface_map_entry *srcinf, int infc)
return dstinf;
}
-static struct interface_map_operation_entry *
-find_operation_name(struct interface_map_operation_entry *operationv,
+static struct ir_operation_entry *
+find_operation_name(struct ir_operation_entry *operationv,
int operationc,
const char *name)
{
- struct interface_map_operation_entry *cure;
+ struct ir_operation_entry *cure;
int opc;
for (opc = 0; opc < operationc; opc++) {
@@ -161,12 +161,12 @@ find_operation_name(struct interface_map_operation_entry *operationv,
static int
argument_map_new(struct webidl_node *arg_list_node,
int *argumentc_out,
- struct interface_map_operation_argument_entry **argumentv_out)
+ struct ir_operation_argument_entry **argumentv_out)
{
int argumentc;
struct webidl_node *argument;
- struct interface_map_operation_argument_entry *argumentv;
- struct interface_map_operation_argument_entry *cure;
+ struct ir_operation_argument_entry *argumentv;
+ struct ir_operation_argument_entry *cure;
argumentc = webidl_node_enumerate_type(
webidl_node_getnode(arg_list_node),
@@ -228,11 +228,11 @@ argument_map_new(struct webidl_node *arg_list_node,
static int
overload_map_new(struct webidl_node *op_node,
int *overloadc_out,
- struct interface_map_operation_overload_entry **overloadv_out)
+ struct ir_operation_overload_entry **overloadv_out)
{
int overloadc = *overloadc_out;
- struct interface_map_operation_overload_entry *overloadv;
- struct interface_map_operation_overload_entry *cure;
+ struct ir_operation_overload_entry *overloadv;
+ struct ir_operation_overload_entry *cure;
struct webidl_node *arg_list_node;
int argc;
@@ -264,7 +264,7 @@ overload_map_new(struct webidl_node *op_node,
}
for (argc = 0; argc < cure->argumentc; argc++) {
- struct interface_map_operation_argument_entry *arge;
+ struct ir_operation_argument_entry *arge;
arge = cure->argumentv + argc;
cure->optionalc += arge->optionalc;
cure->elipsisc += arge->elipsisc;
@@ -281,12 +281,12 @@ static int
operation_map_new(struct webidl_node *interface,
struct genbind_node *class,
int *operationc_out,
- struct interface_map_operation_entry **operationv_out)
+ struct ir_operation_entry **operationv_out)
{
struct webidl_node *list_node;
struct webidl_node *op_node; /* attribute node */
- struct interface_map_operation_entry *cure; /* current entry */
- struct interface_map_operation_entry *operationv;
+ struct ir_operation_entry *cure; /* current entry */
+ struct ir_operation_entry *operationv;
int operationc;
/* enumerate operationss including overloaded members */
@@ -301,7 +301,7 @@ operation_map_new(struct webidl_node *interface,
}
operationv = calloc(operationc,
- sizeof(struct interface_map_operation_entry));
+ sizeof(struct ir_operation_entry));
if (operationv == NULL) {
return -1;
};
@@ -322,7 +322,7 @@ operation_map_new(struct webidl_node *interface,
while (op_node != NULL) {
const char *operation_name;
- struct interface_map_operation_entry *finde;
+ struct ir_operation_entry *finde;
/* get operation name */
operation_name = webidl_node_gettext(
@@ -388,12 +388,12 @@ static int
attribute_map_new(struct webidl_node *interface,
struct genbind_node *class,
int *attributec_out,
- struct interface_map_attribute_entry **attributev_out)
+ struct ir_attribute_entry **attributev_out)
{
struct webidl_node *list_node;
struct webidl_node *at_node; /* attribute node */
- struct interface_map_attribute_entry *cure; /* current entry */
- struct interface_map_attribute_entry *attributev;
+ struct ir_attribute_entry *cure; /* current entry */
+ struct ir_attribute_entry *attributev;
int attributec;
/* enumerate attributes */
@@ -407,7 +407,7 @@ attribute_map_new(struct webidl_node *interface,
}
attributev = calloc(attributec,
- sizeof(struct interface_map_attribute_entry));
+ sizeof(struct ir_attribute_entry));
if (attributev == NULL) {
return -1;
};
@@ -484,12 +484,12 @@ attribute_map_new(struct webidl_node *interface,
static int
constant_map_new(struct webidl_node *interface,
int *constantc_out,
- struct interface_map_constant_entry **constantv_out)
+ struct ir_constant_entry **constantv_out)
{
struct webidl_node *list_node;
struct webidl_node *constant_node; /* constant node */
- struct interface_map_constant_entry *cure; /* current entry */
- struct interface_map_constant_entry *constantv;
+ struct ir_constant_entry *cure; /* current entry */
+ struct ir_constant_entry *constantv;
int constantc;
/* enumerate constants */
@@ -505,7 +505,7 @@ constant_map_new(struct webidl_node *interface,
*constantc_out = constantc;
constantv = calloc(constantc,
- sizeof(struct interface_map_constant_entry));
+ sizeof(struct ir_constant_entry));
if (constantv == NULL) {
return -1;
};
@@ -553,16 +553,16 @@ constant_map_new(struct webidl_node *interface,
return 0;
}
-int interface_map_new(struct genbind_node *genbind,
+int ir_new(struct genbind_node *genbind,
struct webidl_node *webidl,
- struct interface_map **map_out)
+ struct ir **map_out)
{
int interfacec;
- struct interface_map_entry *entries;
- struct interface_map_entry *sorted_entries;
- struct interface_map_entry *ecur;
+ struct ir_interface_entry *entries;
+ struct ir_interface_entry *sorted_entries;
+ struct ir_interface_entry *ecur;
struct webidl_node *node;
- struct interface_map *map;
+ struct ir *map;
interfacec = webidl_node_enumerate_type(webidl,
WEBIDL_NODE_TYPE_INTERFACE);
@@ -571,7 +571,7 @@ int interface_map_new(struct genbind_node *genbind,
printf("Mapping %d interfaces\n", interfacec);
}
- entries = calloc(interfacec, sizeof(struct interface_map_entry));
+ entries = calloc(interfacec, sizeof(struct ir_interface_entry));
if (entries == NULL) {
return -1;
}
@@ -662,9 +662,9 @@ int interface_map_new(struct genbind_node *genbind,
/* compute inheritance and refcounts on sorted map */
compute_inherit_refcount(sorted_entries, interfacec);
- map = malloc(sizeof(struct interface_map));
- map->entryc = interfacec;
- map->entries = sorted_entries;
+ map = malloc(sizeof(struct ir));
+ map->interfacec = interfacec;
+ map->interfaces = sorted_entries;
map->webidl = webidl;
map->binding_node = genbind_node_find_type(genbind, NULL,
GENBIND_NODE_TYPE_BINDING);
@@ -674,11 +674,11 @@ int interface_map_new(struct genbind_node *genbind,
return 0;
}
-int interface_map_dump(struct interface_map *index)
+int ir_dump(struct ir *index)
{
FILE *dumpf;
int eidx;
- struct interface_map_entry *ecur;
+ struct ir_interface_entry *ecur;
/* only dump AST to file if required */
if (!options->debug) {
@@ -690,8 +690,8 @@ int interface_map_dump(struct interface_map *index)
return 2;
}
- ecur = index->entries;
- for (eidx = 0; eidx < index->entryc; eidx++) {
+ ecur = index->interfaces;
+ for (eidx = 0; eidx < index->interfacec; eidx++) {
fprintf(dumpf, "%d %s\n", eidx, ecur->name);
if (ecur->inherit_name != NULL) {
fprintf(dumpf, "\tinherit:%s\n", ecur->inherit_name);
@@ -708,7 +708,7 @@ int interface_map_dump(struct interface_map *index)
for (opc = 0; opc < ecur->operationc; opc++) {
int ovlc;
- struct interface_map_operation_entry *ope;
+ struct ir_operation_entry *ope;
ope = ecur->operationv + opc;
@@ -720,7 +720,7 @@ int interface_map_dump(struct interface_map *index)
ope->method);
for(ovlc = 0; ovlc < ope->overloadc;ovlc++) {
int argc;
- struct interface_map_operation_overload_entry *ovle;
+ struct ir_operation_overload_entry *ovle;
ovle = ope->overloadv + ovlc;
fprintf(dumpf,
@@ -743,7 +743,7 @@ int interface_map_dump(struct interface_map *index)
ovle->elipsisc);
for (argc = 0; argc < ovle->argumentc; argc++) {
- struct interface_map_operation_argument_entry *arge;
+ struct ir_operation_argument_entry *arge;
arge = ovle->argumentv + argc;
fprintf(dumpf,
@@ -769,7 +769,7 @@ int interface_map_dump(struct interface_map *index)
if (ecur->attributec > 0) {
int attrc = ecur->attributec;
- struct interface_map_attribute_entry *attre;
+ struct ir_attribute_entry *attre;
fprintf(dumpf, "\t%d attributes\n", attrc);
@@ -797,7 +797,7 @@ int interface_map_dump(struct interface_map *index)
ecur->constantc);
for (idx = 0; idx < ecur->constantc; idx++) {
- struct interface_map_constant_entry *cone;
+ struct ir_constant_entry *cone;
cone = ecur->constantv + idx;
fprintf(dumpf, "\t\t%s\n",
cone->name);
@@ -811,11 +811,11 @@ int interface_map_dump(struct interface_map *index)
return 0;
}
-int interface_map_dumpdot(struct interface_map *index)
+int ir_dumpdot(struct ir *index)
{
FILE *dumpf;
int eidx;
- struct interface_map_entry *ecur;
+ struct ir_interface_entry *ecur;
/* only dump AST to file if required */
if (!options->debug) {
@@ -831,8 +831,8 @@ int interface_map_dumpdot(struct interface_map *index)
fprintf(dumpf, "node [shape=box]\n");
- ecur = index->entries;
- for (eidx = 0; eidx < index->entryc; eidx++) {
+ ecur = index->interfaces;
+ for (eidx = 0; eidx < index->interfacec; eidx++) {
fprintf(dumpf, "%04d [label=\"%s\"", eidx, ecur->name);
if (ecur->noobject == true) {
/* noobject interfaces in red */
@@ -845,11 +845,11 @@ int interface_map_dumpdot(struct interface_map *index)
ecur++;
}
- ecur = index->entries;
- for (eidx = 0; eidx < index->entryc; eidx++) {
- if (index->entries[eidx].inherit_idx != -1) {
+ ecur = index->interfaces;
+ for (eidx = 0; eidx < index->interfacec; eidx++) {
+ if (index->interfaces[eidx].inherit_idx != -1) {
fprintf(dumpf, "%04d -> %04d;\n",
- eidx, index->entries[eidx].inherit_idx);
+ eidx, index->interfaces[eidx].inherit_idx);
}
}
@@ -860,15 +860,15 @@ int interface_map_dumpdot(struct interface_map *index)
return 0;
}
-struct interface_map_entry *
-interface_map_inherit_entry(struct interface_map *map,
- struct interface_map_entry *entry)
+struct ir_interface_entry *
+ir_inherit_entry(struct ir *map,
+ struct ir_interface_entry *entry)
{
- struct interface_map_entry *res = NULL;
+ struct ir_interface_entry *res = NULL;
if ((entry != NULL) &&
(entry->inherit_idx != -1)) {
- res = &map->entries[entry->inherit_idx];
+ res = &map->interfaces[entry->inherit_idx];
}
return res;
}
diff --git a/src/interface-map.h b/src/ir.h
index 079ed96..4d0365e 100644
--- a/src/interface-map.h
+++ b/src/ir.h
@@ -1,4 +1,4 @@
-/* Interface mapping
+/* intermediate representation of WebIDL and binding data
*
* This file is part of nsgenbind.
* Licensed under the MIT License,
@@ -6,8 +6,8 @@
* Copyright 2012 Vincent Sanders <vince@netsurf-browser.org>
*/
-#ifndef nsgenbind_interface_map_h
-#define nsgenbind_interface_map_h
+#ifndef nsgenbind_ir_h
+#define nsgenbind_ir_h
struct genbind_node;
struct webidl_node;
@@ -15,7 +15,7 @@ struct webidl_node;
/**
* map entry for each argument of an overload on an operation
*/
-struct interface_map_operation_argument_entry {
+struct ir_operation_argument_entry {
const char *name;
int optionalc; /**< 1 if the argument is optional */
@@ -25,28 +25,28 @@ struct interface_map_operation_argument_entry {
};
/** map entry for each overload of an operation */
-struct interface_map_operation_overload_entry {
+struct ir_operation_overload_entry {
struct webidl_node *type; /**< The return type of this overload */
int optionalc; /**< Number of parameters that are optional */
int elipsisc; /**< Number of elipsis parameters */
int argumentc; /**< the number of parameters */
- struct interface_map_operation_argument_entry *argumentv;
+ struct ir_operation_argument_entry *argumentv;
};
/** map entry for operations on an interface */
-struct interface_map_operation_entry {
+struct ir_operation_entry {
const char *name; /** operation name */
struct webidl_node *node; /**< AST operation node */
struct genbind_node *method; /**< method from binding */
int overloadc; /**< Number of overloads of this operation */
- struct interface_map_operation_overload_entry *overloadv;
+ struct ir_operation_overload_entry *overloadv;
};
/** map entry for attributes on an interface */
-struct interface_map_attribute_entry {
+struct ir_attribute_entry {
const char *name; /** attribute name */
struct webidl_node *node; /**< AST attribute node */
enum webidl_type_modifier modifier;
@@ -55,13 +55,13 @@ struct interface_map_attribute_entry {
};
/** map entry for constants on an interface */
-struct interface_map_constant_entry {
+struct ir_constant_entry {
const char *name; /** attribute name */
struct webidl_node *node; /**< AST constant node */
};
/** map entry for an interface */
-struct interface_map_entry {
+struct ir_interface_entry {
const char *name; /** interface name */
struct webidl_node *node; /**< AST interface node */
const char *inherit_name; /**< Name of interface inhertited from */
@@ -80,13 +80,13 @@ struct interface_map_entry {
*/
int operationc; /**< number of operations on interface */
- struct interface_map_operation_entry *operationv;
+ struct ir_operation_entry *operationv;
int attributec; /**< number of attributes on interface */
- struct interface_map_attribute_entry *attributev;
+ struct ir_attribute_entry *attributev;
int constantc; /**< number of constants on interface */
- struct interface_map_constant_entry *constantv;
+ struct ir_constant_entry *constantv;
struct genbind_node *class; /**< class from binding (if any) */
@@ -108,10 +108,20 @@ struct interface_map_entry {
*/
};
-/** WebIDL interface map */
-struct interface_map {
- int entryc; /**< count of interfaces */
- struct interface_map_entry *entries; /**< interface entries */
+/** map entry for a dictionary */
+struct ir_dictionary_entry {
+ const char *name; /** dictionary name */
+ struct webidl_node *node; /**< AST dictionary node */
+ const char *inherit_name; /**< Name of interface inhertited from */
+};
+
+/** intermediate representation of WebIDL and binding data */
+struct ir {
+ int interfacec; /**< count of interfaces */
+ struct ir_interface_entry *interfaces; /**< interface entries */
+
+ int dictionaryc; /**< count of dictionaries */
+ struct ir_dictionary_entry *dictionaries; /**< dictionary entries */
/** The AST node of the binding information */
struct genbind_node *binding_node;
@@ -123,19 +133,19 @@ struct interface_map {
/**
* Create a new interface map
*/
-int interface_map_new(struct genbind_node *genbind,
+int ir_new(struct genbind_node *genbind,
struct webidl_node *webidl,
- struct interface_map **map_out);
+ struct ir **map_out);
-int interface_map_dump(struct interface_map *map);
+int ir_dump(struct ir *map);
-int interface_map_dumpdot(struct interface_map *map);
+int ir_dumpdot(struct ir *map);
/**
* interface map parent entry
*
* \return inherit entry or NULL if there is not one
*/
-struct interface_map_entry *interface_map_inherit_entry(struct interface_map *map, struct interface_map_entry *entry);
+struct ir_interface_entry *ir_inherit_entry(struct ir *map, struct ir_interface_entry *entry);
#endif
diff --git a/src/nsgenbind.c b/src/nsgenbind.c
index 9558b95..135c5c0 100644
--- a/src/nsgenbind.c
+++ b/src/nsgenbind.c
@@ -17,7 +17,7 @@
#include "options.h"
#include "nsgenbind-ast.h"
#include "webidl-ast.h"
-#include "interface-map.h"
+#include "ir.h"
#include "jsapi-libdom.h"
#include "duk-libdom.h"
@@ -192,7 +192,7 @@ int main(int argc, char **argv)
int res;
struct genbind_node *genbind_root = NULL;
struct webidl_node *webidl_root = NULL;
- struct interface_map *interface_map = NULL;
+ struct ir *ir = NULL;
enum bindingtype_e bindingtype;
options = process_cmdline(argc, argv);
@@ -225,20 +225,20 @@ int main(int argc, char **argv)
/* debug dump of web idl AST */
webidl_dump_ast(webidl_root);
- /* generate map of WebIDL interfaces sorted by inheritance */
- res = interface_map_new(genbind_root, webidl_root, &interface_map);
+ /* generate intermediate representation */
+ res = ir_new(genbind_root, webidl_root, &ir);
if (res != 0) {
return 5;
}
- /* dump the interface mapping */
- interface_map_dump(interface_map);
- interface_map_dumpdot(interface_map);
+ /* dump the intermediate representation */
+ ir_dump(ir);
+ ir_dumpdot(ir);
/* generate binding */
switch (bindingtype) {
case BINDINGTYPE_DUK_LIBDOM:
- res = duk_libdom_output(interface_map);
+ res = duk_libdom_output(ir);
break;
default: