diff --git a/src/cs_gen.cc b/src/cs_gen.cc index 3cc3a91..f681492 100644 --- a/src/cs_gen.cc +++ b/src/cs_gen.cc @@ -326,6 +326,16 @@ void gen_state::gen_local(std::uint32_t nargs) { code.push_back(BC_INST_LOCAL | (nargs << 8)); } +void gen_state::gen_main(std::string_view v, std::string_view src) { + parser_state ps{ts, *this}; + ps.source = v.data(); + ps.send = v.data() + v.size(); + ps.src_name = src; + code.push_back(BC_INST_START); + ps.parse_block(VAL_ANY); + code.push_back(BC_INST_EXIT); +} + void gen_state::gen_main_null() { code.reserve(code.size() + 4); code.push_back(BC_INST_START); diff --git a/src/cs_gen.hh b/src/cs_gen.hh index 9636b48..ccd6565 100644 --- a/src/cs_gen.hh +++ b/src/cs_gen.hh @@ -75,6 +75,9 @@ struct gen_state { void gen_local(std::uint32_t nargs); + void gen_main( + std::string_view s, std::string_view src = std::string_view{} + ); void gen_main_null(); void gen_main_integer(integer_type v); void gen_main_float(float_type v); diff --git a/src/cs_parser.cc b/src/cs_parser.cc index f3a31db..35f9230 100644 --- a/src/cs_parser.cc +++ b/src/cs_parser.cc @@ -1483,15 +1483,6 @@ endstatement: } } -void parser_state::gen_main(std::string_view s, int ret_type) { - source = s.data(); - send = s.data() + s.size(); - gs.code.reserve(gs.code.size() + 8); - gs.code.push_back(BC_INST_START); - parse_block(VAL_ANY); - gs.code.push_back(BC_INST_EXIT | ((ret_type < VAL_ANY) ? (ret_type << BC_INST_RET) : 0)); -} - /* list parser public implementation */ LIBCUBESCRIPT_EXPORT bool list_parser::parse() { diff --git a/src/cs_parser.hh b/src/cs_parser.hh index 578afde..0583299 100644 --- a/src/cs_parser.hh +++ b/src/cs_parser.hh @@ -51,7 +51,6 @@ struct parser_state { std::string_view get_word(); void parse_block(int ret_type, int term = '\0'); - void gen_main(std::string_view s, int ret_type = VAL_ANY); void next_char() { if (source == send) { diff --git a/src/cs_state.cc b/src/cs_state.cc index 295afb8..310c094 100644 --- a/src/cs_state.cc +++ b/src/cs_state.cc @@ -656,11 +656,7 @@ static any_value do_run( ) { any_value ret{*ts.pstate}; gen_state gs{ts}; - { - parser_state ps{ts, gs}; - ps.src_name = file; - ps.gen_main(code, VAL_ANY); - } + gs.gen_main(code, file); auto cref = gs.steal_ref(); bcode *p = cref; vm_exec(ts, p->get_raw(), ret); diff --git a/src/cs_val.cc b/src/cs_val.cc index 5d2de16..15963c6 100644 --- a/src/cs_val.cc +++ b/src/cs_val.cc @@ -270,7 +270,7 @@ bcode_ref any_value::force_code(state &cs) { break; } gen_state gs{state_p{cs}.ts()}; - parser_state{state_p{cs}.ts(), gs}.gen_main(get_string()); + gs.gen_main(get_string()); auto bc = gs.steal_ref(); set_code(bc); return bc; diff --git a/src/cs_vm.cc b/src/cs_vm.cc index 5b3f3c5..b8ebb09 100644 --- a/src/cs_vm.cc +++ b/src/cs_vm.cc @@ -240,7 +240,7 @@ bool exec_alias( ts.callstack = &aliaslink; if (!aast.node->code) { gen_state gs{ts}; - parser_state{ts, gs}.gen_main(aast.node->val_s.get_string()); + gs.gen_main(aast.node->val_s.get_string()); aast.node->code = gs.steal_ref(); } bcode_ref coderef = aast.node->code; @@ -692,7 +692,7 @@ std::uint32_t *vm_exec( gs.gen_main_float(arg.get_float()); break; case value_type::STRING: - parser_state{ts, gs}.gen_main(arg.get_string()); + gs.gen_main(arg.get_string()); break; default: gs.gen_main_null(); @@ -709,7 +709,7 @@ std::uint32_t *vm_exec( std::string_view s = arg.get_string(); if (!s.empty()) { gen_state gs{ts}; - parser_state{ts, gs}.gen_main(s); + gs.gen_main(s); arg.set_code(gs.steal_ref()); } else { arg.force_none();