#include "efunccode.h"
#include "eparser.h"

evar efuncCode::call(const evararray &argsarr)
{
  estrhashof<evar> env;
  env += getParser().objects;
  env.add("args",evar(argsarr));

  int i;
  estrarray argnames(args);
  for (i=0; i<argnames.size(); ++i){
    if (i>=argsarr.size()) break;
    env.add(argnames[i],argsarr[i]);
  }
  if (argsarr.size()>argnames.size() && argsarr[argsarr.size()-1].getTypeid()==typeid(evarhash)){ // TODO: fix this hack to pass options as environment variables
    evarhash& vhash(argsarr[argsarr.size()-1].get<evarhash>());
    for (i=0; i<vhash.size(); ++i)
      env.add(vhash.keys(i),vhash.values(i));
  }

  ecodeParser cparser;
  ecodeAtomBlock *catom=new ecodeAtomBlock;
  catom->parse(cparser,code);
  stopExecutionStruct stopExecution;
  int loopControl=0;
  evar tmpres(catom->interpret(env,stopExecution,loopControl)); // must create a temporary catom to avoid collisions when doing multithreaded calls to the same function code
  delete catom;
  return(tmpres);
}
void efuncCode::updateInfo(efunc *f)
{
  // TODO: setup info on variables
}


