Skip to content

Returning a table_proxy to existing not nil item in coroutine from a binding leads to a nullptr dereference in the interpreter #1736

@elsid

Description

@elsid

Simple example to reproduce:

#include <sol/sol.hpp>

int main() {
    sol::state state;

    state.open_libraries(sol::lib::base, sol::lib::coroutine);

    constexpr std::string_view name = "foo";
    constexpr unsigned key = 42;
    sol::table table(state, sol::create);
    table[key] = name;

    state.set_function("f", [=]{
        auto r = table[key]; // crash
        // sol::object r = table[key]; // ok
        return r;
    });

    state.script(R"lua(
print('begin script')
co = coroutine.wrap(function()
    print('co')
    print(f())
end)
co()
print('end script')
)lua");

    return 0;
}
stack trace with [LuaJIT](https://github.com/LuaJIT/LuaJIT/commit/a4f56a459a588ae768801074b46ba0adcfb49eb1):
Thread 1 (Thread 0x7ffff7eb07c0 (LWP 37790) "sol_test"):
#0  0x00007ffff7f02e75 in lj_cont_dispatch () from /home/elsid/dev/LuaJIT/build/gcc/debug/install/lib/libluajit-5.1.so.2
No symbol table info available.
#1  0x00007ffff7f03a04 in lj_ff_coroutine_wrap_aux () from /home/elsid/dev/LuaJIT/build/gcc/debug/install/lib/libluajit-5.1.so.2
No symbol table info available.
#2  0x00007ffff7f246fe in lua_pcall (L=0x7ffff7ec1380, nargs=0, nresults=-1, errfunc=1) at lj_api.c:1151
        g = 0x7ffff7ec13e0
        oldh = 0 '\000'
        ef = 16
        status = 32767
#3  0x0000555555564ec6 in sol::basic_protected_function<sol::stack_reference, true, sol::basic_reference<false> >::luacall<true> (this=0x7fffffffe0f0, argcount=0, result_count_=-1, h=...) at /home/elsid/dev/sol2/include/sol/protected_function.hpp:315
No locals.
#4  0x000055555556404a in sol::basic_protected_function<sol::stack_reference, true, sol::basic_reference<false> >::invoke<true>(sol::types<>, std::integer_sequence<unsigned long>, long, sol::detail::protected_handler<true, sol::basic_reference<false> >&) const (this=0x7fffffffe0f0, n=0, h=...) at /home/elsid/dev/sol2/include/sol/protected_function.hpp:346
        stacksize = 2
        poststacksize = 2
        firstreturn = 1
        returncount = 0
        code = sol::call_status::ok
#5  0x000055555556209f in sol::basic_protected_function<sol::stack_reference, true, sol::basic_reference<false> >::call<>() const (this=0x7fffffffe0f0) at /home/elsid/dev/sol2/include/sol/protected_function.hpp:254
        h = {m_L = 0x7ffff7ec1380, target = @0x7fffffffe100, stack_index = 1}
        pushcount = 0
#6  0x00005555555621c8 in sol::basic_protected_function<sol::stack_reference, true, sol::basic_reference<false> >::operator()<>() const (this=0x7fffffffe0f0) at /home/elsid/dev/sol2/include/sol/protected_function.hpp:213
No locals.
#7  0x0000555555560636 in sol::state_view::do_string (this=0x7fffffffe4d8, code=..., chunkname=..., mode=sol::load_mode::any) at /home/elsid/dev/sol2/include/sol/state_view.hpp:339
        basechunkname = "\nprint('start')\nco = coroutine.wrap(function()\n    print('co')\n    print(f())\nend)\nco()\nprint('end')\n", '\000' <repeats 410 times>
        chunknametarget = 0x7fffffffe110 "\nprint('start')\nco = coroutine.wrap(function()\n    print('co')\n    print(f())\nend)\nco()\nprint('end')\n"
        x = sol::load_status::ok
        pf = {<sol::basic_object<sol::stack_reference>> = {<sol::basic_object_base<sol::stack_reference>> = {<sol::stack_reference> = {<sol::stateless_stack_reference> = {m_index = 1}, luastate = 0x7ffff7ec1380}, <No data fields>}, <No data fields>}, m_error_handler = {<sol::stateless_reference> = {ref = 5}, luastate = 0x7ffff7ec1380}}
#8  0x0000555555562230 in sol::state_view::safe_script<sol::protected_function_result (&)(lua_State*, sol::protected_function_result), (sol::meta::enable_t)0> (this=0x7fffffffe4d8, code=..., on_error=@0x5555555602c7: {sol::protected_function_result (lua_State *, sol::protected_function_result)} 0x5555555602c7 <sol::script_default_on_error(lua_State*, sol::protected_function_result)>, chunkname=..., mode=sol::load_mode::any) at /home/elsid/dev/sol2/include/sol/state_view.hpp:384
        pfr = {<sol::proxy_base<sol::protected_function_result>> = {<sol::proxy_base_tag> = {<No data fields>}, <No data fields>}, L = 0x7fffffffe3e0, index = 1431676772, returncount = 21845, popcount = -135523456, err = 32767}
#9  0x00005555555606f6 in sol::state_view::safe_script (this=0x7fffffffe4d8, code=..., chunkname=..., mode=sol::load_mode::any) at /home/elsid/dev/sol2/include/sol/state_view.hpp:409
No locals.
#10 0x0000555555560759 in sol::state_view::script (this=0x7fffffffe4d8, code=..., chunkname=..., mode=sol::load_mode::any) at /home/elsid/dev/sol2/include/sol/state_view.hpp:562
No locals.
#11 0x000055555555a51c in main () at /home/elsid/dev/sol_test/src/main.cpp:21
        state = {<std::unique_ptr<lua_State, sol::detail::state_deleter>> = {_M_t = {<std::__uniq_ptr_impl<lua_State, sol::detail::state_deleter>> = {_M_t = {<std::_Tuple_impl<0, lua_State*, sol::detail::state_deleter>> = {<std::_Tuple_impl<1, sol::detail::state_deleter>> = {<std::_Head_base<1, sol::detail::state_deleter, true>> = {_M_head_impl = {<No data fields>}}, <No data fields>}, <std::_Head_base<0, lua_State*, false>> = {_M_head_impl = 0x7ffff7ec1380}, <No data fields>}, <No data fields>}}, <No data fields>}}, <sol::state_view> = {L = 0x7ffff7ec1380, reg = {<sol::basic_object<sol::basic_reference<false> >> = {<sol::basic_object_base<sol::basic_reference<false> >> = {<sol::basic_reference<false>> = {<sol::stateless_reference> = {ref = 1}, luastate = 0x7ffff7ec1380}, <No data fields>}, <No data fields>}, <No data fields>}, global = {<sol::basic_object<sol::basic_reference<false> >> = {<sol::basic_object_base<sol::basic_reference<false> >> = {<sol::basic_reference<false>> = {<sol::stateless_reference> = {ref = 2}, luastate = 0x7ffff7ec1380}, <No data fields>}, <No data fields>}, <No data fields>}}, <No data fields>}
        name = {_M_len = 3, _M_str = 0x555555567c65 "foo"}
        key = 42
        table = {<sol::basic_object<sol::basic_reference<false> >> = {<sol::basic_object_base<sol::basic_reference<false> >> = {<sol::basic_reference<false>> = {<sol::stateless_reference> = {ref = 3}, luastate = 0x7ffff7ec1380}, <No data fields>}, <No data fields>}, <No data fields>}

Traces of Lua calls:

auto r = table[key];
luaL_newstate 
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushvalue  L = 0x7f08fe6ac380 idx = -10000
luaL_ref  L = 0x7f08fe6ac380 t = -10000
lua_type  L = 0x7f08fe6ac380 idx = -10000
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushvalue  L = 0x7f08fe6ac380 idx = -10002
luaL_ref  L = 0x7f08fe6ac380 t = -10000
lua_atpanic  L = 0x7f08fe6ac380 panicf = 1
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushcclosure  L = 0x7f08fe6ac380 fn = 1 n = 0
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushvalue  L = 0x7f08fe6ac380 idx = -1
luaL_ref  L = 0x7f08fe6ac380 t = -10000
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_rawgeti  L = 0x7f08fe6ac380 idx = -10000 n = 3
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_setfield  L = 0x7f08fe6ac380 idx = -10002 k = sol.🔩
luaL_unref  L = 0x7f08fe6ac380 t = -10000 ref = 3
lua_pushlightuserdata  L = 0x7f08fe6ac380 p = 0x560935cff75b
lua_setfield  L = 0x7f08fe6ac380 idx = -10002 k = sol.☢☢
lua_pushthread  L = 0x7f08fe6ac380
lua_setfield  L = 0x7f08fe6ac380 idx = -10002 k = sol.📌
lua_checkstack  L = 0x7f08fe6ac380 sz = 23
lua_checkstack  L = 0x7f08fe6ac380 sz = 23
lua_pushstring  L = 0x7f08fe6ac380 s = _LOADED
lua_tolstring  L = 0x7f08fe6ac380 idx = -1 len = 0
lua_gettable  L = 0x7f08fe6ac380 idx = -10000
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_createtable  L = 0x7f08fe6ac380 narr = 0 nrec = 0
lua_pushstring  L = 0x7f08fe6ac380 s = _LOADED
lua_tolstring  L = 0x7f08fe6ac380 idx = -1 len = 0
lua_pushvalue  L = 0x7f08fe6ac380 idx = -2
lua_settable  L = 0x7f08fe6ac380 idx = -10000
lua_getfield  L = 0x7f08fe6ac380 idx = -1 k = base
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_pushcclosure  L = 0x7f08fe6ac380 fn = 1 n = 0
lua_pushstring  L = 0x7f08fe6ac380 s = base
lua_tolstring  L = 0x7f08fe6ac380 idx = -1 len = 0
lua_call  L = 0x7f08fe6ac380 nargs = 1 nresults = 1
luaopen_base  L = 0x7f08fe6ac380
lua_pushvalue  L = 0x7f08fe6ac380 idx = -1
lua_setfield  L = 0x7f08fe6ac380 idx = -3 k = base
lua_pushvalue  L = 0x7f08fe6ac380 idx = -1
lua_setfield  L = 0x7f08fe6ac380 idx = -10002 k = base
lua_replace  L = 0x7f08fe6ac380 idx = -2
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_checkstack  L = 0x7f08fe6ac380 sz = 23
lua_checkstack  L = 0x7f08fe6ac380 sz = 23
lua_pushstring  L = 0x7f08fe6ac380 s = _LOADED
lua_tolstring  L = 0x7f08fe6ac380 idx = -1 len = 0
lua_gettable  L = 0x7f08fe6ac380 idx = -10000
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_getfield  L = 0x7f08fe6ac380 idx = -1 k = base
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_pushvalue  L = 0x7f08fe6ac380 idx = -1
lua_setfield  L = 0x7f08fe6ac380 idx = -10002 k = base
lua_replace  L = 0x7f08fe6ac380 idx = -2
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_createtable  L = 0x7f08fe6ac380 narr = 0 nrec = 0
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushvalue  L = 0x7f08fe6ac380 idx = -1
luaL_ref  L = 0x7f08fe6ac380 t = -10000
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_rawgeti  L = 0x7f08fe6ac380 idx = -10000 n = 3
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_gettop  L = 0x7f08fe6ac380
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushnumber  L = 0x7f08fe6ac380 n = 42
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushlstring  L = 0x7f08fe6ac380 s = foo l = 3
lua_tolstring  L = 0x7f08fe6ac380 idx = -1 len = 0
lua_settable  L = 0x7f08fe6ac380 idx = 1
lua_settop  L = 0x7f08fe6ac380 idx = -1
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_rawgeti  L = 0x7f08fe6ac380 idx = -10000 n = 3
lua_type  L = 0x7f08fe6ac380 idx = -1
luaL_ref  L = 0x7f08fe6ac380 t = -10000
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushnil  L = 0x7f08fe6ac380
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_newuserdata  L = 0x7f08fe6ac380 sz = 31
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
luaL_newmetatable  L = 0x7f08fe6ac380 tname = sol.sol::function_detail::functor_function<main()::<lambda()>, false, true>.user♻
lua_pushstring  L = 0x7f08fe6ac380 s = sol.sol::function_detail::functor_function<main()::<lambda()>, false, true>.user♻
lua_tolstring  L = 0x7f08fe6ac380 idx = -1 len = 0
lua_setfield  L = 0x7f08fe6ac380 idx = -2 k = __name
lua_pushcclosure  L = 0x7f08fe6ac380 fn = 1 n = 0
lua_setfield  L = 0x7f08fe6ac380 idx = -2 k = __gc
lua_setmetatable  L = 0x7f08fe6ac380 objindex = -2
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushcclosure  L = 0x7f08fe6ac380 fn = 1 n = 2
lua_setfield  L = 0x7f08fe6ac380 idx = -10002 k = f
lua_settop  L = 0x7f08fe6ac380 idx = -1
luaL_loadbuffer  L = 0x7f08fe6ac380 buff = 
print('begin script')
co = coroutine.wrap(function()
    print('co')
    print(f())
end)
co()
print('end script')
 sz = 115 name = 
print('begin script')
co = coroutine.wrap(function()
    print('co')
    print(f())
end)
co()
print('end script')

lua_getfield  L = 0x7f08fe6ac380 idx = -10002 k = sol.🔩
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushvalue  L = 0x7f08fe6ac380 idx = -1
luaL_ref  L = 0x7f08fe6ac380 t = -10000
lua_settop  L = 0x7f08fe6ac380 idx = -2
lua_gettop  L = 0x7f08fe6ac380
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushvalue  L = 0x7f08fe6ac380 idx = 1
lua_gettop  L = 0x7f08fe6ac380
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_rawgeti  L = 0x7f08fe6ac380 idx = -10000 n = 5
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_replace  L = 0x7f08fe6ac380 idx = -3
lua_gettop  L = 0x7f08fe6ac380
lua_gettop  L = 0x7f08fe6ac380
lua_pcall  L = 0x7f08fe6ac380 nargs = 0 nresults = -1 errfunc = 1
lua_type  L = 0x7f08fe6b1280 idx = -10004
lua_touserdata  L = 0x7f08fe6b1280 idx = -10004
lua_settop  L = 0x7f08fe6b1280 idx = 0
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_rawgeti  L = 0x7f08fe6ac380 idx = -10000 n = 4
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_gettop  L = 0x7f08fe6ac380
lua_gettop  L = 0x7f08fe6b1280
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushnumber  L = 0x7f08fe6ac380 n = 42
lua_gettable  L = 0x7f08fe6ac380 idx = 1
lua_type  L = 0x7f08fe6ac380 idx = -1
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_pushvalue  L = 0x7f08fe6ac380 idx = -1
luaL_ref  L = 0x7f08fe6ac380 t = -10000
lua_settop  L = 0x7f08fe6ac380 idx = -1
lua_checkstack  L = 0x7f08fe6ac380 sz = 21
lua_rawgeti  L = 0x7f08fe6ac380 idx = -10000 n = 6
lua_type  L = 0x7f08fe6ac380 idx = -1
luaL_unref  L = 0x7f08fe6ac380 t = -10000 ref = 6
lua_replace  L = 0x7f08fe6b1280 idx = 1
lua_settop  L = 0x7f08fe6b1280 idx = 1
lua_settop  L = 0x7f08fe6ac380 idx = -2
sol::object r = table[key];
luaL_newstate 
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushvalue  L = 0x7f4a71b79380 idx = -10000
luaL_ref  L = 0x7f4a71b79380 t = -10000
lua_type  L = 0x7f4a71b79380 idx = -10000
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushvalue  L = 0x7f4a71b79380 idx = -10002
luaL_ref  L = 0x7f4a71b79380 t = -10000
lua_atpanic  L = 0x7f4a71b79380 panicf = 1
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushcclosure  L = 0x7f4a71b79380 fn = 1 n = 0
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushvalue  L = 0x7f4a71b79380 idx = -1
luaL_ref  L = 0x7f4a71b79380 t = -10000
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_rawgeti  L = 0x7f4a71b79380 idx = -10000 n = 3
lua_type  L = 0x7f4a71b79380 idx = -1
lua_setfield  L = 0x7f4a71b79380 idx = -10002 k = sol.🔩
luaL_unref  L = 0x7f4a71b79380 t = -10000 ref = 3
lua_pushlightuserdata  L = 0x7f4a71b79380 p = 0x557089cfd7b3
lua_setfield  L = 0x7f4a71b79380 idx = -10002 k = sol.☢☢
lua_pushthread  L = 0x7f4a71b79380
lua_setfield  L = 0x7f4a71b79380 idx = -10002 k = sol.📌
lua_checkstack  L = 0x7f4a71b79380 sz = 23
lua_checkstack  L = 0x7f4a71b79380 sz = 23
lua_pushstring  L = 0x7f4a71b79380 s = _LOADED
lua_tolstring  L = 0x7f4a71b79380 idx = -1 len = 0
lua_gettable  L = 0x7f4a71b79380 idx = -10000
lua_type  L = 0x7f4a71b79380 idx = -1
lua_type  L = 0x7f4a71b79380 idx = -1
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_createtable  L = 0x7f4a71b79380 narr = 0 nrec = 0
lua_pushstring  L = 0x7f4a71b79380 s = _LOADED
lua_tolstring  L = 0x7f4a71b79380 idx = -1 len = 0
lua_pushvalue  L = 0x7f4a71b79380 idx = -2
lua_settable  L = 0x7f4a71b79380 idx = -10000
lua_getfield  L = 0x7f4a71b79380 idx = -1 k = base
lua_type  L = 0x7f4a71b79380 idx = -1
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_pushcclosure  L = 0x7f4a71b79380 fn = 1 n = 0
lua_pushstring  L = 0x7f4a71b79380 s = base
lua_tolstring  L = 0x7f4a71b79380 idx = -1 len = 0
lua_call  L = 0x7f4a71b79380 nargs = 1 nresults = 1
luaopen_base  L = 0x7f4a71b79380
lua_pushvalue  L = 0x7f4a71b79380 idx = -1
lua_setfield  L = 0x7f4a71b79380 idx = -3 k = base
lua_pushvalue  L = 0x7f4a71b79380 idx = -1
lua_setfield  L = 0x7f4a71b79380 idx = -10002 k = base
lua_replace  L = 0x7f4a71b79380 idx = -2
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_checkstack  L = 0x7f4a71b79380 sz = 23
lua_checkstack  L = 0x7f4a71b79380 sz = 23
lua_pushstring  L = 0x7f4a71b79380 s = _LOADED
lua_tolstring  L = 0x7f4a71b79380 idx = -1 len = 0
lua_gettable  L = 0x7f4a71b79380 idx = -10000
lua_type  L = 0x7f4a71b79380 idx = -1
lua_type  L = 0x7f4a71b79380 idx = -1
lua_getfield  L = 0x7f4a71b79380 idx = -1 k = base
lua_type  L = 0x7f4a71b79380 idx = -1
lua_pushvalue  L = 0x7f4a71b79380 idx = -1
lua_setfield  L = 0x7f4a71b79380 idx = -10002 k = base
lua_replace  L = 0x7f4a71b79380 idx = -2
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_createtable  L = 0x7f4a71b79380 narr = 0 nrec = 0
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushvalue  L = 0x7f4a71b79380 idx = -1
luaL_ref  L = 0x7f4a71b79380 t = -10000
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_rawgeti  L = 0x7f4a71b79380 idx = -10000 n = 3
lua_type  L = 0x7f4a71b79380 idx = -1
lua_gettop  L = 0x7f4a71b79380
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushnumber  L = 0x7f4a71b79380 n = 42
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushlstring  L = 0x7f4a71b79380 s = foo l = 3
lua_tolstring  L = 0x7f4a71b79380 idx = -1 len = 0
lua_settable  L = 0x7f4a71b79380 idx = 1
lua_settop  L = 0x7f4a71b79380 idx = -1
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_rawgeti  L = 0x7f4a71b79380 idx = -10000 n = 3
lua_type  L = 0x7f4a71b79380 idx = -1
luaL_ref  L = 0x7f4a71b79380 t = -10000
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushnil  L = 0x7f4a71b79380
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_newuserdata  L = 0x7f4a71b79380 sz = 31
lua_checkstack  L = 0x7f4a71b79380 sz = 21
luaL_newmetatable  L = 0x7f4a71b79380 tname = sol.sol::function_detail::functor_function<main()::<lambda()>, false, true>.user♻
lua_pushstring  L = 0x7f4a71b79380 s = sol.sol::function_detail::functor_function<main()::<lambda()>, false, true>.user♻
lua_tolstring  L = 0x7f4a71b79380 idx = -1 len = 0
lua_setfield  L = 0x7f4a71b79380 idx = -2 k = __name
lua_pushcclosure  L = 0x7f4a71b79380 fn = 1 n = 0
lua_setfield  L = 0x7f4a71b79380 idx = -2 k = __gc
lua_setmetatable  L = 0x7f4a71b79380 objindex = -2
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushcclosure  L = 0x7f4a71b79380 fn = 1 n = 2
lua_setfield  L = 0x7f4a71b79380 idx = -10002 k = f
lua_settop  L = 0x7f4a71b79380 idx = -1
luaL_loadbuffer  L = 0x7f4a71b79380 buff = 
print('begin script')
co = coroutine.wrap(function()
    print('co')
    print(f())
end)
co()
print('end script')
 sz = 115 name = 
print('begin script')
co = coroutine.wrap(function()
    print('co')
    print(f())
end)
co()
print('end script')

lua_getfield  L = 0x7f4a71b79380 idx = -10002 k = sol.🔩
lua_type  L = 0x7f4a71b79380 idx = -1
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushvalue  L = 0x7f4a71b79380 idx = -1
luaL_ref  L = 0x7f4a71b79380 t = -10000
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_gettop  L = 0x7f4a71b79380
lua_type  L = 0x7f4a71b79380 idx = -1
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushvalue  L = 0x7f4a71b79380 idx = 1
lua_gettop  L = 0x7f4a71b79380
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_rawgeti  L = 0x7f4a71b79380 idx = -10000 n = 5
lua_type  L = 0x7f4a71b79380 idx = -1
lua_replace  L = 0x7f4a71b79380 idx = -3
lua_gettop  L = 0x7f4a71b79380
lua_gettop  L = 0x7f4a71b79380
lua_pcall  L = 0x7f4a71b79380 nargs = 0 nresults = -1 errfunc = 1
lua_type  L = 0x7f4a71b7e290 idx = -10004
lua_touserdata  L = 0x7f4a71b7e290 idx = -10004
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_rawgeti  L = 0x7f4a71b79380 idx = -10000 n = 4
lua_type  L = 0x7f4a71b79380 idx = -1
lua_gettop  L = 0x7f4a71b79380
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushnumber  L = 0x7f4a71b79380 n = 42
lua_gettable  L = 0x7f4a71b79380 idx = 1
lua_type  L = 0x7f4a71b79380 idx = -1
lua_checkstack  L = 0x7f4a71b79380 sz = 21
lua_pushvalue  L = 0x7f4a71b79380 idx = -1
luaL_ref  L = 0x7f4a71b79380 t = -10000
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_settop  L = 0x7f4a71b79380 idx = -2
lua_settop  L = 0x7f4a71b7e290 idx = 0
lua_checkstack  L = 0x7f4a71b7e290 sz = 21
lua_rawgeti  L = 0x7f4a71b79380 idx = -10000 n = 6
lua_type  L = 0x7f4a71b79380 idx = -1
lua_xmove  from = 0x7f4a71b79380 to = 0x7f4a71b7e290 n = 1
luaL_unref  L = 0x7f4a71b79380 t = -10000 ref = 6
lua_gettop  L = 0x7f4a71b79380
lua_remove  L = 0x7f4a71b79380 idx = 1
luaL_unref  L = 0x7f4a71b79380 t = -10000 ref = 5
luaL_unref  L = 0x7f4a71b79380 t = -10000 ref = 3
luaL_unref  L = 0x7f4a71b79380 t = -10000 ref = 2
luaL_unref  L = 0x7f4a71b79380 t = -10000 ref = 1
lua_close  L = 0x7f4a71b79380
lua_touserdata  L = 0x7f4a71b79380 idx = 1
luaL_unref  L = 0x7f4a71b79380 t = -10000 ref = 4
diff
@@ -18,7 +18,7 @@
 lua_type  L = <ptr1> idx = -1
 lua_setfield  L = <ptr1> idx = -10002 k = sol.🔩
 luaL_unref  L = <ptr1> t = -10000 ref = 3
-lua_pushlightuserdata  L = <ptr1> p = 0x560935cff75b
+lua_pushlightuserdata  L = <ptr1> p = 0x557089cfd7b3
 lua_setfield  L = <ptr1> idx = -10002 k = sol.☢☢
 lua_pushthread  L = <ptr1>
 lua_setfield  L = <ptr1> idx = -10002 k = sol.📌
@@ -136,12 +136,10 @@
 lua_pcall  L = <ptr1> nargs = 0 nresults = -1 errfunc = 1
 lua_type  L = <ptr2> idx = -10004
 lua_touserdata  L = <ptr2> idx = -10004
-lua_settop  L = <ptr2> idx = 0
 lua_checkstack  L = <ptr1> sz = 21
 lua_rawgeti  L = <ptr1> idx = -10000 n = 4
 lua_type  L = <ptr1> idx = -1
 lua_gettop  L = <ptr1>
-lua_gettop  L = <ptr2>
 lua_checkstack  L = <ptr1> sz = 21
 lua_pushnumber  L = <ptr1> n = 42
 lua_gettable  L = <ptr1> idx = 1
@@ -149,11 +147,20 @@
 lua_checkstack  L = <ptr1> sz = 21
 lua_pushvalue  L = <ptr1> idx = -1
 luaL_ref  L = <ptr1> t = -10000
-lua_settop  L = <ptr1> idx = -1
-lua_checkstack  L = <ptr1> sz = 21
+lua_settop  L = <ptr1> idx = -2
+lua_settop  L = <ptr1> idx = -2
+lua_settop  L = <ptr2> idx = 0
+lua_checkstack  L = <ptr2> sz = 21
 lua_rawgeti  L = <ptr1> idx = -10000 n = 6
 lua_type  L = <ptr1> idx = -1
+lua_xmove  from = <ptr1> to = <ptr2> n = 1
 luaL_unref  L = <ptr1> t = -10000 ref = 6
-lua_replace  L = <ptr2> idx = 1
-lua_settop  L = <ptr2> idx = 1
-lua_settop  L = <ptr1> idx = -2
+lua_gettop  L = <ptr1>
+lua_remove  L = <ptr1> idx = 1
+luaL_unref  L = <ptr1> t = -10000 ref = 5
+luaL_unref  L = <ptr1> t = -10000 ref = 3
+luaL_unref  L = <ptr1> t = -10000 ref = 2
+luaL_unref  L = <ptr1> t = -10000 ref = 1
+lua_close  L = <ptr1>
+lua_touserdata  L = <ptr1> idx = 1
+luaL_unref  L = <ptr1> t = -10000 ref = 4

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions