From 8cf4fedac27e2b7eb4744d62265d680abd6a375a Mon Sep 17 00:00:00 2001
From: Houtan Bastani <houtan@dynare.org>
Date: Wed, 11 Jul 2018 15:57:51 +0200
Subject: [PATCH] macroprocessor: change type of function arguments

---
 src/macro/MacroBison.yy  |  8 ++++----
 src/macro/MacroDriver.cc | 12 ++++++------
 src/macro/MacroDriver.hh |  4 ++--
 src/macro/MacroValue.cc  |  5 ++---
 src/macro/MacroValue.hh  |  6 +++---
 5 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/src/macro/MacroBison.yy b/src/macro/MacroBison.yy
index aa07d750..c650b947 100644
--- a/src/macro/MacroBison.yy
+++ b/src/macro/MacroBison.yy
@@ -50,7 +50,7 @@ class MacroDriver;
   string *string_val;
   int int_val;
   const MacroValue *mv;
-  vector<string *> *vector_string_p_val;
+  vector<string> *vector_string_val;
 };
 
 %code {
@@ -90,7 +90,7 @@ class MacroDriver;
 %left UMINUS UPLUS EXCLAMATION
 %left LBRACKET
 
-%type <vector_string_p_val> func_args
+%type <vector_string_val> func_args
 %type <mv> expr array_expr
 %%
 
@@ -136,9 +136,9 @@ statement : expr
           ;
 
 func_args : NAME
-            { $$ = new vector<string *>(); $$->push_back($1); }
+            { $$ = new vector<string>(); $$->push_back(*$1); delete $1; }
           | func_args COMMA NAME
-            { $$->push_back($3); }
+            { $$->push_back(*$3); delete $3; }
           ;
 
 expr : INTEGER
diff --git a/src/macro/MacroDriver.cc b/src/macro/MacroDriver.cc
index ed70e556..9efff6fd 100644
--- a/src/macro/MacroDriver.cc
+++ b/src/macro/MacroDriver.cc
@@ -141,13 +141,13 @@ MacroDriver::replace_vars_in_str(const string &s) const
 }
 
 void
-MacroDriver::set_string_function(const string &name, vector<string *> &args, const MacroValue *value)
+MacroDriver::set_string_function(const string &name, vector<string> &args, const MacroValue *value)
 {
   auto *smv = dynamic_cast<const StringMV *>(value);
   if (!smv)
     throw MacroValue::TypeError("The definition of a macro function must evaluate to a string");
 
-   env[name] = new FuncMV(*this, args, *(const_cast<StringMV *>(smv)));
+  env[name] = new FuncMV(*this, args, *(const_cast<StringMV *>(smv)));
 }
 
 const StringMV *
@@ -161,7 +161,7 @@ MacroDriver::eval_string_function(const string &name, const MacroValue *args)
   if (!fmv)
     throw MacroValue::TypeError("You are using " + name + " as if it were a macro function");
 
-  vector<string *> func_args = fmv->get_args();
+  vector<string> func_args = fmv->get_args();
   if (func_args.size() != (size_t)dynamic_cast<const IntMV *>(args->length())->get_int_value())
     {
       cerr << "Macroprocessor: The evaluation of: " << name << " could not be completed" << endl
@@ -173,7 +173,7 @@ MacroDriver::eval_string_function(const string &name, const MacroValue *args)
   int i = 0;
   env_t func_env_map;
   for (const auto it : func_args)
-    func_env_map[*it] = args->at(i++);
+    func_env_map[it] = args->at(i++);
 
   func_env.push_back(func_env_map);
   StringMV *smv = new StringMV(*this, replace_vars_in_str(fmv->toString()));
@@ -182,11 +182,11 @@ MacroDriver::eval_string_function(const string &name, const MacroValue *args)
 }
 
 void
-MacroDriver::push_args_into_func_env(const vector<string *> &args)
+MacroDriver::push_args_into_func_env(const vector<string> &args)
 {
   env_t func_env_map;
   for (const auto it : args)
-    func_env_map[*it] = NULL;
+    func_env_map[it] = NULL;
   func_env.push_back(func_env_map);
 }
 
diff --git a/src/macro/MacroDriver.hh b/src/macro/MacroDriver.hh
index 43f468fd..8c659fd1 100644
--- a/src/macro/MacroDriver.hh
+++ b/src/macro/MacroDriver.hh
@@ -221,10 +221,10 @@ public:
   string replace_vars_in_str(const string &s) const;
 
   //! Set a function with arguments
-  void set_string_function(const string &name, vector<string *> &args, const MacroValue *value);
+  void set_string_function(const string &name, vector<string> &args, const MacroValue *value);
 
   //! Push function arguments onto func_env stack setting equal to NULL
-  void push_args_into_func_env(const vector<string *> &args);
+  void push_args_into_func_env(const vector<string> &args);
 
   //! Remove last entry in func_env vector
   void pop_func_env();
diff --git a/src/macro/MacroValue.cc b/src/macro/MacroValue.cc
index 7817d07e..aee8f55e 100644
--- a/src/macro/MacroValue.cc
+++ b/src/macro/MacroValue.cc
@@ -490,7 +490,7 @@ ArrayMV<string>::print() const
   return ss.str();
 }
 
-FuncMV::FuncMV(MacroDriver &driver, vector<string *> &args_arg, StringMV &value_arg) :
+FuncMV::FuncMV(MacroDriver &driver, vector<string> &args_arg, StringMV &value_arg) :
   MacroValue(driver), args(args_arg), value(value_arg)
 {
 }
@@ -553,7 +553,7 @@ FuncMV::print() const
     {
       if (comma_flag)
           retval += ", ";
-      retval += *it;
+      retval += it;
       comma_flag = true;
     }
   retval += ")";
@@ -563,7 +563,6 @@ FuncMV::print() const
 const MacroValue *
 FuncMV::toArray() const
 {
-  // COMEBACK
   vector<string> v;
   v.push_back(value.toString());
   return new ArrayMV<string>(driver, v);
diff --git a/src/macro/MacroValue.hh b/src/macro/MacroValue.hh
index 79e93250..176d801f 100644
--- a/src/macro/MacroValue.hh
+++ b/src/macro/MacroValue.hh
@@ -209,10 +209,10 @@ class FuncMV : public MacroValue
   friend class MacroDriver;
 private:
   //! Function args & body
-  const vector<string *> args;
+  const vector<string> args;
   const StringMV &value;
 public:
-  FuncMV(MacroDriver &driver, vector<string *> &args, StringMV &value_arg);
+  FuncMV(MacroDriver &driver, vector<string> &args, StringMV &value_arg);
 
   ~FuncMV() override;
 
@@ -223,7 +223,7 @@ public:
   string toString() const override;
   string print() const override;
   const MacroValue *toArray() const override;
-  inline const vector<string *> &
+  inline const vector<string> &
   get_args() const
   {
     return args;
-- 
GitLab