Mercurial > octave
comparison 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 |
comparison
equal
deleted
inserted
replaced
28518:b8ab8b58547d | 28519:d4563c5d4060 |
---|---|
55 octave_value val; | 55 octave_value val; |
56 | 56 |
57 if (! m_base || ! m_limit) | 57 if (! m_base || ! m_limit) |
58 return val; | 58 return val; |
59 | 59 |
60 octave_value ov_base = m_base->evaluate (tw); | 60 octave_value ov_base; |
61 octave_value ov_increment; | |
62 octave_value ov_limit; | |
61 | 63 |
62 octave_value ov_limit = m_limit->evaluate (tw); | 64 if (m_increment) |
63 | |
64 if (ov_base.isobject () || ov_limit.isobject ()) | |
65 { | 65 { |
66 octave_value_list tmp1; | 66 ov_base = m_base->evaluate (tw); |
67 | 67 ov_increment = m_increment->evaluate (tw); |
68 if (m_increment) | 68 ov_limit = m_limit->evaluate (tw); |
69 { | |
70 octave_value ov_increment = m_increment->evaluate (tw); | |
71 | |
72 tmp1(2) = ov_limit; | |
73 tmp1(1) = ov_increment; | |
74 tmp1(0) = ov_base; | |
75 } | |
76 else | |
77 { | |
78 tmp1(1) = ov_limit; | |
79 tmp1(0) = ov_base; | |
80 } | |
81 | |
82 interpreter& interp = tw.get_interpreter (); | |
83 | |
84 symbol_table& symtab = interp.get_symbol_table (); | |
85 | |
86 octave_value fcn = symtab.find_function ("colon", tmp1); | |
87 | |
88 if (! fcn.is_defined ()) | |
89 error ("can not find overloaded colon function"); | |
90 | |
91 octave_value_list tmp2 = feval (fcn, tmp1, 1); | |
92 | |
93 val = tmp2 (0); | |
94 } | 69 } |
95 else | 70 else |
96 { | 71 { |
97 octave_value ov_increment = 1.0; | 72 ov_base = m_base->evaluate (tw); |
98 | 73 ov_limit = m_limit->evaluate (tw); |
99 if (m_increment) | |
100 ov_increment = m_increment->evaluate (tw); | |
101 | |
102 val = do_colon_op (ov_base, ov_increment, ov_limit, | |
103 is_for_cmd_expr ()); | |
104 } | 74 } |
105 | 75 |
106 return val; | 76 return do_colon_op (ov_base, ov_increment, ov_limit, is_for_cmd_expr ()); |
107 } | 77 } |
108 } | 78 } |