annotate libinterp/octave-value/ov-fcn-handle.h @ 29476:c74ff452e2bb stable

avoid memory leaks when returning handles to nested functions When a handle to a nested function is created with a std::shared_ptr object holding a reference to the stack frames associated with the parent function, we create a circular reference because the referenced stack frame contains the function handle object. To break the link, we'll scan the stack frame associated with the nested function handle and convert the shared_ptr links to be weak_ptr links instead, breaking the circular reference allowing the resources held by the closure frames to be released when all external references are cleared. Another possible solution to this problem is to create weak_ptr links initially and then convert them to shared_ptr links when the closure "escapes" the scope of the function. While that might be slightly more efficient (we would only have to look at assignments to global variables and the values that are actually returned from the function) the current design of global assignments does not make that easy because it is possible to ask for a reference to a global variable, so either all places where we grab references and then later perform assignments must be checked for assignments of handles to nested functions, or we must eliminate the interface that returns references to global variables and only allow assignments so that we would only have to perform the check in the assignment function(s). Perhaps this can be done in a future version, but for now, it works well enough to break the closure cycles in local variables when a function returns. * call-stack.cc (call_stack::pop): If popped stack frame is a closure context, then break closure cycles. * stack-frame.h, stack-frame.cc (stack_frame::m_is_closure_context): New member variable. (stack_frame::break_closure_cycles, user_fcn_stack_frame::break_closure_cycles): New functions. (stack_frame::mark_closure_context, stack_frame::is_closure_context): New functions. * ov-fcn-handle.h, ov-fcn-handle.cc (base_nested_fcn_handle): New base class for handles to nested functions. (nested_fcn_handle, weak_nested_fcn_handle): New classes to represent handles to nested functions. Currently, all handles to nested functions begin as nested_fcn_handle objects but are converted to weak_nested_fcn_handles when the functions where they are created return. (base_fcn_handle::is_nested (const std::shared_ptr<stack_frame>&) const, base_fcn_handle::make_weak_nested_handle, New virtual functions. (octave_fcn_handle::is_nested, octave_fcn_handle::is_weak_nested, octave_fcn_handle::make_weak_nested_handle): New functions. * ov-struct.h, ov-struct.cc (octave_scalar_map::break_closure_cycles, octave_map::break_closure_cycles): New functions. * ov.h, ov.cc (octave_value::break_closure_cycles): New function. * ov-base.h (octave_base_value::break_closure_cycles): New virtual function. * cdef-object.h (cdef_object::break_closure_cycles): New function. (cdef_object_rep::break_closure_cycles): New virtual function. * cdef-object.h, cdef-object.cc (cdef_object_scalar::break_closure_cycles): New function. * ov-cell.h, ov-cell.cc (octave_cell::break_closure_cycles): New function. * ov-class.h, ov-class.cc (octave_class::break_closure_cycles): New function. * ov-classdef.h (octave_classdef::break_closure_cycles): New function.
author John W. Eaton <jwe@octave.org>
date Fri, 05 Mar 2021 16:14:34 -0500
parents 0a5b15007766
children 34d06c73b48d
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 //
29358
0a5b15007766 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29185
diff changeset
3 // Copyright (C) 2003-2021 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 ////////////////////////////////////////////////////////////////////////
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
25
20791
f7084eae3318 maint: Use Octave coding conventions for #if statements.
Rik <rik@octave.org>
parents: 19863
diff changeset
26 #if ! defined (octave_ov_fcn_handle_h)
17822
ebb3ef964372 maint: Use common #define syntax "octave_filename_h" in h_files.
Rik <rik@octave.org>
parents: 17787
diff changeset
27 #define octave_ov_fcn_handle_h 1
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
28
21244
1473547f50f5 include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents: 20791
diff changeset
29 #include "octave-config.h"
1473547f50f5 include octave-config.h in public header files
John W. Eaton <jwe@octave.org>
parents: 20791
diff changeset
30
8950
d865363208d6 include <iosfwd> instead of <iostream> in header files
John W. Eaton <jwe@octave.org>
parents: 8920
diff changeset
31 #include <iosfwd>
26825
6e9034836239 allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents: 26694
diff changeset
32 #include <list>
29185
76c94c998d7b avoid memory leak with function handles (bug #59659)
John W. Eaton <jwe@octave.org>
parents: 29180
diff changeset
33 #include <memory>
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
34 #include <string>
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
35
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
36 #include "oct-map.h"
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
37 #include "ov-base.h"
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
38 #include "ov-fcn.h"
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
39 #include "ov-typeinfo.h"
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
40 #include "stack-frame.h"
26847
8bd9fd99c12a lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents: 26825
diff changeset
41 #include "symscope.h"
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
42
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23433
diff changeset
43 namespace octave
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23433
diff changeset
44 {
26693
1da1d9e60bf3 pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
45 class interpreter;
26825
6e9034836239 allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents: 26694
diff changeset
46 class tree_evaluator;
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
47
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
48 // Function handles.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
49
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
50 class base_fcn_handle
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
51 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
52 public:
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
53
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
54 base_fcn_handle (const std::string& name = "",
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
55 const std::string& file = "")
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
56 : m_name (name), m_file (file)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
57 { }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
58
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
59 base_fcn_handle (const base_fcn_handle&) = default;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
60
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
61 virtual ~base_fcn_handle (void) = default;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
62
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
63 virtual base_fcn_handle * clone (void) const = 0;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
64
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
65 virtual std::string type (void) const = 0;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
66
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
67 virtual bool is_internal (void) const { return false; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
68
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
69 virtual bool is_simple (void) const { return false; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
70
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
71 virtual bool is_scoped (void) const { return false; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
72
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
73 virtual bool is_nested (void) const { return false; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
74
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
75 virtual bool is_nested (const std::shared_ptr<stack_frame>&) const
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
76 {
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
77 return false;
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
78 }
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
79
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
80 virtual bool is_weak_nested (void) const { return false; }
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
81
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
82 virtual bool is_class_simple (void) const { return false; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
83
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
84 virtual bool is_anonymous (void) const { return false; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
85
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
86 virtual octave_value make_weak_nested_handle (void) const;
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
87
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
88 std::string fcn_name (void) const { return m_name; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
89
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
90 std::string file (void) const { return m_file; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
91
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
92 octave_value_list
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
93 subsref (const std::string& type, const std::list<octave_value_list>& idx,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
94 int nargout);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
95
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
96 virtual octave_value_list
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
97 call (int nargout, const octave_value_list& args) = 0;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
98
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
99 // FIXME: These must go away. They don't do the right thing for
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
100 // scoping or overloads.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
101 virtual octave_function * function_value (bool = false)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
102 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
103 return nullptr;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
104 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
105
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
106 virtual octave_user_function * user_function_value (bool = false)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
107 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
108 return nullptr;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
109 }
23435
c452180ab672 begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents: 23433
diff changeset
110
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
111 virtual octave_value fcn_val (void) { return octave_value (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
112
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
113 virtual octave_value workspace (void) const { return octave_value (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
114
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
115 // Should be const.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
116 virtual octave_scalar_map info (void) { return octave_scalar_map (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
117
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
118 virtual void set_dispatch_class (const std::string& /*class_name*/) { }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
119
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
120 virtual std::string get_dispatch_class (void) const { return ""; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
121
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
122 octave_value convert_to_str_internal (bool pad, bool force, char type) const;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
123
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
124 virtual bool save_ascii (std::ostream& os);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
125
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
126 virtual bool load_ascii (std::istream& is);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
127
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
128 virtual bool save_binary (std::ostream& os, bool save_as_floats);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
129
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
130 virtual bool load_binary (std::istream& is, bool swap,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
131 mach_info::float_format fmt);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
132
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
133 virtual bool save_hdf5 (octave_hdf5_id loc_id, const char *name,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
134 bool save_as_floats);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
135
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
136 virtual bool load_hdf5 (octave_hdf5_id& group_hid,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
137 octave_hdf5_id& space_hid,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
138 octave_hdf5_id& type_hid);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
139
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
140 virtual void print_raw (std::ostream&, bool /*pr_as_read_syntax*/,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
141 int /*current_print_indent_level*/) const
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
142 { }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
143
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
144 // Function handles are printed without a newline by default.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
145 virtual bool print_as_scalar (void) const { return true; }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
146
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
147 virtual bool
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
148 set_fcn (const std::string& /*octaveroot*/, const std::string& /*fpath*/)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
149 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
150 return false;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
151 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
152
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
153 protected:
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
154
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
155 void warn_load (const char *file_type) const;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
156 void warn_save (const char *file_type) const;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
157
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
158 void unimplemented (const char *op, const char *fmt) const;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
159
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
160 // The name of the handle, not including the "@", or the text of the
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
161 // anonymous function.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
162 std::string m_name;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
163
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
164 // The name of the file where the named function was defined.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
165 std::string m_file;
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
166 };
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
167 }
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
168
4925
90f51232d751 [project @ 2004-08-02 22:09:47 by jwe]
jwe
parents: 4924
diff changeset
169 class
7867
f6fffa74b9b5 Export additional symbols: octave_fcn_inline, octave_fcn_handle, read_binary_data, save_binary_data.
Michael Goffioul <michael.goffioul@gmail.com>
parents: 7761
diff changeset
170 OCTINTERP_API
4925
90f51232d751 [project @ 2004-08-02 22:09:47 by jwe]
jwe
parents: 4924
diff changeset
171 octave_fcn_handle : public octave_base_value
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
172 {
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
173 public:
10261
a4fb4675accb make printing of handles more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10160
diff changeset
174
a4fb4675accb make printing of handles more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10160
diff changeset
175 static const std::string anonymous;
a4fb4675accb make printing of handles more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents: 10160
diff changeset
176
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
177 // Creates an invalid function handle. Used to create generic
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
178 // function handle objects when loading function handles. Further
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
179 // dispatch happens in the octave_fcn_handle load/save functions.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
180 octave_fcn_handle (void);
5007
f8c27dad3643 [project @ 2004-09-17 11:42:04 by jwe]
jwe
parents: 4988
diff changeset
181
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
182 // Create a handle to a built-in or internal function.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
183 octave_fcn_handle (const octave_value& fcn);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
184
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
185 // Create a simple function handle that is not bound to a function.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
186 // Lookup happens when a function call is attempted.
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
187 octave_fcn_handle (const std::string& name);
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
188
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
189 // Create a simple function handle that is bound to a function.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
190 octave_fcn_handle (const octave_value& fcn, const std::string& name);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
191
28481
1be719d8b375 fix dispatch error with classsimple function handle (bug #58572)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
192 // Create a function handle that might be bound to a class method.
1be719d8b375 fix dispatch error with classsimple function handle (bug #58572)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
193 octave_fcn_handle (const std::string& class_nm, const std::string& meth_nm);
1be719d8b375 fix dispatch error with classsimple function handle (bug #58572)
John W. Eaton <jwe@octave.org>
parents: 28439
diff changeset
194
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
195 // Create a function handle bound to a class method.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
196 octave_fcn_handle (const octave_value& fcn, const std::string& class_nm,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
197 const std::string& meth_nm);
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
198
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
199 // Create a function handle bound to a class method.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
200 octave_fcn_handle (const octave_value& obj, const octave_value& fcn,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
201 const std::string& class_nm,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
202 const std::string& meth_nm);
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
203
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
204 // Create a function handle bound to a scoped function.
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
205 octave_fcn_handle (const octave_value& fcn, const std::string& name,
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
206 const std::list<std::string>& parentage);
10321
97b4bd6f0925 partially rewrite function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 10313
diff changeset
207
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
208 // Create a handle to a nested function.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
209 octave_fcn_handle (const octave_value& fcn, const std::string& name,
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
210 const std::shared_ptr<octave::stack_frame>& closure_frames);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
211
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
212 // Create an anonymous function handle with local variable values
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
213 // provided in LOCAL_VARS.
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
214 octave_fcn_handle (const octave_value& fcn,
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
215 const octave::stack_frame::local_vars_map& local_vars);
26847
8bd9fd99c12a lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents: 26825
diff changeset
216
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
217 octave_fcn_handle (octave::base_fcn_handle *rep);
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
218
28430
5bfa8e018704 store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents: 28426
diff changeset
219 octave_fcn_handle (const octave_fcn_handle& fh);
4967
0355f2f7d193 [project @ 2004-09-07 15:09:14 by jwe]
jwe
parents: 4933
diff changeset
220
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
221 ~octave_fcn_handle (void) = default;
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
222
23446
cd4e1ee28716 maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents: 23435
diff changeset
223 octave_base_value * clone (void) const
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
224 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
225 return new octave_fcn_handle (*this);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
226 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
227
23446
cd4e1ee28716 maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents: 23435
diff changeset
228 octave_base_value * empty_clone (void) const
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
229 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
230 return new octave_fcn_handle ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
231 }
4967
0355f2f7d193 [project @ 2004-09-07 15:09:14 by jwe]
jwe
parents: 4933
diff changeset
232
26916
9cd4b045fe3d avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents: 26854
diff changeset
233 // We don't need to override all three forms of subsref. The using
9cd4b045fe3d avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents: 26854
diff changeset
234 // declaration will avoid warnings about partially-overloaded virtual
9cd4b045fe3d avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents: 26854
diff changeset
235 // functions.
9cd4b045fe3d avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents: 26854
diff changeset
236 using octave_base_value::subsref;
9cd4b045fe3d avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents: 26854
diff changeset
237
7651
443a8f5a50fd require both subsref variants to be defined in octave_value subclasses
John W. Eaton <jwe@octave.org>
parents: 7336
diff changeset
238 octave_value subsref (const std::string& type,
10313
f3b65e1ae355 untabify src header files
John W. Eaton <jwe@octave.org>
parents: 10261
diff changeset
239 const std::list<octave_value_list>& idx)
17787
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
240 {
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
241 octave_value_list tmp = subsref (type, idx, 1);
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
242 return tmp.length () > 0 ? tmp(0) : octave_value ();
175b392e91fe Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents: 17744
diff changeset
243 }
4924
9a3a32f5a27d [project @ 2004-08-02 19:04:20 by jwe]
jwe
parents: 4898
diff changeset
244
9a3a32f5a27d [project @ 2004-08-02 19:04:20 by jwe]
jwe
parents: 4898
diff changeset
245 octave_value_list subsref (const std::string& type,
10313
f3b65e1ae355 untabify src header files
John W. Eaton <jwe@octave.org>
parents: 10261
diff changeset
246 const std::list<octave_value_list>& idx,
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
247 int nargout)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
248 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
249 return m_rep->subsref (type, idx, nargout);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
250 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
251
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
252 octave_value_list call (int nargout, const octave_value_list& args);
4924
9a3a32f5a27d [project @ 2004-08-02 19:04:20 by jwe]
jwe
parents: 4898
diff changeset
253
4925
90f51232d751 [project @ 2004-08-02 22:09:47 by jwe]
jwe
parents: 4924
diff changeset
254 bool is_defined (void) const { return true; }
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
255
29180
eec0fe95576e avoid dispatch error if methdo argument is a function handle (bug #59617)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
256 builtin_type_t builtin_type (void) const { return btyp_func_handle; }
eec0fe95576e avoid dispatch error if methdo argument is a function handle (bug #59617)
John W. Eaton <jwe@octave.org>
parents: 28481
diff changeset
257
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
258 bool is_function_handle (void) const { return true; }
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
259
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
260 bool is_internal (void) const { return m_rep->is_internal (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
261
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
262 bool is_simple (void) const { return m_rep->is_simple (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
263
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
264 bool is_scoped (void) const { return m_rep->is_scoped (); }
28197
087bccd1ab49 new function to identify anonymous function handles
John W. Eaton <jwe@octave.org>
parents: 28164
diff changeset
265
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
266 bool is_nested (void) const { return m_rep->is_nested (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
267
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
268 bool is_nested (const std::shared_ptr<octave::stack_frame>& frame) const
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
269 {
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
270 return m_rep->is_nested (frame);
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
271 }
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
272
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
273 bool is_weak_nested (void) const { return m_rep->is_weak_nested (); }
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
274
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
275 bool is_class_simple (void) const { return m_rep->is_class_simple (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
276
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
277 bool is_anonymous (void) const { return m_rep->is_anonymous (); }
26825
6e9034836239 allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents: 26694
diff changeset
278
29476
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
279 octave_value make_weak_nested_handle (void) const
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
280 {
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
281 return m_rep->make_weak_nested_handle ();
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
282 }
c74ff452e2bb avoid memory leaks when returning handles to nested functions
John W. Eaton <jwe@octave.org>
parents: 29358
diff changeset
283
21573
f3f8e1d3e399 avoid mulitple definitions of static function-scope vars (bug #47372)
John W. Eaton <jwe@octave.org>
parents: 19863
diff changeset
284 dim_vector dims (void) const;
5654
6aae52010e3b [project @ 2006-03-09 19:04:53 by jwe]
jwe
parents: 5307
diff changeset
285
26847
8bd9fd99c12a lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents: 26825
diff changeset
286 // FIXME: These must go away. They don't do the right thing for
8bd9fd99c12a lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents: 26825
diff changeset
287 // scoping or overloads.
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
288 octave_function * function_value (bool = false)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
289 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
290 return m_rep->function_value ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
291 }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
292
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
293 octave_user_function * user_function_value (bool = false)
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
294 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
295 return m_rep->user_function_value ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
296 }
6625
5d02dfacfc9e [project @ 2007-05-16 08:49:47 by dbateman]
dbateman
parents: 5958
diff changeset
297
23446
cd4e1ee28716 maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents: 23435
diff changeset
298 octave_fcn_handle * fcn_handle_value (bool = false) { return this; }
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
299
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
300 octave_value fcn_val (void) { return m_rep->fcn_val (); }
5007
f8c27dad3643 [project @ 2004-09-17 11:42:04 by jwe]
jwe
parents: 4988
diff changeset
301
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
302 // FCN_NAME should be eliminated.
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
303 std::string fcn_name (void) const { return m_rep->fcn_name (); }
4930
bdb307dc8613 [project @ 2004-08-05 04:55:26 by jwe]
jwe
parents: 4925
diff changeset
304
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
305 octave_value workspace (void) const
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
306 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
307 return m_rep->workspace ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
308 }
26825
6e9034836239 allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents: 26694
diff changeset
309
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
310 octave_scalar_map info (void) { return m_rep->info (); }
26825
6e9034836239 allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents: 26694
diff changeset
311
26966
4ba365817652 allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents: 26962
diff changeset
312 void set_dispatch_class (const std::string& class_name)
4ba365817652 allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents: 26962
diff changeset
313 {
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
314 m_rep->set_dispatch_class (class_name);
26966
4ba365817652 allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents: 26962
diff changeset
315 }
4ba365817652 allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents: 26962
diff changeset
316
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
317 std::string get_dispatch_class (void) const
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
318 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
319 return m_rep->get_dispatch_class ();
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
320 }
26966
4ba365817652 allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents: 26962
diff changeset
321
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
322 octave_value convert_to_str_internal (bool pad, bool force, char type) const
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
323 {
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
324 return m_rep->convert_to_str_internal (pad, force, type);
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
325 }
25969
7eeb89b0d2d5 make char function work for function handles (bug #53118)
John W. Eaton <jwe@octave.org>
parents: 25383
diff changeset
326
6974
9e32bb109980 [project @ 2007-10-08 11:06:47 by jwe]
jwe
parents: 6625
diff changeset
327 bool save_ascii (std::ostream& os);
4988
352d228d409b [project @ 2004-09-11 13:05:38 by jwe]
jwe
parents: 4967
diff changeset
328
352d228d409b [project @ 2004-09-11 13:05:38 by jwe]
jwe
parents: 4967
diff changeset
329 bool load_ascii (std::istream& is);
352d228d409b [project @ 2004-09-11 13:05:38 by jwe]
jwe
parents: 4967
diff changeset
330
26399
586413770c7f pass save_as_floats by value in octave_value save_binary functions
John W. Eaton <jwe@octave.org>
parents: 26376
diff changeset
331 bool save_binary (std::ostream& os, bool save_as_floats);
4988
352d228d409b [project @ 2004-09-11 13:05:38 by jwe]
jwe
parents: 4967
diff changeset
332
11586
12df7854fa7c strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 11584
diff changeset
333 bool load_binary (std::istream& is, bool swap,
21739
c4ab2e54f100 use namespace for oct_mach_info class
John W. Eaton <jwe@octave.org>
parents: 21574
diff changeset
334 octave::mach_info::float_format fmt);
4988
352d228d409b [project @ 2004-09-11 13:05:38 by jwe]
jwe
parents: 4967
diff changeset
335
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
336 bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats);
4988
352d228d409b [project @ 2004-09-11 13:05:38 by jwe]
jwe
parents: 4967
diff changeset
337
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
338 bool load_hdf5 (octave_hdf5_id loc_id, const char *name);
4988
352d228d409b [project @ 2004-09-11 13:05:38 by jwe]
jwe
parents: 4967
diff changeset
339
18416
bcd71a2531d3 Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents: 17822
diff changeset
340 void print (std::ostream& os, bool pr_as_read_syntax = false);
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
341
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
342 void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const;
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
343
10324
7673850d6adf make simple handles printed inline
Jaroslav Hajek <highegg@gmail.com>
parents: 10322
diff changeset
344 // Simple function handles are printed without a newline.
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
345 bool print_as_scalar (void) const { return m_rep->print_as_scalar (); }
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
346
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
347 friend bool
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
348 is_equal_to (const octave_fcn_handle& fh1, const octave_fcn_handle& fh2);
10324
7673850d6adf make simple handles printed inline
Jaroslav Hajek <highegg@gmail.com>
parents: 10322
diff changeset
349
4654
a9b22513b7a6 [project @ 2003-11-24 18:56:35 by jwe]
jwe
parents: 4649
diff changeset
350 private:
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
351
29185
76c94c998d7b avoid memory leak with function handles (bug #59659)
John W. Eaton <jwe@octave.org>
parents: 29180
diff changeset
352 std::shared_ptr<octave::base_fcn_handle> m_rep;
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
353
29185
76c94c998d7b avoid memory leak with function handles (bug #59659)
John W. Eaton <jwe@octave.org>
parents: 29180
diff changeset
354 octave::base_fcn_handle * get_rep (void) const { return m_rep.get (); }
6625
5d02dfacfc9e [project @ 2007-05-16 08:49:47 by dbateman]
dbateman
parents: 5958
diff changeset
355
4612
d44675070f1a [project @ 2003-11-14 19:49:56 by jwe]
jwe
parents: 4346
diff changeset
356 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
357 };
9450
cf714e75c656 implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents: 8950
diff changeset
358
28439
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
359 extern bool
e760fef2829c refactor octave_fcn_handle class
John W. Eaton <jwe@octave.org>
parents: 28433
diff changeset
360 is_equal_to (const octave_fcn_handle& fh1, const octave_fcn_handle& fh2);
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
361
26693
1da1d9e60bf3 pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
362 namespace octave
1da1d9e60bf3 pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
363 {
28433
d05a4194f1ad move make_fcn_handle to tree_evaluator class
John W. Eaton <jwe@octave.org>
parents: 28430
diff changeset
364 OCTAVE_DEPRECATED (6, "use 'tree_evaluator::make_fcn_handle' instead")
26693
1da1d9e60bf3 pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
365 extern octave_value
26854
ab97008be411 use m_ for member variables in function handle and inline function classes
John W. Eaton <jwe@octave.org>
parents: 26847
diff changeset
366 make_fcn_handle (interpreter& interp, const std::string& name);
26693
1da1d9e60bf3 pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents: 26399
diff changeset
367 }
4343
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
368
db5e0814277a [project @ 2003-02-20 16:44:16 by jwe]
jwe
parents:
diff changeset
369 #endif