pass thread_state in more places

master
Daniel Kolesa 2021-03-26 02:29:54 +01:00
parent 865bac73f3
commit 0b2c4c7038
8 changed files with 64 additions and 60 deletions

View File

@ -14,7 +14,7 @@ std::string_view codegen_state::get_str() {
size_t nl; size_t nl;
char const *beg = source; char const *beg = source;
source = parse_string( source = parse_string(
cs, std::string_view{source, std::size_t(send - source)}, nl *ts.pstate, std::string_view{source, std::size_t(send - source)}, nl
); );
current_line += nl - 1; current_line += nl - 1;
auto ret = std::string_view{beg, std::size_t(source - beg)}; auto ret = std::string_view{beg, std::size_t(source - beg)};
@ -22,7 +22,7 @@ std::string_view codegen_state::get_str() {
} }
charbuf codegen_state::get_str_dup() { charbuf codegen_state::get_str_dup() {
charbuf buf{cs.p_tstate->istate}; charbuf buf{ts.istate};
unescape_string(std::back_inserter(buf), get_str()); unescape_string(std::back_inserter(buf), get_str());
return buf; return buf;
} }
@ -69,7 +69,7 @@ void codegen_state::skip_comments() {
if (current() == '\\') { if (current() == '\\') {
char c = current(1); char c = current(1);
if ((c != '\r') && (c != '\n')) { if ((c != '\r') && (c != '\n')) {
throw error(cs, "invalid line break"); throw error{*ts.pstate, "invalid line break"};
} }
/* skip backslash */ /* skip backslash */
next_char(); next_char();
@ -94,7 +94,7 @@ void codegen_state::skip_comments() {
std::string_view codegen_state::get_word() { std::string_view codegen_state::get_word() {
char const *beg = source; char const *beg = source;
source = parse_word( source = parse_word(
cs, std::string_view{source, std::size_t(send - source)} *ts.pstate, std::string_view{source, std::size_t(send - source)}
); );
return std::string_view{beg, std::size_t(source - beg)}; return std::string_view{beg, std::size_t(source - beg)};
} }
@ -199,7 +199,7 @@ static inline void compileunescapestr(codegen_state &gs) {
gs.code.size() + str.size() / sizeof(uint32_t) + 1 gs.code.size() + str.size() / sizeof(uint32_t) + 1
); );
size_t bufs = (gs.code.capacity() - gs.code.size()) * sizeof(uint32_t); size_t bufs = (gs.code.capacity() - gs.code.size()) * sizeof(uint32_t);
auto alloc = std_allocator<char>{gs.cs.p_tstate->istate}; auto alloc = std_allocator<char>{gs.ts.istate};
auto *buf = alloc.allocate(bufs + 1); auto *buf = alloc.allocate(bufs + 1);
char *wbuf = unescape_string(&buf[0], str); char *wbuf = unescape_string(&buf[0], str);
memset( memset(
@ -218,7 +218,7 @@ static bool compilearg(
); );
static void compilelookup(codegen_state &gs, int ltype, int prevargs = MAX_RESULTS) { static void compilelookup(codegen_state &gs, int ltype, int prevargs = MAX_RESULTS) {
charbuf lookup{gs.cs.p_tstate->istate}; charbuf lookup{gs.ts.istate};
gs.next_char(); gs.next_char();
switch (gs.current()) { switch (gs.current()) {
case '(': case '(':
@ -239,7 +239,7 @@ static void compilelookup(codegen_state &gs, int ltype, int prevargs = MAX_RESUL
if (lookup.empty()) goto invalid; if (lookup.empty()) goto invalid;
lookup.push_back('\0'); lookup.push_back('\0');
lookupid: lookupid:
ident *id = gs.cs.new_ident(lookup.str_term()); ident *id = gs.ts.pstate->new_ident(lookup.str_term());
if (id) { if (id) {
switch (id->get_type()) { switch (id->get_type()) {
case ident_type::IVAR: case ident_type::IVAR:
@ -466,7 +466,7 @@ static bool compileblockstr(codegen_state &gs, char const *str, char const *send
int startc = gs.code.size(); int startc = gs.code.size();
gs.code.push_back(BC_INST_VAL | BC_RET_STRING); gs.code.push_back(BC_INST_VAL | BC_RET_STRING);
gs.code.reserve(gs.code.size() + (send - str) / sizeof(uint32_t) + 1); gs.code.reserve(gs.code.size() + (send - str) / sizeof(uint32_t) + 1);
auto alloc = std_allocator<char>{gs.cs.p_tstate->istate}; auto alloc = std_allocator<char>{gs.ts.istate};
auto asz = ((send - str) / sizeof(uint32_t) + 1) * sizeof(uint32_t); auto asz = ((send - str) / sizeof(uint32_t) + 1) * sizeof(uint32_t);
char *buf = alloc.allocate(asz); char *buf = alloc.allocate(asz);
int len = 0; int len = 0;
@ -486,7 +486,7 @@ static bool compileblockstr(codegen_state &gs, char const *str, char const *send
case '\"': { case '\"': {
char const *start = str; char const *start = str;
str = parse_string( str = parse_string(
gs.cs, std::string_view{str, send} *gs.ts.pstate, std::string_view{str, send}
); );
memcpy(&buf[len], start, std::size_t(str - start)); memcpy(&buf[len], start, std::size_t(str - start));
len += (str - start); len += (str - start);
@ -519,7 +519,7 @@ done:
} }
static bool compileblocksub(codegen_state &gs, int prevargs) { static bool compileblocksub(codegen_state &gs, int prevargs) {
charbuf lookup{gs.cs.p_tstate->istate}; charbuf lookup{gs.ts.istate};
switch (gs.current()) { switch (gs.current()) {
case '(': case '(':
if (!compilearg(gs, VAL_ANY, prevargs)) { if (!compilearg(gs, VAL_ANY, prevargs)) {
@ -543,7 +543,7 @@ static bool compileblocksub(codegen_state &gs, int prevargs) {
} }
lookup.push_back('\0'); lookup.push_back('\0');
lookupid: lookupid:
ident *id = gs.cs.new_ident(lookup.str_term()); ident *id = gs.ts.pstate->new_ident(lookup.str_term());
if (id) { if (id) {
switch (id->get_type()) { switch (id->get_type()) {
case ident_type::IVAR: case ident_type::IVAR:
@ -583,7 +583,7 @@ static void compileblockmain(codegen_state &gs, int wordtype, int prevargs) {
for (int brak = 1; brak;) { for (int brak = 1; brak;) {
switch (gs.skip_until("@\"/[]")) { switch (gs.skip_until("@\"/[]")) {
case '\0': case '\0':
throw error(gs.cs, "missing \"]\""); throw error{*gs.ts.pstate, "missing \"]\""};
return; return;
case '\"': case '\"':
gs.get_str(); gs.get_str();
@ -612,7 +612,7 @@ static void compileblockmain(codegen_state &gs, int wordtype, int prevargs) {
if (brak > level) { if (brak > level) {
continue; continue;
} else if (brak < level) { } else if (brak < level) {
throw error(gs.cs, "too many @s"); throw error{*gs.ts.pstate, "too many @s"};
return; return;
} }
if (!concs && prevargs >= MAX_RESULTS) { if (!concs && prevargs >= MAX_RESULTS) {
@ -1214,7 +1214,7 @@ static void compile_and_or(
} }
static void compilestatements(codegen_state &gs, int rettype, int brak, int prevargs) { static void compilestatements(codegen_state &gs, int rettype, int brak, int prevargs) {
charbuf idname{gs.cs.p_tstate->istate}; charbuf idname{gs.ts.istate};
for (;;) { for (;;) {
gs.skip_comments(); gs.skip_comments();
idname.clear(); idname.clear();
@ -1240,7 +1240,7 @@ static void compilestatements(codegen_state &gs, int rettype, int brak, int prev
gs.next_char(); gs.next_char();
if (!idname.empty()) { if (!idname.empty()) {
idname.push_back('\0'); idname.push_back('\0');
ident *id = gs.cs.new_ident(idname.str_term()); ident *id = gs.ts.pstate->new_ident(idname.str_term());
if (id) { if (id) {
switch (id->get_type()) { switch (id->get_type()) {
case ident_type::ALIAS: case ident_type::ALIAS:
@ -1309,7 +1309,7 @@ noid:
gs.code.push_back(BC_INST_CALL_U | (numargs << 8)); gs.code.push_back(BC_INST_CALL_U | (numargs << 8));
} else { } else {
idname.push_back('\0'); idname.push_back('\0');
ident *id = gs.cs.get_ident(idname.str_term()); ident *id = gs.ts.pstate->get_ident(idname.str_term());
if (!id) { if (!id) {
if (is_valid_name(idname.str_term())) { if (is_valid_name(idname.str_term())) {
gs.gen_str(idname.str_term()); gs.gen_str(idname.str_term());
@ -1435,7 +1435,7 @@ endstatement:
switch (gs.skip_until(")];/\n")) { switch (gs.skip_until(")];/\n")) {
case '\0': case '\0':
if (gs.current() != brak) { if (gs.current() != brak) {
throw error(gs.cs, "missing \"%c\"", char(brak)); throw error{*gs.ts.pstate, "missing \"%c\"", char(brak)};
return; return;
} }
return; return;
@ -1445,7 +1445,7 @@ endstatement:
gs.next_char(); gs.next_char();
return; return;
} }
throw error(gs.cs, "unexpected \"%c\"", gs.current()); throw error{*gs.ts.pstate, "unexpected \"%c\"", gs.current()};
return; return;
case '/': case '/':
gs.next_char(); gs.next_char();

View File

@ -23,7 +23,7 @@ static constexpr int ID_IDX_NUMARGS = MAX_ARGUMENTS + 1;
static constexpr int ID_IDX_DBGALIAS = MAX_ARGUMENTS + 2; static constexpr int ID_IDX_DBGALIAS = MAX_ARGUMENTS + 2;
struct codegen_state { struct codegen_state {
state &cs; thread_state &ts;
codegen_state *prevps; codegen_state *prevps;
bool parsing = true; bool parsing = true;
valbuf<uint32_t> code; valbuf<uint32_t> code;
@ -32,11 +32,11 @@ struct codegen_state {
std::string_view src_name; std::string_view src_name;
codegen_state() = delete; codegen_state() = delete;
codegen_state(state &csr): codegen_state(thread_state &tsr):
cs{csr}, prevps{csr.p_tstate->cstate}, code{csr.p_tstate->istate}, ts{tsr}, prevps{tsr.cstate}, code{tsr.istate},
source{}, send{}, current_line{1}, src_name{} source{}, send{}, current_line{1}, src_name{}
{ {
csr.p_tstate->cstate = this; tsr.cstate = this;
} }
~codegen_state() { ~codegen_state() {
@ -47,7 +47,7 @@ struct codegen_state {
if (!parsing) { if (!parsing) {
return; return;
} }
cs.p_tstate->cstate = prevps; ts.cstate = prevps;
parsing = false; parsing = false;
} }
@ -122,11 +122,11 @@ struct codegen_state {
} }
void gen_ident() { void gen_ident() {
gen_ident(cs.p_tstate->istate->identmap[ID_IDX_DUMMY]); gen_ident(ts.istate->identmap[ID_IDX_DUMMY]);
} }
void gen_ident(std::string_view word) { void gen_ident(std::string_view word) {
gen_ident(cs.new_ident(word)); gen_ident(ts.pstate->new_ident(word));
} }
void gen_value( void gen_value(

View File

@ -151,20 +151,20 @@ void alias_impl::redo_arg(ident_stack &st) {
clean_code(); clean_code();
} }
void alias_impl::set_arg(state &cs, any_value &v) { void alias_impl::set_arg(thread_state &ts, any_value &v) {
if (ident_is_used_arg(this, cs)) { if (ident_is_used_arg(this, ts)) {
p_val = std::move(v); p_val = std::move(v);
clean_code(); clean_code();
} else { } else {
push_arg(v, cs.p_tstate->callstack->argstack[get_index()], false); push_arg(v, ts.callstack->argstack[get_index()], false);
cs.p_tstate->callstack->usedargs |= 1 << get_index(); ts.callstack->usedargs |= 1 << get_index();
} }
} }
void alias_impl::set_alias(state &cs, any_value &v) { void alias_impl::set_alias(thread_state &ts, any_value &v) {
p_val = std::move(v); p_val = std::move(v);
clean_code(); clean_code();
p_flags = (p_flags & cs.identflags) | cs.identflags; p_flags = (p_flags & ts.pstate->identflags) | ts.pstate->identflags;
} }
void alias_impl::clean_code() { void alias_impl::clean_code() {
@ -174,13 +174,13 @@ void alias_impl::clean_code() {
} }
} }
bcode *alias_impl::compile_code(state &cs) { bcode *alias_impl::compile_code(thread_state &ts) {
if (!p_acode) { if (!p_acode) {
codegen_state gs(cs); codegen_state gs(ts);
gs.code.reserve(64); gs.code.reserve(64);
gs.gen_main(get_value().get_str()); gs.gen_main(get_value().get_str());
/* i wish i could steal the memory somehow */ /* i wish i could steal the memory somehow */
uint32_t *code = bcode_alloc(cs.p_tstate->istate, gs.code.size()); uint32_t *code = bcode_alloc(ts.istate, gs.code.size());
memcpy(code, gs.code.data(), gs.code.size() * sizeof(uint32_t)); memcpy(code, gs.code.data(), gs.code.size() * sizeof(uint32_t));
bcode_incr(code); bcode_incr(code);
p_acode = reinterpret_cast<bcode *>(code); p_acode = reinterpret_cast<bcode *>(code);
@ -195,11 +195,11 @@ command_impl::command_impl(
p_cargs{args}, p_cb_cftv{std::move(f)}, p_numargs{nargs} p_cargs{args}, p_cb_cftv{std::move(f)}, p_numargs{nargs}
{} {}
bool ident_is_used_arg(ident *id, state &cs) { bool ident_is_used_arg(ident *id, thread_state &ts) {
if (!cs.p_tstate->callstack) { if (!ts.callstack) {
return true; return true;
} }
return cs.p_tstate->callstack->usedargs & (1 << id->get_index()); return ts.callstack->usedargs & (1 << id->get_index());
} }
/* public interface */ /* public interface */

View File

@ -87,11 +87,11 @@ struct alias_impl: ident_impl, alias {
void pop_arg(); void pop_arg();
void undo_arg(ident_stack &st); void undo_arg(ident_stack &st);
void redo_arg(ident_stack &st); void redo_arg(ident_stack &st);
void set_arg(state &cs, any_value &v); void set_arg(thread_state &ts, any_value &v);
void set_alias(state &cs, any_value &v); void set_alias(thread_state &ts, any_value &v);
void clean_code(); void clean_code();
bcode *compile_code(state &cs); bcode *compile_code(thread_state &ts);
bcode *p_acode; bcode *p_acode;
ident_stack *p_astack; ident_stack *p_astack;
@ -112,7 +112,7 @@ struct command_impl: ident_impl, command {
int p_numargs; int p_numargs;
}; };
bool ident_is_used_arg(ident *id, state &cs); bool ident_is_used_arg(ident *id, thread_state &ts);
} /* namespace cubescript */ } /* namespace cubescript */

View File

@ -371,9 +371,9 @@ LIBCUBESCRIPT_EXPORT void state::set_alias(
case ident_type::ALIAS: { case ident_type::ALIAS: {
alias_impl *a = static_cast<alias_impl *>(id); alias_impl *a = static_cast<alias_impl *>(id);
if (a->get_index() < MAX_ARGUMENTS) { if (a->get_index() < MAX_ARGUMENTS) {
a->set_arg(*this, v); a->set_arg(*p_tstate, v);
} else { } else {
a->set_alias(*this, v); a->set_alias(*p_tstate, v);
} }
return; return;
} }
@ -654,7 +654,7 @@ state::get_alias_val(std::string_view name) {
if (!a) { if (!a) {
return std::nullopt; return std::nullopt;
} }
if ((a->get_index() < MAX_ARGUMENTS) && !ident_is_used_arg(a, *this)) { if ((a->get_index() < MAX_ARGUMENTS) && !ident_is_used_arg(a, *p_tstate)) {
return std::nullopt; return std::nullopt;
} }
return a->get_value().get_str(); return a->get_value().get_str();

View File

@ -256,7 +256,7 @@ bcode *any_value::force_code(state &cs) {
default: default:
break; break;
} }
codegen_state gs{cs}; codegen_state gs{*cs.p_tstate};
gs.code.reserve(64); gs.code.reserve(64);
gs.gen_main(get_str()); gs.gen_main(get_str());
gs.done(); gs.done();

View File

@ -266,7 +266,7 @@ static inline void call_alias(
ts.callstack = &aliaslink; ts.callstack = &aliaslink;
std::uint32_t *codep = static_cast< std::uint32_t *codep = static_cast<
alias_impl * alias_impl *
>(a)->compile_code(*ts.pstate)->get_raw(); >(a)->compile_code(ts)->get_raw();
bcode_incr(codep); bcode_incr(codep);
call_with_cleanup([&]() { call_with_cleanup([&]() {
runcode(ts, codep+1, result); runcode(ts, codep+1, result);
@ -320,7 +320,7 @@ static inline alias *get_lookup_id(thread_state &ts, std::uint32_t op) {
static inline alias *get_lookuparg_id(thread_state &ts, std::uint32_t op) { static inline alias *get_lookuparg_id(thread_state &ts, std::uint32_t op) {
ident *id = ts.istate->identmap[op >> 8]; ident *id = ts.istate->identmap[op >> 8];
if (!ident_is_used_arg(id, *ts.pstate)) { if (!ident_is_used_arg(id, ts)) {
return nullptr; return nullptr;
} }
return static_cast<alias *>(id); return static_cast<alias *>(id);
@ -358,7 +358,7 @@ static inline int get_lookupu_type(
} }
if ( if (
(id->get_index() < MAX_ARGUMENTS) && (id->get_index() < MAX_ARGUMENTS) &&
!ident_is_used_arg(id, *ts.pstate) !ident_is_used_arg(id, ts)
) { ) {
return ID_UNKNOWN; return ID_UNKNOWN;
} }
@ -707,7 +707,7 @@ static std::uint32_t *runcode(
} }
case BC_INST_COMPILE: { case BC_INST_COMPILE: {
any_value &arg = args.back(); any_value &arg = args.back();
codegen_state gs{cs}; codegen_state gs{ts};
switch (arg.get_type()) { switch (arg.get_type()) {
case value_type::INT: case value_type::INT:
gs.code.reserve(8); gs.code.reserve(8);
@ -752,7 +752,7 @@ static std::uint32_t *runcode(
case value_type::STRING: { case value_type::STRING: {
std::string_view s = arg.get_str(); std::string_view s = arg.get_str();
if (!s.empty()) { if (!s.empty()) {
codegen_state gs{cs}; codegen_state gs{ts};
gs.code.reserve(64); gs.code.reserve(64);
gs.gen_main(s); gs.gen_main(s);
gs.done(); gs.done();
@ -782,7 +782,7 @@ static std::uint32_t *runcode(
alias *a = static_cast<alias *>( alias *a = static_cast<alias *>(
ts.istate->identmap[op >> 8] ts.istate->identmap[op >> 8]
); );
if (!ident_is_used_arg(a, cs)) { if (!ident_is_used_arg(a, ts)) {
any_value nv{cs}; any_value nv{cs};
static_cast<alias_impl *>(a)->push_arg( static_cast<alias_impl *>(a)->push_arg(
nv, ts.callstack->argstack[a->get_index()], nv, ts.callstack->argstack[a->get_index()],
@ -799,7 +799,10 @@ static std::uint32_t *runcode(
if (arg.get_type() == value_type::STRING) { if (arg.get_type() == value_type::STRING) {
id = cs.new_ident(arg.get_str()); id = cs.new_ident(arg.get_str());
} }
if ((id->get_index() < MAX_ARGUMENTS) && !ident_is_used_arg(id, cs)) { if (
(id->get_index() < MAX_ARGUMENTS) &&
!ident_is_used_arg(id, ts)
) {
any_value nv{cs}; any_value nv{cs};
static_cast<alias_impl *>(id)->push_arg( static_cast<alias_impl *>(id)->push_arg(
nv, ts.callstack->argstack[id->get_index()], nv, ts.callstack->argstack[id->get_index()],
@ -1259,13 +1262,13 @@ static std::uint32_t *runcode(
case BC_INST_ALIAS: case BC_INST_ALIAS:
static_cast<alias_impl *>( static_cast<alias_impl *>(
ts.istate->identmap[op >> 8] ts.istate->identmap[op >> 8]
)->set_alias(cs, args.back()); )->set_alias(ts, args.back());
args.pop_back(); args.pop_back();
continue; continue;
case BC_INST_ALIAS_ARG: case BC_INST_ALIAS_ARG:
static_cast<alias_impl *>( static_cast<alias_impl *>(
ts.istate->identmap[op >> 8] ts.istate->identmap[op >> 8]
)->set_arg(cs, args.back()); )->set_arg(ts, args.back());
args.pop_back(); args.pop_back();
continue; continue;
case BC_INST_ALIAS_U: { case BC_INST_ALIAS_U: {
@ -1307,7 +1310,7 @@ static std::uint32_t *runcode(
std::size_t callargs = (op >> 8) & 0x1F; std::size_t callargs = (op >> 8) & 0x1F;
std::size_t nnargs = args.size(); std::size_t nnargs = args.size();
std::size_t offset = nnargs - callargs; std::size_t offset = nnargs - callargs;
if (!ident_is_used_arg(id, cs)) { if (!ident_is_used_arg(id, ts)) {
args.resize(offset, any_value{cs}); args.resize(offset, any_value{cs});
force_arg(result, op & BC_INST_RET_MASK); force_arg(result, op & BC_INST_RET_MASK);
continue; continue;
@ -1422,7 +1425,7 @@ noid:
alias *a = static_cast<alias *>(id); alias *a = static_cast<alias *>(id);
if ( if (
(a->get_index() < MAX_ARGUMENTS) && (a->get_index() < MAX_ARGUMENTS) &&
!ident_is_used_arg(a, cs) !ident_is_used_arg(a, ts)
) { ) {
args.resize(offset - 1, any_value{cs}); args.resize(offset - 1, any_value{cs});
force_arg(result, op & BC_INST_RET_MASK); force_arg(result, op & BC_INST_RET_MASK);
@ -1453,7 +1456,7 @@ static void do_run(
state &cs, std::string_view file, std::string_view code, state &cs, std::string_view file, std::string_view code,
any_value &ret any_value &ret
) { ) {
codegen_state gs{cs}; codegen_state gs{*cs.p_tstate};
gs.src_name = file; gs.src_name = file;
gs.code.reserve(64); gs.code.reserve(64);
gs.gen_main(code, VAL_ANY); gs.gen_main(code, VAL_ANY);
@ -1536,7 +1539,8 @@ void state::run(ident *id, std::span<any_value> args, any_value &ret) {
case ident_type::ALIAS: { case ident_type::ALIAS: {
alias *a = static_cast<alias *>(id); alias *a = static_cast<alias *>(id);
if ( if (
(a->get_index() < MAX_ARGUMENTS) && !ident_is_used_arg(a, *this) (a->get_index() < MAX_ARGUMENTS) &&
!ident_is_used_arg(a, *p_tstate)
) { ) {
break; break;
} }

View File

@ -87,8 +87,8 @@ void init_lib_base(state &gcs) {
rc = false; rc = false;
} }
ret.set_int(rc); ret.set_int(rc);
static_cast<alias_impl *>(cret)->set_alias(cs, result); static_cast<alias_impl *>(cret)->set_alias(*cs.p_tstate, result);
static_cast<alias_impl *>(css)->set_alias(cs, tback); static_cast<alias_impl *>(css)->set_alias(*cs.p_tstate, tback);
}); });
gcs.new_command("?", "ttt", [](auto &, auto args, auto &res) { gcs.new_command("?", "ttt", [](auto &, auto args, auto &res) {