Mercurial > octave
diff libinterp/parse-tree/pt-colon.cc @ 28519:d4563c5d4060
handle all dispatching for colon operator in do_colon_op function
* ov.cc (do_colon_op): Handle all dispatching here, but using lookup
based on argument vector passed to feval instead of determining
dispatch type separately.
* pt-colon.cc (tree_colon_expression::evaluate): Simply evaluate
arguments and pass them to do_colon_op.
* test/colon-op: New test directory.
* test/module.mk: Update.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 29 Jun 2020 23:45:19 -0400 |
parents | bd51beb6205e |
children | 70cdf8de553d |
line wrap: on
line diff
--- a/libinterp/parse-tree/pt-colon.cc Tue Jun 30 15:52:25 2020 -0400 +++ b/libinterp/parse-tree/pt-colon.cc Mon Jun 29 23:45:19 2020 -0400 @@ -57,52 +57,22 @@ if (! m_base || ! m_limit) return val; - octave_value ov_base = m_base->evaluate (tw); - - octave_value ov_limit = m_limit->evaluate (tw); - - if (ov_base.isobject () || ov_limit.isobject ()) - { - octave_value_list tmp1; - - if (m_increment) - { - octave_value ov_increment = m_increment->evaluate (tw); + octave_value ov_base; + octave_value ov_increment; + octave_value ov_limit; - tmp1(2) = ov_limit; - tmp1(1) = ov_increment; - tmp1(0) = ov_base; - } - else - { - tmp1(1) = ov_limit; - tmp1(0) = ov_base; - } - - interpreter& interp = tw.get_interpreter (); - - symbol_table& symtab = interp.get_symbol_table (); - - octave_value fcn = symtab.find_function ("colon", tmp1); - - if (! fcn.is_defined ()) - error ("can not find overloaded colon function"); - - octave_value_list tmp2 = feval (fcn, tmp1, 1); - - val = tmp2 (0); + if (m_increment) + { + ov_base = m_base->evaluate (tw); + ov_increment = m_increment->evaluate (tw); + ov_limit = m_limit->evaluate (tw); } else { - octave_value ov_increment = 1.0; - - if (m_increment) - ov_increment = m_increment->evaluate (tw); - - val = do_colon_op (ov_base, ov_increment, ov_limit, - is_for_cmd_expr ()); + ov_base = m_base->evaluate (tw); + ov_limit = m_limit->evaluate (tw); } - return val; + return do_colon_op (ov_base, ov_increment, ov_limit, is_for_cmd_expr ()); } }