aboutsummaryrefslogtreecommitdiff
path: root/src/tools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools.cpp')
-rw-r--r--src/tools.cpp38
1 files changed, 24 insertions, 14 deletions
diff --git a/src/tools.cpp b/src/tools.cpp
index 9207df6..aa95f04 100644
--- a/src/tools.cpp
+++ b/src/tools.cpp
@@ -1415,7 +1415,7 @@ static void copy_cached_func(Universe* U, Dest L2, int L2_cache_i, Source L, int
1415 lua_pop(L2, 1); // _R[REG_MTID] 1415 lua_pop(L2, 1); // _R[REG_MTID]
1416 if (!inter_copy_one(U, L2, L2_cache_i, L, lua_gettop(L), VT::METATABLE, mode_, upName_)) // _R[REG_MTID] mt? 1416 if (!inter_copy_one(U, L2, L2_cache_i, L, lua_gettop(L), VT::METATABLE, mode_, upName_)) // _R[REG_MTID] mt?
1417 { 1417 {
1418 std::ignore = luaL_error(L, "Error copying a metatable"); // doesn't return 1418 luaL_error(L, "Error copying a metatable"); // doesn't return
1419 } 1419 }
1420 1420
1421 STACK_CHECK(L2, 2); // _R[REG_MTID] mt 1421 STACK_CHECK(L2, 2); // _R[REG_MTID] mt
@@ -1600,7 +1600,7 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
1600 { 1600 {
1601 if (!inter_copy_one(U, L2, L2_cache_i, L, lua_absindex(L, -1), VT::NORMAL, mode_, upName_)) // ... u uv 1601 if (!inter_copy_one(U, L2, L2_cache_i, L, lua_absindex(L, -1), VT::NORMAL, mode_, upName_)) // ... u uv
1602 { 1602 {
1603 std::ignore = luaL_error(L, "Cannot copy upvalue type '%s'", luaL_typename(L, -1)); // doesn't return 1603 luaL_error(L, "Cannot copy upvalue type '%s'", luaL_typename(L, -1)); // doesn't return
1604 } 1604 }
1605 lua_pop( L, 1); // ... mt __lanesclone [uv]* 1605 lua_pop( L, 1); // ... mt __lanesclone [uv]*
1606 // this pops the value from the stack 1606 // this pops the value from the stack
@@ -1670,7 +1670,7 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
1670 } 1670 }
1671 else // raise an error 1671 else // raise an error
1672 { 1672 {
1673 std::ignore = luaL_error(L, "can't copy non-deep full userdata across lanes"); // doesn't return 1673 luaL_error(L, "can't copy non-deep full userdata across lanes"); // doesn't return
1674 } 1674 }
1675 1675
1676 STACK_CHECK(L2, 1); 1676 STACK_CHECK(L2, 1);
@@ -1739,7 +1739,7 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
1739 { 1739 {
1740 if (!inter_copy_one(U, L2, L2_cache_i, L, lua_absindex(L, -1), vt_, mode_, upName_)) // ... mt u uv 1740 if (!inter_copy_one(U, L2, L2_cache_i, L, lua_absindex(L, -1), vt_, mode_, upName_)) // ... mt u uv
1741 { 1741 {
1742 std::ignore = luaL_error(L, "Cannot copy upvalue type '%s'", luaL_typename(L, -1)); // doesn't return 1742 luaL_error(L, "Cannot copy upvalue type '%s'", luaL_typename(L, -1)); // doesn't return
1743 } 1743 }
1744 lua_pop(L, 1); // ... u [uv]* 1744 lua_pop(L, 1); // ... u [uv]*
1745 // this pops the value from the stack 1745 // this pops the value from the stack
@@ -1973,7 +1973,7 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
1973* 1973*
1974* Note: Parameters are in this order ('L' = from first) to be same as 'lua_xmove'. 1974* Note: Parameters are in this order ('L' = from first) to be same as 'lua_xmove'.
1975*/ 1975*/
1976[[nodiscard]] int luaG_inter_copy(Universe* U, Source L, Dest L2, int n, LookupMode mode_) 1976[[nodiscard]] InterCopyResult luaG_inter_copy(Universe* U, Source L, Dest L2, int n, LookupMode mode_)
1977{ 1977{
1978 int const top_L{ lua_gettop(L) }; // ... {}n 1978 int const top_L{ lua_gettop(L) }; // ... {}n
1979 int const top_L2{ lua_gettop(L2) }; // ... 1979 int const top_L2{ lua_gettop(L2) }; // ...
@@ -1988,7 +1988,7 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
1988 // requesting to copy more than is available? 1988 // requesting to copy more than is available?
1989 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "nothing to copy()\n" INDENT_END)); 1989 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "nothing to copy()\n" INDENT_END));
1990 DEBUGSPEW_CODE(U->debugspew_indent_depth.fetch_sub(1, std::memory_order_relaxed)); 1990 DEBUGSPEW_CODE(U->debugspew_indent_depth.fetch_sub(1, std::memory_order_relaxed));
1991 return -1; 1991 return InterCopyResult::NotEnoughValues;
1992 } 1992 }
1993 1993
1994 STACK_CHECK_START_REL(L2, 0); 1994 STACK_CHECK_START_REL(L2, 0);
@@ -2025,25 +2025,31 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
2025 // Remove the cache table. Persistent caching would cause i.e. multiple 2025 // Remove the cache table. Persistent caching would cause i.e. multiple
2026 // messages passed in the same table to use the same table also in receiving end. 2026 // messages passed in the same table to use the same table also in receiving end.
2027 lua_remove(L2, top_L2 + 1); 2027 lua_remove(L2, top_L2 + 1);
2028 return 0; 2028 return InterCopyResult::Success;
2029 } 2029 }
2030 2030
2031 // error -> pop everything from the target state stack 2031 // error -> pop everything from the target state stack
2032 lua_settop(L2, top_L2); 2032 lua_settop(L2, top_L2);
2033 STACK_CHECK(L2, 0); 2033 STACK_CHECK(L2, 0);
2034 return -2; 2034 return InterCopyResult::Error;
2035} 2035}
2036 2036
2037// ################################################################################################# 2037// #################################################################################################
2038 2038
2039[[nodiscard]] int luaG_inter_move(Universe* U, Source L, Dest L2, int n, LookupMode mode_) 2039[[nodiscard]] InterCopyResult luaG_inter_move(Universe* U, Source L, Dest L2, int n_, LookupMode mode_)
2040{ 2040{
2041 int const ret{ luaG_inter_copy(U, L, L2, n, mode_) }; 2041 InterCopyResult const ret{ luaG_inter_copy(U, L, L2, n_, mode_) };
2042 lua_pop( L, n); 2042 lua_pop( L, n_);
2043 return ret; 2043 return ret;
2044} 2044}
2045 2045
2046[[nodiscard]] int luaG_inter_copy_package(Universe* U, Source L, Dest L2, int package_idx_, LookupMode mode_) 2046// #################################################################################################
2047
2048// transfers stuff from L->_G["package"] to L2->_G["package"]
2049// returns InterCopyResult::Success if everything is fine
2050// returns InterCopyResult::Error if pushed an error message in L
2051// else raise an error in L
2052[[nodiscard]] InterCopyResult luaG_inter_copy_package(Universe* U, Source L, Dest L2, int package_idx_, LookupMode mode_)
2047{ 2053{
2048 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "luaG_inter_copy_package()\n" INDENT_END)); 2054 DEBUGSPEW_CODE(fprintf(stderr, INDENT_BEGIN "luaG_inter_copy_package()\n" INDENT_END));
2049 DEBUGSPEW_CODE(U->debugspew_indent_depth.fetch_add(1, std::memory_order_relaxed)); 2055 DEBUGSPEW_CODE(U->debugspew_indent_depth.fetch_add(1, std::memory_order_relaxed));
@@ -2056,7 +2062,11 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
2056 lua_pushfstring(L, "expected package as table, got %s", luaL_typename(L, package_idx_)); 2062 lua_pushfstring(L, "expected package as table, got %s", luaL_typename(L, package_idx_));
2057 STACK_CHECK(L, 1); 2063 STACK_CHECK(L, 1);
2058 // raise the error when copying from lane to lane, else just leave it on the stack to be raised later 2064 // raise the error when copying from lane to lane, else just leave it on the stack to be raised later
2059 return (mode_ == LookupMode::LaneBody) ? lua_error(L) : 1; 2065 if (mode_ == LookupMode::LaneBody)
2066 {
2067 lua_error(L); // doesn't return
2068 }
2069 return InterCopyResult::Error;
2060 } 2070 }
2061 lua_getglobal(L2, "package"); 2071 lua_getglobal(L2, "package");
2062 if (!lua_isnil(L2, -1)) // package library not loaded: do nothing 2072 if (!lua_isnil(L2, -1)) // package library not loaded: do nothing
@@ -2095,5 +2105,5 @@ static constexpr UniqueKey CLONABLES_CACHE_KEY{ 0xD04EE018B3DEE8F5ull };
2095 STACK_CHECK(L2, 0); 2105 STACK_CHECK(L2, 0);
2096 STACK_CHECK(L, 0); 2106 STACK_CHECK(L, 0);
2097 DEBUGSPEW_CODE(U->debugspew_indent_depth.fetch_sub(1, std::memory_order_relaxed)); 2107 DEBUGSPEW_CODE(U->debugspew_indent_depth.fetch_sub(1, std::memory_order_relaxed));
2098 return 0; 2108 return InterCopyResult::Success;
2099} 2109}