diff options
author | Alistair Delva <adelva@google.com> | 2024-04-10 14:15:29 -0700 |
---|---|---|
committer | Alistair Delva <adelva@google.com> | 2024-04-11 12:58:28 -0700 |
commit | d0f0f90be16c2ac553b5fa08512045273135147a (patch) | |
tree | 5d9ebb7a04807ea8a609ddd18b0162bc87530e4b /Examples/test-suite/exception_memory_leak.i | |
parent | 6ffc1dbf29ba98c4d8aa71ebc9b484e973fe1030 (diff) | |
download | swig-d0f0f90be16c2ac553b5fa08512045273135147a.tar.gz |
Update to v4.2.1HEADmastermainllvm-r522817
Change-Id: I47cef2be94299220d80265d949a95b58eee2c23b
Diffstat (limited to 'Examples/test-suite/exception_memory_leak.i')
-rw-r--r-- | Examples/test-suite/exception_memory_leak.i | 70 |
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(); + } + +%} |