put force_ident and force_code in any_value

master
Daniel Kolesa 2021-03-24 21:01:01 +01:00
parent 00b8312ad5
commit 3d37ea22c3
4 changed files with 45 additions and 53 deletions

View File

@ -374,6 +374,8 @@ struct LIBCUBESCRIPT_EXPORT any_value {
float_type force_float();
integer_type force_int();
std::string_view force_str();
bcode *force_code(state &cs);
ident *force_ident(state &cs);
bool code_is_empty() const;
@ -589,7 +591,6 @@ struct LIBCUBESCRIPT_EXPORT state {
void clear_overrides();
ident *new_ident(std::string_view name, int flags = IDENT_FLAG_UNKNOWN);
ident *force_ident(any_value &v);
template<typename F>
integer_var *new_ivar(

View File

@ -273,22 +273,6 @@ LIBCUBESCRIPT_EXPORT ident *state::new_ident(
return id;
}
LIBCUBESCRIPT_EXPORT ident *state::force_ident(any_value &v) {
switch (v.get_type()) {
case value_type::IDENT:
return v.get_ident();
case value_type::STRING: {
ident *id = new_ident(v.get_str());
v.set_ident(id);
return id;
}
default:
break;
}
v.set_ident(p_state->identmap[ID_IDX_DUMMY]);
return p_state->identmap[ID_IDX_DUMMY];
}
LIBCUBESCRIPT_EXPORT ident *state::get_ident(std::string_view name) {
auto id = p_state->idents.find(name);
if (id != p_state->idents.end()) {

View File

@ -2,6 +2,7 @@
#include "cs_gen.hh"
#include "cs_std.hh"
#include "cs_parser.hh"
#include "cs_state.hh"
#include <cmath>
@ -248,6 +249,36 @@ std::string_view any_value::force_str() {
));
}
bcode *any_value::force_code(state &cs) {
switch (get_type()) {
case value_type::CODE:
return csv_get<bcode *>(&p_stor);
default:
break;
}
codegen_state gs{cs};
gs.code.reserve(64);
gs.gen_main(get_str());
gs.done();
uint32_t *cbuf = bcode_alloc(cs, gs.code.size());
std::memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(std::uint32_t));
auto *bc = reinterpret_cast<bcode *>(cbuf + 1);
set_code(bc);
return bc;
}
ident *any_value::force_ident(state &cs) {
switch (get_type()) {
case value_type::IDENT:
return csv_get<ident *>(&p_stor);
default:
break;
}
auto *id = cs.new_ident(get_str());
set_ident(id);
return id;
}
integer_type any_value::get_int() const {
switch (get_type()) {
case value_type::FLOAT:

View File

@ -62,35 +62,6 @@ bool stack_state::gap() const {
return p_gap;
}
static inline uint32_t *forcecode(state &cs, any_value &v) {
auto *code = v.get_code();
if (!code) {
codegen_state gs(cs);
gs.code.reserve(64);
gs.gen_main(v.get_str());
gs.done();
uint32_t *cbuf = bcode_alloc(cs, gs.code.size());
memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(uint32_t));
v.set_code(reinterpret_cast<bcode *>(cbuf + 1));
code = v.get_code();
}
return code->get_raw();
}
static inline void forcecond(state &cs, any_value &v) {
switch (v.get_type()) {
case value_type::STRING:
if (!std::string_view{v.get_str()}.empty()) {
forcecode(cs, v);
} else {
v.set_int(0);
}
break;
default:
break;
}
}
static inline void force_arg(any_value &v, int type) {
switch (type) {
case BC_RET_STRING:
@ -192,8 +163,13 @@ static inline void callcommand(
}
args[i].set_none();
fakeargs++;
} else {
forcecond(cs, args[i]);
} else if (args[i].get_type() == value_type::STRING) {
auto str = std::string_view{args[i].get_str()};
if (str.empty()) {
args[i].set_int(0);
} else {
args[i].force_code(cs);
}
}
break;
case 'e':
@ -206,7 +182,7 @@ static inline void callcommand(
);
fakeargs++;
} else {
forcecode(cs, args[i]);
args[i].force_code(cs);
}
break;
case 'r':
@ -217,7 +193,7 @@ static inline void callcommand(
args[i].set_ident(cs.p_state->identmap[ID_IDX_DUMMY]);
fakeargs++;
} else {
cs.force_ident(args[i]);
args[i].force_ident(cs);
}
break;
case '$':
@ -1295,9 +1271,9 @@ noid:
case ID_LOCAL: {
valarray<ident_stack, MAX_ARGUMENTS> locals{cs};
for (size_t j = 0; j < size_t(callargs); ++j) {
push_alias(cs, cs.force_ident(
args[offset + j]
), locals[j]);
push_alias(
cs, args[offset + j].force_ident(cs), locals[j]
);
}
call_with_cleanup([&]() {
code = runcode(cs, code, result);