From 7934561874b4f5da4061c62b0c28f6dd35ed05ae Mon Sep 17 00:00:00 2001 From: William S Fulton Date: Wed, 31 Aug 2022 08:35:55 +0100 Subject: [PATCH] Test/fixes to handle NULL pointer for unique_ptr/auto_ptr Also add missing unique_ptr tests for Lua and Racket. --- Examples/test-suite/cpp11_std_unique_ptr.i | 6 +- .../csharp/cpp11_std_unique_ptr_runme.cs | 8 ++ .../csharp/li_std_auto_ptr_runme.cs | 8 ++ .../d/cpp11_std_unique_ptr_runme.1.d | 8 ++ .../d/cpp11_std_unique_ptr_runme.2.d | 8 ++ .../test-suite/d/li_std_auto_ptr_runme.1.d | 8 ++ .../test-suite/d/li_std_auto_ptr_runme.2.d | 8 ++ .../java/cpp11_std_unique_ptr_runme.java | 8 ++ .../java/li_std_auto_ptr_runme.java | 8 ++ .../javascript/cpp11_std_unique_ptr_runme.js | 8 ++ .../javascript/li_std_auto_ptr_runme.js | 9 ++ Examples/test-suite/li_std_auto_ptr.i | 9 +- .../lua/cpp11_std_unique_ptr_runme.lua | 100 ++++++++++++++++++ .../test-suite/lua/li_std_auto_ptr_runme.lua | 7 ++ .../mzscheme/cpp11_std_unique_ptr_runme.scm | 100 ++++++++++++++++++ .../mzscheme/li_std_auto_ptr_runme.scm | 9 ++ .../octave/cpp11_std_unique_ptr_runme.m | 12 +++ .../test-suite/octave/li_std_auto_ptr_runme.m | 12 +++ .../perl5/cpp11_std_unique_ptr_runme.pl | 9 +- .../test-suite/perl5/li_std_auto_ptr_runme.pl | 9 +- .../php/cpp11_std_unique_ptr_runme.php | 7 ++ .../test-suite/php/li_std_auto_ptr_runme.php | 7 ++ .../python/cpp11_std_unique_ptr_runme.py | 8 ++ .../python/li_std_auto_ptr_runme.py | 8 ++ .../ruby/cpp11_std_unique_ptr_runme.rb | 6 ++ .../test-suite/ruby/li_std_auto_ptr_runme.rb | 6 ++ .../schemerunme/cpp11_std_unique_ptr.scm | 11 ++ .../schemerunme/li_std_auto_ptr.scm | 11 ++ .../tcl/cpp11_std_unique_ptr_runme.tcl | 9 ++ .../test-suite/tcl/li_std_auto_ptr_runme.tcl | 9 ++ Lib/lua/std_auto_ptr.i | 2 +- Lib/lua/std_unique_ptr.i | 2 +- 32 files changed, 434 insertions(+), 6 deletions(-) create mode 100644 Examples/test-suite/lua/cpp11_std_unique_ptr_runme.lua create mode 100644 Examples/test-suite/mzscheme/cpp11_std_unique_ptr_runme.scm diff --git a/Examples/test-suite/cpp11_std_unique_ptr.i b/Examples/test-suite/cpp11_std_unique_ptr.i index 414557507..f1ff84aae 100644 --- a/Examples/test-suite/cpp11_std_unique_ptr.i +++ b/Examples/test-suite/cpp11_std_unique_ptr.i @@ -63,7 +63,7 @@ std::string useKlassRawPtr(Klass* k) { std::string takeKlassUniquePtr(std::unique_ptr k) { // std::cout << "takeKlassUniquePtr " << std::hex << (Klass*)k.get() << std::endl; - std::string s(k->getLabel()); + std::string s(k ? k->getLabel() : "null smart pointer"); // std::cout << "takeKlassUniquePtr string: " << s << std::endl; return s; } @@ -84,6 +84,10 @@ std::unique_ptr makeKlassUniquePtr(const char* label) { return std::unique_ptr(new Klass(label)); } +std::unique_ptr makeNullUniquePtr() { + return std::unique_ptr(); +} + %} #endif diff --git a/Examples/test-suite/csharp/cpp11_std_unique_ptr_runme.cs b/Examples/test-suite/csharp/cpp11_std_unique_ptr_runme.cs index b24b5c204..04fafae42 100644 --- a/Examples/test-suite/csharp/cpp11_std_unique_ptr_runme.cs +++ b/Examples/test-suite/csharp/cpp11_std_unique_ptr_runme.cs @@ -87,6 +87,11 @@ public class cpp11_std_unique_ptr_runme { } // Dispose should not fail, even though already deleted checkCount(0); + cpp11_std_unique_ptr.takeKlassUniquePtr(null); + cpp11_std_unique_ptr.takeKlassUniquePtr(cpp11_std_unique_ptr.make_null()); + checkCount(0); + + // unique_ptr as output Klass k1 = cpp11_std_unique_ptr.makeKlassUniquePtr("first"); if (k1.getLabel() != "first") @@ -110,5 +115,8 @@ public class cpp11_std_unique_ptr_runme { k2.Dispose(); k2 = null; checkCount(0); + + if (cpp11_std_unique_ptr.makeNullUniquePtr() != null) + throw new Exception("null failure"); } } diff --git a/Examples/test-suite/csharp/li_std_auto_ptr_runme.cs b/Examples/test-suite/csharp/li_std_auto_ptr_runme.cs index ebbb23c69..a11b57fec 100644 --- a/Examples/test-suite/csharp/li_std_auto_ptr_runme.cs +++ b/Examples/test-suite/csharp/li_std_auto_ptr_runme.cs @@ -87,6 +87,11 @@ public class li_std_auto_ptr_runme { } // Dispose should not fail, even though already deleted checkCount(0); + li_std_auto_ptr.takeKlassAutoPtr(null); + li_std_auto_ptr.takeKlassAutoPtr(li_std_auto_ptr.make_null()); + checkCount(0); + + // auto_ptr as output Klass k1 = li_std_auto_ptr.makeKlassAutoPtr("first"); if (k1.getLabel() != "first") @@ -110,5 +115,8 @@ public class li_std_auto_ptr_runme { k2.Dispose(); k2 = null; checkCount(0); + + if (li_std_auto_ptr.makeNullAutoPtr() != null) + throw new Exception("null failure"); } } diff --git a/Examples/test-suite/d/cpp11_std_unique_ptr_runme.1.d b/Examples/test-suite/d/cpp11_std_unique_ptr_runme.1.d index ec89a0d28..b83392a85 100644 --- a/Examples/test-suite/d/cpp11_std_unique_ptr_runme.1.d +++ b/Examples/test-suite/d/cpp11_std_unique_ptr_runme.1.d @@ -87,6 +87,11 @@ void main() { } // dispose should not fail, even though already deleted checkCount(0); + takeKlassUniquePtr(null); + takeKlassUniquePtr(make_null()); + checkCount(0); + + // unique_ptr as output Klass k1 = makeKlassUniquePtr("first"); if (k1.getLabel() != "first") @@ -103,4 +108,7 @@ void main() { k2.dispose(); checkCount(0); + + if (makeNullUniquePtr() !is null) + throw new Exception("null failure"); } diff --git a/Examples/test-suite/d/cpp11_std_unique_ptr_runme.2.d b/Examples/test-suite/d/cpp11_std_unique_ptr_runme.2.d index ec89a0d28..b83392a85 100644 --- a/Examples/test-suite/d/cpp11_std_unique_ptr_runme.2.d +++ b/Examples/test-suite/d/cpp11_std_unique_ptr_runme.2.d @@ -87,6 +87,11 @@ void main() { } // dispose should not fail, even though already deleted checkCount(0); + takeKlassUniquePtr(null); + takeKlassUniquePtr(make_null()); + checkCount(0); + + // unique_ptr as output Klass k1 = makeKlassUniquePtr("first"); if (k1.getLabel() != "first") @@ -103,4 +108,7 @@ void main() { k2.dispose(); checkCount(0); + + if (makeNullUniquePtr() !is null) + throw new Exception("null failure"); } diff --git a/Examples/test-suite/d/li_std_auto_ptr_runme.1.d b/Examples/test-suite/d/li_std_auto_ptr_runme.1.d index 382f37e48..3ad86dc61 100644 --- a/Examples/test-suite/d/li_std_auto_ptr_runme.1.d +++ b/Examples/test-suite/d/li_std_auto_ptr_runme.1.d @@ -87,6 +87,11 @@ void main() { } // dispose should not fail, even though already deleted checkCount(0); + takeKlassAutoPtr(null); + takeKlassAutoPtr(make_null()); + checkCount(0); + + // auto_ptr as output Klass k1 = makeKlassAutoPtr("first"); if (k1.getLabel() != "first") @@ -103,4 +108,7 @@ void main() { k2.dispose(); checkCount(0); + + if (makeNullAutoPtr() !is null) + throw new Exception("null failure"); } diff --git a/Examples/test-suite/d/li_std_auto_ptr_runme.2.d b/Examples/test-suite/d/li_std_auto_ptr_runme.2.d index 382f37e48..3ad86dc61 100644 --- a/Examples/test-suite/d/li_std_auto_ptr_runme.2.d +++ b/Examples/test-suite/d/li_std_auto_ptr_runme.2.d @@ -87,6 +87,11 @@ void main() { } // dispose should not fail, even though already deleted checkCount(0); + takeKlassAutoPtr(null); + takeKlassAutoPtr(make_null()); + checkCount(0); + + // auto_ptr as output Klass k1 = makeKlassAutoPtr("first"); if (k1.getLabel() != "first") @@ -103,4 +108,7 @@ void main() { k2.dispose(); checkCount(0); + + if (makeNullAutoPtr() !is null) + throw new Exception("null failure"); } diff --git a/Examples/test-suite/java/cpp11_std_unique_ptr_runme.java b/Examples/test-suite/java/cpp11_std_unique_ptr_runme.java index 7fec2e0cd..6a8b9b8f2 100644 --- a/Examples/test-suite/java/cpp11_std_unique_ptr_runme.java +++ b/Examples/test-suite/java/cpp11_std_unique_ptr_runme.java @@ -107,6 +107,11 @@ public class cpp11_std_unique_ptr_runme { checkCount(0); } + cpp11_std_unique_ptr.takeKlassUniquePtr(null); + cpp11_std_unique_ptr.takeKlassUniquePtr(cpp11_std_unique_ptr.make_null()); + checkCount(0); + + // unique_ptr as output Klass k1 = cpp11_std_unique_ptr.makeKlassUniquePtr("first"); if (!k1.getLabel().equals("first")) @@ -125,5 +130,8 @@ public class cpp11_std_unique_ptr_runme { k2.delete(); k2 = null; checkCount(0); + + if (cpp11_std_unique_ptr.makeNullUniquePtr() != null) + throw new RuntimeException("null failure"); } } diff --git a/Examples/test-suite/java/li_std_auto_ptr_runme.java b/Examples/test-suite/java/li_std_auto_ptr_runme.java index 594908bbd..fd13b9215 100644 --- a/Examples/test-suite/java/li_std_auto_ptr_runme.java +++ b/Examples/test-suite/java/li_std_auto_ptr_runme.java @@ -107,6 +107,11 @@ public class li_std_auto_ptr_runme { checkCount(0); } + li_std_auto_ptr.takeKlassAutoPtr(null); + li_std_auto_ptr.takeKlassAutoPtr(li_std_auto_ptr.make_null()); + checkCount(0); + + // auto_ptr as output Klass k1 = li_std_auto_ptr.makeKlassAutoPtr("first"); if (!k1.getLabel().equals("first")) @@ -125,5 +130,8 @@ public class li_std_auto_ptr_runme { k2.delete(); k2 = null; checkCount(0); + + if (li_std_auto_ptr.makeNullAutoPtr() != null) + throw new RuntimeException("null failure"); } } diff --git a/Examples/test-suite/javascript/cpp11_std_unique_ptr_runme.js b/Examples/test-suite/javascript/cpp11_std_unique_ptr_runme.js index 567af2c29..8f358a4a7 100644 --- a/Examples/test-suite/javascript/cpp11_std_unique_ptr_runme.js +++ b/Examples/test-suite/javascript/cpp11_std_unique_ptr_runme.js @@ -90,6 +90,11 @@ var checkCount = function(expected_count) { checkCount(0); } +cpp11_std_unique_ptr.takeKlassUniquePtr(null); +cpp11_std_unique_ptr.takeKlassUniquePtr(cpp11_std_unique_ptr.make_null()); +checkCount(0); + + // unique_ptr as output k1 = cpp11_std_unique_ptr.makeKlassUniquePtr("first"); if (k1.getLabel() !== "first") @@ -110,3 +115,6 @@ if (k2.getLabel() !== "second") // Above not deleting the C++ object(node v12) - can't reliably control GC cpp11_std_unique_ptr.takeKlassUniquePtr(k2); checkCount(0); + +if (cpp11_std_unique_ptr.makeNullUniquePtr() != null) + throw new Error("null failure"); diff --git a/Examples/test-suite/javascript/li_std_auto_ptr_runme.js b/Examples/test-suite/javascript/li_std_auto_ptr_runme.js index 66eecffda..abe659878 100644 --- a/Examples/test-suite/javascript/li_std_auto_ptr_runme.js +++ b/Examples/test-suite/javascript/li_std_auto_ptr_runme.js @@ -90,6 +90,11 @@ var checkCount = function(expected_count) { checkCount(0); } +li_std_auto_ptr.takeKlassAutoPtr(null); +li_std_auto_ptr.takeKlassAutoPtr(li_std_auto_ptr.make_null()); +checkCount(0); + + // auto_ptr as output k1 = li_std_auto_ptr.makeKlassAutoPtr("first"); if (k1.getLabel() !== "first") @@ -109,4 +114,8 @@ if (k2.getLabel() !== "second") // delete k2; // Above not deleting the C++ object(node v12) - can't reliably control GC li_std_auto_ptr.takeKlassAutoPtr(k2); + +if (li_std_auto_ptr.makeNullAutoPtr() != null) + throw new Error("null failure"); + checkCount(0); diff --git a/Examples/test-suite/li_std_auto_ptr.i b/Examples/test-suite/li_std_auto_ptr.i index c02397c08..c76337c28 100644 --- a/Examples/test-suite/li_std_auto_ptr.i +++ b/Examples/test-suite/li_std_auto_ptr.i @@ -110,11 +110,14 @@ std::string useKlassRawPtr(Klass* k) { std::string takeKlassAutoPtr(std::auto_ptr k) { // std::cout << "takeKlassAutoPtr " << std::hex << (Klass*)k.get() << std::endl; - std::string s(k->getLabel()); + std::string s(k.get() ? k->getLabel() : "null smart pointer"); // std::cout << "takeKlassAutoPtr string: " << s << std::endl; return s; } +Klass *make_null() { + return 0; +} bool is_nullptr(Klass *p) { return p == 0; @@ -128,6 +131,10 @@ std::auto_ptr makeKlassAutoPtr(const char* label) { return std::auto_ptr(new Klass(label)); } +std::auto_ptr makeNullAutoPtr() { + return std::auto_ptr(); +} + %} #endif diff --git a/Examples/test-suite/lua/cpp11_std_unique_ptr_runme.lua b/Examples/test-suite/lua/cpp11_std_unique_ptr_runme.lua new file mode 100644 index 000000000..e22a09728 --- /dev/null +++ b/Examples/test-suite/lua/cpp11_std_unique_ptr_runme.lua @@ -0,0 +1,100 @@ +require("import") -- the import fn +import("cpp11_std_unique_ptr") -- import code + +-- catch "undefined" global variables +local env = _ENV -- Lua 5.2 +if not env then env = getfenv () end -- Lua 5.1 +setmetatable(env, {__index=function (t,i) error("undefined global variable `"..i.."'",2) end}) + + +function checkCount(expected_count) + -- call gc to make unused objects are collected + collectgarbage() + actual_count = cpp11_std_unique_ptr.Klass.getTotal_count() + if not (actual_count == expected_count) then + error("Counts incorrect, expected:"..expected_count.." actual:"..actual_count) + end +end + +--Test raw pointer handling involving virtual inheritance +kini = cpp11_std_unique_ptr.KlassInheritance("KlassInheritanceInput") +checkCount(1) +s = cpp11_std_unique_ptr.useKlassRawPtr(kini) +if not (s == "KlassInheritanceInput") then + error("Incorrect string: "..s) +end +kini = nil +checkCount(0) + +-- unique_ptr as input +kin = cpp11_std_unique_ptr.Klass("KlassInput") +checkCount(1) +s = cpp11_std_unique_ptr.takeKlassUniquePtr(kin) +checkCount(0) +if not (s == "KlassInput") then + error("Incorrect string: "..s) +end +if not (cpp11_std_unique_ptr.is_nullptr(kin)) then + error("is_nullptr failed") +end +kin = nil -- Should not fail, even though already deleted +checkCount(0) + +kin = cpp11_std_unique_ptr.Klass("KlassInput") +checkCount(1) +s = cpp11_std_unique_ptr.takeKlassUniquePtr(kin) +checkCount(0) +if not (s == "KlassInput") then + error("Incorrect string: "..s) +end +if not (cpp11_std_unique_ptr.is_nullptr(kin)) then + error("is_nullptr failed") +end +s, msg = pcall(function() cpp11_std_unique_ptr.takeKlassUniquePtr(kin) end) +assert(s == false and msg == "Cannot release ownership as memory is not owned for argument 1 of type 'Klass *' in takeKlassUniquePtr") + +kin = nil -- Should not fail, even though already deleted +checkCount(0) + +kin = cpp11_std_unique_ptr.Klass("KlassInput") +notowned = cpp11_std_unique_ptr.get_not_owned_ptr(kin) +s, msg = pcall(function() cpp11_std_unique_ptr.takeKlassUniquePtr(notowned) end) +assert(s == false and msg == "Cannot release ownership as memory is not owned for argument 1 of type 'Klass *' in takeKlassUniquePtr") +checkCount(1) +kin = nil +checkCount(0) + +kini = cpp11_std_unique_ptr.KlassInheritance("KlassInheritanceInput") +checkCount(1) +s = cpp11_std_unique_ptr.takeKlassUniquePtr(kini) +checkCount(0) +if not (s == "KlassInheritanceInput") then + error("Incorrect string: "..s) +end +if not (cpp11_std_unique_ptr.is_nullptr(kini)) then + error("is_nullptr failed") +end +kini = nil -- Should not fail, even though already deleted +checkCount(0) + +cpp11_std_unique_ptr.takeKlassUniquePtr(nil); +cpp11_std_unique_ptr.takeKlassUniquePtr(cpp11_std_unique_ptr.make_null()); +checkCount(0); + + +-- unique_ptr as output +k1 = cpp11_std_unique_ptr.makeKlassUniquePtr("first") +k2 = cpp11_std_unique_ptr.makeKlassUniquePtr("second") +checkCount(2) + +k1 = nil +checkCount(1) + +if not (k2:getLabel() == "second") then + error("wrong object label") +end + +k2 = nil +checkCount(0) + +assert(cpp11_std_unique_ptr.makeNullUniquePtr() == nil) diff --git a/Examples/test-suite/lua/li_std_auto_ptr_runme.lua b/Examples/test-suite/lua/li_std_auto_ptr_runme.lua index f677a6e4e..d605af692 100644 --- a/Examples/test-suite/lua/li_std_auto_ptr_runme.lua +++ b/Examples/test-suite/lua/li_std_auto_ptr_runme.lua @@ -77,6 +77,11 @@ end kini = nil -- Should not fail, even though already deleted checkCount(0) +li_std_auto_ptr.takeKlassAutoPtr(nil); +li_std_auto_ptr.takeKlassAutoPtr(li_std_auto_ptr.make_null()); +checkCount(0); + + -- auto_ptr as output k1 = li_std_auto_ptr.makeKlassAutoPtr("first") k2 = li_std_auto_ptr.makeKlassAutoPtr("second") @@ -91,3 +96,5 @@ end k2 = nil checkCount(0) + +assert(li_std_auto_ptr.makeNullAutoPtr() == nil) diff --git a/Examples/test-suite/mzscheme/cpp11_std_unique_ptr_runme.scm b/Examples/test-suite/mzscheme/cpp11_std_unique_ptr_runme.scm new file mode 100644 index 000000000..5996586af --- /dev/null +++ b/Examples/test-suite/mzscheme/cpp11_std_unique_ptr_runme.scm @@ -0,0 +1,100 @@ +(load-extension "cpp11_std_unique_ptr.so") +(require (lib "defmacro.ss")) + +; Copied from ../schemerunme/cpp11_std_unique_ptr.scm and modified for exceptions + +; Define an equivalent to Guile's gc procedure +(define-macro (gc) + `(collect-garbage 'major)) + +(define checkCount + (lambda (expected-count) + (define actual-count (Klass-getTotal-count)) + (unless (= actual-count expected-count) (error (format "Counts incorrect, expected:~a actual:~a" expected-count actual-count))))) + +; Test raw pointer handling involving virtual inheritance +(define kini (new-KlassInheritance "KlassInheritanceInput")) +(checkCount 1) +(define s (useKlassRawPtr kini)) +(unless (string=? s "KlassInheritanceInput") + (error "Incorrect string: " s)) +(set! kini '()) (gc) +(checkCount 0) + +; unique_ptr as input +(define kin (new-Klass "KlassInput")) +(checkCount 1) +(define s (takeKlassUniquePtr kin)) +(checkCount 0) +(unless (string=? s "KlassInput") + (error "Incorrect string: " s)) +(unless (is-nullptr kin) + (error "is_nullptr failed")) +(set! kini '()) (gc) ; Should not fail, even though already deleted +(checkCount 0) + +(define kin (new-Klass "KlassInput")) +(checkCount 1) +(define s (takeKlassUniquePtr kin)) +(checkCount 0) +(unless (string=? s "KlassInput") + (error "Incorrect string: " s)) +(unless (is-nullptr kin) + (error "is_nullptr failed")) + +(define exception_thrown "no exception thrown for kin") +(with-handlers ([exn:fail? (lambda (exn) + (set! exception_thrown (exn-message exn)))]) + (takeKlassUniquePtr kin)) +(unless (string=? exception_thrown "takeKlassUniquePtr: cannot release ownership as memory is not owned for argument 1 of type 'Klass *'") + (error "Wrong or no exception thrown: " exception_thrown)) +(set! kin '()) (gc) ; Should not fail, even though already deleted +(checkCount 0) + +(define kin (new-Klass "KlassInput")) +(define notowned (get-not-owned-ptr kin)) +(set! exception_thrown "no exception thrown for notowned") +(with-handlers ([exn:fail? (lambda (exn) + (set! exception_thrown (exn-message exn)))]) + (takeKlassUniquePtr notowned)) +(unless (string=? exception_thrown "takeKlassUniquePtr: cannot release ownership as memory is not owned for argument 1 of type 'Klass *'") + (error "Wrong or no exception thrown: " exception_thrown)) +(checkCount 1) +(set! kin '()) (gc) +(checkCount 0) + +(define kini (new-KlassInheritance "KlassInheritanceInput")) +(checkCount 1) +(define s (takeKlassUniquePtr kini)) +(checkCount 0) +(unless (string=? s "KlassInheritanceInput") + (error "Incorrect string: " s)) +(unless (is-nullptr kini) + (error "is_nullptr failed")) +(set! kini '()) (gc) ; Should not fail, even though already deleted +(checkCount 0) + +(define null '()) +(takeKlassUniquePtr null) +(takeKlassUniquePtr (make-null)) +(checkCount 0) + + +; unique_ptr as output +(define k1 (makeKlassUniquePtr "first")) +(define k2 (makeKlassUniquePtr "second")) +(checkCount 2) + +(set! k1 '()) (gc) +(checkCount 1) + +(unless (string=? (Klass-getLabel k2) "second") + (error "wrong object label" )) + +(set! k2 '()) (gc) +(checkCount 0) + +(unless (null? (makeNullUniquePtr)) + (error "null failure")) + +(exit 0) diff --git a/Examples/test-suite/mzscheme/li_std_auto_ptr_runme.scm b/Examples/test-suite/mzscheme/li_std_auto_ptr_runme.scm index 6335d4eb8..f52829163 100644 --- a/Examples/test-suite/mzscheme/li_std_auto_ptr_runme.scm +++ b/Examples/test-suite/mzscheme/li_std_auto_ptr_runme.scm @@ -74,6 +74,12 @@ (set! kini '()) (gc) ; Should not fail, even though already deleted (checkCount 0) +(define null '()) +(takeKlassAutoPtr null) +(takeKlassAutoPtr (make-null)) +(checkCount 0) + + ; auto_ptr as output (define k1 (makeKlassAutoPtr "first")) (define k2 (makeKlassAutoPtr "second")) @@ -88,4 +94,7 @@ (set! k2 '()) (gc) (checkCount 0) +(unless (null? (makeNullAutoPtr)) + (error "null failure")) + (exit 0) diff --git a/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m b/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m index 7d1c0e41a..fd72a522b 100644 --- a/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m +++ b/Examples/test-suite/octave/cpp11_std_unique_ptr_runme.m @@ -93,6 +93,13 @@ endif clear kini; # Should not fail, even though already deleted checkCount(0); +null = []; # NULL pointer +null_ptr = make_null(); +takeKlassUniquePtr([]); +takeKlassUniquePtr(null); +takeKlassUniquePtr(null_ptr); +checkCount(0); + # unique_ptr as output k1 = makeKlassUniquePtr("first"); @@ -112,3 +119,8 @@ endif clear k2; checkCount(0); + +null_smart_prt = makeNullUniquePtr(); +assert(ismatrix(null_smart_prt)) +assert(size(null_smart_prt) == size([])) +assert(isequal([], null_smart_prt)) diff --git a/Examples/test-suite/octave/li_std_auto_ptr_runme.m b/Examples/test-suite/octave/li_std_auto_ptr_runme.m index 832d75faf..c8d00afbd 100644 --- a/Examples/test-suite/octave/li_std_auto_ptr_runme.m +++ b/Examples/test-suite/octave/li_std_auto_ptr_runme.m @@ -93,6 +93,13 @@ endif clear kini; # Should not fail, even though already deleted checkCount(0); +null = []; # NULL pointer +null_ptr = make_null(); +takeKlassAutoPtr([]); +takeKlassAutoPtr(null); +takeKlassAutoPtr(null_ptr); +checkCount(0); + # auto_ptr as output k1 = makeKlassAutoPtr("first"); @@ -112,3 +119,8 @@ endif clear k2; checkCount(0); + +null_smart_prt = makeNullAutoPtr(); +assert(ismatrix(null_smart_prt)) +assert(size(null_smart_prt) == size([])) +assert(isequal([], null_smart_prt)) diff --git a/Examples/test-suite/perl5/cpp11_std_unique_ptr_runme.pl b/Examples/test-suite/perl5/cpp11_std_unique_ptr_runme.pl index 3e3e7f4b1..793ba733f 100644 --- a/Examples/test-suite/perl5/cpp11_std_unique_ptr_runme.pl +++ b/Examples/test-suite/perl5/cpp11_std_unique_ptr_runme.pl @@ -1,6 +1,6 @@ use strict; use warnings; -use Test::More tests => 28; +use Test::More tests => 30; BEGIN { use_ok('cpp11_std_unique_ptr') } require_ok('cpp11_std_unique_ptr'); @@ -73,6 +73,11 @@ sub checkCount { checkCount(0); } +cpp11_std_unique_ptr::takeKlassUniquePtr(undef); +cpp11_std_unique_ptr::takeKlassUniquePtr(cpp11_std_unique_ptr::make_null()); +checkCount(0); + + # unique_ptr as output my $k1 = cpp11_std_unique_ptr::makeKlassUniquePtr("first"); my $k2 = cpp11_std_unique_ptr::makeKlassUniquePtr("second"); @@ -85,3 +90,5 @@ is($k2->getLabel, "second", "proper label"); undef $k2; checkCount(0); + +is(cpp11_std_unique_ptr::makeNullUniquePtr(), undef); diff --git a/Examples/test-suite/perl5/li_std_auto_ptr_runme.pl b/Examples/test-suite/perl5/li_std_auto_ptr_runme.pl index cc71d9128..cd68ddedf 100644 --- a/Examples/test-suite/perl5/li_std_auto_ptr_runme.pl +++ b/Examples/test-suite/perl5/li_std_auto_ptr_runme.pl @@ -1,6 +1,6 @@ use strict; use warnings; -use Test::More tests => 28; +use Test::More tests => 30; BEGIN { use_ok('li_std_auto_ptr') } require_ok('li_std_auto_ptr'); @@ -73,6 +73,11 @@ sub checkCount { checkCount(0); } +li_std_auto_ptr::takeKlassAutoPtr(undef); +li_std_auto_ptr::takeKlassAutoPtr(li_std_auto_ptr::make_null()); +checkCount(0); + + # auto_ptr as output my $k1 = li_std_auto_ptr::makeKlassAutoPtr("first"); my $k2 = li_std_auto_ptr::makeKlassAutoPtr("second"); @@ -85,3 +90,5 @@ is($k2->getLabel, "second", "proper label"); undef $k2; checkCount(0); + +is(li_std_auto_ptr::makeNullAutoPtr(), undef); diff --git a/Examples/test-suite/php/cpp11_std_unique_ptr_runme.php b/Examples/test-suite/php/cpp11_std_unique_ptr_runme.php index 2b169e748..77b3f375a 100644 --- a/Examples/test-suite/php/cpp11_std_unique_ptr_runme.php +++ b/Examples/test-suite/php/cpp11_std_unique_ptr_runme.php @@ -79,6 +79,11 @@ try { $kini = NULL; # Should not fail, even though already deleted checkCount(0); +takeKlassUniquePtr(NULL); +takeKlassUniquePtr(make_null()); +checkCount(0); + + # unique_ptr as output $k1 = makeKlassUniquePtr("first"); $k2 = makeKlassUniquePtr("second"); @@ -92,4 +97,6 @@ check::equal($k2->getLabel(), "second", "proper label"); $k2 = NULL; checkCount(0); +check::equal(makeNullUniquePtr(), NULL); + check::done(); diff --git a/Examples/test-suite/php/li_std_auto_ptr_runme.php b/Examples/test-suite/php/li_std_auto_ptr_runme.php index 16129490a..caf604a3c 100644 --- a/Examples/test-suite/php/li_std_auto_ptr_runme.php +++ b/Examples/test-suite/php/li_std_auto_ptr_runme.php @@ -79,6 +79,11 @@ try { $kini = NULL; # Should not fail, even though already deleted checkCount(0); +takeKlassAutoPtr(NULL); +takeKlassAutoPtr(make_null()); +checkCount(0); + + # auto_ptr as output $k1 = makeKlassAutoPtr("first"); $k2 = makeKlassAutoPtr("second"); @@ -92,4 +97,6 @@ check::equal($k2->getLabel(), "second", "proper label"); $k2 = NULL; checkCount(0); +check::equal(makeNullAutoPtr(), NULL); + check::done(); diff --git a/Examples/test-suite/python/cpp11_std_unique_ptr_runme.py b/Examples/test-suite/python/cpp11_std_unique_ptr_runme.py index e822ddf09..ac3f52c23 100644 --- a/Examples/test-suite/python/cpp11_std_unique_ptr_runme.py +++ b/Examples/test-suite/python/cpp11_std_unique_ptr_runme.py @@ -77,6 +77,11 @@ if not is_nullptr(kini): del kini # Should not fail, even though already deleted checkCount(0) +takeKlassUniquePtr(None) +takeKlassUniquePtr(make_null()) +checkCount(0) + + # unique_ptr as output k1 = makeKlassUniquePtr("first") k2 = makeKlassUniquePtr("second") @@ -90,3 +95,6 @@ if k2.getLabel() != "second": del k2 checkCount(0) + +if (makeNullUniquePtr() != None): + raise RuntimeError("null failure") diff --git a/Examples/test-suite/python/li_std_auto_ptr_runme.py b/Examples/test-suite/python/li_std_auto_ptr_runme.py index 9c68f3e52..c3c5424c6 100644 --- a/Examples/test-suite/python/li_std_auto_ptr_runme.py +++ b/Examples/test-suite/python/li_std_auto_ptr_runme.py @@ -77,6 +77,11 @@ if not is_nullptr(kini): del kini # Should not fail, even though already deleted checkCount(0) +takeKlassAutoPtr(None) +takeKlassAutoPtr(make_null()) +checkCount(0) + + # auto_ptr as output k1 = makeKlassAutoPtr("first") k2 = makeKlassAutoPtr("second") @@ -90,3 +95,6 @@ if k2.getLabel() != "second": del k2 checkCount(0) + +if (makeNullAutoPtr() != None): + raise RuntimeError("null failure") diff --git a/Examples/test-suite/ruby/cpp11_std_unique_ptr_runme.rb b/Examples/test-suite/ruby/cpp11_std_unique_ptr_runme.rb index c623b45c5..fd43920b7 100644 --- a/Examples/test-suite/ruby/cpp11_std_unique_ptr_runme.rb +++ b/Examples/test-suite/ruby/cpp11_std_unique_ptr_runme.rb @@ -116,6 +116,11 @@ end kini = nil checkCount(0) +Cpp11_std_unique_ptr::takeKlassUniquePtr(nil) +Cpp11_std_unique_ptr::takeKlassUniquePtr(Cpp11_std_unique_ptr::make_null()) +checkCount(0) + + # unique_ptr as output k1 = Cpp11_std_unique_ptr::makeKlassUniquePtr("first") k2 = Cpp11_std_unique_ptr::makeKlassUniquePtr("second") @@ -131,3 +136,4 @@ gc_check(1) k2 = nil gc_check(0) +swig_assert_equal_simple(Cpp11_std_unique_ptr::makeNullUniquePtr(), nil) diff --git a/Examples/test-suite/ruby/li_std_auto_ptr_runme.rb b/Examples/test-suite/ruby/li_std_auto_ptr_runme.rb index 6780763c0..a6aa09be2 100644 --- a/Examples/test-suite/ruby/li_std_auto_ptr_runme.rb +++ b/Examples/test-suite/ruby/li_std_auto_ptr_runme.rb @@ -116,6 +116,11 @@ end kini = nil checkCount(0) +Li_std_auto_ptr::takeKlassAutoPtr(nil) +Li_std_auto_ptr::takeKlassAutoPtr(Li_std_auto_ptr::make_null()) +checkCount(0) + + # auto_ptr as output k1 = Li_std_auto_ptr::makeKlassAutoPtr("first") k2 = Li_std_auto_ptr::makeKlassAutoPtr("second") @@ -131,3 +136,4 @@ gc_check(1) k2 = nil gc_check(0) +swig_assert_equal_simple(Li_std_auto_ptr::makeNullAutoPtr(), nil) diff --git a/Examples/test-suite/schemerunme/cpp11_std_unique_ptr.scm b/Examples/test-suite/schemerunme/cpp11_std_unique_ptr.scm index 49184005a..b181ffcf3 100644 --- a/Examples/test-suite/schemerunme/cpp11_std_unique_ptr.scm +++ b/Examples/test-suite/schemerunme/cpp11_std_unique_ptr.scm @@ -58,6 +58,14 @@ (set! kini '()) (gc) ; Should not fail, even though already deleted (checkCount 0) +(define null '()) +(takeKlassUniquePtr null) +(define nullnil #nil) +(takeKlassUniquePtr nullnil) +(takeKlassUniquePtr (make-null)) +(checkCount 0) + + ; unique_ptr as output (define k1 (makeKlassUniquePtr "first")) (define k2 (makeKlassUniquePtr "second")) @@ -72,4 +80,7 @@ (set! k2 '()) (gc) (checkCount 0) +(unless (null? (makeNullUniquePtr)) + (error "null failure")) + (exit 0) diff --git a/Examples/test-suite/schemerunme/li_std_auto_ptr.scm b/Examples/test-suite/schemerunme/li_std_auto_ptr.scm index f23a00c41..cad0c8b80 100644 --- a/Examples/test-suite/schemerunme/li_std_auto_ptr.scm +++ b/Examples/test-suite/schemerunme/li_std_auto_ptr.scm @@ -58,6 +58,14 @@ (set! kini '()) (gc) ; Should not fail, even though already deleted (checkCount 0) +(define null '()) +(takeKlassAutoPtr null) +(define nullnil #nil) +(takeKlassAutoPtr nullnil) +(takeKlassAutoPtr (make-null)) +(checkCount 0) + + ; auto_ptr as output (define k1 (makeKlassAutoPtr "first")) (define k2 (makeKlassAutoPtr "second")) @@ -72,4 +80,7 @@ (set! k2 '()) (gc) (checkCount 0) +(unless (null? (makeNullAutoPtr)) + (error "null failure")) + (exit 0) diff --git a/Examples/test-suite/tcl/cpp11_std_unique_ptr_runme.tcl b/Examples/test-suite/tcl/cpp11_std_unique_ptr_runme.tcl index 380985f4e..d61ffb78a 100644 --- a/Examples/test-suite/tcl/cpp11_std_unique_ptr_runme.tcl +++ b/Examples/test-suite/tcl/cpp11_std_unique_ptr_runme.tcl @@ -126,6 +126,11 @@ if {![is_nullptr kini]} { kini -delete # Should not fail, even though already deleted checkCount 0 +takeKlassUniquePtr "NULL" +takeKlassUniquePtr [make_null] +checkCount 0 + + # unique_ptr as output set k1 [makeKlassUniquePtr "first"] set k2 [makeKlassUniquePtr "second"] @@ -140,3 +145,7 @@ if {[$k2 getLabel] != "second"} { $k2 -delete checkCount 0 + +if {[makeNullUniquePtr] != "NULL"} { + error "null failure" +} diff --git a/Examples/test-suite/tcl/li_std_auto_ptr_runme.tcl b/Examples/test-suite/tcl/li_std_auto_ptr_runme.tcl index f88be1aed..d7c019026 100644 --- a/Examples/test-suite/tcl/li_std_auto_ptr_runme.tcl +++ b/Examples/test-suite/tcl/li_std_auto_ptr_runme.tcl @@ -97,6 +97,11 @@ if {![is_nullptr kini]} { kini -delete # Should not fail, even though already deleted checkCount 0 +takeKlassAutoPtr "NULL" +takeKlassAutoPtr [make_null] +checkCount 0 + + # auto_ptr as output set k1 [makeKlassAutoPtr "first"] set k2 [makeKlassAutoPtr "second"] @@ -111,3 +116,7 @@ if {[$k2 getLabel] != "second"} { $k2 -delete checkCount 0 + +if {[makeNullAutoPtr] != "NULL"} { + error "null failure" +} diff --git a/Lib/lua/std_auto_ptr.i b/Lib/lua/std_auto_ptr.i index b0978963b..3952d6dd6 100644 --- a/Lib/lua/std_auto_ptr.i +++ b/Lib/lua/std_auto_ptr.i @@ -9,7 +9,7 @@ * ----------------------------------------------------------------------------- */ %define %auto_ptr(TYPE) -%typemap(in, checkfn="lua_isuserdata", noblock=1) std::auto_ptr< TYPE > (void *argp = 0, int res = 0) { +%typemap(in, checkfn="SWIG_isptrtype", noblock=1) std::auto_ptr< TYPE > (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr(L, $input, &argp, $descriptor(TYPE *), SWIG_POINTER_RELEASE); if (!SWIG_IsOK(res)) { if (res == SWIG_ERROR_RELEASE_NOT_OWNED) { diff --git a/Lib/lua/std_unique_ptr.i b/Lib/lua/std_unique_ptr.i index de84b2497..4c1c1fde5 100644 --- a/Lib/lua/std_unique_ptr.i +++ b/Lib/lua/std_unique_ptr.i @@ -9,7 +9,7 @@ * ----------------------------------------------------------------------------- */ %define %unique_ptr(TYPE) -%typemap(in, checkfn="lua_isuserdata", noblock=1) std::unique_ptr< TYPE > (void *argp = 0, int res = 0) { +%typemap(in, checkfn="SWIG_isptrtype", noblock=1) std::unique_ptr< TYPE > (void *argp = 0, int res = 0) { res = SWIG_ConvertPtr(L, $input, &argp, $descriptor(TYPE *), SWIG_POINTER_RELEASE); if (!SWIG_IsOK(res)) { if (res == SWIG_ERROR_RELEASE_NOT_OWNED) {