From ebbc33f90b22de62655cbbb50dd76bd71b4d1fd2 Mon Sep 17 00:00:00 2001 From: Mark Rose Date: Wed, 19 Mar 2003 04:01:24 +0000 Subject: [PATCH] director method tagging simplification git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@4572 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- CHANGES.current | 10 +++++ Source/Modules/lang.cxx | 77 +++++++-------------------------------- Source/Modules/python.cxx | 5 +-- Source/Modules/swigmod.h | 4 +- 4 files changed, 26 insertions(+), 70 deletions(-) diff --git a/CHANGES.current b/CHANGES.current index 505c4d700..89fc153f1 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -1,5 +1,15 @@ Version 1.3.18 (In progress) ============================ +03/18/2003: mrose (Mark Rose) + Removed code related to tagging individual methods for directors. + The concept of having directors for some but not all virtual methods + of a class is deeply flawed. The %feature("nodirector") tag is also + gone. + + Directors are off by default. To enable them for a class, issue + %feature("director") classname; which will create director methods + for every virtual method in the hierarchy of the class. + 03/17/2003: beazley Fixed a subtle problem with passing arguments of type function. For example: diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 42c029061..34d2070a6 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -1343,24 +1343,7 @@ int Language::classDirectorDefaultConstructor(Node *n) { return SWIG_OK; } -/* ---------------------------------------------------------------------- - * Language::tagDirectorBases() - * ---------------------------------------------------------------------- */ -int Language::tagDirectorBases(Node *n) { - List* bl; - if (Getattr(n, "directorBase")) return SWIG_OK; - if (Getattr(n, "hasVirtual") == 0) return SWIG_OK; - Setattr(n, "directorBase", "1"); - bl = Getattr(n, "bases"); - if (bl) { - Node* bi; - for (bi = Firstitem(bl); bi; bi = Nextitem(bl)) { - tagDirectorBases(bi); - } - } - return SWIG_OK; -} /* ---------------------------------------------------------------------- * Language::unrollVirtualMethods() @@ -1370,31 +1353,19 @@ int Language::unrollVirtualMethods(Node *n, Node *parent, Hash *vm, int default_director, - int &virtual_destructor, - int &has_virtual) { - int only_virtual = (Getattr(parent, "director:nonvirtual") == 0); + int &virtual_destructor) { int top = (n == parent); - has_virtual = 0; Node *ni; String *nodeType; String *storage; String *classname; String *decl; - // default_director < 0 turns off director generation for this class and all its superclasses - if (default_director >= 0) { - if (Getattr(n, "feature:director")) default_director = 1; - if (Getattr(n, "feature:nodirector")) default_director = -1; - } // recurse through all base classes to build the vtable List* bl = Getattr(n, "bases"); if (bl) { Node* bi; for (bi = Firstitem(bl); bi; bi = Nextitem(bl)) { - int virtual_base = 0; - unrollVirtualMethods(bi, parent, vm, default_director, virtual_destructor, virtual_base); - if (virtual_base) { - has_virtual = 1; - } + unrollVirtualMethods(bi, parent, vm, default_director, virtual_destructor); } } // find the methods that need directors @@ -1405,37 +1376,20 @@ int Language::unrollVirtualMethods(Node *n, decl = Getattr(ni, "decl"); if (!Cmp(nodeType, "cdecl") && SwigType_isfunction(decl)) { int is_virtual = storage && !Cmp(storage, "virtual"); - if (is_virtual) has_virtual = 1; String* access = Getattr(ni, "access"); if (!access || !Cmp(access, "public")) { - if (!only_virtual || is_virtual) { + if (is_virtual) { String *method_id; String *name = Getattr(ni, "name"); method_id = NewStringf("%s|%s", name, decl); - int director = default_director; - if (director >= 0) { - if (Getattr(ni, "feature:director")) director = 1; - if (Getattr(ni, "feature:nodirector")) director = 0; - } - // if this method has a director in a base class, we must - // either override it or remove it (otherwise the director - // method will use the wrong class for superclass calls) - if (Getattr(vm, method_id)) { - if (director == 0) director = 1; - else if (director < 0) { - Delattr(vm, method_id); - } - } - if (director == 1) { - String *fqname = NewString(""); - Printf(fqname, "%s::%s", classname, name); - Hash *item = NewHash(); - Setattr(item, "fqName", fqname); - Setattr(item, "methodNode", ni); - Setattr(vm, method_id, item); - Delete(fqname); - Delete(item); - } + String *fqname = NewString(""); + Printf(fqname, "%s::%s", classname, name); + Hash *item = NewHash(); + Setattr(item, "fqName", fqname); + Setattr(item, "methodNode", ni); + Setattr(vm, method_id, item); + Delete(fqname); + Delete(item); Delete(method_id); } } @@ -1448,9 +1402,6 @@ int Language::unrollVirtualMethods(Node *n, else { } } - if (has_virtual) { - Setattr(n, "hasVirtual", "1"); - } return SWIG_OK; } @@ -1565,8 +1516,7 @@ int Language::classDirector(Node *n) { } Hash* vtable = NewHash(); int virtual_destructor = 0; - int has_virtual = 0; - unrollVirtualMethods(n, n, vtable, 0, virtual_destructor, has_virtual); + unrollVirtualMethods(n, n, vtable, 0, virtual_destructor); if (Len(vtable) > 0) { if (!virtual_destructor) { String *classtype = Getattr(n, "classtype"); @@ -1575,7 +1525,6 @@ int Language::classDirector(Node *n) { classtype); } Setattr(n, "vtable", vtable); - tagDirectorBases(n); classDirectorInit(n); classDirectorConstructors(n); classDirectorMethods(n); @@ -1646,7 +1595,7 @@ int Language::classDeclaration(Node *n) { /* Call classHandler() here */ if (!ImportMode) { - if (directorsEnabled()) { + if (directorsEnabled() && Getattr(n, "feature:director")) { classDirector(n); } classHandler(n); diff --git a/Source/Modules/python.cxx b/Source/Modules/python.cxx index 4b420b36e..1cd558291 100644 --- a/Source/Modules/python.cxx +++ b/Source/Modules/python.cxx @@ -657,7 +657,6 @@ public: int director = Swig_directormethod(n); int directorbase = Swig_directorbase(n); Node *classNode = Swig_methodclass(n); - int hasVirtual = (classNode && (Getattr(classNode, "hasVirtual") != 0)); String *nodeType = Getattr(n, "nodeType"); int constructor = (!Cmp(nodeType, "constructor")); String *storage = Getattr(n,"storage"); @@ -873,7 +872,7 @@ public: if (directorsEnabled()) { if (!is_smart_pointer()) { - if (/*directorbase &&*/ hasVirtual && !constructor && isVirtual) { + if (/*directorbase &&*/ !constructor && isVirtual) { Wrapper_add_local(f, "director", "__DIRECTOR__ *director = 0"); Printf(f->code, "director = dynamic_cast<__DIRECTOR__*>(arg1);\n"); Printf(f->code, "if (director && (director->__get_self()==obj0)) director->__set_up();\n"); @@ -1459,7 +1458,7 @@ public: } else { if (is_void) { Printf(w->code, "%s;\n", Swig_method_call(super,l)); - Printf(w->code, "return;\n", Swig_method_call(super,l)); + Printf(w->code, "return;\n"); } else { Printf(w->code, "return %s;\n", Swig_method_call(super,l)); } diff --git a/Source/Modules/swigmod.h b/Source/Modules/swigmod.h index 66252d9d8..d53372edc 100644 --- a/Source/Modules/swigmod.h +++ b/Source/Modules/swigmod.h @@ -182,13 +182,11 @@ public: virtual int classDirector(Node *n); virtual int classDirectorInit(Node *n); virtual int classDirectorEnd(Node *n); - virtual int tagDirectorBases(Node *n); virtual int unrollVirtualMethods(Node *n, Node *parent, Hash *vm, int default_director, - int &virtual_destructor, - int &has_virtual); + int &virtual_destructor); virtual int classDirectorConstructor(Node *n); virtual int classDirectorDefaultConstructor(Node *n); virtual int classDirectorMethod(Node *n, Node *parent, String *super);