Mercurial > octave
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,