# HG changeset patch # User John W. Eaton # Date 1361894313 18000 # Node ID 4f6c37cfbdcee1da9715575fbd546556cc06697b # Parent 73a21ade0b6b7d6e45c973dfd4c745261d3a3a96 cleanup lexical_feedback objects * lex.h (lexical_feedback::cleanup): New static member function. * oct-parse.yy (eval_string, parse_fcn_file): Put new clenup function on unwind-protect stack to delete lexer object. * input.cc (get_debug_input): Likewise. * toplev.cc (main_loop): Likewise. diff -r 73a21ade0b6b -r 4f6c37cfbdce libinterp/interpfcn/input.cc --- a/libinterp/interpfcn/input.cc Tue Feb 26 02:52:48 2013 -0500 +++ b/libinterp/interpfcn/input.cc Tue Feb 26 10:58:33 2013 -0500 @@ -680,6 +680,7 @@ frame.protect_var (curr_lexer); curr_lexer = new lexical_feedback (); + frame.add_fcn (lexical_feedback::cleanup, curr_lexer); while (Vdebugging) { diff -r 73a21ade0b6b -r 4f6c37cfbdce libinterp/interpfcn/toplev.cc --- a/libinterp/interpfcn/toplev.cc Tue Feb 26 02:52:48 2013 -0500 +++ b/libinterp/interpfcn/toplev.cc Tue Feb 26 10:58:33 2013 -0500 @@ -561,6 +561,7 @@ frame.protect_var (curr_lexer); curr_lexer = new lexical_feedback (); + frame.add_fcn (lexical_feedback::cleanup, curr_lexer); // The big loop. diff -r 73a21ade0b6b -r 4f6c37cfbdce libinterp/parse-tree/lex.h --- a/libinterp/parse-tree/lex.h Tue Feb 26 02:52:48 2013 -0500 +++ b/libinterp/parse-tree/lex.h Tue Feb 26 10:58:33 2013 -0500 @@ -377,6 +377,9 @@ // information. std::stack token_stack; + // For unwind protect. + static void cleanup (lexical_feedback *lexer) { delete lexer; } + private: // No copying! diff -r 73a21ade0b6b -r 4f6c37cfbdce libinterp/parse-tree/oct-parse.yy --- a/libinterp/parse-tree/oct-parse.yy Tue Feb 26 02:52:48 2013 -0500 +++ b/libinterp/parse-tree/oct-parse.yy Tue Feb 26 10:58:33 2013 -0500 @@ -3500,8 +3500,8 @@ bool eof; frame.protect_var (curr_lexer); - curr_lexer = new lexical_feedback (); + frame.add_fcn (lexical_feedback::cleanup, curr_lexer); reset_parser (); @@ -4306,6 +4306,8 @@ unwind_protect frame; frame.protect_var (curr_lexer); + curr_lexer = new lexical_feedback (); + frame.add_fcn (lexical_feedback::cleanup, curr_lexer); frame.protect_var (get_input_from_eval_string); frame.protect_var (line_editing); @@ -4319,8 +4321,6 @@ frame.protect_var (reading_script_file); frame.protect_var (reading_classdef_file); - curr_lexer = new lexical_feedback (); - get_input_from_eval_string = true; line_editing = false; current_function_depth = 0;