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