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

View File

@ -96,7 +96,7 @@ CsStackState cs_save_stack(CsState &cs) {
nd->next = nullptr; nd->next = nullptr;
} }
} }
return CsStackState(ret, total != dalias->get_value()); return CsStackState(ret, total > dalias->get_value());
} }
static void bcode_ref(ostd::Uint32 *code) { 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.error(args[0].get_strr());
}); });
cs.new_command("pcall", "erre", [&cs](CsValueRange args, CsValue &ret) { cs.new_command("pcall", "err", [&cs](CsValueRange args, CsValue &ret) {
CsStackedValue cst, cret; CsAlias *cret = args[1].get_ident()->get_alias(),
if ( *css = args[2].get_ident()->get_alias();
!cst.set_alias(args[1].get_ident()) || if (!cret || !css) {
!cret.set_alias(args[2].get_ident())
) {
ret.set_int(0); ret.set_int(0);
return; return;
} }
CsString errmsg; CsString errmsg;
CsValue result; CsValue result, tback;
CsStackState stack;
bool rc = cs.pcall([&cs, &args, &result]() { bool rc = cs.pcall([&cs, &args, &result]() {
cs.run(args[0].get_code(), result); cs.run(args[0].get_code(), result);
}, &errmsg); }, &errmsg, &stack);
ret.set_int(rc); ret.set_int(rc);
cst.set_int(rc);
cst.push();
if (!rc) { if (!rc) {
cret.set_str(ostd::move(errmsg)); result.set_str(ostd::move(errmsg));
} else { if (stack.get()) {
cret = ostd::move(result); 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) { 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); cs.get_out().writeln(col.empty() ? "stdin: " : "stdin:", err);
cscript::util::print_stack(cs.get_out().iter(), st); cscript::util::print_stack(cs.get_out().iter(), st);
cs.get_out().write('\n');
return false; return false;
} }
signal(SIGINT, SIG_DFL); signal(SIGINT, SIG_DFL);