aboutsummaryrefslogtreecommitdiff
path: root/Examples/test-suite/exception_memory_leak.i
diff options
context:
space:
mode:
authorAlistair Delva <adelva@google.com>2024-04-10 14:15:29 -0700
committerAlistair Delva <adelva@google.com>2024-04-11 12:58:28 -0700
commitd0f0f90be16c2ac553b5fa08512045273135147a (patch)
tree5d9ebb7a04807ea8a609ddd18b0162bc87530e4b /Examples/test-suite/exception_memory_leak.i
parent6ffc1dbf29ba98c4d8aa71ebc9b484e973fe1030 (diff)
downloadswig-d0f0f90be16c2ac553b5fa08512045273135147a.tar.gz
Change-Id: I47cef2be94299220d80265d949a95b58eee2c23b
Diffstat (limited to 'Examples/test-suite/exception_memory_leak.i')
-rw-r--r--Examples/test-suite/exception_memory_leak.i70
1 files changed, 70 insertions, 0 deletions
diff --git a/Examples/test-suite/exception_memory_leak.i b/Examples/test-suite/exception_memory_leak.i
new file mode 100644
index 000000000..5875d9c1b
--- /dev/null
+++ b/Examples/test-suite/exception_memory_leak.i
@@ -0,0 +1,70 @@
+%module exception_memory_leak
+
+%include <std_string.i>
+%include <exception.i>
+
+#ifdef SWIGCSHARP
+#define TYPEMAP_OUT_INIT $result = 0;
+#else
+#define TYPEMAP_OUT_INIT
+#endif
+
+%typemap(in) Foo* foo
+{
+ $1 = new Foo;
+}
+%typemap(freearg) Foo* foo
+{
+ Foo::inc_freearg_count();
+ delete $1;
+}
+%typemap(out) Foo* trigger_internal_swig_exception
+{
+ TYPEMAP_OUT_INIT
+ if ($1 == NULL) {
+ SWIG_exception(SWIG_RuntimeError, "Let's see how the bindings manage this exception!");
+#ifdef SWIG_fail
+ SWIG_fail;
+#endif
+ }
+ $1 = NULL;
+}
+%typemap(out) Foo trigger_internal_swig_exception
+{
+ TYPEMAP_OUT_INIT
+ SWIG_exception(SWIG_RuntimeError, "Let's see how the bindings manage this exception!");
+#ifdef SWIG_fail
+ SWIG_fail;
+#endif
+}
+
+%inline %{
+ #include <string>
+
+ class Foo {
+ static unsigned count;
+ static unsigned freearg_count;
+ public:
+ Foo() { ++count; }
+ ~Foo() { --count; }
+ static unsigned get_count() { return count; }
+ static unsigned get_freearg_count() { return freearg_count; }
+#ifndef SWIG
+ static void inc_freearg_count() { ++freearg_count; }
+#endif
+ };
+
+ unsigned Foo::count = 0;
+ unsigned Foo::freearg_count = 0;
+
+ static Foo* trigger_internal_swig_exception(const std::string& message, Foo* foo)
+ {
+ return (message == "null") ? NULL : foo;
+ }
+
+ static Foo trigger_internal_swig_exception(const std::string& message)
+ {
+ return Foo();
+ }
+
+%}