annotate libinterp/octave-value/ov-oncleanup.cc @ 30564:796f54d4ddbf stable

update Octave Project Developers copyright for the new year In files that have the "Octave Project Developers" copyright notice, update for 2021. In all .txi and .texi files except gpl.txi and gpl.texi in the doc/liboctave and doc/interpreter directories, change the copyright to "Octave Project Developers", the same as used for other source files. Update copyright notices for 2022 (not done since 2019). For gpl.txi and gpl.texi, change the copyright notice to be "Free Software Foundation, Inc." and leave the date at 2007 only because this file only contains the text of the GPL, not anything created by the Octave Project Developers. Add Paul Thomas to contributors.in.
author John W. Eaton <jwe@octave.org>
date Tue, 28 Dec 2021 18:22:40 -0500
parents b16e0d357437
children 670a0d878af1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ////////////////////////////////////////////////////////////////////////
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 //
30564
796f54d4ddbf update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 30077
diff changeset
3 // Copyright (C) 2010-2022 The Octave Project Developers
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
4 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 // distribution or <https://octave.org/copyright/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
7 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
8 // This file is part of Octave.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
9 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
11 // under the terms of the GNU General Public License as published by
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
13 // (at your option) any later version.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
14 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
18 // GNU General Public License for more details.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
19 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
20 // You should have received a copy of the GNU General Public License
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
21 // along with Octave; see the file COPYING. If not, see
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
22 // <https://www.gnu.org/licenses/>.
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 //
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ////////////////////////////////////////////////////////////////////////
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
25
21724
aba2e6293dd8 use "#if ..." consistently instead of "#ifdef" and "#ifndef"
John W. Eaton <jwe@octave.org>
parents: 21301
diff changeset
26 #if defined (HAVE_CONFIG_H)
21301
40de9f8f23a6 Use '#include "config.h"' rather than <config.h>.
Rik <rik@octave.org>
parents: 21200
diff changeset
27 # include "config.h"
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
28 #endif
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
29
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
30 #include "defun.h"
22094
9203833cab7d move new interpreter class to separate file
John W. Eaton <jwe@octave.org>
parents: 21966
diff changeset
31 #include "interpreter.h"
27160
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 26655
diff changeset
32 #include "interpreter-private.h"
14015
77adde2e79ac fix include file name
John W. Eaton <jwe@octave.org>
parents: 14013
diff changeset
33 #include "ov-oncleanup.h"
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
34 #include "ov-fcn.h"
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
35 #include "ov-usr-fcn.h"
23501
1ee4b394a687 use feval instead of do_multi_index_op
John W. Eaton <jwe@octave.org>
parents: 23220
diff changeset
36 #include "parse.h"
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
37 #include "pt-misc.h"
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
38
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
39 DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA (octave_oncleanup, "onCleanup",
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
40 "onCleanup");
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
41
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
42 octave_oncleanup::octave_oncleanup (const octave_value& f)
30077
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
43 : m_fcn (f)
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
44 {
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
45 if (f.is_function_handle ())
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
46 {
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
47 octave_function *fptr = f.function_value (true);
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20939
diff changeset
48 if (! fptr)
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20939
diff changeset
49 error ("onCleanup: no default dispatch for function handle");
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20939
diff changeset
50
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20939
diff changeset
51 octave_user_function *uptr
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20939
diff changeset
52 = dynamic_cast<octave_user_function *> (fptr);
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
53
23795
980f39c3ab90 Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents: 23501
diff changeset
54 if (uptr != nullptr)
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20939
diff changeset
55 {
23075
4e3d47dc7e25 move parse tree classes inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 23053
diff changeset
56 octave::tree_parameter_list *pl = uptr->parameter_list ();
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
57
23795
980f39c3ab90 Use C++11 nullptr rather than 0 in code (bug #51565).
Rik <rik@octave.org>
parents: 23501
diff changeset
58 if (pl != nullptr && pl->length () > 0)
20962
3aa293be0e8d maint: Invert simple conditionals in if/else/error paradigm.
Rik <rik@octave.org>
parents: 20939
diff changeset
59 warning ("onCleanup: cleanup action takes parameters");
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
60 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
61 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
62 else
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
63 {
30077
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
64 m_fcn = octave_value ();
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
65 error ("onCleanup: argument must be a function handle");
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
66 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
67 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
68
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
69 octave_oncleanup::~octave_oncleanup (void)
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
70 {
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
71 call_object_destructor ();
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
72 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
73
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
74 octave_scalar_map
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
75 octave_oncleanup::scalar_map_value (void) const
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
76 {
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
77 octave_scalar_map retval;
30077
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
78 retval.setfield ("task", m_fcn);
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
79 return retval;
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
80 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
81
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
82 bool
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
83 octave_oncleanup::save_ascii (std::ostream& /* os */)
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
84 {
20467
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
85 warning ("save: unable to save onCleanup variables, skipping");
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
86
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
87 return true;
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
88 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
89
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
90 bool
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
91 octave_oncleanup::load_ascii (std::istream& /* is */)
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
92 {
20467
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
93 // Silently skip object that was not saved
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
94 return true;
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
95 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
96
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
97 bool
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
98 octave_oncleanup::save_binary (std::ostream& /* os */,
26399
586413770c7f pass save_as_floats by value in octave_value save_binary functions
John W. Eaton <jwe@octave.org>
parents: 26376
diff changeset
99 bool /* save_as_floats */)
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
100 {
20467
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
101 warning ("save: unable to save onCleanup variables, skipping");
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
102
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
103 return true;
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
104 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
105
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
106 bool
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
107 octave_oncleanup::load_binary (std::istream& /* is */, bool /* swap */,
21739
c4ab2e54f100 use namespace for oct_mach_info class
John W. Eaton <jwe@octave.org>
parents: 21724
diff changeset
108 octave::mach_info::float_format /* fmt */)
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
109 {
20467
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
110 // Silently skip object that was not saved
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
111 return true;
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
112 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
113
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
114 bool
19863
09ed6f7538dd avoid needing to include hdf5 in public header files (bug #44370, #43180)
John W. Eaton <jwe@octave.org> and Mike Miller <mtmiller@ieee.org>
parents: 19697
diff changeset
115 octave_oncleanup::save_hdf5 (octave_hdf5_id /* loc_id */,
09ed6f7538dd avoid needing to include hdf5 in public header files (bug #44370, #43180)
John W. Eaton <jwe@octave.org> and Mike Miller <mtmiller@ieee.org>
parents: 19697
diff changeset
116 const char * /* name */,
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
117 bool /* save_as_floats */)
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
118 {
20467
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
119 warning ("save: unable to save onCleanup variables, skipping");
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
120
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
121 return true;
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
122 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
123
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
124 bool
19863
09ed6f7538dd avoid needing to include hdf5 in public header files (bug #44370, #43180)
John W. Eaton <jwe@octave.org> and Mike Miller <mtmiller@ieee.org>
parents: 19697
diff changeset
125 octave_oncleanup::load_hdf5 (octave_hdf5_id /* loc_id */,
09ed6f7538dd avoid needing to include hdf5 in public header files (bug #44370, #43180)
John W. Eaton <jwe@octave.org> and Mike Miller <mtmiller@ieee.org>
parents: 19697
diff changeset
126 const char * /* name */)
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
127 {
20467
4bef1880098c More specific warning messages when saving onCleanup variables.
Rik <rik@octave.org>
parents: 20163
diff changeset
128 // Silently skip object that was not saved
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
129 return true;
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
130 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
131
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
132 void
18416
bcd71a2531d3 Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents: 17787
diff changeset
133 octave_oncleanup::print (std::ostream& os, bool pr_as_read_syntax)
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
134 {
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
135 print_raw (os, pr_as_read_syntax);
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
136 newline (os);
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
137 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
138
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
139 void
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
140 octave_oncleanup::print_raw (std::ostream& os, bool pr_as_read_syntax) const
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
141 {
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
142 os << "onCleanup (";
30077
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
143 if (m_fcn.is_defined ())
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
144 m_fcn.print_raw (os, pr_as_read_syntax);
23807
336f89b6208b Use character literals 'c' rather than string literals "c" when possible.
Rik <rik@octave.org>
parents: 23795
diff changeset
145 os << ')';
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
146 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
147
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
148 void
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
149 octave_oncleanup::call_object_destructor (void)
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
150 {
30077
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
151 if (m_fcn.is_undefined ())
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
152 return;
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
153
30077
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
154 octave_value the_fcn = m_fcn;
b16e0d357437 maint: use "m_" prefix for member variables in some octave-value classes.
John W. Eaton <jwe@octave.org>
parents: 29958
diff changeset
155 m_fcn = octave_value ();
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
156
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
157 octave::unwind_protect frame;
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
158
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
159 // Clear interrupts.
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
160 frame.protect_var (octave_interrupt_state);
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
161 octave_interrupt_state = 0;
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
162
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
163 // Disallow quit().
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
164 frame.protect_var (quit_allowed);
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
165 quit_allowed = false;
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
166
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
167 octave::interpreter& interp
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
168 = octave::__get_interpreter__ ("octave_oncleanup::call_object_destructor");
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
169
29956
a956ca6698d2 move some error handling functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
170 octave::interpreter_try (frame);
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
171
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
172 try
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
173 {
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
174 // Run the actual code.
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
175 octave::feval (the_fcn);
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
176 }
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
177 catch (const octave::interrupt_exception&)
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
178 {
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
179 interp.recover_from_exception ();
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
180
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
181 warning ("onCleanup: interrupt occurred in cleanup action");
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
182 }
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27160
diff changeset
183 catch (const octave::execution_exception& ee)
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
184 {
27474
3fec8e9fa2aa make recover_from_exception a member function
John W. Eaton <jwe@octave.org>
parents: 27471
diff changeset
185 interp.recover_from_exception ();
27160
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 26655
diff changeset
186
27471
fd32c1a9b1bd revamp error handling
John W. Eaton <jwe@octave.org>
parents: 27160
diff changeset
187 std::string msg = ee.message ();
27160
6b0c61a5a0f0 move global error configuration and status variables inside a class
John W. Eaton <jwe@octave.org>
parents: 26655
diff changeset
188
26655
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
189 warning ("onCleanup: error caught while executing cleanup function:\n%s\n",
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
190 msg.c_str ());
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
191
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
192 }
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
193 catch (const octave::exit_exception&)
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
194 {
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
195 // This shouldn't happen since we disabled quit above.
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
196 warning ("onCleanup: exit disabled while executing cleanup function");
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
197 }
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
198 catch (...) // Yes, the black hole. We're in a d-tor.
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
199 {
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
200 // This shouldn't happen, in theory.
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
201 warning ("onCleanup: internal error: unhandled exception in cleanup action");
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
202 }
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
203 }
cca0548f7b86 refactor calling object destructor
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
204
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
205 OCTAVE_NAMESPACE_BEGIN
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
206
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
207 DEFUN (onCleanup, args, ,
21966
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
208 doc: /* -*- texinfo -*-
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
209 @deftypefn {} {@var{obj} =} onCleanup (@var{function})
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
210 Create a special object that executes a given function upon destruction.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
211
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
212 If the object is copied to multiple variables (or cell or struct array
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
213 elements) or returned from a function, @var{function} will be executed after
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
214 clearing the last copy of the object. Note that if multiple local onCleanup
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
215 variables are created, the order in which they are called is unspecified.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
216 For similar functionality @xref{The unwind_protect Statement}.
112b20240c87 move docstrings in C++ files out of C strings and into comments
John W. Eaton <jwe@octave.org>
parents: 21751
diff changeset
217 @end deftypefn */)
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
218 {
20797
492738d32c60 eliminate return statements after calls to print_usage
John W. Eaton <jwe@octave.org>
parents: 20756
diff changeset
219 if (args.length () != 1)
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
220 print_usage ();
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
221
20939
b17fda023ca6 maint: Use new C++ archetype in more files.
Rik <rik@octave.org>
parents: 20853
diff changeset
222 return ovl (new octave_oncleanup (args(0)));
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
223 }
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
224
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
225 /*
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
226 %!test
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
227 %! old_wstate = warning ("query");
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
228 %! unwind_protect
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
229 %! trigger = onCleanup (@() warning ("on", "__MY_WARNING__"));
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
230 %! warning ("off", "__MY_WARNING__");
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
231 %! assert ((warning ("query", "__MY_WARNING__")).state, "off");
14429
eff4a5933e28 Update %!tests in src/ directory with Octave coding conventions.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
232 %! clear trigger;
14013
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
233 %! assert ((warning ("query", "__MY_WARNING__")).state, "on");
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
234 %! unwind_protect_cleanup
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
235 %! warning (old_wstate);
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
236 %! end_unwind_protect
1734ebe27134 move onCleanup function and class to liboctinterp
John W. Eaton <jwe@octave.org>
parents:
diff changeset
237 */
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
238
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29956
diff changeset
239 OCTAVE_NAMESPACE_END