diff src/ov-class.cc @ 9767:0df32e0b2074

fix base class field assignment
author Jaroslav Hajek <highegg@gmail.com>
date Mon, 02 Nov 2009 10:28:57 +0100
parents 318e0cdd31bd
children fbf15a0f30f0
line wrap: on
line diff
--- a/src/ov-class.cc	Mon Nov 02 07:16:30 2009 +0100
+++ b/src/ov-class.cc	Mon Nov 02 10:28:57 2009 +0100
@@ -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<std::string>::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
 {