# HG changeset patch # User John W. Eaton # Date 1294262255 18000 # Node ID 40f311a6941705ef3c390917dfd4d002c7eadcfb # Parent 08f8b0d96091556d3cdf95bab9829c04ff5a25ad fix OO field access in subfunctions of private functions diff -r 08f8b0d96091 -r 40f311a69417 src/ChangeLog --- a/src/ChangeLog Wed Jan 05 03:23:09 2011 -0500 +++ b/src/ChangeLog Wed Jan 05 16:17:35 2011 -0500 @@ -1,3 +1,16 @@ +2011-01-05 John W. Eaton + + Bug #32060. + + * ov-fcn.h (octave_function::mark_as_private_function): Now virtual. + * ov-usr-fcn.h (octave_function::mark_as_private_fucntion): + New function. Mark subfunctions as private also. + * symtab.cc, symtab.h + (symbol_table::mark_subfunctions_in_scope_as_private, + symbol_table::fcn_info::mark_subfunction_in_scope_as_private, + symbol_table::fcn_info::fcn_info_rep::mark_subfunction_in_scope_as_private): + New functions. + 2011-01-04 John W. Eaton * ov-base-sparse.cc (octave_base_sparse::print_raw): Improve diff -r 08f8b0d96091 -r 40f311a69417 src/ov-fcn.h --- a/src/ov-fcn.h Wed Jan 05 03:23:09 2011 -0500 +++ b/src/ov-fcn.h Wed Jan 05 16:17:35 2011 -0500 @@ -92,7 +92,8 @@ std::string dispatch_class (void) const { return xdispatch_class; } - void mark_as_private_function (const std::string& cname = std::string ()) + virtual void + mark_as_private_function (const std::string& cname = std::string ()) { private_function = true; xdispatch_class = cname; diff -r 08f8b0d96091 -r 40f311a69417 src/ov-usr-fcn.h --- a/src/ov-usr-fcn.h Wed Jan 05 03:23:09 2011 -0500 +++ b/src/ov-usr-fcn.h Wed Jan 05 16:17:35 2011 -0500 @@ -233,6 +233,13 @@ bool takes_var_return (void) const; + void mark_as_private_function (const std::string& cname = std::string ()) + { + symbol_table::mark_subfunctions_in_scope_as_private (local_scope, cname); + + octave_function::mark_as_private_function (cname); + } + void lock_subfunctions (void); void unlock_subfunctions (void); diff -r 08f8b0d96091 -r 40f311a69417 src/symtab.cc --- a/src/symtab.cc Wed Jan 05 03:23:09 2011 -0500 +++ b/src/symtab.cc Wed Jan 05 16:17:35 2011 -0500 @@ -429,6 +429,21 @@ } void +symbol_table::fcn_info::fcn_info_rep:: mark_subfunction_in_scope_as_private + (scope_id scope, const std::string& class_name) +{ + scope_val_iterator p = subfunctions.find (scope); + + if (p != subfunctions.end ()) + { + octave_function *fcn = p->second.function_value (); + + if (fcn) + fcn->mark_as_private_function (class_name); + } +} + +void symbol_table::fcn_info::fcn_info_rep::print_dispatch (std::ostream& os) const { if (dispatch_map.empty ()) diff -r 08f8b0d96091 -r 40f311a69417 src/symtab.h --- a/src/symtab.h Wed Jan 05 03:23:09 2011 -0500 +++ b/src/symtab.h Wed Jan 05 16:17:35 2011 -0500 @@ -594,6 +594,9 @@ subfunctions.erase (p); } + void mark_subfunction_in_scope_as_private (scope_id scope, + const std::string& class_name); + void install_cmdline_function (const octave_value& f) { cmdline_function = f; @@ -824,6 +827,12 @@ rep->erase_subfunction (scope); } + void mark_subfunction_in_scope_as_private (scope_id scope, + const std::string& class_name) + { + rep->mark_subfunction_in_scope_as_private (scope, class_name); + } + void install_cmdline_function (const octave_value& f) { rep->install_cmdline_function (f); @@ -966,6 +975,15 @@ q->second.erase_subfunction (scope); } + static void + mark_subfunctions_in_scope_as_private (scope_id scope, + const std::string& class_name) + { + for (fcn_table_iterator q = fcn_table.begin (); + q != fcn_table.end (); q++) + q->second.mark_subfunction_in_scope_as_private (scope, class_name); + } + static scope_id dup_scope (scope_id scope) { scope_id retval = -1;