comparison libinterp/parse-tree/pt-eval.cc @ 28541:5f4e8dddf05f

maint: merge stable to default.
author John W. Eaton <jwe@octave.org>
date Tue, 07 Jul 2020 19:40:20 -0400
parents 05a48a241da6 ea5a632b2553
children 2de5389fc5ab
comparison
equal deleted inserted replaced
28539:3e60f505f038 28541:5f4e8dddf05f
1786 return octave_value_list (args); 1786 return octave_value_list (args);
1787 } 1787 }
1788 1788
1789 octave_value_list 1789 octave_value_list
1790 tree_evaluator::convert_return_list_to_const_vector 1790 tree_evaluator::convert_return_list_to_const_vector
1791 (tree_parameter_list *ret_list, int nargout, const Cell& varargout) 1791 (tree_parameter_list *ret_list, int nargout, const Matrix& ignored_outputs,
1792 const Cell& varargout)
1792 { 1793 {
1793 octave_idx_type vlen = varargout.numel (); 1794 octave_idx_type vlen = varargout.numel ();
1794 int len = ret_list->length (); 1795 int len = ret_list->length ();
1795 1796
1796 // Special case. Will do a shallow copy. 1797 // Special case. Will do a shallow copy.
1797 if (len == 0) 1798 if (len == 0)
1798 return varargout; 1799 return varargout;
1799 else if (nargout <= len) 1800 else
1800 { 1801 {
1801 octave_value_list retval (nargout);
1802
1803 int i = 0; 1802 int i = 0;
1804 1803 int k = 0;
1805 for (tree_decl_elt *elt : *ret_list) 1804 int num_ignored = ignored_outputs.numel ();
1806 { 1805 int ignored = num_ignored > 0 ? ignored_outputs(k) - 1 : -1;
1807 if (is_defined (elt->ident ())) 1806
1808 retval(i) = evaluate (elt); 1807 if (nargout <= len)
1809 1808 {
1810 i++; 1809 int nout = nargout > 0 ? nargout : 1;
1811 } 1810 octave_value_list retval (nout);
1812 1811
1813 return retval; 1812 for (tree_decl_elt *elt : *ret_list)
1814 } 1813 {
1815 else 1814 if (nargout == 0 && ! is_defined (elt->ident ()))
1816 { 1815 break;
1817 octave_value_list retval (len + vlen); 1816
1818 1817 if (ignored >= 0 && i == ignored)
1819 int i = 0; 1818 {
1820 1819 i++;
1821 for (tree_decl_elt *elt : *ret_list) 1820 k++;
1822 retval(i++) = evaluate (elt); 1821 ignored = k < num_ignored ? ignored_outputs(k) - 1 : -1;
1823 1822 }
1824 for (octave_idx_type j = 0; j < vlen; j++) 1823 else
1825 retval(i++) = varargout(j); 1824 retval(i++) = evaluate (elt);
1826 1825
1827 return retval; 1826 if (i == nout)
1827 break;
1828 }
1829
1830 return retval;
1831 }
1832 else
1833 {
1834 octave_value_list retval (len + vlen);
1835
1836 for (tree_decl_elt *elt : *ret_list)
1837 {
1838 if (ignored >= 0 && i == ignored)
1839 {
1840 i++;
1841 k++;
1842 ignored = k < num_ignored ? ignored_outputs(k) - 1 : -1;
1843 }
1844 else
1845 retval(i++) = evaluate (elt);
1846 }
1847
1848 for (octave_idx_type j = 0; j < vlen; j++)
1849 retval(i++) = varargout(j);
1850
1851 return retval;
1852 }
1828 } 1853 }
1829 } 1854 }
1830 1855
1831 bool 1856 bool
1832 tree_evaluator::eval_decl_elt (tree_decl_elt *elt) 1857 tree_evaluator::eval_decl_elt (tree_decl_elt *elt)
2767 #endif 2792 #endif
2768 2793
2769 if (m_call_stack.size () >= static_cast<size_t> (m_max_recursion_depth)) 2794 if (m_call_stack.size () >= static_cast<size_t> (m_max_recursion_depth))
2770 error ("max_recursion_depth exceeded"); 2795 error ("max_recursion_depth exceeded");
2771 2796
2772 bind_auto_fcn_vars (xargs.name_tags (), args.length (), 2797 Matrix ignored_outputs = ignored_fcn_outputs ();
2798
2799 bind_auto_fcn_vars (xargs.name_tags (), ignored_outputs, args.length (),
2773 nargout, user_function.takes_varargs (), 2800 nargout, user_function.takes_varargs (),
2774 user_function.all_va_args (args)); 2801 user_function.all_va_args (args));
2775 2802
2776 tree_parameter_list *param_list = user_function.parameter_list (); 2803 tree_parameter_list *param_list = user_function.parameter_list ();
2777 2804
2849 if (varargout_varval.is_defined ()) 2876 if (varargout_varval.is_defined ())
2850 varargout = varargout_varval.xcell_value ("varargout must be a cell array object"); 2877 varargout = varargout_varval.xcell_value ("varargout must be a cell array object");
2851 } 2878 }
2852 2879
2853 retval = convert_return_list_to_const_vector (ret_list, nargout, 2880 retval = convert_return_list_to_const_vector (ret_list, nargout,
2881 ignored_outputs,
2854 varargout); 2882 varargout);
2855 } 2883 }
2856 2884
2857 return retval; 2885 return retval;
2858 } 2886 }
4166 4194
4167 return quit; 4195 return quit;
4168 } 4196 }
4169 4197
4170 void tree_evaluator::bind_auto_fcn_vars (const string_vector& arg_names, 4198 void tree_evaluator::bind_auto_fcn_vars (const string_vector& arg_names,
4199 const Matrix& ignored_outputs,
4171 int nargin, int nargout, 4200 int nargin, int nargout,
4172 bool takes_varargs, 4201 bool takes_varargs,
4173 const octave_value_list& va_args) 4202 const octave_value_list& va_args)
4174 { 4203 {
4175 set_auto_fcn_var (stack_frame::ARG_NAMES, Cell (arg_names)); 4204 set_auto_fcn_var (stack_frame::ARG_NAMES, Cell (arg_names));
4176 set_auto_fcn_var (stack_frame::IGNORED, ignored_fcn_outputs ()); 4205 set_auto_fcn_var (stack_frame::IGNORED, ignored_outputs);
4177 set_auto_fcn_var (stack_frame::NARGIN, nargin); 4206 set_auto_fcn_var (stack_frame::NARGIN, nargin);
4178 set_auto_fcn_var (stack_frame::NARGOUT, nargout); 4207 set_auto_fcn_var (stack_frame::NARGOUT, nargout);
4179 set_auto_fcn_var (stack_frame::SAVED_WARNING_STATES, octave_value ()); 4208 set_auto_fcn_var (stack_frame::SAVED_WARNING_STATES, octave_value ());
4180 4209
4181 if (takes_varargs) 4210 if (takes_varargs)