Mercurial > octave
annotate libinterp/octave-value/ov-fcn-handle.h @ 28430:5bfa8e018704 stable
store local init vars for anonymous functions in handle, not function object
This change is step toward revamping function handles by storing
variable init values for anonymous functions in function handle
objects instead of in the corresponding functions.
* call-stack.h, call-stack.cc (call_stack::push): New overload that
accepts local variable map in addition to function object.
* stack-frame.h (user_fcn_stack_frame::user_fcn_stack_frame):
New constructor that accepts local variable map in addition to
function object.
(stack_frame::local_vars_map): New typedef.
* ov-fcn-handle.h, ov-fcn-handle.cc (octave_fcn_handle::m_local_vars):
New data member.
(octave_fcn_handle::octave_fcn_handle): Update existing constructors
and provide new one to construct handle from function object and local
variable map.
(octave_fcn_handle::call): If m_local_vars is defined, push stack
frame with that info and execute function here.
(octave_fcn_handle::workspace): Create workspace struct from
m_local_vars instead of getting that info from the function object.
(octave_fcn_handle::parse_anon_fcn_handle): Copy m_local_vars from new
function handle object.
(octave_fcn_handle::save_ascii, octave_fcn_handle::save_binary,
octave_fcn_handle::save_hdf5): Use m_local_vars instead of getting
info from function object.
* ov-usr-fcn.h, ov-usr-fcn.cc (octave_user_function::local_vars_map):
Delete typedef.
(octave_user_function::m_local_var_init_vals): Delete data member and
all uses.
(octave_user_function::local_var_init_vals): Delete.
* pt-eval.h, pt-eval.cc (tree_evaluator::push_stack_frame):
New overload that accepts local variable map and user function.
(tree_evaluator::init_local_fcn_vars): Delete function and all uses.
* pt-fcn-handle.cc (tree_anon_fcn_handle::evaluate): Store local
variables in function handle object instead of function object.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Mon, 30 Mar 2020 15:14:10 -0400 |
parents | 9a3deb17b4ea |
children | d05a4194f1ad |
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 // |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
3 // Copyright (C) 2003-2020 The Octave Project Developers |
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 | 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 | 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> |
4343 | 33 #include <string> |
34 | |
35 #include "ov-base.h" | |
36 #include "ov-fcn.h" | |
4654 | 37 #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
|
38 #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
|
39 #include "symscope.h" |
4343 | 40 |
23435
c452180ab672
begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
23433
diff
changeset
|
41 namespace octave |
c452180ab672
begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
23433
diff
changeset
|
42 { |
26693
1da1d9e60bf3
pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents:
26399
diff
changeset
|
43 class interpreter; |
26825
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
44 class tree_evaluator; |
23435
c452180ab672
begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
23433
diff
changeset
|
45 } |
c452180ab672
begin refactoring parse tree evaluator
John W. Eaton <jwe@octave.org>
parents:
23433
diff
changeset
|
46 |
4343 | 47 // Function handles. |
48 | |
4925 | 49 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
|
50 OCTINTERP_API |
4925 | 51 octave_fcn_handle : public octave_base_value |
4654 | 52 { |
53 public: | |
10261
a4fb4675accb
make printing of handles more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
54 |
a4fb4675accb
make printing of handles more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
55 static const std::string anonymous; |
a4fb4675accb
make printing of handles more Matlab-compatible
Jaroslav Hajek <highegg@gmail.com>
parents:
10160
diff
changeset
|
56 |
4930 | 57 octave_fcn_handle (void) |
26962
b033cf021048
allow @obj.meth to work (bug #51709)
John W. Eaton <jwe@octave.org>
parents:
26916
diff
changeset
|
58 : m_fcn (), m_obj (), m_name (), m_scope (), m_is_nested (false), |
28430
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
59 m_closure_frames (), m_local_vars (nullptr), m_dispatch_class () |
26825
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
60 { } |
5007 | 61 |
26962
b033cf021048
allow @obj.meth to work (bug #51709)
John W. Eaton <jwe@octave.org>
parents:
26916
diff
changeset
|
62 octave_fcn_handle (const octave::symbol_scope& scope, const std::string& n); |
4654 | 63 |
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
|
64 octave_fcn_handle (const octave::symbol_scope& scope, |
28430
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
65 const octave_value& f, const std::string& n); |
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
66 |
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
67 octave_fcn_handle (const octave_value& f, const std::string& n); |
10321
97b4bd6f0925
partially rewrite function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
10313
diff
changeset
|
68 |
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
|
69 octave_fcn_handle (const octave_value& f, |
28430
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
70 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
|
71 |
28430
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
72 octave_fcn_handle (const octave_fcn_handle& fh); |
4967 | 73 |
28430
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
74 ~octave_fcn_handle (void); |
4654 | 75 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23435
diff
changeset
|
76 octave_base_value * clone (void) const |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
77 { return new octave_fcn_handle (*this); } |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23435
diff
changeset
|
78 octave_base_value * empty_clone (void) const |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
79 { return new octave_fcn_handle (); } |
4967 | 80 |
26916
9cd4b045fe3d
avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents:
26854
diff
changeset
|
81 // 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
|
82 // 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
|
83 // functions. |
9cd4b045fe3d
avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents:
26854
diff
changeset
|
84 using octave_base_value::subsref; |
9cd4b045fe3d
avoid some overloaded virtual warnings (bug #55741)
John W. Eaton <jwe@octave.org>
parents:
26854
diff
changeset
|
85 |
7651
443a8f5a50fd
require both subsref variants to be defined in octave_value subclasses
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
86 octave_value subsref (const std::string& type, |
10313 | 87 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
|
88 { |
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
89 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
|
90 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
|
91 } |
4924 | 92 |
93 octave_value_list subsref (const std::string& type, | |
10313 | 94 const std::list<octave_value_list>& idx, |
95 int nargout); | |
4924 | 96 |
4925 | 97 bool is_defined (void) const { return true; } |
4654 | 98 |
99 bool is_function_handle (void) const { return true; } | |
100 | |
28197
087bccd1ab49
new function to identify anonymous function handles
John W. Eaton <jwe@octave.org>
parents:
28164
diff
changeset
|
101 bool is_anonymous (void) const { return m_name == anonymous; } |
087bccd1ab49
new function to identify anonymous function handles
John W. Eaton <jwe@octave.org>
parents:
28164
diff
changeset
|
102 |
26825
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
103 bool is_nested (void) const { return m_is_nested; } |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
104 |
21573
f3f8e1d3e399
avoid mulitple definitions of static function-scope vars (bug #47372)
John W. Eaton <jwe@octave.org>
parents:
19863
diff
changeset
|
105 dim_vector dims (void) const; |
5654 | 106 |
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
|
107 // 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
|
108 // scoping or overloads. |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
109 octave_function * function_value (bool = false); |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
110 octave_user_function * user_function_value (bool = false); |
6625 | 111 |
23446
cd4e1ee28716
maint: Use convention 'void * fcn ()' for functions which return pointers.
Rik <rik@octave.org>
parents:
23435
diff
changeset
|
112 octave_fcn_handle * fcn_handle_value (bool = false) { return this; } |
4654 | 113 |
26854
ab97008be411
use m_ for member variables in function handle and inline function classes
John W. Eaton <jwe@octave.org>
parents:
26847
diff
changeset
|
114 octave_value fcn_val (void) const { return m_fcn; } |
5007 | 115 |
26854
ab97008be411
use m_ for member variables in function handle and inline function classes
John W. Eaton <jwe@octave.org>
parents:
26847
diff
changeset
|
116 std::string fcn_name (void) const { return m_name; } |
4930 | 117 |
26825
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
118 void push_closure_context (octave::tree_evaluator& tw); |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
119 |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
120 octave_value workspace (void) const; |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
121 |
26966
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
122 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
|
123 { |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
124 m_dispatch_class = 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
|
125 } |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
126 |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
127 std::string get_dispatch_class (void) const { return m_dispatch_class; } |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
128 |
10322
21551cc88061
improve function handles comparison
Jaroslav Hajek <highegg@gmail.com>
parents:
10321
diff
changeset
|
129 bool is_equal_to (const octave_fcn_handle&) const; |
21551cc88061
improve function handles comparison
Jaroslav Hajek <highegg@gmail.com>
parents:
10321
diff
changeset
|
130 |
25969
7eeb89b0d2d5
make char function work for function handles (bug #53118)
John W. Eaton <jwe@octave.org>
parents:
25383
diff
changeset
|
131 octave_value convert_to_str_internal (bool pad, bool force, char type) const; |
7eeb89b0d2d5
make char function work for function handles (bug #53118)
John W. Eaton <jwe@octave.org>
parents:
25383
diff
changeset
|
132 |
6974 | 133 bool save_ascii (std::ostream& os); |
4988 | 134 |
135 bool load_ascii (std::istream& is); | |
136 | |
26399
586413770c7f
pass save_as_floats by value in octave_value save_binary functions
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
137 bool save_binary (std::ostream& os, bool save_as_floats); |
4988 | 138 |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11584
diff
changeset
|
139 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
|
140 octave::mach_info::float_format fmt); |
4988 | 141 |
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
|
142 bool save_hdf5 (octave_hdf5_id loc_id, const char *name, bool save_as_floats); |
4988 | 143 |
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
|
144 bool load_hdf5 (octave_hdf5_id loc_id, const char *name); |
4988 | 145 |
18416
bcd71a2531d3
Support disp/display overloading in classdef
Michael Goffioul <michael.goffioul@gmail.com>
parents:
17822
diff
changeset
|
146 void print (std::ostream& os, bool pr_as_read_syntax = false); |
4654 | 147 |
148 void print_raw (std::ostream& os, bool pr_as_read_syntax = false) const; | |
149 | |
10324
7673850d6adf
make simple handles printed inline
Jaroslav Hajek <highegg@gmail.com>
parents:
10322
diff
changeset
|
150 // Simple function handles are printed without a newline. |
26854
ab97008be411
use m_ for member variables in function handle and inline function classes
John W. Eaton <jwe@octave.org>
parents:
26847
diff
changeset
|
151 bool print_as_scalar (void) const { return m_name != anonymous; } |
10324
7673850d6adf
make simple handles printed inline
Jaroslav Hajek <highegg@gmail.com>
parents:
10322
diff
changeset
|
152 |
4654 | 153 private: |
4343 | 154 |
23433
c9fab0bc983e
maint: Use convention 'int& x' for naming references.
Rik <rik@octave.org>
parents:
23220
diff
changeset
|
155 bool set_fcn (const std::string& octaveroot, const std::string& fpath); |
6625 | 156 |
4612 | 157 DECLARE_OV_TYPEID_FUNCTIONS_AND_DATA |
4925 | 158 |
4933 | 159 protected: |
4930 | 160 |
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
|
161 // The function we are handling (this should be valid for handles to |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
162 // anonymous functions and some other special cases). Otherwise, we |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
163 // perform dynamic lookup based on the name of the function we are |
26962
b033cf021048
allow @obj.meth to work (bug #51709)
John W. Eaton <jwe@octave.org>
parents:
26916
diff
changeset
|
164 // handling and the scope where the function handle object was created. |
26854
ab97008be411
use m_ for member variables in function handle and inline function classes
John W. Eaton <jwe@octave.org>
parents:
26847
diff
changeset
|
165 octave_value m_fcn; |
4925 | 166 |
26962
b033cf021048
allow @obj.meth to work (bug #51709)
John W. Eaton <jwe@octave.org>
parents:
26916
diff
changeset
|
167 // If defined, this is the classdef object corresponding to the |
b033cf021048
allow @obj.meth to work (bug #51709)
John W. Eaton <jwe@octave.org>
parents:
26916
diff
changeset
|
168 // classdef method we are handling. |
b033cf021048
allow @obj.meth to work (bug #51709)
John W. Eaton <jwe@octave.org>
parents:
26916
diff
changeset
|
169 octave_value m_obj; |
b033cf021048
allow @obj.meth to work (bug #51709)
John W. Eaton <jwe@octave.org>
parents:
26916
diff
changeset
|
170 |
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
|
171 // The function we would find without considering argument types. We |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
172 // cache this value so that the function_value and user_function_value |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
173 // methods may continue to work. |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
174 octave_value m_generic_fcn; |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
175 |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
176 // The name of the handle, not including the "@". |
26854
ab97008be411
use m_ for member variables in function handle and inline function classes
John W. Eaton <jwe@octave.org>
parents:
26847
diff
changeset
|
177 std::string m_name; |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
8950
diff
changeset
|
178 |
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
|
179 // The scope where this object was defined. |
8bd9fd99c12a
lazily evaluate fcn handles; fix overload resolution (bug #29447, bug #31821, bug #48802)
John W. Eaton <jwe@octave.org>
parents:
26825
diff
changeset
|
180 octave::symbol_scope m_scope; |
9450
cf714e75c656
implement overloaded function handles
Jaroslav Hajek <highegg@gmail.com>
parents:
8950
diff
changeset
|
181 |
26825
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
182 // TRUE means this is a handle to a nested function. |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
183 bool m_is_nested; |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
184 |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
185 // Saved stack frames for handles to nested functions. This allows us |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
186 // to access non-locals and other context info when calling nested |
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
187 // functions indirectly through handles. |
28426
9a3deb17b4ea
use shared_ptr for stack frames in call stack and for accesss and static links
John W. Eaton <jwe@octave.org>
parents:
28197
diff
changeset
|
188 std::shared_ptr<octave::stack_frame> m_closure_frames; |
26825
6e9034836239
allow handles to nested functions to work (bug #39257)
John W. Eaton <jwe@octave.org>
parents:
26694
diff
changeset
|
189 |
28430
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
190 // List of captured variable values for anonymous fucntions. |
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
191 octave::stack_frame::local_vars_map *m_local_vars; |
5bfa8e018704
store local init vars for anonymous functions in handle, not function object
John W. Eaton <jwe@octave.org>
parents:
28426
diff
changeset
|
192 |
26966
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
193 // The name of the class in which this handle was created, if any. |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
194 // Used to determine access permission when the referenced function is |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
195 // called. |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
196 std::string m_dispatch_class; |
4ba365817652
allow dispatch class to be stored in octave_fcn_handle (bug #45351)
John W. Eaton <jwe@octave.org>
parents:
26962
diff
changeset
|
197 |
24108
1a53f0c855db
move some duplicate code into a separate function
John W. Eaton <jwe@octave.org>
parents:
23502
diff
changeset
|
198 bool parse_anon_fcn_handle (const std::string& fcn_text); |
1a53f0c855db
move some duplicate code into a separate function
John W. Eaton <jwe@octave.org>
parents:
23502
diff
changeset
|
199 |
23502
c6714ae1c06c
eliminate remaining do_multi_index_op methods
John W. Eaton <jwe@octave.org>
parents:
23481
diff
changeset
|
200 virtual octave_value_list call (int nargout, const octave_value_list& args); |
4343 | 201 }; |
202 | |
26693
1da1d9e60bf3
pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents:
26399
diff
changeset
|
203 namespace octave |
1da1d9e60bf3
pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents:
26399
diff
changeset
|
204 { |
1da1d9e60bf3
pass reference to interpreter to make_fcn_handle function
John W. Eaton <jwe@octave.org>
parents:
26399
diff
changeset
|
205 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
|
206 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
|
207 } |
4343 | 208 |
209 #endif |