Fix directorin SWIGTYPE typemaps to make a copy as these are used for pass by value.
Closes #434
This commit is contained in:
parent
b062d998e9
commit
98a31ff633
15 changed files with 180 additions and 14 deletions
|
|
@ -174,7 +174,6 @@ CPP_TEST_CASES += \
|
|||
director_abstract \
|
||||
director_alternating \
|
||||
director_basic \
|
||||
director_property \
|
||||
director_binary_string \
|
||||
director_classes \
|
||||
director_classic \
|
||||
|
|
@ -189,12 +188,14 @@ CPP_TEST_CASES += \
|
|||
director_ignore \
|
||||
director_keywords \
|
||||
director_namespace_clash \
|
||||
director_nested \
|
||||
director_nspace \
|
||||
director_nspace_director_name_collision \
|
||||
director_nested \
|
||||
director_overload \
|
||||
director_overload2 \
|
||||
director_pass_by_value \
|
||||
director_primitives \
|
||||
director_property \
|
||||
director_protected \
|
||||
director_protected_overloaded \
|
||||
director_redefined \
|
||||
|
|
|
|||
43
Examples/test-suite/csharp/director_pass_by_value_runme.cs
Normal file
43
Examples/test-suite/csharp/director_pass_by_value_runme.cs
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
using System;
|
||||
using director_pass_by_valueNamespace;
|
||||
|
||||
public class runme
|
||||
{
|
||||
private static void WaitForGC()
|
||||
{
|
||||
System.GC.Collect();
|
||||
System.GC.WaitForPendingFinalizers();
|
||||
System.Threading.Thread.Sleep(10);
|
||||
}
|
||||
|
||||
static void Main()
|
||||
{
|
||||
runme r = new runme();
|
||||
r.run();
|
||||
}
|
||||
|
||||
void run()
|
||||
{
|
||||
Caller caller = new Caller();
|
||||
caller.call_virtualMethod(new director_pass_by_value_Derived());
|
||||
{
|
||||
int countdown = 5;
|
||||
while (true) {
|
||||
WaitForGC();
|
||||
if (--countdown == 0)
|
||||
break;
|
||||
};
|
||||
}
|
||||
// bug was the passByVal 'global' object was destroyed after the call to virtualMethod had finished.
|
||||
int ret = runme.passByVal.getVal();
|
||||
if (ret != 0x12345678)
|
||||
throw new Exception("Bad return value, got " + ret.ToString("x"));
|
||||
}
|
||||
public static PassedByValue passByVal;
|
||||
}
|
||||
|
||||
class director_pass_by_value_Derived : DirectorPassByValueAbstractBase {
|
||||
public override void virtualMethod(PassedByValue pbv) {
|
||||
runme.passByVal = pbv;
|
||||
}
|
||||
}
|
||||
30
Examples/test-suite/director_pass_by_value.i
Normal file
30
Examples/test-suite/director_pass_by_value.i
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
%module(directors="1") director_pass_by_value
|
||||
%director DirectorPassByValueAbstractBase;
|
||||
|
||||
%inline %{
|
||||
class PassedByValue {
|
||||
int val;
|
||||
public:
|
||||
PassedByValue() { val = 0x12345678; }
|
||||
int getVal() { return val; }
|
||||
};
|
||||
|
||||
int doSomething(int x) {
|
||||
int yy[256];
|
||||
yy[0] =0x9876;
|
||||
return yy[0];
|
||||
}
|
||||
|
||||
class DirectorPassByValueAbstractBase {
|
||||
public:
|
||||
virtual void virtualMethod(PassedByValue pbv) = 0;
|
||||
virtual ~DirectorPassByValueAbstractBase () {}
|
||||
};
|
||||
|
||||
class Caller {
|
||||
public:
|
||||
void call_virtualMethod(DirectorPassByValueAbstractBase &f) {
|
||||
f.virtualMethod(PassedByValue());
|
||||
}
|
||||
};
|
||||
%}
|
||||
48
Examples/test-suite/java/director_pass_by_value_runme.java
Normal file
48
Examples/test-suite/java/director_pass_by_value_runme.java
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
|
||||
import director_pass_by_value.*;
|
||||
|
||||
public class director_pass_by_value_runme {
|
||||
|
||||
static {
|
||||
try {
|
||||
System.loadLibrary("director_pass_by_value");
|
||||
} 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);
|
||||
}
|
||||
}
|
||||
|
||||
private static void WaitForGC() {
|
||||
System.gc();
|
||||
System.runFinalization();
|
||||
try {
|
||||
java.lang.Thread.sleep(10);
|
||||
} catch (java.lang.InterruptedException e) {
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String argv[]) {
|
||||
Caller caller = new Caller();
|
||||
caller.call_virtualMethod(new director_pass_by_value_Derived());
|
||||
{
|
||||
int countdown = 5;
|
||||
while (true) {
|
||||
WaitForGC();
|
||||
if (--countdown == 0)
|
||||
break;
|
||||
};
|
||||
}
|
||||
// bug was the passByVal 'global' object was destroyed after the call to virtualMethod had finished.
|
||||
int ret = director_pass_by_value_runme.passByVal.getVal();
|
||||
if (ret != 0x12345678)
|
||||
throw new RuntimeException("Bad return value, got " + Integer.toHexString(ret));
|
||||
}
|
||||
|
||||
static PassedByValue passByVal;
|
||||
}
|
||||
|
||||
class director_pass_by_value_Derived extends DirectorPassByValueAbstractBase {
|
||||
public void virtualMethod(PassedByValue pbv) {
|
||||
director_pass_by_value_runme.passByVal = pbv;
|
||||
}
|
||||
}
|
||||
24
Examples/test-suite/php/director_pass_by_value_runme.php
Normal file
24
Examples/test-suite/php/director_pass_by_value_runme.php
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
require "tests.php";
|
||||
require "director_pass_by_value.php";
|
||||
|
||||
$passByVal = null;
|
||||
|
||||
class director_pass_by_value_Derived extends DirectorPassByValueAbstractBase {
|
||||
function virtualMethod($b) {
|
||||
global $passByVal;
|
||||
$passByVal = $b;
|
||||
}
|
||||
}
|
||||
|
||||
# bug was the passByVal global object was destroyed after the call to virtualMethod had finished.
|
||||
$caller = new Caller();
|
||||
$caller->call_virtualMethod(new director_pass_by_value_Derived());
|
||||
$ret = $passByVal->getVal();
|
||||
if ($ret != 0x12345678) {
|
||||
check::fail("Bad return value, got " . dechex($ret));
|
||||
}
|
||||
|
||||
check::done();
|
||||
?>
|
||||
13
Examples/test-suite/python/director_pass_by_value_runme.py
Normal file
13
Examples/test-suite/python/director_pass_by_value_runme.py
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
import director_pass_by_value
|
||||
|
||||
passByVal = None
|
||||
class director_pass_by_value_Derived(director_pass_by_value.DirectorPassByValueAbstractBase):
|
||||
def virtualMethod(self, b):
|
||||
global passByVal
|
||||
passByVal = b
|
||||
|
||||
# bug was the passByVal global object was destroyed after the call to virtualMethod had finished.
|
||||
director_pass_by_value.Caller().call_virtualMethod(director_pass_by_value_Derived())
|
||||
ret = passByVal.getVal();
|
||||
if ret != 0x12345678:
|
||||
raise RuntimeError("Bad return value, got " + hex(ret))
|
||||
Loading…
Add table
Add a link
Reference in a new issue