wxruby3 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/wxruby3/include/wxruby-runtime.h +3 -0
- data/ext/wxruby3/swig/common.i +22 -0
- data/ext/wxruby3/swig/custom/director.swg +296 -0
- data/ext/wxruby3/swig/custom/rubyapi.swg +19 -0
- data/ext/wxruby3/swig/custom/rubyerrors.swg +45 -0
- data/ext/wxruby3/swig/custom/rubyhead.swg +192 -0
- data/ext/wxruby3/swig/custom/rubyrun.swg +187 -0
- data/ext/wxruby3/swig/custom/swigrun.swg +363 -0
- data/ext/wxruby3/swig/custom/typemaps/swigtypemaps.swg +173 -0
- data/ext/wxruby3/swig/wx.i +50 -30
- data/lib/wx/core/const.rb +83 -0
- data/lib/wx/doc/const.rb +66 -66
- data/lib/wx/doc/event.rb +0 -6
- data/lib/wx/doc/functions.rb +9 -9
- data/lib/wx/doc/window.rb +5 -0
- data/lib/wx/keyword_defs.rb +43 -6
- data/lib/wx/version.rb +1 -1
- data/rakelib/lib/config/macosx.rb +1 -1
- data/rakelib/lib/core/include/funcall.inc +33 -14
- data/rakelib/lib/core/include/swigdirector.inc +384 -0
- data/rakelib/lib/core/include/swigrubyerrors.inc +161 -0
- data/{ext/wxruby3/swig/custom/swig4/rubyrun.swg → rakelib/lib/core/include/swigrubyrun.inc} +245 -120
- data/rakelib/lib/core/include/swigrun.inc +700 -0
- data/rakelib/lib/core/package.rb +5 -2
- data/rakelib/lib/core/parameter.rb +3 -0
- data/rakelib/lib/director/accelerator.rb +1 -1
- data/rakelib/lib/director/animation.rb +1 -1
- data/rakelib/lib/director/animation_ctrl.rb +20 -0
- data/rakelib/lib/director/app.rb +23 -5
- data/rakelib/lib/director/art_provider.rb +1 -1
- data/rakelib/lib/director/data_object_simple_base.rb +1 -2
- data/rakelib/lib/director/dialog.rb +5 -0
- data/rakelib/lib/director/dialup_event.rb +44 -0
- data/rakelib/lib/director/dialup_manager.rb +45 -0
- data/rakelib/lib/director/event.rb +20 -2
- data/rakelib/lib/director/file_ctrl.rb +35 -0
- data/rakelib/lib/director/file_ctrl_event.rb +26 -0
- data/rakelib/lib/director/gdicommon.rb +19 -1
- data/rakelib/lib/director/grid_cell_editor.rb +6 -6
- data/rakelib/lib/director/help_controller.rb +1 -1
- data/rakelib/lib/director/pgarray_editor_dialog.rb +0 -6
- data/rakelib/lib/director/pgeditor.rb +2 -2
- data/rakelib/lib/director/pgproperties.rb +2 -2
- data/rakelib/lib/director/richtext_buffer.rb +1 -1
- data/rakelib/lib/director/richtext_ctrl.rb +1 -1
- data/rakelib/lib/director/sash_event.rb +42 -0
- data/rakelib/lib/director/sizer.rb +64 -1
- data/rakelib/lib/director/sizer_item.rb +22 -0
- data/rakelib/lib/director/task_bar_icon.rb +1 -1
- data/rakelib/lib/director/tree_ctrl.rb +19 -44
- data/rakelib/lib/generate/doc/animation_ctrl.yaml +15 -0
- data/rakelib/lib/generate/doc/events.yaml +10 -4
- data/rakelib/lib/generate/doc/static_box.yaml +8 -0
- data/rakelib/lib/generate/doc/xml_resource.yaml +3 -0
- data/rakelib/lib/generate/doc.rb +14 -3
- data/rakelib/lib/generate/interface.rb +4 -3
- data/rakelib/lib/specs/interfaces.rb +5 -1
- data/rakelib/lib/swig_runner.rb +4 -50
- data/rakelib/lib/typemap/common.rb +24 -9
- data/rakelib/lib/typemap/data_format.rb +1 -1
- data/rakelib/lib/typemap/data_object_data.rb +2 -2
- data/rakelib/lib/typemap/pgprop_arg.rb +7 -2
- data/rakelib/lib/typemap/points_list.rb +5 -7
- data/rakelib/lib/util/string.rb +10 -8
- data/samples/text/richtext.rb +0 -30
- data/tests/test_app_exit_exception.rb +36 -0
- data/tests/test_app_init_exception.rb +20 -0
- data/tests/test_book_controls.rb +29 -0
- data/tests/test_exceptions.rb +41 -0
- data/tests/test_sizer.rb +43 -0
- data/tests/test_std_controls.rb +36 -0
- metadata +25 -4
- data/ext/wxruby3/swig/custom/swig3/rubyrun.swg +0 -456
@@ -107,7 +107,7 @@ module WXRuby3
|
|
107
107
|
@ld.sub!(/-o\s*\Z/, '')
|
108
108
|
|
109
109
|
@extra_cflags.concat %w[-Wno-unused-function -Wno-conversion-null -Wno-sometimes-uninitialized
|
110
|
-
-Wno-overloaded-virtual -Wno-deprecated-copy]
|
110
|
+
-Wno-overloaded-virtual -Wno-deprecated-copy -Wno-format-security]
|
111
111
|
@extra_cflags << ' -Wno-deprecated-declarations' unless @no_deprecated
|
112
112
|
|
113
113
|
# create a .dylib binary
|
@@ -11,18 +11,38 @@
|
|
11
11
|
|
12
12
|
typedef VALUE (*RUBY_INVOKE_FUNC) (VALUE);
|
13
13
|
|
14
|
+
VALUE rb_exc_set_backtrace(VALUE, VALUE);
|
15
|
+
VALUE rb_get_backtrace(VALUE);
|
16
|
+
|
17
|
+
namespace Swig
|
18
|
+
{
|
19
|
+
class DirectorRubyException : public DirectorException
|
20
|
+
{
|
21
|
+
public:
|
22
|
+
DirectorRubyException(VALUE error, VALUE rcvr, ID fn_id)
|
23
|
+
: DirectorException(Qnil)
|
24
|
+
{
|
25
|
+
VALUE msg = rb_sprintf("Caught exception in SWIG director method for %s#%s", rb_class2name(CLASS_OF(rcvr)), rb_id2name(fn_id));
|
26
|
+
this->swig_msg = StringValuePtr(msg);
|
27
|
+
swig_error = rb_exc_new_str(rb_eRuntimeError, msg);
|
28
|
+
VALUE bt = rb_funcall(error, rb_intern("backtrace"), 0);
|
29
|
+
rb_funcall(swig_error, rb_intern("set_backtrace"), 1, bt);
|
30
|
+
}
|
31
|
+
};
|
32
|
+
}
|
33
|
+
|
14
34
|
class WXRuby_RBFuncall
|
15
35
|
{
|
16
36
|
public:
|
17
|
-
WXRuby_RBFuncall (ID fnid, bool
|
37
|
+
WXRuby_RBFuncall (ID fnid, bool throw_on_ex=true)
|
18
38
|
: fn_id_ (fnid),
|
19
|
-
|
39
|
+
throw_on_ex_ (throw_on_ex),
|
20
40
|
ex_caught_ (false)
|
21
41
|
{
|
22
42
|
}
|
23
|
-
WXRuby_RBFuncall (const char* fn, bool
|
43
|
+
WXRuby_RBFuncall (const char* fn, bool throw_on_ex=true)
|
24
44
|
: fn_id_ (rb_intern (fn)),
|
25
|
-
|
45
|
+
throw_on_ex_ (throw_on_ex),
|
26
46
|
ex_caught_ (false)
|
27
47
|
{
|
28
48
|
}
|
@@ -43,15 +63,18 @@ public:
|
|
43
63
|
|
44
64
|
bool has_caught_exception () { return this->ex_caught_; }
|
45
65
|
|
46
|
-
VALUE get_exception () { return
|
66
|
+
VALUE get_exception () { return rb_errinfo(); }
|
47
67
|
|
48
68
|
ID id () { return this->fn_id_; }
|
49
69
|
|
50
70
|
protected:
|
51
71
|
struct FuncArgs
|
52
72
|
{
|
73
|
+
FuncArgs(VALUE rcvr) : receiver_(rcvr) {}
|
53
74
|
virtual ~FuncArgs () {}
|
54
75
|
virtual VALUE rb_invoke (ID fnid) const = 0;
|
76
|
+
|
77
|
+
VALUE receiver_;
|
55
78
|
};
|
56
79
|
|
57
80
|
VALUE _invoke (const FuncArgs& fa)
|
@@ -65,13 +88,11 @@ protected:
|
|
65
88
|
&invoke_state);
|
66
89
|
if (invoke_state)
|
67
90
|
{
|
68
|
-
if (this->
|
91
|
+
if (this->throw_on_ex_)
|
69
92
|
{
|
70
93
|
// handle exception
|
71
94
|
VALUE rexc = this->get_exception ();
|
72
|
-
|
73
|
-
const char *exc_name = rb_obj_classname(rexc);
|
74
|
-
wxLogFatalError("%s : %s", exc_name, StringValuePtr(msg));
|
95
|
+
throw Swig::DirectorRubyException(rexc, fa.receiver_, this->fn_id_);
|
75
96
|
}
|
76
97
|
else
|
77
98
|
{
|
@@ -88,7 +109,7 @@ protected:
|
|
88
109
|
struct FuncArgArray : public FuncArgs
|
89
110
|
{
|
90
111
|
FuncArgArray (VALUE rcvr, VALUE args)
|
91
|
-
:
|
112
|
+
: FuncArgs (rcvr), args_ (args) {}
|
92
113
|
virtual ~FuncArgArray () {}
|
93
114
|
|
94
115
|
virtual VALUE rb_invoke (ID fnid) const
|
@@ -96,14 +117,13 @@ protected:
|
|
96
117
|
return rb_apply (this->receiver_, fnid, this->args_);
|
97
118
|
}
|
98
119
|
|
99
|
-
VALUE receiver_;
|
100
120
|
VALUE args_;
|
101
121
|
};
|
102
122
|
|
103
123
|
struct FuncArgList : public FuncArgs
|
104
124
|
{
|
105
125
|
FuncArgList (VALUE rcvr, int argc, VALUE* args)
|
106
|
-
:
|
126
|
+
: FuncArgs (rcvr), argc_ (argc), args_ (args) {}
|
107
127
|
virtual ~FuncArgList () {}
|
108
128
|
|
109
129
|
virtual VALUE rb_invoke (ID fnid) const
|
@@ -111,7 +131,6 @@ protected:
|
|
111
131
|
return rb_funcall2 (this->receiver_, fnid, this->argc_, this->args_);
|
112
132
|
}
|
113
133
|
|
114
|
-
VALUE receiver_;
|
115
134
|
int argc_;
|
116
135
|
VALUE* args_;
|
117
136
|
};
|
@@ -138,7 +157,7 @@ protected:
|
|
138
157
|
|
139
158
|
private:
|
140
159
|
ID fn_id_;
|
141
|
-
bool
|
160
|
+
bool throw_on_ex_;
|
142
161
|
bool ex_caught_;
|
143
162
|
};
|
144
163
|
|
@@ -0,0 +1,384 @@
|
|
1
|
+
// Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
//
|
3
|
+
// This software is released under the MIT license.
|
4
|
+
|
5
|
+
// SWIG director classes
|
6
|
+
|
7
|
+
#include <string>
|
8
|
+
#include <iostream>
|
9
|
+
#include <exception>
|
10
|
+
#include <map>
|
11
|
+
|
12
|
+
namespace Swig
|
13
|
+
{
|
14
|
+
|
15
|
+
/* memory handler */
|
16
|
+
struct WXRB_EXPORT_FLAG GCItem
|
17
|
+
{
|
18
|
+
virtual ~GCItem();
|
19
|
+
|
20
|
+
virtual swig_ruby_owntype get_own() const;
|
21
|
+
};
|
22
|
+
|
23
|
+
GCItem::~GCItem() {}
|
24
|
+
|
25
|
+
swig_ruby_owntype GCItem::get_own() const
|
26
|
+
{
|
27
|
+
swig_ruby_owntype own = {0, 0};
|
28
|
+
return own;
|
29
|
+
}
|
30
|
+
|
31
|
+
struct WXRB_EXPORT_FLAG GCItem_var
|
32
|
+
{
|
33
|
+
GCItem_var(GCItem *item = 0) : _item(item) {}
|
34
|
+
|
35
|
+
GCItem_var& operator=(GCItem *item);
|
36
|
+
|
37
|
+
~GCItem_var()
|
38
|
+
{
|
39
|
+
delete _item;
|
40
|
+
}
|
41
|
+
|
42
|
+
GCItem *operator->() const
|
43
|
+
{
|
44
|
+
return _item;
|
45
|
+
}
|
46
|
+
|
47
|
+
private:
|
48
|
+
GCItem *_item;
|
49
|
+
};
|
50
|
+
|
51
|
+
GCItem_var& GCItem_var::operator=(GCItem *item)
|
52
|
+
{
|
53
|
+
GCItem *tmp = _item;
|
54
|
+
_item = item;
|
55
|
+
delete tmp;
|
56
|
+
return *this;
|
57
|
+
}
|
58
|
+
|
59
|
+
template <typename Type>
|
60
|
+
struct GCItem_T : GCItem
|
61
|
+
{
|
62
|
+
GCItem_T(Type *ptr) : _ptr(ptr) {}
|
63
|
+
|
64
|
+
virtual ~GCItem_T()
|
65
|
+
{
|
66
|
+
delete _ptr;
|
67
|
+
}
|
68
|
+
|
69
|
+
private:
|
70
|
+
Type *_ptr;
|
71
|
+
};
|
72
|
+
|
73
|
+
struct WXRB_EXPORT_FLAG GCItem_Object : GCItem
|
74
|
+
{
|
75
|
+
GCItem_Object(swig_ruby_owntype own) : _own(own) {}
|
76
|
+
|
77
|
+
virtual ~GCItem_Object() {}
|
78
|
+
|
79
|
+
swig_ruby_owntype get_own() const
|
80
|
+
{
|
81
|
+
return _own;
|
82
|
+
}
|
83
|
+
|
84
|
+
private:
|
85
|
+
swig_ruby_owntype _own;
|
86
|
+
};
|
87
|
+
|
88
|
+
template <typename Type>
|
89
|
+
struct GCArray_T : GCItem
|
90
|
+
{
|
91
|
+
GCArray_T(Type *ptr) : _ptr(ptr) {}
|
92
|
+
|
93
|
+
virtual ~GCArray_T()
|
94
|
+
{
|
95
|
+
delete[] _ptr;
|
96
|
+
}
|
97
|
+
|
98
|
+
private:
|
99
|
+
Type *_ptr;
|
100
|
+
};
|
101
|
+
|
102
|
+
/* body args */
|
103
|
+
struct body_args
|
104
|
+
{
|
105
|
+
VALUE recv;
|
106
|
+
ID id;
|
107
|
+
int argc;
|
108
|
+
VALUE *argv;
|
109
|
+
};
|
110
|
+
|
111
|
+
/* Base class for director exceptions */
|
112
|
+
class WXRB_EXPORT_FLAG DirectorException : public std::exception
|
113
|
+
{
|
114
|
+
protected:
|
115
|
+
VALUE swig_error;
|
116
|
+
std::string swig_msg;
|
117
|
+
protected:
|
118
|
+
DirectorException(VALUE error) : swig_error(error) {}
|
119
|
+
|
120
|
+
DirectorException(VALUE error, const char *hdr, const char *msg ="");
|
121
|
+
|
122
|
+
void setup_error(VALUE error);
|
123
|
+
|
124
|
+
public:
|
125
|
+
virtual ~DirectorException() throw();
|
126
|
+
|
127
|
+
VALUE getType() const
|
128
|
+
{
|
129
|
+
return CLASS_OF(swig_error);
|
130
|
+
}
|
131
|
+
|
132
|
+
VALUE getError() const
|
133
|
+
{
|
134
|
+
return swig_error;
|
135
|
+
}
|
136
|
+
|
137
|
+
/* Deprecated, use what() instead */
|
138
|
+
const std::string& getMessage() const
|
139
|
+
{
|
140
|
+
return swig_msg;
|
141
|
+
}
|
142
|
+
|
143
|
+
const char *what() const throw()
|
144
|
+
{
|
145
|
+
return swig_msg.c_str();
|
146
|
+
}
|
147
|
+
};
|
148
|
+
|
149
|
+
DirectorException::DirectorException(VALUE error, const char *hdr, const char *msg)
|
150
|
+
: swig_msg(hdr)
|
151
|
+
{
|
152
|
+
if (msg[0])
|
153
|
+
{
|
154
|
+
swig_msg += " ";
|
155
|
+
swig_msg += msg;
|
156
|
+
}
|
157
|
+
this->setup_error(error);
|
158
|
+
}
|
159
|
+
|
160
|
+
DirectorException::~DirectorException() throw()
|
161
|
+
{}
|
162
|
+
|
163
|
+
|
164
|
+
void DirectorException::setup_error(VALUE error)
|
165
|
+
{
|
166
|
+
if (swig_msg.size())
|
167
|
+
{
|
168
|
+
VALUE str = rb_str_new(swig_msg.data(), swig_msg.size());
|
169
|
+
swig_error = rb_exc_new3(error, str);
|
170
|
+
}
|
171
|
+
else
|
172
|
+
{
|
173
|
+
swig_error = error;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
|
177
|
+
/* Type mismatch in the return value from a Ruby method call */
|
178
|
+
class WXRB_EXPORT_FLAG DirectorTypeMismatchException : public DirectorException
|
179
|
+
{
|
180
|
+
public:
|
181
|
+
DirectorTypeMismatchException(VALUE error, const char *msg="")
|
182
|
+
: DirectorException(error, "SWIG director type mismatch", msg)
|
183
|
+
{}
|
184
|
+
|
185
|
+
DirectorTypeMismatchException(const char *msg="")
|
186
|
+
: DirectorException(rb_eTypeError, "SWIG director type mismatch", msg)
|
187
|
+
{}
|
188
|
+
|
189
|
+
DirectorTypeMismatchException(VALUE self, const char *method, VALUE error, const char *msg="");
|
190
|
+
|
191
|
+
static inline void raise(VALUE error, const char *msg)
|
192
|
+
{
|
193
|
+
throw DirectorTypeMismatchException(error, msg);
|
194
|
+
}
|
195
|
+
|
196
|
+
static inline void raise(const char *msg)
|
197
|
+
{
|
198
|
+
throw DirectorTypeMismatchException(msg);
|
199
|
+
}
|
200
|
+
|
201
|
+
static inline void raise(VALUE self, const char* method, VALUE error, const char *msg)
|
202
|
+
{
|
203
|
+
throw DirectorTypeMismatchException(self, method, error, msg);
|
204
|
+
}
|
205
|
+
};
|
206
|
+
|
207
|
+
|
208
|
+
DirectorTypeMismatchException::DirectorTypeMismatchException(VALUE self, const char *method, VALUE error, const char *msg)
|
209
|
+
: DirectorException(Qnil)
|
210
|
+
{
|
211
|
+
this->swig_msg = "SWIG director type mismatch ";
|
212
|
+
this->swig_msg += msg;
|
213
|
+
this->swig_msg += " returned from ";
|
214
|
+
this->swig_msg += rb_class2name(CLASS_OF(self));
|
215
|
+
this->swig_msg += "#";
|
216
|
+
this->swig_msg += method;
|
217
|
+
this->setup_error(rb_eTypeError);
|
218
|
+
}
|
219
|
+
|
220
|
+
/* Any Ruby exception that occurs during a director method call */
|
221
|
+
class WXRB_EXPORT_FLAG DirectorMethodException : public DirectorException
|
222
|
+
{
|
223
|
+
public:
|
224
|
+
DirectorMethodException(VALUE error)
|
225
|
+
: DirectorException(error)
|
226
|
+
{}
|
227
|
+
|
228
|
+
DirectorMethodException(const char *msg = "")
|
229
|
+
: DirectorException(rb_eRuntimeError, "SWIG director method error.", msg)
|
230
|
+
{}
|
231
|
+
|
232
|
+
static void raise(VALUE error)
|
233
|
+
{
|
234
|
+
throw DirectorMethodException(error);
|
235
|
+
}
|
236
|
+
};
|
237
|
+
|
238
|
+
/* Attempted to call a pure virtual method via a director method */
|
239
|
+
class WXRB_EXPORT_FLAG DirectorPureVirtualException : public DirectorException
|
240
|
+
{
|
241
|
+
public:
|
242
|
+
DirectorPureVirtualException(const char *msg = "")
|
243
|
+
: DirectorException(rb_eRuntimeError, "SWIG director pure virtual method called", msg)
|
244
|
+
{}
|
245
|
+
|
246
|
+
static void raise(const char *msg)
|
247
|
+
{
|
248
|
+
throw DirectorPureVirtualException(msg);
|
249
|
+
}
|
250
|
+
};
|
251
|
+
|
252
|
+
/* Simple thread abstraction for pthreads on win32 */
|
253
|
+
#ifdef __THREAD__
|
254
|
+
# define __PTHREAD__
|
255
|
+
# if defined(_WIN32) || defined(__WIN32__)
|
256
|
+
# define pthread_mutex_lock EnterCriticalSection
|
257
|
+
# define pthread_mutex_unlock LeaveCriticalSection
|
258
|
+
# define pthread_mutex_t CRITICAL_SECTION
|
259
|
+
# define SWIG_MUTEX_INIT(var) var
|
260
|
+
# else
|
261
|
+
# include <pthread.h>
|
262
|
+
# define SWIG_MUTEX_INIT(var) var = PTHREAD_MUTEX_INITIALIZER
|
263
|
+
# endif
|
264
|
+
#endif
|
265
|
+
|
266
|
+
#ifdef __PTHREAD__
|
267
|
+
struct Guard
|
268
|
+
{
|
269
|
+
pthread_mutex_t *_mutex;
|
270
|
+
|
271
|
+
Guard(pthread_mutex_t &mutex) : _mutex(&mutex)
|
272
|
+
{
|
273
|
+
pthread_mutex_lock(_mutex);
|
274
|
+
}
|
275
|
+
|
276
|
+
~Guard()
|
277
|
+
{
|
278
|
+
pthread_mutex_unlock(_mutex);
|
279
|
+
}
|
280
|
+
};
|
281
|
+
# define SWIG_GUARD(mutex) Guard _guard(mutex)
|
282
|
+
#else
|
283
|
+
# define SWIG_GUARD(mutex)
|
284
|
+
#endif
|
285
|
+
|
286
|
+
/* director base class */
|
287
|
+
class WXRB_EXPORT_FLAG Director
|
288
|
+
{
|
289
|
+
private:
|
290
|
+
/* pointer to the wrapped Ruby object */
|
291
|
+
VALUE swig_self;
|
292
|
+
/* flag indicating whether the object is owned by Ruby or c++ */
|
293
|
+
mutable bool swig_disown_flag;
|
294
|
+
|
295
|
+
public:
|
296
|
+
/* wrap a Ruby object. */
|
297
|
+
Director(VALUE self);
|
298
|
+
|
299
|
+
/* discard our reference at destruction */
|
300
|
+
virtual ~Director();
|
301
|
+
|
302
|
+
/* return a pointer to the wrapped Ruby object */
|
303
|
+
VALUE swig_get_self() const
|
304
|
+
{
|
305
|
+
return swig_self;
|
306
|
+
}
|
307
|
+
|
308
|
+
/* acquire ownership of the wrapped Ruby object (the sense of "disown" is from Ruby) */
|
309
|
+
void swig_disown() const
|
310
|
+
{
|
311
|
+
if (!swig_disown_flag)
|
312
|
+
{
|
313
|
+
swig_disown_flag = true;
|
314
|
+
}
|
315
|
+
}
|
316
|
+
|
317
|
+
/* ownership management */
|
318
|
+
private:
|
319
|
+
typedef std::map<void *, GCItem_var> swig_ownership_map;
|
320
|
+
mutable swig_ownership_map swig_owner;
|
321
|
+
#ifdef __PTHREAD__
|
322
|
+
static pthread_mutex_t swig_mutex_own;
|
323
|
+
#endif
|
324
|
+
|
325
|
+
public:
|
326
|
+
template <typename Type>
|
327
|
+
void swig_acquire_ownership_array(Type *vptr) const
|
328
|
+
{
|
329
|
+
if (vptr)
|
330
|
+
{
|
331
|
+
SWIG_GUARD(swig_mutex_own);
|
332
|
+
swig_owner[vptr] = new GCArray_T<Type>(vptr);
|
333
|
+
}
|
334
|
+
}
|
335
|
+
|
336
|
+
template <typename Type>
|
337
|
+
void swig_acquire_ownership(Type *vptr) const
|
338
|
+
{
|
339
|
+
if (vptr)
|
340
|
+
{
|
341
|
+
SWIG_GUARD(swig_mutex_own);
|
342
|
+
swig_owner[vptr] = new GCItem_T<Type>(vptr);
|
343
|
+
}
|
344
|
+
}
|
345
|
+
|
346
|
+
void swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const;
|
347
|
+
|
348
|
+
swig_ruby_owntype swig_release_ownership(void *vptr) const;
|
349
|
+
};
|
350
|
+
|
351
|
+
Director::Director(VALUE self)
|
352
|
+
: swig_self(self), swig_disown_flag(false)
|
353
|
+
{}
|
354
|
+
|
355
|
+
/* discard our reference at destruction */
|
356
|
+
Director::~Director()
|
357
|
+
{}
|
358
|
+
|
359
|
+
void Director::swig_acquire_ownership_obj(void *vptr, swig_ruby_owntype own) const
|
360
|
+
{
|
361
|
+
if (vptr && own.datafree)
|
362
|
+
{
|
363
|
+
SWIG_GUARD(swig_mutex_own);
|
364
|
+
swig_owner[vptr] = new GCItem_Object(own);
|
365
|
+
}
|
366
|
+
}
|
367
|
+
|
368
|
+
swig_ruby_owntype Director::swig_release_ownership(void *vptr) const
|
369
|
+
{
|
370
|
+
swig_ruby_owntype own = {0, 0};
|
371
|
+
if (vptr)
|
372
|
+
{
|
373
|
+
SWIG_GUARD(swig_mutex_own);
|
374
|
+
swig_ownership_map::iterator iter = swig_owner.find(vptr);
|
375
|
+
if (iter != swig_owner.end())
|
376
|
+
{
|
377
|
+
own.datafree = iter->second->get_own().datafree;
|
378
|
+
swig_owner.erase(iter);
|
379
|
+
}
|
380
|
+
}
|
381
|
+
return own;
|
382
|
+
}
|
383
|
+
|
384
|
+
}
|
@@ -0,0 +1,161 @@
|
|
1
|
+
// Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
//
|
3
|
+
// This software is released under the MIT license.
|
4
|
+
|
5
|
+
// SWIG Ruby error handling
|
6
|
+
|
7
|
+
/* Define some additional error types */
|
8
|
+
#define SWIG_ObjectPreviouslyDeletedError -100
|
9
|
+
|
10
|
+
|
11
|
+
/* Define custom exceptions for errors that do not map to existing Ruby
|
12
|
+
exceptions. Note this only works for C++ since a global cannot be
|
13
|
+
initialized by a function in C. For C, fallback to rb_eRuntimeError.*/
|
14
|
+
|
15
|
+
WXRB_EXPORT_FLAG VALUE
|
16
|
+
getNullReferenceError(void)
|
17
|
+
{
|
18
|
+
static int init = 0;
|
19
|
+
static VALUE rb_eNullReferenceError ;
|
20
|
+
if (!init)
|
21
|
+
{
|
22
|
+
init = 1;
|
23
|
+
rb_eNullReferenceError = rb_define_class("NullReferenceError", rb_eRuntimeError);
|
24
|
+
}
|
25
|
+
return rb_eNullReferenceError;
|
26
|
+
}
|
27
|
+
|
28
|
+
WXRB_EXPORT_FLAG VALUE
|
29
|
+
getObjectPreviouslyDeletedError(void)
|
30
|
+
{
|
31
|
+
static int init = 0;
|
32
|
+
static VALUE rb_eObjectPreviouslyDeleted ;
|
33
|
+
if (!init)
|
34
|
+
{
|
35
|
+
init = 1;
|
36
|
+
rb_eObjectPreviouslyDeleted = rb_define_class("ObjectPreviouslyDeleted", rb_eRuntimeError);
|
37
|
+
}
|
38
|
+
return rb_eObjectPreviouslyDeleted;
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
WXRB_EXPORT_FLAG VALUE
|
43
|
+
SWIG_Ruby_ErrorType(int SWIG_code)
|
44
|
+
{
|
45
|
+
VALUE type;
|
46
|
+
switch (SWIG_code)
|
47
|
+
{
|
48
|
+
case SWIG_MemoryError:
|
49
|
+
type = rb_eNoMemError;
|
50
|
+
break;
|
51
|
+
case SWIG_IOError:
|
52
|
+
type = rb_eIOError;
|
53
|
+
break;
|
54
|
+
case SWIG_RuntimeError:
|
55
|
+
type = rb_eRuntimeError;
|
56
|
+
break;
|
57
|
+
case SWIG_IndexError:
|
58
|
+
type = rb_eIndexError;
|
59
|
+
break;
|
60
|
+
case SWIG_TypeError:
|
61
|
+
type = rb_eTypeError;
|
62
|
+
break;
|
63
|
+
case SWIG_DivisionByZero:
|
64
|
+
type = rb_eZeroDivError;
|
65
|
+
break;
|
66
|
+
case SWIG_OverflowError:
|
67
|
+
type = rb_eRangeError;
|
68
|
+
break;
|
69
|
+
case SWIG_SyntaxError:
|
70
|
+
type = rb_eSyntaxError;
|
71
|
+
break;
|
72
|
+
case SWIG_ValueError:
|
73
|
+
type = rb_eArgError;
|
74
|
+
break;
|
75
|
+
case SWIG_SystemError:
|
76
|
+
type = rb_eFatal;
|
77
|
+
break;
|
78
|
+
case SWIG_AttributeError:
|
79
|
+
type = rb_eRuntimeError;
|
80
|
+
break;
|
81
|
+
case SWIG_NullReferenceError:
|
82
|
+
type = getNullReferenceError();
|
83
|
+
break;
|
84
|
+
case SWIG_ObjectPreviouslyDeletedError:
|
85
|
+
type = getObjectPreviouslyDeletedError();
|
86
|
+
break;
|
87
|
+
case SWIG_UnknownError:
|
88
|
+
type = rb_eRuntimeError;
|
89
|
+
break;
|
90
|
+
default:
|
91
|
+
type = rb_eRuntimeError;
|
92
|
+
}
|
93
|
+
return type;
|
94
|
+
}
|
95
|
+
|
96
|
+
|
97
|
+
/* This function is called when a user inputs a wrong argument to
|
98
|
+
a method.
|
99
|
+
*/
|
100
|
+
WXRB_EXPORT_FLAG
|
101
|
+
const char* Ruby_Format_TypeError( const char* msg,
|
102
|
+
const char* type,
|
103
|
+
const char* name,
|
104
|
+
const int argn,
|
105
|
+
VALUE input )
|
106
|
+
{
|
107
|
+
char buf[128];
|
108
|
+
VALUE str;
|
109
|
+
VALUE asStr;
|
110
|
+
if ( msg && *msg )
|
111
|
+
{
|
112
|
+
str = rb_str_new2(msg);
|
113
|
+
}
|
114
|
+
else
|
115
|
+
{
|
116
|
+
str = rb_str_new(NULL, 0);
|
117
|
+
}
|
118
|
+
|
119
|
+
str = rb_str_cat2( str, "Expected argument " );
|
120
|
+
sprintf( buf, "%d of type ", argn-1 );
|
121
|
+
str = rb_str_cat2( str, buf );
|
122
|
+
str = rb_str_cat2( str, type );
|
123
|
+
str = rb_str_cat2( str, ", but got " );
|
124
|
+
str = rb_str_cat2( str, rb_obj_classname(input) );
|
125
|
+
str = rb_str_cat2( str, " " );
|
126
|
+
asStr = rb_inspect(input);
|
127
|
+
if ( RSTRING_LEN(asStr) > 30 )
|
128
|
+
{
|
129
|
+
str = rb_str_cat( str, StringValuePtr(asStr), 30 );
|
130
|
+
str = rb_str_cat2( str, "..." );
|
131
|
+
}
|
132
|
+
else
|
133
|
+
{
|
134
|
+
str = rb_str_append( str, asStr );
|
135
|
+
}
|
136
|
+
|
137
|
+
if ( name )
|
138
|
+
{
|
139
|
+
str = rb_str_cat2( str, "\n\tin SWIG method '" );
|
140
|
+
str = rb_str_cat2( str, name );
|
141
|
+
str = rb_str_cat2( str, "'" );
|
142
|
+
}
|
143
|
+
|
144
|
+
return StringValuePtr( str );
|
145
|
+
}
|
146
|
+
|
147
|
+
/* This function is called when an overloaded method fails */
|
148
|
+
WXRB_EXPORT_FLAG
|
149
|
+
void Ruby_Format_OverloadedError(
|
150
|
+
const int argc,
|
151
|
+
const int maxargs,
|
152
|
+
const char* method,
|
153
|
+
const char* prototypes
|
154
|
+
)
|
155
|
+
{
|
156
|
+
const char* msg = "Wrong # of arguments";
|
157
|
+
if ( argc <= maxargs ) msg = "Wrong arguments";
|
158
|
+
rb_raise(rb_eArgError,"%s for overloaded method '%s'.\n"
|
159
|
+
"Possible C/C++ prototypes are:\n%s",
|
160
|
+
msg, method, prototypes);
|
161
|
+
}
|