Mercurial > hg > octave-lyh
changeset 3239:d54ef0aa6e82
[project @ 1999-03-27 17:40:45 by jwe]
author | jwe |
---|---|
date | Sat, 27 Mar 1999 17:40:46 +0000 |
parents | 041ea33fbbf4 |
children | 2e74d8aa1a20 |
files | src/ChangeLog src/ov-usr-fcn.cc src/ov-usr-fcn.h src/ov.h src/pt-misc.cc src/pt-misc.h src/symtab.cc src/symtab.h src/variables.cc |
diffstat | 9 files changed, 127 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,17 @@ +Sat Mar 27 11:07:51 1999 John W. Eaton <jwe@bevo.che.wisc.edu> + + * ov.h (octave_value::count): New function. + * symtab.cc (symbol_record::dump_symbol_info): New function. + * symtab.cc (symbol_record::symbol_def::dump_symbol_info): Ditto. + * variables.cc (F__dump_symbol_info__): Ditto. + + * pt-misc.cc (tree_parameter_list::clear): New function. + * ov-usr-fcn.h (octave_user_function::clear_args_passed): Ditto. + * ov-usr-fcn.cc (clear_param_list): New function. + (clear_args_passed): New function. + (octave_user_function::do_index_op): Use them to decrement + reference counts on local variables. + Fri Mar 26 00:51:53 1999 John W. Eaton <jwe@bevo.che.wisc.edu> * Makefile.in (libraries): Use the libfoo.a(objects) method of
--- a/src/ov-usr-fcn.cc +++ b/src/ov-usr-fcn.cc @@ -226,6 +226,24 @@ } static void +clear_param_list (void *lst) +{ + tree_parameter_list *tmp = static_cast<tree_parameter_list *> (lst); + + if (tmp) + tmp->clear (); +} + +static void +clear_args_passed (void *fcn) +{ + octave_user_function *tmp = static_cast<octave_user_function *> (fcn); + + if (tmp) + tmp->clear_args_passed (); +} + +static void unprotect_function (void *sr_arg) { symbol_record *sr = static_cast<symbol_record *> (sr_arg); @@ -302,6 +320,12 @@ args_passed = args; + // Force cache of arguments to be undefined when this function exits. + // Doing so decrements the reference counts on the values of local + // variables that are also named function parameters. + + unwind_protect::add (::clear_args_passed, this); + string_vector arg_names = args.name_tags (); unwind_protect_int (num_args_passed); @@ -317,6 +341,12 @@ goto abort; } + // Force parameter list to be undefined when this function exits. + // Doing so decrements the reference counts on the values of local + // variables that are also named function parameters. + + unwind_protect::add (clear_param_list, param_list); + if (ret_list && Vdefine_all_return_values) { octave_value tmp = builtin_any_variable ("default_return_value"); @@ -325,6 +355,12 @@ ret_list->initialize_undefined_elements (tmp); } + // Force return list to be undefined when this function exits. + // Doing so decrements the reference counts on the values of local + // variables that are also named values returned by this function. + + unwind_protect::add (clear_param_list, ret_list); + // The following code is in a separate scope to avoid warnings from // G++ about `goto abort' crossing the initialization of some // variables.
--- a/src/ov-usr-fcn.h +++ b/src/ov-usr-fcn.h @@ -111,6 +111,9 @@ string function_name (void) { return fcn_name; } + void clear_args_passed (void) + { args_passed = octave_value_list (); } + octave_value_list do_index_op (int nargout, const octave_value_list& args); void traceback_error (void);
--- a/src/ov.h +++ b/src/ov.h @@ -222,6 +222,8 @@ return *this; } + int count (void) { return rep->count; } + virtual type_conv_fcn numeric_conversion_function (void) const { return rep->numeric_conversion_function (); }
--- a/src/pt-misc.cc +++ b/src/pt-misc.cc @@ -110,6 +110,25 @@ } } +void +tree_parameter_list::clear (void) +{ + int len = length (); + + Pix p = first (); + + for (int i = 0; i < len; i++) + { + tree_identifier *elt = this->operator () (p); + + octave_lvalue ref = elt->lvalue (); + + ref.assign (octave_value::asn_eq, octave_value ()); + + next (p); + } +} + octave_value_list tree_parameter_list::convert_to_const_vector (tree_va_return_list *vr_list) {
--- a/src/pt-misc.h +++ b/src/pt-misc.h @@ -73,6 +73,8 @@ void define_from_arg_vector (const octave_value_list& args); + void clear (void); + bool is_defined (void); octave_value_list convert_to_const_vector (tree_va_return_list *vr_list);
--- a/src/symtab.cc +++ b/src/symtab.cc @@ -48,6 +48,14 @@ octave_allocator symbol_record::symbol_def::allocator (sizeof (symbol_record::symbol_def)); +void +symbol_record::symbol_def::dump_symbol_info (void) +{ + octave_stdout << "symbol_def::count: " << count << "\n"; + octave_stdout << "def.type_name(): " << definition.type_name () << "\n"; + octave_stdout << "def.count(): " << definition.count () << "\n"; +} + // Individual records in a symbol table. // XXX FIXME XXX -- there are lots of places below where we should @@ -304,6 +312,15 @@ os << " " << name () << "\n"; } +void +symbol_record::dump_symbol_info (void) +{ + if (definition) + definition->dump_symbol_info (); + else + octave_stdout << "symbol " << name () << " is undefined\n"; +} + bool symbol_record::read_only_error (const char *action) {
--- a/src/symtab.h +++ b/src/symtab.h @@ -177,6 +177,8 @@ // Reference count. int count; + void dump_symbol_info (void); + // No copying! symbol_def (const symbol_def& sd); @@ -295,6 +297,8 @@ void print_symbol_info_line (ostream& os); + void dump_symbol_info (void); + private: unsigned int formal_param : 1;
--- a/src/variables.cc +++ b/src/variables.cc @@ -1148,6 +1148,36 @@ return retval; } +DEFUN (__dump_symbol_info__, args, , + "__dump_symbol_info__ (NAME)") +{ + octave_value_list retval; + + int nargin = args.length (); + + if (nargin == 1) + { + string symbol_name = args(0).string_value (); + + if (! error_state) + { + symbol_record *sr = curr_sym_tab->lookup (symbol_name); + + if (sr) + sr->dump_symbol_info (); + else + error ("__dymp_symbol_info__: symbol %s not found", + symbol_name.c_str ()); + } + else + print_usage ("__dump_symbol_info__"); + } + else + print_usage ("__dump_symbol_info__"); + + return retval; +} + // XXX FIXME XXX -- some of these should do their own checking to be // able to provide more meaningful warning or error messages.