re-done pcall without blocks

master
Daniel Kolesa 2016-09-10 20:43:58 +02:00
parent 6d2d8dda73
commit dc5294bac3
4 changed files with 23 additions and 17 deletions

View File

@ -693,7 +693,7 @@ namespace util {
auto rt = ostd::format(
writer,
((nd->index == 1) && st.gap())
? " ..%d) %s\n" : " %d) %s\n",
? " ..%d) %s" : " %d) %s",
nd->index, nd->id->get_name()
);
if (rt > 0) {
@ -702,6 +702,9 @@ namespace util {
return ret;
}
nd = nd->next;
if (nd) {
ret += writer.put('\n');
}
}
return ret;
}

View File

@ -96,7 +96,7 @@ CsStackState cs_save_stack(CsState &cs) {
nd->next = nullptr;
}
}
return CsStackState(ret, total != dalias->get_value());
return CsStackState(ret, total > dalias->get_value());
}
static void bcode_ref(ostd::Uint32 *code) {

View File

@ -1080,30 +1080,32 @@ void cs_init_lib_base(CsState &cs) {
cs.error(args[0].get_strr());
});
cs.new_command("pcall", "erre", [&cs](CsValueRange args, CsValue &ret) {
CsStackedValue cst, cret;
if (
!cst.set_alias(args[1].get_ident()) ||
!cret.set_alias(args[2].get_ident())
) {
cs.new_command("pcall", "err", [&cs](CsValueRange args, CsValue &ret) {
CsAlias *cret = args[1].get_ident()->get_alias(),
*css = args[2].get_ident()->get_alias();
if (!cret || !css) {
ret.set_int(0);
return;
}
CsString errmsg;
CsValue result;
CsValue result, tback;
CsStackState stack;
bool rc = cs.pcall([&cs, &args, &result]() {
cs.run(args[0].get_code(), result);
}, &errmsg);
}, &errmsg, &stack);
ret.set_int(rc);
cst.set_int(rc);
cst.push();
if (!rc) {
cret.set_str(ostd::move(errmsg));
} else {
cret = ostd::move(result);
result.set_str(ostd::move(errmsg));
if (stack.get()) {
auto app = ostd::appender<CsString>();
cscript::util::print_stack(app, stack);
tback.set_str(ostd::move(app.get()));
}
}
CsAliasInternal::set_alias(cret, cs, result);
if (css->get_index() != DummyIdx) {
CsAliasInternal::set_alias(css, cs, tback);
}
cret.push();
cs.run(args[3].get_code());
});
cs.new_command("?", "tTT", [](CsValueRange args, CsValue &res) {

View File

@ -218,6 +218,7 @@ static bool do_call(CsState &cs, ostd::ConstCharRange line, bool file = false) {
}
cs.get_out().writeln(col.empty() ? "stdin: " : "stdin:", err);
cscript::util::print_stack(cs.get_out().iter(), st);
cs.get_out().write('\n');
return false;
}
signal(SIGINT, SIG_DFL);