26#if defined (HAVE_CONFIG_H)
104 std::string
type (
void)
const {
return "<invalid>"; }
130 std::string
type (
void)
const {
return "<internal>"; }
169 const std::string&
file =
"",
170 const std::string& =
"")
195 std::string
type (
void)
const {
return "simple"; }
216 bool save_binary (std::ostream& os,
bool save_as_floats);
225 void print_raw (std::ostream& os,
bool pr_as_read_syntax,
226 int current_print_indent_level)
const;
244 const std::string&
file =
"",
245 const std::string& =
"")
250 const std::list<std::string>& parentage);
261 std::string
type (
void)
const {
return "scopedfunction"; }
288 bool save_binary (std::ostream& os,
bool save_as_floats);
297 void print_raw (std::ostream&,
bool pr_as_read_syntax,
298 int current_print_indent_level)
const;
323 const std::string&
file =
"",
324 const std::string& =
"")
332 std::string
type (
void)
const {
return "nested"; }
361 bool save_binary (std::ostream& os,
bool save_as_floats);
370 void print_raw (std::ostream&,
bool pr_as_read_syntax,
371 int current_print_indent_level)
const;
387 const std::string&
file =
"",
388 const std::string& octaveroot =
"")
405 bool is_nested (
const std::shared_ptr<stack_frame>& frame)
const
475 const std::string&
file,
484 const std::string& meth_nm);
487 const std::string& class_nm,
488 const std::string& meth_nm);
491 const std::string& class_nm,
492 const std::string& meth_nm);
503 std::string
type (
void)
const {
return "classsimple"; }
551 bool save_binary (std::ostream& os,
bool save_as_floats);
560 void print_raw (std::ostream&,
bool pr_as_read_syntax,
561 int current_print_indent_level)
const;
620 const stack_frame::local_vars_map& local_vars)
628 std::string
type (
void)
const {
return "anonymous"; }
655 bool save_binary (std::ostream& os,
bool save_as_floats);
664 void print_raw (std::ostream&,
bool pr_as_read_syntax,
665 int current_print_indent_level)
const;
670 bool parse (
const std::string& fcn_text);
697 const stack_frame::local_vars_map& local_vars,
698 const std::shared_ptr<stack_frame>&
stack_context = std::shared_ptr<stack_frame> ());
768 error (
"invalid function handle, unable to find function for @%s",
774 std::string type_str =
type ();
775 error (
"invalid conversion from %s handle to weak nestead handle",
781 std::string type_str =
type ();
782 error (
"invalid conversion from %s handle to weak anonymous handle",
788 const std::list<octave_value_list>& idx,
797 int tmp_nargout = (
type.length () > 1 && nargout == 0) ? 1 : nargout;
799 retval =
call (tmp_nargout, idx.front ());
805 error (
"function handle cannot be indexed with %c",
type[0]);
816 retval = retval(0).next_subsref (nargout,
type, idx);
824 std::ostringstream buf;
879 std::string obj_type =
type ();
882 (
"Octave:load-save-unavailable",
883 "%s: loading %s files not available in this version of Octave",
884 obj_type.c_str (), file_type);
889 std::string obj_type =
type ();
892 (
"Octave:load-save-unavailable",
893 "%s: saving %s files not available in this version of Octave",
894 obj_type.c_str (), file_type);
899 std::string htype =
type ();
901 warning (
"%s for %s handles with %s format is not implemented",
902 op, htype.c_str (), fmt);
908 error (
"invalid call to invalid function handle");
957 std::size_t pos =
m_name.find (
'.');
959 if (pos != std::string::npos)
980 std::size_t end = pos;
982 std::vector<std::string> idx_elts;
986 end =
m_name.find (
'.', beg);
988 idx_elts.push_back (
m_name.substr (beg, end-beg));
990 if (end == std::string::npos)
996 std::size_t n_elts = idx_elts.size ();
998 bool have_object =
false;
1005 partial_expr_val = interp.
varval (idx_elts[0]);
1018 std::list<octave_value_list> arg_list;
1020 for (std::size_t i = 1; i < n_elts; i++)
1028 arg_list.push_back (
ovl (idx_elts[i]));
1045 catch (
const index_exception&)
1062 arg_list.push_back (
ovl (idx_elts[i]));
1063 arg_list.push_back (args);
1065 return partial_expr_val.
subsref (
type, arg_list, nargout);
1076 fcn_to_call = partial_expr_val;
1093 fcn_to_call =
m_fcn;
1107 fcn_to_call = ov_fcn;
1116 fcn_to_call = ov_fcn;
1123 return interp.
feval (fcn_to_call, args, nargout);
1199 std::string fnm =
file ();
1201 os <<
"# path: " << fnm <<
"\n";
1203 os <<
"# subtype: " <<
type () <<
"\n";
1221 std::ostringstream nmbuf;
1229 std::string buf_str = nmbuf.str ();
1230 int32_t tmp = buf_str.length ();
1231 os.write (
reinterpret_cast<char *
> (&tmp), 4);
1232 os.write (buf_str.c_str (), buf_str.length ());
1246#if defined (HAVE_HDF5)
1251#if defined (HAVE_HDF5_18)
1255 group_hid = H5Gcreate (loc_id,
name, 0);
1261 space_hid = data_hid = type_hid = -1;
1264 type_hid = H5Tcopy (H5T_C_S1);
1265 H5Tset_size (type_hid,
m_name.length () + 1);
1268 H5Gclose (group_hid);
1275 space_hid = H5Screate_simple (0, hdims,
nullptr);
1278 H5Tclose (type_hid);
1279 H5Gclose (group_hid);
1282#if defined (HAVE_HDF5_18)
1283 data_hid = H5Dcreate (group_hid,
"nm", type_hid, space_hid,
1287 data_hid = H5Dcreate (group_hid,
"nm", type_hid, space_hid,
1294 H5Sclose (space_hid);
1295 H5Tclose (type_hid);
1296 H5Gclose (group_hid);
1299 H5Dclose (data_hid);
1306 H5Sclose (space_hid);
1308 hdims[1] = octaveroot.length ();
1309 space_hid = H5Screate_simple (0, hdims,
nullptr);
1312 H5Tclose (type_hid);
1313 H5Gclose (group_hid);
1317 H5Tclose (type_hid);
1318 type_hid = H5Tcopy (H5T_C_S1);
1319 H5Tset_size (type_hid, octaveroot.length () + 1);
1321#if defined (HAVE_HDF5_18)
1322 a_id = H5Acreate (group_hid,
"OCTAVEROOT", type_hid, space_hid,
1325 a_id = H5Acreate (group_hid,
"OCTAVEROOT", type_hid, space_hid,
1331 retval = (H5Awrite (a_id, type_hid, octaveroot.c_str ()) >= 0);
1337 H5Sclose (space_hid);
1338 H5Tclose (type_hid);
1339 H5Gclose (group_hid);
1343 H5Sclose (space_hid);
1345 hdims[1] = fpath.length ();
1346 space_hid = H5Screate_simple (0, hdims,
nullptr);
1349 H5Tclose (type_hid);
1350 H5Gclose (group_hid);
1354 H5Tclose (type_hid);
1355 type_hid = H5Tcopy (H5T_C_S1);
1356 H5Tset_size (type_hid, fpath.length () + 1);
1358#if defined (HAVE_HDF5_18)
1359 a_id = H5Acreate (group_hid,
"FILE", type_hid, space_hid,
1367 retval = (H5Awrite (a_id, type_hid, fpath.c_str ()) >= 0);
1374 H5Sclose (space_hid);
1375 H5Tclose (type_hid);
1376 H5Gclose (group_hid);
1382 octave_unused_parameter (loc_id);
1383 octave_unused_parameter (
name);
1396#if defined (HAVE_HDF5)
1400 octave_unused_parameter (group_hid);
1401 octave_unused_parameter (space_hid);
1402 octave_unused_parameter (type_hid);
1408 octave_unused_parameter (group_hid);
1409 octave_unused_parameter (space_hid);
1410 octave_unused_parameter (type_hid);
1418 int current_print_indent_level)
const
1421 current_print_indent_level);
1439 const std::string&
name,
1440 const std::list<std::string>& parentage)
1493 std::string fnm =
file ();
1495 os <<
"# path: " << fnm <<
"\n";
1497 os <<
"# subtype: " <<
type () <<
"\n";
1525 std::ostringstream nmbuf;
1527 std::string fnm =
file ();
1532 std::string buf_str = nmbuf.str ();
1533 int32_t
len = buf_str.length ();
1534 os.write (
reinterpret_cast<char *
> (&
len), 4);
1535 os.write (buf_str.c_str (), buf_str.length ());
1563#if defined (HAVE_HDF5)
1569 octave_unused_parameter (loc_id);
1570 octave_unused_parameter (
name);
1576 octave_unused_parameter (loc_id);
1577 octave_unused_parameter (
name);
1590#if defined (HAVE_HDF5)
1596 octave_unused_parameter (group_hid);
1597 octave_unused_parameter (space_hid);
1598 octave_unused_parameter (type_hid);
1604 octave_unused_parameter (group_hid);
1605 octave_unused_parameter (space_hid);
1606 octave_unused_parameter (type_hid);
1614 bool pr_as_read_syntax,
1615 int current_print_indent_level)
const
1618 current_print_indent_level);
1647 if (pos != std::string::npos)
1648 dir_name = dir_name.substr (0, pos);
1649 else if (dir_name ==
"private")
1662 std::string primary_parent_name =
m_parentage.back ();
1677 if (file_name.substr (0, oct_home.size ()) == oct_home)
1678 file_name = file_name.substr (oct_home.size ());
1714 octave_unused_parameter (os);
1723 octave_unused_parameter (is);
1729 bool save_as_floats)
1733 octave_unused_parameter (os);
1734 octave_unused_parameter (save_as_floats);
1744 octave_unused_parameter (is);
1745 octave_unused_parameter (swap);
1746 octave_unused_parameter (fmt);
1752 const char *
name,
bool)
1754#if defined (HAVE_HDF5)
1758 octave_unused_parameter (loc_id);
1759 octave_unused_parameter (
name);
1765 octave_unused_parameter (loc_id);
1766 octave_unused_parameter (
name);
1779#if defined (HAVE_HDF5)
1783 octave_unused_parameter (group_hid);
1784 octave_unused_parameter (space_hid);
1785 octave_unused_parameter (type_hid);
1791 octave_unused_parameter (group_hid);
1792 octave_unused_parameter (space_hid);
1793 octave_unused_parameter (type_hid);
1801 bool pr_as_read_syntax,
1802 int current_print_indent_level)
const
1805 current_print_indent_level);
1825 return oct_usr_fcn->
execute (tw, nargout, args);
1855 return oct_usr_fcn->
execute (tw, nargout, args);
1862 return frames ? frames->workspace () :
octave_value ();
1876 const std::string& meth_nm)
1878 m_dispatch_class (class_nm)
1882 const std::string& class_nm,
1883 const std::string& meth_nm)
1885 m_dispatch_class (class_nm)
1890 const std::string& class_nm,
1891 const std::string& meth_nm)
1893 m_dispatch_class (class_nm)
1906 return interp.
feval (
m_fcn, tmp_args, nargout);
1947 octave_unused_parameter (os);
1956 octave_unused_parameter (is);
1962 bool save_as_floats)
1966 octave_unused_parameter (os);
1967 octave_unused_parameter (save_as_floats);
1977 octave_unused_parameter (is);
1978 octave_unused_parameter (swap);
1979 octave_unused_parameter (fmt);
1985 const char *
name,
bool)
1987#if defined (HAVE_HDF5)
1991 octave_unused_parameter (loc_id);
1992 octave_unused_parameter (
name);
1998 octave_unused_parameter (loc_id);
1999 octave_unused_parameter (
name);
2012#if defined (HAVE_HDF5)
2016 octave_unused_parameter (group_hid);
2017 octave_unused_parameter (space_hid);
2018 octave_unused_parameter (type_hid);
2024 octave_unused_parameter (group_hid);
2025 octave_unused_parameter (space_hid);
2026 octave_unused_parameter (type_hid);
2034 bool pr_as_read_syntax,
2035 int current_print_indent_level)
const
2038 current_print_indent_level);
2059 std::ostringstream buf;
2061 m.
setfield (
"function", buf.str ());
2066 m.
setfield (
"within_file_path",
"");
2087 os <<
"# length: " << varlen <<
"\n";
2091 if (!
save_text_data (os, nm_val.second, nm_val.first,
false, 0))
2092 return ! os.fail ();
2113 std::streampos pos = is.tellg ();
2140 error (
"load: failed to load anonymous function handle");
2159 bool save_as_floats)
2166 std::ostringstream nmbuf;
2172 nmbuf <<
' ' << varlen;
2174 std::string buf_str = nmbuf.str ();
2175 int32_t tmp = buf_str.length ();
2176 os.write (
reinterpret_cast<char *
> (&tmp), 4);
2177 os.write (buf_str.c_str (), buf_str.length ());
2179 std::ostringstream buf;
2181 std::string stmp = buf.str ();
2182 tmp = stmp.length ();
2183 os.write (
reinterpret_cast<char *
> (&tmp), 4);
2184 os.write (stmp.c_str (), stmp.length ());
2191 "", 0, save_as_floats))
2192 return ! os.fail ();
2207 if (
m_name.length () > anl)
2209 std::istringstream nm_is (
m_name.substr (anl));
2221 if (! is.read (
reinterpret_cast<char *
> (&tmp), 4))
2229 is.read (ctmp2, tmp);
2255 error (
"load: failed to load anonymous function handle");
2262 return parse (ctmp2);
2269 bool save_as_floats)
2271#if defined (HAVE_HDF5)
2276#if defined (HAVE_HDF5_18)
2280 group_hid = H5Gcreate (loc_id,
name, 0);
2286 space_hid = data_hid = type_hid = -1;
2289 type_hid = H5Tcopy (H5T_C_S1);
2290 H5Tset_size (type_hid,
m_name.length () + 1);
2293 H5Gclose (group_hid);
2300 space_hid = H5Screate_simple (0, hdims,
nullptr);
2303 H5Tclose (type_hid);
2304 H5Gclose (group_hid);
2307#if defined (HAVE_HDF5_18)
2308 data_hid = H5Dcreate (group_hid,
"nm", type_hid, space_hid,
2312 data_hid = H5Dcreate (group_hid,
"nm", type_hid, space_hid,
2319 H5Sclose (space_hid);
2320 H5Tclose (type_hid);
2321 H5Gclose (group_hid);
2324 H5Dclose (data_hid);
2326 std::ostringstream buf;
2328 std::string stmp = buf.str ();
2331 H5Tset_size (type_hid, stmp.length () + 1);
2334 H5Sclose (space_hid);
2335 H5Gclose (group_hid);
2339#if defined (HAVE_HDF5_18)
2340 data_hid = H5Dcreate (group_hid,
"fcn", type_hid, space_hid,
2344 data_hid = H5Dcreate (group_hid,
"fcn", type_hid, space_hid,
2351 H5Sclose (space_hid);
2352 H5Tclose (type_hid);
2353 H5Gclose (group_hid);
2357 H5Dclose (data_hid);
2368#if defined (HAVE_HDF5_18)
2369 a_id = H5Acreate (group_hid,
"SYMBOL_TABLE",
H5T_NATIVE_IDX, as_id,
2373 a_id = H5Acreate (group_hid,
"SYMBOL_TABLE",
H5T_NATIVE_IDX, as_id,
2390#if defined (HAVE_HDF5_18)
2391 data_hid = H5Gcreate (group_hid,
"symbol table",
2394 data_hid = H5Gcreate (group_hid,
"symbol table", 0);
2398 H5Sclose (space_hid);
2399 H5Tclose (type_hid);
2400 H5Gclose (group_hid);
2407 "",
false, save_as_floats))
2411 H5Gclose (data_hid);
2414 H5Sclose (space_hid);
2415 H5Tclose (type_hid);
2416 H5Gclose (group_hid);
2422 octave_unused_parameter (loc_id);
2423 octave_unused_parameter (
name);
2424 octave_unused_parameter (save_as_floats);
2437#if defined (HAVE_HDF5)
2439 bool success =
true;
2441#if defined (HAVE_HDF5_18)
2449 H5Sclose (space_hid);
2450 H5Tclose (type_hid);
2451 H5Gclose (group_hid);
2455 H5Tclose (type_hid);
2456 type_hid = H5Dget_type (data_hid);
2459 if (type_class_hid != H5T_STRING)
2461 H5Sclose (space_hid);
2462 H5Tclose (type_hid);
2463 H5Dclose (data_hid);
2464 H5Gclose (group_hid);
2468 H5Sclose (space_hid);
2469 space_hid = H5Dget_space (data_hid);
2470 hsize_t rank = H5Sget_simple_extent_ndims (space_hid);
2474 H5Sclose (space_hid);
2475 H5Tclose (type_hid);
2476 H5Dclose (data_hid);
2477 H5Gclose (group_hid);
2481 int slen = H5Tget_size (type_hid);
2484 H5Sclose (space_hid);
2485 H5Tclose (type_hid);
2486 H5Dclose (data_hid);
2487 H5Gclose (group_hid);
2495 H5Tset_size (st_id, slen);
2502 H5Sclose (space_hid);
2503 H5Tclose (type_hid);
2504 H5Dclose (data_hid);
2505 H5Gclose (group_hid);
2509 H5Dclose (data_hid);
2517 H5E_auto_t err_func;
2518 void *err_func_data;
2522#if defined (HAVE_HDF5_18)
2526 H5Eget_auto (&err_func, &err_func_data);
2527 H5Eset_auto (
nullptr,
nullptr);
2530 octave_hdf5_id attr_id = H5Aopen_name (group_hid,
"SYMBOL_TABLE");
2541#if defined (HAVE_HDF5_18)
2544 H5Eset_auto (err_func, err_func_data);
2558 if (
len > 0 && success)
2560 hsize_t num_obj = 0;
2561#if defined (HAVE_HDF5_18)
2564 data_hid = H5Gopen (group_hid,
"symbol table");
2566 H5Gget_num_objs (data_hid, &num_obj);
2567 H5Gclose (data_hid);
2569 if (num_obj !=
static_cast<hsize_t
> (
len))
2570 error (
"load: failed to load anonymous function handle");
2573 int current_item = 0;
2578 error (
"load: failed to load anonymous function handle");
2585 return parse (fcn_tmp);
2591 octave_unused_parameter (group_hid);
2592 octave_unused_parameter (space_hid);
2593 octave_unused_parameter (type_hid);
2602 tree_print_code tpc (os);
2607 error (
"invalid anonymous function handle");
2615 tree_parameter_list *p =
f->parameter_list ();
2622 tree_statement_list *b =
f->body ();
2624 assert (b->length () == 1);
2626 tree_statement *s = b->front ();
2629 error (
"invalid anonymous function handle");
2631 assert (s->is_expression ());
2633 tree_expression *e = s->expression ();
2636 error (
"invalid anonymous function handle");
2638 tpc.print_fcn_handle_body (e);
2659 unwind_action act ([&tw] () { tw.
pop_scope (); });
2663 = interp.
eval_string (fcn_text,
true, parse_status);
2665 if (parse_status != 0)
2679 symbol_scope uf_scope = uf->
scope ();
2689 const stack_frame::local_vars_map& local_vars,
2690 const std::shared_ptr<stack_frame>& stack_context)
2692 m_stack_context (stack_context)
2712 return oct_usr_fcn->
execute (tw, nargout, args);
2720 local_vars_map.
assign (nm_val.first, nm_val.second);
2736 Cell retval =
Cell (num_frames+1, 1);
2739 retval(i+1) = cell_frames(i);
2766 return oct_usr_fcn->
execute (tw, nargout, args);
2774 local_vars_map.
assign (nm_val.first, nm_val.second);
2794 Cell retval =
Cell (num_frames+1, 1);
2797 retval(i+1) = cell_frames(i);
2827 const std::string&
name)
2832 const std::string& meth_nm)
2838 const std::string& class_nm,
2839 const std::string& meth_nm)
2846 const std::string& class_nm,
2847 const std::string& meth_nm)
2853 const std::string&
name,
2854 const std::list<std::string>& parentage)
2860 const std::string&
name,
2861 const std::shared_ptr<octave::stack_frame>& stack_context)
2868 const std::shared_ptr<octave::stack_frame>& stack_context)
2893 return m_rep->save_ascii (os);
2899 std::shared_ptr<octave::base_fcn_handle> new_rep;
2904 std::streampos pos = is.tellg ();
2907 if (octaveroot.empty ())
2922 if (! (octaveroot.empty () || fpath.empty ()))
2924 std::size_t
len = octaveroot.size ();
2925 if (octaveroot == fpath.substr (0,
len))
2932 if (subtype.empty ())
2944 new_rep.reset (
new octave::anonymous_fcn_handle ());
2946 new_rep.reset (
new octave::simple_fcn_handle (
name, fpath, octaveroot));
2952 if (subtype ==
"simple")
2957 new_rep.reset (
new octave::simple_fcn_handle (
name, fpath, octaveroot));
2959 else if (subtype ==
"scopedfunction")
2964 new_rep.reset (
new octave::scoped_fcn_handle (
name, fpath, octaveroot));
2966 else if (subtype ==
"anonymous")
2967 new_rep.reset (
new octave::anonymous_fcn_handle ());
2968 else if (subtype ==
"nested")
2973 new_rep.reset (
new octave::nested_fcn_handle (
name, fpath, octaveroot));
2975 else if (subtype ==
"classsimple")
2980 new_rep.reset (
new octave::class_simple_fcn_handle (
name, fpath, octaveroot));
2987 if (! new_rep->load_ascii (is))
2998 return m_rep->save_binary (os, save_as_floats);
3009 if (! is.read (
reinterpret_cast<char *
> (&tmp), 4))
3017 is.read (ctmp1, tmp);
3019 std::string
name (ctmp1);
3024 std::shared_ptr<octave::base_fcn_handle> new_rep;
3035 new_rep.reset (
new octave::anonymous_fcn_handle (
name));
3043 std::string octaveroot;
3045 std::string subtype =
"simple";
3047 if (
name.find_first_of (
'\n') != std::string::npos)
3049 std::size_t pos1 =
name.find_first_of (
'\n');
3050 std::size_t pos2 =
name.find_first_of (
'\n', pos1 + 1);
3051 octaveroot =
name.substr (pos1 + 1, pos2 - pos1 - 1);
3052 fpath =
name.substr (pos2 + 1);
3056 std::size_t pos1 =
name.find (
'@');
3057 if (pos1 != std::string::npos)
3059 if (
name[pos1+1] ==
'<')
3061 std::size_t pos2 =
name.find (
'>', pos1 + 2);
3063 if (pos2 != std::string::npos)
3064 subtype =
name.substr (pos1 + 2, pos2 - pos1 - 2);
3073 if (subtype ==
"simple")
3074 new_rep.reset (
new octave::simple_fcn_handle (
name, fpath, octaveroot));
3075 else if (subtype ==
"scopedfunction")
3076 new_rep.reset (
new octave::scoped_fcn_handle (
name, fpath, octaveroot));
3077 else if (subtype ==
"nested")
3078 new_rep.reset (
new octave::nested_fcn_handle (
name, fpath, octaveroot));
3079 else if (subtype ==
"classsimple")
3080 new_rep.reset (
new octave::class_simple_fcn_handle (
name, fpath, octaveroot));
3086 if (! new_rep->load_binary (is, swap, fmt))
3096 bool save_as_floats)
3098 return m_rep->save_hdf5 (loc_id,
name, save_as_floats);
3104#if defined (HAVE_HDF5)
3106#if defined (HAVE_HDF5_18)
3114#if defined (HAVE_HDF5_18)
3122 H5Gclose (group_hid);
3129 if (type_class_hid != H5T_STRING)
3131 H5Tclose (type_hid);
3132 H5Dclose (data_hid);
3133 H5Gclose (group_hid);
3138 hsize_t rank = H5Sget_simple_extent_ndims (space_hid);
3142 H5Sclose (space_hid);
3143 H5Tclose (type_hid);
3144 H5Dclose (data_hid);
3145 H5Gclose (group_hid);
3149 int slen = H5Tget_size (type_hid);
3152 H5Sclose (space_hid);
3153 H5Tclose (type_hid);
3154 H5Dclose (data_hid);
3155 H5Gclose (group_hid);
3163 H5Tset_size (st_id, slen);
3170 H5Sclose (space_hid);
3171 H5Tclose (type_hid);
3172 H5Dclose (data_hid);
3173 H5Gclose (group_hid);
3177 H5Dclose (data_hid);
3179 std::string
name (nm_tmp);
3181 std::shared_ptr<octave::base_fcn_handle> new_rep;
3188 new_rep.reset (
new octave::anonymous_fcn_handle ());
3196 std::string octaveroot;
3198 std::string subtype =
"simple";
3200 if (
name.find_first_of (
'\n') != std::string::npos)
3202 std::size_t pos1 =
name.find_first_of (
'\n');
3203 std::size_t pos2 =
name.find_first_of (
'\n', pos1 + 1);
3204 octaveroot =
name.substr (pos1 + 1, pos2 - pos1 - 1);
3205 fpath =
name.substr (pos2 + 1);
3209 std::size_t pos1 =
name.find (
'@');
3210 if (pos1 != std::string::npos)
3212 if (
name[pos1+1] ==
'<')
3214 std::size_t pos2 =
name.find (
'>', pos1 + 2);
3216 if (pos2 != std::string::npos)
3217 subtype =
name.substr (pos1 + 2, pos2 - pos1 - 2);
3226 if (subtype ==
"simple")
3227 new_rep.reset (
new octave::simple_fcn_handle (
name, fpath, octaveroot));
3228 else if (subtype ==
"scopedfunction")
3229 new_rep.reset (
new octave::scoped_fcn_handle (
name, fpath, octaveroot));
3230 else if (subtype ==
"nested")
3231 new_rep.reset (
new octave::nested_fcn_handle (
name, fpath, octaveroot));
3232 else if (subtype ==
"classsimple")
3233 new_rep.reset (
new octave::class_simple_fcn_handle (
name, fpath, octaveroot));
3236 bool status =
false;
3238 if (new_rep && new_rep->load_hdf5 (group_hid, space_hid, type_hid))
3246 H5Tclose (type_hid);
3247 H5Sclose (space_hid);
3248 H5Gclose (group_hid);
3254 octave_unused_parameter (loc_id);
3255 octave_unused_parameter (name_arg);
3378 *
dynamic_cast<octave::internal_fcn_handle *
> (fh2.
get_rep ()));
3381 *
dynamic_cast<octave::simple_fcn_handle *
> (fh2.
get_rep ()));
3384 *
dynamic_cast<octave::scoped_fcn_handle *
> (fh2.
get_rep ()));
3387 *
dynamic_cast<octave::nested_fcn_handle *
> (fh2.
get_rep ()));
3389 return is_equal_to (*
dynamic_cast<octave::class_simple_fcn_handle *
> (fh1.
get_rep ()),
3390 *
dynamic_cast<octave::class_simple_fcn_handle *
> (fh2.
get_rep ()));
3393 *
dynamic_cast<octave::anonymous_fcn_handle *
> (fh2.
get_rep ()));
3398OCTAVE_NAMESPACE_BEGIN
3410DEFUN (functions, args, ,
3461 if (args.length () != 1)
3464 octave_fcn_handle *fh = args(0).xfcn_handle_value (
"functions: FCN_HANDLE argument must be a function handle object");
3469DEFUN (func2str, args, ,
3477 if (args.length () != 1)
3480 octave_fcn_handle *fh = args(0).xfcn_handle_value (
"func2str: FCN_HANDLE argument must be a function handle object");
3483 error (
"func2str: FCN_HANDLE must be a valid function handle");
3487 std::string fh_nm = fh->
fcn_name ();
3491 std::ostringstream buf;
3495 retval = buf.str ();
3514 int nargin = args.length ();
3516 if (nargin < 1 || nargin > 2)
3520 = args(0).xstring_value (
"str2func: FCN_NAME must be a string");
3523 error (
"str2func: invalid function name");
3540 octave_value afh = interp.eval_string (nm,
true, parse_status);
3542 if (parse_status == 0)
3549 "str2func: second argument ignored");
3591DEFUN (is_function_handle, args, ,
3598 if (args.length () != 1)
3601 return ovl (args(0).is_function_handle ());
void swap_bytes< 4 >(void *ptr)
octave_idx_type numel(void) const
Number of elements in the array.
octave_value make_weak_anonymous_handle(void) const
anonymous_fcn_handle(const anonymous_fcn_handle &)=default
octave_value workspace(void) const
anonymous_fcn_handle * clone(void) const
friend bool is_equal_to(const anonymous_fcn_handle &fh1, const anonymous_fcn_handle &fh2)
std::shared_ptr< stack_frame > stack_context(void) const
std::shared_ptr< stack_frame > m_stack_context
octave_value_list call(int nargout, const octave_value_list &args)
anonymous_fcn_handle(const std::string &name="")
~anonymous_fcn_handle(void)=default
bool load_hdf5(octave_hdf5_id &group_hid, octave_hdf5_id &space_hid, octave_hdf5_id &type_hid)
octave_user_function * user_function_value(bool=false)
void print_raw(std::ostream &, bool pr_as_read_syntax, int current_print_indent_level) const
bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
bool load_ascii(std::istream &is)
bool save_ascii(std::ostream &os)
octave_scalar_map info(void)
std::string type(void) const
bool load_binary(std::istream &is, bool swap, mach_info::float_format fmt)
bool parse(const std::string &fcn_text)
base_anonymous_fcn_handle(const octave_value &fcn, const stack_frame::local_vars_map &local_vars)
virtual octave_value workspace(void) const =0
octave_value fcn_val(void)
bool save_binary(std::ostream &os, bool save_as_floats)
stack_frame::local_vars_map m_local_vars
static const std::string anonymous
base_anonymous_fcn_handle(const std::string &name="")
bool is_anonymous(void) const
bool print_as_scalar(void) const
base_anonymous_fcn_handle(const base_anonymous_fcn_handle &)=default
octave_function * function_value(bool=false)
~base_anonymous_fcn_handle(void)=default
virtual bool save_binary(std::ostream &os, bool save_as_floats)
virtual bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
virtual octave_value make_weak_anonymous_handle(void) const
void unimplemented(const char *op, const char *fmt) const
std::string fcn_name(void) const
virtual bool save_ascii(std::ostream &os)
virtual std::string type(void) const =0
void warn_save(const char *file_type) const
virtual bool load_binary(std::istream &is, bool swap, mach_info::float_format fmt)
virtual octave_value make_weak_nested_handle(void) const
virtual bool load_hdf5(octave_hdf5_id &group_hid, octave_hdf5_id &space_hid, octave_hdf5_id &type_hid)
virtual octave_value_list call(int nargout, const octave_value_list &args)=0
void warn_load(const char *file_type) const
virtual bool is_nested(void) const
virtual bool load_ascii(std::istream &is)
octave_value_list subsref(const std::string &type, const std::list< octave_value_list > &idx, int nargout)
std::string file(void) const
octave_value convert_to_str_internal(bool pad, bool force, char type) const
virtual void print_raw(std::ostream &, bool, int) const
octave_function * function_value(bool=false)
void print_raw(std::ostream &, bool pr_as_read_syntax, int current_print_indent_level) const
octave_scalar_map info(void)
bool load_binary(std::istream &is, bool swap, mach_info::float_format fmt)
base_nested_fcn_handle(const std::string &name="", const std::string &file="", const std::string &="")
bool save_binary(std::ostream &os, bool save_as_floats)
std::string type(void) const
bool is_nested(void) const
bool save_ascii(std::ostream &os)
bool load_hdf5(octave_hdf5_id &group_hid, octave_hdf5_id &space_hid, octave_hdf5_id &type_hid)
base_nested_fcn_handle(const octave_value &fcn, const std::string &name)
octave_user_function * user_function_value(bool=false)
virtual octave_value workspace(void) const =0
bool load_ascii(std::istream &is)
bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
octave_value fcn_val(void)
octave_user_function * user_function_value(bool=false)
octave_value_list call(int nargout, const octave_value_list &args)
std::string type(void) const
friend bool is_equal_to(const class_simple_fcn_handle &fh1, const class_simple_fcn_handle &fh2)
bool is_class_simple(void) const
bool load_binary(std::istream &is, bool swap, mach_info::float_format fmt)
std::string dispatch_class(void) const
octave_function * function_value(bool=false)
~class_simple_fcn_handle(void)=default
std::string m_dispatch_class
class_simple_fcn_handle * clone(void) const
bool save_binary(std::ostream &os, bool save_as_floats)
class_simple_fcn_handle(const std::string &name, const std::string &file, const std::string &)
bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
class_simple_fcn_handle(const class_simple_fcn_handle &)=default
void print_raw(std::ostream &, bool pr_as_read_syntax, int current_print_indent_level) const
octave_scalar_map info(void)
bool save_ascii(std::ostream &os)
bool load_hdf5(octave_hdf5_id &group_hid, octave_hdf5_id &space_hid, octave_hdf5_id &type_hid)
octave_value fcn_val(void)
bool load_ascii(std::istream &is)
Vector representing the dimensions (size) of an Array.
octave_value_list call(int nargout, const octave_value_list &args)
internal_fcn_handle * clone(void) const
~internal_fcn_handle(void)=default
internal_fcn_handle(const octave_value &fcn)
octave_user_function * user_function_value(bool=false)
bool is_internal(void) const
internal_fcn_handle(const internal_fcn_handle &)=default
octave_scalar_map info(void)
octave_value fcn_val(void)
friend bool is_equal_to(const internal_fcn_handle &fh1, const internal_fcn_handle &fh2)
octave_function * function_value(bool=false)
std::string type(void) const
octave_value varval(const std::string &name) const
tree_evaluator & get_evaluator(void)
octave_value_list eval_string(const std::string &eval_str, bool silent, int &parse_status, int nargout)
symbol_table & get_symbol_table(void)
octave_value_list feval(const char *name, const octave_value_list &args=octave_value_list(), int nargout=0)
Evaluate an Octave function (built-in or interpreted) and return the list of result values.
~invalid_fcn_handle(void)=default
octave_value_list call(int nargout, const octave_value_list &args)
std::string type(void) const
invalid_fcn_handle(const invalid_fcn_handle &)=default
invalid_fcn_handle * clone(void) const
friend bool is_equal_to(const nested_fcn_handle &fh1, const nested_fcn_handle &fh2)
nested_fcn_handle(const std::string &name="", const std::string &file="", const std::string &octaveroot="")
nested_fcn_handle(const octave_value &fcn, const std::string &name, const std::shared_ptr< stack_frame > &stack_context)
bool is_nested(const std::shared_ptr< stack_frame > &frame) const
octave_value_list call(int nargout, const octave_value_list &args)
octave_value workspace(void) const
nested_fcn_handle * clone(void) const
std::shared_ptr< stack_frame > stack_context(void) const
std::shared_ptr< stack_frame > m_stack_context
octave_value make_weak_nested_handle(void) const
nested_fcn_handle(const nested_fcn_handle &)=default
~nested_fcn_handle(void)=default
std::map< std::string, octave_value > local_vars_map
void cache_name(const std::string &name)
int current_print_indent_level(void) const
OCTINTERP_API void newline(std::ostream &os) const
OCTINTERP_API void warn_load(const char *type) const
bool load_ascii(std::istream &is)
Array< std::string > cellstr_value(void) const
bool load_binary(std::istream &is, bool swap, octave::mach_info::float_format fmt)
bool iscellstr(void) const
static const std::string anonymous
std::string fcn_name(void) const
void print_raw(std::ostream &os, bool pr_as_read_syntax=false) const
octave_scalar_map info(void)
bool is_simple(void) const
std::shared_ptr< octave::base_fcn_handle > m_rep
bool load_hdf5(octave_hdf5_id loc_id, const char *name)
bool is_internal(void) const
bool load_ascii(std::istream &is)
bool is_class_simple(void) const
octave_value fcn_val(void)
bool is_anonymous(void) const
dim_vector dims(void) const
bool is_scoped(void) const
bool save_binary(std::ostream &os, bool save_as_floats)
bool save_ascii(std::ostream &os)
bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
bool is_nested(void) const
octave::base_fcn_handle * get_rep(void) const
bool load_binary(std::istream &is, bool swap, octave::mach_info::float_format fmt)
void print(std::ostream &os, bool pr_as_read_syntax=false)
std::string dispatch_class(void) const
virtual std::string fcn_file_name(void) const
bool is_class_method(const std::string &cname="") const
void setfield(const std::string &key, const octave_value &val)
void assign(const std::string &k, const octave_value &val)
std::string fcn_file_name(void) const
octave::symbol_scope scope(void)
octave_value_list execute(octave::tree_evaluator &tw, int nargout=0, const octave_value_list &args=octave_value_list())
octave_value find_subfunction(const std::string &subfuns) const
octave_idx_type length(void) const
octave_value_list & prepend(const octave_value &val)
bool is_function(void) const
bool is_classdef_object(void) const
bool is_package(void) const
octave_value subsref(const std::string &type, const std::list< octave_value_list > &idx)
OCTINTERP_API octave_function * function_value(bool silent=false) const
OCTINTERP_API octave_fcn_handle * fcn_handle_value(bool silent=false) const
OCTINTERP_API octave_user_function * user_function_value(bool silent=false) const
bool is_cs_list(void) const
bool is_copy_of(const octave_value &val) const
bool save_binary(std::ostream &os, bool save_as_floats)
bool is_defined(void) const
bool save_ascii(std::ostream &os)
Cell cell_value(void) const
bool is_classdef_meta(void) const
bool is_undefined(void) const
friend bool is_equal_to(const scoped_fcn_handle &fh1, const scoped_fcn_handle &fh2)
void print_raw(std::ostream &, bool pr_as_read_syntax, int current_print_indent_level) const
bool save_binary(std::ostream &os, bool save_as_floats)
scoped_fcn_handle(const scoped_fcn_handle &)=default
~scoped_fcn_handle(void)=default
scoped_fcn_handle * clone(void) const
bool load_ascii(std::istream &is)
octave_value_list call(int nargout, const octave_value_list &args)
bool load_binary(std::istream &is, bool swap, mach_info::float_format fmt)
octave_value fcn_val(void)
std::string type(void) const
octave_function * function_value(bool=false)
bool load_hdf5(octave_hdf5_id &group_hid, octave_hdf5_id &space_hid, octave_hdf5_id &type_hid)
octave_scalar_map info(void)
scoped_fcn_handle(const std::string &name="", const std::string &file="", const std::string &="")
bool save_hdf5(octave_hdf5_id loc_id, const char *name, bool save_as_floats)
bool is_scoped(void) const
octave_user_function * user_function_value(bool=false)
bool save_ascii(std::ostream &os)
std::list< std::string > m_parentage
friend bool is_equal_to(const simple_fcn_handle &fh1, const simple_fcn_handle &fh2)
std::string type(void) const
octave_function * function_value(bool)
bool is_simple(void) const
octave_user_function * user_function_value(bool)
simple_fcn_handle(const std::string &name="", const std::string &file="", const std::string &="")
simple_fcn_handle(const octave_value &fcn, const std::string &name)
void print_raw(std::ostream &os, bool pr_as_read_syntax, int current_print_indent_level) const
simple_fcn_handle * clone(void) const
bool save_binary(std::ostream &os, bool save_as_floats)
bool save_hdf5(octave_hdf5_id loc_hid, const char *name, bool save_as_floats)
octave_value fcn_val(void)
bool save_ascii(std::ostream &os)
bool load_binary(std::istream &is, bool swap, mach_info::float_format fmt)
bool load_hdf5(octave_hdf5_id &group_hid, octave_hdf5_id &space_hid, octave_hdf5_id &type_hid)
simple_fcn_handle(const simple_fcn_handle &)=default
octave_value_list call(int nargout, const octave_value_list &args)
bool load_ascii(std::istream &is)
octave_scalar_map info(void)
~simple_fcn_handle(void)=default
octave_value find_private_function(const std::string &dir_name, const std::string &name)
octave_value find_function(const std::string &name, const symbol_scope &search_scope=symbol_scope())
octave_value find_user_function(const std::string &name)
void set_dispatch_class(const std::string &class_name)
void pop_stack_frame(void)
void push_dummy_scope(const std::string &name)
octave_value make_fcn_handle(const std::string &nm)
void push_stack_frame(const symbol_scope &scope)
weak_anonymous_fcn_handle(const anonymous_fcn_handle &afh)
weak_anonymous_fcn_handle * clone(void) const
bool is_weak_anonymous(void) const
std::weak_ptr< stack_frame > m_stack_context
octave_value workspace(void) const
octave_value_list call(int nargout, const octave_value_list &args)
friend bool is_equal_to(const weak_anonymous_fcn_handle &fh1, const weak_anonymous_fcn_handle &fh2)
~weak_anonymous_fcn_handle(void)=default
weak_anonymous_fcn_handle(const weak_anonymous_fcn_handle &)=default
weak_nested_fcn_handle(const nested_fcn_handle &nfh)
std::weak_ptr< stack_frame > m_stack_context
octave_value workspace(void) const
bool is_weak_nested(void) const
friend bool is_equal_to(const weak_nested_fcn_handle &fh1, const weak_nested_fcn_handle &fh2)
weak_nested_fcn_handle(const weak_nested_fcn_handle &)=default
~weak_nested_fcn_handle(void)=default
weak_nested_fcn_handle * clone(void) const
octave_value_list call(int nargout, const octave_value_list &args)
const octave_hdf5_id octave_H5P_DEFAULT
const octave_hdf5_id octave_H5E_DEFAULT
const octave_hdf5_id octave_H5S_ALL
OCTINTERP_API void print_usage(void)
#define DEFMETHOD(name, interp_name, args_name, nargout_name, doc)
Macro to define a builtin method.
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
void warning(const char *fmt,...)
void warning_with_id(const char *id, const char *fmt,...)
void error(const char *fmt,...)
#define panic_impossible()
F77_RET_T const F77_DBLE const F77_DBLE * f
std::string read_until_newline(std::istream &is, bool keep_newline)
void skip_preceeding_newline(std::istream &is)
octave_hdf5_err hdf5_h5g_iterate(octave_hdf5_id loc_id, const char *name, int *idx, void *operator_data)
bool add_hdf5_data(octave_hdf5_id loc_id, const octave_value &tc, const std::string &name, const std::string &doc, bool mark_global, bool save_as_floats)
std::string read_binary_data(std::istream &is, bool swap, octave::mach_info::float_format fmt, const std::string &filename, bool &global, octave_value &tc, std::string &doc)
bool save_binary_data(std::ostream &os, const octave_value &tc, const std::string &name, const std::string &doc, bool mark_global, bool save_as_floats)
std::string read_text_data(std::istream &is, const std::string &filename, bool &global, octave_value &tc, octave_idx_type count, const bool do_name_validation)
std::string extract_keyword(std::istream &is, const char *keyword, const bool next_only)
bool save_text_data(std::ostream &os, const octave_value &val_arg, const std::string &name, bool mark_global, int precision)
std::string octave_exec_home(void)
std::string dirname(const std::string &path)
interpreter & __get_interpreter__(const std::string &who)
tree_evaluator & __get_evaluator__(const std::string &who)
symbol_table & __get_symbol_table__(const std::string &who)
#define OCTAVE_LOCAL_BUFFER(T, buf, size)
return octave_value(v1.char_array_value() . concat(v2.char_array_value(), ra_idx),((a1.is_sq_string()||a2.is_sq_string()) ? '\'' :'"'))
#define DEFINE_OV_TYPEID_FUNCTIONS_AND_DATA(t, n, c)
static void err_invalid_fcn_handle(const std::string &name)
OCTAVE_NAMESPACE_BEGIN octave_value make_fcn_handle(interpreter &interp, const std::string &nm)
bool is_equal_to(const anonymous_fcn_handle &fh1, const anonymous_fcn_handle &fh2)
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.
void octave_print_internal(std::ostream &os, const float_display_format &fmt, bool d, bool pr_as_read_syntax)
static std::string dir_sep_chars