From b88fe498cab92e18ad0a7b12e5ca9a49d4ac4ec0 Mon Sep 17 00:00:00 2001 From: Erez Geva Date: Wed, 11 May 2022 01:10:12 +0200 Subject: [PATCH] Fix argcargv.i in Perl5, Tcl, PHP Add missing type map for type check. Add testing of argcargv.i for Perl5, Tcl, PHP and Ruby. Signed-off-by: Erez Geva --- .../test-suite/perl5/argcargvtest_runme.pl | 20 ++++++++++++ .../test-suite/php/argcargvtest_runme.php | 29 +++++++++++++++++ .../test-suite/ruby/argcargvtest_runme.rb | 32 +++++++++++++++++++ .../test-suite/tcl/argcargvtest_runme.tcl | 28 ++++++++++++++++ Lib/perl5/argcargv.i | 5 +++ Lib/php/argcargv.i | 4 +++ Lib/tcl/argcargv.i | 5 +++ 7 files changed, 123 insertions(+) create mode 100644 Examples/test-suite/perl5/argcargvtest_runme.pl create mode 100644 Examples/test-suite/php/argcargvtest_runme.php create mode 100644 Examples/test-suite/ruby/argcargvtest_runme.rb create mode 100644 Examples/test-suite/tcl/argcargvtest_runme.tcl diff --git a/Examples/test-suite/perl5/argcargvtest_runme.pl b/Examples/test-suite/perl5/argcargvtest_runme.pl new file mode 100644 index 000000000..c4157ebf4 --- /dev/null +++ b/Examples/test-suite/perl5/argcargvtest_runme.pl @@ -0,0 +1,20 @@ +use strict; +use warnings; +use Test::More tests => 8; +BEGIN { use_ok('argcargvtest') } +require_ok('argcargvtest'); + +my $largs = ["hi", "hola", "hello"]; +is(argcargvtest::mainc($largs), 3, "test main typemap 1"); + +my $targs = ["hi", "hola"]; +is(argcargvtest::mainv($targs, 1), "hola", "test main typemap 2"); + +my $errorVal = 0; +my $ret = eval qq(argcargvtest::mainv("hello", 1); \$errorVal = 1;); +is($ret, undef, "test main typemap 3"); +is($errorVal, 0, "test main typemap 4"); + +is(argcargvtest::initializeApp($largs), undef, "test main typemap 5"); + +ok(1, "done"); diff --git a/Examples/test-suite/php/argcargvtest_runme.php b/Examples/test-suite/php/argcargvtest_runme.php new file mode 100644 index 000000000..4a675d0ed --- /dev/null +++ b/Examples/test-suite/php/argcargvtest_runme.php @@ -0,0 +1,29 @@ + e + $ret = 1 +end + +if $error == 1 or $ret != 1 + raise RuntimeError, "bad main typemap" +end + +initializeApp($largs) diff --git a/Examples/test-suite/tcl/argcargvtest_runme.tcl b/Examples/test-suite/tcl/argcargvtest_runme.tcl new file mode 100644 index 000000000..14c0e92cb --- /dev/null +++ b/Examples/test-suite/tcl/argcargvtest_runme.tcl @@ -0,0 +1,28 @@ +if [ catch { load ./argcargvtest[info sharedlibextension] argcargvtest} err_msg ] { + puts stderr "Could not load shared object:\n$err_msg" +} + +set largs {hi hola hello} +if {[mainc $largs] != 3} { + puts stderr "bad main typemap" + exit 1 +} + +set targs {hi hola} +if {[mainv $targs 1] != "hola"} { + puts stderr "bad main typemap" + exit 1 +} + +set targs " hi hola " +if {[mainv $targs 1] != "hola"} { + puts stderr "bad main typemap" + exit 1 +} + +if { ! [ catch { mainv("hello", 1) } ] } { + puts stderr "bad main typemap" + exit 1 +} + +initializeApp $largs diff --git a/Lib/perl5/argcargv.i b/Lib/perl5/argcargv.i index de7b626e0..5c3968e37 100644 --- a/Lib/perl5/argcargv.i +++ b/Lib/perl5/argcargv.i @@ -24,6 +24,11 @@ $2[i] = NULL; } +%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { + AV *av = (AV *)SvRV($input); + $1 = SvTYPE(av) == SVt_PVAV; +} + %typemap(freearg) (int ARGC, char **ARGV) { if ($2 != NULL) { free((void *)$2); diff --git a/Lib/php/argcargv.i b/Lib/php/argcargv.i index 14b0cf2c9..15a86a942 100644 --- a/Lib/php/argcargv.i +++ b/Lib/php/argcargv.i @@ -33,6 +33,10 @@ $2[i] = NULL; } +%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { + $1 = Z_TYPE($input) == IS_ARRAY; +} + %typemap(freearg) (int ARGC, char **ARGV) { if ($2 != NULL) { free((void *)$2); diff --git a/Lib/tcl/argcargv.i b/Lib/tcl/argcargv.i index e43f2e657..bcc3dc8a9 100644 --- a/Lib/tcl/argcargv.i +++ b/Lib/tcl/argcargv.i @@ -21,6 +21,11 @@ $2[i] = NULL; } +%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) { + int len; + $1 = Tcl_ListObjLength(interp, $input, &len) == TCL_OK; +} + %typemap(freearg) (int ARGC, char **ARGV) { if ($2 != NULL) { free((void *)$2);