X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Ffunction.pl;h=e2b4374f4e745701a82a87038ce7a3b23d879def;hb=ed62b717aa0383e08b4a2642cd923498898e1a18;hp=6493042b7753d5f0583aad1805faab91fe58d33b;hpb=afdd7fa8c6c0a587f7c80789198551383e8beb7b;p=ginac.git diff --git a/ginac/function.pl b/ginac/function.pl index 6493042b..e2b4374f 100755 --- a/ginac/function.pl +++ b/ginac/function.pl @@ -44,7 +44,7 @@ END_OF_DECLARE_FUNCTION_MACRO_NAMESPACE $declare_function_macro_no_namespace=generate( <<'END_OF_DECLARE_FUNCTION_MACRO_NO_NAMESPACE','ex const & p${N}','p${N}'); #define DECLARE_FUNCTION_${N}P(NAME) \\ -extern unsigned function_index_##NAME; \\ +extern const unsigned function_index_##NAME; \\ inline function NAME(${SEQ1}) { \\ return function(function_index_##NAME, ${SEQ2}); \\ } @@ -110,7 +110,12 @@ END_OF_DIFF_SWITCH_STATEMENT $series_switch_statement=generate( <<'END_OF_SERIES_SWITCH_STATEMENT','seq[${N}-1]',''); case ${N}: - return ((series_funcp_${N})(registered_functions()[serial].s))(${SEQ1},s,point,order); + try { + res = ((series_funcp_${N})(registered_functions()[serial].s))(${SEQ1},s,point,order); + } catch (do_taylor) { + res = basic::series(s, point, order); + } + return res; break; END_OF_SERIES_SWITCH_STATEMENT @@ -136,7 +141,7 @@ $interface=<::const_iterator i = registered_functions().begin(), iend = registered_functions().end(); + while (i != iend) { + if (s == i->name) { + serial = ser; + return; + } + i++; ser++; + } + throw (std::runtime_error("unknown function '" + s + "' in archive")); + } else + throw (std::runtime_error("unnamed function in archive")); +} + +/** Unarchive the object. */ +ex function::unarchive(const archive_node &n, const lst &sym_lst) +{ + return (new function(n, sym_lst))->setflag(status_flags::dynallocated); +} + +/** Archive the object. */ +void function::archive(archive_node &n) const +{ + inherited::archive(n); + GINAC_ASSERT(serial < registered_functions().size()); + n.add_string("name", registered_functions()[serial].name); +} + ////////// // functions overriding virtual functions from bases classes ////////// @@ -513,7 +564,7 @@ void function::printtree(ostream & os, unsigned indent) const << ", hash=" << hashvalue << " (0x" << hex << hashvalue << dec << ")" << ", flags=" << flags << ", nops=" << nops() << endl; - for (int i=0; i