libcubescript/src/cs_vm.hh

59 lines
1.5 KiB
C++
Raw Normal View History

2021-03-23 23:29:32 +01:00
#ifndef LIBCUBESCRIPT_VM_HH
#define LIBCUBESCRIPT_VM_HH
2016-08-12 18:38:43 +02:00
2016-09-07 22:57:28 +02:00
#include "cubescript/cubescript.hh"
2016-08-12 18:38:43 +02:00
2021-03-23 01:11:21 +01:00
#include "cs_std.hh"
#include "cs_ident.hh"
2021-03-24 02:21:27 +01:00
#include "cs_gen.hh"
2021-03-23 23:32:25 +01:00
namespace cubescript {
2016-08-12 18:38:43 +02:00
2021-03-24 02:21:27 +01:00
struct break_exception {
2016-09-14 23:24:13 +02:00
};
2021-03-24 02:21:27 +01:00
struct continue_exception {
2016-08-12 18:38:43 +02:00
};
template<typename F>
2021-03-23 23:29:32 +01:00
static void call_with_args(state &cs, F body) {
2016-09-10 19:54:55 +02:00
if (!cs.p_callstack) {
body();
return;
}
2021-03-24 02:21:27 +01:00
valarray<ident_stack, MAX_ARGUMENTS> argstack{cs};
int argmask1 = cs.p_callstack->usedargs;
for (int i = 0; argmask1; argmask1 >>= 1, ++i) {
if (argmask1 & 1) {
2021-03-23 23:29:32 +01:00
static_cast<alias_impl *>(cs.p_state->identmap[i])->undo_arg(
argstack[i]
);
}
}
2021-03-23 23:29:32 +01:00
ident_link *prevstack = cs.p_callstack->next;
ident_link aliaslink = {
2016-09-15 04:30:37 +02:00
cs.p_callstack->id, cs.p_callstack,
2021-03-24 02:21:27 +01:00
prevstack ? prevstack->usedargs : ((1 << MAX_ARGUMENTS) - 1),
2016-09-15 04:30:37 +02:00
prevstack ? prevstack->argstack : nullptr
};
cs.p_callstack = &aliaslink;
2021-03-23 01:11:21 +01:00
call_with_cleanup(std::move(body), [&]() {
2016-09-15 04:30:37 +02:00
if (prevstack) {
prevstack->usedargs = aliaslink.usedargs;
}
cs.p_callstack = aliaslink.next;
int argmask2 = cs.p_callstack->usedargs;
for (int i = 0; argmask2; argmask2 >>= 1, ++i) {
if (argmask2 & 1) {
2021-03-23 23:29:32 +01:00
static_cast<alias_impl *>(cs.p_state->identmap[i])->redo_arg(
argstack[i]
);
}
}
});
}
2021-03-23 23:32:25 +01:00
} /* namespace cubescript */
2016-08-12 18:38:43 +02:00
2021-03-23 23:29:32 +01:00
#endif /* LIBCUBESCRIPT_VM_HH */