changeset 16133:249d62b3fac8

new class for parser state * oct-parse.yy, parse.h (octave_parser): New class (curr_parser): New global variable. * oct-parse.yy (eval_string, parse_fcn_file): Save curr_parser on unwind_protect stack. Create new curr_parser and arrange for it to be cleaned up. * toplev.cc (main_loop): Likewise. * input.cc (get_debug_input): Likewise.
author John W. Eaton <jwe@octave.org>
date Tue, 26 Feb 2013 20:10:00 -0500
parents 43e6415393ff
children ec9c6222ef5a
files libinterp/interpfcn/input.cc libinterp/interpfcn/toplev.cc libinterp/parse-tree/oct-parse.yy libinterp/parse-tree/parse.h
diffstat 4 files changed, 43 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/interpfcn/input.cc	Tue Feb 26 16:52:33 2013 -0800
+++ b/libinterp/interpfcn/input.cc	Tue Feb 26 20:10:00 2013 -0500
@@ -682,6 +682,10 @@
   curr_lexer = new lexical_feedback ();
   frame.add_fcn (lexical_feedback::cleanup, curr_lexer);
 
+  frame.protect_var (curr_parser);
+  curr_parser = new octave_parser ();
+  frame.add_fcn (octave_parser::cleanup, curr_parser);
+
   while (Vdebugging)
     {
       unwind_protect middle_frame;
--- a/libinterp/interpfcn/toplev.cc	Tue Feb 26 16:52:33 2013 -0800
+++ b/libinterp/interpfcn/toplev.cc	Tue Feb 26 20:10:00 2013 -0500
@@ -563,6 +563,10 @@
   curr_lexer = new lexical_feedback ();
   frame.add_fcn (lexical_feedback::cleanup, curr_lexer);
 
+  frame.protect_var (curr_parser);
+  curr_parser = new octave_parser ();
+  frame.add_fcn (octave_parser::cleanup, curr_parser);
+
   // The big loop.
 
   int retval = 0;
--- a/libinterp/parse-tree/oct-parse.yy	Tue Feb 26 16:52:33 2013 -0800
+++ b/libinterp/parse-tree/oct-parse.yy	Tue Feb 26 20:10:00 2013 -0500
@@ -86,6 +86,9 @@
 #define malloc GNULIB_NAMESPACE::malloc
 #endif
 
+// The state of the parser.
+octave_parser *curr_parser = 0;
+
 // Buffer for help text snagged from function files.
 std::stack<std::string> help_buf;
 
@@ -3503,6 +3506,10 @@
       curr_lexer = new lexical_feedback ();
       frame.add_fcn (lexical_feedback::cleanup, curr_lexer);
 
+      frame.protect_var (curr_parser);
+      curr_parser = new octave_parser ();
+      frame.add_fcn (octave_parser::cleanup, curr_parser);
+
       curr_lexer->reset_parser ();
 
       std::string help_txt = gobble_leading_white_space (ffile, eof);
@@ -4309,6 +4316,10 @@
   curr_lexer = new lexical_feedback ();
   frame.add_fcn (lexical_feedback::cleanup, curr_lexer);
 
+  frame.protect_var (curr_parser);
+  curr_parser = new octave_parser ();
+  frame.add_fcn (octave_parser::cleanup, curr_parser);
+
   frame.protect_var (get_input_from_eval_string);
   frame.protect_var (line_editing);
   frame.protect_var (current_eval_string);
--- a/libinterp/parse-tree/parse.h	Tue Feb 26 16:52:33 2013 -0800
+++ b/libinterp/parse-tree/parse.h	Tue Feb 26 20:10:00 2013 -0500
@@ -107,4 +107,28 @@
 
 extern OCTINTERP_API int octave_parse_input (void);
 
+class
+octave_parser
+{
+public:
+
+  octave_parser (void) { }
+
+  ~octave_parser (void) { }
+
+  // For unwind protect.
+  static void cleanup (octave_parser *parser) { delete parser; }
+
+private:
+
+  // No copying!
+
+  octave_parser (const octave_parser&);
+
+  octave_parser& operator = (const octave_parser&);
+};
+
+// The current state of the parser.
+extern octave_parser *curr_parser;
+
 #endif