]> www.ginac.de Git - ginac.git/blobdiff - ginac/function.cppy
[PATCH] Check number of parameters when reading function from archive.
[ginac.git] / ginac / function.cppy
index 7df57168996cd42a6518cde4b0505569cb1c989e..6739eb9ebafdf6ebf8108e4b3a30125f0493ef78 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-2016 Johannes Gutenberg University Mainz, Germany
+ *  GiNaC Copyright (C) 1999-2020 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"));
 }
@@ -448,7 +450,7 @@ ex function::evalf() const
 }
 
 /**
- *  This method is defined to be in line with behaviour of function::return_type()
+ *  This method is defined to be in line with behavior of function::return_type()
  */
 ex function::eval_ncmul(const exvector & v) const
 {
@@ -764,7 +766,7 @@ ex function::expl_derivative(const symbol & s) const // explicit differentiation
                        // end of generated lines
                }
        }
-       // There is no fallback for explicit deriviative.
+       // There is no fallback for explicit derivative.
        throw(std::logic_error("function::expl_derivative(): explicit derivation is called, but no such function defined"));
 }