Mercurial > octave
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) |