minor vm cleanups

master
Daniel Kolesa 2021-05-12 03:55:20 +02:00
parent 497502bdb0
commit 775d69cf1c
2 changed files with 9 additions and 57 deletions

View File

@ -173,7 +173,7 @@ void bcode_free_empty(internal_state *cs, empty_block *empty) {
}
bcode *bcode_get_empty(empty_block *empty, std::size_t val) {
return &empty[val].init + 1;
return &empty[val >> BC_INST_RET].init + 1;
}
} /* namespace cubescript */

View File

@ -553,23 +553,11 @@ std::uint32_t *vm_exec(
}
case BC_INST_EMPTY | BC_RET_NULL:
args.emplace_back().set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_NULL)
));
break;
case BC_INST_EMPTY | BC_RET_STRING:
args.emplace_back().set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_STRING)
));
break;
case BC_INST_EMPTY | BC_RET_INT:
args.emplace_back().set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_INT)
));
break;
case BC_INST_EMPTY | BC_RET_FLOAT:
args.emplace_back().set_code(bcode_p::make_ref(
bcode_get_empty(ts.istate->empty, VAL_FLOAT)
bcode_get_empty(ts.istate->empty, op & BC_INST_RET_MASK)
));
break;
@ -650,52 +638,16 @@ std::uint32_t *vm_exec(
force_arg(cs, args.back(), op & BC_INST_RET_MASK);
continue;
case BC_INST_LOOKUP | BC_RET_STRING: {
alias_stack *ast;
alias *a = get_lookup_id(ts, op, ast);
if (!a) {
args.emplace_back().set_string("", cs);
} else {
auto &v = args.emplace_back();
v = ast->node->val_s;
v.force_string(cs);
}
continue;
}
case BC_INST_LOOKUP | BC_RET_INT: {
alias_stack *ast;
alias *a = get_lookup_id(ts, op, ast);
if (!a) {
args.emplace_back().set_integer(0);
} else {
args.emplace_back().set_integer(
ast->node->val_s.get_integer()
);
}
continue;
}
case BC_INST_LOOKUP | BC_RET_FLOAT: {
alias_stack *ast;
alias *a = get_lookup_id(ts, op, ast);
if (!a) {
args.emplace_back().set_float(float_type(0));
} else {
args.emplace_back().set_float(
ast->node->val_s.get_float()
);
}
continue;
}
case BC_INST_LOOKUP | BC_RET_STRING:
case BC_INST_LOOKUP | BC_RET_INT:
case BC_INST_LOOKUP | BC_RET_FLOAT:
case BC_INST_LOOKUP | BC_RET_NULL: {
alias_stack *ast;
alias *a = get_lookup_id(ts, op, ast);
if (!a) {
args.emplace_back().set_none();
} else {
args.emplace_back() = ast->node->val_s.get_plain();
auto &v = args.emplace_back();
if (get_lookup_id(ts, op, ast)) {
v = ast->node->val_s;
}
force_arg(cs, args.back(), op & BC_INST_RET_MASK);
continue;
}