remove all raw bcode passing in public api
parent
039dec8ec5
commit
b2caade276
|
@ -73,7 +73,6 @@ enum {
|
||||||
IDENT_FLAG_ARG = 1 << 6
|
IDENT_FLAG_ARG = 1 << 6
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bcode;
|
|
||||||
struct internal_state;
|
struct internal_state;
|
||||||
struct thread_state;
|
struct thread_state;
|
||||||
struct ident_impl;
|
struct ident_impl;
|
||||||
|
@ -82,7 +81,7 @@ struct LIBCUBESCRIPT_EXPORT bcode_ref {
|
||||||
bcode_ref():
|
bcode_ref():
|
||||||
p_code(nullptr)
|
p_code(nullptr)
|
||||||
{}
|
{}
|
||||||
bcode_ref(bcode *v);
|
bcode_ref(struct bcode *v);
|
||||||
bcode_ref(bcode_ref const &v);
|
bcode_ref(bcode_ref const &v);
|
||||||
bcode_ref(bcode_ref &&v):
|
bcode_ref(bcode_ref &&v):
|
||||||
p_code(v.p_code)
|
p_code(v.p_code)
|
||||||
|
@ -95,15 +94,15 @@ struct LIBCUBESCRIPT_EXPORT bcode_ref {
|
||||||
bcode_ref &operator=(bcode_ref const &v);
|
bcode_ref &operator=(bcode_ref const &v);
|
||||||
bcode_ref &operator=(bcode_ref &&v);
|
bcode_ref &operator=(bcode_ref &&v);
|
||||||
|
|
||||||
operator bool() const { return p_code != nullptr; }
|
bool empty() const;
|
||||||
operator bcode *() const { return p_code; }
|
|
||||||
|
operator bool() const;
|
||||||
|
operator struct bcode *() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bcode *p_code;
|
struct bcode *p_code;
|
||||||
};
|
};
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT bool code_is_empty(bcode *code);
|
|
||||||
|
|
||||||
struct LIBCUBESCRIPT_EXPORT string_ref {
|
struct LIBCUBESCRIPT_EXPORT string_ref {
|
||||||
friend struct any_value;
|
friend struct any_value;
|
||||||
friend struct string_pool;
|
friend struct string_pool;
|
||||||
|
@ -165,13 +164,13 @@ struct LIBCUBESCRIPT_EXPORT any_value {
|
||||||
void set_str(std::string_view val);
|
void set_str(std::string_view val);
|
||||||
void set_str(string_ref const &val);
|
void set_str(string_ref const &val);
|
||||||
void set_none();
|
void set_none();
|
||||||
void set_code(bcode *val);
|
void set_code(bcode_ref const &val);
|
||||||
void set_ident(ident *val);
|
void set_ident(ident *val);
|
||||||
|
|
||||||
string_ref get_str() const;
|
string_ref get_str() const;
|
||||||
integer_type get_int() const;
|
integer_type get_int() const;
|
||||||
float_type get_float() const;
|
float_type get_float() const;
|
||||||
bcode *get_code() const;
|
bcode_ref get_code() const;
|
||||||
ident *get_ident() const;
|
ident *get_ident() const;
|
||||||
void get_val(any_value &r) const;
|
void get_val(any_value &r) const;
|
||||||
|
|
||||||
|
@ -181,11 +180,9 @@ struct LIBCUBESCRIPT_EXPORT any_value {
|
||||||
float_type force_float();
|
float_type force_float();
|
||||||
integer_type force_int();
|
integer_type force_int();
|
||||||
std::string_view force_str();
|
std::string_view force_str();
|
||||||
bcode *force_code(state &cs);
|
bcode_ref force_code(state &cs);
|
||||||
ident *force_ident(state &cs);
|
ident *force_ident(state &cs);
|
||||||
|
|
||||||
bool code_is_empty() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
template<typename T>
|
template<typename T>
|
||||||
struct stor_t {
|
struct stor_t {
|
||||||
|
@ -440,18 +437,18 @@ struct LIBCUBESCRIPT_EXPORT state {
|
||||||
void reset_var(std::string_view name);
|
void reset_var(std::string_view name);
|
||||||
void touch_var(std::string_view name);
|
void touch_var(std::string_view name);
|
||||||
|
|
||||||
void run(bcode *code, any_value &ret);
|
void run(bcode_ref const &code, any_value &ret);
|
||||||
void run(std::string_view code, any_value &ret);
|
void run(std::string_view code, any_value &ret);
|
||||||
void run(std::string_view code, any_value &ret, std::string_view source);
|
void run(std::string_view code, any_value &ret, std::string_view source);
|
||||||
void run(ident *id, std::span<any_value> args, any_value &ret);
|
void run(ident *id, std::span<any_value> args, any_value &ret);
|
||||||
|
|
||||||
any_value run(bcode *code);
|
any_value run(bcode_ref const &code);
|
||||||
any_value run(std::string_view code);
|
any_value run(std::string_view code);
|
||||||
any_value run(std::string_view code, std::string_view source);
|
any_value run(std::string_view code, std::string_view source);
|
||||||
any_value run(ident *id, std::span<any_value> args);
|
any_value run(ident *id, std::span<any_value> args);
|
||||||
|
|
||||||
loop_state run_loop(bcode *code, any_value &ret);
|
loop_state run_loop(bcode_ref const &code, any_value &ret);
|
||||||
loop_state run_loop(bcode *code);
|
loop_state run_loop(bcode_ref const &code);
|
||||||
|
|
||||||
bool is_in_loop() const;
|
bool is_in_loop() const;
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,21 @@ LIBCUBESCRIPT_EXPORT bcode_ref &bcode_ref::operator=(bcode_ref &&v) {
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LIBCUBESCRIPT_EXPORT bool bcode_ref::empty() const {
|
||||||
|
if (!p_code) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return (*p_code->get_raw() & BC_INST_OP_MASK) == BC_INST_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
LIBCUBESCRIPT_EXPORT bcode_ref::operator bool() const {
|
||||||
|
return p_code != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
LIBCUBESCRIPT_EXPORT bcode_ref::operator bcode *() const {
|
||||||
|
return p_code;
|
||||||
|
}
|
||||||
|
|
||||||
/* private funcs */
|
/* private funcs */
|
||||||
|
|
||||||
struct bcode_hdr {
|
struct bcode_hdr {
|
||||||
|
|
|
@ -126,7 +126,7 @@ state::state(alloc_func func, void *data) {
|
||||||
res.set_int(1);
|
res.set_int(1);
|
||||||
} else {
|
} else {
|
||||||
for (size_t i = 0; i < args.size(); ++i) {
|
for (size_t i = 0; i < args.size(); ++i) {
|
||||||
bcode *code = args[i].get_code();
|
auto code = args[i].get_code();
|
||||||
if (code) {
|
if (code) {
|
||||||
cs.run(code, res);
|
cs.run(code, res);
|
||||||
} else {
|
} else {
|
||||||
|
@ -145,7 +145,7 @@ state::state(alloc_func func, void *data) {
|
||||||
res.set_int(0);
|
res.set_int(0);
|
||||||
} else {
|
} else {
|
||||||
for (size_t i = 0; i < args.size(); ++i) {
|
for (size_t i = 0; i < args.size(); ++i) {
|
||||||
bcode *code = args[i].get_code();
|
auto code = args[i].get_code();
|
||||||
if (code) {
|
if (code) {
|
||||||
cs.run(code, res);
|
cs.run(code, res);
|
||||||
} else {
|
} else {
|
||||||
|
@ -780,8 +780,9 @@ LIBCUBESCRIPT_EXPORT void state::init_libs(int libs) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT void state::run(bcode *code, any_value &ret) {
|
LIBCUBESCRIPT_EXPORT void state::run(bcode_ref const &code, any_value &ret) {
|
||||||
vm_exec(*p_tstate, reinterpret_cast<std::uint32_t *>(code), ret);
|
bcode *p = code;
|
||||||
|
vm_exec(*p_tstate, reinterpret_cast<std::uint32_t *>(p), ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_run(
|
static void do_run(
|
||||||
|
@ -897,7 +898,7 @@ LIBCUBESCRIPT_EXPORT void state::run(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT any_value state::run(bcode *code) {
|
LIBCUBESCRIPT_EXPORT any_value state::run(bcode_ref const &code) {
|
||||||
any_value ret{*this};
|
any_value ret{*this};
|
||||||
run(code, ret);
|
run(code, ret);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -925,7 +926,9 @@ LIBCUBESCRIPT_EXPORT any_value state::run(
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT loop_state state::run_loop(bcode *code, any_value &ret) {
|
LIBCUBESCRIPT_EXPORT loop_state state::run_loop(
|
||||||
|
bcode_ref const &code, any_value &ret
|
||||||
|
) {
|
||||||
++p_tstate->loop_level;
|
++p_tstate->loop_level;
|
||||||
try {
|
try {
|
||||||
run(code, ret);
|
run(code, ret);
|
||||||
|
@ -942,7 +945,7 @@ LIBCUBESCRIPT_EXPORT loop_state state::run_loop(bcode *code, any_value &ret) {
|
||||||
return loop_state::NORMAL;
|
return loop_state::NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT loop_state state::run_loop(bcode *code) {
|
LIBCUBESCRIPT_EXPORT loop_state state::run_loop(bcode_ref const &code) {
|
||||||
any_value ret{*this};
|
any_value ret{*this};
|
||||||
return run_loop(code, ret);
|
return run_loop(code, ret);
|
||||||
}
|
}
|
||||||
|
|
|
@ -168,11 +168,12 @@ void any_value::set_none() {
|
||||||
p_type = value_type::NONE;
|
p_type = value_type::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void any_value::set_code(bcode *val) {
|
void any_value::set_code(bcode_ref const &val) {
|
||||||
|
bcode *p = val;
|
||||||
csv_cleanup(p_type, &p_stor);
|
csv_cleanup(p_type, &p_stor);
|
||||||
p_type = value_type::CODE;
|
p_type = value_type::CODE;
|
||||||
bcode_addref(val->get_raw());
|
bcode_addref(p->get_raw());
|
||||||
csv_get<bcode *>(&p_stor) = val;
|
csv_get<bcode *>(&p_stor) = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void any_value::set_ident(ident *val) {
|
void any_value::set_ident(ident *val) {
|
||||||
|
@ -250,10 +251,10 @@ std::string_view any_value::force_str() {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
bcode *any_value::force_code(state &cs) {
|
bcode_ref any_value::force_code(state &cs) {
|
||||||
switch (get_type()) {
|
switch (get_type()) {
|
||||||
case value_type::CODE:
|
case value_type::CODE:
|
||||||
return csv_get<bcode *>(&p_stor);
|
return bcode_ref{csv_get<bcode *>(&p_stor)};
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -265,7 +266,7 @@ bcode *any_value::force_code(state &cs) {
|
||||||
std::memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(std::uint32_t));
|
std::memcpy(cbuf, gs.code.data(), gs.code.size() * sizeof(std::uint32_t));
|
||||||
auto *bc = reinterpret_cast<bcode *>(cbuf + 1);
|
auto *bc = reinterpret_cast<bcode *>(cbuf + 1);
|
||||||
set_code(bc);
|
set_code(bc);
|
||||||
return bc;
|
return bcode_ref{bc};
|
||||||
}
|
}
|
||||||
|
|
||||||
ident *any_value::force_ident(state &cs) {
|
ident *any_value::force_ident(state &cs) {
|
||||||
|
@ -312,11 +313,11 @@ float_type any_value::get_float() const {
|
||||||
return 0.0f;
|
return 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
bcode *any_value::get_code() const {
|
bcode_ref any_value::get_code() const {
|
||||||
if (get_type() != value_type::CODE) {
|
if (get_type() != value_type::CODE) {
|
||||||
return nullptr;
|
return bcode_ref{};
|
||||||
}
|
}
|
||||||
return csv_get<bcode *>(&p_stor);
|
return bcode_ref{csv_get<bcode *>(&p_stor)};
|
||||||
}
|
}
|
||||||
|
|
||||||
ident *any_value::get_ident() const {
|
ident *any_value::get_ident() const {
|
||||||
|
@ -365,20 +366,6 @@ void any_value::get_val(any_value &r) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LIBCUBESCRIPT_EXPORT bool code_is_empty(bcode *code) {
|
|
||||||
if (!code) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return (*code->get_raw() & BC_INST_OP_MASK) == BC_INST_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool any_value::code_is_empty() const {
|
|
||||||
if (get_type() != value_type::CODE) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return cubescript::code_is_empty(csv_get<bcode *>(&p_stor));
|
|
||||||
}
|
|
||||||
|
|
||||||
bool any_value::get_bool() const {
|
bool any_value::get_bool() const {
|
||||||
switch (get_type()) {
|
switch (get_type()) {
|
||||||
case value_type::FLOAT:
|
case value_type::FLOAT:
|
||||||
|
|
|
@ -9,7 +9,7 @@ namespace cubescript {
|
||||||
|
|
||||||
static inline void do_loop(
|
static inline void do_loop(
|
||||||
state &cs, ident &id, integer_type offset, integer_type n, integer_type step,
|
state &cs, ident &id, integer_type offset, integer_type n, integer_type step,
|
||||||
bcode *cond, bcode *body
|
bcode_ref &&cond, bcode_ref &&body
|
||||||
) {
|
) {
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -34,7 +34,7 @@ static inline void do_loop(
|
||||||
|
|
||||||
static inline void do_loop_conc(
|
static inline void do_loop_conc(
|
||||||
state &cs, any_value &res, ident &id, integer_type offset, integer_type n,
|
state &cs, any_value &res, ident &id, integer_type offset, integer_type n,
|
||||||
integer_type step, bcode *body, bool space
|
integer_type step, bcode_ref &&body, bool space
|
||||||
) {
|
) {
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
return;
|
return;
|
||||||
|
@ -228,7 +228,8 @@ void init_lib_base(state &gcs) {
|
||||||
});
|
});
|
||||||
|
|
||||||
gcs.new_command("while", "ee", [](auto &cs, auto args, auto &) {
|
gcs.new_command("while", "ee", [](auto &cs, auto args, auto &) {
|
||||||
bcode *cond = args[0].get_code(), *body = args[1].get_code();
|
auto cond = args[0].get_code();
|
||||||
|
auto body = args[1].get_code();
|
||||||
while (cs.run(cond).get_bool()) {
|
while (cs.run(cond).get_bool()) {
|
||||||
switch (cs.run_loop(body)) {
|
switch (cs.run_loop(body)) {
|
||||||
case loop_state::BREAK:
|
case loop_state::BREAK:
|
||||||
|
|
|
@ -74,7 +74,7 @@ static inline void list_assoc(
|
||||||
|
|
||||||
static void loop_list_conc(
|
static void loop_list_conc(
|
||||||
state &cs, any_value &res, ident *id, std::string_view list,
|
state &cs, any_value &res, ident *id, std::string_view list,
|
||||||
bcode *body, bool space
|
bcode_ref &&body, bool space
|
||||||
) {
|
) {
|
||||||
if (alias_stack st{cs, id}; st) {
|
if (alias_stack st{cs, id}; st) {
|
||||||
any_value idv{cs};
|
any_value idv{cs};
|
||||||
|
@ -519,7 +519,7 @@ struct ListSortItem {
|
||||||
struct ListSortFun {
|
struct ListSortFun {
|
||||||
state &cs;
|
state &cs;
|
||||||
alias_stack &xst, &yst;
|
alias_stack &xst, &yst;
|
||||||
bcode *body;
|
bcode_ref const *body;
|
||||||
|
|
||||||
bool operator()(ListSortItem const &xval, ListSortItem const &yval) {
|
bool operator()(ListSortItem const &xval, ListSortItem const &yval) {
|
||||||
any_value v{cs};
|
any_value v{cs};
|
||||||
|
@ -527,13 +527,13 @@ struct ListSortFun {
|
||||||
xst.set(std::move(v));
|
xst.set(std::move(v));
|
||||||
v.set_str(yval.str);
|
v.set_str(yval.str);
|
||||||
yst.set(std::move(v));
|
yst.set(std::move(v));
|
||||||
return cs.run(body).get_bool();
|
return cs.run(*body).get_bool();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static void list_sort(
|
static void list_sort(
|
||||||
state &cs, any_value &res, std::string_view list,
|
state &cs, any_value &res, std::string_view list,
|
||||||
ident *x, ident *y, bcode *body, bcode *unique
|
ident *x, ident *y, bcode_ref &&body, bcode_ref &&unique
|
||||||
) {
|
) {
|
||||||
if (x == y) {
|
if (x == y) {
|
||||||
return;
|
return;
|
||||||
|
@ -561,10 +561,10 @@ static void list_sort(
|
||||||
size_t totaluniq = total;
|
size_t totaluniq = total;
|
||||||
size_t nuniq = items.size();
|
size_t nuniq = items.size();
|
||||||
if (body) {
|
if (body) {
|
||||||
ListSortFun f = { cs, xst, yst, body };
|
ListSortFun f = { cs, xst, yst, &body };
|
||||||
std::sort(items.buf.begin(), items.buf.end(), f);
|
std::sort(items.buf.begin(), items.buf.end(), f);
|
||||||
if (!code_is_empty(unique)) {
|
if (!unique.empty()) {
|
||||||
f.body = unique;
|
f.body = &unique;
|
||||||
totaluniq = items[0].quote.size();
|
totaluniq = items[0].quote.size();
|
||||||
nuniq = 1;
|
nuniq = 1;
|
||||||
for (size_t i = 1; i < items.size(); i++) {
|
for (size_t i = 1; i < items.size(); i++) {
|
||||||
|
@ -578,7 +578,7 @@ static void list_sort(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ListSortFun f = { cs, xst, yst, unique };
|
ListSortFun f = { cs, xst, yst, &unique };
|
||||||
totaluniq = items[0].quote.size();
|
totaluniq = items[0].quote.size();
|
||||||
nuniq = 1;
|
nuniq = 1;
|
||||||
for (size_t i = 1; i < items.size(); i++) {
|
for (size_t i = 1; i < items.size(); i++) {
|
||||||
|
|
Loading…
Reference in New Issue