Mercurial > hg > octave-nkf
annotate libinterp/parse-tree/pt-fcn-handle.cc @ 18599:04b4fb217b1a stable
doc: Improve documentation strings in parse-tree directory.
* lex.ll (F__display_tokens__): Add seealso reference.
* lex.ll (F__token_count__): Add seealso reference.
* lex.ll (F__lexer_debug_flag__): Document function.
* oct-parse.in.yy (Fautoload): Add additional calling form. Rephrase
several sentences.
* oct-parse.in.yy (Fmfilename): Make single sentence description stand
apart from the rest of documentation.
* oct-parse.in.yy (Fsource): Make single sentence description stand
apart from the rest of documentation. Add seealso link to 'run'.
* oct-parse.in.yy (Fbuiltin): Change type to "Built-in Function" from
"Loadable Function".
* oct-parse.in.yy (Feval): Rephrase several sentences. Add programming
note suggesting the use of alternatives like try/catch or unwind_protect.
* oct-parse.in.yy (F__parser_debug_flag__): Document function.
* pt-mat.cc (Fstring_fill_char): Use semicolon in place of period for
stronger idea linkage.
author | Rik <rik@octave.org> |
---|---|
date | Fri, 28 Feb 2014 14:04:41 -0800 |
parents | 175b392e91fe |
children | 4197fc428c7d |
rev | line source |
---|---|
4343 | 1 /* |
2 | |
17744
d63878346099
maint: Update copyright notices for release.
John W. Eaton <jwe@octave.org>
parents:
16681
diff
changeset
|
3 Copyright (C) 2003-2013 John W. Eaton |
4343 | 4 |
5 This file is part of Octave. | |
6 | |
7 Octave is free software; you can redistribute it and/or modify it | |
8 under the terms of the GNU General Public License as published by the | |
7016 | 9 Free Software Foundation; either version 3 of the License, or (at your |
10 option) any later version. | |
4343 | 11 |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
4343 | 20 |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 | |
27 #include <iostream> | |
28 | |
29 #include "error.h" | |
30 #include "oct-obj.h" | |
31 #include "ov-fcn-handle.h" | |
32 #include "pt-fcn-handle.h" | |
33 #include "pager.h" | |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
34 #include "pt-const.h" |
4343 | 35 #include "pt-walk.h" |
5861 | 36 #include "variables.h" |
4343 | 37 |
38 void | |
39 tree_fcn_handle::print (std::ostream& os, bool pr_as_read_syntax, | |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
40 bool pr_orig_text) |
4343 | 41 { |
42 print_raw (os, pr_as_read_syntax, pr_orig_text); | |
43 } | |
44 | |
45 void | |
46 tree_fcn_handle::print_raw (std::ostream& os, bool pr_as_read_syntax, | |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
47 bool pr_orig_text) |
4343 | 48 { |
49 os << ((pr_as_read_syntax || pr_orig_text) ? "@" : "") << nm; | |
50 } | |
51 | |
52 octave_value | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8045
diff
changeset
|
53 tree_fcn_handle::rvalue1 (int) |
4343 | 54 { |
55 return make_fcn_handle (nm); | |
56 } | |
57 | |
58 octave_value_list | |
59 tree_fcn_handle::rvalue (int nargout) | |
60 { | |
61 octave_value_list retval; | |
62 | |
63 if (nargout > 1) | |
64 error ("invalid number of output arguments for function handle expression"); | |
65 else | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8045
diff
changeset
|
66 retval = rvalue1 (nargout); |
4343 | 67 |
68 return retval; | |
69 } | |
70 | |
5861 | 71 tree_expression * |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
72 tree_fcn_handle::dup (symbol_table::scope_id, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
73 symbol_table::context_id) const |
5861 | 74 { |
75 tree_fcn_handle *new_fh = new tree_fcn_handle (nm, line (), column ()); | |
76 | |
77 new_fh->copy_base (*this); | |
78 | |
79 return new_fh; | |
80 } | |
81 | |
4343 | 82 void |
83 tree_fcn_handle::accept (tree_walker& tw) | |
84 { | |
85 tw.visit_fcn_handle (*this); | |
86 } | |
87 | |
5861 | 88 octave_value |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8045
diff
changeset
|
89 tree_anon_fcn_handle::rvalue1 (int) |
5861 | 90 { |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
91 // FIXME: should CMD_LIST be limited to a single expression? |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
92 // I think that is what Matlab does. |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
93 |
7336 | 94 tree_parameter_list *param_list = parameter_list (); |
95 tree_parameter_list *ret_list = return_list (); | |
96 tree_statement_list *cmd_list = body (); | |
97 symbol_table::scope_id this_scope = scope (); | |
5861 | 98 |
7336 | 99 symbol_table::scope_id new_scope = symbol_table::dup_scope (this_scope); |
5861 | 100 |
7336 | 101 if (new_scope > 0) |
7767
71f068b22fcc
scope and context fixes for function handles
John W. Eaton <jwe@octave.org>
parents:
7336
diff
changeset
|
102 symbol_table::inherit (new_scope, symbol_table::current_scope (), |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
103 symbol_table::current_context ()); |
5861 | 104 |
105 octave_user_function *uf | |
7336 | 106 = new octave_user_function (new_scope, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
107 param_list ? param_list->dup (new_scope, 0) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
108 ret_list ? ret_list->dup (new_scope, 0) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
109 cmd_list ? cmd_list->dup (new_scope, 0) : 0); |
5861 | 110 |
6656 | 111 octave_function *curr_fcn = octave_call_stack::current (); |
112 | |
113 if (curr_fcn) | |
8032
2fd4a5ef6b59
stash parent function scope for inline functions and anonymous function handles.
John W. Eaton <jwe@octave.org>
parents:
7767
diff
changeset
|
114 { |
17787
175b392e91fe
Use GNU style coding conventions for code in libinterp/
Rik <rik@octave.org>
parents:
17744
diff
changeset
|
115 // FIXME: maybe it would be better to just stash curr_fcn |
11263
c78247b664fc
allow private functions to find private functions
John W. Eaton <jwe@octave.org>
parents:
10960
diff
changeset
|
116 // instead of individual bits of info about it? |
c78247b664fc
allow private functions to find private functions
John W. Eaton <jwe@octave.org>
parents:
10960
diff
changeset
|
117 |
8032
2fd4a5ef6b59
stash parent function scope for inline functions and anonymous function handles.
John W. Eaton <jwe@octave.org>
parents:
7767
diff
changeset
|
118 uf->stash_parent_fcn_name (curr_fcn->name ()); |
11263
c78247b664fc
allow private functions to find private functions
John W. Eaton <jwe@octave.org>
parents:
10960
diff
changeset
|
119 uf->stash_dir_name (curr_fcn->dir_name ()); |
8045
24701aa75ecb
scope fixes for anonymous and inline functions that appear inside subfunctions
John W. Eaton <jwe@octave.org>
parents:
8032
diff
changeset
|
120 |
24701aa75ecb
scope fixes for anonymous and inline functions that appear inside subfunctions
John W. Eaton <jwe@octave.org>
parents:
8032
diff
changeset
|
121 symbol_table::scope_id parent_scope = curr_fcn->parent_fcn_scope (); |
24701aa75ecb
scope fixes for anonymous and inline functions that appear inside subfunctions
John W. Eaton <jwe@octave.org>
parents:
8032
diff
changeset
|
122 |
24701aa75ecb
scope fixes for anonymous and inline functions that appear inside subfunctions
John W. Eaton <jwe@octave.org>
parents:
8032
diff
changeset
|
123 if (parent_scope < 0) |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
124 parent_scope = curr_fcn->scope (); |
11586
12df7854fa7c
strip trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents:
11523
diff
changeset
|
125 |
8045
24701aa75ecb
scope fixes for anonymous and inline functions that appear inside subfunctions
John W. Eaton <jwe@octave.org>
parents:
8032
diff
changeset
|
126 uf->stash_parent_fcn_scope (parent_scope); |
13241
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13125
diff
changeset
|
127 |
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13125
diff
changeset
|
128 if (curr_fcn->is_class_method () || curr_fcn->is_class_constructor ()) |
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13125
diff
changeset
|
129 uf->stash_dispatch_class (curr_fcn->dispatch_class ()); |
8032
2fd4a5ef6b59
stash parent function scope for inline functions and anonymous function handles.
John W. Eaton <jwe@octave.org>
parents:
7767
diff
changeset
|
130 } |
6656 | 131 |
13241
2a8dcb5b3a00
improve default indexing for objects
John W. Eaton <jwe@octave.org>
parents:
13125
diff
changeset
|
132 uf->mark_as_anonymous_function (); |
13125
34a49d076155
Show row/column for anonymous functions in the profiler
Daniel Kraft <d@domob.eu>
parents:
12783
diff
changeset
|
133 uf->stash_fcn_file_name (file_name); |
12783
ad9263d965dc
First experimental profiler implementation with flat profile.
Daniel Kraft <d@domob.eu>
parents:
11586
diff
changeset
|
134 uf->stash_fcn_location (line (), column ()); |
6149 | 135 |
6505 | 136 octave_value ov_fcn (uf); |
5861 | 137 |
10960 | 138 octave_value fh (octave_fcn_binder::maybe_binder (ov_fcn)); |
5861 | 139 |
140 return fh; | |
141 } | |
142 | |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
143 /* |
14085
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
144 %!function r = __f2 (f, x) |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
145 %! r = f (x); |
14085
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
146 %!endfunction |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
147 %!function f = __f1 (k) |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
148 %! f = @(x) __f2 (@(y) y-k, x); |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
149 %!endfunction |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
150 |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
151 %!assert ((__f1 (3)) (10) == 7) |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
152 |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
153 %!test |
9327
e12a5ec6cf0d
tree_anon_fcn_handle::dup: don't convert to tree_constant
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
154 %! g = @(t) feval (@(x) t*x, 2); |
14085
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
155 %! assert (g(0.5) == 1); |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
156 |
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
157 %!test |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
158 %! h = @(x) sin (x); |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
159 %! g = @(f, x) h (x); |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
160 %! f = @() g (@(x) h, pi); |
14085
4e8f23ccadce
test: Use internal prefix "__" for %!functions to avoid polluting workspace
Rik <octave@nomad.inbox5.com>
parents:
13241
diff
changeset
|
161 %! assert (f () == sin (pi)); |
16681
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
162 |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
163 The next two tests are intended to test parsing of a character string |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
164 vs. hermitian operator at the beginning of an anonymous function |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
165 expression. The use of ' for the character string and the spacing is |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
166 intentional, so don't change it. |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
167 |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
168 %!test |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
169 %! f = @() 'foo'; |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
170 %! assert (f (), 'foo'); |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
171 |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
172 %!test |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
173 %! f = @()'foo'; |
d3619d4d267c
recognize character string at beginning of statement (bug #38926, #38958)
John W. Eaton <jwe@octave.org>
parents:
15195
diff
changeset
|
174 %! assert (f (), 'foo'); |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
175 */ |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
176 |
5861 | 177 octave_value_list |
178 tree_anon_fcn_handle::rvalue (int nargout) | |
179 { | |
180 octave_value_list retval; | |
181 | |
182 if (nargout > 1) | |
183 error ("invalid number of output arguments for anonymous function handle expression"); | |
184 else | |
8658
73c4516fae10
New evaluator and debugger derived from tree-walker class
John W. Eaton <jwe@octave.org>
parents:
8045
diff
changeset
|
185 retval = rvalue1 (nargout); |
5861 | 186 |
187 return retval; | |
188 } | |
189 | |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
190 tree_expression * |
8913
35cd375d4bb3
make tree::dup functions const
John W. Eaton <jwe@octave.org>
parents:
8906
diff
changeset
|
191 tree_anon_fcn_handle::dup (symbol_table::scope_id, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
192 symbol_table::context_id) const |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
193 { |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
194 tree_parameter_list *param_list = parameter_list (); |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
195 tree_parameter_list *ret_list = return_list (); |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
196 tree_statement_list *cmd_list = body (); |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
197 symbol_table::scope_id this_scope = scope (); |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
198 |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
199 symbol_table::scope_id new_scope = symbol_table::dup_scope (this_scope); |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
200 |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
201 if (new_scope > 0) |
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
202 symbol_table::inherit (new_scope, symbol_table::current_scope (), |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
203 symbol_table::current_context ()); |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
204 |
9327
e12a5ec6cf0d
tree_anon_fcn_handle::dup: don't convert to tree_constant
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
205 tree_anon_fcn_handle *new_afh = new |
e12a5ec6cf0d
tree_anon_fcn_handle::dup: don't convert to tree_constant
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
206 tree_anon_fcn_handle (param_list ? param_list->dup (new_scope, 0) : 0, |
10315
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
207 ret_list ? ret_list->dup (new_scope, 0) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
208 cmd_list ? cmd_list->dup (new_scope, 0) : 0, |
57a59eae83cc
untabify src C++ source files
John W. Eaton <jwe@octave.org>
parents:
10261
diff
changeset
|
209 new_scope, line (), column ()); |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
210 |
9327
e12a5ec6cf0d
tree_anon_fcn_handle::dup: don't convert to tree_constant
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
211 new_afh->copy_base (*this); |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
212 |
9327
e12a5ec6cf0d
tree_anon_fcn_handle::dup: don't convert to tree_constant
John W. Eaton <jwe@octave.org>
parents:
8920
diff
changeset
|
213 return new_afh; |
8906
ab87d08d9a1b
improve symbol inheritance for anonymous functions
John W. Eaton <jwe@octave.org>
parents:
8658
diff
changeset
|
214 } |
5861 | 215 |
216 void | |
217 tree_anon_fcn_handle::accept (tree_walker& tw) | |
218 { | |
219 tw.visit_anon_fcn_handle (*this); | |
220 } |