summaryrefslogtreecommitdiff
path: root/Examples/test-suite/director_exception.i
blob: 8e76c0781d34d0e141356134e9c21723c1c5eca1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
%module(directors="1") director_exception

%warnfilter(SWIGWARN_TYPEMAP_DIRECTOROUT_PTR) return_const_char_star;

%{
#include <string>

// define dummy director exception classes to prevent spurious errors 
// in target languages that do not support directors.

#ifndef SWIG_DIRECTORS
namespace Swig {
  class DirectorException {};
  class DirectorMethodException: public Swig::DirectorException {};
}
#endif /* !SWIG_DIRECTORS */
%}

%include "std_string.i"

#if defined SWIGPHP || defined SWIGPYTHON

%feature("director:except") {
  if ($error != NULL) {
    Swig::DirectorMethodException::raise("$symname");
  }
}

%exception {
  try { $action }
  catch (Swig::DirectorException &) { SWIG_fail; }
}

#endif

#ifdef SWIGJAVA

// Default for director exception warns about unmapped exceptions now in java
// Suppress warnings for this older test
// %warnfilter(476) Bar;

// Default for java is to throw Swig::DirectorException if no
// direct:except feature.  Since methods below have exception specification
// cannot throw director exception.

// Change back to old 2.0 default behavior

%feature("director:except") {
  jthrowable $error = jenv->ExceptionOccurred();
  if ($error) {
    // Don't clear exception, still be active when return to java execution
    // Essentially ignore exception occurred -- old behavior.
    return $null;
  }
}

#endif

#ifdef SWIGRUBY

%feature("director:except") {
  Swig::DirectorMethodException::raise($error);
}

%exception {
  try { $action }
  catch (Swig::DirectorException &e) { rb_exc_raise(e.getError()); }
}

#endif

%feature("director") Foo;

%inline {

class Foo {
public:
  virtual ~Foo() {}
  virtual std::string ping() { return "Foo::ping()"; }
  virtual std::string pong(int val=3) { return "Foo::pong();" + ping(); }
};

Foo *launder(Foo *f) {
  return f;
}

}


%{
  struct Unknown1
  {
  };

  struct Unknown2
  {
  };
%}

%feature("director") Bar;
%feature("director") ReturnAllTypes;

%{
// throw is deprecated in C++11 and invalid in C++17 and later
#if defined(__cplusplus) && __cplusplus >= 201103L
#define throw(TYPE1, TYPE2, TYPE3)
#else
#define throw(TYPE1, TYPE2, TYPE3) throw(TYPE1, TYPE2, TYPE3)
#if defined(_MSC_VER)
  #pragma warning(disable: 4290) // C++ exception specification ignored except to indicate a function is not __declspec(nothrow)
#endif
#endif
%}

%inline %{
  struct Exception1
  {
  };

  struct Exception2
  {
  };

  class Base 
  {
  public:
    virtual ~Base() {}
  };
  

  class Bar : public Base
  {
  public:
    virtual std::string ping() throw(Exception1, Exception2&, double) { return "Bar::ping()"; }
    virtual std::string pong() throw(Unknown1, int, Unknown2&) { return "Bar::pong();" + ping(); }
  };
  
  // Class to allow regression testing SWIG/PHP not checking if an exception
  // had been thrown in directorout typemaps.
  class ReturnAllTypes
  {
  public:
    int call_int() { return return_int(); }
    double call_double() { return return_double(); }
    const char * call_const_char_star() { return return_const_char_star(); }
    std::string call_std_string() { return return_std_string(); }
    Bar call_Bar() { return return_Bar(); }

    virtual int return_int() { return 0; }
    virtual double return_double() { return 0.0; }
    virtual const char * return_const_char_star() { return ""; }
    virtual std::string return_std_string() { return std::string(); }
    virtual Bar return_Bar() { return Bar(); }
    virtual ~ReturnAllTypes() {}
  };

#ifdef SWIGPYTHON_BUILTIN
bool is_python_builtin() { return true; }
#else
bool is_python_builtin() { return false; }
#endif
%}