Add support function for displaying the declaration of a methods. Add special variables for use in %exception: $wrapname $overname $decl $fulldecl

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10256 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
William S Fulton 2008-02-13 23:48:37 +00:00
commit 4d58a827d1
2 changed files with 123 additions and 0 deletions

View file

@ -0,0 +1,53 @@
import special_variables.*;
public class special_variables_runme {
static {
try {
System.loadLibrary("special_variables");
} catch (UnsatisfiedLinkError e) {
System.err.println("Native code library failed to load. See the chapter on Dynamic Linking Problems in the SWIG Java documentation for help.\n" + e);
System.exit(1);
}
}
public static void main(String argv[])
{
verify(special_variables.ExceptionVars(1.0, 2.0),
"result = Space::exceptionvars(arg1,arg2); Space::exceptionvars ExceptionVars Java_special_1variables_special_1variablesJNI_ExceptionVars");
verify(special_variables.overloadedmethod(),
"result = Space::overloadedmethod(); Space::overloadedmethod overloadedmethod __SWIG_1 Java_special_1variables_special_1variablesJNI_overloadedmethod_1_1SWIG_11");
verify(special_variables.overloadedmethod(10.0),
"result = Space::overloadedmethod(arg1); Space::overloadedmethod overloadedmethod __SWIG_0 Java_special_1variables_special_1variablesJNI_overloadedmethod_1_1SWIG_10");
ABC a = new ABC(0, 0.0);
verify(special_variables.getDeclaration(), "SpaceNamespace::ABC::ABC(int,double) SpaceNamespace::ABC::ABC(int,double)");
a = new ABC();
verify(special_variables.getDeclaration(), "SpaceNamespace::ABC::ABC() SpaceNamespace::ABC::ABC()");
a.instancemethod(1);
verify(special_variables.getDeclaration(), "short * SpaceNamespace::ABC::instancemethod(int) SpaceNamespace::ABC::instancemethod(int)");
a.instancemethod(1, false);
verify(special_variables.getDeclaration(), "short * SpaceNamespace::ABC::instancemethod(int,bool) SpaceNamespace::ABC::instancemethod(int,bool)");
a.constmethod(1);
verify(special_variables.getDeclaration(), "short * SpaceNamespace::ABC::constmethod(int) const SpaceNamespace::ABC::constmethod(int) const");
ABC.staticmethod(0, false);
verify(special_variables.getDeclaration(), "short * SpaceNamespace::ABC::staticmethod(int,bool) SpaceNamespace::ABC::staticmethod(int,bool)");
a.delete();
verify(special_variables.getDeclaration(), "SpaceNamespace::ABC::~ABC() SpaceNamespace::ABC::~ABC()");
TemplateABC abc = new TemplateABC();
verify(special_variables.getDeclaration(), "SpaceNamespace::Template<SpaceNamespace::ABC >::Template() SpaceNamespace::Template<SpaceNamespace::ABC >::Template()");
abc.tmethod(new ABC());
verify(special_variables.getDeclaration(), "std::string SpaceNamespace::Template<SpaceNamespace::ABC >::tmethod(SpaceNamespace::ABC) SpaceNamespace::Template<SpaceNamespace::ABC >::tmethod(SpaceNamespace::ABC)");
abc.delete();
verify(special_variables.getDeclaration(), "SpaceNamespace::Template<SpaceNamespace::ABC >::~Template() SpaceNamespace::Template<SpaceNamespace::ABC >::~Template()");
special_variables.globtemplate(new TemplateABC());
verify(special_variables.getDeclaration(), "void SpaceNamespace::globtemplate(SpaceNamespace::Template<SpaceNamespace::ABC >) SpaceNamespace::globtemplate(SpaceNamespace::Template<SpaceNamespace::ABC >)");
}
static void verify(String received, String expected) {
if (!received.equals(expected))
throw new RuntimeException("Incorrect, received: " + received);
}
}

View file

@ -1,5 +1,7 @@
%module special_variables
%include <std_string.i>
// will fail to compile if $symname is not expanded
%typemap(argout) int i {
$symname(99);
@ -18,3 +20,71 @@ struct KKK {
};
%}
%{
std::string ExceptionVars(double i, double j) {
return "a1";
}
%}
%rename(ExceptionVars) Space::exceptionvars;
%exception Space::exceptionvars %{
$action
result = $symname(1.0,2.0); // Should expand to ExceptionVars
result = $name(3.0,4.0); // Should expand to Space::exceptionvars
// above will not compile if the variables are not expanded properly
result = "$action $name $symname $overname $wrapname";
%}
%inline %{
namespace Space {
std::string exceptionvars(double i, double j) {
return "b2";
}
}
%}
%exception Space::overloadedmethod %{
$action
result = Space::$symname(1.0);
result = $name();
result = $name(2.0);
// above will not compile if the variables are not expanded properly
result = "$action $name $symname $overname $wrapname";
// $decl
%}
%inline %{
namespace Space {
std::string overloadedmethod(double j) {
return "c3";
}
std::string overloadedmethod() {
return "d4";
}
}
std::string declaration;
%}
%exception {
$action
declaration = "$fulldecl $decl";
}
%inline %{
namespace SpaceNamespace {
struct ABC {
ABC(int a, double b) {}
ABC() {}
static short * staticmethod(int x, bool b) { return 0; }
short * instancemethod(int x, bool b = false) { return 0; }
short * constmethod(int x) const { return 0; }
};
template<typename T> struct Template {
std::string tmethod(T t) { return ""; }
};
void globtemplate(Template<ABC> t) {}
}
%}
%template(TemplateABC) SpaceNamespace::Template<SpaceNamespace::ABC>;