more vm type handling cleanups
parent
775d69cf1c
commit
a5536d6974
80
src/cs_vm.cc
80
src/cs_vm.cc
|
@ -34,19 +34,13 @@ static inline void pop_alias(thread_state &ts, ident &id) {
|
||||||
static inline void force_arg(state &cs, any_value &v, int type) {
|
static inline void force_arg(state &cs, any_value &v, int type) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case BC_RET_STRING:
|
case BC_RET_STRING:
|
||||||
if (v.type() != value_type::STRING) {
|
v.force_string(cs);
|
||||||
v.force_string(cs);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case BC_RET_INT:
|
case BC_RET_INT:
|
||||||
if (v.type() != value_type::INTEGER) {
|
v.force_integer();
|
||||||
v.force_integer();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case BC_RET_FLOAT:
|
case BC_RET_FLOAT:
|
||||||
if (v.type() != value_type::FLOAT) {
|
v.force_float();
|
||||||
v.force_float();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -266,51 +260,35 @@ std::uint32_t *vm_exec(
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case BC_INST_NULL | BC_RET_NULL:
|
case BC_INST_NULL | BC_RET_NULL:
|
||||||
result.set_none();
|
|
||||||
continue;
|
|
||||||
case BC_INST_NULL | BC_RET_STRING:
|
case BC_INST_NULL | BC_RET_STRING:
|
||||||
result.set_string("", cs);
|
|
||||||
continue;
|
|
||||||
case BC_INST_NULL | BC_RET_INT:
|
case BC_INST_NULL | BC_RET_INT:
|
||||||
result.set_integer(0);
|
|
||||||
continue;
|
|
||||||
case BC_INST_NULL | BC_RET_FLOAT:
|
case BC_INST_NULL | BC_RET_FLOAT:
|
||||||
result.set_float(0.0f);
|
result.set_none();
|
||||||
|
force_arg(cs, result, op & BC_INST_RET_MASK);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case BC_INST_FALSE | BC_RET_STRING:
|
case BC_INST_FALSE | BC_RET_STRING:
|
||||||
result.set_string("0", cs);
|
|
||||||
continue;
|
|
||||||
case BC_INST_FALSE | BC_RET_NULL:
|
case BC_INST_FALSE | BC_RET_NULL:
|
||||||
case BC_INST_FALSE | BC_RET_INT:
|
case BC_INST_FALSE | BC_RET_INT:
|
||||||
result.set_integer(0);
|
|
||||||
continue;
|
|
||||||
case BC_INST_FALSE | BC_RET_FLOAT:
|
case BC_INST_FALSE | BC_RET_FLOAT:
|
||||||
result.set_float(0.0f);
|
result.set_integer(0);
|
||||||
|
force_arg(cs, result, op & BC_INST_RET_MASK);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case BC_INST_TRUE | BC_RET_STRING:
|
case BC_INST_TRUE | BC_RET_STRING:
|
||||||
result.set_string("1", cs);
|
|
||||||
continue;
|
|
||||||
case BC_INST_TRUE | BC_RET_NULL:
|
case BC_INST_TRUE | BC_RET_NULL:
|
||||||
case BC_INST_TRUE | BC_RET_INT:
|
case BC_INST_TRUE | BC_RET_INT:
|
||||||
result.set_integer(1);
|
|
||||||
continue;
|
|
||||||
case BC_INST_TRUE | BC_RET_FLOAT:
|
case BC_INST_TRUE | BC_RET_FLOAT:
|
||||||
result.set_float(1.0f);
|
result.set_integer(1);
|
||||||
|
force_arg(cs, result, op & BC_INST_RET_MASK);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case BC_INST_NOT | BC_RET_STRING:
|
case BC_INST_NOT | BC_RET_STRING:
|
||||||
result.set_string(args.back().get_bool() ? "0" : "1", cs);
|
|
||||||
args.pop_back();
|
|
||||||
continue;
|
|
||||||
case BC_INST_NOT | BC_RET_NULL:
|
case BC_INST_NOT | BC_RET_NULL:
|
||||||
case BC_INST_NOT | BC_RET_INT:
|
case BC_INST_NOT | BC_RET_INT:
|
||||||
result.set_integer(!args.back().get_bool());
|
|
||||||
args.pop_back();
|
|
||||||
continue;
|
|
||||||
case BC_INST_NOT | BC_RET_FLOAT:
|
case BC_INST_NOT | BC_RET_FLOAT:
|
||||||
result.set_float(float_type(!args.back().get_bool()));
|
result.set_integer(!args.back().get_bool());
|
||||||
|
force_arg(cs, result, op & BC_INST_RET_MASK);
|
||||||
args.pop_back();
|
args.pop_back();
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -323,18 +301,15 @@ std::uint32_t *vm_exec(
|
||||||
case BC_INST_ENTER_RESULT:
|
case BC_INST_ENTER_RESULT:
|
||||||
code = vm_exec(ts, code, result);
|
code = vm_exec(ts, code, result);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
case BC_INST_EXIT | BC_RET_NULL:
|
||||||
case BC_INST_EXIT | BC_RET_STRING:
|
case BC_INST_EXIT | BC_RET_STRING:
|
||||||
case BC_INST_EXIT | BC_RET_INT:
|
case BC_INST_EXIT | BC_RET_INT:
|
||||||
case BC_INST_EXIT | BC_RET_FLOAT:
|
case BC_INST_EXIT | BC_RET_FLOAT:
|
||||||
force_arg(cs, result, op & BC_INST_RET_MASK);
|
force_arg(cs, result, op & BC_INST_RET_MASK);
|
||||||
/* fallthrough */
|
|
||||||
case BC_INST_EXIT | BC_RET_NULL:
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
case BC_INST_RESULT | BC_RET_NULL:
|
case BC_INST_RESULT | BC_RET_NULL:
|
||||||
result = std::move(args.back());
|
|
||||||
args.pop_back();
|
|
||||||
continue;
|
|
||||||
case BC_INST_RESULT | BC_RET_STRING:
|
case BC_INST_RESULT | BC_RET_STRING:
|
||||||
case BC_INST_RESULT | BC_RET_INT:
|
case BC_INST_RESULT | BC_RET_INT:
|
||||||
case BC_INST_RESULT | BC_RET_FLOAT:
|
case BC_INST_RESULT | BC_RET_FLOAT:
|
||||||
|
@ -343,45 +318,28 @@ std::uint32_t *vm_exec(
|
||||||
force_arg(cs, result, op & BC_INST_RET_MASK);
|
force_arg(cs, result, op & BC_INST_RET_MASK);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
case BC_INST_RESULT_ARG | BC_RET_NULL:
|
||||||
case BC_INST_RESULT_ARG | BC_RET_STRING:
|
case BC_INST_RESULT_ARG | BC_RET_STRING:
|
||||||
case BC_INST_RESULT_ARG | BC_RET_INT:
|
case BC_INST_RESULT_ARG | BC_RET_INT:
|
||||||
case BC_INST_RESULT_ARG | BC_RET_FLOAT:
|
case BC_INST_RESULT_ARG | BC_RET_FLOAT:
|
||||||
force_arg(cs, result, op & BC_INST_RET_MASK);
|
force_arg(cs, result, op & BC_INST_RET_MASK);
|
||||||
/* fallthrough */
|
|
||||||
case BC_INST_RESULT_ARG | BC_RET_NULL:
|
|
||||||
args.emplace_back(std::move(result));
|
args.emplace_back(std::move(result));
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case BC_INST_FORCE | BC_RET_STRING:
|
case BC_INST_FORCE | BC_RET_STRING:
|
||||||
args.back().force_string(cs);
|
|
||||||
continue;
|
|
||||||
case BC_INST_FORCE | BC_RET_INT:
|
case BC_INST_FORCE | BC_RET_INT:
|
||||||
args.back().force_integer();
|
|
||||||
continue;
|
|
||||||
case BC_INST_FORCE | BC_RET_FLOAT:
|
case BC_INST_FORCE | BC_RET_FLOAT:
|
||||||
args.back().force_float();
|
force_arg(cs, args.back(), op & BC_INST_RET_MASK);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case BC_INST_DUP | BC_RET_NULL: {
|
case BC_INST_DUP | BC_RET_NULL:
|
||||||
auto &v = args.back();
|
case BC_INST_DUP | BC_RET_INT:
|
||||||
args.emplace_back() = v.get_plain();
|
case BC_INST_DUP | BC_RET_FLOAT:
|
||||||
continue;
|
|
||||||
}
|
|
||||||
case BC_INST_DUP | BC_RET_INT: {
|
|
||||||
auto &v = args.back();
|
|
||||||
args.emplace_back().set_integer(v.get_integer());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
case BC_INST_DUP | BC_RET_FLOAT: {
|
|
||||||
auto &v = args.back();
|
|
||||||
args.emplace_back().set_float(v.get_float());
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
case BC_INST_DUP | BC_RET_STRING: {
|
case BC_INST_DUP | BC_RET_STRING: {
|
||||||
auto &v = args.back();
|
auto &v = args.back();
|
||||||
auto &nv = args.emplace_back();
|
auto &nv = args.emplace_back();
|
||||||
nv = v;
|
nv = v;
|
||||||
nv.force_string(cs);
|
force_arg(cs, nv, op & BC_INST_RET_MASK);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue