# HG changeset patch # User Rik # Date 1601461072 25200 # Node ID 26cfccfee9a073bc39b6a4f876811492bc3ff470 # Parent fd05bcb94ab4d607a606d09f65dc3a6c9ec828e0 Replace unwind_protect with more efficient constructs (bug #59192). * debug.cc, error.cc, ft-text-renderer.cc, load-path.cc, mex.cc, oct-hist.cc, pager.cc, rand.cc, strfns.cc, sysdep.cc, toplev.cc, variables.cc, __delaunayn__.cc, __voronoi__.cc, audiodevinfo.cc, audioread.cc, convhulln.cc, ov-class.cc, ov-struct.cc: Remove unwind_protect frames declared but never used. Replace frame.protect_var () instances with unwind_protect_var<> object. Replace frame.add_fcn () instances with unwind_action<> object. diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/debug.cc --- a/libinterp/corefcn/debug.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/debug.cc Wed Sep 30 03:17:52 2020 -0700 @@ -838,8 +838,6 @@ octave_value_list retval; - octave::unwind_protect frame; - octave_idx_type curr_frame = -1; size_t nskip = 0; diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/error.cc --- a/libinterp/corefcn/error.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/error.cc Wed Sep 30 03:17:52 2020 -0700 @@ -571,10 +571,7 @@ || application::forced_interactive ()) && debug_on_warning () && in_user_code && bptab.debug_on_warn (id)) { - unwind_protect frame; - - frame.protect_var (m_debug_on_warning); - m_debug_on_warning = false; + unwind_protect_var restore_var (m_debug_on_warning, false); tw.enter_debugger (); } diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/ft-text-renderer.cc --- a/libinterp/corefcn/ft-text-renderer.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/ft-text-renderer.cc Wed Sep 30 03:17:52 2020 -0700 @@ -980,9 +980,9 @@ m_strlist = std::list (); - unwind_protect frame; - frame.protect_var (m_do_strlist); - frame.protect_var (m_strlist); + octave::unwind_protect_var restore_var1 (m_do_strlist); + octave::unwind_protect_var> + restore_var2 (m_strlist); m_do_strlist = true; text_to_pixels (txt, pxls, box, ha, va, rot, interp, false); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/load-path.cc --- a/libinterp/corefcn/load-path.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/load-path.cc Wed Sep 30 03:17:52 2020 -0700 @@ -963,8 +963,6 @@ if (! octave_interpreter_ready) return; - unwind_protect frame; - std::string file = sys::file_ops::concat (dir, script_file); sys::file_stat fs (file); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/mex.cc --- a/libinterp/corefcn/mex.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/mex.cc Wed Sep 30 03:17:52 2020 -0700 @@ -4250,10 +4250,8 @@ for (int i = 0; i < nout; i++) argout[i] = nullptr; - octave::unwind_protect_safe frame; - // Save old mex pointer. - frame.protect_var (mex_context); + octave::unwind_protect_var restore_var (mex_context); mex context (mex_fcn); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/oct-hist.cc --- a/libinterp/corefcn/oct-hist.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/oct-hist.cc Wed Sep 30 03:17:52 2020 -0700 @@ -327,12 +327,14 @@ { bool numbered_output = nargout == 0; - unwind_protect frame; + octave::unwind_action restore_history_filename + ([] (const auto& old_filename) + { + command_history::set_file (old_filename); + }, command_history::file ()); string_vector hlist; - frame.add_fcn (command_history::set_file, command_history::file ()); - int nargin = args.length (); // Number of history lines to show (-1 = all) diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/pager.cc --- a/libinterp/corefcn/pager.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/pager.cc Wed Sep 30 03:17:52 2020 -0700 @@ -324,10 +324,10 @@ { if (! m_flushing_output_to_pager) { - unwind_protect frame; - - frame.protect_var (m_really_flush_to_pager); - frame.protect_var (m_flushing_output_to_pager); + octave::unwind_protect_var + restore_var1 (m_really_flush_to_pager); + octave::unwind_protect_var + restore_var2 (m_flushing_output_to_pager); m_really_flush_to_pager = true; m_flushing_output_to_pager = true; diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/rand.cc --- a/libinterp/corefcn/rand.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/rand.cc Wed Sep 30 03:17:52 2020 -0700 @@ -117,10 +117,12 @@ octave_value retval; dim_vector dims; - octave::unwind_protect frame; // Restore current distribution on any exit. - frame.add_fcn (octave::rand::distribution, - octave::rand::distribution ()); + octave::unwind_action restore_distribution + ([] (const auto& old_distribution) + { + octave::rand::distribution (old_distribution); + }, octave::rand::distribution ()); octave::rand::distribution (distribution); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/strfns.cc --- a/libinterp/corefcn/strfns.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/strfns.cc Wed Sep 30 03:17:52 2020 -0700 @@ -901,8 +901,6 @@ size_t length; uint8_t *utf8_str = nullptr; - octave::unwind_protect frame; - utf8_str = octave_u8_conv_from_encoding (codepage, src, srclen, &length); if (! utf8_str) @@ -915,7 +913,11 @@ codepage, std::strerror (errno)); } - frame.add_fcn (::free, static_cast (utf8_str)); + octave::unwind_action free_utf8_str + ([] (const auto utf8_str_ptr) + { + ::free (utf8_str_ptr); + }, static_cast (utf8_str)); octave_idx_type len = length; @@ -953,8 +955,6 @@ size_t length; char *native_bytes = nullptr; - octave::unwind_protect frame; - native_bytes = octave_u8_conv_to_encoding (codepage, src, srclen, &length); if (! native_bytes) @@ -967,7 +967,11 @@ codepage, std::strerror (errno)); } - frame.add_fcn (::free, static_cast (native_bytes)); + octave::unwind_action free_native_bytes + ([] (const auto native_bytes_ptr) + { + ::free (native_bytes_ptr); + }, static_cast (native_bytes)); octave_idx_type len = length; diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/sysdep.cc --- a/libinterp/corefcn/sysdep.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/sysdep.cc Wed Sep 30 03:17:52 2020 -0700 @@ -718,9 +718,12 @@ wchar_t *wcommand = u8_to_wchar (command); wchar_t *wmode = u8_to_wchar (mode); - unwind_protect frame; - frame.add_fcn (::free, static_cast (wcommand)); - frame.add_fcn (::free, static_cast (wmode)); + octave::unwind_action free_memory + ([] (const auto wcommand_ptr, const auto wmode_ptr) + { + ::free (wcommand_ptr); + ::free (wmode_ptr); + }, static_cast (wcommand), static_cast (wmode)); if (wmode && wmode[0] && ! wmode[1]) { @@ -961,9 +964,11 @@ if (result != ERROR_SUCCESS) return result; - unwind_protect frame; - - frame.add_fcn (reg_close_key_wrapper, h_subkey); + octave::unwind_action restore_keys + ([] (const auto& old_subkeys) + { + reg_close_key_wrapper (old_subkeys); + }, h_subkey); std::wstring wname = sys::u8_to_wstring (name); DWORD length = 0; diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/toplev.cc --- a/libinterp/corefcn/toplev.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/toplev.cc Wed Sep 30 03:17:52 2020 -0700 @@ -281,9 +281,11 @@ cmd_str = '"' + cmd_str + '"'; #endif - octave::unwind_protect frame; - - frame.add_fcn (restore_signal_mask, get_signal_mask ()); + octave::unwind_action restore_mask + ([] (const auto signal_mask_ptr) + { + restore_signal_mask (signal_mask_ptr); + }, get_signal_mask ()); octave_unblock_async_signals (); octave_unblock_signal_by_name ("SIGTSTP"); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/corefcn/variables.cc --- a/libinterp/corefcn/variables.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/corefcn/variables.cc Wed Sep 30 03:17:52 2020 -0700 @@ -1399,8 +1399,8 @@ if (val.is_defined ()) { // Ensure auto-restoration. - octave::unwind_protect frame; - frame.protect_var (Vmissing_function_hook); + octave::unwind_protect_var + restore_var (Vmissing_function_hook); // Clear the variable prior to calling the function. const std::string func_name = Vmissing_function_hook; diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/dldfcn/__delaunayn__.cc --- a/libinterp/dldfcn/__delaunayn__.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/dldfcn/__delaunayn__.cc Wed Sep 30 03:17:52 2020 -0700 @@ -166,8 +166,6 @@ sprintf (flags, "qhull d %s", options.c_str ()); - octave::unwind_protect frame; - // Replace the outfile pointer with stdout for debugging information. #if defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM) FILE *outfile = std::fopen ("NUL", "w"); @@ -179,12 +177,13 @@ if (! outfile) error ("__delaunayn__: unable to create temporary file for output"); - frame.add_fcn (close_fcn, outfile); + octave::unwind_action close_outfile + ([] (const auto file_ptr) { close_fcn (file_ptr); }, outfile); int exitcode = qh_new_qhull (dim, n, pt_array, ismalloc, flags, outfile, errfile); - frame.add_fcn (free_qhull_memory); + octave::unwind_action free_memory ([] () { free_qhull_memory (); }); if (exitcode) error ("__delaunayn__: qhull failed"); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/dldfcn/__voronoi__.cc --- a/libinterp/dldfcn/__voronoi__.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/dldfcn/__voronoi__.cc Wed Sep 30 03:17:52 2020 -0700 @@ -158,8 +158,6 @@ boolT ismalloc = false; - octave::unwind_protect frame; - // Replace the outfile pointer with stdout for debugging information. #if defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM) FILE *outfile = std::fopen ("NUL", "w"); @@ -171,7 +169,8 @@ if (! outfile) error ("__voronoi__: unable to create temporary file for output"); - frame.add_fcn (close_fcn, outfile); + octave::unwind_action close_outfile + ([] (const auto file_ptr) { close_fcn (file_ptr); }, outfile); // qh_new_qhull command and points arguments are not const... @@ -184,7 +183,7 @@ int exitcode = qh_new_qhull (dim, num_points, points.fortran_vec (), ismalloc, cmd_str, outfile, errfile); - frame.add_fcn (free_qhull_memory); + octave::unwind_action free_memory ([] () { free_qhull_memory (); }); if (exitcode) error ("%s: qhull failed", caller.c_str ()); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/dldfcn/audiodevinfo.cc --- a/libinterp/dldfcn/audiodevinfo.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/dldfcn/audiodevinfo.cc Wed Sep 30 03:17:52 2020 -0700 @@ -863,12 +863,6 @@ return paContinue; } -static void -safe_audioplayer_stop (audioplayer *player) -{ - player->stop (); -} - audioplayer::audioplayer (void) : octave_callback_function (nullptr), id (-1), fs (0), nbits (16), channels (0), sample_number (0), @@ -1156,9 +1150,8 @@ start = get_sample_number (); end = get_end_sample (); - octave::unwind_protect frame; - - frame.add_fcn (safe_audioplayer_stop, this); + octave::unwind_action stop_audioplayer + ([] (audioplayer * player) { player->stop (); }, this); for (unsigned int i = start; i < end; i += buffer_size) { @@ -1543,12 +1536,6 @@ return paContinue; } -static void -safe_audiorecorder_stop (audiorecorder *recorder) -{ - recorder->stop (); -} - audiorecorder::audiorecorder (void) : octave_callback_function (nullptr), id (-1), fs (8000), nbits (8), channels (1), sample_number (0), @@ -1836,9 +1823,8 @@ unsigned int frames = seconds * get_fs (); - octave::unwind_protect frame; - - frame.add_fcn (safe_audiorecorder_stop, this); + octave::unwind_action stop_audiorecorder + ([] (audiorecorder * recorder) { recorder->stop (); }, this); for (unsigned int i = 0; i < frames; i += buffer_size) { diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/dldfcn/audioread.cc --- a/libinterp/dldfcn/audioread.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/dldfcn/audioread.cc Wed Sep 30 03:17:52 2020 -0700 @@ -49,14 +49,6 @@ # include #endif -#if defined (HAVE_SNDFILE) -static void -safe_close (SNDFILE *file) -{ - sf_close (file); -} -#endif - DEFUN_DLD (audioread, args, , doc: /* -*- texinfo -*- @deftypefn {} {[@var{y}, @var{fs}] =} audioread (@var{filename}) @@ -96,9 +88,8 @@ error ("audioread: failed to open input file '%s': %s", filename.c_str (), sf_strerror (file)); - octave::unwind_protect frame; - - frame.add_fcn (safe_close, file); + octave::unwind_action close_open_file + ([] (auto file_ptr) { sf_close (file_ptr); }, file); OCTAVE_LOCAL_BUFFER (double, data, info.frames * info.channels); @@ -431,9 +422,8 @@ error ("audiowrite: failed to open output file '%s': %s", filename.c_str (), sf_strerror (file)); - octave::unwind_protect frame; - - frame.add_fcn (safe_close, file); + octave::unwind_action close_open_file + ([] (auto file_ptr) { sf_close (file_ptr); }, file); sf_command (file, SFC_SET_NORM_DOUBLE, nullptr, SF_TRUE); sf_command (file, SFC_SET_CLIPPING, nullptr, SF_TRUE) ; @@ -626,9 +616,8 @@ error ("audioinfo: failed to open input file '%s': %s", filename.c_str (), sf_strerror (file)); - octave::unwind_protect frame; - - frame.add_fcn (safe_close, file); + octave::unwind_action close_open_file + ([] (auto file_ptr) { sf_close (file_ptr); }, file); octave_scalar_map result; diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/dldfcn/convhulln.cc --- a/libinterp/dldfcn/convhulln.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/dldfcn/convhulln.cc Wed Sep 30 03:17:52 2020 -0700 @@ -58,12 +58,6 @@ # endif static void -close_fcn (FILE *f) -{ - std::fclose (f); -} - -static void free_qhull_memory () { qh_freeqhull (! qh_ALL); @@ -173,8 +167,6 @@ boolT ismalloc = false; - octave::unwind_protect frame; - // Replace the outfile pointer with stdout for debugging information. #if defined (OCTAVE_HAVE_WINDOWS_FILESYSTEM) && ! defined (OCTAVE_HAVE_POSIX_FILESYSTEM) FILE *outfile = std::fopen ("NUL", "w"); @@ -186,7 +178,8 @@ if (! outfile) error ("convhulln: unable to create temporary file for output"); - frame.add_fcn (close_fcn, outfile); + octave::unwind_action close_outfile + ([] (const auto file_ptr) { std::fclose (file_ptr); }, outfile); // qh_new_qhull command and points arguments are not const... @@ -199,7 +192,7 @@ int exitcode = qh_new_qhull (dim, num_points, points.fortran_vec (), ismalloc, cmd_str, outfile, errfile); - frame.add_fcn (free_qhull_memory); + octave::unwind_action free_memory ([] () { free_qhull_memory (); }); if (exitcode) error ("convhulln: qhull failed"); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/octave-value/ov-class.cc --- a/libinterp/octave-value/ov-class.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/octave-value/ov-class.cc Wed Sep 30 03:17:52 2020 -0700 @@ -579,8 +579,7 @@ if (obsolete_copies == 0 && meth.is_user_function () && meth.user_function_value ()->subsasgn_optimization_ok ()) { - octave::unwind_protect frame; - frame.protect_var (obsolete_copies); + octave::unwind_protect_var restore_var (obsolete_copies); obsolete_copies = 2; tmp = octave::feval (meth.function_value (), args); @@ -1018,8 +1017,6 @@ void octave_class::print_raw (std::ostream& os, bool) const { - octave::unwind_protect frame; - indent (os); os << " '; newline (os); diff -r fd05bcb94ab4 -r 26cfccfee9a0 libinterp/octave-value/ov-struct.cc --- a/libinterp/octave-value/ov-struct.cc Wed Sep 30 08:59:11 2020 +0200 +++ b/libinterp/octave-value/ov-struct.cc Wed Sep 30 03:17:52 2020 -0700 @@ -586,9 +586,7 @@ void octave_struct::print_raw (std::ostream& os, bool) const { - octave::unwind_protect frame; - - frame.protect_var (Vstruct_levels_to_print); + octave::unwind_protect_var restore_var (Vstruct_levels_to_print); if (Vstruct_levels_to_print >= 0) { @@ -1299,9 +1297,7 @@ void octave_scalar_struct::print_raw (std::ostream& os, bool) const { - octave::unwind_protect frame; - - frame.protect_var (Vstruct_levels_to_print); + octave::unwind_protect_var restore_var (Vstruct_levels_to_print); if (Vstruct_levels_to_print >= 0) {