aboutsummaryrefslogtreecommitdiff
path: root/func.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-18 16:32:09 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2015-06-19 12:49:19 +0900
commit3064f1fcc2deeb63fc030c953bcf8edc821ad64e (patch)
treeaa1fc93037133186baff6009ec3a16255d3bfd8d /func.cc
parentcf0cd68ef4d2b8268ade22418c17e0079e9c85e1 (diff)
downloadkati-3064f1fcc2deeb63fc030c953bcf8edc821ad64e.tar.gz
[C++] Implement call
Diffstat (limited to 'func.cc')
-rw-r--r--func.cc18
1 files changed, 16 insertions, 2 deletions
diff --git a/func.cc b/func.cc
index 3118430..2bb58f4 100644
--- a/func.cc
+++ b/func.cc
@@ -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) {