# HG changeset patch # User jwe # Date 1193200797 0 # Node ID c344920f9e9d5d3b4999994796f2d56d0ebfbad6 # Parent 2002804df7828f9092ed623cb2043d5b869a0edf [project @ 2007-10-24 04:39:57 by jwe] diff -r 2002804df782 -r c344920f9e9d src/ChangeLog --- a/src/ChangeLog Wed Oct 24 00:32:44 2007 +0000 +++ b/src/ChangeLog Wed Oct 24 04:39:57 2007 +0000 @@ -1,3 +1,9 @@ +2007-10-24 John W. Eaton + + * pt-idx.cc (tree_index_expression::lvalue): Correctly compute + number of elements in lvalue expression when last indexing + element is ".". + 2007-10-23 John W. Eaton * graphics.cc (is_handle (const graphics_handle&)): New function. diff -r 2002804df782 -r c344920f9e9d src/pt-idx.cc --- a/src/pt-idx.cc Wed Oct 24 00:32:44 2007 +0000 +++ b/src/pt-idx.cc Wed Oct 24 04:39:57 2007 +0000 @@ -480,16 +480,53 @@ if (! error_state) { - idx.push_back (tidx); - if (i == n-1) { // Last indexing element. Will this result in a // comma-separated list? if (first_retval_object.is_map ()) - retval.numel (first_retval_object.numel ()); + { + if (i > 0) + { + octave_value_list xidx = idx.back (); + + if (xidx.has_magic_colon ()) + { + std::string ttype = type.substr (0, i); + + octave_value_list tmp_list + = first_retval_object.subsref (ttype, idx, 1); + + if (! error_state) + { + octave_value val = tmp_list(0); + + retval.numel (val.numel ()); + } + } + else + { + octave_idx_type nel = 1; + + octave_idx_type nidx = xidx.length (); + + for (octave_idx_type j = 0; j < nidx; j++) + { + octave_value val = xidx(j); + + nel *= val.numel (); + } + + retval.numel (nel); + } + } + else + retval.numel (first_retval_object.numel ()); + } } + + idx.push_back (octave_value (tidx)); } else eval_error ();