changeset 16691:50c8831878d2 classdef

Implement multilevel subsasgn for scalar objects. * libinterp/octave-value/ov-classdef.cc (cdef_object_scalar::subsasgn): Implement assignment for multilevel indexing. * test/classdef/classdef.tst: Remove expected failure for multilevel property indexing/assignment.
author Michael Goffioul <michael.goffioul@gmail.com>
date Mon, 20 May 2013 20:17:19 -0400
parents 1c45e22fc444
children b9833510355d
files libinterp/octave-value/ov-classdef.cc test/classdef/classdef.tst
diffstat 2 files changed, 37 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-classdef.cc	Mon May 20 14:37:25 2013 -0400
+++ b/libinterp/octave-value/ov-classdef.cc	Mon May 20 20:17:19 2013 -0400
@@ -1125,23 +1125,47 @@
 
               if (prop.ok ())
                 {
-                  if (type.length () == 1)
+                  if (prop.is_constant ())
+                    error ("subsasgn: cannot assign constant property: %s",
+                           name.c_str ());
+                  else
                     {
                       refcount++;
 
                       cdef_object obj (this);
 
-                      prop.set_value (obj, rhs, true, "subsasgn");
-
-                      if (! error_state)
-                        retval = to_ov (obj);
-                    }
-                  else
-                    {
-                    }
-
-                  if (! error_state)
-                    {
+                      if (type.length () == 1)
+                        {
+                          prop.set_value (obj, rhs, true, "subsasgn");
+
+                          if (! error_state)
+                            retval = to_ov (obj);
+                        }
+                      else
+                        {
+                          octave_value val = 
+                            prop.get_value (obj, true, "subsasgn");
+
+                          if (! error_state)
+                            {
+                              std::list<octave_value_list> args (idx);
+
+                              args.erase (args.begin ());
+
+                              val = val.assign (octave_value::op_asn_eq,
+                                                type.substr (1), args, rhs);
+
+                              if (! error_state)
+                                {
+                                  if (val.class_name () != "object"
+                                      || ! to_cdef (val).is_handle_object ())
+                                    prop.set_value (obj, val, true, "subsasgn");
+
+                                  if (! error_state)
+                                    retval = to_ov (obj);
+                                }
+                            }
+                        }
                     }
                 }
               else
--- a/test/classdef/classdef.tst	Mon May 20 14:37:25 2013 -0400
+++ b/test/classdef/classdef.tst	Mon May 20 20:17:19 2013 -0400
@@ -67,7 +67,7 @@
 %! assert (obj.cosine (0.1), cos (2 * pi * 10 * 0.1), eps ())
 %! assert (obj.sine (0.1), sin (2 * pi * 10 * 0.1), eps ())
 
-%!xtest
+%!test
 %! obj = foo_method_changes_property_size (3);
 %! obj = obj.move_element_to_end (2);
 %! assert (obj.element, [1 3 2])