Mercurial > hg > octave-nkf
annotate libinterp/parse-tree/pt-assign.cc @ 20804:3af34e1ef330
Preliminary inclusion of uixx objects properties in the manual (bug #46076)
* doc/interpreter/genpropdoc.m: add uixx objects to the list of supported graphics objects
* doc/interpreter/genpropdoc.m (get_doc): add uixx objects and their specific properties (currently empty documentation)
* doc/interpreter/plot.txi("Interacting with Plots"): add a note and a reference about ui* family of functions.
* doc/interpreter/plot.txi("Interacting with Plots"): for consistency, remove "uimenu" reference. All the other uixx are already in the gui section
* doc/interpreter/plot.txi("graphics data structure"): add uixx objects
* doc/interpreter/gui.txi("UI Elements"): add "uimenu" function reference
* doc/module.mk: add rules to build uixx properties texi files.
* graphics.in.h: make uixx "__object__" property (Octave internal) hidden so that it does not appear in the documentation.
author | Pantxo Diribarne <pantxo.diribarne@gmail.com> |
---|---|
date | Fri, 09 Oct 2015 16:25:27 +0200 |
parents | b10432a40432 |
children |
rev | line source |
---|---|
2980 | 1 /* |
2 | |
19898
4197fc428c7d
maint: Update copyright notices for 2015.
John W. Eaton <jwe@octave.org>
parents:
17787
diff
changeset
|
3 Copyright (C) 1996-2015 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 | |
3503 | 27 #include <iostream> |
6253 | 28 #include <set> |
2980 | 29 |
30 #include "defun.h" | |
31 #include "error.h" | |
10030
83bb2a78c07d
improve simple assignments error checks and messages
Jaroslav Hajek <highegg@gmail.com>
parents:
9782
diff
changeset
|
32 #include "gripes.h" |
2980 | 33 #include "input.h" |
34 #include "oct-obj.h" | |
35 #include "oct-lvalue.h" | |
36 #include "pager.h" | |
37 #include "ov.h" | |
2982 | 38 #include "pt-arg-list.h" |
3770 | 39 #include "pt-bp.h" |
2980 | 40 #include "pt-assign.h" |
15606
fb9dffe5fbfb
The silent_functions flag no longer modifies the parse tree
Max Brister <max@2bass.com>
parents:
15195
diff
changeset
|
41 #include "pt-eval.h" |
2980 | 42 #include "pt-walk.h" |
43 #include "utils.h" | |
5794 | 44 #include "variables.h" |
2980 | 45 |
46 // Simple assignment expressions. | |
47 | |
6253 | 48 tree_simple_assignment::tree_simple_assignment |
49 (tree_expression *le, tree_expression *re, | |
50 bool plhs, int l, int c, octave_value::assign_op t) | |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
51 : tree_expression (l, c), lhs (le), rhs (re), preserve (plhs), etype (t) |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
52 { } |
6253 | 53 |
2980 | 54 tree_simple_assignment::~tree_simple_assignment (void) |
55 { | |
56 if (! preserve) | |
57 delete lhs; | |
58 | |
59 delete rhs; | |
60 } | |
61 | |
62 octave_value_list | |
63 tree_simple_assignment::rvalue (int nargout) | |
64 { | |
65 octave_value_list retval; | |
66 | |
67 if (nargout > 1) | |
68 error ("invalid number of output arguments for expression X = RHS"); | |
69 else | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
70 retval = rvalue1 (nargout); |
2980 | 71 |
72 return retval; | |
73 } | |
74 | |
75 octave_value | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
76 tree_simple_assignment::rvalue1 (int) |
2980 | 77 { |
3208 | 78 octave_value retval; |
2980 | 79 |
80 if (rhs) | |
81 { | |
8905
24dd61b36591
assign rvalue1 result to octave_value object, not octave_value_list object
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
82 octave_value rhs_val = rhs->rvalue1 (); |
2980 | 83 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
84 if (rhs_val.is_undefined ()) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
85 { |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
86 error ("value on right hand side of assignment is undefined"); |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
87 return retval; |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
88 } |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
89 else |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
90 { |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
91 if (rhs_val.is_cs_list ()) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
92 { |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
93 const octave_value_list lst = rhs_val.list_value (); |
7389 | 94 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
95 if (! lst.empty ()) |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
96 rhs_val = lst(0); |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
97 else |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
98 { |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
99 error ("invalid number of elements on RHS of assignment"); |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
100 return retval; |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
101 } |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
102 } |
7389 | 103 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
104 try |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
105 { |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
106 octave_lvalue ult = lhs->lvalue (); |
2980 | 107 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
108 if (ult.numel () != 1) |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
109 gripe_nonbraced_cs_list_assignment (); |
2984 | 110 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
111 ult.assign (etype, rhs_val); |
2980 | 112 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
113 if (etype == octave_value::op_asn_eq) |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
114 retval = rhs_val; |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
115 else |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
116 retval = ult.value (); |
3208 | 117 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
118 if (print_result () |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
119 && tree_evaluator::statement_printing_enabled ()) |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
120 { |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
121 // We clear any index here so that we can |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
122 // get the new value of the referenced |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
123 // object below, instead of the indexed |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
124 // value (which should be the same as the |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
125 // right hand side value). |
20749
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20458
diff
changeset
|
126 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
127 ult.clear_index (); |
20749
dd6345fd8a97
use exceptions for better invalid index error reporting (bug #45957)
Lachlan Andrew <lachlanbis@gmail.com>
parents:
20458
diff
changeset
|
128 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
129 octave_value lhs_val = ult.value (); |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
130 |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
131 lhs_val.print_with_name (octave_stdout, |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
132 lhs->name ()); |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
133 } |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
134 } |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
135 catch (index_exception& e) |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
136 { // problems with range, invalid index type etc. |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
137 e.set_var (lhs->name ()); |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
138 (*current_liboctave_error_with_id_handler) (e.id(), e.err()); |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
139 } |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
140 } |
2980 | 141 } |
142 | |
3208 | 143 return retval; |
2980 | 144 } |
145 | |
3536 | 146 std::string |
2980 | 147 tree_simple_assignment::oper (void) const |
148 { | |
149 return octave_value::assign_op_as_string (etype); | |
150 } | |
151 | |
5861 | 152 tree_expression * |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7389
diff
changeset
|
153 tree_simple_assignment::dup (symbol_table::scope_id scope, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
154 symbol_table::context_id context) const |
5861 | 155 { |
156 tree_simple_assignment *new_sa | |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7389
diff
changeset
|
157 = new tree_simple_assignment (lhs ? lhs->dup (scope, context) : 0, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
158 rhs ? rhs->dup (scope, context) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
159 preserve, etype); |
5861 | 160 |
161 new_sa->copy_base (*this); | |
162 | |
163 return new_sa; | |
164 } | |
165 | |
2980 | 166 void |
167 tree_simple_assignment::accept (tree_walker& tw) | |
168 { | |
169 tw.visit_simple_assignment (*this); | |
170 } | |
171 | |
172 // Multi-valued assignment expressions. | |
173 | |
6253 | 174 tree_multi_assignment::tree_multi_assignment |
175 (tree_argument_list *lst, tree_expression *r, | |
10230
0a5a769b8fc0
disallow computed multiple assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10227
diff
changeset
|
176 bool plhs, int l, int c) |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
177 : tree_expression (l, c), lhs (lst), rhs (r), preserve (plhs) |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
178 { } |
6253 | 179 |
2980 | 180 tree_multi_assignment::~tree_multi_assignment (void) |
181 { | |
182 if (! preserve) | |
183 delete lhs; | |
184 | |
185 delete rhs; | |
186 } | |
187 | |
188 octave_value | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
189 tree_multi_assignment::rvalue1 (int nargout) |
2980 | 190 { |
191 octave_value retval; | |
192 | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
193 const octave_value_list tmp = rvalue (nargout); |
2980 | 194 |
195 if (! tmp.empty ()) | |
196 retval = tmp(0); | |
197 | |
198 return retval; | |
199 } | |
200 | |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
201 // FIXME: this works, but it would look a little better if |
2984 | 202 // it were broken up into a couple of separate functions. |
203 | |
2980 | 204 octave_value_list |
205 tree_multi_assignment::rvalue (int) | |
206 { | |
3208 | 207 octave_value_list retval; |
2980 | 208 |
209 if (rhs) | |
210 { | |
5846 | 211 std::list<octave_lvalue> lvalue_list = lhs->lvalue_list (); |
3977 | 212 |
10832
1b2fcd122c6a
allow user detect ignored outputs in m-functions
Jaroslav Hajek <highegg@gmail.com>
parents:
10315
diff
changeset
|
213 octave_idx_type n_out = 0; |
5846 | 214 |
215 for (std::list<octave_lvalue>::const_iterator p = lvalue_list.begin (); | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
216 p != lvalue_list.end (); |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
217 p++) |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
218 n_out += p->numel (); |
5846 | 219 |
8580
188d38a553c7
further indexing optimization touches
Jaroslav Hajek <highegg@gmail.com>
parents:
8313
diff
changeset
|
220 // The following trick is used to keep rhs_val constant. |
10832
1b2fcd122c6a
allow user detect ignored outputs in m-functions
Jaroslav Hajek <highegg@gmail.com>
parents:
10315
diff
changeset
|
221 const octave_value_list rhs_val1 = rhs->rvalue (n_out, &lvalue_list); |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
222 const octave_value_list rhs_val = (rhs_val1.length () == 1 |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
223 && rhs_val1(0).is_cs_list () |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
224 ? rhs_val1(0).list_value () |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
225 : rhs_val1); |
2980 | 226 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
227 octave_idx_type k = 0; |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
228 |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
229 octave_idx_type n = rhs_val.length (); |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
230 |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
231 // To avoid copying per elements and possible optimizations, we |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
232 // postpone joining the final values. |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
233 std::list<octave_value_list> retval_list; |
2980 | 234 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
235 tree_argument_list::iterator q = lhs->begin (); |
2980 | 236 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
237 for (std::list<octave_lvalue>::iterator p = lvalue_list.begin (); |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
238 p != lvalue_list.end (); |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
239 p++) |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
240 { |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
241 tree_expression *lhs_elt = *q++; |
5846 | 242 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
243 octave_lvalue ult = *p; |
5846 | 244 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
245 octave_idx_type nel = ult.numel (); |
3977 | 246 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
247 if (nel != 1) |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
248 { |
20458
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
249 // Huge kluge so that wrapper scripts with lines like |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
250 // |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
251 // [varargout{1:nargout}] = fcn (args); |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
252 // |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
253 // Will work the same as calling fcn directly when nargout |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
254 // is 0 and fcn produces more than one output even when |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
255 // nargout is 0. This only works if varargout has not yet |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
256 // been defined. See also bug #43813. |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
257 |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
258 if (lvalue_list.size () == 1 && nel == 0 && n > 0 |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
259 && ! ult.is_black_hole () && ult.is_undefined () |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
260 && ult.index_type () == "{" && ult.index_is_empty ()) |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
261 { |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
262 // Convert undefined lvalue with empty index to a cell |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
263 // array with a single value and indexed by 1 to |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
264 // handle a single output. |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
265 |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
266 nel = 1; |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
267 |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
268 ult.define (Cell (1, 1)); |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
269 |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
270 ult.clear_index (); |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
271 std::list<octave_value_list> idx; |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
272 idx.push_back (octave_value_list (octave_value (1))); |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
273 ult.set_index ("{", idx); |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
274 } |
011a364b4d78
improve compatibility of indexed assignment (bug #43813)
John W. Eaton <jwe@octave.org>
parents:
19898
diff
changeset
|
275 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
276 if (k + nel <= n) |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
277 { |
10230
0a5a769b8fc0
disallow computed multiple assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10227
diff
changeset
|
278 // This won't do a copy. |
0a5a769b8fc0
disallow computed multiple assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10227
diff
changeset
|
279 octave_value_list ovl = rhs_val.slice (k, nel); |
5846 | 280 |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
281 ult.assign (octave_value::op_asn_eq, |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
282 octave_value (ovl, true)); |
2980 | 283 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
284 retval_list.push_back (ovl); |
5846 | 285 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
286 k += nel; |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
287 } |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
288 else |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
289 error ("some elements undefined in return list"); |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
290 } |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
291 else |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
292 { |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
293 if (k < n) |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
294 { |
10230
0a5a769b8fc0
disallow computed multiple assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10227
diff
changeset
|
295 ult.assign (octave_value::op_asn_eq, rhs_val(k)); |
3977 | 296 |
10227
d3fc22c3071c
omit ~ values from multi-assignment return lists
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
297 if (ult.is_black_hole ()) |
d3fc22c3071c
omit ~ values from multi-assignment return lists
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
298 { |
d3fc22c3071c
omit ~ values from multi-assignment return lists
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
299 k++; |
d3fc22c3071c
omit ~ values from multi-assignment return lists
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
300 continue; |
d3fc22c3071c
omit ~ values from multi-assignment return lists
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
301 } |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
302 else |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
303 { |
10230
0a5a769b8fc0
disallow computed multiple assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10227
diff
changeset
|
304 retval_list.push_back (rhs_val(k)); |
5846 | 305 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
306 k++; |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
307 } |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
308 } |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
309 else |
14572
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
310 { |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
311 // This can happen for a function like |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
312 // |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
313 // function varargout = f () |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
314 // varargout{1} = nargout; |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
315 // endfunction |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
316 // |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
317 // called with |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
318 // |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
319 // [a, ~] = f (); |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
320 // |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
321 // Then the list of of RHS values will contain one |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
322 // element but we are iterating over the list of all |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
323 // RHS values. We shouldn't complain that a value we |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
324 // don't need is missing from the list. |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
325 |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
326 if (ult.is_black_hole ()) |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
327 { |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
328 k++; |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
329 continue; |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
330 } |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
331 else |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
332 error ("element number %d undefined in return list", k+1); |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
333 } |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
334 } |
2980 | 335 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
336 if (print_result () |
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
337 && tree_evaluator::statement_printing_enabled ()) |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
338 { |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
339 // We clear any index here so that we can get |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
340 // the new value of the referenced object below, |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
341 // instead of the indexed value (which should be |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
342 // the same as the right hand side value). |
3977 | 343 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
344 ult.clear_index (); |
3208 | 345 |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
346 octave_value lhs_val = ult.value (); |
3977 | 347 |
20764
b10432a40432
eliminate more simple uses of error_state
John W. Eaton <jwe@octave.org>
parents:
20749
diff
changeset
|
348 lhs_val.print_with_name (octave_stdout, lhs_elt->name ()); |
9782
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
349 } |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
350 } |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
351 |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
352 // Concatenate return values. |
eead00a7df05
don't skip empty multi-assignments to allow side effects
Jaroslav Hajek <highegg@gmail.com>
parents:
9421
diff
changeset
|
353 retval = retval_list; |
2980 | 354 } |
355 | |
3208 | 356 return retval; |
2980 | 357 } |
358 | |
14572
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
359 /* |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
360 %!function varargout = f () |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
361 %! varargout{1} = nargout; |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
362 %!endfunction |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
363 %! |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
364 %!test |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
365 %! [a, ~] = f (); |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
366 %! assert (a, 2); |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
367 %!test |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
368 %! [a, ~, ~, ~, ~] = f (); |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
369 %! assert (a, 5); |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
370 */ |
000cd393f3c1
avoid error for calls to functions returning varargout that ignore final outputs (bug #36221)
John W. Eaton <jwe@octave.org>
parents:
14138
diff
changeset
|
371 |
3536 | 372 std::string |
3208 | 373 tree_multi_assignment::oper (void) const |
374 { | |
10230
0a5a769b8fc0
disallow computed multiple assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
10227
diff
changeset
|
375 return octave_value::assign_op_as_string (op_type ()); |
3208 | 376 } |
377 | |
5861 | 378 tree_expression * |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7389
diff
changeset
|
379 tree_multi_assignment::dup (symbol_table::scope_id scope, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
380 symbol_table::context_id context) const |
5861 | 381 { |
382 tree_multi_assignment *new_ma | |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7389
diff
changeset
|
383 = new tree_multi_assignment (lhs ? lhs->dup (scope, context) : 0, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
384 rhs ? rhs->dup (scope, context) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10230
diff
changeset
|
385 preserve); |
5861 | 386 |
387 new_ma->copy_base (*this); | |
388 | |
389 return new_ma; | |
390 } | |
391 | |
2980 | 392 void |
393 tree_multi_assignment::accept (tree_walker& tw) | |
394 { | |
395 tw.visit_multi_assignment (*this); | |
396 } |