%extend for nested unnamed C structs

This commit is contained in:
Vladimir Kalinin 2014-05-14 00:51:36 +04:00
commit 2aa540b9c0
3 changed files with 12 additions and 9 deletions

View file

@ -41,7 +41,7 @@ int yyparse();
static Node *top = 0; /* Top of the generated parse tree */
static int unnamed = 0; /* Unnamed datatype counter */
static Hash *extendhash = 0; /* Hash table of added methods */
Hash *extendhash = 0; /* Hash table of added methods */
static Hash *classes = 0; /* Hash table of classes */
static Hash *classes_typedefs = 0; /* Hash table of typedef classes: typedef struct X {...} Y; */
static Symtab *prev_symtab = 0;
@ -655,7 +655,7 @@ static void add_symbols_copy(Node *n) {
actually needs to take precedence. Therefore, we will selectively nuke symbols
from the current symbol table, replacing them with the added methods */
static void merge_extensions(Node *cls, Node *am) {
void merge_extensions(Node *cls, Node *am) {
Node *n;
Node *csym;
@ -708,7 +708,7 @@ static void merge_extensions(Node *cls, Node *am) {
}
}
static void append_previous_extension(Node *cls, Node *am) {
void append_previous_extension(Node *cls, Node *am) {
Node *n, *ne;
Node *pe = 0;
Node *ae = 0;
@ -737,7 +737,7 @@ static void append_previous_extension(Node *cls, Node *am) {
/* Check for unused %extend. Special case, don't report unused
extensions for templates */
static void check_extensions() {
void check_extensions() {
Iterator ki;
if (!extendhash) return;
@ -1579,7 +1579,6 @@ program : interface {
Setattr(module_node,"name",ModuleName);
}
Setattr($1,"module",module_node);
check_extensions();
top = $1;
}
| PARSETYPE parm SEMI {

View file

@ -198,6 +198,7 @@ static String *external_runtime_name = 0;
enum { STAGE1=1, STAGE2=2, STAGE3=4, STAGE4=8, STAGEOVERFLOW=16 };
static List *libfiles = 0;
static List *all_output_files = 0;
extern "C" void check_extensions();
/* -----------------------------------------------------------------------------
* check_extension()
@ -1172,6 +1173,7 @@ int SWIG_main(int argc, char *argv[], Language *l) {
Printf(stdout, "Processing unnamed structs...\n");
Swig_nested_name_unnamed_c_structs(top);
}
check_extensions();
if (Verbose) {
Printf(stdout, "Processing types...\n");

View file

@ -338,7 +338,9 @@ static void insertNodeAfter(Node *n, Node *c) {
set_nextSibling(n, c);
set_previousSibling(c, n);
}
extern "C" Hash *extendhash;
extern "C" void merge_extensions(Node *cls, Node *am);
extern "C" void append_previous_extension(Node *cls, Node *am);
void Swig_nested_name_unnamed_c_structs(Node *n) {
if (!classhash)
classhash = Getattr(n, "classes");
@ -377,15 +379,15 @@ void Swig_nested_name_unnamed_c_structs(Node *n) {
}
Delete(ty);
// Check for extensions
/* // TODO: we can save extensions hash like class hash and move check_extensions() after nesting processing
// TODO: we can save extensions hash like class hash and move check_extensions() after nesting processing
if (extendhash) {
if (Node *am = Getattr(extendhash, name)) {
// Merge the extension into the symbol table
merge_extensions(c, am);
append_previous_extension(c, am);
Delattr(extendhash, clsname);
Delattr(extendhash, name);
}
}*/
}
Swig_symbol_setscope(Swig_symbol_global_scope());
add_symbols_c(c);