mirror of https://github.com/swig/swig
Changes to use common DirectorException class
Add director.swg for Go as was completely absent. This is just the start of a common exception handling approach to directors. An exception thrown in a Java director method will be propogated back to Java via a C++ DirectorException. DirectorException throws typemap for Java is fully working, all other languages need work. DirectorException throws typemap for Perl added just to fix compilation errors. Add director_exception_catches test.
This commit is contained in:
parent
077bb0b04f
commit
923091da13
|
@ -181,6 +181,7 @@ CPP_TEST_CASES += \
|
||||||
director_detect \
|
director_detect \
|
||||||
director_enum \
|
director_enum \
|
||||||
director_exception \
|
director_exception \
|
||||||
|
director_exception_catches \
|
||||||
director_extend \
|
director_extend \
|
||||||
director_finalizer \
|
director_finalizer \
|
||||||
director_frob \
|
director_frob \
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
%module(directors="1") director_exception_catches
|
||||||
|
|
||||||
|
%include <std_string.i>
|
||||||
|
%feature("director") BaseClass;
|
||||||
|
|
||||||
|
%{
|
||||||
|
// define dummy director exception classes to prevent spurious errors
|
||||||
|
// in target languages that do not support directors.
|
||||||
|
|
||||||
|
#ifndef SWIG_DIRECTORS
|
||||||
|
namespace Swig {
|
||||||
|
class DirectorException {};
|
||||||
|
}
|
||||||
|
#endif /* !SWIG_DIRECTORS */
|
||||||
|
%}
|
||||||
|
|
||||||
|
%catches(Swig::DirectorException) BaseClass::call_description;
|
||||||
|
|
||||||
|
%inline %{
|
||||||
|
struct BaseClass {
|
||||||
|
virtual std::string description() const = 0;
|
||||||
|
static std::string call_description(BaseClass& bc) { return bc.description(); }
|
||||||
|
virtual ~BaseClass() {}
|
||||||
|
};
|
||||||
|
%}
|
|
@ -0,0 +1,35 @@
|
||||||
|
|
||||||
|
import director_exception_catches.*;
|
||||||
|
|
||||||
|
public class director_exception_catches_runme {
|
||||||
|
|
||||||
|
static {
|
||||||
|
try {
|
||||||
|
System.loadLibrary("director_exception_catches");
|
||||||
|
} 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[]) {
|
||||||
|
|
||||||
|
BaseClass b = new director_exception_catches_MyClass();
|
||||||
|
|
||||||
|
try {
|
||||||
|
String s = BaseClass.call_description(b);
|
||||||
|
throw new RuntimeException("Failed to catch exception");
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
if (!e.getMessage().startsWith("Testing exception thrown in BaseClass.description"))
|
||||||
|
throw new RuntimeException("Unexpected exception message: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class director_exception_catches_MyClass extends BaseClass {
|
||||||
|
@Override
|
||||||
|
public String description() {
|
||||||
|
throw new NullPointerException("Testing exception thrown in BaseClass.description");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* director.swg
|
||||||
|
*
|
||||||
|
* This file contains support for director classes so that Go proxy
|
||||||
|
* methods can be called from C++.
|
||||||
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#include <exception>
|
||||||
|
|
||||||
|
namespace Swig {
|
||||||
|
|
||||||
|
class DirectorException : public std::exception {
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
|
@ -1051,6 +1051,10 @@ Swig::LocalRefGuard $1_refguard(jenv, $input); }
|
||||||
%{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1);
|
%{ SWIG_JavaThrowException(jenv, SWIG_JavaRuntimeException, $1);
|
||||||
return $null; %}
|
return $null; %}
|
||||||
|
|
||||||
|
// For directors to raise/throw the original Java exception
|
||||||
|
%typemap(throws) Swig::DirectorException
|
||||||
|
%{ $1.raiseJavaException(jenv);
|
||||||
|
return $null; %}
|
||||||
|
|
||||||
/* Typemaps for code generation in proxy classes and Java type wrapper classes */
|
/* Typemaps for code generation in proxy classes and Java type wrapper classes */
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,22 @@ namespace Swig {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DirectorTypeMismatchException {
|
// Base class for director exceptions.
|
||||||
|
class DirectorException : public std::exception {
|
||||||
|
public:
|
||||||
|
static void raise(const char *msg) {
|
||||||
|
// ... todo
|
||||||
|
throw(DirectorException());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void raise(const octave_value &ov, const char *msg) {
|
||||||
|
// ... todo
|
||||||
|
raise(msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class DirectorTypeMismatchException : public DirectorException {
|
||||||
|
public:
|
||||||
static void raise(const char *msg) {
|
static void raise(const char *msg) {
|
||||||
// ... todo
|
// ... todo
|
||||||
throw(DirectorTypeMismatchException());
|
throw(DirectorTypeMismatchException());
|
||||||
|
@ -58,7 +73,8 @@ namespace Swig {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct DirectorPureVirtualException {
|
class DirectorPureVirtualException : public DirectorException {
|
||||||
|
public:
|
||||||
static void raise(const char *msg) {
|
static void raise(const char *msg) {
|
||||||
// ... todo
|
// ... todo
|
||||||
throw(DirectorPureVirtualException());
|
throw(DirectorPureVirtualException());
|
||||||
|
|
|
@ -71,6 +71,10 @@
|
||||||
/* raise exception */
|
/* raise exception */
|
||||||
%define %raise(obj, type, desc) sv_setsv(get_sv("@", GV_ADD), obj); SWIG_fail %enddef
|
%define %raise(obj, type, desc) sv_setsv(get_sv("@", GV_ADD), obj); SWIG_fail %enddef
|
||||||
|
|
||||||
|
/* For directors to raise/throw the original exception */
|
||||||
|
%typemap(throws) Swig::DirectorException
|
||||||
|
%{ sv_setsv(ERRSV, $1.getNative()); SWIG_fail; %}
|
||||||
|
|
||||||
/* Include the unified typemap library */
|
/* Include the unified typemap library */
|
||||||
%include <typemaps/swigtypemaps.swg>
|
%include <typemaps/swigtypemaps.swg>
|
||||||
|
|
||||||
|
|
|
@ -615,6 +615,12 @@ private:
|
||||||
|
|
||||||
Language::top(n);
|
Language::top(n);
|
||||||
|
|
||||||
|
if (directorsEnabled()) {
|
||||||
|
// Insert director runtime into the f_runtime file (make it occur before %header section)
|
||||||
|
Swig_insert_file("director_common.swg", f_c_runtime);
|
||||||
|
Swig_insert_file("director.swg", f_c_runtime);
|
||||||
|
}
|
||||||
|
|
||||||
Delete(go_imports);
|
Delete(go_imports);
|
||||||
|
|
||||||
// Write out definitions for the types not defined by SWIG.
|
// Write out definitions for the types not defined by SWIG.
|
||||||
|
|
Loading…
Reference in New Issue