GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
symtab.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1993-2025 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if defined (HAVE_CONFIG_H)
27# include "config.h"
28#endif
29
30#include <iostream>
31
32#include <sstream>
33
34#include "oct-time.h"
35
36#include "bp-table.h"
37#include "defun.h"
38#include "fcn-info.h"
39#include "interpreter-private.h"
40#include "interpreter.h"
41#include "load-path.h"
42#include "ov-classdef.h"
43#include "ov-fcn.h"
44#include "ov-usr-fcn.h"
45#include "pager.h"
46#include "parse.h"
47#include "pt-pr-code.h"
48#include "symscope.h"
49#include "symtab.h"
50
52
54 : m_interpreter (interp), m_fcn_table (), m_class_precedence_table (),
55 m_parent_map ()
56{
57 install_builtins ();
58}
59
62{
63 tree_evaluator& tw = m_interpreter.get_evaluator ();
64
65 return tw.get_current_scope ();
66}
67
68bool
70{
72
73 return val.is_defined ();
74}
75
77symbol_table::find_scoped_function (const std::string& name,
78 const symbol_scope& search_scope)
79{
80 if (name.empty ())
81 return octave_value ();
82
83 fcn_table_const_iterator p = m_fcn_table.find (name);
84
85 if (p != m_fcn_table.end ())
86 return p->second.find_scoped_function (search_scope);
87 else
88 {
89 fcn_info finfo (name);
90
91 octave_value fcn = finfo.find_scoped_function (search_scope);
92
93 if (fcn.is_defined ())
94 m_fcn_table[name] = finfo;
95
96 return fcn;
97 }
98}
99
101symbol_table::find_private_function (const std::string& dir_name,
102 const std::string& name)
103{
104 if (name.empty ())
105 return octave_value ();
106
107 fcn_table_const_iterator p = m_fcn_table.find (name);
108
109 if (p != m_fcn_table.end ())
110 return p->second.find_private_function (dir_name);
111 else
112 {
113 fcn_info finfo (name);
114
115 octave_value fcn = finfo.find_private_function (dir_name);
116
117 if (fcn.is_defined ())
118 m_fcn_table[name] = finfo;
119
120 return fcn;
121 }
122}
123
124// FIXME: this function only finds legacy class methods, not
125// classdef methods.
126
128symbol_table::find_method (const std::string& name,
129 const std::string& dispatch_type)
130{
131 if (name.empty ())
132 return octave_value ();
133
134 fcn_table_const_iterator p = m_fcn_table.find (name);
135
136 if (p != m_fcn_table.end ())
137 return p->second.find_method (dispatch_type);
138 else
139 {
140 fcn_info finfo (name);
141
142 octave_value fcn = finfo.find_method (dispatch_type);
143
144 if (fcn.is_defined ())
145 m_fcn_table[name] = finfo;
146
147 return fcn;
148 }
149}
150
153{
154 fcn_table_const_iterator p = m_fcn_table.find (name);
155
156 if (p != m_fcn_table.end ())
157 return p->second.find_built_in_function ();
158 else
159 {
160 fcn_info finfo (name);
161
163
164 if (fcn.is_defined ())
165 m_fcn_table[name] = finfo;
166
167 return fcn;
168 }
169}
170
172symbol_table::find_autoload (const std::string& name)
173{
174 if (name.empty ())
175 return octave_value ();
176
177 auto p = m_fcn_table.find (name);
178
179 if (p != m_fcn_table.end ())
180 return p->second.find_autoload ();
181 else
182 {
183 fcn_info finfo (name);
184
185 octave_value fcn = finfo.find_autoload ();
186
187 if (fcn.is_defined ())
188 m_fcn_table[name] = finfo;
189
190 return fcn;
191 }
192}
193
195symbol_table::builtin_find (const std::string& name,
196 const symbol_scope& search_scope_arg)
197{
198 if (name.empty ())
199 return octave_value ();
200
201 fcn_table_iterator p = m_fcn_table.find (name);
202
203 symbol_scope search_scope
204 = (search_scope_arg ? search_scope_arg : current_scope ());
205
206 if (p != m_fcn_table.end ())
207 return p->second.builtin_find (search_scope);
208 else
209 {
210 fcn_info finfo (name);
211
212 octave_value fcn = finfo.builtin_find (search_scope);
213
214 if (fcn.is_defined ())
215 m_fcn_table[name] = finfo;
216
217 return fcn;
218 }
219
220 return octave_value ();
221}
222
224symbol_table::fcn_table_find (const std::string& name,
225 const octave_value_list& args,
226 const symbol_scope& search_scope_arg)
227{
228 if (name.empty ())
229 return octave_value ();
230
231 fcn_table_iterator p = m_fcn_table.find (name);
232
233 symbol_scope search_scope
234 = (search_scope_arg ? search_scope_arg : current_scope ());
235
236 if (p != m_fcn_table.end ())
237 return p->second.find (search_scope, args);
238 else
239 {
240 fcn_info finfo (name);
241
242 octave_value fcn = finfo.find (search_scope, args);
243
244 if (fcn.is_defined ())
245 m_fcn_table[name] = finfo;
246
247 return fcn;
248 }
249
250 return octave_value ();
251}
252
254symbol_table::find_function (const std::string& name,
255 const symbol_scope& search_scope_arg)
256{
257 if (name.empty ())
258 return octave_value ();
259
260 if (name[0] == '@')
261 {
262 std::size_t pos = name.find_first_of ('/');
263
264 if (pos == std::string::npos)
265 return octave_value ();
266
267 std::string method = name.substr (pos+1);
268 std::string dispatch_type = name.substr (1, pos-1);
269
270 return find_method (method, dispatch_type);
271 }
272 else
273 {
274 symbol_scope search_scope
275 = (search_scope_arg ? search_scope_arg : current_scope ());
276
277 return find_function (name, ovl (), search_scope);
278 }
279}
280
282symbol_table::find_function (const std::string& name,
283 const octave_value_list& args,
284 const symbol_scope& search_scope)
285{
286 if (name.empty ())
287 return octave_value ();
288
289 return fcn_table_find (name, args, search_scope);
290}
291
293symbol_table::find_user_function (const std::string& name)
294{
295 if (name.empty ())
296 return octave_value ();
297
298 auto p = m_fcn_table.find (name);
299
300 if (p != m_fcn_table.end ())
301 return p->second.find_user_function ();
302 else
303 {
304 fcn_info finfo (name);
305
306 octave_value fcn = finfo.find_user_function ();
307
308 if (fcn.is_defined ())
309 m_fcn_table[name] = finfo;
310
311 return fcn;
312 }
313}
314
316symbol_table::find_cmdline_function (const std::string& name)
317{
318 if (name.empty ())
319 return octave_value ();
320
321 auto p = m_fcn_table.find (name);
322
323 if (p != m_fcn_table.end ())
324 return p->second.find_cmdline_function ();
325 else
326 {
327 fcn_info finfo (name);
328
329 octave_value fcn = finfo.find_cmdline_function ();
330
331 if (fcn.is_defined ())
332 m_fcn_table[name] = finfo;
333
334 return fcn;
335 }
336}
337
338void
340 const octave_value& fcn)
341{
342 auto p = m_fcn_table.find (name);
343
344 if (p != m_fcn_table.end ())
345 {
346 fcn_info& finfo = p->second;
347
348 finfo.install_cmdline_function (fcn);
349 }
350 else
351 {
352 fcn_info finfo (name);
353
354 finfo.install_cmdline_function (fcn);
355
356 m_fcn_table[name] = finfo;
357 }
358}
359
360// Install local function FCN named NAME. FILE_NAME is the name of
361// the file containing the local function.
362
363void
365 const octave_value& fcn,
366 const std::string& file_name)
367{
368 auto p = m_fcn_table.find (name);
369
370 if (p != m_fcn_table.end ())
371 {
372 fcn_info& finfo = p->second;
373
374 finfo.install_local_function (fcn, file_name);
375 }
376 else
377 {
378 fcn_info finfo (name);
379
380 finfo.install_local_function (fcn, file_name);
381
382 m_fcn_table[name] = finfo;
383 }
384}
385
386void
387symbol_table::install_user_function (const std::string& name,
388 const octave_value& fcn)
389{
390 auto p = m_fcn_table.find (name);
391
392 if (p != m_fcn_table.end ())
393 {
394 fcn_info& finfo = p->second;
395
396 finfo.install_user_function (fcn);
397 }
398 else
399 {
400 fcn_info finfo (name);
401
402 finfo.install_user_function (fcn);
403
404 m_fcn_table[name] = finfo;
405 }
406}
407
408// FIXME: should we ensure that FCN really is a built-in function
409// object?
410void
412 const octave_value& fcn)
413{
414 auto p = m_fcn_table.find (name);
415
416 if (p != m_fcn_table.end ())
417 {
418 fcn_info& finfo = p->second;
419
420 finfo.install_built_in_function (fcn);
421 }
422 else
423 {
424 fcn_info finfo (name);
425
426 finfo.install_built_in_function (fcn);
427
428 m_fcn_table[name] = finfo;
429 }
430}
431
432// This is written as two separate functions instead of a single
433// function with default values so that it will work properly with
434// unwind_protect.
435
436void
438{
439 auto p = m_fcn_table.begin ();
440
441 while (p != m_fcn_table.end ())
442 (p++)->second.clear (force);
443}
444
445void
446symbol_table::clear_function (const std::string& name)
447{
448 clear_user_function (name);
449}
450
451void
453{
454 symbol_match pattern (pat);
455
456 auto p = m_fcn_table.begin ();
457
458 while (p != m_fcn_table.end ())
459 {
460 if (pattern.match (p->first))
461 (p++)->second.clear_user_function ();
462 else
463 p++;
464 }
465}
466
467void
469{
470 regexp pattern (pat);
471
472 auto p = m_fcn_table.begin ();
473
474 while (p != m_fcn_table.end ())
475 {
476 if (pattern.is_match (p->first))
477 (p++)->second.clear_user_function ();
478 else
479 p++;
480 }
481}
482
483void
484symbol_table::clear_user_function (const std::string& name)
485{
486 auto p = m_fcn_table.find (name);
487
488 if (p != m_fcn_table.end ())
489 {
490 fcn_info& finfo = p->second;
491
492 finfo.clear_user_function ();
493 }
494 // FIXME: is this necessary, or even useful?
495 // else
496 // error ("clear: no such function '%s'", name.c_str ());
497}
498
499// This clears oct and mex files, including autoloads.
500void
501symbol_table::clear_dld_function (const std::string& name)
502{
503 auto p = m_fcn_table.find (name);
504
505 if (p != m_fcn_table.end ())
506 {
507 fcn_info& finfo = p->second;
508
510 finfo.clear_user_function ();
511 }
512}
513
514void
516{
517 auto p = m_fcn_table.begin ();
518
519 while (p != m_fcn_table.end ())
520 (p++)->second.clear_mex_function ();
521}
522
523// Insert INF_CLASS in the set of class names that are considered
524// inferior to SUP_CLASS. Return FALSE if INF_CLASS is currently
525// marked as superior to SUP_CLASS.
526
527bool
528symbol_table::set_class_relationship (const std::string& sup_class,
529 const std::string& inf_class)
530{
531 if (is_superiorto (inf_class, sup_class))
532 return false;
533
534 // If sup_class doesn't have an entry in the precedence table,
535 // this will automatically create it, and associate to it a
536 // singleton set {inf_class} of inferior classes.
537 m_class_precedence_table[sup_class].insert (inf_class);
538
539 return true;
540}
541
542// Has class A been marked as superior to class B? Also returns
543// TRUE if B has been marked as inferior to A, since we only keep
544// one table, and convert inferiorto information to a superiorto
545// relationship. Two calls are required to determine whether there
546// is no relationship between two classes:
547//
548// if (symbol_table::is_superiorto (a, b))
549// // A is superior to B, or B has been marked inferior to A.
550// else if (symbol_table::is_superiorto (b, a))
551// // B is superior to A, or A has been marked inferior to B.
552// else
553// // No relation.
554
555bool
556symbol_table::is_superiorto (const std::string& a, const std::string& b)
557{
558 class_precedence_table_const_iterator p = m_class_precedence_table.find (a);
559 // If a has no entry in the precedence table, return false
560 if (p == m_class_precedence_table.end ())
561 return false;
562
563 const std::set<std::string>& inferior_classes = p->second;
564 std::set<std::string>::const_iterator q = inferior_classes.find (b);
565 return (q != inferior_classes.end ());
566}
567
568void
570 const std::string& name)
571{
573
574 if (fcn.is_defined ())
575 {
576 fcn_info finfo (alias);
577
578 finfo.install_built_in_function (fcn);
579
580 m_fcn_table[alias] = finfo;
581 }
582 else
583 panic ("alias: '%s' is undefined", name.c_str ());
584}
585
586void
588 const std::string& klass)
589{
590 auto p = m_fcn_table.find (name);
591
592 if (p != m_fcn_table.end ())
593 {
594 fcn_info& finfo = p->second;
595
596 finfo.install_built_in_dispatch (klass);
597 }
598 else
599 error ("install_built_in_dispatch: '%s' is undefined", name.c_str ());
600}
601
602std::list<std::string>
604{
605 std::list<std::string> retval;
606
607 for (const auto& nm_finfo : m_fcn_table)
608 {
609 if (nm_finfo.second.is_user_function_defined ())
610 retval.push_back (nm_finfo.first);
611 }
612
613 if (! retval.empty ())
614 retval.sort ();
615
616 return retval;
617}
618
619std::list<std::string>
621{
622 std::list<std::string> retval;
623
624 for (const auto& nm_finfo : m_fcn_table)
625 {
626 octave_value fcn = nm_finfo.second.find_built_in_function ();
627
628 if (fcn.is_defined ())
629 retval.push_back (nm_finfo.first);
630 }
631
632 if (! retval.empty ())
633 retval.sort ();
634
635 return retval;
636}
637
638std::list<std::string>
640{
641 std::list<std::string> retval;
642
643 for (const auto& nm_finfo : m_fcn_table)
644 {
645 octave_value fcn = nm_finfo.second.find_cmdline_function ();
646
647 if (fcn.is_defined ())
648 retval.push_back (nm_finfo.first);
649 }
650
651 if (! retval.empty ())
652 retval.sort ();
653
654 return retval;
655}
656
657template <template <typename, typename...> class C, typename V,
658 typename... A>
659static octave_value
660dump_container_map (const std::map<std::string, C<V, A...>>& container_map)
661{
662 if (container_map.empty ())
663 return octave_value (Matrix ());
664
665 std::map<std::string, octave_value> info_map;
666
667 for (const auto& nm_container : container_map)
668 {
669 std::string nm = nm_container.first;
670 const C<V, A...>& container = nm_container.second;
671 info_map[nm] = Cell (container);
672 }
673
674 return octave_value (info_map);
675}
676
679{
680 std::map<std::string, octave_value> m
681 = {{ "function_info", dump_fcn_table_map () },
682 { "precedence_table", dump_container_map (m_class_precedence_table) },
683 { "parent_classes", dump_container_map (m_parent_map) }
684 };
685
686 return octave_value (m);
687}
688
689void
690symbol_table::add_to_parent_map (const std::string& classname,
691 const std::list<std::string>& parent_list)
692{
693 m_parent_map[classname] = parent_list;
694}
695
696std::list<std::string>
697symbol_table::parent_classes (const std::string& dispatch_type)
698{
699 std::list<std::string> retval;
700
701 const_parent_map_iterator it = m_parent_map.find (dispatch_type);
702
703 if (it != m_parent_map.end ())
704 retval = it->second;
705
706 for (const auto& nm : retval)
707 {
708 // Search for parents of parents and append them to the list.
709
710 // FIXME: should we worry about a circular inheritance graph?
711
712 std::list<std::string> parents = parent_classes (nm);
713
714 if (! parents.empty ())
715 retval.insert (retval.end (), parents.begin (), parents.end ());
716 }
717
718 return retval;
719}
720
721void
723{
725
726 m_fcn_table.clear ();
727 m_class_precedence_table.clear ();
728 m_parent_map.clear ();
729}
730
731fcn_info *
732symbol_table::get_fcn_info (const std::string& name)
733{
734 auto p = m_fcn_table.find (name);
735 return p != m_fcn_table.end () ? &p->second : nullptr;
736}
737
739symbol_table::dump_fcn_table_map () const
740{
741 if (m_fcn_table.empty ())
742 return octave_value (Matrix ());
743
744 std::map<std::string, octave_value> info_map;
745
746 for (const auto& nm_finfo : m_fcn_table)
747 {
748 std::string nm = nm_finfo.first;
749 const fcn_info& finfo = nm_finfo.second;
750 info_map[nm] = finfo.dump ();
751 }
752
753 return octave_value (info_map);
754}
755
756DEFMETHOD (__dump_symtab_info__, interp, args, ,
757 doc: /* -*- texinfo -*-
758@deftypefn {} {@var{S} =} __dump_symtab_info__ ()
759@deftypefnx {} {@var{S} =} __dump_symtab_info__ (@var{function})
760Return a structure with information from the symbol table.
761@end deftypefn */)
762{
763 int nargin = args.length ();
764
765 if (nargin > 1)
766 print_usage ();
767
768 symbol_table& symtab = interp.get_symbol_table ();
769
770 if (nargin == 0)
771 return symtab.dump ();
772 else
773 {
774 std::string fname = args(0).xstring_value ("__dump_symtab_info__: argument must be a function name");
775
776 fcn_info *finfo = symtab.get_fcn_info (fname);
777
778 if (finfo)
779 return finfo->dump ();
780 }
781
782 return ovl ();
783}
784
785DEFMETHOD (__get_cmdline_fcn_txt__, interp, args, ,
786 doc: /* -*- texinfo -*-
787@deftypefn {} {@var{str} =} __get_cmdline_fcn_txt__ (@var{name})
788Undocumented internal function.
789@end deftypefn */)
790{
791 if (args.length () != 1)
792 print_usage ();
793
794 std::string name = args(0).xstring_value ("__get_cmdline_fcn_txt__: first argument must be function name");
795
796 symbol_table& symtab = interp.get_symbol_table ();
797
798 octave_value ov = symtab.find_cmdline_function (name);
799
801
802 octave_value_list retval;
803
804 if (f)
805 {
806 std::ostringstream buf;
807
808 tree_print_code tpc (buf);
809
810 f->accept (tpc);
811
812 retval = ovl (buf.str ());
813 }
814
815 return retval;
816}
817
818// FIXME: should we have functions like this in Octave?
819//
820// DEFMETHOD (set_variable, interp, args, , "set_variable (NAME, VALUE)")
821// {
822// if (args.length () != 2)
823// print_usage ();
824//
825// std::string name = args(0).xstring_value ("set_variable: variable NAME must be a string");
826//
827// symbol_table& symtab = interp.get_symbol_table ();
828//
829// symtab.assign (name, args(1));
830//
831// return ovl ();
832// }
833//
834// DEFMETHOD (variable_value, interp, args, , "VALUE = variable_value (NAME)")
835// {
836// if (args.length () != 1)
837// print_usage ();
838//
839// octave_value retval;
840//
841// std::string name = args(0).xstring_value ("variable_value: variable NAME must be a string");
842//
843// symbol_table& symtab = interp.get_symbol_table ();
844//
845// retval = symtab.varval (name);
846//
847// if (retval.is_undefined ())
848// error ("variable_value: '%s' is not a variable in the current scope",
849// name.c_str ());
850//
851// return retval;
852// }
853
854/*
855bug #34497: 'clear -f' does not work for command line functions
856
857This test relies on bar being a core function that is implemented in an m-file.
858If the first assert fails, this is no longer the case and the tests need to be
859updated to use some other function.
860
861%!assert <34497> (! strcmp (which ("bar"), ""))
862
863%!function x = bar ()
864%! x = 5;
865%!endfunction
866%!test
867%! assert (bar == 5);
868%! assert (strcmp (which ("bar"), "command-line function"));
869%! clear -f bar;
870%! assert (! strcmp (which ("bar"), ""));
871
872%!function x = bar ()
873%! x = 5;
874%!endfunction
875%!test
876%! assert (bar == 5);
877%! assert (strcmp (which ("bar"), "command-line function"));
878%! clear bar;
879%! assert (! strcmp (which ("bar"), ""));
880*/
881
882OCTAVE_END_NAMESPACE(octave)
#define C(a, b)
Definition Faddeeva.cc:256
Definition Cell.h:41
octave_value find_method(const std::string &dispatch_type) const
Definition fcn-info.h:270
octave_value find_user_function()
Definition fcn-info.h:291
octave_value find_scoped_function(const symbol_scope &search_scope) const
Definition fcn-info.h:260
void install_built_in_dispatch(const std::string &klass)
Definition fcn-info.h:329
octave_value builtin_find(const symbol_scope &search_scope)
Definition fcn-info.h:255
octave_value dump() const
Definition fcn-info.h:348
octave_value find_built_in_function() const
Definition fcn-info.h:275
void clear_autoload_function(bool force=false)
Definition fcn-info.h:341
octave_value find_autoload()
Definition fcn-info.h:285
octave_value find_cmdline_function() const
Definition fcn-info.h:280
void install_user_function(const octave_value &f)
Definition fcn-info.h:319
void install_local_function(const octave_value &f, const std::string &file_name)
Definition fcn-info.h:313
void install_cmdline_function(const octave_value &f)
Definition fcn-info.h:308
octave_value find(const symbol_scope &search_scope, const octave_value_list &args=octave_value_list())
Definition fcn-info.h:248
void clear_user_function(bool force=false)
Definition fcn-info.h:336
octave_value find_private_function(const std::string &dir_name) const
Definition fcn-info.h:265
void install_built_in_function(const octave_value &f)
Definition fcn-info.h:324
tree_evaluator & get_evaluator()
octave_value sort(octave_idx_type dim=0, sortmode mode=ASCENDING) const
Definition ov.h:1431
bool is_defined() const
Definition ov.h:592
octave_user_function * user_function_value(bool silent=false) const
std::string xstring_value(const char *fmt,...) const
bool is_match(const std::string &buffer) const
Definition lo-regexp.cc:582
bool match(const std::string &sym)
Definition glob-match.cc:86
octave_value find_scoped_function(const std::string &name, const symbol_scope &search_scope)
Definition symtab.cc:77
octave_value find_method(const std::string &name, const std::string &dispatch_type)
Definition symtab.cc:128
bool is_built_in_function_name(const std::string &name)
Definition symtab.cc:69
octave_value find_private_function(const std::string &dir_name, const std::string &name)
Definition symtab.cc:101
void clear_function(const std::string &name)
Definition symtab.cc:446
void clear_function_pattern(const std::string &pat)
Definition symtab.cc:452
octave_value builtin_find(const std::string &name, const symbol_scope &search_scope=symbol_scope::invalid())
Definition symtab.cc:195
void clear_functions(bool force=false)
Definition symtab.cc:437
void alias_built_in_function(const std::string &alias, const std::string &name)
Definition symtab.cc:569
void add_to_parent_map(const std::string &classname, const std::list< std::string > &parent_list)
Definition symtab.cc:690
fcn_info * get_fcn_info(const std::string &name)
Definition symtab.cc:732
void install_cmdline_function(const std::string &name, const octave_value &fcn)
Definition symtab.cc:339
void clear_user_function(const std::string &name)
Definition symtab.cc:484
octave_value find_function(const std::string &name, const symbol_scope &search_scope=symbol_scope::invalid())
Definition symtab.cc:254
void install_user_function(const std::string &name, const octave_value &fcn)
Definition symtab.cc:387
void clear_dld_function(const std::string &name)
Definition symtab.cc:501
void clear_mex_functions()
Definition symtab.cc:515
octave_value find_cmdline_function(const std::string &name)
Definition symtab.cc:316
octave_value dump() const
Definition symtab.cc:678
void install_built_in_function(const std::string &name, const octave_value &fcn)
Definition symtab.cc:411
void install_built_in_dispatch(const std::string &name, const std::string &klass)
Definition symtab.cc:587
void cleanup()
Definition symtab.cc:722
octave_value fcn_table_find(const std::string &name, const octave_value_list &args=ovl(), const symbol_scope &search_scope=symbol_scope::invalid())
Definition symtab.cc:224
octave_value find_built_in_function(const std::string &name)
Definition symtab.cc:152
std::list< std::string > cmdline_function_names()
Definition symtab.cc:639
bool is_superiorto(const std::string &a, const std::string &b)
Definition symtab.cc:556
std::list< std::string > built_in_function_names()
Definition symtab.cc:620
std::list< std::string > user_function_names()
Definition symtab.cc:603
symbol_scope current_scope() const
Definition symtab.cc:61
octave_value find_autoload(const std::string &name)
Definition symtab.cc:172
octave_value find_user_function(const std::string &name)
Definition symtab.cc:293
void clear_function_regexp(const std::string &pat)
Definition symtab.cc:468
void install_local_function(const std::string &name, const octave_value &fcn, const std::string &file_name)
Definition symtab.cc:364
bool set_class_relationship(const std::string &sup_class, const std::string &inf_class)
Definition symtab.cc:528
std::list< std::string > parent_classes(const std::string &dispatch_type)
Definition symtab.cc:697
symbol_scope get_current_scope() const
Definition pt-eval.cc:2766
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
void print_usage()
Definition defun-int.h:72
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
Definition defun.h:111
void error(const char *fmt,...)
Definition error.cc:1003
F77_RET_T const F77_INT const F77_INT const F77_INT const F77_DBLE const F77_DBLE F77_INT F77_DBLE * V
F77_RET_T const F77_INT F77_CMPLX * A
F77_RET_T const F77_DBLE const F77_DBLE * f
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.
Definition ovl.h:217
OCTAVE_NORETURN void panic(const char *fmt,...)
Definition panic.cc:45