]> www.ginac.de Git - ginac.git/blobdiff - ginac/function.cppy
[BUGFIX] Fix crash in parser.
[ginac.git] / ginac / function.cppy
index f8138548adb236d169f92faddf6991f64ac81403..115845e156942a924d51794f3c8b0ad6a5db006d 100644 (file)
@@ -7,7 +7,7 @@
  *  Please do not modify it directly, edit function.cppy instead!
  *  function.py options: maxargs=@maxargs@
  *
- *  GiNaC Copyright (C) 1999-2017 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2024 Johannes Gutenberg University Mainz, Germany
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
@@ -75,7 +75,7 @@ function_options::~function_options()
 
 void function_options::initialize()
 {
-       set_name("unnamed_function", "\\\\mbox{unnamed}");
+       set_name("unnamed_function", "\\mbox{unnamed}");
        nparams = 0;
        eval_f = evalf_f = real_part_f = imag_part_f = conjugate_f = expand_f
                = derivative_f = expl_derivative_f = power_f = series_f = nullptr;
@@ -104,7 +104,7 @@ function_options & function_options::set_name(std::string const & n,
 {
        name = n;
        if (tn==std::string())
-               TeX_name = "\\\\mbox{"+name+"}";
+               TeX_name = "\\mbox{"+name+"}";
        else
                TeX_name = tn;
        return *this;
@@ -259,18 +259,20 @@ function::function(unsigned ser, exvector && v)
 void function::read_archive(const archive_node& n, lst& sym_lst)
 {
        inherited::read_archive(n, sym_lst);
-       // Find serial number by function name
+       // Find serial number by function name and number of parameters
+       unsigned np = seq.size();
        std::string s;
        if (n.find_string("name", s)) {
                unsigned int ser = 0;
                for (auto & it : registered_functions()) {
-                       if (s == it.name) {
+                       if (s == it.name && np == registered_functions()[ser].nparams) {
                                serial = ser;
                                return;
                        }
                        ++ser;
                }
-               throw (std::runtime_error("unknown function '" + s + "' in archive"));
+               throw (std::runtime_error("unknown function '" + s +
+                                         "' with " + std::to_string(np) + " parameters in archive"));
        } else
                throw (std::runtime_error("unnamed function in archive"));
 }
@@ -435,7 +437,7 @@ ex function::evalf() const
        }
        current_serial = serial;
        if (opt.evalf_use_exvector_args)
-               return ((evalf_funcp_exvector)(opt.evalf_f))(seq);
+               return ((evalf_funcp_exvector)(opt.evalf_f))(eseq);
        switch (opt.nparams) {
                // the following lines have been generated for max. @maxargs@ parameters
 +++ for N in range(1, maxargs + 1):