forked from OctaForge/libcubescript
re-done pcall without blocks
parent
6d2d8dda73
commit
dc5294bac3
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue