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 }