diff options
author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-18 16:32:09 +0900 |
---|---|---|
committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2015-06-19 12:49:19 +0900 |
commit | 3064f1fcc2deeb63fc030c953bcf8edc821ad64e (patch) | |
tree | aa1fc93037133186baff6009ec3a16255d3bfd8d /func.cc | |
parent | cf0cd68ef4d2b8268ade22418c17e0079e9c85e1 (diff) | |
download | kati-3064f1fcc2deeb63fc030c953bcf8edc821ad64e.tar.gz |
[C++] Implement call
Diffstat (limited to 'func.cc')
-rw-r--r-- | func.cc | 18 |
1 files changed, 16 insertions, 2 deletions
@@ -387,8 +387,22 @@ void ShellFunc(const vector<Value*>& args, Evaluator* ev, string* s) { *s += out; } -void CallFunc(const vector<Value*>&, Evaluator*, string*) { - printf("TODO(call)"); +void CallFunc(const vector<Value*>& args, Evaluator* ev, string* s) { + static const char* tmpvar_names[] = { + "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" + }; + + shared_ptr<string> func_name = args[0]->Eval(ev); + Var* func = ev->LookupVar(*func_name); + vector<unique_ptr<SimpleVar>> av; + vector<unique_ptr<ScopedVar>> sv; + for (size_t i = 1; i < args.size(); i++) { + unique_ptr<SimpleVar> s(new SimpleVar(args[i]->Eval(ev), "automatic")); + sv.push_back(move(unique_ptr<ScopedVar>( + new ScopedVar(ev->mutable_vars(), tmpvar_names[i], s.get())))); + av.push_back(move(s)); + } + func->Eval(ev, s); } void ForeachFunc(const vector<Value*>& args, Evaluator* ev, string* s) { |