diff options
author | Vincent Sanders <vince@kyllikki.org> | 2015-08-17 19:12:51 +0200 |
---|---|---|
committer | Vincent Sanders <vince@kyllikki.org> | 2015-08-17 19:12:51 +0200 |
commit | e8d19a2821bfd15bcbe8d17f6564439c1673cbf7 (patch) | |
tree | 4ee0523aabdf146967a12761c5050bd74bba917c | |
parent | 40cd6a199d8a5f92f71c5638f4da021a779e7a5c (diff) | |
download | nsgenbind-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.
-rw-r--r-- | src/Makefile | 4 | ||||
-rw-r--r-- | src/duk-libdom.c | 190 | ||||
-rw-r--r-- | src/duk-libdom.h | 2 | ||||
-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.c | 16 |
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: |