diff options
Diffstat (limited to 'src/lane.cpp')
| -rw-r--r-- | src/lane.cpp | 92 |
1 files changed, 46 insertions, 46 deletions
diff --git a/src/lane.cpp b/src/lane.cpp index 33ee8a0..b23ff78 100644 --- a/src/lane.cpp +++ b/src/lane.cpp | |||
| @@ -49,7 +49,7 @@ static LUAG_FUNC(lane_get_threadname) | |||
| 49 | { | 49 | { |
| 50 | Lane* const _lane{ ToLane(L_, StackIndex{ 1 }) }; | 50 | Lane* const _lane{ ToLane(L_, StackIndex{ 1 }) }; |
| 51 | luaL_argcheck(L_, lua_gettop(L_) == 1, 2, "too many arguments"); | 51 | luaL_argcheck(L_, lua_gettop(L_) == 1, 2, "too many arguments"); |
| 52 | luaG_pushstring(L_, _lane->getDebugName()); | 52 | luaW_pushstring(L_, _lane->getDebugName()); |
| 53 | return 1; | 53 | return 1; |
| 54 | } | 54 | } |
| 55 | 55 | ||
| @@ -85,17 +85,17 @@ static LUAG_FUNC(set_finalizer) | |||
| 85 | static LUAG_FUNC(lane_threadname) | 85 | static LUAG_FUNC(lane_threadname) |
| 86 | { | 86 | { |
| 87 | // C s_lane structure is a light userdata upvalue | 87 | // C s_lane structure is a light userdata upvalue |
| 88 | Lane* const _lane{ luaG_tolightuserdata<Lane>(L_, StackIndex{ lua_upvalueindex(1) }) }; | 88 | Lane* const _lane{ luaW_tolightuserdata<Lane>(L_, StackIndex{ lua_upvalueindex(1) }) }; |
| 89 | LUA_ASSERT(L_, L_ == _lane->L); // this function is exported in a lane's state, therefore it is callable only from inside the Lane's state | 89 | LUA_ASSERT(L_, L_ == _lane->L); // this function is exported in a lane's state, therefore it is callable only from inside the Lane's state |
| 90 | if (lua_gettop(L_) == 1) { | 90 | if (lua_gettop(L_) == 1) { |
| 91 | lua_settop(L_, 1); | 91 | lua_settop(L_, 1); |
| 92 | STACK_CHECK_START_REL(L_, 0); | 92 | STACK_CHECK_START_REL(L_, 0); |
| 93 | _lane->storeDebugName(luaG_tostring(L_, kIdxTop)); | 93 | _lane->storeDebugName(luaW_tostring(L_, kIdxTop)); |
| 94 | _lane->applyDebugName(); | 94 | _lane->applyDebugName(); |
| 95 | STACK_CHECK(L_, 0); | 95 | STACK_CHECK(L_, 0); |
| 96 | return 0; | 96 | return 0; |
| 97 | } else if (lua_gettop(L_) == 0) { | 97 | } else if (lua_gettop(L_) == 0) { |
| 98 | luaG_pushstring(L_, _lane->getDebugName()); | 98 | luaW_pushstring(L_, _lane->getDebugName()); |
| 99 | return 1; | 99 | return 1; |
| 100 | } else { | 100 | } else { |
| 101 | raise_luaL_error(L_, "Wrong number of arguments"); | 101 | raise_luaL_error(L_, "Wrong number of arguments"); |
| @@ -117,7 +117,7 @@ static LUAG_FUNC(lane_join) | |||
| 117 | Lane* const _lane{ ToLane(L_, StackIndex{ 1 }) }; | 117 | Lane* const _lane{ ToLane(L_, StackIndex{ 1 }) }; |
| 118 | 118 | ||
| 119 | std::chrono::time_point<std::chrono::steady_clock> _until{ std::chrono::time_point<std::chrono::steady_clock>::max() }; | 119 | std::chrono::time_point<std::chrono::steady_clock> _until{ std::chrono::time_point<std::chrono::steady_clock>::max() }; |
| 120 | if (luaG_type(L_, StackIndex{ 2 }) == LuaType::NUMBER) { // we don't want to use lua_isnumber() because of autocoercion | 120 | if (luaW_type(L_, StackIndex{ 2 }) == LuaType::NUMBER) { // we don't want to use lua_isnumber() because of autocoercion |
| 121 | lua_Duration const duration{ lua_tonumber(L_, 2) }; | 121 | lua_Duration const duration{ lua_tonumber(L_, 2) }; |
| 122 | if (duration.count() >= 0.0) { | 122 | if (duration.count() >= 0.0) { |
| 123 | _until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(duration); | 123 | _until = std::chrono::steady_clock::now() + std::chrono::duration_cast<std::chrono::steady_clock::duration>(duration); |
| @@ -237,13 +237,13 @@ static int lane_index_string(lua_State* L_) | |||
| 237 | Lane* const _lane{ ToLane(L_, kIdxSelf) }; | 237 | Lane* const _lane{ ToLane(L_, kIdxSelf) }; |
| 238 | LUA_ASSERT(L_, lua_gettop(L_) == 2); // L_: lane "key" | 238 | LUA_ASSERT(L_, lua_gettop(L_) == 2); // L_: lane "key" |
| 239 | 239 | ||
| 240 | std::string_view const _keystr{ luaG_tostring(L_, kIdxKey) }; | 240 | std::string_view const _keystr{ luaW_tostring(L_, kIdxKey) }; |
| 241 | lua_settop(L_, 2); // keep only our original arguments on the stack | 241 | lua_settop(L_, 2); // keep only our original arguments on the stack |
| 242 | 242 | ||
| 243 | // look in metatable first | 243 | // look in metatable first |
| 244 | lua_getmetatable(L_, kIdxSelf); // L_: lane "key" mt | 244 | lua_getmetatable(L_, kIdxSelf); // L_: lane "key" mt |
| 245 | lua_replace(L_, -3); // L_: mt "key" | 245 | lua_replace(L_, -3); // L_: mt "key" |
| 246 | if (luaG_rawget(L_, StackIndex{ -2 }) != LuaType::NIL) { // found something? // L_: mt value | 246 | if (luaW_rawget(L_, StackIndex{ -2 }) != LuaType::NIL) { // found something? // L_: mt value |
| 247 | return 1; // done | 247 | return 1; // done |
| 248 | } | 248 | } |
| 249 | 249 | ||
| @@ -269,7 +269,7 @@ static LUAG_FUNC(lane_index) | |||
| 269 | Lane* const _lane{ ToLane(L_, kIdxSelf) }; | 269 | Lane* const _lane{ ToLane(L_, kIdxSelf) }; |
| 270 | LUA_ASSERT(L_, lua_gettop(L_) == 2); | 270 | LUA_ASSERT(L_, lua_gettop(L_) == 2); |
| 271 | 271 | ||
| 272 | switch (luaG_type(L_, kKey)) { | 272 | switch (luaW_type(L_, kKey)) { |
| 273 | case LuaType::NUMBER: | 273 | case LuaType::NUMBER: |
| 274 | return lane_index_number(L_); // stack modification is undefined, returned value is at the top | 274 | return lane_index_number(L_); // stack modification is undefined, returned value is at the top |
| 275 | 275 | ||
| @@ -279,19 +279,19 @@ static LUAG_FUNC(lane_index) | |||
| 279 | default: // unknown key | 279 | default: // unknown key |
| 280 | lua_getmetatable(L_, kIdxSelf); // L_: mt | 280 | lua_getmetatable(L_, kIdxSelf); // L_: mt |
| 281 | kCachedError.pushKey(L_); // L_: mt kCachedError | 281 | kCachedError.pushKey(L_); // L_: mt kCachedError |
| 282 | if (luaG_rawget(L_, StackIndex{ -2 }) != LuaType::FUNCTION) { // L_: mt error() | 282 | if (luaW_rawget(L_, StackIndex{ -2 }) != LuaType::FUNCTION) { // L_: mt error() |
| 283 | raise_luaL_error(L_, "INTERNAL ERROR: cached error() is a %s, not a function", luaG_typename(L_, kIdxTop).data()); | 283 | raise_luaL_error(L_, "INTERNAL ERROR: cached error() is a %s, not a function", luaW_typename(L_, kIdxTop).data()); |
| 284 | } | 284 | } |
| 285 | luaG_pushstring(L_, "Unknown key: "); // L_: mt error() "Unknown key: " | 285 | luaW_pushstring(L_, "Unknown key: "); // L_: mt error() "Unknown key: " |
| 286 | kCachedTostring.pushKey(L_); // L_: mt error() "Unknown key: " kCachedTostring | 286 | kCachedTostring.pushKey(L_); // L_: mt error() "Unknown key: " kCachedTostring |
| 287 | if (luaG_rawget(L_, StackIndex{ -4 }) != LuaType::FUNCTION) { // L_: mt error() "Unknown key: " tostring() | 287 | if (luaW_rawget(L_, StackIndex{ -4 }) != LuaType::FUNCTION) { // L_: mt error() "Unknown key: " tostring() |
| 288 | raise_luaL_error(L_, "INTERNAL ERROR: cached tostring() is a %s, not a function", luaG_typename(L_, kIdxTop).data()); | 288 | raise_luaL_error(L_, "INTERNAL ERROR: cached tostring() is a %s, not a function", luaW_typename(L_, kIdxTop).data()); |
| 289 | } | 289 | } |
| 290 | lua_pushvalue(L_, kKey); // L_: mt error() "Unknown key: " tostring() k | 290 | lua_pushvalue(L_, kKey); // L_: mt error() "Unknown key: " tostring() k |
| 291 | lua_call(L_, 1, 1); // L_: mt error() "Unknown key: " "k" | 291 | lua_call(L_, 1, 1); // L_: mt error() "Unknown key: " "k" |
| 292 | lua_concat(L_, 2); // L_: mt error() "Unknown key: <k>" | 292 | lua_concat(L_, 2); // L_: mt error() "Unknown key: <k>" |
| 293 | lua_call(L_, 1, 0); // error( "Unknown key: " .. key) -> doesn't return // L_: mt | 293 | lua_call(L_, 1, 0); // error( "Unknown key: " .. key) -> doesn't return // L_: mt |
| 294 | raise_luaL_error(L_, "%s[%s]: should not get here!", _lane->getDebugName().data(), luaG_typename(L_, kKey).data()); | 294 | raise_luaL_error(L_, "%s[%s]: should not get here!", _lane->getDebugName().data(), luaW_typename(L_, kKey).data()); |
| 295 | } | 295 | } |
| 296 | } | 296 | } |
| 297 | 297 | ||
| @@ -382,7 +382,7 @@ int Lane::LuaErrorHandler(lua_State* L_) | |||
| 382 | // table of { "sourcefile.lua:<line>", ... } | 382 | // table of { "sourcefile.lua:<line>", ... } |
| 383 | // | 383 | // |
| 384 | lua_newtable(L_); // L_: some_error {} | 384 | lua_newtable(L_); // L_: some_error {} |
| 385 | StackIndex const kIdxTraceTbl{ luaG_absindex(L_, kIdxTop) }; | 385 | StackIndex const kIdxTraceTbl{ luaW_absindex(L_, kIdxTop) }; |
| 386 | 386 | ||
| 387 | // Best to start from level 1, but in some cases it might be a C function | 387 | // Best to start from level 1, but in some cases it might be a C function |
| 388 | // and we don't get '.currentline' for that. It's okay - just keep level | 388 | // and we don't get '.currentline' for that. It's okay - just keep level |
| @@ -393,25 +393,25 @@ int Lane::LuaErrorHandler(lua_State* L_) | |||
| 393 | lua_getinfo(L_, _extended ? "Sln" : "Sl", &_ar); | 393 | lua_getinfo(L_, _extended ? "Sln" : "Sl", &_ar); |
| 394 | if (_extended) { | 394 | if (_extended) { |
| 395 | lua_newtable(L_); // L_: some_error {} {} | 395 | lua_newtable(L_); // L_: some_error {} {} |
| 396 | StackIndex const kIdxFrameTbl{ luaG_absindex(L_, kIdxTop) }; | 396 | StackIndex const kIdxFrameTbl{ luaW_absindex(L_, kIdxTop) }; |
| 397 | lua_pushstring(L_, _ar.source); // L_: some_error {} {} source | 397 | lua_pushstring(L_, _ar.source); // L_: some_error {} {} source |
| 398 | luaG_setfield(L_, kIdxFrameTbl, std::string_view{ "source" }); // L_: some_error {} {} | 398 | luaW_setfield(L_, kIdxFrameTbl, std::string_view{ "source" }); // L_: some_error {} {} |
| 399 | 399 | ||
| 400 | lua_pushinteger(L_, _ar.currentline); // L_: some_error {} {} currentline | 400 | lua_pushinteger(L_, _ar.currentline); // L_: some_error {} {} currentline |
| 401 | luaG_setfield(L_, kIdxFrameTbl, std::string_view{ "currentline" }); // L_: some_error {} {} | 401 | luaW_setfield(L_, kIdxFrameTbl, std::string_view{ "currentline" }); // L_: some_error {} {} |
| 402 | 402 | ||
| 403 | lua_pushstring(L_, _ar.name ? _ar.name : "<?>"); // L_: some_error {} {} name | 403 | lua_pushstring(L_, _ar.name ? _ar.name : "<?>"); // L_: some_error {} {} name |
| 404 | luaG_setfield(L_, kIdxFrameTbl, std::string_view{ "name" }); // L_: some_error {} {} | 404 | luaW_setfield(L_, kIdxFrameTbl, std::string_view{ "name" }); // L_: some_error {} {} |
| 405 | 405 | ||
| 406 | lua_pushstring(L_, _ar.namewhat); // L_: some_error {} {} namewhat | 406 | lua_pushstring(L_, _ar.namewhat); // L_: some_error {} {} namewhat |
| 407 | luaG_setfield(L_, kIdxFrameTbl, std::string_view{ "namewhat" }); // L_: some_error {} {} | 407 | luaW_setfield(L_, kIdxFrameTbl, std::string_view{ "namewhat" }); // L_: some_error {} {} |
| 408 | 408 | ||
| 409 | lua_pushstring(L_, _ar.what); // L_: some_error {} {} what | 409 | lua_pushstring(L_, _ar.what); // L_: some_error {} {} what |
| 410 | luaG_setfield(L_, kIdxFrameTbl, std::string_view{ "what" }); // L_: some_error {} {} | 410 | luaW_setfield(L_, kIdxFrameTbl, std::string_view{ "what" }); // L_: some_error {} {} |
| 411 | } else if (_ar.currentline > 0) { | 411 | } else if (_ar.currentline > 0) { |
| 412 | luaG_pushstring(L_, "%s:%d", _ar.short_src, _ar.currentline); // L_: some_error {} "blah:blah" | 412 | luaW_pushstring(L_, "%s:%d", _ar.short_src, _ar.currentline); // L_: some_error {} "blah:blah" |
| 413 | } else { | 413 | } else { |
| 414 | luaG_pushstring(L_, "%s:?", _ar.short_src); // L_: some_error {} "blah" | 414 | luaW_pushstring(L_, "%s:?", _ar.short_src); // L_: some_error {} "blah" |
| 415 | } | 415 | } |
| 416 | lua_rawseti(L_, kIdxTraceTbl, static_cast<lua_Integer>(_n)); // L_: some_error {} | 416 | lua_rawseti(L_, kIdxTraceTbl, static_cast<lua_Integer>(_n)); // L_: some_error {} |
| 417 | } | 417 | } |
| @@ -448,7 +448,7 @@ static int PushStackTrace(lua_State* const L_, Lane::ErrorTraceLevel const error | |||
| 448 | 448 | ||
| 449 | // For cancellation the error message is kCancelError, and a stack trace isn't placed | 449 | // For cancellation the error message is kCancelError, and a stack trace isn't placed |
| 450 | // For other errors, the message can be whatever was thrown, and we should have a stack trace table | 450 | // For other errors, the message can be whatever was thrown, and we should have a stack trace table |
| 451 | LUA_ASSERT(L_, luaG_type(L_, StackIndex{ 1 + stk_base_ }) == (kCancelError.equals(L_, stk_base_) ? LuaType::NIL : LuaType::TABLE)); | 451 | LUA_ASSERT(L_, luaW_type(L_, StackIndex{ 1 + stk_base_ }) == (kCancelError.equals(L_, stk_base_) ? LuaType::NIL : LuaType::TABLE)); |
| 452 | // Just leaving the stack trace table on the stack is enough to get it through to the master. | 452 | // Just leaving the stack trace table on the stack is enough to get it through to the master. |
| 453 | } else { | 453 | } else { |
| 454 | // any kind of error can be thrown with error(), or through a lane/linda cancellation | 454 | // any kind of error can be thrown with error(), or through a lane/linda cancellation |
| @@ -460,7 +460,7 @@ static int PushStackTrace(lua_State* const L_, Lane::ErrorTraceLevel const error | |||
| 460 | case LuaError::ERRERR: // error while running the error handler (if any, for example an out-of-memory condition) | 460 | case LuaError::ERRERR: // error while running the error handler (if any, for example an out-of-memory condition) |
| 461 | default: | 461 | default: |
| 462 | // the Lua core provides a string error message in those situations | 462 | // the Lua core provides a string error message in those situations |
| 463 | LUA_ASSERT(L_, (lua_gettop(L_) == stk_base_) && (luaG_type(L_, stk_base_) == LuaType::STRING)); | 463 | LUA_ASSERT(L_, (lua_gettop(L_) == stk_base_) && (luaW_type(L_, stk_base_) == LuaType::STRING)); |
| 464 | break; | 464 | break; |
| 465 | } | 465 | } |
| 466 | return lua_gettop(L_) - _top; // either 0 or 1 | 466 | return lua_gettop(L_) - _top; // either 0 or 1 |
| @@ -509,7 +509,7 @@ static LuaError run_finalizers(Lane* const lane_, Lane::ErrorTraceLevel const er | |||
| 509 | LUA_ASSERT(_L, lua_isfunction(_L, -1)); | 509 | LUA_ASSERT(_L, lua_isfunction(_L, -1)); |
| 510 | if (lua_rc_ != LuaError::OK) { // we have <error>, [trace] on the thread stack | 510 | if (lua_rc_ != LuaError::OK) { // we have <error>, [trace] on the thread stack |
| 511 | LUA_ASSERT(_L, lane_->nresults == 1 || lane_->nresults == 2); | 511 | LUA_ASSERT(_L, lane_->nresults == 1 || lane_->nresults == 2); |
| 512 | //std::string_view const _err_msg{ luaG_tostring(_L, 1) }; | 512 | //std::string_view const _err_msg{ luaW_tostring(_L, 1) }; |
| 513 | if (lane_->isCoroutine()) { | 513 | if (lane_->isCoroutine()) { |
| 514 | // transfer them on the main state | 514 | // transfer them on the main state |
| 515 | lua_pushvalue(lane_->L, 1); | 515 | lua_pushvalue(lane_->L, 1); |
| @@ -561,7 +561,7 @@ static LuaError run_finalizers(Lane* const lane_, Lane::ErrorTraceLevel const er | |||
| 561 | 561 | ||
| 562 | if (lane_->isCoroutine()) { | 562 | if (lane_->isCoroutine()) { |
| 563 | // only the coroutine thread should remain on the master state when we are done | 563 | // only the coroutine thread should remain on the master state when we are done |
| 564 | LUA_ASSERT(_L, lua_gettop(_L) == 1 && luaG_type(_L, StackIndex{ 1 }) == LuaType::THREAD); | 564 | LUA_ASSERT(_L, lua_gettop(_L) == 1 && luaW_type(_L, StackIndex{ 1 }) == LuaType::THREAD); |
| 565 | } | 565 | } |
| 566 | 566 | ||
| 567 | return _rc; | 567 | return _rc; |
| @@ -674,7 +674,7 @@ static void lane_main(Lane* const lane_) | |||
| 674 | do { | 674 | do { |
| 675 | // starting with Lua 5.4, lua_resume can leave more stuff on the stack below the actual yielded values. | 675 | // starting with Lua 5.4, lua_resume can leave more stuff on the stack below the actual yielded values. |
| 676 | // that's why we have lane_->nresults | 676 | // that's why we have lane_->nresults |
| 677 | _rc = luaG_resume(_L, nullptr, _nargs, &lane_->nresults); // L: ... retvals|err... | 677 | _rc = luaW_resume(_L, nullptr, _nargs, &lane_->nresults); // L: ... retvals|err... |
| 678 | if (_rc == LuaError::YIELD) { | 678 | if (_rc == LuaError::YIELD) { |
| 679 | // on the stack we find the values pushed by lane:resume() | 679 | // on the stack we find the values pushed by lane:resume() |
| 680 | _nargs = lua_gettop(_L); | 680 | _nargs = lua_gettop(_L); |
| @@ -748,7 +748,7 @@ static void lane_main(Lane* const lane_) | |||
| 748 | // in case of error and if it exists, fetch stack trace from registry and push it | 748 | // in case of error and if it exists, fetch stack trace from registry and push it |
| 749 | lane_->nresults += PushStackTrace(_L, lane_->errorTraceLevel, _rc, StackIndex{ 1 }); // L: retvals|error [trace] | 749 | lane_->nresults += PushStackTrace(_L, lane_->errorTraceLevel, _rc, StackIndex{ 1 }); // L: retvals|error [trace] |
| 750 | 750 | ||
| 751 | DEBUGSPEW_CODE(DebugSpew(lane_->U) << "Lane " << _L << " body: " << GetErrcodeName(_rc) << " (" << (kCancelError.equals(_L, StackIndex{ 1 }) ? "cancelled" : luaG_typename(_L, StackIndex{ 1 })) << ")" << std::endl); | 751 | DEBUGSPEW_CODE(DebugSpew(lane_->U) << "Lane " << _L << " body: " << GetErrcodeName(_rc) << " (" << (kCancelError.equals(_L, StackIndex{ 1 }) ? "cancelled" : luaW_typename(_L, StackIndex{ 1 })) << ")" << std::endl); |
| 752 | // Call finalizers, if the script has set them up. | 752 | // Call finalizers, if the script has set them up. |
| 753 | // If the lane is not a coroutine, there is only a regular state, so everything is the same whether we use S or L. | 753 | // If the lane is not a coroutine, there is only a regular state, so everything is the same whether we use S or L. |
| 754 | // If the lane is a coroutine, this has to be done from the master state (S), not the thread (L), because we can't lua_pcall in a thread state | 754 | // If the lane is a coroutine, this has to be done from the master state (S), not the thread (L), because we can't lua_pcall in a thread state |
| @@ -797,7 +797,7 @@ static LUAG_FUNC(lane_close) | |||
| 797 | lua_settop(L_, 1); // L_: lane | 797 | lua_settop(L_, 1); // L_: lane |
| 798 | 798 | ||
| 799 | // no error if the lane body doesn't return a non-nil first value | 799 | // no error if the lane body doesn't return a non-nil first value |
| 800 | luaG_pushstring(L_, "close"); // L_: lane "close" | 800 | luaW_pushstring(L_, "close"); // L_: lane "close" |
| 801 | lua_pushcclosure(L_, LG_lane_join, 1); // L_: lane join() | 801 | lua_pushcclosure(L_, LG_lane_join, 1); // L_: lane join() |
| 802 | lua_insert(L_, 1); // L_: join() lane | 802 | lua_insert(L_, 1); // L_: join() lane |
| 803 | lua_call(L_, 1, LUA_MULTRET); // L_: join() results | 803 | lua_call(L_, 1, LUA_MULTRET); // L_: join() results |
| @@ -827,9 +827,9 @@ static LUAG_FUNC(lane_gc) | |||
| 827 | // if there a gc callback? | 827 | // if there a gc callback? |
| 828 | lua_getiuservalue(L_, StackIndex{ 1 }, UserValueIndex{ 1 }); // L_: ud uservalue | 828 | lua_getiuservalue(L_, StackIndex{ 1 }, UserValueIndex{ 1 }); // L_: ud uservalue |
| 829 | kLaneGC.pushKey(L_); // L_: ud uservalue __gc | 829 | kLaneGC.pushKey(L_); // L_: ud uservalue __gc |
| 830 | if (luaG_rawget(L_, StackIndex{ -2 }) != LuaType::NIL) { // L_: ud uservalue gc_cb|nil | 830 | if (luaW_rawget(L_, StackIndex{ -2 }) != LuaType::NIL) { // L_: ud uservalue gc_cb|nil |
| 831 | lua_remove(L_, -2); // L_: ud gc_cb|nil | 831 | lua_remove(L_, -2); // L_: ud gc_cb|nil |
| 832 | luaG_pushstring(L_, _lane->getDebugName()); // L_: ud gc_cb name | 832 | luaW_pushstring(L_, _lane->getDebugName()); // L_: ud gc_cb name |
| 833 | _have_gc_cb = true; | 833 | _have_gc_cb = true; |
| 834 | } else { | 834 | } else { |
| 835 | lua_pop(L_, 2); // L_: ud | 835 | lua_pop(L_, 2); // L_: ud |
| @@ -840,7 +840,7 @@ static LUAG_FUNC(lane_gc) | |||
| 840 | // still running: will have to be cleaned up later | 840 | // still running: will have to be cleaned up later |
| 841 | _lane->selfdestructAdd(); | 841 | _lane->selfdestructAdd(); |
| 842 | if (_have_gc_cb) { | 842 | if (_have_gc_cb) { |
| 843 | luaG_pushstring(L_, "selfdestruct"); // L_: ud gc_cb name status | 843 | luaW_pushstring(L_, "selfdestruct"); // L_: ud gc_cb name status |
| 844 | lua_call(L_, 2, 0); // L_: ud | 844 | lua_call(L_, 2, 0); // L_: ud |
| 845 | } | 845 | } |
| 846 | return 0; | 846 | return 0; |
| @@ -855,7 +855,7 @@ static LUAG_FUNC(lane_gc) | |||
| 855 | 855 | ||
| 856 | // do this after lane cleanup in case the callback triggers an error | 856 | // do this after lane cleanup in case the callback triggers an error |
| 857 | if (_have_gc_cb) { | 857 | if (_have_gc_cb) { |
| 858 | luaG_pushstring(L_, "closed"); // L_: ud gc_cb name status | 858 | luaW_pushstring(L_, "closed"); // L_: ud gc_cb name status |
| 859 | lua_call(L_, 2, 0); // L_: ud | 859 | lua_call(L_, 2, 0); // L_: ud |
| 860 | } | 860 | } |
| 861 | return 0; | 861 | return 0; |
| @@ -900,7 +900,7 @@ void Lane::applyDebugName() const | |||
| 900 | { | 900 | { |
| 901 | if constexpr (HAVE_DECODA_SUPPORT()) { | 901 | if constexpr (HAVE_DECODA_SUPPORT()) { |
| 902 | // to see VM name in Decoda debugger Virtual Machine window | 902 | // to see VM name in Decoda debugger Virtual Machine window |
| 903 | luaG_pushstring(L, debugName); // L: ... "name" | 903 | luaW_pushstring(L, debugName); // L: ... "name" |
| 904 | lua_setglobal(L, "decoda_name"); // L: ... | 904 | lua_setglobal(L, "decoda_name"); // L: ... |
| 905 | } | 905 | } |
| 906 | // and finally set the OS thread name | 906 | // and finally set the OS thread name |
| @@ -1013,7 +1013,7 @@ void Lane::PushMetatable(lua_State* const L_) | |||
| 1013 | { | 1013 | { |
| 1014 | STACK_CHECK_START_REL(L_, 0); | 1014 | STACK_CHECK_START_REL(L_, 0); |
| 1015 | if (luaL_newmetatable(L_, kLaneMetatableName.data())) { // L_: mt | 1015 | if (luaL_newmetatable(L_, kLaneMetatableName.data())) { // L_: mt |
| 1016 | luaG_registerlibfuncs(L_, local::sLaneFunctions); | 1016 | luaW_registerlibfuncs(L_, local::sLaneFunctions); |
| 1017 | // cache error() and tostring() | 1017 | // cache error() and tostring() |
| 1018 | kCachedError.pushKey(L_); // L_: mt kCachedError | 1018 | kCachedError.pushKey(L_); // L_: mt kCachedError |
| 1019 | lua_getglobal(L_, "error"); // L_: mt kCachedError error() | 1019 | lua_getglobal(L_, "error"); // L_: mt kCachedError error() |
| @@ -1022,7 +1022,7 @@ void Lane::PushMetatable(lua_State* const L_) | |||
| 1022 | lua_getglobal(L_, "tostring"); // L_: mt kCachedTostring tostring() | 1022 | lua_getglobal(L_, "tostring"); // L_: mt kCachedTostring tostring() |
| 1023 | lua_rawset(L_, -3); // L_: mt | 1023 | lua_rawset(L_, -3); // L_: mt |
| 1024 | // hide the actual metatable from getmetatable() | 1024 | // hide the actual metatable from getmetatable() |
| 1025 | luaG_pushstring(L_, kLaneMetatableName); // L_: mt "Lane" | 1025 | luaW_pushstring(L_, kLaneMetatableName); // L_: mt "Lane" |
| 1026 | lua_setfield(L_, -2, "__metatable"); // L_: mt | 1026 | lua_setfield(L_, -2, "__metatable"); // L_: mt |
| 1027 | } | 1027 | } |
| 1028 | STACK_CHECK(L_, 1); | 1028 | STACK_CHECK(L_, 1); |
| @@ -1035,7 +1035,7 @@ void Lane::pushStatusString(lua_State* const L_) const | |||
| 1035 | std::string_view const _str{ threadStatusString() }; | 1035 | std::string_view const _str{ threadStatusString() }; |
| 1036 | LUA_ASSERT(L_, !_str.empty()); | 1036 | LUA_ASSERT(L_, !_str.empty()); |
| 1037 | 1037 | ||
| 1038 | luaG_pushstring(L_, _str); | 1038 | luaW_pushstring(L_, _str); |
| 1039 | } | 1039 | } |
| 1040 | 1040 | ||
| 1041 | // ################################################################################################# | 1041 | // ################################################################################################# |
| @@ -1175,7 +1175,7 @@ std::string_view Lane::pushErrorTraceLevel(lua_State* L_) const | |||
| 1175 | std::string_view const _str{ errorTraceLevelString() }; | 1175 | std::string_view const _str{ errorTraceLevelString() }; |
| 1176 | LUA_ASSERT(L_, !_str.empty()); | 1176 | LUA_ASSERT(L_, !_str.empty()); |
| 1177 | 1177 | ||
| 1178 | return luaG_pushstring(L_, _str); | 1178 | return luaW_pushstring(L_, _str); |
| 1179 | } | 1179 | } |
| 1180 | 1180 | ||
| 1181 | // ################################################################################################# | 1181 | // ################################################################################################# |
| @@ -1186,7 +1186,7 @@ void Lane::resetResultsStorage(lua_State* const L_, StackIndex const self_idx_) | |||
| 1186 | { | 1186 | { |
| 1187 | STACK_GROW(L_, 4); | 1187 | STACK_GROW(L_, 4); |
| 1188 | STACK_CHECK_START_REL(L_, 0); | 1188 | STACK_CHECK_START_REL(L_, 0); |
| 1189 | StackIndex const _self_idx{ luaG_absindex(L_, self_idx_) }; | 1189 | StackIndex const _self_idx{ luaW_absindex(L_, self_idx_) }; |
| 1190 | LUA_ASSERT(L_, ToLane(L_, _self_idx) == this); // L_: ... self ... | 1190 | LUA_ASSERT(L_, ToLane(L_, _self_idx) == this); // L_: ... self ... |
| 1191 | // create the new table | 1191 | // create the new table |
| 1192 | lua_newtable(L_); // L_: ... self ... {} | 1192 | lua_newtable(L_); // L_: ... self ... {} |
| @@ -1220,7 +1220,7 @@ void Lane::securizeDebugName(lua_State* const L_) | |||
| 1220 | lua_newtable(L_); // L_: lane ... {uv} {} | 1220 | lua_newtable(L_); // L_: lane ... {uv} {} |
| 1221 | { | 1221 | { |
| 1222 | std::lock_guard<std::mutex> _guard{ debugNameMutex }; | 1222 | std::lock_guard<std::mutex> _guard{ debugNameMutex }; |
| 1223 | debugName = luaG_pushstring(L_, debugName); // L_: lane ... {uv} {} name | 1223 | debugName = luaW_pushstring(L_, debugName); // L_: lane ... {uv} {} name |
| 1224 | } | 1224 | } |
| 1225 | lua_rawset(L_, -3); // L_: lane ... {uv} | 1225 | lua_rawset(L_, -3); // L_: lane ... {uv} |
| 1226 | lua_pop(L_, 1); // L_: lane | 1226 | lua_pop(L_, 1); // L_: lane |
| @@ -1243,13 +1243,13 @@ void Lane::storeDebugName(std::string_view const& name_) | |||
| 1243 | { | 1243 | { |
| 1244 | STACK_CHECK_START_REL(L, 0); | 1244 | STACK_CHECK_START_REL(L, 0); |
| 1245 | // store a hidden reference in the registry to make sure the string is kept around even if a lane decides to manually change the "decoda_name" global... | 1245 | // store a hidden reference in the registry to make sure the string is kept around even if a lane decides to manually change the "decoda_name" global... |
| 1246 | kLaneNameRegKey.setValue(L, [name = name_](lua_State* L_) { luaG_pushstring(L_, name); }); | 1246 | kLaneNameRegKey.setValue(L, [name = name_](lua_State* L_) { luaW_pushstring(L_, name); }); |
| 1247 | STACK_CHECK(L, 0); | 1247 | STACK_CHECK(L, 0); |
| 1248 | kLaneNameRegKey.pushValue(L); // L: ... "name" ... | 1248 | kLaneNameRegKey.pushValue(L); // L: ... "name" ... |
| 1249 | // keep a direct view on the stored string | 1249 | // keep a direct view on the stored string |
| 1250 | { | 1250 | { |
| 1251 | std::lock_guard<std::mutex> _guard{ debugNameMutex }; | 1251 | std::lock_guard<std::mutex> _guard{ debugNameMutex }; |
| 1252 | debugName = luaG_tostring(L, kIdxTop); | 1252 | debugName = luaW_tostring(L, kIdxTop); |
| 1253 | } | 1253 | } |
| 1254 | lua_pop(L, 1); | 1254 | lua_pop(L, 1); |
| 1255 | STACK_CHECK(L, 0); | 1255 | STACK_CHECK(L, 0); |
| @@ -1283,7 +1283,7 @@ int Lane::storeResults(lua_State* const L_) | |||
| 1283 | default: | 1283 | default: |
| 1284 | // this is an internal error, we probably never get here | 1284 | // this is an internal error, we probably never get here |
| 1285 | lua_settop(L_, 0); // L_: | 1285 | lua_settop(L_, 0); // L_: |
| 1286 | luaG_pushstring(L_, "Unexpected status: "); // L_: "Unexpected status: " | 1286 | luaW_pushstring(L_, "Unexpected status: "); // L_: "Unexpected status: " |
| 1287 | pushStatusString(L_); // L_: "Unexpected status: " "<status>" | 1287 | pushStatusString(L_); // L_: "Unexpected status: " "<status>" |
| 1288 | lua_concat(L_, 2); // L_: "Unexpected status: <status>" | 1288 | lua_concat(L_, 2); // L_: "Unexpected status: <status>" |
| 1289 | raise_lua_error(L_); | 1289 | raise_lua_error(L_); |
| @@ -1421,7 +1421,7 @@ bool Lane::waitForJoin(lua_State* const L_, std::chrono::time_point<std::chrono: | |||
| 1421 | 1421 | ||
| 1422 | if (!_done) { | 1422 | if (!_done) { |
| 1423 | lua_pushnil(L_); // L_: lane nil | 1423 | lua_pushnil(L_); // L_: lane nil |
| 1424 | luaG_pushstring(L_, "timeout"); // L_: lane nil "timeout" | 1424 | luaW_pushstring(L_, "timeout"); // L_: lane nil "timeout" |
| 1425 | return false; | 1425 | return false; |
| 1426 | } | 1426 | } |
| 1427 | } | 1427 | } |
| @@ -1437,7 +1437,7 @@ bool Lane::waitForJoin(lua_State* const L_, std::chrono::time_point<std::chrono: | |||
| 1437 | 1437 | ||
| 1438 | if (!_done) { | 1438 | if (!_done) { |
| 1439 | lua_pushnil(L_); // L_: lane nil | 1439 | lua_pushnil(L_); // L_: lane nil |
| 1440 | luaG_pushstring(L_, "timeout"); // L_: lane nil "timeout" | 1440 | luaW_pushstring(L_, "timeout"); // L_: lane nil "timeout" |
| 1441 | return false; | 1441 | return false; |
| 1442 | } | 1442 | } |
| 1443 | } | 1443 | } |
