Fix handling of protected methods in Go when using directors.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@12492 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
643f603475
commit
0c8c5e7614
3 changed files with 74 additions and 22 deletions
10
Examples/test-suite/go/director_alternating_runme.go
Normal file
10
Examples/test-suite/go/director_alternating_runme.go
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import . "./director_alternating"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
id := GetBar().Id()
|
||||||
|
if id != IdFromGetBar() {
|
||||||
|
panic(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,11 +15,17 @@ func (p *FooBar2) Pang() string {
|
||||||
return "FooBar2::pang();"
|
return "FooBar2::pang();"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type FooBar3 struct{} // From Bar
|
||||||
|
func (p *FooBar3) Cheer() string {
|
||||||
|
return "FooBar3::cheer();"
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
b := NewBar()
|
b := NewBar()
|
||||||
f := b.Create()
|
f := b.Create()
|
||||||
fb := NewDirectorBar(&FooBar{})
|
fb := NewDirectorBar(&FooBar{})
|
||||||
fb2 := NewDirectorBar(&FooBar2{})
|
fb2 := NewDirectorBar(&FooBar2{})
|
||||||
|
fb3 := NewDirectorBar(&FooBar3{})
|
||||||
|
|
||||||
s := fb.Used()
|
s := fb.Used()
|
||||||
if s != "Foo::pang();Bar::pong();Foo::pong();FooBar::ping();" {
|
if s != "Foo::pang();Bar::pong();Foo::pong();FooBar::ping();" {
|
||||||
|
|
@ -45,4 +51,23 @@ func main() {
|
||||||
if s != "Bar::pong();Foo::pong();FooBar::ping();" {
|
if s != "Bar::pong();Foo::pong();FooBar::ping();" {
|
||||||
panic(0)
|
panic(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s = fb3.DirectorInterface().(*FooBar3).Cheer()
|
||||||
|
if s != "FooBar3::cheer();" {
|
||||||
|
panic(s)
|
||||||
|
}
|
||||||
|
if fb2.Callping() != "FooBar2::ping();" {
|
||||||
|
panic("bad fb2.callping")
|
||||||
|
}
|
||||||
|
if fb2.Callcheer() != "FooBar2::pang();Bar::pong();Foo::pong();FooBar2::ping();" {
|
||||||
|
panic("bad fb2.callcheer")
|
||||||
|
}
|
||||||
|
|
||||||
|
if fb3.Callping() != "Bar::ping();" {
|
||||||
|
panic("bad fb3.callping")
|
||||||
|
}
|
||||||
|
|
||||||
|
if fb3.Callcheer() != "FooBar3::cheer();" {
|
||||||
|
panic("bad fb3.callcheer")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -573,7 +573,7 @@ private:
|
||||||
result = NewString("void");
|
result = NewString("void");
|
||||||
r1 = result;
|
r1 = result;
|
||||||
} else {
|
} else {
|
||||||
if (!is_public(n)) {
|
if (!checkFunctionVisibility(n, NULL)) {
|
||||||
return SWIG_OK;
|
return SWIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -647,7 +647,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
* staticmemberfunctionHandler
|
* staticmemberfunctionHandler()
|
||||||
*
|
*
|
||||||
* For some reason the language code removes the "storage" attribute
|
* For some reason the language code removes the "storage" attribute
|
||||||
* for a static function before calling functionWrapper, which means
|
* for a static function before calling functionWrapper, which means
|
||||||
|
|
@ -746,7 +746,7 @@ private:
|
||||||
receiver = NULL;
|
receiver = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !overname && is_public(n));
|
bool add_to_interface = (interfaces && !is_constructor && !is_destructor && !is_static && !overname && checkFunctionVisibility(n, NULL));
|
||||||
|
|
||||||
bool needs_wrapper = (gccgo_flag || receiver || is_constructor || is_destructor || parm_count > required_count);
|
bool needs_wrapper = (gccgo_flag || receiver || is_constructor || is_destructor || parm_count > required_count);
|
||||||
|
|
||||||
|
|
@ -2772,8 +2772,6 @@ private:
|
||||||
* ------------------------------------------------------------ */
|
* ------------------------------------------------------------ */
|
||||||
|
|
||||||
int classDirectorMethod(Node *n, Node *parent, String *super) {
|
int classDirectorMethod(Node *n, Node *parent, String *super) {
|
||||||
(void) super;
|
|
||||||
|
|
||||||
bool is_ignored = GetFlag(n, "feature:ignore") ? true : false;
|
bool is_ignored = GetFlag(n, "feature:ignore") ? true : false;
|
||||||
bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0);
|
bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0);
|
||||||
|
|
||||||
|
|
@ -2800,7 +2798,7 @@ private:
|
||||||
Setattr(class_methods, name, NewString(""));
|
Setattr(class_methods, name, NewString(""));
|
||||||
|
|
||||||
if (!Getattr(n, "sym:overloaded")) {
|
if (!Getattr(n, "sym:overloaded")) {
|
||||||
int r = oneClassDirectorMethod(n, parent);
|
int r = oneClassDirectorMethod(n, parent, super);
|
||||||
if (r != SWIG_OK) {
|
if (r != SWIG_OK) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -2811,7 +2809,7 @@ private:
|
||||||
// function in one class hides a function of the same name in a
|
// function in one class hides a function of the same name in a
|
||||||
// parent class.
|
// parent class.
|
||||||
for (Node *on = Getattr(n, "sym:overloaded"); on; on = Getattr(on, "sym:nextSibling")) {
|
for (Node *on = Getattr(n, "sym:overloaded"); on; on = Getattr(on, "sym:nextSibling")) {
|
||||||
int r = oneClassDirectorMethod(on, parent);
|
int r = oneClassDirectorMethod(on, parent, super);
|
||||||
if (r != SWIG_OK) {
|
if (r != SWIG_OK) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -2861,7 +2859,11 @@ private:
|
||||||
* Emit a method for a director class.
|
* Emit a method for a director class.
|
||||||
* ------------------------------------------------------------ */
|
* ------------------------------------------------------------ */
|
||||||
|
|
||||||
int oneClassDirectorMethod(Node *n, Node *parent) {
|
int oneClassDirectorMethod(Node *n, Node *parent, String *super) {
|
||||||
|
if (!checkFunctionVisibility(n, parent)) {
|
||||||
|
return SWIG_OK;
|
||||||
|
}
|
||||||
|
|
||||||
bool is_ignored = GetFlag(n, "feature:ignore") ? true : false;
|
bool is_ignored = GetFlag(n, "feature:ignore") ? true : false;
|
||||||
bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0);
|
bool is_pure_virtual = (Cmp(Getattr(n, "storage"), "virtual") == 0 && Cmp(Getattr(n, "value"), "0") == 0);
|
||||||
|
|
||||||
|
|
@ -3104,24 +3106,13 @@ private:
|
||||||
if (SwigType_type(result) != T_VOID) {
|
if (SwigType_type(result) != T_VOID) {
|
||||||
Printv(f_c_directors_h, "return ", NULL);
|
Printv(f_c_directors_h, "return ", NULL);
|
||||||
}
|
}
|
||||||
Printv(f_c_directors_h, Getattr(parent, "classtype"), "::", Getattr(n, "name"), "(", NULL);
|
|
||||||
|
|
||||||
p = parms;
|
String *super_call = Swig_method_call(super, parms);
|
||||||
for (int i = 0; i < parm_count; ++i) {
|
Printv(f_c_directors_h, super_call, ";\n", NULL);
|
||||||
p = getParm(p);
|
Delete(super_call);
|
||||||
if (i > 0) {
|
|
||||||
Printv(f_c_directors_h, ", ", NULL);
|
|
||||||
}
|
|
||||||
String *pn = Getattr(p, "name");
|
|
||||||
assert(pn);
|
|
||||||
Printv(f_c_directors_h, pn, NULL);
|
|
||||||
p = nextParm(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
Printv(f_c_directors_h, ");\n", NULL);
|
|
||||||
Printv(f_c_directors_h, " }\n", NULL);
|
Printv(f_c_directors_h, " }\n", NULL);
|
||||||
|
|
||||||
|
|
||||||
// Define the C++ function that the Go function calls.
|
// Define the C++ function that the Go function calls.
|
||||||
|
|
||||||
SwigType *first_type = NULL;
|
SwigType *first_type = NULL;
|
||||||
|
|
@ -4002,6 +3993,32 @@ private:
|
||||||
return SWIG_OK;
|
return SWIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* checkFunctionVisibility()
|
||||||
|
*
|
||||||
|
* Return true if we should write out a function based on its
|
||||||
|
* visibility, false otherwise.
|
||||||
|
* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
bool checkFunctionVisibility(Node *n, Node *parent) {
|
||||||
|
// Write out a public function.
|
||||||
|
if (is_public(n))
|
||||||
|
return true;
|
||||||
|
// Don't write out a private function.
|
||||||
|
if (is_private(n))
|
||||||
|
return false;
|
||||||
|
// Write a protected function for a director class in
|
||||||
|
// dirprot_mode.
|
||||||
|
if (parent == NULL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (dirprot_mode() && Swig_directorclass(parent))
|
||||||
|
return true;
|
||||||
|
// Otherwise don't write out a protected function.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
* exportedName()
|
* exportedName()
|
||||||
*
|
*
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue