# HG changeset patch # User Jaroslav Hajek # Date 1257154137 -3600 # Node ID 0df32e0b2074031f69f0c13ee9c8b2a1057d93e5 # Parent 82fe4db20decd3d0ee6e12784695543fe635803f fix base class field assignment diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2009-11-02 Jaroslav Hajek + + * ov-class.cc (octave_class::unique_parent_class): New method. + (octave_class::subsasgn): Use it here. + * ov-class.h: Declare it. + 2009-11-01 John W. Eaton * data.cc (get_sort_mode_option): New function. diff --git a/src/ov-base.h b/src/ov-base.h --- a/src/ov-base.h +++ b/src/ov-base.h @@ -521,6 +521,9 @@ virtual octave_base_value *find_parent_class (const std::string&) { return 0; } + virtual octave_base_value *unique_parent_class (const std::string&) + { return 0; } + virtual octave_function *function_value (bool silent = false); virtual const octave_function *function_value (bool silent = false) const; diff --git a/src/ov-class.cc b/src/ov-class.cc --- a/src/ov-class.cc +++ b/src/ov-class.cc @@ -794,7 +794,7 @@ std::string method_class = get_current_method_class (); - octave_base_value *obvp = find_parent_class (method_class); + octave_base_value *obvp = unique_parent_class (method_class); if (obvp) { @@ -930,6 +930,44 @@ return retval; } +octave_base_value * +octave_class::unique_parent_class (const std::string& parent_class_name) +{ + octave_base_value* retval = 0; + + if (parent_class_name == class_name ()) + retval = this; + else + { + for (std::list::iterator pit = parent_list.begin (); + pit != parent_list.end (); + pit++) + { + Octave_map::iterator smap = map.seek (*pit); + + Cell& tmp = smap->second; + + octave_value& vtmp = tmp(0); + + octave_base_value *obvp = vtmp.internal_rep (); + + // Use find_parent_class first to avoid uniquifying if not necessary. + retval = obvp->find_parent_class (parent_class_name); + + if (retval) + { + vtmp.make_unique (); + obvp = vtmp.internal_rep (); + retval = obvp->unique_parent_class (parent_class_name); + + break; + } + } + } + + return retval; +} + void octave_class::print (std::ostream& os, bool) const { diff --git a/src/ov-class.h b/src/ov-class.h --- a/src/ov-class.h +++ b/src/ov-class.h @@ -141,6 +141,8 @@ octave_base_value *find_parent_class (const std::string&); + octave_base_value *unique_parent_class (const std::string&); + void print (std::ostream& os, bool pr_as_read_syntax = false) const; void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;