Mercurial > octave-nkf
annotate src/pt-binop.cc @ 12920:5d18231eee00
Extend profiling support to operators.
* profiler.h: Always use std::string with profiler name instead of
octave_function references for identifying functions.
* profiler.cc: Adapt for that.
* ov-builtin.cc: Ditto.
* ov-mex-fcn.cc: Ditto.
* ov-usr-fcn.cc: Ditto.
* pt-binop.cc (tree_binary_expression::rvalue1): Collect profiler data.
* pt-unop.cc (tree_prefix_expression::rvalue1): Ditto.
(tree_postfix_expression::rvalue1): Ditto.
author | Daniel Kraft <d@domob.eu> |
---|---|
date | Fri, 29 Jul 2011 17:51:39 +0200 |
parents | 46e0d66596f2 |
children | 7820a12baadd |
rev | line source |
---|---|
2980 | 1 /* |
2 | |
11523 | 3 Copyright (C) 1996-2011 John W. Eaton |
2980 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
2980 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
2980 | 20 |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 | |
27 #include "error.h" | |
11091
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
28 #include "defun.h" |
2980 | 29 #include "oct-obj.h" |
30 #include "ov.h" | |
12920
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
31 #include "profiler.h" |
2980 | 32 #include "pt-binop.h" |
3770 | 33 #include "pt-bp.h" |
2980 | 34 #include "pt-walk.h" |
11091
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
35 #include "variables.h" |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
36 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
37 // TRUE means we mark | and & expressions for braindead short-circuit |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
38 // behavior. |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
39 static bool Vdo_braindead_shortcircuit_evaluation; |
2980 | 40 |
41 // Binary expressions. | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
42 |
2980 | 43 octave_value_list |
44 tree_binary_expression::rvalue (int nargout) | |
45 { | |
46 octave_value_list retval; | |
47 | |
48 if (nargout > 1) | |
49 error ("binary operator `%s': invalid number of output arguments", | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
50 oper () . c_str ()); |
2980 | 51 else |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8011
diff
changeset
|
52 retval = rvalue1 (nargout); |
2980 | 53 |
54 return retval; | |
55 } | |
56 | |
57 octave_value | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8011
diff
changeset
|
58 tree_binary_expression::rvalue1 (int) |
2980 | 59 { |
60 octave_value retval; | |
61 | |
62 if (error_state) | |
63 return retval; | |
64 | |
11091
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
65 if (Vdo_braindead_shortcircuit_evaluation |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
66 && eligible_for_braindead_shortcircuit) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
67 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
68 if (op_lhs) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
69 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
70 octave_value a = op_lhs->rvalue1 (); |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
71 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
72 if (! error_state) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
73 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
74 if (a.ndims () == 2 && a.rows () == 1 && a.columns () == 1) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
75 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
76 bool result = false; |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
77 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
78 bool a_true = a.is_true (); |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
79 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
80 if (! error_state) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
81 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
82 if (a_true) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
83 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
84 if (etype == octave_value::op_el_or) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
85 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
86 result = true; |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
87 goto done; |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
88 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
89 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
90 else |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
91 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
92 if (etype == octave_value::op_el_and) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
93 goto done; |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
94 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
95 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
96 if (op_rhs) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
97 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
98 octave_value b = op_rhs->rvalue1 (); |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
99 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
100 if (! error_state) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
101 result = b.is_true (); |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
102 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
103 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
104 done: |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
105 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
106 if (! error_state) |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
107 return octave_value (result); |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
108 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
109 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
110 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
111 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
112 } |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
113 |
2980 | 114 if (op_lhs) |
115 { | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8011
diff
changeset
|
116 octave_value a = op_lhs->rvalue1 (); |
2980 | 117 |
8011
3100283874d7
improve backtrace error messages
John W. Eaton <jwe@octave.org>
parents:
7767
diff
changeset
|
118 if (! error_state && a.is_defined () && op_rhs) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
119 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
120 octave_value b = op_rhs->rvalue1 (); |
2980 | 121 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
122 if (! error_state && b.is_defined ()) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
123 { |
12920
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
124 profile_data_accumulator::enter pe (profiler, |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
125 "binary " + oper ()); |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
126 |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
127 /* Note: The profiler does not catch the braindead-short-circuit |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
128 evaluation code above. But that should be ok. */ |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
129 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
130 retval = ::do_binary_op (etype, a, b); |
2980 | 131 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
132 if (error_state) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
133 retval = octave_value (); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
134 } |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
135 } |
2980 | 136 } |
137 | |
138 return retval; | |
139 } | |
140 | |
3536 | 141 std::string |
2980 | 142 tree_binary_expression::oper (void) const |
143 { | |
144 return octave_value::binary_op_as_string (etype); | |
145 } | |
146 | |
5861 | 147 tree_expression * |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
148 tree_binary_expression::dup (symbol_table::scope_id scope, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
149 symbol_table::context_id context) const |
5861 | 150 { |
151 tree_binary_expression *new_be | |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
152 = new tree_binary_expression (op_lhs ? op_lhs->dup (scope, context) : 0, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
153 op_rhs ? op_rhs->dup (scope, context) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
154 line (), column (), etype); |
5861 | 155 |
156 new_be->copy_base (*this); | |
157 | |
158 return new_be; | |
159 } | |
160 | |
2980 | 161 void |
162 tree_binary_expression::accept (tree_walker& tw) | |
163 { | |
164 tw.visit_binary_expression (*this); | |
165 } | |
166 | |
167 // Boolean expressions. | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11572
diff
changeset
|
168 |
2980 | 169 octave_value_list |
170 tree_boolean_expression::rvalue (int nargout) | |
171 { | |
172 octave_value_list retval; | |
173 | |
174 if (nargout > 1) | |
175 error ("binary operator `%s': invalid number of output arguments", | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
176 oper () . c_str ()); |
2980 | 177 else |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8011
diff
changeset
|
178 retval = rvalue1 (nargout); |
2980 | 179 |
180 return retval; | |
181 } | |
182 | |
183 octave_value | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8011
diff
changeset
|
184 tree_boolean_expression::rvalue1 (int) |
2980 | 185 { |
186 octave_value retval; | |
187 | |
188 if (error_state) | |
189 return retval; | |
190 | |
191 bool result = false; | |
192 | |
12920
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
193 /* This evaluation is not caught by the profiler, since we can't find |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
194 a reasonable place where to time. Note that we don't want to include |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
195 evaluation of LHS or RHS into the timing, but this is entangled |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
196 together with short-circuit evaluation here. */ |
5d18231eee00
Extend profiling support to operators.
Daniel Kraft <d@domob.eu>
parents:
12822
diff
changeset
|
197 |
2980 | 198 if (op_lhs) |
199 { | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8011
diff
changeset
|
200 octave_value a = op_lhs->rvalue1 (); |
2980 | 201 |
8011
3100283874d7
improve backtrace error messages
John W. Eaton <jwe@octave.org>
parents:
7767
diff
changeset
|
202 if (! error_state) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
203 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
204 bool a_true = a.is_true (); |
2980 | 205 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
206 if (! error_state) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
207 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
208 if (a_true) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
209 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
210 if (etype == bool_or) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
211 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
212 result = true; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
213 goto done; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
214 } |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
215 } |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
216 else |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
217 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
218 if (etype == bool_and) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
219 goto done; |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
220 } |
2980 | 221 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
222 if (op_rhs) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
223 { |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
224 octave_value b = op_rhs->rvalue1 (); |
2980 | 225 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
226 if (! error_state) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
227 result = b.is_true (); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
228 } |
2980 | 229 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
230 done: |
2980 | 231 |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
232 if (! error_state) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
233 retval = octave_value (result); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
234 } |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
235 } |
2980 | 236 } |
237 | |
238 return retval; | |
239 } | |
240 | |
3536 | 241 std::string |
2980 | 242 tree_boolean_expression::oper (void) const |
243 { | |
3523 | 244 std::string retval = "<unknown>"; |
2980 | 245 |
246 switch (etype) | |
247 { | |
248 case bool_and: | |
249 retval = "&&"; | |
250 break; | |
251 | |
252 case bool_or: | |
253 retval = "||"; | |
254 break; | |
255 | |
256 default: | |
257 break; | |
258 } | |
259 | |
260 return retval; | |
261 } | |
262 | |
5861 | 263 tree_expression * |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
264 tree_boolean_expression::dup (symbol_table::scope_id scope, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
265 symbol_table::context_id context) const |
5861 | 266 { |
267 tree_boolean_expression *new_be | |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
268 = new tree_boolean_expression (op_lhs ? op_lhs->dup (scope, context) : 0, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
269 op_rhs ? op_rhs->dup (scope, context) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10160
diff
changeset
|
270 line (), column (), etype); |
5861 | 271 |
272 new_be->copy_base (*this); | |
273 | |
274 return new_be; | |
275 } | |
11091
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
276 |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
277 DEFUN (do_braindead_shortcircuit_evaluation, args, nargout, |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
278 "-*- texinfo -*-\n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
279 @deftypefn {Built-in Function} {@var{val} =} do_braindead_shortcircuit_evaluation ()\n\ |
11572
7d6d8c1e471f
Grammarcheck Texinfo for files in src directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
280 @deftypefnx {Built-in Function} {@var{old_val} =} do_braindead_shortcircuit_evaluation (@var{new_val})\n\ |
11091
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
281 Query or set the internal variable that controls whether Octave will\n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
282 do short-circuit evaluation of @samp{|} and @samp{&} operators inside the\n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
283 conditions of if or while statements.\n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
284 \n\ |
11572
7d6d8c1e471f
Grammarcheck Texinfo for files in src directory.
Rik <octave@nomad.inbox5.com>
parents:
11523
diff
changeset
|
285 This feature is only provided for compatibility with @sc{matlab} and should\n\ |
11091
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
286 not be used unless you are porting old code that relies on this feature.\n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
287 \n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
288 To obtain short-circuit behavior for logical expressions in new programs,\n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
289 you should always use the @samp{&&} and @samp{||} operators.\n\ |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
290 @end deftypefn") |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
291 { |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
292 return SET_INTERNAL_VARIABLE (do_braindead_shortcircuit_evaluation); |
5677f3f7b5fa
Matlab compatible short-circuit behavior for & and | operators
John W. Eaton <jwe@octave.org>
parents:
10315
diff
changeset
|
293 } |
12822
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
294 |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
295 /* |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
296 |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
297 %!test |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
298 %! x = 0; |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
299 %! do_braindead_shortcircuit_evaluation (0); |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
300 %! if (1 | (x = 1)) |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
301 %! endif |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
302 %! assert (x, 1); |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
303 %! do_braindead_shortcircuit_evaluation (1); |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
304 %! if (1 | (x = 0)) |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
305 %! endif |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
306 %! assert (x, 1); |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
307 |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
308 */ |
46e0d66596f2
codesprint: Add test for do_braindead_shortcircuit_evaluation
Rik <octave@nomad.inbox5.com>
parents:
11586
diff
changeset
|
309 |