PHP: fix for the director_using testcase
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@11459 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
82312aacf8
commit
0fa227ea83
4 changed files with 51 additions and 1 deletions
|
|
@ -1,6 +1,11 @@
|
||||||
Version 1.3.40 (in progress)
|
Version 1.3.40 (in progress)
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
2009-07-28: vmiklos
|
||||||
|
[PHP] If a member function is not public but it has a base
|
||||||
|
which is public, then now a warning is issued and the member
|
||||||
|
function will be public, as PHP requires this.
|
||||||
|
|
||||||
2009-07-21: vmiklos
|
2009-07-21: vmiklos
|
||||||
[PHP] Director support added.
|
[PHP] Director support added.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
%module(directors="1",dirprot="1") director_using
|
%module(directors="1",dirprot="1") director_using
|
||||||
|
|
||||||
|
%warnfilter(SWIGWARN_PHP_PUBLIC_BASE) FooBar;
|
||||||
|
|
||||||
%{
|
%{
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,7 @@
|
||||||
|
|
||||||
#define WARN_PHP_MULTIPLE_INHERITANCE 870
|
#define WARN_PHP_MULTIPLE_INHERITANCE 870
|
||||||
#define WARN_PHP_UNKNOWN_PRAGMA 871
|
#define WARN_PHP_UNKNOWN_PRAGMA 871
|
||||||
|
#define WARN_PHP_PUBLIC_BASE 872
|
||||||
|
|
||||||
/* please leave 870-889 free for PHP */
|
/* please leave 870-889 free for PHP */
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1520,7 +1520,48 @@ public:
|
||||||
Printf(output, "\n");
|
Printf(output, "\n");
|
||||||
// If it's a member function or a class constructor...
|
// If it's a member function or a class constructor...
|
||||||
if (wrapperType == memberfn || (constructor && current_class)) {
|
if (wrapperType == memberfn || (constructor && current_class)) {
|
||||||
String *acc = Getattr(n, "access");
|
String *acc = NewString(Getattr(n, "access"));
|
||||||
|
// If a base has the same method with public access, then PHP
|
||||||
|
// requires to have it here as public as well
|
||||||
|
Node *bases = Getattr(Swig_methodclass(n), "bases");
|
||||||
|
if (bases && Strcmp(acc, "public") != 0) {
|
||||||
|
String *warnmsg = 0;
|
||||||
|
int haspublicbase = 0;
|
||||||
|
Iterator i = First(bases);
|
||||||
|
while (i.item) {
|
||||||
|
Node *j = firstChild(i.item);
|
||||||
|
while (j) {
|
||||||
|
if (Strcmp(Getattr(j, "name"), Getattr(n, "name")) != 0) {
|
||||||
|
j = nextSibling(j);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (Strcmp(nodeType(j), "cdecl") == 0) {
|
||||||
|
if (!Getattr(j, "access") || checkAttribute(j, "access", "public")) {
|
||||||
|
haspublicbase = 1;
|
||||||
|
}
|
||||||
|
} else if (Strcmp(nodeType(j), "using") == 0 && firstChild(j) && Strcmp(nodeType(firstChild(j)), "cdecl") == 0) {
|
||||||
|
if (!Getattr(firstChild(j), "access") || checkAttribute(firstChild(j), "access", "public")) {
|
||||||
|
haspublicbase = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (haspublicbase) {
|
||||||
|
warnmsg = NewStringf("Modifying the access of '%s::%s' to public, as the base '%s' has it as public as well.\n", Getattr(current_class, "classtype"), Getattr(n, "name"), Getattr(i.item, "classtype"));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
j = nextSibling(j);
|
||||||
|
}
|
||||||
|
i = Next(i);
|
||||||
|
if (haspublicbase) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Getattr(n, "access") && haspublicbase) {
|
||||||
|
Delete(acc);
|
||||||
|
acc = NewString("public");
|
||||||
|
Swig_warning(WARN_PHP_PUBLIC_BASE, input_file, line_number, Char(warnmsg));
|
||||||
|
Delete(warnmsg);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (constructor) {
|
if (constructor) {
|
||||||
const char * arg0;
|
const char * arg0;
|
||||||
if (max_num_of_arguments > 0) {
|
if (max_num_of_arguments > 0) {
|
||||||
|
|
@ -1540,6 +1581,7 @@ public:
|
||||||
} else {
|
} else {
|
||||||
Printf(output, "\t%s function %s(%s) {\n", acc, methodname, args);
|
Printf(output, "\t%s function %s(%s) {\n", acc, methodname, args);
|
||||||
}
|
}
|
||||||
|
Delete(acc);
|
||||||
} else {
|
} else {
|
||||||
Printf(output, "\tstatic function %s(%s) {\n", methodname, args);
|
Printf(output, "\tstatic function %s(%s) {\n", methodname, args);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue