Mercurial > octave-nkf
annotate src/pt-idx.cc @ 8874:bd1b1fe9c6e9 ss-3-1-53
bump version info for snapshot
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 25 Feb 2009 18:35:47 -0500 |
parents | 73c4516fae10 |
children | 35cd375d4bb3 |
rev | line source |
---|---|
2980 | 1 /* |
2 | |
7017 | 3 Copyright (C) 1996, 1997, 1998, 2000, 2002, 2003, 2004, 2005, 2006, |
4 2007 John W. Eaton | |
2980 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
7016 | 10 Free Software Foundation; either version 3 of the License, or (at your |
11 option) any later version. | |
2980 | 12 |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
7016 | 19 along with Octave; see the file COPYING. If not, see |
20 <http://www.gnu.org/licenses/>. | |
2980 | 21 |
22 */ | |
23 | |
24 #ifdef HAVE_CONFIG_H | |
25 #include <config.h> | |
26 #endif | |
27 | |
3933 | 28 #include "Cell.h" |
2980 | 29 #include "error.h" |
3930 | 30 #include "oct-map.h" |
2980 | 31 #include "oct-obj.h" |
32 #include "oct-lvalue.h" | |
33 #include "ov.h" | |
3930 | 34 #include "pager.h" |
2982 | 35 #include "pt-arg-list.h" |
3930 | 36 #include "pt-bp.h" |
7336 | 37 #include "pt-id.h" |
2980 | 38 #include "pt-idx.h" |
39 #include "pt-walk.h" | |
3930 | 40 #include "utils.h" |
41 #include "variables.h" | |
8579
7e0f36dfefbe
implement octave_value_list using Array
Jaroslav Hajek <highegg@gmail.com>
parents:
8564
diff
changeset
|
42 #include "gripes.h" |
2980 | 43 |
44 // Index expressions. | |
45 | |
5861 | 46 tree_index_expression::tree_index_expression (int l, int c) |
7791
975e9540be2c
pt-idx.cc: initialize fields in constructors
John W. Eaton <jwe@octave.org>
parents:
7790
diff
changeset
|
47 : tree_expression (l, c), expr (0), args (0), type (), |
5861 | 48 arg_nm (), dyn_field () { } |
49 | |
3546 | 50 tree_index_expression::tree_index_expression (tree_expression *e, |
51 tree_argument_list *lst, | |
3933 | 52 int l, int c, char t) |
7791
975e9540be2c
pt-idx.cc: initialize fields in constructors
John W. Eaton <jwe@octave.org>
parents:
7790
diff
changeset
|
53 : tree_expression (l, c), expr (e), args (0), type (), |
4131 | 54 arg_nm (), dyn_field () |
3933 | 55 { |
56 append (lst, t); | |
57 } | |
3215 | 58 |
3930 | 59 tree_index_expression::tree_index_expression (tree_expression *e, |
60 const std::string& n, | |
3944 | 61 int l, int c) |
7791
975e9540be2c
pt-idx.cc: initialize fields in constructors
John W. Eaton <jwe@octave.org>
parents:
7790
diff
changeset
|
62 : tree_expression (l, c), expr (e), args (0), type (), |
4131 | 63 arg_nm (), dyn_field () |
3933 | 64 { |
65 append (n); | |
66 } | |
67 | |
4131 | 68 tree_index_expression::tree_index_expression (tree_expression *e, |
69 tree_expression *df, | |
70 int l, int c) | |
7791
975e9540be2c
pt-idx.cc: initialize fields in constructors
John W. Eaton <jwe@octave.org>
parents:
7790
diff
changeset
|
71 : tree_expression (l, c), expr (e), args (0), type (), |
4131 | 72 arg_nm (), dyn_field () |
73 { | |
74 append (df); | |
75 } | |
76 | |
3933 | 77 void |
78 tree_index_expression::append (tree_argument_list *lst, char t) | |
79 { | |
4219 | 80 args.push_back (lst); |
3933 | 81 type.append (1, t); |
4219 | 82 arg_nm.push_back (lst ? lst->get_arg_names () : string_vector ()); |
83 dyn_field.push_back (static_cast<tree_expression *> (0)); | |
3933 | 84 } |
85 | |
86 void | |
87 tree_index_expression::append (const std::string& n) | |
88 { | |
4219 | 89 args.push_back (static_cast<tree_argument_list *> (0)); |
3933 | 90 type.append ("."); |
4219 | 91 arg_nm.push_back (n); |
92 dyn_field.push_back (static_cast<tree_expression *> (0)); | |
4131 | 93 } |
94 | |
95 void | |
96 tree_index_expression::append (tree_expression *df) | |
97 { | |
4219 | 98 args.push_back (static_cast<tree_argument_list *> (0)); |
4131 | 99 type.append ("."); |
4219 | 100 arg_nm.push_back (""); |
101 dyn_field.push_back (df); | |
3933 | 102 } |
3930 | 103 |
2980 | 104 tree_index_expression::~tree_index_expression (void) |
105 { | |
106 delete expr; | |
3933 | 107 |
108 while (! args.empty ()) | |
109 { | |
4219 | 110 std::list<tree_argument_list *>::iterator p = args.begin (); |
111 delete *p; | |
112 args.erase (p); | |
3933 | 113 } |
2980 | 114 } |
115 | |
5099 | 116 bool |
117 tree_index_expression::has_magic_end (void) const | |
118 { | |
119 for (std::list<tree_argument_list *>::const_iterator p = args.begin (); | |
120 p != args.end (); | |
121 p++) | |
122 { | |
123 tree_argument_list *elt = *p; | |
124 | |
125 if (elt && elt->has_magic_end ()) | |
126 return true; | |
127 } | |
128 | |
129 return false; | |
130 } | |
131 | |
2991 | 132 // This is useful for printing the name of the variable in an indexed |
133 // assignment. | |
134 | |
3536 | 135 std::string |
2991 | 136 tree_index_expression::name (void) const |
137 { | |
4131 | 138 return expr->name (); |
3933 | 139 } |
140 | |
141 static Cell | |
142 make_subs_cell (tree_argument_list *args, const string_vector& arg_nm) | |
143 { | |
144 Cell retval; | |
145 | |
146 octave_value_list arg_values; | |
147 | |
148 if (args) | |
149 arg_values = args->convert_to_const_vector (); | |
150 | |
151 if (! error_state) | |
152 { | |
153 int n = arg_values.length (); | |
154 | |
155 if (n > 0) | |
156 { | |
157 arg_values.stash_name_tags (arg_nm); | |
158 | |
4548 | 159 retval.resize (dim_vector (1, n)); |
3933 | 160 |
161 for (int i = 0; i < n; i++) | |
162 retval(0,i) = arg_values(i); | |
163 } | |
164 } | |
165 | |
166 return retval; | |
167 } | |
168 | |
169 static inline octave_value_list | |
4234 | 170 make_value_list (tree_argument_list *args, const string_vector& arg_nm, |
171 const octave_value *object) | |
3933 | 172 { |
173 octave_value_list retval; | |
174 | |
175 if (args) | |
4234 | 176 retval = args->convert_to_const_vector (object); |
3933 | 177 |
178 if (! error_state) | |
179 { | |
180 int n = retval.length (); | |
181 | |
182 if (n > 0) | |
183 retval.stash_name_tags (arg_nm); | |
184 } | |
185 | |
186 return retval; | |
187 } | |
188 | |
4131 | 189 std::string |
4219 | 190 tree_index_expression::get_struct_index |
191 (std::list<string_vector>::const_iterator p_arg_nm, | |
192 std::list<tree_expression *>::const_iterator p_dyn_field) const | |
4131 | 193 { |
4219 | 194 std::string fn = (*p_arg_nm)(0); |
4131 | 195 |
196 if (fn.empty ()) | |
197 { | |
4219 | 198 tree_expression *df = *p_dyn_field; |
4131 | 199 |
200 if (df) | |
201 { | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
202 octave_value t = df->rvalue1 (); |
4131 | 203 |
204 if (! error_state) | |
4143 | 205 { |
206 fn = t.string_value (); | |
207 | |
208 if (! valid_identifier (fn)) | |
6811 | 209 ::error ("invalid structure field name `%s'", fn.c_str ()); |
4143 | 210 } |
4131 | 211 } |
212 else | |
213 panic_impossible (); | |
214 } | |
215 | |
216 return fn; | |
217 } | |
218 | |
3933 | 219 Octave_map |
220 tree_index_expression::make_arg_struct (void) const | |
221 { | |
4219 | 222 int n = args.size (); |
3933 | 223 |
7336 | 224 Cell type_field (n, 1); |
225 Cell subs_field (n, 1); | |
3933 | 226 |
4219 | 227 std::list<tree_argument_list *>::const_iterator p_args = args.begin (); |
228 std::list<string_vector>::const_iterator p_arg_nm = arg_nm.begin (); | |
229 std::list<tree_expression *>::const_iterator p_dyn_field = dyn_field.begin (); | |
3933 | 230 |
231 Octave_map m; | |
232 | |
233 for (int i = 0; i < n; i++) | |
234 { | |
235 switch (type[i]) | |
236 { | |
237 case '(': | |
7336 | 238 subs_field(i) = make_subs_cell (*p_args, *p_arg_nm); |
3933 | 239 break; |
240 | |
241 case '{': | |
7336 | 242 subs_field(i) = make_subs_cell (*p_args, *p_arg_nm); |
3933 | 243 break; |
244 | |
245 case '.': | |
8011
3100283874d7
improve backtrace error messages
John W. Eaton <jwe@octave.org>
parents:
7791
diff
changeset
|
246 subs_field(i) = get_struct_index (p_arg_nm, p_dyn_field); |
3933 | 247 break; |
248 | |
249 default: | |
250 panic_impossible (); | |
251 } | |
252 | |
253 if (error_state) | |
254 return m; | |
255 | |
4219 | 256 p_args++; |
257 p_arg_nm++; | |
258 p_dyn_field++; | |
3933 | 259 } |
260 | |
7336 | 261 m.assign ("type", type_field); |
262 m.assign ("subs", subs_field); | |
3933 | 263 |
264 return m; | |
2991 | 265 } |
266 | |
2980 | 267 octave_value_list |
268 tree_index_expression::rvalue (int nargout) | |
269 { | |
270 octave_value_list retval; | |
271 | |
272 if (error_state) | |
273 return retval; | |
274 | |
7336 | 275 octave_value first_expr_val; |
276 | |
277 octave_value_list first_args; | |
278 | |
279 bool have_args = false; | |
280 | |
281 if (expr->is_identifier () && type[0] == '(') | |
282 { | |
283 tree_identifier *id = dynamic_cast<tree_identifier *> (expr); | |
284 | |
285 if (! (id->is_variable () || args.empty ())) | |
286 { | |
287 tree_argument_list *al = *(args.begin ()); | |
288 | |
289 size_t n = al ? al->length () : 0; | |
290 | |
291 if (n > 0) | |
292 { | |
293 string_vector anm = *(arg_nm.begin ()); | |
294 | |
295 first_expr_val = id->do_lookup (al, anm, first_args, have_args); | |
296 } | |
297 } | |
298 } | |
2980 | 299 |
300 if (! error_state) | |
301 { | |
7336 | 302 if (first_expr_val.is_undefined ()) |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
303 first_expr_val = expr->rvalue1 (); |
7336 | 304 |
305 octave_value tmp = first_expr_val; | |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
306 octave_idx_type tmpi = 0; |
7336 | 307 |
4219 | 308 std::list<octave_value_list> idx; |
3930 | 309 |
4219 | 310 int n = args.size (); |
3933 | 311 |
4219 | 312 std::list<tree_argument_list *>::iterator p_args = args.begin (); |
313 std::list<string_vector>::iterator p_arg_nm = arg_nm.begin (); | |
314 std::list<tree_expression *>::iterator p_dyn_field = dyn_field.begin (); | |
3930 | 315 |
3933 | 316 for (int i = 0; i < n; i++) |
317 { | |
4432 | 318 if (i > 0) |
319 { | |
320 tree_argument_list *al = *p_args; | |
321 | |
322 if (al && al->has_magic_end ()) | |
323 { | |
324 // We have an expression like | |
325 // | |
326 // x{end}.a(end) | |
327 // | |
328 // and we are looking at the argument list that | |
329 // contains the second (or third, etc.) "end" token, | |
330 // so we must evaluate everything up to the point of | |
7336 | 331 // that argument list so we can pass the appropriate |
4432 | 332 // value to the built-in __end__ function. |
333 | |
8580
188d38a553c7
further indexing optimization touches
Jaroslav Hajek <highegg@gmail.com>
parents:
8579
diff
changeset
|
334 const octave_value_list tmp_list |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
335 = tmp.subsref (type.substr (tmpi, i - tmpi), idx, nargout); |
4432 | 336 |
337 tmp = tmp_list(0); | |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
338 tmpi = i; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
339 idx.clear (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
340 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
341 if (tmp.is_cs_list ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
342 gripe_indexed_cs_list (); |
4432 | 343 |
344 if (error_state) | |
345 break; | |
346 } | |
347 } | |
348 | |
3933 | 349 switch (type[i]) |
350 { | |
351 case '(': | |
7336 | 352 if (have_args) |
353 { | |
354 idx.push_back (first_args); | |
355 have_args = false; | |
356 } | |
357 else | |
358 idx.push_back (make_value_list (*p_args, *p_arg_nm, &tmp)); | |
3933 | 359 break; |
3930 | 360 |
3933 | 361 case '{': |
4234 | 362 idx.push_back (make_value_list (*p_args, *p_arg_nm, &tmp)); |
3933 | 363 break; |
2980 | 364 |
3933 | 365 case '.': |
8011
3100283874d7
improve backtrace error messages
John W. Eaton <jwe@octave.org>
parents:
7791
diff
changeset
|
366 idx.push_back (octave_value (get_struct_index (p_arg_nm, p_dyn_field))); |
3933 | 367 break; |
3930 | 368 |
3933 | 369 default: |
370 panic_impossible (); | |
371 } | |
3930 | 372 |
3933 | 373 if (error_state) |
374 break; | |
375 | |
4219 | 376 p_args++; |
377 p_arg_nm++; | |
378 p_dyn_field++; | |
2980 | 379 } |
3933 | 380 |
381 if (! error_state) | |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
382 retval = tmp.subsref (type.substr (tmpi, n - tmpi), idx, nargout); |
2980 | 383 } |
384 | |
385 return retval; | |
386 } | |
387 | |
388 octave_value | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
389 tree_index_expression::rvalue1 (int nargout) |
2980 | 390 { |
391 octave_value retval; | |
392 | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8580
diff
changeset
|
393 const octave_value_list tmp = rvalue (nargout); |
2980 | 394 |
395 if (! tmp.empty ()) | |
396 retval = tmp(0); | |
397 | |
398 return retval; | |
399 } | |
400 | |
401 octave_lvalue | |
402 tree_index_expression::lvalue (void) | |
403 { | |
404 octave_lvalue retval; | |
405 | |
4219 | 406 std::list<octave_value_list> idx; |
3933 | 407 |
4219 | 408 int n = args.size (); |
3933 | 409 |
4219 | 410 std::list<tree_argument_list *>::iterator p_args = args.begin (); |
411 std::list<string_vector>::iterator p_arg_nm = arg_nm.begin (); | |
412 std::list<tree_expression *>::iterator p_dyn_field = dyn_field.begin (); | |
3933 | 413 |
4234 | 414 retval = expr->lvalue (); |
3933 | 415 |
2980 | 416 if (! error_state) |
417 { | |
4432 | 418 // I think it is OK to have a copy here. |
419 | |
420 const octave_value *tro = retval.object (); | |
421 | |
422 octave_value first_retval_object; | |
423 | |
424 if (tro) | |
425 first_retval_object = *tro; | |
426 | |
427 octave_value tmp = first_retval_object; | |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
428 octave_idx_type tmpi = 0; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
429 std::list<octave_value_list> tmpidx; |
4234 | 430 |
431 for (int i = 0; i < n; i++) | |
432 { | |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
433 if (retval.numel () != 1) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
434 gripe_indexed_cs_list (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
435 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
436 if (i > 0) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
437 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
438 tree_argument_list *al = *p_args; |
4432 | 439 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
440 if (al && al->has_magic_end ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
441 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
442 // We have an expression like |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
443 // |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
444 // x{end}.a(end) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
445 // |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
446 // and we are looking at the argument list that |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
447 // contains the second (or third, etc.) "end" token, |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
448 // so we must evaluate everything up to the point of |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
449 // that argument list so we pass the appropriate |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
450 // value to the built-in __end__ function. |
4432 | 451 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
452 if (tmp.is_defined ()) |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
453 { |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
454 if (tmpi < i) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
455 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
456 tmp = tmp.subsref (type.substr (tmpi, i - tmpi), tmpidx, true); |
4432 | 457 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
458 tmpi = i; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
459 tmpidx.clear (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
460 } |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
461 } |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
462 else |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
463 gripe_invalid_inquiry_subscript (); |
4432 | 464 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
465 if (tmp.is_undefined ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
466 gripe_invalid_inquiry_subscript (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
467 else if (tmp.is_cs_list ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
468 gripe_indexed_cs_list (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
469 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
470 if (error_state) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
471 break; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
472 } |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
473 } |
4432 | 474 |
4234 | 475 switch (type[i]) |
476 { | |
477 case '(': | |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
478 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
479 octave_value_list tidx |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
480 = make_value_list (*p_args, *p_arg_nm, &tmp); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
481 idx.push_back (tidx); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
482 tmpidx.push_back (tidx); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
483 } |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
484 break; |
4234 | 485 |
486 case '{': | |
5846 | 487 { |
488 octave_value_list tidx | |
489 = make_value_list (*p_args, *p_arg_nm, &tmp); | |
490 | |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
491 if (! tidx.all_scalars ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
492 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
493 octave_idx_type nel = 1; |
5846 | 494 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
495 octave_idx_type nidx = tidx.length (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
496 |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
497 // Possible cs-list. |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
498 bool has_magic_colon = tidx.has_magic_colon (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
499 dim_vector dims; |
5846 | 500 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
501 if (has_magic_colon) |
5846 | 502 { |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
503 if (tmp.is_defined ()) |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
504 { |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
505 if (tmpi < i) |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
506 { |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
507 tmp = tmp.subsref (type.substr (tmpi, i - tmpi), tmpidx, true); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
508 tmpi = i; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
509 tmpidx.clear (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
510 } |
5846 | 511 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
512 if (tmp.is_undefined ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
513 gripe_invalid_inquiry_subscript (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
514 else if (tmp.is_cs_list ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
515 gripe_indexed_cs_list (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
516 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
517 dims = (nidx == 1) ? dim_vector (tmp.numel (), 1) : tmp.dims (); |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
518 } |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
519 else |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
520 gripe_invalid_inquiry_subscript (); |
5846 | 521 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
522 if (error_state) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
523 break; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
524 } |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
525 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
526 for (octave_idx_type j = 0; j < nidx; j++) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
527 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
528 octave_value val = tidx(j); |
5846 | 529 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
530 if (val.is_magic_colon ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
531 nel *= dims (j); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
532 else |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
533 nel *= val.numel (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
534 } |
5846 | 535 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
536 retval.numel (nel); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
537 } |
5846 | 538 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
539 if (error_state) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
540 break; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
541 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
542 idx.push_back (tidx); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
543 tmpidx.push_back (tidx); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
544 |
5846 | 545 } |
4234 | 546 break; |
547 | |
548 case '.': | |
549 { | |
6833 | 550 octave_value tidx = get_struct_index (p_arg_nm, p_dyn_field); |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
551 if (error_state) |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
552 break; |
6833 | 553 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
554 if (i > 0 && type [i-1] == '(') |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
555 { |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
556 // Possible cs-list. |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
557 |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
558 octave_value_list xidx = idx.back (); |
7099 | 559 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
560 if (! xidx.all_scalars ()) |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
561 { |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
562 octave_idx_type nel = 1; |
7099 | 563 |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
564 octave_idx_type nidx = xidx.length (); |
7099 | 565 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
566 // Possible cs-list. |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
567 bool has_magic_colon = xidx.has_magic_colon (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
568 dim_vector dims; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
569 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
570 if (has_magic_colon) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
571 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
572 // Evaluate everything up to the point preceding the last paren. |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
573 if (tmp.is_defined ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
574 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
575 if (tmpi < i-1) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
576 { |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
577 tmpidx.pop_back (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
578 tmp = tmp.subsref (type.substr (tmpi, i-1 - tmpi), tmpidx, true); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
579 tmpi = i - 1; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
580 tmpidx.clear (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
581 tmpidx.push_back (xidx); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
582 } |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
583 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
584 if (tmp.is_undefined ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
585 gripe_invalid_inquiry_subscript (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
586 else if (tmp.is_cs_list ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
587 gripe_indexed_cs_list (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
588 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
589 dims = (nidx == 1) ? dim_vector (tmp.numel (), 1) : tmp.dims (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
590 } |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
591 else |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
592 gripe_invalid_inquiry_subscript (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
593 |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
594 if (error_state) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
595 break; |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
596 } |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
597 |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
598 for (octave_idx_type j = 0; j < nidx; j++) |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
599 { |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
600 octave_value val = xidx(j); |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
601 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
602 if (val.is_magic_colon ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
603 nel *= dims (j); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
604 else |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
605 nel *= val.numel (); |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
606 } |
7099 | 607 |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
608 retval.numel (nel); |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
609 } |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
610 } |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
611 else |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
612 { |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
613 // A plain struct component can also yield a list reference. |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
614 if (tmp.is_defined () && tmpi < i) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
615 tmp = tmp.subsref (type.substr (tmpi, i - tmpi), tmpidx, true); |
7057 | 616 |
8564 | 617 tmpi = i; |
618 tmpidx.clear (); | |
7099 | 619 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
620 if (tmp.is_cs_list ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
621 gripe_indexed_cs_list (); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
622 else if (tmp.is_map ()) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
623 retval.numel (tmp.numel ()); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
624 else |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
625 tmp = Octave_map (); |
7100 | 626 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
627 if (error_state) |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
628 break; |
7099 | 629 |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
630 } |
7057 | 631 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
632 if (error_state) |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
633 break; |
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
634 |
8551
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
635 idx.push_back (tidx); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
636 tmpidx.push_back (tidx); |
906f976d35a8
further improve struct&cell indexing & indexed assignment
Jaroslav Hajek <highegg@gmail.com>
parents:
8546
diff
changeset
|
637 |
4234 | 638 } |
639 break; | |
640 | |
641 default: | |
642 panic_impossible (); | |
643 } | |
644 | |
645 if (error_state) | |
646 break; | |
647 | |
648 p_args++; | |
649 p_arg_nm++; | |
650 p_dyn_field++; | |
651 } | |
3930 | 652 |
3933 | 653 if (! error_state) |
654 retval.set_index (type, idx); | |
8546
3d8a914c580e
improve parser indexed assigment code
Jaroslav Hajek <highegg@gmail.com>
parents:
8011
diff
changeset
|
655 |
2980 | 656 } |
657 | |
658 return retval; | |
659 } | |
660 | |
7099 | 661 /* |
662 %!test | |
663 %! x = {1, 2, 3}; | |
664 %! [x{:}] = deal (4, 5, 6); | |
665 %! assert (x, {4, 5, 6}); | |
666 | |
667 %!test | |
668 %! [x.a, x.b.c] = deal (1, 2); | |
669 %! assert (x.a == 1 && x.b.c == 2); | |
670 | |
671 %!test | |
672 %! [x.a, x(2).b] = deal (1, 2); | |
673 %! assert (x(1).a == 1 && isempty (x(2).a) && isempty (x(1).b) && x(2).b == 2); | |
674 | |
675 %!test | |
676 %! x = struct (zeros (0, 1), {"a", "b"}); | |
677 %! x(2).b = 1; | |
678 %! assert (x(2).b == 1); | |
679 | |
680 %!test | |
681 %! x = struct (zeros (0, 1), {"a", "b"}); | |
682 %! x(2).b = 1; | |
683 %! assert (x(2).b == 1); | |
684 */ | |
685 | |
5861 | 686 tree_index_expression * |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
687 tree_index_expression::dup (symbol_table::scope_id scope, |
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
688 symbol_table::context_id context) |
5861 | 689 { |
690 tree_index_expression *new_idx_expr | |
691 = new tree_index_expression (line (), column ()); | |
692 | |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
693 new_idx_expr->expr = expr ? expr->dup (scope, context) : 0; |
5861 | 694 |
695 std::list<tree_argument_list *> new_args; | |
696 | |
697 for (std::list<tree_argument_list *>::iterator p = args.begin (); | |
698 p != args.end (); | |
699 p++) | |
700 { | |
701 tree_argument_list *elt = *p; | |
702 | |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
703 new_args.push_back (elt ? elt->dup (scope, context) : 0); |
5861 | 704 } |
705 | |
706 new_idx_expr->args = new_args; | |
707 | |
708 new_idx_expr->type = type; | |
709 | |
710 new_idx_expr->arg_nm = arg_nm; | |
711 | |
712 std::list<tree_expression *> new_dyn_field; | |
713 | |
714 for (std::list<tree_expression *>::iterator p = dyn_field.begin (); | |
715 p != dyn_field.end (); | |
716 p++) | |
717 { | |
718 tree_expression *elt = *p; | |
719 | |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
720 new_dyn_field.push_back (elt ? elt->dup (scope, context) : 0); |
5861 | 721 } |
722 | |
723 new_idx_expr->dyn_field = new_dyn_field; | |
724 | |
725 new_idx_expr->copy_base (*this); | |
726 | |
727 return new_idx_expr; | |
728 } | |
729 | |
2980 | 730 void |
731 tree_index_expression::accept (tree_walker& tw) | |
732 { | |
733 tw.visit_index_expression (*this); | |
734 } | |
735 | |
736 /* | |
737 ;;; Local Variables: *** | |
738 ;;; mode: C++ *** | |
739 ;;; End: *** | |
740 */ |