summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2015-08-17 19:12:51 +0200
committerVincent Sanders <vince@kyllikki.org>2015-08-17 19:12:51 +0200
commite8d19a2821bfd15bcbe8d17f6564439c1673cbf7 (patch)
tree4ee0523aabdf146967a12761c5050bd74bba917c /src
parent40cd6a199d8a5f92f71c5638f4da021a779e7a5c (diff)
downloadnsgenbind-e8d19a2821bfd15bcbe8d17f6564439c1673cbf7.tar.gz
nsgenbind-e8d19a2821bfd15bcbe8d17f6564439c1673cbf7.tar.bz2
rename interface map to be intermediate representation
The interface map is now completely inapropriately named and is in fact now an intermediate representation of the webidl and bindings kept in a sorted order.
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: