changeset 32196:4b48ab05ba02

VM: Expand varargin in input arguments (patch #10361). * libinterp/parse-tree/pt-bytecode-vm.cc (vm::execute_code): Properly expand cs-lists into arguments. * test/compile/bytecode.tst, test/compile/bytecode_varargin.m: Update tests.
author Petter T. <petter.vilhelm@gmail.com>
date Thu, 15 Jun 2023 11:11:37 +0200
parents 9cb43336c3b3
children aa038131581c
files libinterp/parse-tree/pt-bytecode-vm.cc test/compile/bytecode.tst test/compile/bytecode_varargin.m
diffstat 3 files changed, 27 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/parse-tree/pt-bytecode-vm.cc	Thu Jul 06 11:56:37 2023 -0400
+++ b/libinterp/parse-tree/pt-bytecode-vm.cc	Thu Jun 15 11:11:37 2023 +0200
@@ -4112,7 +4112,8 @@
           {
             cs_args = arg.list_value ();
             cs_args_idx = 0;
-            for (int j = 0; j < cs_args.length () && n_args_on_callee_stack < n_args_before_varargin; j++)
+            for (int j = 0; j < cs_args.length ()
+                            && n_args_on_callee_stack < n_args_callee - 1; j++)
               {
                 PUSH_OV (cs_args (j));
                 n_args_on_callee_stack++;
--- a/test/compile/bytecode.tst	Thu Jul 06 11:56:37 2023 -0400
+++ b/test/compile/bytecode.tst	Thu Jun 15 11:11:37 2023 +0200
@@ -283,7 +283,7 @@
 %!test
 %! __enable_vm_eval__ (0, "local");
 %! clear all
-%! key = "2 3 1 2 1 1 1 1 1 2 3 4 1 4 4 0 0 0 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 1 0 0 1 0 0 0 2 1 1 1 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 2 1 2 4 1 2 3 4 3 3 2 1 0 ";
+%! key = "2 3 1 2 1 1 1 1 1 2 3 4 1 4 4 0 0 0 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 1 0 0 1 0 0 0 2 1 1 1 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 1 2 1 2 4 1 2 0 0 2 1 nob 0 0 1 noa nob 0 0 0 2 1 2 4 1 2 3 4 3 3 2 1 0 ";
 %!
 %! __compile bytecode_varargin clear;
 %! bytecode_varargin (1,2,3);
@@ -296,7 +296,7 @@
 %!
 %! __enable_vm_eval__ (0, "local");
 %! clear all
-%! key = "0 0 1 1 1 1 1 2 3 4 1 4 4 0 0 0 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 1 0 0 1 0 0 0 2 1 1 1 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 2 1 2 4 1 2 3 4 1 3 2 1 0 ";
+%! key = "0 0 1 1 1 1 1 2 3 4 1 4 4 0 0 0 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 1 0 0 1 0 0 0 2 1 1 1 1 2 3 4 1 3 4 2 3 4 1 3 3 2 2 3 4 1 4 4 1 2 1 2 4 1 2 0 0 2 1 nob 0 0 1 noa nob 0 0 0 2 1 2 4 1 2 3 4 1 3 2 1 0 ";
 %!
 %! __compile bytecode_varargin clear;
 %! bytecode_varargin (1);
--- a/test/compile/bytecode_varargin.m	Thu Jul 06 11:56:37 2023 -0400
+++ b/test/compile/bytecode_varargin.m	Thu Jun 15 11:11:37 2023 +0200
@@ -12,6 +12,14 @@
   cslist = {1,2,3,4};
   varg2 (cslist{:});
 
+  varg3 (cslist{:});
+  cslist = {1, 2};
+  varg3 (cslist{:});
+  cslist = {1};
+  varg3 (cslist{:});
+  cslist = {};
+  varg3 (cslist{:});
+
   justnamenotpos (1, 2);
 
   out = inout (1,2,3,4);
@@ -41,6 +49,21 @@
   varg1 (2, varargin{:})
 end
 
+function varg3 (a, b, varargin)
+  if exist ("a")
+    __printf_assert__ ("%d ", a);
+  else
+    __printf_assert__ ("noa ");
+  end
+  if exist ("b")
+    __printf_assert__ ("%d ", b);
+  else
+    __printf_assert__ ("nob ");
+  end
+  __printf_assert__ ("%d ", size (varargin));
+  __printf_assert__ ("%d ", nargin);
+end
+
 function justnamenotpos (varargin, a)
   __printf_assert__ ("%d ", a);
   __printf_assert__ ("%d ", varargin);