changeset 23533:8edbc923a7dc

begin refactoring use of interpreter/evaluator in classdef objects * ov-classdef.h, ov-classdef.cc (install_classdef): Pass reference to interpreter instead of pointer to evaluator. Change use. (is_method_executing): Use __get_evaluator__. (make_class, make_meta_class): Don't pass pointer to evaluator. Change all uses. (cdef_class::m_evaluator, cdef_class::cdef_class_rep::m_evaluator): Delete. (compute_attribute_value): Pass reference to evaluator, instead of pointer. Change all uses. (cdef_class::make_meta_class): Likewise. (package_getAllPackages): Pass reference to interpreter as first arg.
author John W. Eaton <jwe@octave.org>
date Thu, 25 May 2017 13:13:17 -0400
parents 084245f9bd03
children b6498c088fca
files libinterp/corefcn/interpreter.cc libinterp/octave-value/ov-classdef.cc libinterp/octave-value/ov-classdef.h libinterp/parse-tree/oct-parse.in.yy libinterp/parse-tree/pt-classdef.cc libinterp/parse-tree/pt-classdef.h
diffstat 6 files changed, 83 insertions(+), 81 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/interpreter.cc	Thu May 25 13:13:17 2017 -0400
+++ b/libinterp/corefcn/interpreter.cc	Thu May 25 13:13:17 2017 -0400
@@ -425,7 +425,7 @@
 
     install_builtins ();
 
-    install_classdef (m_evaluator);
+    install_classdef (*this);
 
     bool line_editing = false;
     bool traditional = false;
--- a/libinterp/octave-value/ov-classdef.cc	Thu May 25 13:13:17 2017 -0400
+++ b/libinterp/octave-value/ov-classdef.cc	Thu May 25 13:13:17 2017 -0400
@@ -637,10 +637,10 @@
 }
 
 static cdef_class
-make_class (octave::tree_evaluator *tw, const std::string& name,
+make_class (const std::string& name,
             const std::list<cdef_class>& super_list = std::list<cdef_class> ())
 {
-  cdef_class cls (tw, name, super_list);
+  cdef_class cls (name, super_list);
 
   cls.set_class (cdef_class::meta_class ());
   cls.put ("Abstract", false);
@@ -692,17 +692,15 @@
 }
 
 static cdef_class
-make_class (octave::tree_evaluator *tw, const std::string& name,
-            const cdef_class& super)
+make_class (const std::string& name, const cdef_class& super)
 {
-  return make_class (tw, name, std::list<cdef_class> (1, super));
+  return make_class (name, std::list<cdef_class> (1, super));
 }
 
 static cdef_class
-make_meta_class (octave::tree_evaluator *tw, const std::string& name,
-                 const cdef_class& super)
+make_meta_class (const std::string& name, const cdef_class& super)
 {
-  cdef_class cls = make_class (tw, name, super);
+  cdef_class cls = make_class (name, super);
 
   cls.put ("Sealed", true);
   cls.mark_as_meta_class ();
@@ -791,6 +789,16 @@
   return make_method (cls, name, fcn, m_access, is_static);
 }
 
+inline cdef_method
+make_method (const cdef_class& cls, const std::string& name,
+             octave_builtin::meth mm, const std::string& m_access = "public",
+             bool is_static = false)
+{
+  octave_value fcn (new octave_builtin (mm, name));
+
+  return make_method (cls, name, fcn, m_access, is_static);
+}
+
 static cdef_package
 make_package (const std::string& nm,
               const std::string& parent = "")
@@ -1738,10 +1746,9 @@
 #endif
 }
 
-cdef_class::cdef_class_rep::cdef_class_rep (octave::tree_evaluator *tw,
-                                            const std::list<cdef_class>& superclasses)
-  : cdef_meta_object_rep (), m_evaluator (tw), member_count (0),
-    handle_class (false), object_count (0), meta (false)
+cdef_class::cdef_class_rep::cdef_class_rep (const std::list<cdef_class>& superclasses)
+  : cdef_meta_object_rep (), member_count (0), handle_class (false),
+    object_count (0), meta (false)
 {
   put ("SuperClasses", to_ov (superclasses));
   implicit_ctor_list = superclasses;
@@ -2396,8 +2403,7 @@
       if (this_cls == cdef_class::meta_class ())
         {
           if (! empty_class.ok ())
-            empty_class = make_class (m_evaluator, "",
-                                      std::list<cdef_class> ());
+            empty_class = make_class ("", std::list<cdef_class> ());
           obj = empty_class;
         }
       else if (this_cls == cdef_class::meta_property ())
@@ -2405,8 +2411,7 @@
           static cdef_property empty_property;
 
           if (! empty_class.ok ())
-            empty_class = make_class (m_evaluator, "",
-                                      std::list<cdef_class> ());
+            empty_class = make_class ("", std::list<cdef_class> ());
           if (! empty_property.ok ())
             empty_property = make_property (empty_class, "");
           obj = empty_property;
@@ -2416,8 +2421,7 @@
           static cdef_method empty_method;
 
           if (! empty_class.ok ())
-            empty_class = make_class (m_evaluator, "",
-                                      std::list<cdef_class> ());
+            empty_class = make_class ("", std::list<cdef_class> ());
           if (! empty_method.ok ())
             empty_method = make_method (empty_class, "", octave_value ());
           obj = empty_method;
@@ -2454,7 +2458,7 @@
 }
 
 static octave_value
-compute_attribute_value (octave::tree_evaluator *tw,
+compute_attribute_value (octave::tree_evaluator& tw,
                          octave::tree_classdef_attribute *t)
 {
   octave::tree_expression *expr = t->expression ();
@@ -2473,7 +2477,7 @@
             return std::string ("private");
         }
 
-      return tw->evaluate (expr);
+      return tw.evaluate (expr);
     }
   else
     return octave_value (true);
@@ -2492,7 +2496,7 @@
 }
 
 cdef_class
-cdef_class::make_meta_class (octave::tree_evaluator *tw,
+cdef_class::make_meta_class (octave::interpreter& interp,
                              octave::tree_classdef *t, bool is_at_folder)
 {
   cdef_class retval;
@@ -2530,7 +2534,7 @@
         }
     }
 
-  retval = ::make_class (tw, full_class_name, slist);
+  retval = ::make_class (full_class_name, slist);
 
   // Package owning this class
 
@@ -2544,6 +2548,8 @@
 
   // Class attributes
 
+  octave::tree_evaluator& tw = interp.get_evaluator ();
+
   if (t->attribute_list ())
     {
       for (const auto& attr : (*t->attribute_list ()))
@@ -2574,8 +2580,7 @@
 
       std::list<octave::tree_classdef_methods_block *> mb_list = b->methods_list ();
 
-      octave::load_path& lp
-        = octave::__get_load_path__ ("cdef_class::make_meta_class");
+      octave::load_path& lp = interp.get_load_path ();
 
       for (auto& mb_p : mb_list)
         {
@@ -2733,7 +2738,7 @@
                   octave::tree_expression *expr = prop_p->expression ();
                   if (expr)
                     {
-                      octave_value pvalue = tw->evaluate (expr);
+                      octave_value pvalue = tw.evaluate (expr);
 
 #if DEBUG_TRACE
                       std::cerr << "property default: "
@@ -3134,11 +3139,12 @@
 }
 
 static octave_value_list
-package_getAllPackages (const octave_value_list& /* args */, int /* nargout */)
+package_getAllPackages (octave::interpreter& interp,
+                        const octave_value_list& /* args */, int /* nargout */)
 {
   std::map<std::string, cdef_package> toplevel_packages;
 
-  octave::load_path& lp = octave::__get_load_path__ ("package_getAllPackages");
+  octave::load_path& lp = interp.get_load_path ();
 
   std::list<std::string> names = lp.get_all_package_names ();
 
@@ -3304,23 +3310,38 @@
 cdef_package cdef_package::_meta = cdef_package ();
 
 void
-install_classdef (octave::tree_evaluator *tw)
+install_classdef (octave::interpreter& /* interp */)
 {
   octave_classdef::register_type ();
 
   // bootstrap
-  cdef_class handle = make_class (tw, "handle");
-  cdef_class meta_class = cdef_class::_meta_class = make_meta_class (tw, "meta.class", handle);
+  cdef_class handle = make_class ("handle");
+
+  cdef_class meta_class
+    = cdef_class::_meta_class
+    = make_meta_class ("meta.class", handle);
+
   handle.set_class (meta_class);
   meta_class.set_class (meta_class);
 
   // meta classes
-  cdef_class meta_property = cdef_class::_meta_property = make_meta_class (tw, "meta.property", handle);
-  cdef_class meta_method = cdef_class::_meta_method = make_meta_class (tw, "meta.method", handle);
-  cdef_class meta_package = cdef_class::_meta_package = make_meta_class (tw, "meta.package", handle);
-
-  cdef_class meta_event = make_meta_class (tw, "meta.event", handle);
-  cdef_class meta_dynproperty = make_meta_class (tw, "meta.dynamicproperty", handle);
+  cdef_class meta_property
+    = cdef_class::_meta_property
+    = make_meta_class ("meta.property", handle);
+
+  cdef_class meta_method
+    = cdef_class::_meta_method
+    = make_meta_class ("meta.method", handle);
+
+  cdef_class meta_package
+    = cdef_class::_meta_package
+    = make_meta_class ("meta.package", handle);
+
+  cdef_class meta_event
+    = make_meta_class ("meta.event", handle);
+
+  cdef_class meta_dynproperty
+    = make_meta_class ("meta.dynamicproperty", handle);
 
   // meta.class properties
   meta_class.install_property (make_attribute (meta_class, "Abstract"));
--- a/libinterp/octave-value/ov-classdef.h	Thu May 25 13:13:17 2017 -0400
+++ b/libinterp/octave-value/ov-classdef.h	Thu May 25 13:13:17 2017 -0400
@@ -42,8 +42,8 @@
 
 namespace octave
 {
+  class interpreter;
   class tree_classdef;
-  class tree_evaluator;
 }
 
 // This is mainly a boostrap class to declare the expected interface.
@@ -342,11 +342,9 @@
 
   void unregister_object (void);
 
-private:
   // The class of the object
   cdef_object klass;
 
-private:
   // No assignment!
   cdef_object_base& operator = (const cdef_object_base&);
 };
@@ -383,7 +381,6 @@
 private:
   Array<cdef_object> array;
 
-private:
   void fill_empty_values (void) { fill_empty_values (array); }
 
   void fill_empty_values (Array<cdef_object>& arr);
@@ -617,12 +614,11 @@
   {
   public:
     cdef_class_rep (void)
-      : cdef_meta_object_rep (), m_evaluator (0), member_count (0),
-        handle_class (false), object_count (0), meta (false)
+      : cdef_meta_object_rep (), member_count (0), handle_class (false),
+        object_count (0), meta (false)
     { }
 
-    cdef_class_rep (octave::tree_evaluator *tw,
-                    const std::list<cdef_class>& superclasses);
+    cdef_class_rep (const std::list<cdef_class>& superclasses);
 
     cdef_object_rep * copy (void) const { return new cdef_class_rep (*this); }
 
@@ -705,9 +701,8 @@
 
     bool is_meta_class (void) const { return meta; }
 
-    octave::tree_evaluator * evaluator (void) const { return m_evaluator; }
+  private:
 
-  private:
     void load_all_methods (void);
 
     void find_names (std::set<std::string>& names, bool all);
@@ -724,10 +719,6 @@
       return cdef_class (this);
     }
 
-  private:
-
-    octave::tree_evaluator *m_evaluator;
-
     // The @-directory were this class is loaded from.
     // (not used yet)
     std::string directory;
@@ -762,10 +753,8 @@
     typedef std::map<std::string,cdef_property>::iterator property_iterator;
     typedef std::map<std::string,cdef_property>::const_iterator property_const_iterator;
 
-  private:
     cdef_class_rep (const cdef_class_rep& c)
-      : cdef_meta_object_rep (c), m_evaluator (c.m_evaluator),
-        directory (c.directory),
+      : cdef_meta_object_rep (c), directory (c.directory),
         method_map (c.method_map), property_map (c.property_map),
         member_count (c.member_count), handle_class (c.handle_class),
         implicit_ctor_list (c.implicit_ctor_list),
@@ -777,9 +766,8 @@
   cdef_class (void)
     : cdef_meta_object () { }
 
-  cdef_class (octave::tree_evaluator *tw, const std::string& nm,
-              const std::list<cdef_class>& superclasses)
-    : cdef_meta_object (new cdef_class_rep (tw, superclasses))
+  cdef_class (const std::string& nm, const std::list<cdef_class>& superclasses)
+    : cdef_meta_object (new cdef_class_rep (superclasses))
   { get_rep ()->set_name (nm); }
 
   cdef_class (const cdef_class& cls)
@@ -841,9 +829,9 @@
   void delete_object (cdef_object obj)
   { get_rep ()->delete_object (obj); }
 
-  static cdef_class make_meta_class (octave::tree_evaluator *tw,
-                                     octave::tree_classdef *t,
-                                     bool is_at_folder = false);
+  static cdef_class
+  make_meta_class (octave::interpreter& interp, octave::tree_classdef *t,
+                   bool is_at_folder = false);
 
   octave_function * get_method_function (const std::string& nm);
 
@@ -896,20 +884,16 @@
   const cdef_class_rep * get_rep (void) const
   { return dynamic_cast<const cdef_class_rep *> (cdef_object::get_rep ()); }
 
-  octave::tree_evaluator * evaluator (void) const
-  { return get_rep ()->evaluator (); }
-
   friend bool operator == (const cdef_class&, const cdef_class&);
   friend bool operator != (const cdef_class&, const cdef_class&);
   friend bool operator < (const cdef_class&, const cdef_class&);
 
-private:
   static cdef_class _meta_class;
   static cdef_class _meta_property;
   static cdef_class _meta_method;
   static cdef_class _meta_package;
 
-  friend void install_classdef (octave::tree_evaluator *);
+  friend void install_classdef (octave::interpreter& interp);
 };
 
 inline bool
@@ -1103,7 +1087,6 @@
       return cdef_method (this);
     }
 
-  private:
     octave_value function;
 
     // When non-empty, the method is externally defined and this member
@@ -1332,7 +1315,6 @@
     typedef std::map<std::string, cdef_package>::iterator package_iterator;
     typedef std::map<std::string, cdef_package>::const_iterator package_const_iterator;
 
-  private:
     cdef_package_rep (const cdef_package_rep& p)
       : cdef_meta_object_rep (p), full_name (p.full_name),
         class_map (p.class_map), function_map (p.function_map),
@@ -1403,10 +1385,9 @@
   const cdef_package_rep * get_rep (void) const
   { return dynamic_cast<const cdef_package_rep *> (cdef_object::get_rep ()); }
 
-private:
   static cdef_package _meta;
 
-  friend void install_classdef (octave::tree_evaluator *);
+  friend void install_classdef (octave::interpreter& interp);
 };
 
 class
@@ -1481,11 +1462,6 @@
 
   dim_vector dims (void) const { return object.dims (); }
 
-private:
-  cdef_object object;
-
-private:
-
 public:
   int type_id (void) const { return t_id; }
   std::string type_name (void) const { return t_name; }
@@ -1497,6 +1473,9 @@
   static void register_type (void);
 
 private:
+
+  cdef_object object;
+
   static int t_id;
 
   static const std::string t_name;
@@ -1537,7 +1516,7 @@
 to_cdef (const cdef_object& obj)
 { return obj; }
 
-OCTINTERP_API void install_classdef (octave::tree_evaluator *);
+OCTINTERP_API void install_classdef (octave::interpreter& interp);
 
 class
 cdef_manager
--- a/libinterp/parse-tree/oct-parse.in.yy	Thu May 25 13:13:17 2017 -0400
+++ b/libinterp/parse-tree/oct-parse.in.yy	Thu May 25 13:13:17 2017 -0400
@@ -4353,11 +4353,11 @@
 
               bool is_at_folder = ! dispatch_type.empty ();
 
-              octave::tree_evaluator& tw
-                = octave::__get_evaluator__ ("parse_fcn_file");
+              octave::interpreter& interp
+                = octave::__get_interpreter__ ("parse_fcn_file");
 
               fcn_ptr
-                = parser.classdef_object->make_meta_class (&tw, is_at_folder);
+                = parser.classdef_object->make_meta_class (interp, is_at_folder);
 
               delete (parser.classdef_object);
 
--- a/libinterp/parse-tree/pt-classdef.cc	Thu May 25 13:13:17 2017 -0400
+++ b/libinterp/parse-tree/pt-classdef.cc	Thu May 25 13:13:17 2017 -0400
@@ -145,9 +145,9 @@
   // Classdef
 
   octave_function*
-  tree_classdef::make_meta_class (tree_evaluator *tw, bool is_at_folder)
+  tree_classdef::make_meta_class (interpreter& interp, bool is_at_folder)
   {
-    cdef_class cls = cdef_class::make_meta_class (tw, this, is_at_folder);
+    cdef_class cls = cdef_class::make_meta_class (interp, this, is_at_folder);
 
     if (cls.ok ())
       return cls.get_constructor_function ();
--- a/libinterp/parse-tree/pt-classdef.h	Thu May 25 13:13:17 2017 -0400
+++ b/libinterp/parse-tree/pt-classdef.h	Thu May 25 13:13:17 2017 -0400
@@ -38,6 +38,8 @@
 
 namespace octave
 {
+  class interpreter;
+
   class tree_classdef_attribute
   {
   public:
@@ -669,7 +671,7 @@
 
     const std::string& package_name (void) const { return pack_name; }
 
-    octave_function * make_meta_class (tree_evaluator *tw,
+    octave_function * make_meta_class (interpreter& interp,
                                        bool is_at_folder = false);
 
     tree_classdef * dup (symbol_table::scope_id scope,