From 4c7236f880ebaa0e503e4527479b78dd8c4254e0 Mon Sep 17 00:00:00 2001 From: FowlestOTA Date: Mon, 6 Jul 2026 15:33:53 -0400 Subject: [PATCH 1/2] fix output name --- .gitignore | 6 ++++++ lua-5.4.7/CMakeLists.txt | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f805e81..2a2d75e 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,9 @@ # Debug files *.dSYM/ *.su + +# Build directories +bin/ +build/ +dist/ +out/ \ No newline at end of file diff --git a/lua-5.4.7/CMakeLists.txt b/lua-5.4.7/CMakeLists.txt index 58cf579..ce5eff2 100644 --- a/lua-5.4.7/CMakeLists.txt +++ b/lua-5.4.7/CMakeLists.txt @@ -57,6 +57,7 @@ if(LUA_ENABLE_SHARED) target_link_libraries(lua_shared PRIVATE lua_internal PUBLIC lua_include) set_target_properties(lua_shared PROPERTIES VERSION "${PACKAGE_VERSION}" + OUTPUT_NAME "lua54" ) if(WIN32) target_compile_definitions(lua_shared PRIVATE LUA_BUILD_AS_DLL) @@ -75,6 +76,7 @@ add_library(lua_static STATIC ${LUA_LIB_SRCS}) target_link_libraries(lua_static PRIVATE lua_internal PUBLIC lua_include) set_target_properties(lua_static PROPERTIES VERSION "${PACKAGE_VERSION}" + OUTPUT_NAME "lua54" ) list(APPEND TARGETS_TO_INSTALL lua_static) if(NOT BUILD_SHARED_LIBS OR NOT LUA_ENABLE_SHARED) @@ -106,7 +108,7 @@ if(UNIX) target_compile_options(lua_internal INTERFACE "-Wall" "-Wextra" ) -elseif(Win32) +elseif(WIN32) target_compile_options(lua_internal INTERFACE "/Wall" ) @@ -121,6 +123,7 @@ if(LUA_BUILD_BINARY) target_link_libraries(lua PRIVATE lua_static) set_target_properties(lua PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} + OUTPUT_NAME "lua54" ) if (HAVE_READLINE_READLINE_H) target_compile_definitions(lua PRIVATE "LUA_USE_READLINE") @@ -134,6 +137,7 @@ if(LUA_BUILD_COMPILER) target_link_libraries(luac PRIVATE lua_static) set_target_properties(luac PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} + OUTPUT_NAME "luac54" ) list(APPEND TARGETS_TO_INSTALL luac) endif() From 7b73fc41d636c77692ae04d2283a0a0d6d11b4fb Mon Sep 17 00:00:00 2001 From: FowlestOTA Date: Sat, 22 Aug 2026 02:37:12 -0400 Subject: [PATCH 2/2] break from being a fork --- CMakeLists.txt | 182 +- .../LuaConfig.cmake.in => LuaConfig.cmake.in | 0 README.md | 12 +- include/lapi.h | 65 + {lua-5.4.7/include => include}/lauxlib.h | 46 +- {lua-5.4.7/src => include}/lcode.h | 14 +- {lua-5.4.7/src => include}/lctype.h | 0 {lua-5.4.7/src => include}/ldebug.h | 1 + {lua-5.4.7/src => include}/ldo.h | 48 +- {lua-5.4.7/src => include}/lfunc.h | 13 +- {lua-5.4.7/src => include}/lgc.h | 126 +- {lua-5.4.7/src => include}/ljumptab.h | 6 +- {lua-5.4.7/src => include}/llex.h | 8 +- {lua-5.4.7/src => include}/llimits.h | 277 +- {lua-5.4.7/src => include}/lmem.h | 13 +- {lua-5.4.7/src => include}/lobject.h | 121 +- {lua-5.4.7/src => include}/lopcodes.h | 156 +- {lua-5.4.7/src => include}/lopnames.h | 4 +- {lua-5.4.7/src => include}/lparser.h | 57 +- {lua-5.4.7/src => include}/lprefix.h | 0 {lua-5.4.7/src => include}/lstate.h | 199 +- {lua-5.4.7/src => include}/lstring.h | 32 +- include/ltable.h | 184 + {lua-5.4.7/src => include}/ltm.h | 26 +- {lua-5.4.7/include => include}/lua.h | 98 +- {lua-5.4.7/include => include}/lua.hpp | 3 +- {lua-5.4.7/include => include}/luaconf.h | 141 +- {lua-5.4.7/include => include}/lualib.h | 39 +- {lua-5.4.7/src => include}/lundump.h | 13 +- {lua-5.4.7/src => include}/lvm.h | 45 +- {lua-5.4.7/src => include}/lzio.h | 3 +- lua-5.4.7-tests/all.lua | 312 - lua-5.4.7-tests/api.lua | 1543 -- lua-5.4.7-tests/attrib.lua | 527 - lua-5.4.7-tests/big.lua | 82 - lua-5.4.7-tests/bitwise.lua | 363 - lua-5.4.7-tests/bwcoercion.lua | 78 - lua-5.4.7-tests/calls.lua | 497 - lua-5.4.7-tests/closure.lua | 272 - lua-5.4.7-tests/code.lua | 449 - lua-5.4.7-tests/constructs.lua | 406 - lua-5.4.7-tests/coroutine.lua | 1156 -- lua-5.4.7-tests/cstack.lua | 197 - lua-5.4.7-tests/db.lua | 1054 -- lua-5.4.7-tests/errors.lua | 696 - lua-5.4.7-tests/events.lua | 491 - lua-5.4.7-tests/files.lua | 951 -- lua-5.4.7-tests/gc.lua | 695 - lua-5.4.7-tests/gengc.lua | 172 - lua-5.4.7-tests/goto.lua | 271 - lua-5.4.7-tests/heavy.lua | 173 - lua-5.4.7-tests/libs/lib1.c | 44 - lua-5.4.7-tests/libs/lib11.c | 10 - lua-5.4.7-tests/libs/lib2.c | 23 - lua-5.4.7-tests/libs/lib21.c | 10 - lua-5.4.7-tests/libs/lib22.c | 25 - lua-5.4.7-tests/libs/makefile | 27 - lua-5.4.7-tests/literals.lua | 343 - lua-5.4.7-tests/locals.lua | 1181 -- lua-5.4.7-tests/ltests/ltests.c | 1983 --- lua-5.4.7-tests/ltests/ltests.h | 151 - lua-5.4.7-tests/main.lua | 563 - lua-5.4.7-tests/math.lua | 1024 -- lua-5.4.7-tests/nextvar.lua | 825 -- lua-5.4.7-tests/pm.lua | 440 - lua-5.4.7-tests/sort.lua | 311 - lua-5.4.7-tests/strings.lua | 526 - lua-5.4.7-tests/tpack.lua | 322 - lua-5.4.7-tests/tracegc.lua | 40 - lua-5.4.7-tests/utf8.lua | 259 - lua-5.4.7-tests/vararg.lua | 151 - lua-5.4.7-tests/verybig.lua | 152 - lua-5.4.7/CMakeLists.txt | 175 - lua-5.4.7/Makefile | 106 - lua-5.4.7/README | 6 - lua-5.4.7/doc/OSIApproved_100X125.png | Bin 12127 -> 0 bytes lua-5.4.7/doc/contents.html | 678 - lua-5.4.7/doc/index.css | 21 - lua-5.4.7/doc/logo.gif | Bin 9893 -> 0 bytes lua-5.4.7/doc/lua.1 | 155 - lua-5.4.7/doc/lua.css | 162 - lua-5.4.7/doc/luac.1 | 118 - lua-5.4.7/doc/manual.css | 21 - lua-5.4.7/doc/manual.html | 12060 ---------------- lua-5.4.7/doc/readme.html | 339 - lua-5.4.7/src/Makefile | 225 - lua-5.4.7/src/lapi.h | 52 - lua-5.4.7/src/ldump.c | 230 - lua-5.4.7/src/linit.c | 65 - lua-5.4.7/src/ltable.c | 995 -- lua-5.4.7/src/ltable.h | 63 - lua-5.4.7/src/lundump.c | 335 - lua-config-package-tests/CMakeLists.txt | 22 - .../lua-config-package-build-test.c | 10 - orig_sources/lua-5.4.6-tests.tar.gz | Bin 136212 -> 0 bytes orig_sources/lua-5.4.6.tar.gz | Bin 363329 -> 0 bytes orig_sources/lua-5.4.7-tests.tar.gz | Bin 136602 -> 0 bytes orig_sources/lua-5.4.7.tar.gz | Bin 374097 -> 0 bytes {lua-5.4.7/src => src}/lapi.c | 370 +- {lua-5.4.7/src => src}/lauxlib.c | 216 +- {lua-5.4.7/src => src}/lbaselib.c | 84 +- {lua-5.4.7/src => src}/lcode.c | 387 +- {lua-5.4.7/src => src}/lcorolib.c | 21 +- {lua-5.4.7/src => src}/lctype.c | 2 +- {lua-5.4.7/src => src}/ldblib.c | 14 +- {lua-5.4.7/src => src}/ldebug.c | 101 +- {lua-5.4.7/src => src}/ldo.c | 476 +- src/ldump.c | 307 + {lua-5.4.7/src => src}/lfunc.c | 82 +- {lua-5.4.7/src => src}/lgc.c | 815 +- src/linit.c | 63 + {lua-5.4.7/src => src}/liolib.c | 62 +- {lua-5.4.7/src => src}/llex.c | 85 +- {lua-5.4.7/src => src}/lmathlib.c | 134 +- {lua-5.4.7/src => src}/lmem.c | 18 +- {lua-5.4.7/src => src}/loadlib.c | 126 +- {lua-5.4.7/src => src}/lobject.c | 326 +- {lua-5.4.7/src => src}/lopcodes.c | 46 +- {lua-5.4.7/src => src}/loslib.c | 10 +- {lua-5.4.7/src => src}/lparser.c | 744 +- {lua-5.4.7/src => src}/lstate.c | 193 +- {lua-5.4.7/src => src}/lstring.c | 123 +- {lua-5.4.7/src => src}/lstrlib.c | 292 +- src/ltable.c | 1355 ++ {lua-5.4.7/src => src}/ltablib.c | 86 +- {lua-5.4.7/src => src}/ltm.c | 189 +- {lua-5.4.7/src => src}/lua.c | 160 +- {lua-5.4.7/src => src}/luac.c | 26 +- src/lundump.c | 424 + {lua-5.4.7/src => src}/lutf8lib.c | 92 +- {lua-5.4.7/src => src}/lvm.c | 553 +- {lua-5.4.7/src => src}/lzio.c | 37 +- 132 files changed, 6930 insertions(+), 37654 deletions(-) rename lua-5.4.7/LuaConfig.cmake.in => LuaConfig.cmake.in (100%) create mode 100644 include/lapi.h rename {lua-5.4.7/include => include}/lauxlib.h (90%) rename {lua-5.4.7/src => include}/lcode.h (84%) rename {lua-5.4.7/src => include}/lctype.h (100%) rename {lua-5.4.7/src => include}/ldebug.h (97%) rename {lua-5.4.7/src => include}/ldo.h (64%) rename {lua-5.4.7/src => include}/lfunc.h (79%) rename {lua-5.4.7/src => include}/lgc.h (54%) rename {lua-5.4.7/src => include}/ljumptab.h (93%) rename {lua-5.4.7/src => include}/llex.h (87%) rename {lua-5.4.7/src => include}/llimits.h (56%) rename {lua-5.4.7/src => include}/lmem.h (88%) rename {lua-5.4.7/src => include}/lobject.h (86%) rename {lua-5.4.7/src => include}/lopcodes.h (73%) rename {lua-5.4.7/src => include}/lopnames.h (97%) rename {lua-5.4.7/src => include}/lparser.h (73%) rename {lua-5.4.7/src => include}/lprefix.h (100%) rename {lua-5.4.7/src => include}/lstate.h (77%) rename {lua-5.4.7/src => include}/lstring.h (53%) create mode 100644 include/ltable.h rename {lua-5.4.7/src => include}/ltm.h (73%) rename {lua-5.4.7/include => include}/lua.h (87%) rename {lua-5.4.7/include => include}/lua.hpp (51%) rename {lua-5.4.7/include => include}/luaconf.h (84%) rename {lua-5.4.7/include => include}/lualib.h (64%) rename {lua-5.4.7/src => include}/lundump.h (72%) rename {lua-5.4.7/src => include}/lvm.h (69%) rename {lua-5.4.7/src => include}/lzio.h (92%) delete mode 100644 lua-5.4.7-tests/all.lua delete mode 100644 lua-5.4.7-tests/api.lua delete mode 100644 lua-5.4.7-tests/attrib.lua delete mode 100644 lua-5.4.7-tests/big.lua delete mode 100644 lua-5.4.7-tests/bitwise.lua delete mode 100644 lua-5.4.7-tests/bwcoercion.lua delete mode 100644 lua-5.4.7-tests/calls.lua delete mode 100644 lua-5.4.7-tests/closure.lua delete mode 100644 lua-5.4.7-tests/code.lua delete mode 100644 lua-5.4.7-tests/constructs.lua delete mode 100644 lua-5.4.7-tests/coroutine.lua delete mode 100644 lua-5.4.7-tests/cstack.lua delete mode 100644 lua-5.4.7-tests/db.lua delete mode 100644 lua-5.4.7-tests/errors.lua delete mode 100644 lua-5.4.7-tests/events.lua delete mode 100644 lua-5.4.7-tests/files.lua delete mode 100644 lua-5.4.7-tests/gc.lua delete mode 100644 lua-5.4.7-tests/gengc.lua delete mode 100644 lua-5.4.7-tests/goto.lua delete mode 100644 lua-5.4.7-tests/heavy.lua delete mode 100644 lua-5.4.7-tests/libs/lib1.c delete mode 100644 lua-5.4.7-tests/libs/lib11.c delete mode 100644 lua-5.4.7-tests/libs/lib2.c delete mode 100644 lua-5.4.7-tests/libs/lib21.c delete mode 100644 lua-5.4.7-tests/libs/lib22.c delete mode 100644 lua-5.4.7-tests/libs/makefile delete mode 100644 lua-5.4.7-tests/literals.lua delete mode 100644 lua-5.4.7-tests/locals.lua delete mode 100644 lua-5.4.7-tests/ltests/ltests.c delete mode 100644 lua-5.4.7-tests/ltests/ltests.h delete mode 100644 lua-5.4.7-tests/main.lua delete mode 100644 lua-5.4.7-tests/math.lua delete mode 100644 lua-5.4.7-tests/nextvar.lua delete mode 100644 lua-5.4.7-tests/pm.lua delete mode 100644 lua-5.4.7-tests/sort.lua delete mode 100644 lua-5.4.7-tests/strings.lua delete mode 100644 lua-5.4.7-tests/tpack.lua delete mode 100644 lua-5.4.7-tests/tracegc.lua delete mode 100644 lua-5.4.7-tests/utf8.lua delete mode 100644 lua-5.4.7-tests/vararg.lua delete mode 100644 lua-5.4.7-tests/verybig.lua delete mode 100644 lua-5.4.7/CMakeLists.txt delete mode 100644 lua-5.4.7/Makefile delete mode 100644 lua-5.4.7/README delete mode 100644 lua-5.4.7/doc/OSIApproved_100X125.png delete mode 100644 lua-5.4.7/doc/contents.html delete mode 100644 lua-5.4.7/doc/index.css delete mode 100644 lua-5.4.7/doc/logo.gif delete mode 100644 lua-5.4.7/doc/lua.1 delete mode 100644 lua-5.4.7/doc/lua.css delete mode 100644 lua-5.4.7/doc/luac.1 delete mode 100644 lua-5.4.7/doc/manual.css delete mode 100644 lua-5.4.7/doc/manual.html delete mode 100644 lua-5.4.7/doc/readme.html delete mode 100644 lua-5.4.7/src/Makefile delete mode 100644 lua-5.4.7/src/lapi.h delete mode 100644 lua-5.4.7/src/ldump.c delete mode 100644 lua-5.4.7/src/linit.c delete mode 100644 lua-5.4.7/src/ltable.c delete mode 100644 lua-5.4.7/src/ltable.h delete mode 100644 lua-5.4.7/src/lundump.c delete mode 100644 lua-config-package-tests/CMakeLists.txt delete mode 100644 lua-config-package-tests/lua-config-package-build-test.c delete mode 100644 orig_sources/lua-5.4.6-tests.tar.gz delete mode 100644 orig_sources/lua-5.4.6.tar.gz delete mode 100644 orig_sources/lua-5.4.7-tests.tar.gz delete mode 100644 orig_sources/lua-5.4.7.tar.gz rename {lua-5.4.7/src => src}/lapi.c (81%) rename {lua-5.4.7/src => src}/lauxlib.c (85%) rename {lua-5.4.7/src => src}/lbaselib.c (87%) rename {lua-5.4.7/src => src}/lcode.c (82%) rename {lua-5.4.7/src => src}/lcorolib.c (89%) rename {lua-5.4.7/src => src}/lctype.c (97%) rename {lua-5.4.7/src => src}/ldblib.c (98%) rename {lua-5.4.7/src => src}/ldebug.c (92%) rename {lua-5.4.7/src => src}/ldo.c (70%) create mode 100644 src/ldump.c rename {lua-5.4.7/src => src}/lfunc.c (75%) rename {lua-5.4.7/src => src}/lgc.c (72%) create mode 100644 src/linit.c rename {lua-5.4.7/src => src}/liolib.c (94%) rename {lua-5.4.7/src => src}/llex.c (87%) rename {lua-5.4.7/src => src}/lmathlib.c (88%) rename {lua-5.4.7/src => src}/lmem.c (92%) rename {lua-5.4.7/src => src}/loadlib.c (89%) rename {lua-5.4.7/src => src}/lobject.c (61%) rename {lua-5.4.7/src => src}/lopcodes.c (79%) rename {lua-5.4.7/src => src}/loslib.c (97%) rename {lua-5.4.7/src => src}/lparser.c (69%) rename {lua-5.4.7/src => src}/lstate.c (70%) rename {lua-5.4.7/src => src}/lstring.c (65%) rename {lua-5.4.7/src => src}/lstrlib.c (87%) create mode 100644 src/ltable.c rename {lua-5.4.7/src => src}/ltablib.c (87%) rename {lua-5.4.7/src => src}/ltm.c (52%) rename {lua-5.4.7/src => src}/lua.c (81%) rename {lua-5.4.7/src => src}/luac.c (97%) create mode 100644 src/lundump.c rename {lua-5.4.7/src => src}/lutf8lib.c (78%) rename {lua-5.4.7/src => src}/lvm.c (79%) rename {lua-5.4.7/src => src}/lzio.c (57%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5f042e6..1e66d7b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,12 @@ cmake_minimum_required(VERSION 3.1...3.12) cmake_policy(SET CMP0077 NEW) -project(lua LANGUAGES C VERSION 5.4.7) +project(lua LANGUAGES C VERSION 5.5.0) option(LUA_SUPPORT_DL "Support dynamic loading of compiled modules" OFF) option(LUA_BUILD_AS_CXX "Build lua as C++" OFF) option(LUA_ENABLE_SHARED "Build dynamic liblua" ON) -option(LUA_ENABLE_TESTING "Build and run tests" ON) enable_language(CXX) -if(LUA_ENABLE_TESTING) - enable_testing() -endif() if(${PROJECT_NAME} STREQUAL ${CMAKE_PROJECT_NAME}) set(TOP_LEVEL TRUE) @@ -26,8 +22,178 @@ else() option(LUA_BUILD_COMPILER "Build luac compiler" ON) endif() -add_subdirectory(lua-${PROJECT_VERSION}) +set(LUA_LIB_SRCS + "src/lapi.c" + "src/lcode.c" + "src/lctype.c" + "src/ldebug.c" + "src/ldo.c" + "src/ldump.c" + "src/lfunc.c" + "src/lgc.c" + "src/llex.c" + "src/lmem.c" + "src/lobject.c" + "src/lopcodes.c" + "src/lparser.c" + "src/lstate.c" + "src/lstring.c" + "src/ltable.c" + "src/ltm.c" + "src/lundump.c" + "src/lvm.c" + "src/lzio.c" + "src/lauxlib.c" + "src/lbaselib.c" + "src/lcorolib.c" + "src/ldblib.c" + "src/liolib.c" + "src/lmathlib.c" + "src/loadlib.c" + "src/loslib.c" + "src/lstrlib.c" + "src/ltablib.c" + "src/lutf8lib.c" + "src/linit.c" +) + +set(TARGETS_TO_INSTALL lua_internal lua_include) + +set(LUA_LINKED_LIBRARIES) + +if(LUA_BUILD_AS_CXX) + set_source_files_properties(${LUA_LIB_SRCS} "src/lua.c" "src/luac.c" PROPERTIES LANGUAGE CXX ) +endif() + +add_library(lua_internal INTERFACE) + +add_library(lua_include INTERFACE) -if(LUA_ENABLE_TESTING) - add_test(NAME lua-testsuite COMMAND lua -e "_U=true" all.lua WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lua-${CMAKE_PROJECT_VERSION}-tests) +target_include_directories(lua_include INTERFACE + $ + $ +) + +target_link_libraries(lua_internal INTERFACE lua_include) + +if(LUA_ENABLE_SHARED) + add_library(lua_shared SHARED ${LUA_LIB_SRCS}) + target_link_libraries(lua_shared PRIVATE lua_internal PUBLIC lua_include) + set_target_properties(lua_shared PROPERTIES + VERSION "${PACKAGE_VERSION}" + OUTPUT_NAME "lua55" + ) + if(WIN32) + target_compile_definitions(lua_shared PRIVATE LUA_BUILD_AS_DLL) + endif() + list(APPEND TARGETS_TO_INSTALL lua_shared) + if(BUILD_SHARED_LIBS) + add_library(Lua::Library ALIAS lua_shared) + elseif(NOT TOP_LEVEL) + set_target_properties(lua_shared PROPERTIES + EXCLUDE_FROM_ALL ON + ) + endif() +endif() + +add_library(lua_static STATIC ${LUA_LIB_SRCS}) +target_link_libraries(lua_static PRIVATE lua_internal PUBLIC lua_include) +set_target_properties(lua_static PROPERTIES + VERSION "${PACKAGE_VERSION}" + OUTPUT_NAME "lua55" +) +list(APPEND TARGETS_TO_INSTALL lua_static) +if(NOT BUILD_SHARED_LIBS OR NOT LUA_ENABLE_SHARED) + add_library(Lua::Library ALIAS lua_static) endif() + + +if(UNIX) + if(NOT EMSCRIPTEN) + find_library(LIBM m) + #TODO: Redo this with find_package + if(NOT LIBM) + message(FATAL_ERROR "libm not found and is required by lua") + endif() + target_compile_definitions(lua_internal INTERFACE "LUA_USE_POSIX") + target_link_libraries(lua_internal INTERFACE m) + list(APPEND LUA_LINKED_LIBRARIES m) + if(LUA_SUPPORT_DL) + find_library(LIBDL "${CMAKE_DL_LIBS}") + if(NOT LIBDL) + message(FATAL_ERROR "libdl not found and is required by lua") + endif() + target_compile_definitions(lua_internal INTERFACE "LUA_USE_DLOPEN") + target_link_libraries(lua_internal INTERFACE "${CMAKE_DL_LIBS}") + list(APPEND LUA_LINKED_LIBRARIES "${CMAKE_DL_LIBS}") + endif() + endif() + + target_compile_options(lua_internal + INTERFACE "-Wall" "-Wextra" + ) +elseif(WIN32) + target_compile_options(lua_internal + INTERFACE "/Wall" + ) +endif() + +if(LUA_BUILD_BINARY) + include(CheckIncludeFile) + CHECK_INCLUDE_FILE("readline/readline.h" HAVE_READLINE_READLINE_H) + + add_executable(lua "src/lua.c") + # Can not use lua_shared because some symbols are not exported + target_link_libraries(lua PRIVATE lua_static) + set_target_properties(lua PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} + OUTPUT_NAME "lua55" + ) + if (HAVE_READLINE_READLINE_H) + target_compile_definitions(lua PRIVATE "LUA_USE_READLINE") + target_link_libraries(lua PUBLIC readline) + endif() + list(APPEND TARGETS_TO_INSTALL lua) +endif() + +if(LUA_BUILD_COMPILER) + add_executable(luac "src/luac.c") + target_link_libraries(luac PRIVATE lua_static) + set_target_properties(luac PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} + OUTPUT_NAME "luac55" + ) + list(APPEND TARGETS_TO_INSTALL luac) +endif() + +install(TARGETS ${TARGETS_TO_INSTALL} + EXPORT LuaTargets +) + +install(DIRECTORY include/ TYPE INCLUDE) + +include(CMakePackageConfigHelpers) + +get_target_property(LUA_EXPORT_LIBRARY Lua::Library ALIASED_TARGET) +write_basic_package_version_file( + LuaConfigVersion.cmake + VERSION ${PACKAGE_VERSION} + COMPATIBILITY SameMajorVersion +) + +install(EXPORT LuaTargets + FILE LuaTargets.cmake + DESTINATION "share/cmake/Lua" + NAMESPACE Lua:: +) + +configure_package_config_file( + LuaConfig.cmake.in + "${CMAKE_CURRENT_BINARY_DIR}/LuaConfig.cmake" + INSTALL_DESTINATION "share/cmake/Lua" +) + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/LuaConfig.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/LuaConfigVersion.cmake" + DESTINATION "share/cmake/Lua" +) diff --git a/lua-5.4.7/LuaConfig.cmake.in b/LuaConfig.cmake.in similarity index 100% rename from lua-5.4.7/LuaConfig.cmake.in rename to LuaConfig.cmake.in diff --git a/README.md b/README.md index 81d9f48..280c21a 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,9 @@ # Lua -CMake based build of Lua 5.4.7 -| Build as C | Build as C++ | -| --: | --: | -| ![Build Linux](https://github.com/walterschell/Lua/actions/workflows/build-linux.yml/badge.svg?branch=master) | ![Build Linux as C++](https://github.com/walterschell/Lua/actions/workflows/build-linux-cxx.yml/badge.svg?branch=master) | -| ![Build Windows](https://github.com/walterschell/Lua/actions/workflows/build-windows.yml/badge.svg?branch=master) | ![Build Windows as C++](https://github.com/walterschell/Lua/actions/workflows/build-windows-cxx.yml/badge.svg?branch=master) | -| ![Build OSX](https://github.com/walterschell/Lua/actions/workflows/build-osx.yml/badge.svg?branch=master) | ![Build OSX as C++](https://github.com/walterschell/Lua/actions/workflows/build-osx-cxx.yml/badge.svg?branch=master) | -| ![Build Emscripten](https://github.com/walterschell/Lua/actions/workflows/build-emscripten.yml/badge.svg?branch=master) | ![Build Emscripten as C++](https://github.com/walterschell/Lua/actions/workflows/build-emscripten-cxx.yml/badge.svg?branch=master) | +CMake based build of Lua 5.5.0 # Usage Inside of your project's CMakeLists.txt ```cmake add_subdirectory(lua) ... -target_link_libraries( lua_static) -``` +target_link_libraries( Lua::Library) +``` \ No newline at end of file diff --git a/include/lapi.h b/include/lapi.h new file mode 100644 index 0000000..9b54534 --- /dev/null +++ b/include/lapi.h @@ -0,0 +1,65 @@ +/* +** $Id: lapi.h $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "llimits.h" +#include "lstate.h" + + +#if defined(LUA_USE_APICHECK) +#include +#define api_check(l,e,msg) assert(e) +#else /* for testing */ +#define api_check(l,e,msg) ((void)(l), lua_assert((e) && msg)) +#endif + + + +/* Increments 'L->top.p', checking for stack overflows */ +#define api_incr_top(L) \ + (L->top.p++, api_check(L, L->top.p <= L->ci->top.p, "stack overflow")) + + +/* +** macros that are executed whenever program enters the Lua core +** ('lua_lock') and leaves the core ('lua_unlock') +*/ +#if !defined(lua_lock) +#define lua_lock(L) ((void) 0) +#define lua_unlock(L) ((void) 0) +#endif + + + +/* +** If a call returns too many multiple returns, the callee may not have +** stack space to accommodate all results. In this case, this macro +** increases its stack space ('L->ci->top.p'). +*/ +#define adjustresults(L,nres) \ + { if ((nres) <= LUA_MULTRET && L->ci->top.p < L->top.p) \ + L->ci->top.p = L->top.p; } + + +/* Ensure the stack has at least 'n' elements */ +#define api_checknelems(L,n) \ + api_check(L, (n) < (L->top.p - L->ci->func.p), \ + "not enough elements in the stack") + + +/* Ensure the stack has at least 'n' elements to be popped. (Some +** functions only update a slot after checking it for popping, but that +** is only an optimization for a pop followed by a push.) +*/ +#define api_checkpop(L,n) \ + api_check(L, (n) < L->top.p - L->ci->func.p && \ + L->tbclist.p < L->top.p - (n), \ + "not enough free elements in the stack") + +#endif diff --git a/lua-5.4.7/include/lauxlib.h b/include/lauxlib.h similarity index 90% rename from lua-5.4.7/include/lauxlib.h rename to include/lauxlib.h index 5b977e2..7f1d3ca 100644 --- a/lua-5.4.7/include/lauxlib.h +++ b/include/lauxlib.h @@ -81,6 +81,9 @@ LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def, LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); LUALIB_API int (luaL_execresult) (lua_State *L, int stat); +LUALIB_API void *luaL_alloc (void *ud, void *ptr, size_t osize, + size_t nsize); + /* predefined references */ #define LUA_NOREF (-2) @@ -100,6 +103,8 @@ LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); LUALIB_API lua_State *(luaL_newstate) (void); +LUALIB_API unsigned luaL_makeseed (lua_State *L); + LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); LUALIB_API void (luaL_addgsub) (luaL_Buffer *b, const char *s, @@ -163,21 +168,10 @@ LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, /* push the value used to represent failure/error */ -#define luaL_pushfail(L) lua_pushnil(L) - - -/* -** Internal assertions for in-house debugging -*/ -#if !defined(lua_assert) - -#if defined LUAI_ASSERT - #include - #define lua_assert(c) assert(c) +#if defined(LUA_FAILISFALSE) +#define luaL_pushfail(L) lua_pushboolean(L, 0) #else - #define lua_assert(c) ((void)0) -#endif - +#define luaL_pushfail(L) lua_pushnil(L) #endif @@ -249,30 +243,6 @@ typedef struct luaL_Stream { /* }====================================================== */ -/* -** {================================================================== -** "Abstraction Layer" for basic report of messages and errors -** =================================================================== -*/ - -/* print a string */ -#if !defined(lua_writestring) -#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) -#endif - -/* print a newline and flush the output */ -#if !defined(lua_writeline) -#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) -#endif - -/* print an error message */ -#if !defined(lua_writestringerror) -#define lua_writestringerror(s,p) \ - (fprintf(stderr, (s), (p)), fflush(stderr)) -#endif - -/* }================================================================== */ - /* ** {============================================================ diff --git a/lua-5.4.7/src/lcode.h b/include/lcode.h similarity index 84% rename from lua-5.4.7/src/lcode.h rename to include/lcode.h index 0b971fc..09e5c80 100644 --- a/lua-5.4.7/src/lcode.h +++ b/include/lcode.h @@ -60,15 +60,20 @@ typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; #define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) LUAI_FUNC int luaK_code (FuncState *fs, Instruction i); -LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); -LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A, - int B, int C, int k); +LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, int Bx); +LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A, int B, int C, + int k); +LUAI_FUNC int luaK_codevABCk (FuncState *fs, OpCode o, int A, int B, int C, + int k); LUAI_FUNC int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v); LUAI_FUNC void luaK_fixline (FuncState *fs, int line); LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); +LUAI_FUNC void luaK_codecheckglobal (FuncState *fs, expdesc *var, int k, + int line); LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); LUAI_FUNC void luaK_int (FuncState *fs, int reg, lua_Integer n); +LUAI_FUNC void luaK_vapar2local (FuncState *fs, expdesc *var); LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e); @@ -77,7 +82,6 @@ LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); -LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e); LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); @@ -95,7 +99,7 @@ LUAI_FUNC void luaK_settablesize (FuncState *fs, int pc, int ra, int asize, int hsize); LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); LUAI_FUNC void luaK_finish (FuncState *fs); -LUAI_FUNC l_noret luaK_semerror (LexState *ls, const char *msg); +LUAI_FUNC l_noret luaK_semerror (LexState *ls, const char *fmt, ...); #endif diff --git a/lua-5.4.7/src/lctype.h b/include/lctype.h similarity index 100% rename from lua-5.4.7/src/lctype.h rename to include/lctype.h diff --git a/lua-5.4.7/src/ldebug.h b/include/ldebug.h similarity index 97% rename from lua-5.4.7/src/ldebug.h rename to include/ldebug.h index 2bfce3c..20d0781 100644 --- a/lua-5.4.7/src/ldebug.h +++ b/include/ldebug.h @@ -53,6 +53,7 @@ LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2); LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2); +LUAI_FUNC l_noret luaG_errnnil (lua_State *L, LClosure *cl, int k); LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...); LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg, TString *src, int line); diff --git a/lua-5.4.7/src/ldo.h b/include/ldo.h similarity index 64% rename from lua-5.4.7/src/ldo.h rename to include/ldo.h index 56008ab..b647295 100644 --- a/lua-5.4.7/src/ldo.h +++ b/include/ldo.h @@ -23,10 +23,19 @@ ** 'condmovestack' is used in heavy tests to force a stack reallocation ** at every check. */ + +#if !defined(HARDSTACKTESTS) +#define condmovestack(L,pre,pos) ((void)0) +#else +/* realloc stack keeping its size */ +#define condmovestack(L,pre,pos) \ + { int sz_ = stacksize(L); pre; luaD_reallocstack((L), sz_, 0); pos; } +#endif + #define luaD_checkstackaux(L,n,pre,pos) \ if (l_unlikely(L->stack_last.p - L->top.p <= (n))) \ { pre; luaD_growstack(L, n, 1); pos; } \ - else { condmovestack(L,pre,pos); } + else { condmovestack(L,pre,pos); } /* In general, 'pre'/'pos' are empty (nothing to save) */ #define luaD_checkstack(L,n) luaD_checkstackaux(L,n,(void)0,(void)0) @@ -44,24 +53,24 @@ p = restorestack(L, t__)) /* 'pos' part: restore 'p' */ -/* macro to check stack size and GC, preserving 'p' */ -#define checkstackGCp(L,n,p) \ - luaD_checkstackaux(L, n, \ - ptrdiff_t t__ = savestack(L, p); /* save 'p' */ \ - luaC_checkGC(L), /* stack grow uses memory */ \ - p = restorestack(L, t__)) /* 'pos' part: restore 'p' */ - - -/* macro to check stack size and GC */ -#define checkstackGC(L,fsize) \ - luaD_checkstackaux(L, (fsize), luaC_checkGC(L), (void)0) +/* +** Maximum depth for nested C calls, syntactical nested non-terminals, +** and other features implemented through recursion in C. (Value must +** fit in a 16-bit unsigned integer. It must also be compatible with +** the size of the C stack.) +*/ +#if !defined(LUAI_MAXCCALLS) +#define LUAI_MAXCCALLS 200 +#endif /* type of protected functions, to be ran by 'runprotected' */ typedef void (*Pfunc) (lua_State *L, void *ud); -LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); -LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, +LUAI_FUNC l_noret luaD_errerr (lua_State *L); +LUAI_FUNC void luaD_seterrorobj (lua_State *L, TStatus errcode, StkId oldtop); +LUAI_FUNC TStatus luaD_protectedparser (lua_State *L, ZIO *z, + const char *name, const char *mode); LUAI_FUNC void luaD_hook (lua_State *L, int event, int line, int fTransfer, int nTransfer); @@ -71,17 +80,20 @@ LUAI_FUNC int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, LUAI_FUNC CallInfo *luaD_precall (lua_State *L, StkId func, int nResults); LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); -LUAI_FUNC int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status); -LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, +LUAI_FUNC TStatus luaD_closeprotected (lua_State *L, ptrdiff_t level, + TStatus status); +LUAI_FUNC TStatus luaD_pcall (lua_State *L, Pfunc func, void *u, ptrdiff_t oldtop, ptrdiff_t ef); LUAI_FUNC void luaD_poscall (lua_State *L, CallInfo *ci, int nres); LUAI_FUNC int luaD_reallocstack (lua_State *L, int newsize, int raiseerror); LUAI_FUNC int luaD_growstack (lua_State *L, int n, int raiseerror); LUAI_FUNC void luaD_shrinkstack (lua_State *L); LUAI_FUNC void luaD_inctop (lua_State *L); +LUAI_FUNC int luaD_checkminstack (lua_State *L); -LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode); -LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); +LUAI_FUNC l_noret luaD_throw (lua_State *L, TStatus errcode); +LUAI_FUNC l_noret luaD_throwbaselevel (lua_State *L, TStatus errcode); +LUAI_FUNC TStatus luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); #endif diff --git a/lua-5.4.7/src/lfunc.h b/include/lfunc.h similarity index 79% rename from lua-5.4.7/src/lfunc.h rename to include/lfunc.h index 3be265e..d6aad3a 100644 --- a/lua-5.4.7/src/lfunc.h +++ b/include/lfunc.h @@ -11,11 +11,11 @@ #include "lobject.h" -#define sizeCclosure(n) (cast_int(offsetof(CClosure, upvalue)) + \ - cast_int(sizeof(TValue)) * (n)) +#define sizeCclosure(n) \ + (offsetof(CClosure, upvalue) + sizeof(TValue) * cast_uint(n)) -#define sizeLclosure(n) (cast_int(offsetof(LClosure, upvals)) + \ - cast_int(sizeof(TValue *)) * (n)) +#define sizeLclosure(n) \ + (offsetof(LClosure, upvals) + sizeof(UpVal *) * cast_uint(n)) /* test whether thread is in 'twups' list */ @@ -44,7 +44,7 @@ /* special status to close upvalues preserving the top of the stack */ -#define CLOSEKTOP (-1) +#define CLOSEKTOP (LUA_ERRERR + 1) LUAI_FUNC Proto *luaF_newproto (lua_State *L); @@ -54,8 +54,9 @@ LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); LUAI_FUNC void luaF_closeupval (lua_State *L, StkId level); -LUAI_FUNC StkId luaF_close (lua_State *L, StkId level, int status, int yy); +LUAI_FUNC StkId luaF_close (lua_State *L, StkId level, TStatus status, int yy); LUAI_FUNC void luaF_unlinkupval (UpVal *uv); +LUAI_FUNC lu_mem luaF_protosize (Proto *p); LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, int pc); diff --git a/lua-5.4.7/src/lgc.h b/include/lgc.h similarity index 54% rename from lua-5.4.7/src/lgc.h rename to include/lgc.h index 538f6ed..ee05417 100644 --- a/lua-5.4.7/src/lgc.h +++ b/include/lgc.h @@ -8,6 +8,9 @@ #define lgc_h +#include + + #include "lobject.h" #include "lstate.h" @@ -20,8 +23,9 @@ ** never point to a white one. Moreover, any gray object must be in a ** "gray list" (gray, grayagain, weak, allweak, ephemeron) so that it ** can be visited again before finishing the collection cycle. (Open -** upvalues are an exception to this rule.) These lists have no meaning -** when the invariant is not being enforced (e.g., sweep phase). +** upvalues are an exception to this rule, as they are attached to +** a corresponding thread.) These lists have no meaning when the +** invariant is not being enforced (e.g., sweep phase). */ @@ -45,10 +49,10 @@ /* ** macro to tell when main invariant (white objects cannot point to black -** ones) must be kept. During a collection, the sweep -** phase may break the invariant, as objects turned white may point to -** still-black objects. The invariant is restored when sweep ends and -** all objects are white again. +** ones) must be kept. During a collection, the sweep phase may break +** the invariant, as objects turned white may point to still-black +** objects. The invariant is restored when sweep ends and all objects +** are white again. */ #define keepinvariant(g) ((g)->gcstate <= GCSatomic) @@ -117,36 +121,90 @@ #define setage(o,a) ((o)->marked = cast_byte(((o)->marked & (~AGEBITS)) | a)) #define isold(o) (getage(o) > G_SURVIVAL) -#define changeage(o,f,t) \ - check_exp(getage(o) == (f), (o)->marked ^= ((f)^(t))) +/* +** In generational mode, objects are created 'new'. After surviving one +** cycle, they become 'survival'. Both 'new' and 'survival' can point +** to any other object, as they are traversed at the end of the cycle. +** We call them both 'young' objects. +** If a survival object survives another cycle, it becomes 'old1'. +** 'old1' objects can still point to survival objects (but not to +** new objects), so they still must be traversed. After another cycle +** (that, being old, 'old1' objects will "survive" no matter what) +** finally the 'old1' object becomes really 'old', and then they +** are no more traversed. +** +** To keep its invariants, the generational mode uses the same barriers +** also used by the incremental mode. If a young object is caught in a +** forward barrier, it cannot become old immediately, because it can +** still point to other young objects. Instead, it becomes 'old0', +** which in the next cycle becomes 'old1'. So, 'old0' objects is +** old but can point to new and survival objects; 'old1' is old +** but cannot point to new objects; and 'old' cannot point to any +** young object. +** +** If any old object ('old0', 'old1', 'old') is caught in a back +** barrier, it becomes 'touched1' and goes into a gray list, to be +** visited at the end of the cycle. There it evolves to 'touched2', +** which can point to survivals but not to new objects. In yet another +** cycle then it becomes 'old' again. +** +** The generational mode must also control the colors of objects, +** because of the barriers. While the mutator is running, young objects +** are kept white. 'old', 'old1', and 'touched2' objects are kept black, +** as they cannot point to new objects; exceptions are threads and open +** upvalues, which age to 'old1' and 'old' but are kept gray. 'old0' +** objects may be gray or black, as in the incremental mode. 'touched1' +** objects are kept gray, as they must be visited again at the end of +** the cycle. +*/ -/* Default Values for GC parameters */ -#define LUAI_GENMAJORMUL 100 -#define LUAI_GENMINORMUL 20 -/* wait memory to double before starting new cycle */ -#define LUAI_GCPAUSE 200 +/* +** {====================================================== +** Default Values for GC parameters +** ======================================================= +*/ /* -** some gc parameters are stored divided by 4 to allow a maximum value -** up to 1023 in a 'lu_byte'. +** Minor collections will shift to major ones after LUAI_MINORMAJOR% +** bytes become old. */ -#define getgcparam(p) ((p) * 4) -#define setgcparam(p,v) ((p) = (v) / 4) +#define LUAI_MINORMAJOR 70 -#define LUAI_GCMUL 100 +/* +** Major collections will shift to minor ones after a collection +** collects at least LUAI_MAJORMINOR% of the new bytes. +*/ +#define LUAI_MAJORMINOR 50 -/* how much to allocate before next GC step (log2) */ -#define LUAI_GCSTEPSIZE 13 /* 8 KB */ +/* +** A young (minor) collection will run after creating LUAI_GENMINORMUL% +** new bytes. +*/ +#define LUAI_GENMINORMUL 20 + + +/* incremental */ +/* Number of bytes must be LUAI_GCPAUSE% before starting new cycle */ +#define LUAI_GCPAUSE 250 /* -** Check whether the declared GC mode is generational. While in -** generational mode, the collector can go temporarily to incremental -** mode to improve performance. This is signaled by 'g->lastatomic != 0'. +** Step multiplier: The collector handles LUAI_GCMUL% work units for +** each new allocated word. (Each "work unit" corresponds roughly to +** sweeping one object or traversing one slot.) */ -#define isdecGCmodegen(g) (g->gckind == KGC_GEN || g->lastatomic != 0) +#define LUAI_GCMUL 200 + +/* How many bytes to allocate before next GC step */ +#define LUAI_GCSTEPSIZE (200 * sizeof(Table)) + + +#define setgcparam(g,p,v) (g->gcparams[LUA_GCP##p] = luaO_codeparam(v)) +#define applygcparam(g,p,x) luaO_applyparam(g->gcparams[LUA_GCP##p], x) + +/* }====================================================== */ /* @@ -159,14 +217,22 @@ /* -** Does one step of collection when debt becomes positive. 'pre'/'pos' +** Does one step of collection when debt becomes zero. 'pre'/'pos' ** allows some adjustments to be done only when needed. macro ** 'condchangemem' is used only for heavy tests (forcing a full ** GC cycle on every opportunity) */ + +#if !defined(HARDMEMTESTS) +#define condchangemem(L,pre,pos,emg) ((void)0) +#else +#define condchangemem(L,pre,pos,emg) \ + { if (gcrunning(G(L))) { pre; luaC_fullgc(L, emg); pos; } } +#endif + #define luaC_condGC(L,pre,pos) \ - { if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \ - condchangemem(L,pre,pos); } + { if (G(L)->GCdebt <= 0) { pre; luaC_step(L); pos;}; \ + condchangemem(L,pre,pos,0); } /* more often than not, 'pre'/'pos' are empty */ #define luaC_checkGC(L) luaC_condGC(L,(void)0,(void)0) @@ -188,10 +254,10 @@ LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o); LUAI_FUNC void luaC_freeallobjects (lua_State *L); LUAI_FUNC void luaC_step (lua_State *L); -LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); +LUAI_FUNC void luaC_runtilstate (lua_State *L, int state, int fast); LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); -LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); -LUAI_FUNC GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, +LUAI_FUNC GCObject *luaC_newobj (lua_State *L, lu_byte tt, size_t sz); +LUAI_FUNC GCObject *luaC_newobjdt (lua_State *L, lu_byte tt, size_t sz, size_t offset); LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); diff --git a/lua-5.4.7/src/ljumptab.h b/include/ljumptab.h similarity index 93% rename from lua-5.4.7/src/ljumptab.h rename to include/ljumptab.h index 8306f25..52fa6d7 100644 --- a/lua-5.4.7/src/ljumptab.h +++ b/include/ljumptab.h @@ -21,7 +21,7 @@ static const void *const disptab[NUM_OPCODES] = { #if 0 ** you can update the following list with this command: ** -** sed -n '/^OP_/\!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h +** sed -n '/^OP_/!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h ** #endif @@ -57,8 +57,8 @@ static const void *const disptab[NUM_OPCODES] = { &&L_OP_BANDK, &&L_OP_BORK, &&L_OP_BXORK, -&&L_OP_SHRI, &&L_OP_SHLI, +&&L_OP_SHRI, &&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, @@ -106,6 +106,8 @@ static const void *const disptab[NUM_OPCODES] = { &&L_OP_SETLIST, &&L_OP_CLOSURE, &&L_OP_VARARG, +&&L_OP_GETVARG, +&&L_OP_ERRNNIL, &&L_OP_VARARGPREP, &&L_OP_EXTRAARG diff --git a/lua-5.4.7/src/llex.h b/include/llex.h similarity index 87% rename from lua-5.4.7/src/llex.h rename to include/llex.h index 389d2f8..37016e8 100644 --- a/lua-5.4.7/src/llex.h +++ b/include/llex.h @@ -33,8 +33,8 @@ enum RESERVED { /* terminal symbols denoted by reserved words */ TK_AND = FIRST_RESERVED, TK_BREAK, TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, - TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, - TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, + TK_GLOBAL, TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, + TK_REPEAT, TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, /* other terminal symbols */ TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_SHL, TK_SHR, @@ -59,7 +59,7 @@ typedef struct Token { } Token; -/* state of the lexer plus state of the parser when shared by all +/* state of the scanner plus state of the parser when shared by all functions */ typedef struct LexState { int current; /* current character (charint) */ @@ -75,6 +75,8 @@ typedef struct LexState { struct Dyndata *dyd; /* dynamic structures used by the parser */ TString *source; /* current source name */ TString *envn; /* environment variable name */ + TString *brkn; /* "break" name (used as a label) */ + TString *glbn; /* "global" name (when not a reserved word) */ } LexState; diff --git a/lua-5.4.7/src/llimits.h b/include/llimits.h similarity index 56% rename from lua-5.4.7/src/llimits.h rename to include/llimits.h index 1c826f7..fc5cb27 100644 --- a/lua-5.4.7/src/llimits.h +++ b/include/llimits.h @@ -15,50 +15,49 @@ #include "lua.h" +#define l_numbits(t) cast_int(sizeof(t) * CHAR_BIT) + /* -** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count -** the total memory used by Lua (in bytes). Usually, 'size_t' and +** 'l_mem' is a signed integer big enough to count the total memory +** used by Lua. (It is signed due to the use of debt in several +** computations.) 'lu_mem' is a corresponding unsigned type. Usually, ** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines. */ #if defined(LUAI_MEM) /* { external definitions? */ -typedef LUAI_UMEM lu_mem; typedef LUAI_MEM l_mem; +typedef LUAI_UMEM lu_mem; #elif LUAI_IS32INT /* }{ */ -typedef size_t lu_mem; typedef ptrdiff_t l_mem; +typedef size_t lu_mem; #else /* 16-bit ints */ /* }{ */ -typedef unsigned long lu_mem; typedef long l_mem; +typedef unsigned long lu_mem; #endif /* } */ +#define MAX_LMEM \ + cast(l_mem, (cast(lu_mem, 1) << (l_numbits(l_mem) - 1)) - 1) + /* chars used as small naturals (so that 'char' is reserved for characters) */ typedef unsigned char lu_byte; typedef signed char ls_byte; -/* maximum value for size_t */ -#define MAX_SIZET ((size_t)(~(size_t)0)) - -/* maximum size visible for Lua (must be representable in a lua_Integer) */ -#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \ - : (size_t)(LUA_MAXINTEGER)) - - -#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)) - -#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1)) +/* Type for thread status/error codes */ +typedef lu_byte TStatus; +/* The C API still uses 'int' for status/error codes */ +#define APIstatus(st) cast_int(st) -#define MAX_INT INT_MAX /* maximum value of an int */ - +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) /* -** floor of the log2 of the maximum signed value for integral type 't'. -** (That is, maximum 'n' such that '2^n' fits in the given signed type.) +** Maximum size for strings and userdata visible for Lua; should be +** representable as a lua_Integer and as a size_t. */ -#define log2maxs(t) (sizeof(t) * 8 - 2) - +#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \ + : cast_sizet(LUA_MAXINTEGER)) /* ** test whether an unsigned value is a power of 2 (or zero) @@ -88,7 +87,7 @@ typedef signed char ls_byte; #define L_P2I size_t #endif -#define point2uint(p) ((unsigned int)((L_P2I)(p) & UINT_MAX)) +#define point2uint(p) cast_uint((L_P2I)(p) & UINT_MAX) @@ -104,26 +103,18 @@ typedef LUAI_UACINT l_uacInt; #undef NDEBUG #include #define lua_assert(c) assert(c) +#define assert_code(c) c #endif #if defined(lua_assert) -#define check_exp(c,e) (lua_assert(c), (e)) -/* to avoid problems with conditions too long */ -#define lua_longassert(c) ((c) ? (void)0 : lua_assert(0)) #else #define lua_assert(c) ((void)0) -#define check_exp(c,e) (e) -#define lua_longassert(c) ((void)0) +#define assert_code(c) ((void)0) #endif -/* -** assertion for checking API calls -*/ -#if !defined(luai_apicheck) -#define luai_apicheck(l,e) ((void)l, lua_assert(e)) -#endif - -#define api_check(l,e,msg) luai_apicheck(l,(e) && msg) +#define check_exp(c,e) (lua_assert(c), (e)) +/* to avoid problems with conditions too long */ +#define lua_longassert(c) assert_code((c) ? (void)0 : lua_assert(0)) /* macro to avoid warnings about unused variables */ @@ -139,12 +130,15 @@ typedef LUAI_UACINT l_uacInt; #define cast_voidp(i) cast(void *, (i)) #define cast_num(i) cast(lua_Number, (i)) #define cast_int(i) cast(int, (i)) +#define cast_short(i) cast(short, (i)) #define cast_uint(i) cast(unsigned int, (i)) #define cast_byte(i) cast(lu_byte, (i)) #define cast_uchar(i) cast(unsigned char, (i)) #define cast_char(i) cast(char, (i)) #define cast_charp(i) cast(char *, (i)) #define cast_sizet(i) cast(size_t, (i)) +#define cast_Integer(i) cast(lua_Integer, (i)) +#define cast_Inst(i) cast(Instruction, (i)) /* cast a signed lua_Integer to lua_Unsigned */ @@ -161,6 +155,38 @@ typedef LUAI_UACINT l_uacInt; #define l_castU2S(i) ((lua_Integer)(i)) #endif +/* +** cast a size_t to lua_Integer: These casts are always valid for +** sizes of Lua objects (see MAX_SIZE) +*/ +#define cast_st2S(sz) ((lua_Integer)(sz)) + +/* Cast a ptrdiff_t to size_t, when it is known that the minuend +** comes from the subtrahend (the base) +*/ +#define ct_diff2sz(df) ((size_t)(df)) + +/* ptrdiff_t to lua_Integer */ +#define ct_diff2S(df) cast_st2S(ct_diff2sz(df)) + +/* +** Special type equivalent to '(void*)' for functions (to suppress some +** warnings when converting function pointers) +*/ +typedef void (*voidf)(void); + +/* +** Macro to convert pointer-to-void* to pointer-to-function. This cast +** is undefined according to ISO C, but POSIX assumes that it works. +** (The '__extension__' in gnu compilers is only to avoid warnings.) +*/ +#if defined(__GNUC__) +#define cast_func(p) (__extension__ (voidf)(p)) +#else +#define cast_func(p) ((voidf)(p)) +#endif + + /* ** non-return type @@ -193,8 +219,7 @@ typedef LUAI_UACINT l_uacInt; /* -** type for virtual-machine instructions; -** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +** An unsigned with (at least) 4 bytes */ #if LUAI_IS32INT typedef unsigned int l_uint32; @@ -202,107 +227,6 @@ typedef unsigned int l_uint32; typedef unsigned long l_uint32; #endif -typedef l_uint32 Instruction; - - - -/* -** Maximum length for short strings, that is, strings that are -** internalized. (Cannot be smaller than reserved words or tags for -** metamethods, as these strings must be internalized; -** #("function") = 8, #("__newindex") = 10.) -*/ -#if !defined(LUAI_MAXSHORTLEN) -#define LUAI_MAXSHORTLEN 40 -#endif - - -/* -** Initial size for the string table (must be power of 2). -** The Lua core alone registers ~50 strings (reserved words + -** metaevent keys + a few others). Libraries would typically add -** a few dozens more. -*/ -#if !defined(MINSTRTABSIZE) -#define MINSTRTABSIZE 128 -#endif - - -/* -** Size of cache for strings in the API. 'N' is the number of -** sets (better be a prime) and "M" is the size of each set (M == 1 -** makes a direct cache.) -*/ -#if !defined(STRCACHE_N) -#define STRCACHE_N 53 -#define STRCACHE_M 2 -#endif - - -/* minimum size for string buffer */ -#if !defined(LUA_MINBUFFER) -#define LUA_MINBUFFER 32 -#endif - - -/* -** Maximum depth for nested C calls, syntactical nested non-terminals, -** and other features implemented through recursion in C. (Value must -** fit in a 16-bit unsigned integer. It must also be compatible with -** the size of the C stack.) -*/ -#if !defined(LUAI_MAXCCALLS) -#define LUAI_MAXCCALLS 200 -#endif - - -/* -** macros that are executed whenever program enters the Lua core -** ('lua_lock') and leaves the core ('lua_unlock') -*/ -#if !defined(lua_lock) -#define lua_lock(L) ((void) 0) -#define lua_unlock(L) ((void) 0) -#endif - -/* -** macro executed during Lua functions at points where the -** function can yield. -*/ -#if !defined(luai_threadyield) -#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} -#endif - - -/* -** these macros allow user-specific actions when a thread is -** created/deleted/resumed/yielded. -*/ -#if !defined(luai_userstateopen) -#define luai_userstateopen(L) ((void)L) -#endif - -#if !defined(luai_userstateclose) -#define luai_userstateclose(L) ((void)L) -#endif - -#if !defined(luai_userstatethread) -#define luai_userstatethread(L,L1) ((void)L) -#endif - -#if !defined(luai_userstatefree) -#define luai_userstatefree(L,L1) ((void)L) -#endif - -#if !defined(luai_userstateresume) -#define luai_userstateresume(L,n) ((void)L) -#endif - -#if !defined(luai_userstateyield) -#define luai_userstateyield(L,n) ((void)L) -#endif - - /* ** The luai_num* macros define the primitive operations over numbers. @@ -357,24 +281,77 @@ typedef l_uint32 Instruction; +/* +** lua_numbertointeger converts a float number with an integral value +** to an integer, or returns 0 if the float is not within the range of +** a lua_Integer. (The range comparisons are tricky because of +** rounding. The tests here assume a two-complement representation, +** where MININTEGER always has an exact representation as a float; +** MAXINTEGER may not have one, and therefore its conversion to float +** may have an ill-defined value.) +*/ +#define lua_numbertointeger(n,p) \ + ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ + (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ + (*(p) = (LUA_INTEGER)(n), 1)) + /* -** macro to control inclusion of some hard tests on stack reallocation +** LUAI_FUNC is a mark for all extern functions that are not to be +** exported to outside modules. +** LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables, +** none of which to be exported to outside modules (LUAI_DDEF for +** definitions and LUAI_DDEC for declarations). +** Elf and MACH/gcc (versions 3.2 and later) mark them as "hidden" to +** optimize access when Lua is compiled as a shared library. Not all elf +** targets support this attribute. Unfortunately, gcc does not offer +** a way to check whether the target offers that support, and those +** without support give a warning about it. To avoid these warnings, +** change to the default definition. */ -#if !defined(HARDSTACKTESTS) -#define condmovestack(L,pre,pos) ((void)0) +#if !defined(LUAI_FUNC) + +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + (defined(__ELF__) || defined(__MACH__)) +#define LUAI_FUNC __attribute__((visibility("internal"))) extern #else -/* realloc stack keeping its size */ -#define condmovestack(L,pre,pos) \ - { int sz_ = stacksize(L); pre; luaD_reallocstack((L), sz_, 0); pos; } +#define LUAI_FUNC extern #endif -#if !defined(HARDMEMTESTS) -#define condchangemem(L,pre,pos) ((void)0) -#else -#define condchangemem(L,pre,pos) \ - { if (gcrunning(G(L))) { pre; luaC_fullgc(L, 0); pos; } } +#define LUAI_DDEC(dec) LUAI_FUNC dec +#define LUAI_DDEF /* empty */ + +#endif + + +/* Give these macros simpler names for internal use */ +#define l_likely(x) luai_likely(x) +#define l_unlikely(x) luai_unlikely(x) + +/* +** {================================================================== +** "Abstraction Layer" for basic report of messages and errors +** =================================================================== +*/ + +/* print a string */ +#if !defined(lua_writestring) +#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) +#endif + +/* print a newline and flush the output */ +#if !defined(lua_writeline) +#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) #endif +/* print an error message */ +#if !defined(lua_writestringerror) +#define lua_writestringerror(s,p) \ + (fprintf(stderr, (s), (p)), fflush(stderr)) #endif + +/* }================================================================== */ + +#endif + diff --git a/lua-5.4.7/src/lmem.h b/include/lmem.h similarity index 88% rename from lua-5.4.7/src/lmem.h rename to include/lmem.h index 8c75a44..dc714fb 100644 --- a/lua-5.4.7/src/lmem.h +++ b/include/lmem.h @@ -39,11 +39,11 @@ ** Computes the minimum between 'n' and 'MAX_SIZET/sizeof(t)', so that ** the result is not larger than 'n' and cannot overflow a 'size_t' ** when multiplied by the size of type 't'. (Assumes that 'n' is an -** 'int' or 'unsigned int' and that 'int' is not larger than 'size_t'.) +** 'int' and that 'int' is not larger than 'size_t'.) */ #define luaM_limitN(n,t) \ ((cast_sizet(n) <= MAX_SIZET/sizeof(t)) ? (n) : \ - cast_uint((MAX_SIZET/sizeof(t)))) + cast_int((MAX_SIZET/sizeof(t)))) /* @@ -57,12 +57,15 @@ #define luaM_freearray(L, b, n) luaM_free_(L, (b), (n)*sizeof(*(b))) #define luaM_new(L,t) cast(t*, luaM_malloc_(L, sizeof(t), 0)) -#define luaM_newvector(L,n,t) cast(t*, luaM_malloc_(L, (n)*sizeof(t), 0)) +#define luaM_newvector(L,n,t) \ + cast(t*, luaM_malloc_(L, cast_sizet(n)*sizeof(t), 0)) #define luaM_newvectorchecked(L,n,t) \ (luaM_checksize(L,n,sizeof(t)), luaM_newvector(L,n,t)) #define luaM_newobject(L,tag,s) luaM_malloc_(L, (s), tag) +#define luaM_newblock(L, size) luaM_newvector(L, size, char) + #define luaM_growvector(L,v,nelems,size,t,limit,e) \ ((v)=cast(t *, luaM_growaux_(L,v,nelems,&(size),sizeof(t), \ luaM_limitN(limit,t),e))) @@ -83,10 +86,10 @@ LUAI_FUNC void *luaM_saferealloc_ (lua_State *L, void *block, size_t oldsize, size_t size); LUAI_FUNC void luaM_free_ (lua_State *L, void *block, size_t osize); LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int nelems, - int *size, int size_elem, int limit, + int *size, unsigned size_elem, int limit, const char *what); LUAI_FUNC void *luaM_shrinkvector_ (lua_State *L, void *block, int *nelem, - int final_n, int size_elem); + int final_n, unsigned size_elem); LUAI_FUNC void *luaM_malloc_ (lua_State *L, size_t size, int tag); #endif diff --git a/lua-5.4.7/src/lobject.h b/include/lobject.h similarity index 86% rename from lua-5.4.7/src/lobject.h rename to include/lobject.h index 980e42f..156c942 100644 --- a/lua-5.4.7/src/lobject.h +++ b/include/lobject.h @@ -188,10 +188,21 @@ typedef union { /* Value returned for a key not found in a table (absent key) */ #define LUA_VABSTKEY makevariant(LUA_TNIL, 2) +/* Special variant to signal that a fast get is accessing a non-table */ +#define LUA_VNOTABLE makevariant(LUA_TNIL, 3) + /* macro to test for (any kind of) nil */ #define ttisnil(v) checktype((v), LUA_TNIL) +/* +** Macro to test the result of a table access. Formally, it should +** distinguish between LUA_VEMPTY/LUA_VABSTKEY/LUA_VNOTABLE and +** other tags. As currently nil is equivalent to LUA_VEMPTY, it is +** simpler to just test whether the value is nil. +*/ +#define tagisempty(tag) (novariant(tag) == LUA_TNIL) + /* macro to test for a standard nil */ #define ttisstrictnil(o) checktag((o), LUA_VNIL) @@ -245,6 +256,8 @@ typedef union { #define l_isfalse(o) (ttisfalse(o) || ttisnil(o)) +#define tagisfalse(t) ((t) == LUA_VFALSE || novariant(t) == LUA_TNIL) + #define setbfvalue(obj) settt_(obj, LUA_VFALSE) @@ -380,35 +393,54 @@ typedef struct GCObject { #define setsvalue2n setsvalue +/* Kinds of long strings (stored in 'shrlen') */ +#define LSTRREG -1 /* regular long string */ +#define LSTRFIX -2 /* fixed external long string */ +#define LSTRMEM -3 /* external long string with deallocation */ + + /* ** Header for a string value. */ typedef struct TString { CommonHeader; lu_byte extra; /* reserved words for short strings; "has hash" for longs */ - lu_byte shrlen; /* length for short strings, 0xFF for long strings */ + ls_byte shrlen; /* length for short strings, negative for long strings */ unsigned int hash; union { size_t lnglen; /* length for long strings */ struct TString *hnext; /* linked list for hash table */ } u; - char contents[1]; + char *contents; /* pointer to content in long strings */ + lua_Alloc falloc; /* deallocation function for external strings */ + void *ud; /* user data for external strings */ } TString; +#define strisshr(ts) ((ts)->shrlen >= 0) +#define isextstr(ts) (ttislngstring(ts) && tsvalue(ts)->shrlen != LSTRREG) + /* ** Get the actual string (array of bytes) from a 'TString'. (Generic ** version and specialized versions for long and short strings.) */ -#define getstr(ts) ((ts)->contents) -#define getlngstr(ts) check_exp((ts)->shrlen == 0xFF, (ts)->contents) -#define getshrstr(ts) check_exp((ts)->shrlen != 0xFF, (ts)->contents) +#define rawgetshrstr(ts) (cast_charp(&(ts)->contents)) +#define getshrstr(ts) check_exp(strisshr(ts), rawgetshrstr(ts)) +#define getlngstr(ts) check_exp(!strisshr(ts), (ts)->contents) +#define getstr(ts) (strisshr(ts) ? rawgetshrstr(ts) : (ts)->contents) -/* get string length from 'TString *s' */ -#define tsslen(s) \ - ((s)->shrlen != 0xFF ? (s)->shrlen : (s)->u.lnglen) +/* get string length from 'TString *ts' */ +#define tsslen(ts) \ + (strisshr(ts) ? cast_sizet((ts)->shrlen) : (ts)->u.lnglen) + +/* +** Get string and length */ +#define getlstr(ts, len) \ + (strisshr(ts) \ + ? (cast_void((len) = cast_sizet((ts)->shrlen)), rawgetshrstr(ts)) \ + : (cast_void((len) = (ts)->u.lnglen), (ts)->contents)) /* }================================================================== */ @@ -486,8 +518,8 @@ typedef struct Udata0 { /* compute the offset of the memory area of a userdata */ #define udatamemoffset(nuv) \ - ((nuv) == 0 ? offsetof(Udata0, bindata) \ - : offsetof(Udata, uv) + (sizeof(UValue) * (nuv))) + ((nuv) == 0 ? offsetof(Udata0, bindata) \ + : offsetof(Udata, uv) + (sizeof(UValue) * (nuv))) /* get the address of the memory block inside 'Udata' */ #define getudatamem(u) (cast_charp(u) + udatamemoffset((u)->nuvalue)) @@ -507,6 +539,9 @@ typedef struct Udata0 { #define LUA_VPROTO makevariant(LUA_TPROTO, 0) +typedef l_uint32 Instruction; + + /* ** Description of an upvalue for function prototypes */ @@ -544,13 +579,30 @@ typedef struct AbsLineInfo { int line; } AbsLineInfo; + +/* +** Flags in Prototypes +*/ +#define PF_VAHID 1 /* function has hidden vararg arguments */ +#define PF_VATAB 2 /* function has vararg table */ +#define PF_FIXED 4 /* prototype has parts in fixed memory */ + +/* a vararg function either has hidden args. or a vararg table */ +#define isvararg(p) ((p)->flag & (PF_VAHID | PF_VATAB)) + +/* +** mark that a function needs a vararg table. (The flag PF_VAHID will +** be cleared later.) +*/ +#define needvatab(p) ((p)->flag |= PF_VATAB) + /* ** Function Prototypes */ typedef struct Proto { CommonHeader; lu_byte numparams; /* number of fixed (named) parameters */ - lu_byte is_vararg; + lu_byte flag; lu_byte maxstacksize; /* number of registers needed by this function */ int sizeupvalues; /* size of 'upvalues' */ int sizek; /* size of 'k' */ @@ -708,10 +760,9 @@ typedef union Node { /* copy a value into a key */ -#define setnodekey(L,node,obj) \ +#define setnodekey(node,obj) \ { Node *n_=(node); const TValue *io_=(obj); \ - n_->u.key_val = io_->value_; n_->u.key_tt = io_->tt_; \ - checkliveness(L,io_); } + n_->u.key_val = io_->value_; n_->u.key_tt = io_->tt_; } /* copy a value from a key */ @@ -721,27 +772,14 @@ typedef union Node { checkliveness(L,io_); } -/* -** About 'alimit': if 'isrealasize(t)' is true, then 'alimit' is the -** real size of 'array'. Otherwise, the real size of 'array' is the -** smallest power of two not smaller than 'alimit' (or zero iff 'alimit' -** is zero); 'alimit' is then used as a hint for #t. -*/ - -#define BITRAS (1 << 7) -#define isrealasize(t) (!((t)->flags & BITRAS)) -#define setrealasize(t) ((t)->flags &= cast_byte(~BITRAS)) -#define setnorealasize(t) ((t)->flags |= BITRAS) - typedef struct Table { CommonHeader; lu_byte flags; /* 1<

lsizenode)) /* size of buffer for 'luaO_utf8esc' function */ #define UTF8BUFFSZ 8 -LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); -LUAI_FUNC int luaO_ceillog2 (unsigned int x); + +/* macro to call 'luaO_pushvfstring' correctly */ +#define pushvfstring(L, argp, fmt, msg) \ + { va_start(argp, fmt); \ + msg = luaO_pushvfstring(L, fmt, argp); \ + va_end(argp); \ + if (msg == NULL) luaD_throw(L, LUA_ERRMEM); /* only after 'va_end' */ } + + +LUAI_FUNC int luaO_utf8esc (char *buff, l_uint32 x); +LUAI_FUNC lu_byte luaO_ceillog2 (unsigned int x); +LUAI_FUNC lu_byte luaO_codeparam (unsigned int p); +LUAI_FUNC l_mem luaO_applyparam (lu_byte p, l_mem x); + LUAI_FUNC int luaO_rawarith (lua_State *L, int op, const TValue *p1, const TValue *p2, TValue *res); LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, StkId res); LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); -LUAI_FUNC int luaO_hexavalue (int c); +LUAI_FUNC unsigned luaO_tostringbuff (const TValue *obj, char *buff); +LUAI_FUNC lu_byte luaO_hexavalue (int c); LUAI_FUNC void luaO_tostring (lua_State *L, TValue *obj); LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp); diff --git a/lua-5.4.7/src/lopcodes.h b/include/lopcodes.h similarity index 73% rename from lua-5.4.7/src/lopcodes.h rename to include/lopcodes.h index 46911ca..b6bd182 100644 --- a/lua-5.4.7/src/lopcodes.h +++ b/include/lopcodes.h @@ -8,6 +8,7 @@ #define lopcodes_h #include "llimits.h" +#include "lobject.h" /*=========================================================================== @@ -18,25 +19,30 @@ 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 iABC C(8) | B(8) |k| A(8) | Op(7) | +ivABC vC(10) | vB(6) |k| A(8) | Op(7) | iABx Bx(17) | A(8) | Op(7) | iAsBx sBx (signed)(17) | A(8) | Op(7) | iAx Ax(25) | Op(7) | isJ sJ (signed)(25) | Op(7) | - A signed argument is represented in excess K: the represented value is - the written unsigned value minus K, where K is half the maximum for the - corresponding unsigned argument. + ('v' stands for "variant", 's' for "signed", 'x' for "extended".) + A signed argument is represented in excess K: The represented value is + the written unsigned value minus K, where K is half (rounded down) the + maximum value for the corresponding unsigned argument. ===========================================================================*/ -enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ +/* basic instruction formats */ +enum OpMode {iABC, ivABC, iABx, iAsBx, iAx, isJ}; /* ** size and position of opcode arguments. */ #define SIZE_C 8 +#define SIZE_vC 10 #define SIZE_B 8 +#define SIZE_vB 6 #define SIZE_Bx (SIZE_C + SIZE_B + 1) #define SIZE_A 8 #define SIZE_Ax (SIZE_Bx + SIZE_A) @@ -49,7 +55,9 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ #define POS_A (POS_OP + SIZE_OP) #define POS_k (POS_A + SIZE_A) #define POS_B (POS_k + 1) +#define POS_vB (POS_k + 1) #define POS_C (POS_B + SIZE_B) +#define POS_vC (POS_vB + SIZE_vB) #define POS_Bx POS_k @@ -64,14 +72,17 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ ** so they must fit in ints. */ -/* Check whether type 'int' has at least 'b' bits ('b' < 32) */ -#define L_INTHASBITS(b) ((UINT_MAX >> ((b) - 1)) >= 1) +/* +** Check whether type 'int' has at least 'b' + 1 bits. +** 'b' < 32; +1 for the sign bit. +*/ +#define L_INTHASBITS(b) ((UINT_MAX >> (b)) >= 1) #if L_INTHASBITS(SIZE_Bx) #define MAXARG_Bx ((1<>1) /* 'sBx' is signed */ @@ -80,13 +91,13 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ #if L_INTHASBITS(SIZE_Ax) #define MAXARG_Ax ((1<> 1) @@ -94,7 +105,9 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ #define MAXARG_A ((1<> 1) #define int2sC(i) ((i) + OFFSET_sC) @@ -113,28 +126,36 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ #define GET_OPCODE(i) (cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0))) #define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ - ((cast(Instruction, o)<>(pos)) & MASK1(size,0))) #define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ - ((cast(Instruction, v)<> sC */ OP_SHLI,/* A B sC R[A] := sC << R[B] */ +OP_SHRI,/* A B sC R[A] := R[B] >> sC */ OP_ADD,/* A B C R[A] := R[B] + R[C] */ OP_SUB,/* A B C R[A] := R[B] - R[C] */ @@ -255,7 +289,7 @@ OP_BXOR,/* A B C R[A] := R[B] ~ R[C] */ OP_SHL,/* A B C R[A] := R[B] << R[C] */ OP_SHR,/* A B C R[A] := R[B] >> R[C] */ -OP_MMBIN,/* A B C call C metamethod over R[A] and R[B] (*) */ +OP_MMBIN,/* A B C call C metamethod over R[A] and R[B] */ OP_MMBINI,/* A sB C k call C metamethod over R[A] and sB */ OP_MMBINK,/* A B C k call C metamethod over R[A] and K[B] */ @@ -281,12 +315,12 @@ OP_GTI,/* A sB k if ((R[A] > sB) ~= k) then pc++ */ OP_GEI,/* A sB k if ((R[A] >= sB) ~= k) then pc++ */ OP_TEST,/* A k if (not R[A] == k) then pc++ */ -OP_TESTSET,/* A B k if (not R[B] == k) then pc++ else R[A] := R[B] (*) */ +OP_TESTSET,/* A B k if (not R[B] == k) then pc++ else R[A] := R[B] */ OP_CALL,/* A B C R[A], ... ,R[A+C-2] := R[A](R[A+1], ... ,R[A+B-1]) */ OP_TAILCALL,/* A B C k return R[A](R[A+1], ... ,R[A+B-1]) */ -OP_RETURN,/* A B C k return R[A], ... ,R[A+B-2] (see note) */ +OP_RETURN,/* A B C k return R[A], ... ,R[A+B-2] */ OP_RETURN0,/* return */ OP_RETURN1,/* A return R[A] */ @@ -298,13 +332,17 @@ OP_TFORPREP,/* A Bx create upvalue for R[A + 3]; pc+=Bx */ OP_TFORCALL,/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); */ OP_TFORLOOP,/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } */ -OP_SETLIST,/* A B C k R[A][C+i] := R[A+i], 1 <= i <= B */ +OP_SETLIST,/* A vB vC k R[A][vC+i] := R[A+i], 1 <= i <= vB */ OP_CLOSURE,/* A Bx R[A] := closure(KPROTO[Bx]) */ -OP_VARARG,/* A C R[A], R[A+1], ..., R[A+C-2] = vararg */ +OP_VARARG,/* A B C k R[A], ..., R[A+C-2] = varargs */ + +OP_GETVARG, /* A B C R[A] := R[B][R[C]], R[B] is vararg parameter */ + +OP_ERRNNIL,/* A Bx raise error if R[A] ~= nil (K[Bx - 1] is global name)*/ -OP_VARARGPREP,/*A (adjust vararg parameters) */ +OP_VARARGPREP,/* (adjust varargs) */ OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */ } OpCode; @@ -333,7 +371,8 @@ OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */ OP_RETURN*, OP_SETLIST) may use 'top'. (*) In OP_VARARG, if (C == 0) then use actual number of varargs and - set top (like in OP_CALL with C == 0). + set top (like in OP_CALL with C == 0). 'k' means function has a + vararg table, which is in R[B]. (*) In OP_RETURN, if (B == 0) then return up to 'top'. @@ -344,22 +383,27 @@ OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */ real C = EXTRAARG _ C (the bits of EXTRAARG concatenated with the bits of C). - (*) In OP_NEWTABLE, B is log2 of the hash size (which is always a + (*) In OP_NEWTABLE, vB is log2 of the hash size (which is always a power of 2) plus 1, or zero for size zero. If not k, the array size - is C. Otherwise, the array size is EXTRAARG _ C. + is vC. Otherwise, the array size is EXTRAARG _ vC. + + (*) In OP_ERRNNIL, (Bx == 0) means index of global name doesn't + fit in Bx. (So, that name is not available for the error message.) (*) For comparisons, k specifies what condition the test should accept (true or false). (*) In OP_MMBINI/OP_MMBINK, k means the arguments were flipped - (the constant is the first operand). + (the constant is the first operand). - (*) All 'skips' (pc++) assume that next instruction is a jump. + (*) All comparison and test instructions assume that the instruction + being skipped (pc++) is a jump. (*) In instructions OP_RETURN/OP_TAILCALL, 'k' specifies that the function builds upvalues, which may need to be closed. C > 0 means - the function is vararg, so that its 'func' must be corrected before - returning; in this case, (C - 1) is its number of fixed parameters. + the function has hidden vararg arguments, so that its 'func' must be + corrected before returning; in this case, (C - 1) is its number of + fixed parameters. (*) In comparisons with an immediate operand, C signals whether the original operand was a float. (It must be corrected in case of @@ -387,19 +431,9 @@ LUAI_DDEC(const lu_byte luaP_opmodes[NUM_OPCODES];) #define testOTMode(m) (luaP_opmodes[m] & (1 << 6)) #define testMMMode(m) (luaP_opmodes[m] & (1 << 7)) -/* "out top" (set top for next instruction) */ -#define isOT(i) \ - ((testOTMode(GET_OPCODE(i)) && GETARG_C(i) == 0) || \ - GET_OPCODE(i) == OP_TAILCALL) - -/* "in top" (uses top from previous instruction) */ -#define isIT(i) (testITMode(GET_OPCODE(i)) && GETARG_B(i) == 0) - -#define opmode(mm,ot,it,t,a,m) \ - (((mm) << 7) | ((ot) << 6) | ((it) << 5) | ((t) << 4) | ((a) << 3) | (m)) +LUAI_FUNC int luaP_isOT (Instruction i); +LUAI_FUNC int luaP_isIT (Instruction i); -/* number of list items to accumulate before a SETLIST instruction */ -#define LFIELDS_PER_FLUSH 50 #endif diff --git a/lua-5.4.7/src/lopnames.h b/include/lopnames.h similarity index 97% rename from lua-5.4.7/src/lopnames.h rename to include/lopnames.h index 965cec9..0554a2e 100644 --- a/lua-5.4.7/src/lopnames.h +++ b/include/lopnames.h @@ -45,8 +45,8 @@ static const char *const opnames[] = { "BANDK", "BORK", "BXORK", - "SHRI", "SHLI", + "SHRI", "ADD", "SUB", "MUL", @@ -94,6 +94,8 @@ static const char *const opnames[] = { "SETLIST", "CLOSURE", "VARARG", + "GETVARG", + "ERRNNIL", "VARARGPREP", "EXTRAARG", NULL diff --git a/lua-5.4.7/src/lparser.h b/include/lparser.h similarity index 73% rename from lua-5.4.7/src/lparser.h rename to include/lparser.h index 5e4500f..a30df04 100644 --- a/lua-5.4.7/src/lparser.h +++ b/include/lparser.h @@ -32,26 +32,36 @@ typedef enum { VKFLT, /* floating constant; nval = numerical float value */ VKINT, /* integer constant; ival = numerical integer value */ VKSTR, /* string constant; strval = TString address; - (string is fixed by the lexer) */ + (string is fixed by the scanner) */ VNONRELOC, /* expression has its value in a fixed register; info = result register */ VLOCAL, /* local variable; var.ridx = register index; var.vidx = relative index in 'actvar.arr' */ + VVARGVAR, /* vararg parameter; var.ridx = register index; + var.vidx = relative index in 'actvar.arr' */ + VGLOBAL, /* global variable; + info = relative index in 'actvar.arr' (or -1 for + implicit declaration) */ VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ VCONST, /* compile-time variable; info = absolute index in 'actvar.arr' */ VINDEXED, /* indexed variable; ind.t = table register; - ind.idx = key's R index */ + ind.idx = key's R index; + ind.ro = true if it represents a read-only global; + ind.keystr = if key is a string, index in 'k' of that string; + -1 if key is not a string */ + VVARGIND, /* indexed vararg parameter; + ind.* as in VINDEXED */ VINDEXUP, /* indexed upvalue; - ind.t = table upvalue; - ind.idx = key's K index */ + ind.idx = key's K index; + ind.* as in VINDEXED */ VINDEXI, /* indexed variable with constant integer; ind.t = table register; ind.idx = key's value */ VINDEXSTR, /* indexed variable with literal string; - ind.t = table register; - ind.idx = key's K index */ + ind.idx = key's K index; + ind.* as in VINDEXED */ VJMP, /* expression is a test/comparison; info = pc of corresponding jump instruction */ VRELOC, /* expression can put result in any register; @@ -75,10 +85,12 @@ typedef struct expdesc { struct { /* for indexed variables */ short idx; /* index (R or "long" K) */ lu_byte t; /* table (register or upvalue) */ + lu_byte ro; /* true if variable is read-only */ + int keystr; /* index in 'k' of string key, or -1 if not a string */ } ind; struct { /* for local variables */ lu_byte ridx; /* register holding the variable */ - unsigned short vidx; /* compiler index (in 'actvar.arr') */ + short vidx; /* index in 'actvar.arr' */ } var; } u; int t; /* patch list of 'exit when true' */ @@ -87,12 +99,22 @@ typedef struct expdesc { /* kinds of variables */ -#define VDKREG 0 /* regular */ -#define RDKCONST 1 /* constant */ -#define RDKTOCLOSE 2 /* to-be-closed */ -#define RDKCTC 3 /* compile-time constant */ +#define VDKREG 0 /* regular local */ +#define RDKCONST 1 /* local constant */ +#define RDKVAVAR 2 /* vararg parameter */ +#define RDKTOCLOSE 3 /* to-be-closed */ +#define RDKCTC 4 /* local compile-time constant */ +#define GDKREG 5 /* regular global */ +#define GDKCONST 6 /* global constant */ + +/* variables that live in registers */ +#define varinreg(v) ((v)->vd.kind <= RDKTOCLOSE) + +/* test for global variables */ +#define varglobal(v) ((v)->vd.kind >= GDKREG) + -/* description of an active local variable */ +/* description of an active variable */ typedef union Vardesc { struct { TValuefields; /* constant value (if it is a compile-time constant) */ @@ -111,8 +133,8 @@ typedef struct Labeldesc { TString *name; /* label identifier */ int pc; /* position in code */ int line; /* line where it appeared */ - lu_byte nactvar; /* number of active variables in that position */ - lu_byte close; /* goto that escapes upvalues */ + short nactvar; /* number of active variables in that position */ + lu_byte close; /* true for goto that escapes upvalues */ } Labeldesc; @@ -146,6 +168,7 @@ typedef struct FuncState { struct FuncState *prev; /* enclosing function */ struct LexState *ls; /* lexical state */ struct BlockCnt *bl; /* chain of current blocks */ + Table *kcache; /* cache for reusing constants */ int pc; /* next position to code (equivalent to 'ncode') */ int lasttarget; /* 'label' of last 'jump label' */ int previousline; /* last line that was saved in 'lineinfo' */ @@ -155,7 +178,7 @@ typedef struct FuncState { int firstlocal; /* index of first local var (in Dyndata array) */ int firstlabel; /* index of first label (in 'dyd->label->arr') */ short ndebugvars; /* number of elements in 'f->locvars' */ - lu_byte nactvar; /* number of active local variables */ + short nactvar; /* number of active variable declarations */ lu_byte nups; /* number of upvalues */ lu_byte freereg; /* first free register */ lu_byte iwthabs; /* instructions issued since last absolute line info */ @@ -163,7 +186,9 @@ typedef struct FuncState { } FuncState; -LUAI_FUNC int luaY_nvarstack (FuncState *fs); +LUAI_FUNC lu_byte luaY_nvarstack (FuncState *fs); +LUAI_FUNC void luaY_checklimit (FuncState *fs, int v, int l, + const char *what); LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, Dyndata *dyd, const char *name, int firstchar); diff --git a/lua-5.4.7/src/lprefix.h b/include/lprefix.h similarity index 100% rename from lua-5.4.7/src/lprefix.h rename to include/lprefix.h diff --git a/lua-5.4.7/src/lstate.h b/include/lstate.h similarity index 77% rename from lua-5.4.7/src/lstate.h rename to include/lstate.h index 007704c..20dc4d2 100644 --- a/lua-5.4.7/src/lstate.h +++ b/include/lstate.h @@ -85,7 +85,7 @@ typedef struct CallInfo CallInfo; ** they must be visited again at the end of the cycle), but they are ** marked black because assignments to them must activate barriers (to ** move them back to TOUCHED1). -** - Open upvales are kept gray to avoid barriers, but they stay out +** - Open upvalues are kept gray to avoid barriers, but they stay out ** of gray lists. (They don't even have a 'gclist' field.) */ @@ -142,6 +142,17 @@ struct lua_longjmp; /* defined in ldo.c */ #define EXTRA_STACK 5 +/* +** Size of cache for strings in the API. 'N' is the number of +** sets (better be a prime) and "M" is the size of each set. +** (M == 1 makes a direct cache.) +*/ +#if !defined(STRCACHE_N) +#define STRCACHE_N 53 +#define STRCACHE_M 2 +#endif + + #define BASIC_STACK_SIZE (2*LUA_MINSTACK) #define stacksize(th) cast_int((th)->stack_last.p - (th)->stack.p) @@ -149,13 +160,14 @@ struct lua_longjmp; /* defined in ldo.c */ /* kinds of Garbage Collection */ #define KGC_INC 0 /* incremental gc */ -#define KGC_GEN 1 /* generational gc */ +#define KGC_GENMINOR 1 /* generational gc in minor (regular) mode */ +#define KGC_GENMAJOR 2 /* generational in major mode */ typedef struct stringtable { - TString **hash; + TString **hash; /* array of buckets (linked lists of strings) */ int nuse; /* number of elements */ - int size; + int size; /* number of buckets */ } stringtable; @@ -171,12 +183,10 @@ typedef struct stringtable { ** yield (from the yield until the next resume); ** - field 'nres' is used only while closing tbc variables when ** returning from a function; -** - field 'transferinfo' is used only during call/returnhooks, -** before the function starts or after it ends. */ struct CallInfo { StkIdRel func; /* function index in the stack */ - StkIdRel top; /* top for this function */ + StkIdRel top; /* top for this function */ struct CallInfo *previous, *next; /* dynamic call link */ union { struct { /* only for Lua functions */ @@ -194,36 +204,55 @@ struct CallInfo { int funcidx; /* called-function index */ int nyield; /* number of values yielded */ int nres; /* number of values returned */ - struct { /* info about transferred values (for call/return hooks) */ - unsigned short ftransfer; /* offset of first value transferred */ - unsigned short ntransfer; /* number of values transferred */ - } transferinfo; } u2; - short nresults; /* expected number of results from this function */ - unsigned short callstatus; + l_uint32 callstatus; }; /* -** Bits in CallInfo status +** Maximum expected number of results from a function +** (must fit in CIST_NRESULTS). */ -#define CIST_OAH (1<<0) /* original value of 'allowhook' */ -#define CIST_C (1<<1) /* call is running a C function */ -#define CIST_FRESH (1<<2) /* call is on a fresh "luaV_execute" frame */ -#define CIST_HOOKED (1<<3) /* call is running a debug hook */ -#define CIST_YPCALL (1<<4) /* doing a yieldable protected call */ -#define CIST_TAIL (1<<5) /* call was tail called */ -#define CIST_HOOKYIELD (1<<6) /* last hook called yielded */ -#define CIST_FIN (1<<7) /* function "called" a finalizer */ -#define CIST_TRAN (1<<8) /* 'ci' has transfer information */ -#define CIST_CLSRET (1<<9) /* function is closing tbc variables */ -/* Bits 10-12 are used for CIST_RECST (see below) */ -#define CIST_RECST 10 -#if defined(LUA_COMPAT_LT_LE) -#define CIST_LEQ (1<<13) /* using __lt for __le */ -#endif +#define MAXRESULTS 250 +/* +** Bits in CallInfo status +*/ +/* bits 0-7 are the expected number of results from this function + 1 */ +#define CIST_NRESULTS 0xffu + +/* bits 8-11 count call metamethods (and their extra arguments) */ +#define CIST_CCMT 8 /* the offset, not the mask */ +#define MAX_CCMT (0xfu << CIST_CCMT) + +/* Bits 12-14 are used for CIST_RECST (see below) */ +#define CIST_RECST 12 /* the offset, not the mask */ + +/* call is running a C function (still in first 16 bits) */ +#define CIST_C (1u << (CIST_RECST + 3)) +/* call is on a fresh "luaV_execute" frame */ +#define CIST_FRESH (cast(l_uint32, CIST_C) << 1) +/* function is closing tbc variables */ +#define CIST_CLSRET (CIST_FRESH << 1) +/* function has tbc variables to close */ +#define CIST_TBC (CIST_CLSRET << 1) +/* original value of 'allowhook' */ +#define CIST_OAH (CIST_TBC << 1) +/* call is running a debug hook */ +#define CIST_HOOKED (CIST_OAH << 1) +/* doing a yieldable protected call */ +#define CIST_YPCALL (CIST_HOOKED << 1) +/* call was tail called */ +#define CIST_TAIL (CIST_YPCALL << 1) +/* last hook called yielded */ +#define CIST_HOOKYIELD (CIST_TAIL << 1) +/* function "called" a finalizer */ +#define CIST_FIN (CIST_HOOKYIELD << 1) + + +#define get_nresults(cs) (cast_int((cs) & CIST_NRESULTS) - 1) + /* ** Field CIST_RECST stores the "recover status", used to keep the error ** status while closing to-be-closed variables in coroutines, so that @@ -233,8 +262,8 @@ struct CallInfo { #define getcistrecst(ci) (((ci)->callstatus >> CIST_RECST) & 7) #define setcistrecst(ci,st) \ check_exp(((st) & 7) == (st), /* status must fit in three bits */ \ - ((ci)->callstatus = ((ci)->callstatus & ~(7 << CIST_RECST)) \ - | ((st) << CIST_RECST))) + ((ci)->callstatus = ((ci)->callstatus & ~(7u << CIST_RECST)) \ + | (cast(l_uint32, st) << CIST_RECST))) /* active function is a Lua function */ @@ -243,9 +272,53 @@ struct CallInfo { /* call is running Lua code (not a hook) */ #define isLuacode(ci) (!((ci)->callstatus & (CIST_C | CIST_HOOKED))) -/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */ -#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v)) -#define getoah(st) ((st) & CIST_OAH) + +#define setoah(ci,v) \ + ((ci)->callstatus = ((v) ? (ci)->callstatus | CIST_OAH \ + : (ci)->callstatus & ~CIST_OAH)) +#define getoah(ci) (((ci)->callstatus & CIST_OAH) ? 1 : 0) + + +/* +** 'per thread' state +*/ +struct lua_State { + CommonHeader; + lu_byte allowhook; + TStatus status; + StkIdRel top; /* first free slot in the stack */ + struct global_State *l_G; + CallInfo *ci; /* call info for current function */ + StkIdRel stack_last; /* end of stack (last element + 1) */ + StkIdRel stack; /* stack base */ + UpVal *openupval; /* list of open upvalues in this stack */ + StkIdRel tbclist; /* list of to-be-closed variables */ + GCObject *gclist; + struct lua_State *twups; /* list of threads with open upvalues */ + struct lua_longjmp *errorJmp; /* current error recover point */ + CallInfo base_ci; /* CallInfo for first level (C host) */ + volatile lua_Hook hook; + ptrdiff_t errfunc; /* current error handling function (stack index) */ + l_uint32 nCcalls; /* number of nested non-yieldable or C calls */ + int oldpc; /* last pc traced */ + int nci; /* number of items in 'ci' list */ + int basehookcount; + int hookcount; + volatile l_signalT hookmask; + struct { /* info about transferred values (for call/return hooks) */ + int ftransfer; /* offset of first value transferred */ + int ntransfer; /* number of values transferred */ + } transferinfo; +}; + + +/* +** thread state + extra space +*/ +typedef struct LX { + lu_byte extra_[LUA_EXTRASPACE]; + lua_State l; +} LX; /* @@ -254,25 +327,21 @@ struct CallInfo { typedef struct global_State { lua_Alloc frealloc; /* function to reallocate memory */ void *ud; /* auxiliary data to 'frealloc' */ - l_mem totalbytes; /* number of bytes currently allocated - GCdebt */ - l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ - lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ - lu_mem lastatomic; /* see function 'genstep' in file 'lgc.c' */ + l_mem GCtotalbytes; /* number of bytes currently allocated + debt */ + l_mem GCdebt; /* bytes counted but not yet allocated */ + l_mem GCmarked; /* number of objects marked in a GC cycle */ + l_mem GCmajorminor; /* auxiliary counter to control major-minor shifts */ stringtable strt; /* hash table for strings */ TValue l_registry; TValue nilvalue; /* a nil value */ unsigned int seed; /* randomized seed for hashes */ + lu_byte gcparams[LUA_GCPN]; lu_byte currentwhite; lu_byte gcstate; /* state of garbage collector */ lu_byte gckind; /* kind of GC running */ lu_byte gcstopem; /* stops emergency collections */ - lu_byte genminormul; /* control for minor generational collections */ - lu_byte genmajormul; /* control for major generational collections */ lu_byte gcstp; /* control whether GC is running */ lu_byte gcemergency; /* true if this is an emergency collection */ - lu_byte gcpause; /* size of pause between successive GCs */ - lu_byte gcstepmul; /* GC "speed" */ - lu_byte gcstepsize; /* (log2 of) GC granularity */ GCObject *allgc; /* list of all collectable objects */ GCObject **sweepgc; /* current position of sweep in list */ GCObject *finobj; /* list of collectable objects with finalizers */ @@ -293,46 +362,18 @@ typedef struct global_State { GCObject *finobjrold; /* list of really old objects with finalizers */ struct lua_State *twups; /* list of threads with open upvalues */ lua_CFunction panic; /* to be called in unprotected errors */ - struct lua_State *mainthread; TString *memerrmsg; /* message for memory-allocation errors */ TString *tmname[TM_N]; /* array with tag-method names */ struct Table *mt[LUA_NUMTYPES]; /* metatables for basic types */ TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */ lua_WarnFunction warnf; /* warning function */ void *ud_warn; /* auxiliary data to 'warnf' */ + LX mainth; /* main thread of this state */ } global_State; -/* -** 'per thread' state -*/ -struct lua_State { - CommonHeader; - lu_byte status; - lu_byte allowhook; - unsigned short nci; /* number of items in 'ci' list */ - StkIdRel top; /* first free slot in the stack */ - global_State *l_G; - CallInfo *ci; /* call info for current function */ - StkIdRel stack_last; /* end of stack (last element + 1) */ - StkIdRel stack; /* stack base */ - UpVal *openupval; /* list of open upvalues in this stack */ - StkIdRel tbclist; /* list of to-be-closed variables */ - GCObject *gclist; - struct lua_State *twups; /* list of threads with open upvalues */ - struct lua_longjmp *errorJmp; /* current error recover point */ - CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ - volatile lua_Hook hook; - ptrdiff_t errfunc; /* current error handling function (stack index) */ - l_uint32 nCcalls; /* number of nested (non-yieldable | C) calls */ - int oldpc; /* last pc traced */ - int basehookcount; - int hookcount; - volatile l_signalT hookmask; -}; - - #define G(L) (L->l_G) +#define mainthread(G) (&(G)->mainth.l) /* ** 'g->nilvalue' being a nil value flags that the state was completely @@ -385,23 +426,25 @@ union GCUnion { /* ** macro to convert a Lua object into a GCObject -** (The access to 'tt' tries to ensure that 'v' is actually a Lua object.) */ -#define obj2gco(v) check_exp((v)->tt >= LUA_TSTRING, &(cast_u(v)->gc)) +#define obj2gco(v) \ + check_exp(novariant((v)->tt) >= LUA_TSTRING, &(cast_u(v)->gc)) + +/* actual number of total memory allocated */ +#define gettotalbytes(g) ((g)->GCtotalbytes - (g)->GCdebt) -/* actual number of total bytes allocated */ -#define gettotalbytes(g) cast(lu_mem, (g)->totalbytes + (g)->GCdebt) LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); +LUAI_FUNC lu_mem luaE_threadsize (lua_State *L); LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); LUAI_FUNC void luaE_shrinkCI (lua_State *L); LUAI_FUNC void luaE_checkcstack (lua_State *L); LUAI_FUNC void luaE_incCstack (lua_State *L); LUAI_FUNC void luaE_warning (lua_State *L, const char *msg, int tocont); LUAI_FUNC void luaE_warnerror (lua_State *L, const char *where); -LUAI_FUNC int luaE_resetthread (lua_State *L, int status); +LUAI_FUNC TStatus luaE_resetthread (lua_State *L, TStatus status); #endif diff --git a/lua-5.4.7/src/lstring.h b/include/lstring.h similarity index 53% rename from lua-5.4.7/src/lstring.h rename to include/lstring.h index 450c239..1643c3d 100644 --- a/lua-5.4.7/src/lstring.h +++ b/include/lstring.h @@ -20,10 +20,23 @@ /* -** Size of a TString: Size of the header plus space for the string +** Maximum length for short strings, that is, strings that are +** internalized. (Cannot be smaller than reserved words or tags for +** metamethods, as these strings must be internalized; +** #("function") = 8, #("__newindex") = 10.) +*/ +#if !defined(LUAI_MAXSHORTLEN) +#define LUAI_MAXSHORTLEN 40 +#endif + + +/* +** Size of a short TString: Size of the header plus space for the string ** itself (including final '\0'). */ -#define sizelstring(l) (offsetof(TString, contents) + ((l) + 1) * sizeof(char)) +#define sizestrshr(l) \ + (offsetof(TString, contents) + ((l) + 1) * sizeof(char)) + #define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ (sizeof(s)/sizeof(char))-1)) @@ -32,7 +45,7 @@ /* ** test whether a string is a reserved word */ -#define isreserved(s) ((s)->tt == LUA_VSHRSTR && (s)->extra > 0) +#define isreserved(s) (strisshr(s) && (s)->extra > 0) /* @@ -41,17 +54,20 @@ #define eqshrstr(a,b) check_exp((a)->tt == LUA_VSHRSTR, (a) == (b)) -LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed); -LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts); -LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b); +LUAI_FUNC unsigned luaS_hashlongstr (TString *ts); +LUAI_FUNC int luaS_eqstr (TString *a, TString *b); LUAI_FUNC void luaS_resize (lua_State *L, int newsize); LUAI_FUNC void luaS_clearcache (global_State *g); LUAI_FUNC void luaS_init (lua_State *L); LUAI_FUNC void luaS_remove (lua_State *L, TString *ts); -LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue); +LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, + unsigned short nuvalue); LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l); - +LUAI_FUNC TString *luaS_newextlstr (lua_State *L, + const char *s, size_t len, lua_Alloc falloc, void *ud); +LUAI_FUNC size_t luaS_sizelngstr (size_t len, int kind); +LUAI_FUNC TString *luaS_normstr (lua_State *L, TString *ts); #endif diff --git a/include/ltable.h b/include/ltable.h new file mode 100644 index 0000000..f3b7bc7 --- /dev/null +++ b/include/ltable.h @@ -0,0 +1,184 @@ +/* +** $Id: ltable.h $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#ifndef ltable_h +#define ltable_h + +#include "lobject.h" + + +#define gnode(t,i) (&(t)->node[i]) +#define gval(n) (&(n)->i_val) +#define gnext(n) ((n)->u.next) + + +/* +** Clear all bits of fast-access metamethods, which means that the table +** may have any of these metamethods. (First access that fails after the +** clearing will set the bit again.) +*/ +#define invalidateTMcache(t) ((t)->flags &= cast_byte(~maskflags)) + + +/* +** Bit BITDUMMY set in 'flags' means the table is using the dummy node +** for its hash part. +*/ + +#define BITDUMMY (1 << 6) +#define NOTBITDUMMY cast_byte(~BITDUMMY) +#define isdummy(t) ((t)->flags & BITDUMMY) + +#define setnodummy(t) ((t)->flags &= NOTBITDUMMY) +#define setdummy(t) ((t)->flags |= BITDUMMY) + + + +/* allocated size for hash nodes */ +#define allocsizenode(t) (isdummy(t) ? 0 : sizenode(t)) + + +/* returns the Node, given the value of a table entry */ +#define nodefromval(v) cast(Node *, (v)) + + + +#define luaH_fastgeti(t,k,res,tag) \ + { Table *h = t; lua_Unsigned u = l_castS2U(k) - 1u; \ + if ((u < h->asize)) { \ + tag = *getArrTag(h, u); \ + if (!tagisempty(tag)) { farr2val(h, u, tag, res); }} \ + else { tag = luaH_getint(h, (k), res); }} + + +#define luaH_fastseti(t,k,val,hres) \ + { Table *h = t; lua_Unsigned u = l_castS2U(k) - 1u; \ + if ((u < h->asize)) { \ + lu_byte *tag = getArrTag(h, u); \ + if (checknoTM(h->metatable, TM_NEWINDEX) || !tagisempty(*tag)) \ + { fval2arr(h, u, tag, val); hres = HOK; } \ + else hres = ~cast_int(u); } \ + else { hres = luaH_psetint(h, k, val); }} + + +/* results from pset */ +#define HOK 0 +#define HNOTFOUND 1 +#define HNOTATABLE 2 +#define HFIRSTNODE 3 + +/* +** 'luaH_get*' operations set 'res', unless the value is absent, and +** return the tag of the result. +** The 'luaH_pset*' (pre-set) operations set the given value and return +** HOK, unless the original value is absent. In that case, if the key +** is really absent, they return HNOTFOUND. Otherwise, if there is a +** slot with that key but with no value, 'luaH_pset*' return an encoding +** of where the key is (usually called 'hres'). (pset cannot set that +** value because there might be a metamethod.) If the slot is in the +** hash part, the encoding is (HFIRSTNODE + hash index); if the slot is +** in the array part, the encoding is (~array index), a negative value. +** The value HNOTATABLE is used by the fast macros to signal that the +** value being indexed is not a table. +** (The size for the array part is limited by the maximum power of two +** that fits in an unsigned integer; that is INT_MAX+1. So, the C-index +** ranges from 0, which encodes to -1, to INT_MAX, which encodes to +** INT_MIN. The size of the hash part is limited by the maximum power of +** two that fits in a signed integer; that is (INT_MAX+1)/2. So, it is +** safe to add HFIRSTNODE to any index there.) +*/ + + +/* +** The array part of a table is represented by an inverted array of +** values followed by an array of tags, to avoid wasting space with +** padding. In between them there is an unsigned int, explained later. +** The 'array' pointer points between the two arrays, so that values are +** indexed with negative indices and tags with non-negative indices. + + Values Tags + -------------------------------------------------------- + ... | Value 1 | Value 0 |unsigned|0|1|... + -------------------------------------------------------- + ^ t->array + +** All accesses to 't->array' should be through the macros 'getArrTag' +** and 'getArrVal'. +*/ + +/* Computes the address of the tag for the abstract C-index 'k' */ +#define getArrTag(t,k) (cast(lu_byte*, (t)->array) + sizeof(unsigned) + (k)) + +/* Computes the address of the value for the abstract C-index 'k' */ +#define getArrVal(t,k) ((t)->array - 1 - (k)) + + +/* +** The unsigned between the two arrays is used as a hint for #t; +** see luaH_getn. It is stored there to avoid wasting space in +** the structure Table for tables with no array part. +*/ +#define lenhint(t) cast(unsigned*, (t)->array) + + +/* +** Move TValues to/from arrays, using C indices +*/ +#define arr2obj(h,k,val) \ + ((val)->tt_ = *getArrTag(h,(k)), (val)->value_ = *getArrVal(h,(k))) + +#define obj2arr(h,k,val) \ + (*getArrTag(h,(k)) = (val)->tt_, *getArrVal(h,(k)) = (val)->value_) + + +/* +** Often, we need to check the tag of a value before moving it. The +** following macros also move TValues to/from arrays, but receive the +** precomputed tag value or address as an extra argument. +*/ +#define farr2val(h,k,tag,res) \ + ((res)->tt_ = tag, (res)->value_ = *getArrVal(h,(k))) + +#define fval2arr(h,k,tag,val) \ + (*tag = (val)->tt_, *getArrVal(h,(k)) = (val)->value_) + + +LUAI_FUNC lu_byte luaH_get (Table *t, const TValue *key, TValue *res); +LUAI_FUNC lu_byte luaH_getshortstr (Table *t, TString *key, TValue *res); +LUAI_FUNC lu_byte luaH_getstr (Table *t, TString *key, TValue *res); +LUAI_FUNC lu_byte luaH_getint (Table *t, lua_Integer key, TValue *res); + +/* Special get for metamethods */ +LUAI_FUNC const TValue *luaH_Hgetshortstr (Table *t, TString *key); + +LUAI_FUNC int luaH_psetint (Table *t, lua_Integer key, TValue *val); +LUAI_FUNC int luaH_psetshortstr (Table *t, TString *key, TValue *val); +LUAI_FUNC int luaH_psetstr (Table *t, TString *key, TValue *val); +LUAI_FUNC int luaH_pset (Table *t, const TValue *key, TValue *val); + +LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key, + TValue *value); +LUAI_FUNC void luaH_set (lua_State *L, Table *t, const TValue *key, + TValue *value); + +LUAI_FUNC void luaH_finishset (lua_State *L, Table *t, const TValue *key, + TValue *value, int hres); +LUAI_FUNC Table *luaH_new (lua_State *L); +LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned nasize, + unsigned nhsize); +LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned nasize); +LUAI_FUNC lu_mem luaH_size (Table *t); +LUAI_FUNC void luaH_free (lua_State *L, Table *t); +LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); +LUAI_FUNC lua_Unsigned luaH_getn (lua_State *L, Table *t); + + +#if defined(LUA_DEBUG) +LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); +#endif + + +#endif diff --git a/lua-5.4.7/src/ltm.h b/include/ltm.h similarity index 73% rename from lua-5.4.7/src/ltm.h rename to include/ltm.h index 73b833c..07fc8c1 100644 --- a/lua-5.4.7/src/ltm.h +++ b/include/ltm.h @@ -48,10 +48,10 @@ typedef enum { /* ** Mask with 1 in all fast-access methods. A 1 in any of these bits ** in the flag of a (meta)table means the metatable does not have the -** corresponding metamethod field. (Bit 7 of the flag is used for -** 'isrealasize'.) +** corresponding metamethod field. (Bit 6 of the flag indicates that +** the table is using the dummy node; bit 7 is used for 'isrealasize'.) */ -#define maskflags (~(~0u << (TM_EQ + 1))) +#define maskflags cast_byte(~(~0u << (TM_EQ + 1))) /* @@ -60,11 +60,12 @@ typedef enum { */ #define notm(tm) ttisnil(tm) +#define checknoTM(mt,e) ((mt) == NULL || (mt)->flags & (1u<<(e))) -#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ - ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) +#define gfasttm(g,mt,e) \ + (checknoTM(mt, e) ? NULL : luaT_gettm(mt, e, (g)->tmname[e])) -#define fasttm(l,et,e) gfasttm(G(l), et, e) +#define fasttm(l,mt,e) gfasttm(G(l), mt, e) #define ttypename(x) luaT_typenames_[(x) + 1] @@ -80,8 +81,8 @@ LUAI_FUNC void luaT_init (lua_State *L); LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, const TValue *p2, const TValue *p3); -LUAI_FUNC void luaT_callTMres (lua_State *L, const TValue *f, - const TValue *p1, const TValue *p2, StkId p3); +LUAI_FUNC lu_byte luaT_callTMres (lua_State *L, const TValue *f, + const TValue *p1, const TValue *p2, StkId p3); LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, StkId res, TMS event); LUAI_FUNC void luaT_tryconcatTM (lua_State *L); @@ -94,10 +95,11 @@ LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1, LUAI_FUNC int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, int inv, int isfloat, TMS event); -LUAI_FUNC void luaT_adjustvarargs (lua_State *L, int nfixparams, - struct CallInfo *ci, const Proto *p); -LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci, - StkId where, int wanted); +LUAI_FUNC void luaT_adjustvarargs (lua_State *L, struct CallInfo *ci, + const Proto *p); +LUAI_FUNC void luaT_getvararg (CallInfo *ci, StkId ra, TValue *rc); +LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci, StkId where, + int wanted, int vatab); #endif diff --git a/lua-5.4.7/include/lua.h b/include/lua.h similarity index 87% rename from lua-5.4.7/include/lua.h rename to include/lua.h index f050dac..ab473dc 100644 --- a/lua-5.4.7/include/lua.h +++ b/include/lua.h @@ -1,7 +1,7 @@ /* ** $Id: lua.h $ ** Lua - A Scripting Language -** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** Lua.org, PUC-Rio, Brazil (www.lua.org) ** See Copyright Notice at the end of this file */ @@ -13,20 +13,19 @@ #include -#include "luaconf.h" +#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2025 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" -#define LUA_VERSION_MAJOR "5" -#define LUA_VERSION_MINOR "4" -#define LUA_VERSION_RELEASE "7" +#define LUA_VERSION_MAJOR_N 5 +#define LUA_VERSION_MINOR_N 5 +#define LUA_VERSION_RELEASE_N 0 -#define LUA_VERSION_NUM 504 -#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 7) +#define LUA_VERSION_NUM (LUA_VERSION_MAJOR_N * 100 + LUA_VERSION_MINOR_N) +#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + LUA_VERSION_RELEASE_N) -#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR -#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE -#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2024 Lua.org, PUC-Rio" -#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" + +#include "luaconf.h" /* mark for precompiled code ('Lua') */ @@ -38,10 +37,10 @@ /* ** Pseudo-indices -** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty -** space after that to help overflow detection) +** (The stack size is limited to INT_MAX/2; we keep some free empty +** space after that to help overflow detection.) */ -#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000) +#define LUA_REGISTRYINDEX (-(INT_MAX/2 + 1000)) #define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) @@ -81,9 +80,10 @@ typedef struct lua_State lua_State; /* predefined values in the registry */ -#define LUA_RIDX_MAINTHREAD 1 +/* index 1 is reserved for the reference mechanism */ #define LUA_RIDX_GLOBALS 2 -#define LUA_RIDX_LAST LUA_RIDX_GLOBALS +#define LUA_RIDX_MAINTHREAD 3 +#define LUA_RIDX_LAST 3 /* type of numbers in Lua */ @@ -160,11 +160,10 @@ extern const char lua_ident[]; /* ** state manipulation */ -LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud, unsigned seed); LUA_API void (lua_close) (lua_State *L); LUA_API lua_State *(lua_newthread) (lua_State *L); LUA_API int (lua_closethread) (lua_State *L, lua_State *from); -LUA_API int (lua_resetthread) (lua_State *L); /* Deprecated! */ LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); @@ -245,6 +244,8 @@ LUA_API void (lua_pushnil) (lua_State *L); LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len); +LUA_API const char *(lua_pushexternalstring) (lua_State *L, + const char *s, size_t len, lua_Alloc falloc, void *ud); LUA_API const char *(lua_pushstring) (lua_State *L, const char *s); LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, va_list argp); @@ -324,7 +325,7 @@ LUA_API void (lua_warning) (lua_State *L, const char *msg, int tocont); /* -** garbage-collection function and options +** garbage-collection options */ #define LUA_GCSTOP 0 @@ -333,11 +334,28 @@ LUA_API void (lua_warning) (lua_State *L, const char *msg, int tocont); #define LUA_GCCOUNT 3 #define LUA_GCCOUNTB 4 #define LUA_GCSTEP 5 -#define LUA_GCSETPAUSE 6 -#define LUA_GCSETSTEPMUL 7 -#define LUA_GCISRUNNING 9 -#define LUA_GCGEN 10 -#define LUA_GCINC 11 +#define LUA_GCISRUNNING 6 +#define LUA_GCGEN 7 +#define LUA_GCINC 8 +#define LUA_GCPARAM 9 + + +/* +** garbage-collection parameters +*/ +/* parameters for generational mode */ +#define LUA_GCPMINORMUL 0 /* control minor collections */ +#define LUA_GCPMAJORMINOR 1 /* control shift major->minor */ +#define LUA_GCPMINORMAJOR 2 /* control shift minor->major */ + +/* parameters for incremental mode */ +#define LUA_GCPPAUSE 3 /* size of pause between successive GCs */ +#define LUA_GCPSTEPMUL 4 /* GC "speed" */ +#define LUA_GCPSTEPSIZE 5 /* GC granularity */ + +/* number of parameters */ +#define LUA_GCPN 6 + LUA_API int (lua_gc) (lua_State *L, int what, ...); @@ -353,7 +371,9 @@ LUA_API int (lua_next) (lua_State *L, int idx); LUA_API void (lua_concat) (lua_State *L, int n); LUA_API void (lua_len) (lua_State *L, int idx); -LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); +#define LUA_N2SBUFFSZ 64 +LUA_API unsigned (lua_numbertocstring) (lua_State *L, int idx, char *buff); +LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); @@ -412,19 +432,12 @@ LUA_API void (lua_closeslot) (lua_State *L, int idx); ** compatibility macros ** =============================================================== */ -#if defined(LUA_COMPAT_APIINTCASTS) - -#define lua_pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n)) -#define lua_tounsignedx(L,i,is) ((lua_Unsigned)lua_tointegerx(L,i,is)) -#define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL) - -#endif #define lua_newuserdata(L,s) lua_newuserdatauv(L,s,1) #define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1) #define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1) -#define LUA_NUMTAGS LUA_NUMTYPES +#define lua_resetthread(L) lua_closethread(L,NULL) /* }============================================================== */ @@ -470,7 +483,6 @@ LUA_API lua_Hook (lua_gethook) (lua_State *L); LUA_API int (lua_gethookmask) (lua_State *L); LUA_API int (lua_gethookcount) (lua_State *L); -LUA_API int (lua_setcstacklimit) (lua_State *L, unsigned int limit); struct lua_Debug { int event; @@ -485,9 +497,10 @@ struct lua_Debug { unsigned char nups; /* (u) number of upvalues */ unsigned char nparams;/* (u) number of parameters */ char isvararg; /* (u) */ + unsigned char extraargs; /* (t) number of extra arguments */ char istailcall; /* (t) */ - unsigned short ftransfer; /* (r) index of first value transferred */ - unsigned short ntransfer; /* (r) number of transferred values */ + int ftransfer; /* (r) index of first value transferred */ + int ntransfer; /* (r) number of transferred values */ char short_src[LUA_IDSIZE]; /* (S) */ /* private part */ struct CallInfo *i_ci; /* active function */ @@ -496,8 +509,19 @@ struct lua_Debug { /* }====================================================================== */ +#define LUAI_TOSTRAUX(x) #x +#define LUAI_TOSTR(x) LUAI_TOSTRAUX(x) + +#define LUA_VERSION_MAJOR LUAI_TOSTR(LUA_VERSION_MAJOR_N) +#define LUA_VERSION_MINOR LUAI_TOSTR(LUA_VERSION_MINOR_N) +#define LUA_VERSION_RELEASE LUAI_TOSTR(LUA_VERSION_RELEASE_N) + +#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE + + /****************************************************************************** -* Copyright (C) 1994-2024 Lua.org, PUC-Rio. +* Copyright (C) 1994-2025 Lua.org, PUC-Rio. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the diff --git a/lua-5.4.7/include/lua.hpp b/include/lua.hpp similarity index 51% rename from lua-5.4.7/include/lua.hpp rename to include/lua.hpp index ec417f5..2853364 100644 --- a/lua-5.4.7/include/lua.hpp +++ b/include/lua.hpp @@ -1,6 +1,7 @@ // lua.hpp // Lua header files for C++ -// <> not supplied automatically because Lua also compiles as C++ +// 'extern "C" not supplied automatically in lua.h and other headers +// because Lua also compiles as C++ extern "C" { #include "lua.h" diff --git a/lua-5.4.7/include/luaconf.h b/include/luaconf.h similarity index 84% rename from lua-5.4.7/include/luaconf.h rename to include/luaconf.h index 33bb580..96a7780 100644 --- a/lua-5.4.7/include/luaconf.h +++ b/include/luaconf.h @@ -58,15 +58,26 @@ #endif +/* +** When POSIX DLL ('LUA_USE_DLOPEN') is enabled, the Lua stand-alone +** application will try to dynamically link a 'readline' facility +** for its REPL. In that case, LUA_READLINELIB is the name of the +** library it will look for those facilities. If lua.c cannot open +** the specified library, it will generate a warning and then run +** without 'readline'. If that macro is not defined, lua.c will not +** use 'readline'. +*/ #if defined(LUA_USE_LINUX) #define LUA_USE_POSIX #define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#define LUA_READLINELIB "libreadline.so" #endif #if defined(LUA_USE_MACOSX) #define LUA_USE_POSIX -#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#define LUA_USE_DLOPEN /* macOS does not need -ldl */ +#define LUA_READLINELIB "libedit.dylib" #endif @@ -76,6 +87,11 @@ #endif +#if defined(LUA_USE_C89) && defined(LUA_USE_POSIX) +#error "POSIX is not compatible with C89" +#endif + + /* @@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. */ @@ -122,7 +138,7 @@ /* @@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. */ -#define LUA_32BITS 0 +/* #define LUA_32BITS */ /* @@ -137,7 +153,7 @@ #endif -#if LUA_32BITS /* { */ +#if defined(LUA_32BITS) /* { */ /* ** 32-bit integers and 'float' */ @@ -303,32 +319,13 @@ ** More often than not the libs go together with the core. */ #define LUALIB_API LUA_API -#define LUAMOD_API LUA_API - -/* -@@ LUAI_FUNC is a mark for all extern functions that are not to be -** exported to outside modules. -@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables, -** none of which to be exported to outside modules (LUAI_DDEF for -** definitions and LUAI_DDEC for declarations). -** CHANGE them if you need to mark them in some special way. Elf/gcc -** (versions 3.2 and later) mark them as "hidden" to optimize access -** when Lua is compiled as a shared library. Not all elf targets support -** this attribute. Unfortunately, gcc does not offer a way to check -** whether the target offers that support, and those without support -** give a warning about it. To avoid these warnings, change to the -** default definition. -*/ -#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ - defined(__ELF__) /* { */ -#define LUAI_FUNC __attribute__((visibility("internal"))) extern -#else /* }{ */ -#define LUAI_FUNC extern -#endif /* } */ - -#define LUAI_DDEC(dec) LUAI_FUNC dec -#define LUAI_DDEF /* empty */ +#if defined(__cplusplus) +/* Lua uses the "C name" when calling open functions */ +#define LUAMOD_API extern "C" +#else +#define LUAMOD_API LUA_API +#endif /* }================================================================== */ @@ -340,11 +337,10 @@ */ /* -@@ LUA_COMPAT_5_3 controls other macros for compatibility with Lua 5.3. -** You can define it to get all options, or change specific options -** to fit your specific needs. +@@ LUA_COMPAT_GLOBAL avoids 'global' being a reserved word */ -#if defined(LUA_COMPAT_5_3) /* { */ +#define LUA_COMPAT_GLOBAL + /* @@ LUA_COMPAT_MATHLIB controls the presence of several deprecated @@ -352,23 +348,7 @@ ** (These functions were already officially removed in 5.3; ** nevertheless they are still available here.) */ -#define LUA_COMPAT_MATHLIB - -/* -@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for -** manipulating other integer types (lua_pushunsigned, lua_tounsigned, -** luaL_checkint, luaL_checklong, etc.) -** (These macros were also officially removed in 5.3, but they are still -** available here.) -*/ -#define LUA_COMPAT_APIINTCASTS - - -/* -@@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod -** using '__lt'. -*/ -#define LUA_COMPAT_LT_LE +/* #define LUA_COMPAT_MATHLIB */ /* @@ -385,8 +365,6 @@ #define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) #define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) -#endif /* } */ - /* }================================================================== */ @@ -405,35 +383,23 @@ @@ l_floatatt(x) corrects float attribute 'x' to the proper float type ** by prefixing it with one of FLT/DBL/LDBL. @@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. -@@ LUA_NUMBER_FMT is the format for writing floats. -@@ lua_number2str converts a float to a string. +@@ LUA_NUMBER_FMT is the format for writing floats with the maximum +** number of digits that respects tostring(tonumber(numeral)) == numeral. +** (That would be floor(log10(2^n)), where n is the number of bits in +** the float mantissa.) +@@ LUA_NUMBER_FMT_N is the format for writing floats with the minimum +** number of digits that ensures tonumber(tostring(number)) == number. +** (That would be LUA_NUMBER_FMT+2.) @@ l_mathop allows the addition of an 'l' or 'f' to all math operations. @@ l_floor takes the floor of a float. @@ lua_str2number converts a decimal numeral to a number. */ -/* The following definitions are good for most cases here */ +/* The following definition is good for most cases here */ #define l_floor(x) (l_mathop(floor)(x)) -#define lua_number2str(s,sz,n) \ - l_sprintf((s), sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)(n)) - -/* -@@ lua_numbertointeger converts a float number with an integral value -** to an integer, or returns 0 if float is not within the range of -** a lua_Integer. (The range comparisons are tricky because of -** rounding. The tests here assume a two-complement representation, -** where MININTEGER always has an exact representation as a float; -** MAXINTEGER may not have one, and therefore its conversion to float -** may have an ill-defined value.) -*/ -#define lua_numbertointeger(n,p) \ - ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ - (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ - (*(p) = (LUA_INTEGER)(n), 1)) - /* now the variable definitions */ @@ -447,6 +413,7 @@ #define LUA_NUMBER_FRMLEN "" #define LUA_NUMBER_FMT "%.7g" +#define LUA_NUMBER_FMT_N "%.9g" #define l_mathop(op) op##f @@ -463,6 +430,7 @@ #define LUA_NUMBER_FRMLEN "L" #define LUA_NUMBER_FMT "%.19Lg" +#define LUA_NUMBER_FMT_N "%.21Lg" #define l_mathop(op) op##l @@ -477,7 +445,8 @@ #define LUAI_UACNUMBER double #define LUA_NUMBER_FRMLEN "" -#define LUA_NUMBER_FMT "%.14g" +#define LUA_NUMBER_FMT "%.15g" +#define LUA_NUMBER_FMT_N "%.17g" #define l_mathop(op) op @@ -691,13 +660,6 @@ #endif -#if defined(LUA_CORE) || defined(LUA_LIB) -/* shorter names for Lua's own use */ -#define l_likely(x) luai_likely(x) -#define l_unlikely(x) luai_unlikely(x) -#endif - - /* }================================================================== */ @@ -722,10 +684,7 @@ @@ LUA_USE_APICHECK turns on several consistency checks on the C API. ** Define it as a help when debugging C code. */ -#if defined(LUA_USE_APICHECK) -#include -#define luai_apicheck(l,e) assert(e) -#endif +/* #define LUA_USE_APICHECK */ /* }================================================================== */ @@ -738,20 +697,6 @@ ** ===================================================================== */ -/* -@@ LUAI_MAXSTACK limits the size of the Lua stack. -** CHANGE it if you need a different limit. This limit is arbitrary; -** its only purpose is to stop Lua from consuming unlimited stack -** space (and to reserve some numbers for pseudo-indices). -** (It must fit into max(size_t)/32 and max(int)/2.) -*/ -#if LUAI_IS32INT -#define LUAI_MAXSTACK 1000000 -#else -#define LUAI_MAXSTACK 15000 -#endif - - /* @@ LUA_EXTRASPACE defines the size of a raw memory area associated with ** a Lua state with very fast access. @@ -796,7 +741,5 @@ - - #endif diff --git a/lua-5.4.7/include/lualib.h b/include/lualib.h similarity index 64% rename from lua-5.4.7/include/lualib.h rename to include/lualib.h index 2625529..068f60a 100644 --- a/lua-5.4.7/include/lualib.h +++ b/include/lualib.h @@ -14,39 +14,52 @@ /* version suffix for environment variable names */ #define LUA_VERSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR - +#define LUA_GLIBK 1 LUAMOD_API int (luaopen_base) (lua_State *L); +#define LUA_LOADLIBNAME "package" +#define LUA_LOADLIBK (LUA_GLIBK << 1) +LUAMOD_API int (luaopen_package) (lua_State *L); + + #define LUA_COLIBNAME "coroutine" +#define LUA_COLIBK (LUA_LOADLIBK << 1) LUAMOD_API int (luaopen_coroutine) (lua_State *L); -#define LUA_TABLIBNAME "table" -LUAMOD_API int (luaopen_table) (lua_State *L); +#define LUA_DBLIBNAME "debug" +#define LUA_DBLIBK (LUA_COLIBK << 1) +LUAMOD_API int (luaopen_debug) (lua_State *L); #define LUA_IOLIBNAME "io" +#define LUA_IOLIBK (LUA_DBLIBK << 1) LUAMOD_API int (luaopen_io) (lua_State *L); +#define LUA_MATHLIBNAME "math" +#define LUA_MATHLIBK (LUA_IOLIBK << 1) +LUAMOD_API int (luaopen_math) (lua_State *L); + #define LUA_OSLIBNAME "os" +#define LUA_OSLIBK (LUA_MATHLIBK << 1) LUAMOD_API int (luaopen_os) (lua_State *L); #define LUA_STRLIBNAME "string" +#define LUA_STRLIBK (LUA_OSLIBK << 1) LUAMOD_API int (luaopen_string) (lua_State *L); +#define LUA_TABLIBNAME "table" +#define LUA_TABLIBK (LUA_STRLIBK << 1) +LUAMOD_API int (luaopen_table) (lua_State *L); + #define LUA_UTF8LIBNAME "utf8" +#define LUA_UTF8LIBK (LUA_TABLIBK << 1) LUAMOD_API int (luaopen_utf8) (lua_State *L); -#define LUA_MATHLIBNAME "math" -LUAMOD_API int (luaopen_math) (lua_State *L); - -#define LUA_DBLIBNAME "debug" -LUAMOD_API int (luaopen_debug) (lua_State *L); - -#define LUA_LOADLIBNAME "package" -LUAMOD_API int (luaopen_package) (lua_State *L); +/* open selected libraries */ +LUALIB_API void (luaL_openselectedlibs) (lua_State *L, int load, int preload); -/* open all previous libraries */ -LUALIB_API void (luaL_openlibs) (lua_State *L); +/* open all libraries */ +#define luaL_openlibs(L) luaL_openselectedlibs(L, ~0, 0) #endif diff --git a/lua-5.4.7/src/lundump.h b/include/lundump.h similarity index 72% rename from lua-5.4.7/src/lundump.h rename to include/lundump.h index a97676c..c4e06f9 100644 --- a/lua-5.4.7/src/lundump.h +++ b/include/lundump.h @@ -7,6 +7,8 @@ #ifndef lundump_h #define lundump_h +#include + #include "llimits.h" #include "lobject.h" #include "lzio.h" @@ -15,18 +17,21 @@ /* data to catch conversion errors */ #define LUAC_DATA "\x19\x93\r\n\x1a\n" -#define LUAC_INT 0x5678 -#define LUAC_NUM cast_num(370.5) +#define LUAC_INT -0x5678 +#define LUAC_INST 0x12345678 +#define LUAC_NUM cast_num(-370.5) /* ** Encode major-minor version in one byte, one nibble for each */ -#define LUAC_VERSION (((LUA_VERSION_NUM / 100) * 16) + LUA_VERSION_NUM % 100) +#define LUAC_VERSION (LUA_VERSION_MAJOR_N*16+LUA_VERSION_MINOR_N) #define LUAC_FORMAT 0 /* this is the official format */ + /* load one chunk; from lundump.c */ -LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); +LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name, + int fixed); /* dump one chunk; from ldump.c */ LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, diff --git a/lua-5.4.7/src/lvm.h b/include/lvm.h similarity index 69% rename from lua-5.4.7/src/lvm.h rename to include/lvm.h index dba1ad2..be7b9cb 100644 --- a/lua-5.4.7/src/lvm.h +++ b/include/lvm.h @@ -43,7 +43,7 @@ typedef enum { F2Ieq, /* no rounding; accepts only integral values */ F2Ifloor, /* takes the floor of the number */ - F2Iceil /* takes the ceil of the number */ + F2Iceil /* takes the ceiling of the number */ } F2Imod; @@ -76,38 +76,33 @@ typedef enum { /* -** fast track for 'gettable': if 't' is a table and 't[k]' is present, -** return 1 with 'slot' pointing to 't[k]' (position of final result). -** Otherwise, return 0 (meaning it will have to check metamethod) -** with 'slot' pointing to an empty 't[k]' (if 't' is a table) or NULL -** (otherwise). 'f' is the raw get function to use. +** fast track for 'gettable' */ -#define luaV_fastget(L,t,k,slot,f) \ - (!ttistable(t) \ - ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ - : (slot = f(hvalue(t), k), /* else, do raw access */ \ - !isempty(slot))) /* result not empty? */ +#define luaV_fastget(t,k,res,f, tag) \ + (tag = (!ttistable(t) ? LUA_VNOTABLE : f(hvalue(t), k, res))) /* ** Special case of 'luaV_fastget' for integers, inlining the fast case ** of 'luaH_getint'. */ -#define luaV_fastgeti(L,t,k,slot) \ - (!ttistable(t) \ - ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ - : (slot = (l_castS2U(k) - 1u < hvalue(t)->alimit) \ - ? &hvalue(t)->array[k - 1] : luaH_getint(hvalue(t), k), \ - !isempty(slot))) /* result not empty? */ +#define luaV_fastgeti(t,k,res,tag) \ + if (!ttistable(t)) tag = LUA_VNOTABLE; \ + else { luaH_fastgeti(hvalue(t), k, res, tag); } + + +#define luaV_fastset(t,k,val,hres,f) \ + (hres = (!ttistable(t) ? HNOTATABLE : f(hvalue(t), k, val))) + +#define luaV_fastseti(t,k,val,hres) \ + if (!ttistable(t)) hres = HNOTATABLE; \ + else { luaH_fastseti(hvalue(t), k, val, hres); } /* -** Finish a fast set operation (when fast get succeeds). In that case, -** 'slot' points to the place to put the value. +** Finish a fast set operation (when fast set succeeds). */ -#define luaV_finishfastset(L,t,slot,v) \ - { setobj2t(L, cast(TValue *,slot), v); \ - luaC_barrierback(L, gcvalue(t), v); } +#define luaV_finishfastset(L,t,v) luaC_barrierback(L, gcvalue(t), v) /* @@ -125,10 +120,10 @@ LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode); LUAI_FUNC int luaV_tointegerns (const TValue *obj, lua_Integer *p, F2Imod mode); LUAI_FUNC int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode); -LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key, - StkId val, const TValue *slot); +LUAI_FUNC lu_byte luaV_finishget (lua_State *L, const TValue *t, TValue *key, + StkId val, lu_byte tag); LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key, - TValue *val, const TValue *slot); + TValue *val, int aux); LUAI_FUNC void luaV_finishOp (lua_State *L); LUAI_FUNC void luaV_execute (lua_State *L, CallInfo *ci); LUAI_FUNC void luaV_concat (lua_State *L, int total); diff --git a/lua-5.4.7/src/lzio.h b/include/lzio.h similarity index 92% rename from lua-5.4.7/src/lzio.h rename to include/lzio.h index 38f397f..49047c9 100644 --- a/lua-5.4.7/src/lzio.h +++ b/include/lzio.h @@ -32,7 +32,7 @@ typedef struct Mbuffer { #define luaZ_sizebuffer(buff) ((buff)->buffsize) #define luaZ_bufflen(buff) ((buff)->n) -#define luaZ_buffremove(buff,i) ((buff)->n -= (i)) +#define luaZ_buffremove(buff,i) ((buff)->n -= cast_sizet(i)) #define luaZ_resetbuffer(buff) ((buff)->n = 0) @@ -48,6 +48,7 @@ LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data); LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */ +LUAI_FUNC const void *luaZ_getaddr (ZIO* z, size_t n); /* --------- Private Part ------------------ */ diff --git a/lua-5.4.7-tests/all.lua b/lua-5.4.7-tests/all.lua deleted file mode 100644 index 5df0ff9..0000000 --- a/lua-5.4.7-tests/all.lua +++ /dev/null @@ -1,312 +0,0 @@ -#!../lua --- $Id: testes/all.lua $ --- See Copyright Notice at the end of this file - - -local version = "Lua 5.4" -if _VERSION ~= version then - io.stderr:write("This test suite is for ", version, - ", not for ", _VERSION, "\nExiting tests") - return -end - - -_G.ARG = arg -- save arg for other tests - - --- next variables control the execution of some tests --- true means no test (so an undefined variable does not skip a test) --- defaults are for Linux; test everything. --- Make true to avoid long or memory consuming tests -_soft = rawget(_G, "_soft") or false --- Make true to avoid non-portable tests -_port = rawget(_G, "_port") or false --- Make true to avoid messages about tests not performed -_nomsg = rawget(_G, "_nomsg") or false - - -local usertests = rawget(_G, "_U") - -if usertests then - -- tests for sissies ;) Avoid problems - _soft = true - _port = true - _nomsg = true -end - --- tests should require debug when needed -debug = nil - - -if usertests then - T = nil -- no "internal" tests for user tests -else - T = rawget(_G, "T") -- avoid problems with 'strict' module -end - - ---[=[ - example of a long [comment], - [[spanning several [lines]]] - -]=] - -print("\n\tStarting Tests") - -do - -- set random seed - local random_x, random_y = math.randomseed() - print(string.format("random seeds: %d, %d", random_x, random_y)) -end - -print("current path:\n****" .. package.path .. "****\n") - - -local initclock = os.clock() -local lastclock = initclock -local walltime = os.time() - -local collectgarbage = collectgarbage - -do -- ( - --- track messages for tests not performed -local msgs = {} -function Message (m) - if not _nomsg then - print(m) - msgs[#msgs+1] = string.sub(m, 3, -3) - end -end - -assert(os.setlocale"C") - -local T,print,format,write,assert,type,unpack,floor = - T,print,string.format,io.write,assert,type,table.unpack,math.floor - --- use K for 1000 and M for 1000000 (not 2^10 -- 2^20) -local function F (m) - local function round (m) - m = m + 0.04999 - return format("%.1f", m) -- keep one decimal digit - end - if m < 1000 then return m - else - m = m / 1000 - if m < 1000 then return round(m).."K" - else - return round(m/1000).."M" - end - end -end - -local Cstacklevel - -local showmem -if not T then - local max = 0 - showmem = function () - local m = collectgarbage("count") * 1024 - max = (m > max) and m or max - print(format(" ---- total memory: %s, max memory: %s ----\n", - F(m), F(max))) - end - Cstacklevel = function () return 0 end -- no info about stack level -else - showmem = function () - T.checkmemory() - local total, numblocks, maxmem = T.totalmem() - local count = collectgarbage("count") - print(format( - "\n ---- total memory: %s (%.0fK), max use: %s, blocks: %d\n", - F(total), count, F(maxmem), numblocks)) - print(format("\t(strings: %d, tables: %d, functions: %d, ".. - "\n\tudata: %d, threads: %d)", - T.totalmem"string", T.totalmem"table", T.totalmem"function", - T.totalmem"userdata", T.totalmem"thread")) - end - - Cstacklevel = function () - local _, _, ncalls = T.stacklevel() - return ncalls -- number of C calls - end -end - - -local Cstack = Cstacklevel() - --- --- redefine dofile to run files through dump/undump --- -local function report (n) print("\n***** FILE '"..n.."'*****") end -local olddofile = dofile -local dofile = function (n, strip) - showmem() - local c = os.clock() - print(string.format("time: %g (+%g)", c - initclock, c - lastclock)) - lastclock = c - report(n) - local f = assert(loadfile(n)) - local b = string.dump(f, strip) - f = assert(load(b)) - return f() -end - -dofile('main.lua') - --- trace GC cycles -require"tracegc".start() - -report"gc.lua" -local f = assert(loadfile('gc.lua')) -f() - -dofile('db.lua') -assert(dofile('calls.lua') == deep and deep) -_G.deep = nil -olddofile('strings.lua') -olddofile('literals.lua') -dofile('tpack.lua') -assert(dofile('attrib.lua') == 27) -dofile('gengc.lua') -assert(dofile('locals.lua') == 5) -dofile('constructs.lua') -dofile('code.lua', true) -if not _G._soft then - report('big.lua') - local f = coroutine.wrap(assert(loadfile('big.lua'))) - assert(f() == 'b') - assert(f() == 'a') -end -dofile('cstack.lua') -dofile('nextvar.lua') -dofile('pm.lua') -dofile('utf8.lua') -dofile('api.lua') -assert(dofile('events.lua') == 12) -dofile('vararg.lua') -dofile('closure.lua') -dofile('coroutine.lua') -dofile('goto.lua', true) -dofile('errors.lua') -dofile('math.lua') -dofile('sort.lua', true) -dofile('bitwise.lua') -assert(dofile('verybig.lua', true) == 10); collectgarbage() -dofile('files.lua') - -if #msgs > 0 then - local m = table.concat(msgs, "\n ") - warn("#tests not performed:\n ", m, "\n") -end - -print("(there should be two warnings now)") -warn("@on") -warn("#This is ", "an expected", " warning") -warn("@off") -warn("******** THIS WARNING SHOULD NOT APPEAR **********") -warn("******** THIS WARNING ALSO SHOULD NOT APPEAR **********") -warn("@on") -warn("#This is", " another one") - --- no test module should define 'debug' -assert(debug == nil) - -local debug = require "debug" - -print(string.format("%d-bit integers, %d-bit floats", - string.packsize("j") * 8, string.packsize("n") * 8)) - -debug.sethook(function (a) assert(type(a) == 'string') end, "cr") - --- to survive outside block -_G.showmem = showmem - - -assert(Cstack == Cstacklevel(), - "should be at the same C-stack level it was when started the tests") - -end --) - -local _G, showmem, print, format, clock, time, difftime, - assert, open, warn = - _G, showmem, print, string.format, os.clock, os.time, os.difftime, - assert, io.open, warn - --- file with time of last performed test -local fname = T and "time-debug.txt" or "time.txt" -local lasttime - -if not usertests then - -- open file with time of last performed test - local f = io.open(fname) - if f then - lasttime = assert(tonumber(f:read'a')) - f:close(); - else -- no such file; assume it is recording time for first time - lasttime = nil - end -end - --- erase (almost) all globals -print('cleaning all!!!!') -for n in pairs(_G) do - if not ({___Glob = 1, tostring = 1})[n] then - _G[n] = undef - end -end - - -collectgarbage() -collectgarbage() -collectgarbage() -collectgarbage() -collectgarbage() -collectgarbage();showmem() - -local clocktime = clock() - initclock -walltime = difftime(time(), walltime) - -print(format("\n\ntotal time: %.2fs (wall time: %gs)\n", clocktime, walltime)) - -if not usertests then - lasttime = lasttime or clocktime -- if no last time, ignore difference - -- check whether current test time differs more than 5% from last time - local diff = (clocktime - lasttime) / lasttime - local tolerance = 0.05 -- 5% - if (diff >= tolerance or diff <= -tolerance) then - warn(format("#time difference from previous test: %+.1f%%", - diff * 100)) - end - assert(open(fname, "w")):write(clocktime):close() -end - -print("final OK !!!") - - - ---[[ -***************************************************************************** -* Copyright (C) 1994-2016 Lua.org, PUC-Rio. -* -* Permission is hereby granted, free of charge, to any person obtaining -* a copy of this software and associated documentation files (the -* "Software"), to deal in the Software without restriction, including -* without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to -* permit persons to whom the Software is furnished to do so, subject to -* the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -***************************************************************************** -]] - diff --git a/lua-5.4.7-tests/api.lua b/lua-5.4.7-tests/api.lua deleted file mode 100644 index 752ff18..0000000 --- a/lua-5.4.7-tests/api.lua +++ /dev/null @@ -1,1543 +0,0 @@ --- $Id: testes/api.lua $ --- See Copyright Notice in file all.lua - -if T==nil then - (Message or print)('\n >>> testC not active: skipping API tests <<<\n') - return -end - -local debug = require "debug" - -local pack = table.pack - - --- standard error message for memory errors -local MEMERRMSG = "not enough memory" - -local function tcheck (t1, t2) - assert(t1.n == (t2.n or #t2) + 1) - for i = 2, t1.n do assert(t1[i] == t2[i - 1]) end -end - - -local function checkerr (msg, f, ...) - local stat, err = pcall(f, ...) - assert(not stat and string.find(err, msg)) -end - - -print('testing C API') - -local a = T.testC("pushvalue R; return 1") -assert(a == debug.getregistry()) - - --- absindex -assert(T.testC("settop 10; absindex -1; return 1") == 10) -assert(T.testC("settop 5; absindex -5; return 1") == 1) -assert(T.testC("settop 10; absindex 1; return 1") == 1) -assert(T.testC("settop 10; absindex R; return 1") < -10) - --- testing alignment -a = T.d2s(12458954321123.0) -assert(a == string.pack("d", 12458954321123.0)) -assert(T.s2d(a) == 12458954321123.0) - -local a,b,c = T.testC("pushnum 1; pushnum 2; pushnum 3; return 2") -assert(a == 2 and b == 3 and not c) - -local f = T.makeCfunc("pushnum 1; pushnum 2; pushnum 3; return 2") -a,b,c = f() -assert(a == 2 and b == 3 and not c) - --- test that all trues are equal -a,b,c = T.testC("pushbool 1; pushbool 2; pushbool 0; return 3") -assert(a == b and a == true and c == false) -a,b,c = T.testC"pushbool 0; pushbool 10; pushnil;\ - tobool -3; tobool -3; tobool -3; return 3" -assert(a==false and b==true and c==false) - - -a,b,c = T.testC("gettop; return 2", 10, 20, 30, 40) -assert(a == 40 and b == 5 and not c) - -local t = pack(T.testC("settop 5; return *", 2, 3)) -tcheck(t, {n=4,2,3}) - -t = pack(T.testC("settop 0; settop 15; return 10", 3, 1, 23)) -assert(t.n == 10 and t[1] == nil and t[10] == nil) - -t = pack(T.testC("remove -2; return *", 2, 3, 4)) -tcheck(t, {n=2,2,4}) - -t = pack(T.testC("insert -1; return *", 2, 3)) -tcheck(t, {n=2,2,3}) - -t = pack(T.testC("insert 3; return *", 2, 3, 4, 5)) -tcheck(t, {n=4,2,5,3,4}) - -t = pack(T.testC("replace 2; return *", 2, 3, 4, 5)) -tcheck(t, {n=3,5,3,4}) - -t = pack(T.testC("replace -2; return *", 2, 3, 4, 5)) -tcheck(t, {n=3,2,3,5}) - -t = pack(T.testC("remove 3; return *", 2, 3, 4, 5)) -tcheck(t, {n=3,2,4,5}) - -t = pack(T.testC("copy 3 4; return *", 2, 3, 4, 5)) -tcheck(t, {n=4,2,3,3,5}) - -t = pack(T.testC("copy -3 -1; return *", 2, 3, 4, 5)) -tcheck(t, {n=4,2,3,4,3}) - -do -- testing 'rotate' - local t = {10, 20, 30, 40, 50, 60} - for i = -6, 6 do - local s = string.format("rotate 2 %d; return 7", i) - local t1 = pack(T.testC(s, 10, 20, 30, 40, 50, 60)) - tcheck(t1, t) - table.insert(t, 1, table.remove(t)) - end - - t = pack(T.testC("rotate -2 1; return *", 10, 20, 30, 40)) - tcheck(t, {10, 20, 40, 30}) - t = pack(T.testC("rotate -2 -1; return *", 10, 20, 30, 40)) - tcheck(t, {10, 20, 40, 30}) - - -- some corner cases - t = pack(T.testC("rotate -1 0; return *", 10, 20, 30, 40)) - tcheck(t, {10, 20, 30, 40}) - t = pack(T.testC("rotate -1 1; return *", 10, 20, 30, 40)) - tcheck(t, {10, 20, 30, 40}) - t = pack(T.testC("rotate 5 -1; return *", 10, 20, 30, 40)) - tcheck(t, {10, 20, 30, 40}) -end - - --- testing warnings -T.testC([[ - warningC "#This shold be a" - warningC " single " - warning "warning" - warningC "#This should be " - warning "another one" -]]) - - --- testing message handlers -do - local f = T.makeCfunc[[ - getglobal error - pushstring bola - pcall 1 1 1 # call 'error' with given handler - pushstatus - return 2 # return error message and status - ]] - - local msg, st = f(string.upper) -- function handler - assert(st == "ERRRUN" and msg == "BOLA") - local msg, st = f(string.len) -- function handler - assert(st == "ERRRUN" and msg == 4) - -end - -t = pack(T.testC("insert 3; pushvalue 3; remove 3; pushvalue 2; remove 2; \ - insert 2; pushvalue 1; remove 1; insert 1; \ - insert -2; pushvalue -2; remove -3; return *", - 2, 3, 4, 5, 10, 40, 90)) -tcheck(t, {n=7,2,3,4,5,10,40,90}) - -t = pack(T.testC("concat 5; return *", "alo", 2, 3, "joao", 12)) -tcheck(t, {n=1,"alo23joao12"}) - --- testing MULTRET -t = pack(T.testC("call 2,-1; return *", - function (a,b) return 1,2,3,4,a,b end, "alo", "joao")) -tcheck(t, {n=6,1,2,3,4,"alo", "joao"}) - -do -- test returning more results than fit in the caller stack - local a = {} - for i=1,1000 do a[i] = true end; a[999] = 10 - local b = T.testC([[pcall 1 -1 0; pop 1; tostring -1; return 1]], - table.unpack, a) - assert(b == "10") -end - - --- testing globals -_G.AA = 14; _G.BB = "a31" -local a = {T.testC[[ - getglobal AA; - getglobal BB; - getglobal BB; - setglobal AA; - return * -]]} -assert(a[2] == 14 and a[3] == "a31" and a[4] == nil and _G.AA == "a31") - -_G.AA, _G.BB = nil - --- testing arith -assert(T.testC("pushnum 10; pushnum 20; arith /; return 1") == 0.5) -assert(T.testC("pushnum 10; pushnum 20; arith -; return 1") == -10) -assert(T.testC("pushnum 10; pushnum -20; arith *; return 1") == -200) -assert(T.testC("pushnum 10; pushnum 3; arith ^; return 1") == 1000) -assert(T.testC("pushnum 10; pushstring 20; arith /; return 1") == 0.5) -assert(T.testC("pushstring 10; pushnum 20; arith -; return 1") == -10) -assert(T.testC("pushstring 10; pushstring -20; arith *; return 1") == -200) -assert(T.testC("pushstring 10; pushstring 3; arith ^; return 1") == 1000) -assert(T.testC("arith /; return 1", 2, 0) == 10.0/0) -a = T.testC("pushnum 10; pushint 3; arith \\; return 1") -assert(a == 3.0 and math.type(a) == "float") -a = T.testC("pushint 10; pushint 3; arith \\; return 1") -assert(a == 3 and math.type(a) == "integer") -a = assert(T.testC("pushint 10; pushint 3; arith +; return 1")) -assert(a == 13 and math.type(a) == "integer") -a = assert(T.testC("pushnum 10; pushint 3; arith +; return 1")) -assert(a == 13 and math.type(a) == "float") -a,b,c = T.testC([[pushnum 1; - pushstring 10; arith _; - pushstring 5; return 3]]) -assert(a == 1 and b == -10 and c == "5") -local mt = { - __add = function (a,b) return setmetatable({a[1] + b[1]}, mt) end, - __mod = function (a,b) return setmetatable({a[1] % b[1]}, mt) end, - __unm = function (a) return setmetatable({a[1]* 2}, mt) end} -a,b,c = setmetatable({4}, mt), - setmetatable({8}, mt), - setmetatable({-3}, mt) -local x,y,z = T.testC("arith +; return 2", 10, a, b) -assert(x == 10 and y[1] == 12 and z == nil) -assert(T.testC("arith %; return 1", a, c)[1] == 4%-3) -assert(T.testC("arith _; arith +; arith %; return 1", b, a, c)[1] == - 8 % (4 + (-3)*2)) - --- errors in arithmetic -checkerr("divide by zero", T.testC, "arith \\", 10, 0) -checkerr("%%0", T.testC, "arith %", 10, 0) - - --- testing lessthan and lessequal -assert(T.testC("compare LT 2 5, return 1", 3, 2, 2, 4, 2, 2)) -assert(T.testC("compare LE 2 5, return 1", 3, 2, 2, 4, 2, 2)) -assert(not T.testC("compare LT 3 4, return 1", 3, 2, 2, 4, 2, 2)) -assert(T.testC("compare LE 3 4, return 1", 3, 2, 2, 4, 2, 2)) -assert(T.testC("compare LT 5 2, return 1", 4, 2, 2, 3, 2, 2)) -assert(not T.testC("compare LT 2 -3, return 1", "4", "2", "2", "3", "2", "2")) -assert(not T.testC("compare LT -3 2, return 1", "3", "2", "2", "4", "2", "2")) - --- non-valid indices produce false -assert(not T.testC("compare LT 1 4, return 1")) -assert(not T.testC("compare LE 9 1, return 1")) -assert(not T.testC("compare EQ 9 9, return 1")) - -local b = {__lt = function (a,b) return a[1] < b[1] end} -local a1,a3,a4 = setmetatable({1}, b), - setmetatable({3}, b), - setmetatable({4}, b) -assert(T.testC("compare LT 2 5, return 1", a3, 2, 2, a4, 2, 2)) -assert(T.testC("compare LE 2 5, return 1", a3, 2, 2, a4, 2, 2)) -assert(T.testC("compare LT 5 -6, return 1", a4, 2, 2, a3, 2, 2)) -a,b = T.testC("compare LT 5 -6, return 2", a1, 2, 2, a3, 2, 20) -assert(a == 20 and b == false) -a,b = T.testC("compare LE 5 -6, return 2", a1, 2, 2, a3, 2, 20) -assert(a == 20 and b == false) -a,b = T.testC("compare LE 5 -6, return 2", a1, 2, 2, a1, 2, 20) -assert(a == 20 and b == true) - - -do -- testing lessthan and lessequal with metamethods - local mt = {__lt = function (a,b) return a[1] < b[1] end, - __le = function (a,b) return a[1] <= b[1] end, - __eq = function (a,b) return a[1] == b[1] end} - local function O (x) - return setmetatable({x}, mt) - end - - local a, b = T.testC("compare LT 2 3; pushint 10; return 2", O(1), O(2)) - assert(a == true and b == 10) - local a, b = T.testC("compare LE 2 3; pushint 10; return 2", O(3), O(2)) - assert(a == false and b == 10) - local a, b = T.testC("compare EQ 2 3; pushint 10; return 2", O(3), O(3)) - assert(a == true and b == 10) -end - --- testing length -local t = setmetatable({x = 20}, {__len = function (t) return t.x end}) -a,b,c = T.testC([[ - len 2; - Llen 2; - objsize 2; - return 3 -]], t) -assert(a == 20 and b == 20 and c == 0) - -t.x = "234"; t[1] = 20 -a,b,c = T.testC([[ - len 2; - Llen 2; - objsize 2; - return 3 -]], t) -assert(a == "234" and b == 234 and c == 1) - -t.x = print; t[1] = 20 -a,c = T.testC([[ - len 2; - objsize 2; - return 2 -]], t) -assert(a == print and c == 1) - - --- testing __concat - -a = setmetatable({x="u"}, {__concat = function (a,b) return a.x..'.'..b.x end}) -x,y = T.testC([[ - pushnum 5 - pushvalue 2; - pushvalue 2; - concat 2; - pushvalue -2; - return 2; -]], a, a) -assert(x == a..a and y == 5) - --- concat with 0 elements -assert(T.testC("concat 0; return 1") == "") - --- concat with 1 element -assert(T.testC("concat 1; return 1", "xuxu") == "xuxu") - - - --- testing lua_is - -local function B (x) return x and 1 or 0 end - -local function count (x, n) - n = n or 2 - local prog = [[ - isnumber %d; - isstring %d; - isfunction %d; - iscfunction %d; - istable %d; - isuserdata %d; - isnil %d; - isnull %d; - return 8 - ]] - prog = string.format(prog, n, n, n, n, n, n, n, n) - local a,b,c,d,e,f,g,h = T.testC(prog, x) - return B(a)+B(b)+B(c)+B(d)+B(e)+B(f)+B(g)+(100*B(h)) -end - -assert(count(3) == 2) -assert(count('alo') == 1) -assert(count('32') == 2) -assert(count({}) == 1) -assert(count(print) == 2) -assert(count(function () end) == 1) -assert(count(nil) == 1) -assert(count(io.stdin) == 1) -assert(count(nil, 15) == 100) - - --- testing lua_to... - -local function to (s, x, n) - n = n or 2 - return T.testC(string.format("%s %d; return 1", s, n), x) -end - -local null = T.pushuserdata(0) -local hfunc = string.gmatch("", "") -- a "heavy C function" (with upvalues) -assert(debug.getupvalue(hfunc, 1)) -assert(to("tostring", {}) == nil) -assert(to("tostring", "alo") == "alo") -assert(to("tostring", 12) == "12") -assert(to("tostring", 12, 3) == nil) -assert(to("objsize", {}) == 0) -assert(to("objsize", {1,2,3}) == 3) -assert(to("objsize", "alo\0\0a") == 6) -assert(to("objsize", T.newuserdata(0)) == 0) -assert(to("objsize", T.newuserdata(101)) == 101) -assert(to("objsize", 124) == 0) -assert(to("objsize", true) == 0) -assert(to("tonumber", {}) == 0) -assert(to("tonumber", "12") == 12) -assert(to("tonumber", "s2") == 0) -assert(to("tonumber", 1, 20) == 0) -assert(to("topointer", 10) == null) -assert(to("topointer", true) == null) -assert(to("topointer", nil) == null) -assert(to("topointer", "abc") ~= null) -assert(to("topointer", string.rep("x", 10)) == - to("topointer", string.rep("x", 10))) -- short strings -do -- long strings - local s1 = string.rep("x", 300) - local s2 = string.rep("x", 300) - assert(to("topointer", s1) ~= to("topointer", s2)) -end -assert(to("topointer", T.pushuserdata(20)) ~= null) -assert(to("topointer", io.read) ~= null) -- light C function -assert(to("topointer", hfunc) ~= null) -- "heavy" C function -assert(to("topointer", function () end) ~= null) -- Lua function -assert(to("topointer", io.stdin) ~= null) -- full userdata -assert(to("func2num", 20) == 0) -assert(to("func2num", T.pushuserdata(10)) == 0) -assert(to("func2num", io.read) ~= 0) -- light C function -assert(to("func2num", hfunc) ~= 0) -- "heavy" C function (with upvalue) -a = to("tocfunction", math.deg) -assert(a(3) == math.deg(3) and a == math.deg) - - -print("testing panic function") -do - -- trivial error - assert(T.checkpanic("pushstring hi; error") == "hi") - - -- using the stack inside panic - assert(T.checkpanic("pushstring hi; error;", - [[checkstack 5 XX - pushstring ' alo' - pushstring ' mundo' - concat 3]]) == "hi alo mundo") - - -- "argerror" without frames - assert(T.checkpanic("loadstring 4") == - "bad argument #4 (string expected, got no value)") - - - -- memory error - T.totalmem(T.totalmem()+10000) -- set low memory limit (+10k) - assert(T.checkpanic("newuserdata 20000") == MEMERRMSG) - T.totalmem(0) -- restore high limit - - -- stack error - if not _soft then - local msg = T.checkpanic[[ - pushstring "function f() f() end" - loadstring -1; call 0 0 - getglobal f; call 0 0 - ]] - assert(string.find(msg, "stack overflow")) - end - - -- exit in panic still close to-be-closed variables - assert(T.checkpanic([[ - pushstring "return {__close = function () Y = 'ho'; end}" - newtable - loadstring -2 - call 0 1 - setmetatable -2 - toclose -1 - pushstring "hi" - error - ]], - [[ - getglobal Y - concat 2 # concat original error with global Y - ]]) == "hiho") - - -end - --- testing deep C stack -if not _soft then - print("testing stack overflow") - collectgarbage("stop") - checkerr("XXXX", T.testC, "checkstack 1000023 XXXX") -- too deep - -- too deep (with no message) - checkerr("^stack overflow$", T.testC, "checkstack 1000023 ''") - local s = string.rep("pushnil;checkstack 1 XX;", 1000000) - checkerr("overflow", T.testC, s) - collectgarbage("restart") - print'+' -end - -local lim = _soft and 500 or 12000 -local prog = {"checkstack " .. (lim * 2 + 100) .. "msg", "newtable"} -for i = 1,lim do - prog[#prog + 1] = "pushnum " .. i - prog[#prog + 1] = "pushnum " .. i * 10 -end - -prog[#prog + 1] = "rawgeti R 2" -- get global table in registry -prog[#prog + 1] = "insert " .. -(2*lim + 2) - -for i = 1,lim do - prog[#prog + 1] = "settable " .. -(2*(lim - i + 1) + 1) -end - -prog[#prog + 1] = "return 2" - -prog = table.concat(prog, ";") -local g, t = T.testC(prog) -assert(g == _G) -for i = 1,lim do assert(t[i] == i*10); t[i] = undef end -assert(next(t) == nil) -prog, g, t = nil - --- testing errors - -a = T.testC([[ - loadstring 2; pcall 0 1 0; - pushvalue 3; insert -2; pcall 1 1 0; - pcall 0 0 0; - return 1 -]], "XX=150", function (a) assert(a==nil); return 3 end) - -assert(type(a) == 'string' and XX == 150) -_G.XX = nil - -local function check3(p, ...) - local arg = {...} - assert(#arg == 3) - assert(string.find(arg[3], p)) -end -check3(":1:", T.testC("loadstring 2; return *", "x=")) -check3("%.", T.testC("loadfile 2; return *", ".")) -check3("xxxx", T.testC("loadfile 2; return *", "xxxx")) - --- test errors in non protected threads -local function checkerrnopro (code, msg) - local th = coroutine.create(function () end) -- create new thread - local stt, err = pcall(T.testC, th, code) -- run code there - assert(not stt and string.find(err, msg)) -end - -if not _soft then - collectgarbage("stop") -- avoid __gc with full stack - checkerrnopro("pushnum 3; call 0 0", "attempt to call") - print"testing stack overflow in unprotected thread" - function F () F() end - checkerrnopro("getglobal 'F'; call 0 0;", "stack overflow") - F = nil - collectgarbage("restart") -end -print"+" - - --- testing table access - -do -- getp/setp - local a = {} - local a1 = T.testC("rawsetp 2 1; return 1", a, 20) - assert(a == a1) - assert(a[T.pushuserdata(1)] == 20) - local a1, res = T.testC("rawgetp -1 1; return 2", a) - assert(a == a1 and res == 20) -end - - -do -- using the table itself as index - local a = {} - a[a] = 10 - local prog = "gettable -1; return *" - local res = {T.testC(prog, a)} - assert(#res == 2 and res[1] == prog and res[2] == 10) - - local prog = "settable -2; return *" - local res = {T.testC(prog, a, 20)} - assert(a[a] == 20) - assert(#res == 1 and res[1] == prog) - - -- raw - a[a] = 10 - local prog = "rawget -1; return *" - local res = {T.testC(prog, a)} - assert(#res == 2 and res[1] == prog and res[2] == 10) - - local prog = "rawset -2; return *" - local res = {T.testC(prog, a, 20)} - assert(a[a] == 20) - assert(#res == 1 and res[1] == prog) - - -- using the table as the value to set - local prog = "rawset -1; return *" - local res = {T.testC(prog, 30, a)} - assert(a[30] == a) - assert(#res == 1 and res[1] == prog) - - local prog = "settable -1; return *" - local res = {T.testC(prog, 40, a)} - assert(a[40] == a) - assert(#res == 1 and res[1] == prog) - - local prog = "rawseti -1 100; return *" - local res = {T.testC(prog, a)} - assert(a[100] == a) - assert(#res == 1 and res[1] == prog) - - local prog = "seti -1 200; return *" - local res = {T.testC(prog, a)} - assert(a[200] == a) - assert(#res == 1 and res[1] == prog) -end - -a = {x=0, y=12} -x, y = T.testC("gettable 2; pushvalue 4; gettable 2; return 2", - a, 3, "y", 4, "x") -assert(x == 0 and y == 12) -T.testC("settable -5", a, 3, 4, "x", 15) -assert(a.x == 15) -a[a] = print -x = T.testC("gettable 2; return 1", a) -- table and key are the same object! -assert(x == print) -T.testC("settable 2", a, "x") -- table and key are the same object! -assert(a[a] == "x") - -b = setmetatable({p = a}, {}) -getmetatable(b).__index = function (t, i) return t.p[i] end -local k, x = T.testC("gettable 3, return 2", 4, b, 20, 35, "x") -assert(x == 15 and k == 35) -k = T.testC("getfield 2 y, return 1", b) -assert(k == 12) -getmetatable(b).__index = function (t, i) return a[i] end -getmetatable(b).__newindex = function (t, i,v ) a[i] = v end -y = T.testC("insert 2; gettable -5; return 1", 2, 3, 4, "y", b) -assert(y == 12) -k = T.testC("settable -5, return 1", b, 3, 4, "x", 16) -assert(a.x == 16 and k == 4) -a[b] = 'xuxu' -y = T.testC("gettable 2, return 1", b) -assert(y == 'xuxu') -T.testC("settable 2", b, 19) -assert(a[b] == 19) - --- -do -- testing getfield/setfield with long keys - local t = {_012345678901234567890123456789012345678901234567890123456789 = 32} - local a = T.testC([[ - getfield 2 _012345678901234567890123456789012345678901234567890123456789 - return 1 - ]], t) - assert(a == 32) - local a = T.testC([[ - pushnum 33 - setglobal _012345678901234567890123456789012345678901234567890123456789 - ]]) - assert(_012345678901234567890123456789012345678901234567890123456789 == 33) - _012345678901234567890123456789012345678901234567890123456789 = nil -end - --- testing next -a = {} -t = pack(T.testC("next; return *", a, nil)) -tcheck(t, {n=1,a}) -a = {a=3} -t = pack(T.testC("next; return *", a, nil)) -tcheck(t, {n=3,a,'a',3}) -t = pack(T.testC("next; pop 1; next; return *", a, nil)) -tcheck(t, {n=1,a}) - - - --- testing upvalues - -do - local A = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] - t, b, c = A([[pushvalue U0; pushvalue U1; pushvalue U2; return 3]]) - assert(b == 10 and c == 20 and type(t) == 'table') - a, b = A([[tostring U3; tonumber U4; return 2]]) - assert(a == nil and b == 0) - A([[pushnum 100; pushnum 200; replace U2; replace U1]]) - b, c = A([[pushvalue U1; pushvalue U2; return 2]]) - assert(b == 100 and c == 200) - A([[replace U2; replace U1]], {x=1}, {x=2}) - b, c = A([[pushvalue U1; pushvalue U2; return 2]]) - assert(b.x == 1 and c.x == 2) - T.checkmemory() -end - - --- testing absent upvalues from C-function pointers -assert(T.testC[[isnull U1; return 1]] == true) -assert(T.testC[[isnull U100; return 1]] == true) -assert(T.testC[[pushvalue U1; return 1]] == nil) - -local f = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] -assert(T.upvalue(f, 1) == 10 and - T.upvalue(f, 2) == 20 and - T.upvalue(f, 3) == nil) -T.upvalue(f, 2, "xuxu") -assert(T.upvalue(f, 2) == "xuxu") - - --- large closures -do - local A = "checkstack 300 msg;" .. - string.rep("pushnum 10;", 255) .. - "pushcclosure 255; return 1" - A = T.testC(A) - for i=1,255 do - assert(A(("pushvalue U%d; return 1"):format(i)) == 10) - end - assert(A("isnull U256; return 1")) - assert(not A("isnil U256; return 1")) -end - - - --- testing get/setuservalue --- bug in 5.1.2 -checkerr("got number", debug.setuservalue, 3, {}) -checkerr("got nil", debug.setuservalue, nil, {}) -checkerr("got light userdata", debug.setuservalue, T.pushuserdata(1), {}) - --- testing multiple user values -local b = T.newuserdata(0, 10) -for i = 1, 10 do - local v, p = debug.getuservalue(b, i) - assert(v == nil and p) -end -do -- indices out of range - local v, p = debug.getuservalue(b, -2) - assert(v == nil and not p) - local v, p = debug.getuservalue(b, 11) - assert(v == nil and not p) -end -local t = {true, false, 4.56, print, {}, b, "XYZ"} -for k, v in ipairs(t) do - debug.setuservalue(b, v, k) -end -for k, v in ipairs(t) do - local v1, p = debug.getuservalue(b, k) - assert(v1 == v and p) -end - -assert(not debug.getuservalue(4)) - -debug.setuservalue(b, function () return 10 end, 10) -collectgarbage() -- function should not be collected -assert(debug.getuservalue(b, 10)() == 10) - -debug.setuservalue(b, 134) -collectgarbage() -- number should not be a problem for collector -assert(debug.getuservalue(b) == 134) - - --- test barrier for uservalues -do - local oldmode = collectgarbage("incremental") - T.gcstate("atomic") - assert(T.gccolor(b) == "black") - debug.setuservalue(b, {x = 100}) - T.gcstate("pause") -- complete collection - assert(debug.getuservalue(b).x == 100) -- uvalue should be there - collectgarbage(oldmode) -end - --- long chain of userdata -for i = 1, 1000 do - local bb = T.newuserdata(0, 1) - debug.setuservalue(bb, b) - b = bb -end -collectgarbage() -- nothing should not be collected -for i = 1, 1000 do - b = debug.getuservalue(b) -end -assert(debug.getuservalue(b).x == 100) -b = nil - - --- testing locks (refs) - --- reuse of references -local i = T.ref{} -T.unref(i) -assert(T.ref{} == i) - -local Arr = {} -local Lim = 100 -for i=1,Lim do -- lock many objects - Arr[i] = T.ref({}) -end - -assert(T.ref(nil) == -1 and T.getref(-1) == nil) -T.unref(-1); T.unref(-1) - -for i=1,Lim do -- unlock all them - T.unref(Arr[i]) -end - -local function printlocks () - local f = T.makeCfunc("gettable R; return 1") - local n = f("n") - print("n", n) - for i=0,n do - print(i, f(i)) - end -end - - -for i=1,Lim do -- lock many objects - Arr[i] = T.ref({}) -end - -for i=1,Lim,2 do -- unlock half of them - T.unref(Arr[i]) -end - -assert(type(T.getref(Arr[2])) == 'table') - - -assert(T.getref(-1) == nil) - - -a = T.ref({}) - -collectgarbage() - -assert(type(T.getref(a)) == 'table') - - --- colect in cl the `val' of all collected userdata -local tt = {} -local cl = {n=0} -A = nil; B = nil -local F -F = function (x) - local udval = T.udataval(x) - table.insert(cl, udval) - local d = T.newuserdata(100) -- create garbage - d = nil - assert(debug.getmetatable(x).__gc == F) - assert(load("table.insert({}, {})"))() -- create more garbage - assert(not collectgarbage()) -- GC during GC (no op) - local dummy = {} -- create more garbage during GC - if A ~= nil then - assert(type(A) == "userdata") - assert(T.udataval(A) == B) - debug.getmetatable(A) -- just access it - end - A = x -- ressurect userdata - B = udval - return 1,2,3 -end -tt.__gc = F - - --- test whether udate collection frees memory in the right time -do - collectgarbage(); - collectgarbage(); - local x = collectgarbage("count"); - local a = T.newuserdata(5001) - assert(T.testC("objsize 2; return 1", a) == 5001) - assert(collectgarbage("count") >= x+4) - a = nil - collectgarbage(); - assert(collectgarbage("count") <= x+1) - -- udata without finalizer - x = collectgarbage("count") - collectgarbage("stop") - for i=1,1000 do T.newuserdata(0) end - assert(collectgarbage("count") > x+10) - collectgarbage() - assert(collectgarbage("count") <= x+1) - -- udata with finalizer - collectgarbage() - x = collectgarbage("count") - collectgarbage("stop") - a = {__gc = function () end} - for i=1,1000 do debug.setmetatable(T.newuserdata(0), a) end - assert(collectgarbage("count") >= x+10) - collectgarbage() -- this collection only calls TM, without freeing memory - assert(collectgarbage("count") >= x+10) - collectgarbage() -- now frees memory - assert(collectgarbage("count") <= x+1) - collectgarbage("restart") -end - - -collectgarbage("stop") - --- create 3 userdatas with tag `tt' -a = T.newuserdata(0); debug.setmetatable(a, tt); local na = T.udataval(a) -b = T.newuserdata(0); debug.setmetatable(b, tt); local nb = T.udataval(b) -c = T.newuserdata(0); debug.setmetatable(c, tt); local nc = T.udataval(c) - --- create userdata without meta table -x = T.newuserdata(4) -y = T.newuserdata(0) - -checkerr("FILE%* expected, got userdata", io.input, a) -checkerr("FILE%* expected, got userdata", io.input, x) - -assert(debug.getmetatable(x) == nil and debug.getmetatable(y) == nil) - -local d = T.ref(a); -local e = T.ref(b); -local f = T.ref(c); -t = {T.getref(d), T.getref(e), T.getref(f)} -assert(t[1] == a and t[2] == b and t[3] == c) - -t=nil; a=nil; c=nil; -T.unref(e); T.unref(f) - -collectgarbage() - --- check that unref objects have been collected -assert(#cl == 1 and cl[1] == nc) - -x = T.getref(d) -assert(type(x) == 'userdata' and debug.getmetatable(x) == tt) -x =nil -tt.b = b -- create cycle -tt=nil -- frees tt for GC -A = nil -b = nil -T.unref(d); -local n5 = T.newuserdata(0) -debug.setmetatable(n5, {__gc=F}) -n5 = T.udataval(n5) -collectgarbage() -assert(#cl == 4) --- check order of collection -assert(cl[2] == n5 and cl[3] == nb and cl[4] == na) - -collectgarbage"restart" - - -a, na = {}, {} -for i=30,1,-1 do - a[i] = T.newuserdata(0) - debug.setmetatable(a[i], {__gc=F}) - na[i] = T.udataval(a[i]) -end -cl = {} -a = nil; collectgarbage() -assert(#cl == 30) -for i=1,30 do assert(cl[i] == na[i]) end -na = nil - - -for i=2,Lim,2 do -- unlock the other half - T.unref(Arr[i]) -end - -x = T.newuserdata(41); debug.setmetatable(x, {__gc=F}) -assert(T.testC("objsize 2; return 1", x) == 41) -cl = {} -a = {[x] = 1} -x = T.udataval(x) -collectgarbage() --- old `x' cannot be collected (`a' still uses it) -assert(#cl == 0) -for n in pairs(a) do a[n] = undef end -collectgarbage() -assert(#cl == 1 and cl[1] == x) -- old `x' must be collected - --- testing lua_equal -assert(T.testC("compare EQ 2 4; return 1", print, 1, print, 20)) -assert(T.testC("compare EQ 3 2; return 1", 'alo', "alo")) -assert(T.testC("compare EQ 2 3; return 1", nil, nil)) -assert(not T.testC("compare EQ 2 3; return 1", {}, {})) -assert(not T.testC("compare EQ 2 3; return 1")) -assert(not T.testC("compare EQ 2 3; return 1", 3)) - --- testing lua_equal with fallbacks -do - local map = {} - local t = {__eq = function (a,b) return map[a] == map[b] end} - local function f(x) - local u = T.newuserdata(0) - debug.setmetatable(u, t) - map[u] = x - return u - end - assert(f(10) == f(10)) - assert(f(10) ~= f(11)) - assert(T.testC("compare EQ 2 3; return 1", f(10), f(10))) - assert(not T.testC("compare EQ 2 3; return 1", f(10), f(20))) - t.__eq = nil - assert(f(10) ~= f(10)) -end - -print'+' - - - --- testing changing hooks during hooks -_G.TT = {} -T.sethook([[ - # set a line hook after 3 count hooks - sethook 4 0 ' - getglobal TT; - pushvalue -3; append -2 - pushvalue -2; append -2 - ']], "c", 3) -local a = 1 -- counting -a = 1 -- counting -a = 1 -- count hook (set line hook) -a = 1 -- line hook -a = 1 -- line hook -debug.sethook() -local t = _G.TT -assert(t[1] == "line") -local line = t[2] -assert(t[3] == "line" and t[4] == line + 1) -assert(t[5] == "line" and t[6] == line + 2) -assert(t[7] == nil) -_G.TT = nil - - -------------------------------------------------------------------------- -do -- testing errors during GC - warn("@off") - collectgarbage("stop") - local a = {} - for i=1,20 do - a[i] = T.newuserdata(i) -- creates several udata - end - for i=1,20,2 do -- mark half of them to raise errors during GC - debug.setmetatable(a[i], - {__gc = function (x) error("@expected error in gc") end}) - end - for i=2,20,2 do -- mark the other half to count and to create more garbage - debug.setmetatable(a[i], {__gc = function (x) load("A=A+1")() end}) - end - a = nil - _G.A = 0 - collectgarbage() - assert(A == 10) -- number of normal collections - collectgarbage("restart") - warn("@on") -end -_G.A = nil -------------------------------------------------------------------------- --- test for userdata vals -do - local a = {}; local lim = 30 - for i=0,lim do a[i] = T.pushuserdata(i) end - for i=0,lim do assert(T.udataval(a[i]) == i) end - for i=0,lim do assert(T.pushuserdata(i) == a[i]) end - for i=0,lim do a[a[i]] = i end - for i=0,lim do a[T.pushuserdata(i)] = i end - assert(type(tostring(a[1])) == "string") -end - - -------------------------------------------------------------------------- --- testing multiple states -T.closestate(T.newstate()); -L1 = T.newstate() -assert(L1) - -assert(T.doremote(L1, "X='a'; return 'a'") == 'a') - - -assert(#pack(T.doremote(L1, "function f () return 'alo', 3 end; f()")) == 0) - -a, b = T.doremote(L1, "return f()") -assert(a == 'alo' and b == '3') - -T.doremote(L1, "_ERRORMESSAGE = nil") --- error: `sin' is not defined -a, b, c = T.doremote(L1, "return sin(1)") -assert(a == nil and c == 2) -- 2 == run-time error - --- error: syntax error -a, b, c = T.doremote(L1, "return a+") -assert(a == nil and c == 3 and type(b) == "string") -- 3 == syntax error - -T.loadlib(L1) -a, b, c = T.doremote(L1, [[ - string = require'string' - a = require'_G'; assert(a == _G and require("_G") == a) - io = require'io'; assert(type(io.read) == "function") - assert(require("io") == io) - a = require'table'; assert(type(a.insert) == "function") - a = require'debug'; assert(type(a.getlocal) == "function") - a = require'math'; assert(type(a.sin) == "function") - return string.sub('okinama', 1, 2) -]]) -assert(a == "ok") - -T.closestate(L1); - - -L1 = T.newstate() -T.loadlib(L1) -T.doremote(L1, "a = {}") -T.testC(L1, [[getglobal "a"; pushstring "x"; pushint 1; - settable -3]]) -assert(T.doremote(L1, "return a.x") == "1") - -T.closestate(L1) - -L1 = nil - -print('+') -------------------------------------------------------------------------- --- testing to-be-closed variables -------------------------------------------------------------------------- -print"testing to-be-closed variables" - -do - local openresource = {} - - local function newresource () - local x = setmetatable({10}, {__close = function(y) - assert(openresource[#openresource] == y) - openresource[#openresource] = nil - y[1] = y[1] + 1 - end}) - openresource[#openresource + 1] = x - return x - end - - local a, b = T.testC([[ - call 0 1 # create resource - pushnil - toclose -2 # mark call result to be closed - toclose -1 # mark nil to be closed (will be ignored) - return 2 - ]], newresource) - assert(a[1] == 11 and b == nil) - assert(#openresource == 0) -- was closed - - -- repeat the test, but calling function in a 'multret' context - local a = {T.testC([[ - call 0 1 # create resource - toclose 2 # mark it to be closed - return 2 - ]], newresource)} - assert(type(a[1]) == "string" and a[2][1] == 11) - assert(#openresource == 0) -- was closed - - -- closing by error - local a, b = pcall(T.makeCfunc[[ - call 0 1 # create resource - toclose -1 # mark it to be closed - error # resource is the error object - ]], newresource) - assert(a == false and b[1] == 11) - assert(#openresource == 0) -- was closed - - -- non-closable value - local a, b = pcall(T.makeCfunc[[ - newtable # create non-closable object - toclose -1 # mark it to be closed (should raise an error) - abort # will not be executed - ]]) - assert(a == false and - string.find(b, "non%-closable value")) - - local function check (n) - assert(#openresource == n) - end - - -- closing resources with 'closeslot' - _ENV.xxx = true - local a = T.testC([[ - pushvalue 2 # stack: S, NR, CH, NR - call 0 1 # create resource; stack: S, NR, CH, R - toclose -1 # mark it to be closed - pushvalue 2 # stack: S, NR, CH, R, NR - call 0 1 # create another resource; stack: S, NR, CH, R, R - toclose -1 # mark it to be closed - pushvalue 3 # stack: S, NR, CH, R, R, CH - pushint 2 # there should be two open resources - call 1 0 # stack: S, NR, CH, R, R - closeslot -1 # close second resource - pushvalue 3 # stack: S, NR, CH, R, R, CH - pushint 1 # there should be one open resource - call 1 0 # stack: S, NR, CH, R, R - closeslot 4 - setglobal "xxx" # previous op. erased the slot - pop 1 # pop other resource from the stack - pushint * - return 1 # return stack size - ]], newresource, check) - assert(a == 3 and _ENV.xxx == nil) -- no extra items left in the stack - - -- closing resources with 'pop' - local a = T.testC([[ - pushvalue 2 # stack: S, NR, CH, NR - call 0 1 # create resource; stack: S, NR, CH, R - toclose -1 # mark it to be closed - pushvalue 2 # stack: S, NR, CH, R, NR - call 0 1 # create another resource; stack: S, NR, CH, R, R - toclose -1 # mark it to be closed - pushvalue 3 # stack: S, NR, CH, R, R, CH - pushint 2 # there should be two open resources - call 1 0 # stack: S, NR, CH, R, R - pop 1 # pop second resource - pushvalue 3 # stack: S, NR, CH, R, CH - pushint 1 # there should be one open resource - call 1 0 # stack: S, NR, CH, R - pop 1 # pop other resource from the stack - pushvalue 3 # stack: S, NR, CH, CH - pushint 0 # there should be no open resources - call 1 0 # stack: S, NR, CH - pushint * - return 1 # return stack size - ]], newresource, check) - assert(a == 3) -- no extra items left in the stack - - -- non-closable value - local a, b = pcall(T.makeCfunc[[ - pushint 32 - toclose -1 - ]]) - assert(not a and string.find(b, "(C temporary)")) - -end - - ---[[ -** {================================================================== -** Testing memory limits -** =================================================================== ---]] - -print("memory-allocation errors") - -checkerr("block too big", T.newuserdata, math.maxinteger) -collectgarbage() -local f = load"local a={}; for i=1,100000 do a[i]=i end" -T.alloccount(10) -checkerr(MEMERRMSG, f) -T.alloccount() -- remove limit - - --- test memory errors; increase limit for maximum memory by steps, --- o that we get memory errors in all allocations of a given --- task, until there is enough memory to complete the task without --- errors. -local function testbytes (s, f) - collectgarbage() - local M = T.totalmem() - local oldM = M - local a,b = nil - while true do - collectgarbage(); collectgarbage() - T.totalmem(M) - a, b = T.testC("pcall 0 1 0; pushstatus; return 2", f) - T.totalmem(0) -- remove limit - if a and b == "OK" then break end -- stop when no more errors - if b ~= "OK" and b ~= MEMERRMSG then -- not a memory error? - error(a, 0) -- propagate it - end - M = M + 7 -- increase memory limit - end - print(string.format("minimum memory for %s: %d bytes", s, M - oldM)) - return a -end - --- test memory errors; increase limit for number of allocations one --- by one, so that we get memory errors in all allocations of a given --- task, until there is enough allocations to complete the task without --- errors. - -local function testalloc (s, f) - collectgarbage() - local M = 0 - local a,b = nil - while true do - collectgarbage(); collectgarbage() - T.alloccount(M) - a, b = T.testC("pcall 0 1 0; pushstatus; return 2", f) - T.alloccount() -- remove limit - if a and b == "OK" then break end -- stop when no more errors - if b ~= "OK" and b ~= MEMERRMSG then -- not a memory error? - error(a, 0) -- propagate it - end - M = M + 1 -- increase allocation limit - end - print(string.format("minimum allocations for %s: %d allocations", s, M)) - return a -end - - -local function testamem (s, f) - testalloc(s, f) - return testbytes(s, f) -end - - --- doing nothing -b = testamem("doing nothing", function () return 10 end) -assert(b == 10) - --- testing memory errors when creating a new state - -testamem("state creation", function () - local st = T.newstate() - if st then T.closestate(st) end -- close new state - return st -end) - -testamem("empty-table creation", function () - return {} -end) - -testamem("string creation", function () - return "XXX" .. "YYY" -end) - -testamem("coroutine creation", function() - return coroutine.create(print) -end) - - --- testing to-be-closed variables -testamem("to-be-closed variables", function() - local flag - do - local x = - setmetatable({}, {__close = function () flag = true end}) - flag = false - local x = {} - end - return flag -end) - - --- testing threads - --- get main thread from registry (at index LUA_RIDX_MAINTHREAD == 1) -local mt = T.testC("rawgeti R 1; return 1") -assert(type(mt) == "thread" and coroutine.running() == mt) - - - -local function expand (n,s) - if n==0 then return "" end - local e = string.rep("=", n) - return string.format("T.doonnewstack([%s[ %s;\n collectgarbage(); %s]%s])\n", - e, s, expand(n-1,s), e) -end - -G=0; collectgarbage(); a =collectgarbage("count") -load(expand(20,"G=G+1"))() -assert(G==20); collectgarbage(); -- assert(gcinfo() <= a+1) -G = nil - -testamem("running code on new thread", function () - return T.doonnewstack("local x=1") == 0 -- try to create thread -end) - - --- testing memory x compiler - -testamem("loadstring", function () - return load("x=1") -- try to do load a string -end) - - -local testprog = [[ -local function foo () return end -local t = {"x"} -AA = "aaa" -for i = 1, #t do AA = AA .. t[i] end -return true -]] - --- testing memory x dofile -_G.AA = nil -local t =os.tmpname() -local f = assert(io.open(t, "w")) -f:write(testprog) -f:close() -testamem("dofile", function () - local a = loadfile(t) - return a and a() -end) -assert(os.remove(t)) -assert(_G.AA == "aaax") - - --- other generic tests - -testamem("gsub", function () - local a, b = string.gsub("alo alo", "(a)", function (x) return x..'b' end) - return (a == 'ablo ablo') -end) - -testamem("dump/undump", function () - local a = load(testprog) - local b = a and string.dump(a) - a = b and load(b) - return a and a() -end) - -_G.AA = nil - -local t = os.tmpname() -testamem("file creation", function () - local f = assert(io.open(t, 'w')) - assert (not io.open"nomenaoexistente") - io.close(f); - return not loadfile'nomenaoexistente' -end) -assert(os.remove(t)) - -testamem("table creation", function () - local a, lim = {}, 10 - for i=1,lim do a[i] = i; a[i..'a'] = {} end - return (type(a[lim..'a']) == 'table' and a[lim] == lim) -end) - -testamem("constructors", function () - local a = {10, 20, 30, 40, 50; a=1, b=2, c=3, d=4, e=5} - return (type(a) == 'table' and a.e == 5) -end) - -local a = 1 -local close = nil -testamem("closure creation", function () - function close (b) - return function (x) return b + x end - end - return (close(2)(4) == 6) -end) - -testamem("using coroutines", function () - local a = coroutine.wrap(function () - coroutine.yield(string.rep("a", 10)) - return {} - end) - assert(string.len(a()) == 10) - return a() -end) - -do -- auxiliary buffer - local lim = 100 - local a = {}; for i = 1, lim do a[i] = "01234567890123456789" end - testamem("auxiliary buffer", function () - return (#table.concat(a, ",") == 20*lim + lim - 1) - end) -end - -testamem("growing stack", function () - local function foo (n) - if n == 0 then return 1 else return 1 + foo(n - 1) end - end - return foo(100) -end) - --- }================================================================== - - -do -- testing failing in 'lua_checkstack' - local res = T.testC([[rawcheckstack 500000; return 1]]) - assert(res == false) - local L = T.newstate() - T.alloccount(0) -- will be unable to reallocate the stack - res = T.testC(L, [[rawcheckstack 5000; return 1]]) - T.alloccount() - T.closestate(L) - assert(res == false) -end - -do -- closing state with no extra memory - local L = T.newstate() - T.alloccount(0) - T.closestate(L) - T.alloccount() -end - -do -- garbage collection with no extra memory - local L = T.newstate() - T.loadlib(L) - local res = (T.doremote(L, [[ - _ENV = require"_G" - local T = require"T" - local a = {} - for i = 1, 1000 do a[i] = 'i' .. i end -- grow string table - local stsize, stuse = T.querystr() - assert(stuse > 1000) - local function foo (n) - if n > 0 then foo(n - 1) end - end - foo(180) -- grow stack - local _, stksize = T.stacklevel() - assert(stksize > 180) - a = nil - T.alloccount(0) - collectgarbage() - T.alloccount() - -- stack and string table could not be reallocated, - -- so they kept their sizes (without errors) - assert(select(2, T.stacklevel()) == stksize) - assert(T.querystr() == stsize) - return 'ok' - ]])) - assert(res == 'ok') - T.closestate(L) -end - -print'+' - --- testing some auxlib functions -local function gsub (a, b, c) - a, b = T.testC("gsub 2 3 4; gettop; return 2", a, b, c) - assert(b == 5) - return a -end - -assert(gsub("alo.alo.uhuh.", ".", "//") == "alo//alo//uhuh//") -assert(gsub("alo.alo.uhuh.", "alo", "//") == "//.//.uhuh.") -assert(gsub("", "alo", "//") == "") -assert(gsub("...", ".", "/.") == "/././.") -assert(gsub("...", "...", "") == "") - - --- testing luaL_newmetatable -local mt_xuxu, res, top = T.testC("newmetatable xuxu; gettop; return 3") -assert(type(mt_xuxu) == "table" and res and top == 3) -local d, res, top = T.testC("newmetatable xuxu; gettop; return 3") -assert(mt_xuxu == d and not res and top == 3) -d, res, top = T.testC("newmetatable xuxu1; gettop; return 3") -assert(mt_xuxu ~= d and res and top == 3) - -x = T.newuserdata(0); -y = T.newuserdata(0); -T.testC("pushstring xuxu; gettable R; setmetatable 2", x) -assert(getmetatable(x) == mt_xuxu) - --- testing luaL_testudata --- correct metatable -local res1, res2, top = T.testC([[testudata -1 xuxu - testudata 2 xuxu - gettop - return 3]], x) -assert(res1 and res2 and top == 4) - --- wrong metatable -res1, res2, top = T.testC([[testudata -1 xuxu1 - testudata 2 xuxu1 - gettop - return 3]], x) -assert(not res1 and not res2 and top == 4) - --- non-existent type -res1, res2, top = T.testC([[testudata -1 xuxu2 - testudata 2 xuxu2 - gettop - return 3]], x) -assert(not res1 and not res2 and top == 4) - --- userdata has no metatable -res1, res2, top = T.testC([[testudata -1 xuxu - testudata 2 xuxu - gettop - return 3]], y) -assert(not res1 and not res2 and top == 4) - --- erase metatables -do - local r = debug.getregistry() - assert(r.xuxu == mt_xuxu and r.xuxu1 == d) - r.xuxu = nil; r.xuxu1 = nil -end - -print'OK' - diff --git a/lua-5.4.7-tests/attrib.lua b/lua-5.4.7-tests/attrib.lua deleted file mode 100644 index 458488a..0000000 --- a/lua-5.4.7-tests/attrib.lua +++ /dev/null @@ -1,527 +0,0 @@ --- $Id: testes/attrib.lua $ --- See Copyright Notice in file all.lua - -print "testing require" - -assert(require"string" == string) -assert(require"math" == math) -assert(require"table" == table) -assert(require"io" == io) -assert(require"os" == os) -assert(require"coroutine" == coroutine) - -assert(type(package.path) == "string") -assert(type(package.cpath) == "string") -assert(type(package.loaded) == "table") -assert(type(package.preload) == "table") - -assert(type(package.config) == "string") -print("package config: "..string.gsub(package.config, "\n", "|")) - -do - -- create a path with 'max' templates, - -- each with 1-10 repetitions of '?' - local max = _soft and 100 or 2000 - local t = {} - for i = 1,max do t[i] = string.rep("?", i%10 + 1) end - t[#t + 1] = ";" -- empty template - local path = table.concat(t, ";") - -- use that path in a search - local s, err = package.searchpath("xuxu", path) - -- search fails; check that message has an occurrence of - -- '??????????' with ? replaced by xuxu and at least 'max' lines - assert(not s and - string.find(err, string.rep("xuxu", 10)) and - #string.gsub(err, "[^\n]", "") >= max) - -- path with one very long template - local path = string.rep("?", max) - local s, err = package.searchpath("xuxu", path) - assert(not s and string.find(err, string.rep('xuxu', max))) -end - -do - local oldpath = package.path - package.path = {} - local s, err = pcall(require, "no-such-file") - assert(not s and string.find(err, "package.path")) - package.path = oldpath -end - - -do print"testing 'require' message" - local oldpath = package.path - local oldcpath = package.cpath - - package.path = "?.lua;?/?" - package.cpath = "?.so;?/init" - - local st, msg = pcall(require, 'XXX') - - local expected = [[module 'XXX' not found: - no field package.preload['XXX'] - no file 'XXX.lua' - no file 'XXX/XXX' - no file 'XXX.so' - no file 'XXX/init']] - - assert(msg == expected) - - package.path = oldpath - package.cpath = oldcpath -end - -print('+') - - --- The next tests for 'require' assume some specific directories and --- libraries. - -if not _port then --[ - -local dirsep = string.match(package.config, "^([^\n]+)\n") - --- auxiliary directory with C modules and temporary files -local DIR = "libs" .. dirsep - --- prepend DIR to a name and correct directory separators -local function D (x) - local x = string.gsub(x, "/", dirsep) - return DIR .. x -end - --- prepend DIR and pospend proper C lib. extension to a name -local function DC (x) - local ext = (dirsep == '\\') and ".dll" or ".so" - return D(x .. ext) -end - - -local function createfiles (files, preextras, posextras) - for n,c in pairs(files) do - io.output(D(n)) - io.write(string.format(preextras, n)) - io.write(c) - io.write(string.format(posextras, n)) - io.close(io.output()) - end -end - -local function removefiles (files) - for n in pairs(files) do - os.remove(D(n)) - end -end - -local files = { - ["names.lua"] = "do return {...} end\n", - ["err.lua"] = "B = 15; a = a + 1;", - ["synerr.lua"] = "B =", - ["A.lua"] = "", - ["B.lua"] = "assert(...=='B');require 'A'", - ["A.lc"] = "", - ["A"] = "", - ["L"] = "", - ["XXxX"] = "", - ["C.lua"] = "package.loaded[...] = 25; require'C'", -} - -AA = nil -local extras = [[ -NAME = '%s' -REQUIRED = ... -return AA]] - -createfiles(files, "", extras) - --- testing explicit "dir" separator in 'searchpath' -assert(package.searchpath("C.lua", D"?", "", "") == D"C.lua") -assert(package.searchpath("C.lua", D"?", ".", ".") == D"C.lua") -assert(package.searchpath("--x-", D"?", "-", "X") == D"XXxX") -assert(package.searchpath("---xX", D"?", "---", "XX") == D"XXxX") -assert(package.searchpath(D"C.lua", "?", dirsep) == D"C.lua") -assert(package.searchpath(".\\C.lua", D"?", "\\") == D"./C.lua") - -local oldpath = package.path - -package.path = string.gsub("D/?.lua;D/?.lc;D/?;D/??x?;D/L", "D/", DIR) - -local try = function (p, n, r, ext) - NAME = nil - local rr, x = require(p) - assert(NAME == n) - assert(REQUIRED == p) - assert(rr == r) - assert(ext == x) -end - -local a = require"names" -assert(a[1] == "names" and a[2] == D"names.lua") - -local st, msg = pcall(require, "err") -assert(not st and string.find(msg, "arithmetic") and B == 15) -st, msg = pcall(require, "synerr") -assert(not st and string.find(msg, "error loading module")) - -assert(package.searchpath("C", package.path) == D"C.lua") -assert(require"C" == 25) -assert(require"C" == 25) -AA = nil -try('B', 'B.lua', true, "libs/B.lua") -assert(package.loaded.B) -assert(require"B" == true) -assert(package.loaded.A) -assert(require"C" == 25) -package.loaded.A = nil -try('B', nil, true, nil) -- should not reload package -try('A', 'A.lua', true, "libs/A.lua") -package.loaded.A = nil -os.remove(D'A.lua') -AA = {} -try('A', 'A.lc', AA, "libs/A.lc") -- now must find second option -assert(package.searchpath("A", package.path) == D"A.lc") -assert(require("A") == AA) -AA = false -try('K', 'L', false, "libs/L") -- default option -try('K', 'L', false, "libs/L") -- default option (should reload it) -assert(rawget(_G, "_REQUIREDNAME") == nil) - -AA = "x" -try("X", "XXxX", AA, "libs/XXxX") - - -removefiles(files) -NAME, REQUIRED, AA, B = nil - - --- testing require of sub-packages - -local _G = _G - -package.path = string.gsub("D/?.lua;D/?/init.lua", "D/", DIR) - -files = { - ["P1/init.lua"] = "AA = 10", - ["P1/xuxu.lua"] = "AA = 20", -} - -createfiles(files, "_ENV = {}\n", "\nreturn _ENV\n") -AA = 0 - -local m, ext = assert(require"P1") -assert(ext == "libs/P1/init.lua") -assert(AA == 0 and m.AA == 10) -assert(require"P1" == m) -assert(require"P1" == m) - -assert(package.searchpath("P1.xuxu", package.path) == D"P1/xuxu.lua") -m.xuxu, ext = assert(require"P1.xuxu") -assert(AA == 0 and m.xuxu.AA == 20) -assert(ext == "libs/P1/xuxu.lua") -assert(require"P1.xuxu" == m.xuxu) -assert(require"P1.xuxu" == m.xuxu) -assert(require"P1" == m and m.AA == 10) - - -removefiles(files) -AA = nil - -package.path = "" -assert(not pcall(require, "file_does_not_exist")) -package.path = "??\0?" -assert(not pcall(require, "file_does_not_exist1")) - -package.path = oldpath - --- check 'require' error message -local fname = "file_does_not_exist2" -local m, err = pcall(require, fname) -for t in string.gmatch(package.path..";"..package.cpath, "[^;]+") do - t = string.gsub(t, "?", fname) - assert(string.find(err, t, 1, true)) -end - -do -- testing 'package.searchers' not being a table - local searchers = package.searchers - package.searchers = 3 - local st, msg = pcall(require, 'a') - assert(not st and string.find(msg, "must be a table")) - package.searchers = searchers -end - -local function import(...) - local f = {...} - return function (m) - for i=1, #f do m[f[i]] = _G[f[i]] end - end -end - --- cannot change environment of a C function -assert(not pcall(module, 'XUXU')) - - - --- testing require of C libraries - - -local p = "" -- On Mac OS X, redefine this to "_" - --- check whether loadlib works in this system -local st, err, when = package.loadlib(DC"lib1", "*") -if not st then - local f, err, when = package.loadlib("donotexist", p.."xuxu") - assert(not f and type(err) == "string" and when == "absent") - ;(Message or print)('\n >>> cannot load dynamic library <<<\n') - print(err, when) -else - -- tests for loadlib - local f = assert(package.loadlib(DC"lib1", p.."onefunction")) - local a, b = f(15, 25) - assert(a == 25 and b == 15) - - f = assert(package.loadlib(DC"lib1", p.."anotherfunc")) - assert(f(10, 20) == "10%20\n") - - -- check error messages - local f, err, when = package.loadlib(DC"lib1", p.."xuxu") - assert(not f and type(err) == "string" and when == "init") - f, err, when = package.loadlib("donotexist", p.."xuxu") - assert(not f and type(err) == "string" and when == "open") - - -- symbols from 'lib1' must be visible to other libraries - f = assert(package.loadlib(DC"lib11", p.."luaopen_lib11")) - assert(f() == "exported") - - -- test C modules with prefixes in names - package.cpath = DC"?" - local lib2, ext = require"lib2-v2" - assert(string.find(ext, "libs/lib2-v2", 1, true)) - -- check correct access to global environment and correct - -- parameters - assert(_ENV.x == "lib2-v2" and _ENV.y == DC"lib2-v2") - assert(lib2.id("x") == true) -- a different "id" implementation - - -- test C submodules - local fs, ext = require"lib1.sub" - assert(_ENV.x == "lib1.sub" and _ENV.y == DC"lib1") - assert(string.find(ext, "libs/lib1", 1, true)) - assert(fs.id(45) == 45) - _ENV.x, _ENV.y = nil -end - -_ENV = _G - - --- testing preload - -do - local p = package - package = {} - p.preload.pl = function (...) - local _ENV = {...} - function xuxu (x) return x+20 end - return _ENV - end - - local pl, ext = require"pl" - assert(require"pl" == pl) - assert(pl.xuxu(10) == 30) - assert(pl[1] == "pl" and pl[2] == ":preload:" and ext == ":preload:") - - package = p - assert(type(package.path) == "string") -end - -print('+') - -end --] - -print("testing assignments, logical operators, and constructors") - -local res, res2 = 27 - -local a, b = 1, 2+3 -assert(a==1 and b==5) -a={} -local function f() return 10, 11, 12 end -a.x, b, a[1] = 1, 2, f() -assert(a.x==1 and b==2 and a[1]==10) -a[f()], b, a[f()+3] = f(), a, 'x' -assert(a[10] == 10 and b == a and a[13] == 'x') - -do - local f = function (n) local x = {}; for i=1,n do x[i]=i end; - return table.unpack(x) end; - local a,b,c - a,b = 0, f(1) - assert(a == 0 and b == 1) - a,b = 0, f(1) - assert(a == 0 and b == 1) - a,b,c = 0,5,f(4) - assert(a==0 and b==5 and c==1) - a,b,c = 0,5,f(0) - assert(a==0 and b==5 and c==nil) -end - -local a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6 -assert(not a and b and c and d==6) - -d = 20 -a, b, c, d = f() -assert(a==10 and b==11 and c==12 and d==nil) -a,b = f(), 1, 2, 3, f() -assert(a==10 and b==1) - -assert(ab == true) -assert((10 and 2) == 2) -assert((10 or 2) == 10) -assert((10 or assert(nil)) == 10) -assert(not (nil and assert(nil))) -assert((nil or "alo") == "alo") -assert((nil and 10) == nil) -assert((false and 10) == false) -assert((true or 10) == true) -assert((false or 10) == 10) -assert(false ~= nil) -assert(nil ~= false) -assert(not nil == true) -assert(not not nil == false) -assert(not not 1 == true) -assert(not not a == true) -assert(not not (6 or nil) == true) -assert(not not (nil and 56) == false) -assert(not not (nil and true) == false) -assert(not 10 == false) -assert(not {} == false) -assert(not 0.5 == false) -assert(not "x" == false) - -assert({} ~= {}) -print('+') - -a = {} -a[true] = 20 -a[false] = 10 -assert(a[1<2] == 20 and a[1>2] == 10) - -function f(a) return a end - -local a = {} -for i=3000,-3000,-1 do a[i + 0.0] = i; end -a[10e30] = "alo"; a[true] = 10; a[false] = 20 -assert(a[10e30] == 'alo' and a[not 1] == 20 and a[10<20] == 10) -for i=3000,-3000,-1 do assert(a[i] == i); end -a[print] = assert -a[f] = print -a[a] = a -assert(a[a][a][a][a][print] == assert) -a[print](a[a[f]] == a[print]) -assert(not pcall(function () local a = {}; a[nil] = 10 end)) -assert(not pcall(function () local a = {[nil] = 10} end)) -assert(a[nil] == undef) -a = nil - -local a, b, c -a = {10,9,8,7,6,5,4,3,2; [-3]='a', [f]=print, a='a', b='ab'} -a, a.x, a.y = a, a[-3] -assert(a[1]==10 and a[-3]==a.a and a[f]==print and a.x=='a' and not a.y) -a[1], f(a)[2], b, c = {['alo']=assert}, 10, a[1], a[f], 6, 10, 23, f(a), 2 -a[1].alo(a[2]==10 and b==10 and c==print) - -a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 = 10 -local function foo () - return a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 -end -assert(foo() == 10 and -a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 == -10) - - -do - -- _ENV constant - local function foo () - local _ENV = 11 - X = "hi" - end - local st, msg = pcall(foo) - assert(not st and string.find(msg, "number")) -end - - --- test of large float/integer indices - --- compute maximum integer where all bits fit in a float -local maxint = math.maxinteger - --- trim (if needed) to fit in a float -while maxint ~= (maxint + 0.0) or (maxint - 1) ~= (maxint - 1.0) do - maxint = maxint // 2 -end - -local maxintF = maxint + 0.0 -- float version - -assert(maxintF == maxint and math.type(maxintF) == "float" and - maxintF >= 2.0^14) - --- floats and integers must index the same places -a[maxintF] = 10; a[maxintF - 1.0] = 11; -a[-maxintF] = 12; a[-maxintF + 1.0] = 13; - -assert(a[maxint] == 10 and a[maxint - 1] == 11 and - a[-maxint] == 12 and a[-maxint + 1] == 13) - -a[maxint] = 20 -a[-maxint] = 22 - -assert(a[maxintF] == 20 and a[maxintF - 1.0] == 11 and - a[-maxintF] == 22 and a[-maxintF + 1.0] == 13) - -a = nil - - --- test conflicts in multiple assignment -do - local a,i,j,b - a = {'a', 'b'}; i=1; j=2; b=a - i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i - assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and - b[3] == 1) - a = {} - local function foo () -- assigining to upvalues - b, a.x, a = a, 10, 20 - end - foo() - assert(a == 20 and b.x == 10) -end - --- repeat test with upvalues -do - local a,i,j,b - a = {'a', 'b'}; i=1; j=2; b=a - local function foo () - i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i - end - foo() - assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and - b[3] == 1) - local t = {} - (function (a) t[a], a = 10, 20 end)(1); - assert(t[1] == 10) -end - --- bug in 5.2 beta -local function foo () - local a - return function () - local b - a, b = 3, 14 -- local and upvalue have same index - return a, b - end -end - -local a, b = foo()() -assert(a == 3 and b == 14) - -print('OK') - -return res - diff --git a/lua-5.4.7-tests/big.lua b/lua-5.4.7-tests/big.lua deleted file mode 100644 index 46fd846..0000000 --- a/lua-5.4.7-tests/big.lua +++ /dev/null @@ -1,82 +0,0 @@ --- $Id: testes/big.lua $ --- See Copyright Notice in file all.lua - -if _soft then - return 'a' -end - -print "testing large tables" - -local debug = require"debug" - -local lim = 2^18 + 1000 -local prog = { "local y = {0" } -for i = 1, lim do prog[#prog + 1] = i end -prog[#prog + 1] = "}\n" -prog[#prog + 1] = "X = y\n" -prog[#prog + 1] = ("assert(X[%d] == %d)"):format(lim - 1, lim - 2) -prog[#prog + 1] = "return 0" -prog = table.concat(prog, ";") - -local env = {string = string, assert = assert} -local f = assert(load(prog, nil, nil, env)) - -f() -assert(env.X[lim] == lim - 1 and env.X[lim + 1] == lim) -for k in pairs(env) do env[k] = undef end - --- yields during accesses larger than K (in RK) -setmetatable(env, { - __index = function (t, n) coroutine.yield('g'); return _G[n] end, - __newindex = function (t, n, v) coroutine.yield('s'); _G[n] = v end, -}) - -X = nil -local co = coroutine.wrap(f) -assert(co() == 's') -assert(co() == 'g') -assert(co() == 'g') -assert(co() == 0) - -assert(X[lim] == lim - 1 and X[lim + 1] == lim) - --- errors in accesses larger than K (in RK) -getmetatable(env).__index = function () end -getmetatable(env).__newindex = function () end -local e, m = pcall(f) -assert(not e and m:find("global 'X'")) - --- errors in metamethods -getmetatable(env).__newindex = function () error("hi") end -local e, m = xpcall(f, debug.traceback) -assert(not e and m:find("'newindex'")) - -f, X = nil - -coroutine.yield'b' - -if 2^32 == 0 then -- (small integers) { - -print "testing string length overflow" - -local repstrings = 192 -- number of strings to be concatenated -local ssize = math.ceil(2.0^32 / repstrings) + 1 -- size of each string - -assert(repstrings * ssize > 2.0^32) -- it should be larger than maximum size - -local longs = string.rep("\0", ssize) -- create one long string - --- create function to concatenate 'repstrings' copies of its argument -local rep = assert(load( - "local a = ...; return " .. string.rep("a", repstrings, ".."))) - -local a, b = pcall(rep, longs) -- call that function - --- it should fail without creating string (result would be too large) -assert(not a and string.find(b, "overflow")) - -end -- } - -print'OK' - -return 'a' diff --git a/lua-5.4.7-tests/bitwise.lua b/lua-5.4.7-tests/bitwise.lua deleted file mode 100644 index dd0a1a9..0000000 --- a/lua-5.4.7-tests/bitwise.lua +++ /dev/null @@ -1,363 +0,0 @@ --- $Id: testes/bitwise.lua $ --- See Copyright Notice in file all.lua - -print("testing bitwise operations") - -require "bwcoercion" - -local numbits = string.packsize('j') * 8 - -assert(~0 == -1) - -assert((1 << (numbits - 1)) == math.mininteger) - --- basic tests for bitwise operators; --- use variables to avoid constant folding -local a, b, c, d -a = 0xFFFFFFFFFFFFFFFF -assert(a == -1 and a & -1 == a and a & 35 == 35) -a = 0xF0F0F0F0F0F0F0F0 -assert(a | -1 == -1) -assert(a ~ a == 0 and a ~ 0 == a and a ~ ~a == -1) -assert(a >> 4 == ~a) -a = 0xF0; b = 0xCC; c = 0xAA; d = 0xFD -assert(a | b ~ c & d == 0xF4) - -a = 0xF0.0; b = 0xCC.0; c = "0xAA.0"; d = "0xFD.0" -assert(a | b ~ c & d == 0xF4) - -a = 0xF0000000; b = 0xCC000000; -c = 0xAA000000; d = 0xFD000000 -assert(a | b ~ c & d == 0xF4000000) -assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1) - -a = a << 32 -b = b << 32 -c = c << 32 -d = d << 32 -assert(a | b ~ c & d == 0xF4000000 << 32) -assert(~~a == a and ~a == -1 ~ a and -d == ~d + 1) - - -do -- constant folding - local code = string.format("return -1 >> %d", math.maxinteger) - assert(load(code)() == 0) - local code = string.format("return -1 >> %d", math.mininteger) - assert(load(code)() == 0) - local code = string.format("return -1 << %d", math.maxinteger) - assert(load(code)() == 0) - local code = string.format("return -1 << %d", math.mininteger) - assert(load(code)() == 0) -end - -assert(-1 >> 1 == (1 << (numbits - 1)) - 1 and 1 << 31 == 0x80000000) -assert(-1 >> (numbits - 1) == 1) -assert(-1 >> numbits == 0 and - -1 >> -numbits == 0 and - -1 << numbits == 0 and - -1 << -numbits == 0) - -assert(1 >> math.mininteger == 0) -assert(1 >> math.maxinteger == 0) -assert(1 << math.mininteger == 0) -assert(1 << math.maxinteger == 0) - -assert((2^30 - 1) << 2^30 == 0) -assert((2^30 - 1) >> 2^30 == 0) - -assert(1 >> -3 == 1 << 3 and 1000 >> 5 == 1000 << -5) - - --- coercion from strings to integers -assert("0xffffffffffffffff" | 0 == -1) -assert("0xfffffffffffffffe" & "-1" == -2) -assert(" \t-0xfffffffffffffffe\n\t" & "-1" == 2) -assert(" \n -45 \t " >> " -2 " == -45 * 4) -assert("1234.0" << "5.0" == 1234 * 32) -assert("0xffff.0" ~ "0xAAAA" == 0x5555) -assert(~"0x0.000p4" == -1) - -assert(("7" .. 3) << 1 == 146) -assert(0xffffffff >> (1 .. "9") == 0x1fff) -assert(10 | (1 .. "9") == 27) - -do - local st, msg = pcall(function () return 4 & "a" end) - assert(string.find(msg, "'band'")) - - local st, msg = pcall(function () return ~"a" end) - assert(string.find(msg, "'bnot'")) -end - - --- out of range number -assert(not pcall(function () return "0xffffffffffffffff.0" | 0 end)) - --- embedded zeros -assert(not pcall(function () return "0xffffffffffffffff\0" | 0 end)) - -print'+' - - -package.preload.bit32 = function () --{ - --- no built-in 'bit32' library: implement it using bitwise operators - -local bit = {} - -function bit.bnot (a) - return ~a & 0xFFFFFFFF -end - - --- --- in all vararg functions, avoid creating 'arg' table when there are --- only 2 (or less) parameters, as 2 parameters is the common case --- - -function bit.band (x, y, z, ...) - if not z then - return ((x or -1) & (y or -1)) & 0xFFFFFFFF - else - local arg = {...} - local res = x & y & z - for i = 1, #arg do res = res & arg[i] end - return res & 0xFFFFFFFF - end -end - -function bit.bor (x, y, z, ...) - if not z then - return ((x or 0) | (y or 0)) & 0xFFFFFFFF - else - local arg = {...} - local res = x | y | z - for i = 1, #arg do res = res | arg[i] end - return res & 0xFFFFFFFF - end -end - -function bit.bxor (x, y, z, ...) - if not z then - return ((x or 0) ~ (y or 0)) & 0xFFFFFFFF - else - local arg = {...} - local res = x ~ y ~ z - for i = 1, #arg do res = res ~ arg[i] end - return res & 0xFFFFFFFF - end -end - -function bit.btest (...) - return bit.band(...) ~= 0 -end - -function bit.lshift (a, b) - return ((a & 0xFFFFFFFF) << b) & 0xFFFFFFFF -end - -function bit.rshift (a, b) - return ((a & 0xFFFFFFFF) >> b) & 0xFFFFFFFF -end - -function bit.arshift (a, b) - a = a & 0xFFFFFFFF - if b <= 0 or (a & 0x80000000) == 0 then - return (a >> b) & 0xFFFFFFFF - else - return ((a >> b) | ~(0xFFFFFFFF >> b)) & 0xFFFFFFFF - end -end - -function bit.lrotate (a ,b) - b = b & 31 - a = a & 0xFFFFFFFF - a = (a << b) | (a >> (32 - b)) - return a & 0xFFFFFFFF -end - -function bit.rrotate (a, b) - return bit.lrotate(a, -b) -end - -local function checkfield (f, w) - w = w or 1 - assert(f >= 0, "field cannot be negative") - assert(w > 0, "width must be positive") - assert(f + w <= 32, "trying to access non-existent bits") - return f, ~(-1 << w) -end - -function bit.extract (a, f, w) - local f, mask = checkfield(f, w) - return (a >> f) & mask -end - -function bit.replace (a, v, f, w) - local f, mask = checkfield(f, w) - v = v & mask - a = (a & ~(mask << f)) | (v << f) - return a & 0xFFFFFFFF -end - -return bit - -end --} - - -print("testing bitwise library") - -local bit32 = require'bit32' - -assert(bit32.band() == bit32.bnot(0)) -assert(bit32.btest() == true) -assert(bit32.bor() == 0) -assert(bit32.bxor() == 0) - -assert(bit32.band() == bit32.band(0xffffffff)) -assert(bit32.band(1,2) == 0) - - --- out-of-range numbers -assert(bit32.band(-1) == 0xffffffff) -assert(bit32.band((1 << 33) - 1) == 0xffffffff) -assert(bit32.band(-(1 << 33) - 1) == 0xffffffff) -assert(bit32.band((1 << 33) + 1) == 1) -assert(bit32.band(-(1 << 33) + 1) == 1) -assert(bit32.band(-(1 << 40)) == 0) -assert(bit32.band(1 << 40) == 0) -assert(bit32.band(-(1 << 40) - 2) == 0xfffffffe) -assert(bit32.band((1 << 40) - 4) == 0xfffffffc) - -assert(bit32.lrotate(0, -1) == 0) -assert(bit32.lrotate(0, 7) == 0) -assert(bit32.lrotate(0x12345678, 0) == 0x12345678) -assert(bit32.lrotate(0x12345678, 32) == 0x12345678) -assert(bit32.lrotate(0x12345678, 4) == 0x23456781) -assert(bit32.rrotate(0x12345678, -4) == 0x23456781) -assert(bit32.lrotate(0x12345678, -8) == 0x78123456) -assert(bit32.rrotate(0x12345678, 8) == 0x78123456) -assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa) -assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa) -for i = -50, 50 do - assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i%32)) -end - -assert(bit32.lshift(0x12345678, 4) == 0x23456780) -assert(bit32.lshift(0x12345678, 8) == 0x34567800) -assert(bit32.lshift(0x12345678, -4) == 0x01234567) -assert(bit32.lshift(0x12345678, -8) == 0x00123456) -assert(bit32.lshift(0x12345678, 32) == 0) -assert(bit32.lshift(0x12345678, -32) == 0) -assert(bit32.rshift(0x12345678, 4) == 0x01234567) -assert(bit32.rshift(0x12345678, 8) == 0x00123456) -assert(bit32.rshift(0x12345678, 32) == 0) -assert(bit32.rshift(0x12345678, -32) == 0) -assert(bit32.arshift(0x12345678, 0) == 0x12345678) -assert(bit32.arshift(0x12345678, 1) == 0x12345678 // 2) -assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2) -assert(bit32.arshift(-1, 1) == 0xffffffff) -assert(bit32.arshift(-1, 24) == 0xffffffff) -assert(bit32.arshift(-1, 32) == 0xffffffff) -assert(bit32.arshift(-1, -1) == bit32.band(-1 * 2, 0xffffffff)) - -assert(0x12345678 << 4 == 0x123456780) -assert(0x12345678 << 8 == 0x1234567800) -assert(0x12345678 << -4 == 0x01234567) -assert(0x12345678 << -8 == 0x00123456) -assert(0x12345678 << 32 == 0x1234567800000000) -assert(0x12345678 << -32 == 0) -assert(0x12345678 >> 4 == 0x01234567) -assert(0x12345678 >> 8 == 0x00123456) -assert(0x12345678 >> 32 == 0) -assert(0x12345678 >> -32 == 0x1234567800000000) - -print("+") --- some special cases -local c = {0, 1, 2, 3, 10, 0x80000000, 0xaaaaaaaa, 0x55555555, - 0xffffffff, 0x7fffffff} - -for _, b in pairs(c) do - assert(bit32.band(b) == b) - assert(bit32.band(b, b) == b) - assert(bit32.band(b, b, b, b) == b) - assert(bit32.btest(b, b) == (b ~= 0)) - assert(bit32.band(b, b, b) == b) - assert(bit32.band(b, b, b, ~b) == 0) - assert(bit32.btest(b, b, b) == (b ~= 0)) - assert(bit32.band(b, bit32.bnot(b)) == 0) - assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0)) - assert(bit32.bor(b) == b) - assert(bit32.bor(b, b) == b) - assert(bit32.bor(b, b, b) == b) - assert(bit32.bor(b, b, 0, ~b) == 0xffffffff) - assert(bit32.bxor(b) == b) - assert(bit32.bxor(b, b) == 0) - assert(bit32.bxor(b, b, b) == b) - assert(bit32.bxor(b, b, b, b) == 0) - assert(bit32.bxor(b, 0) == b) - assert(bit32.bnot(b) ~= b) - assert(bit32.bnot(bit32.bnot(b)) == b) - assert(bit32.bnot(b) == (1 << 32) - 1 - b) - assert(bit32.lrotate(b, 32) == b) - assert(bit32.rrotate(b, 32) == b) - assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf))) - assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf))) -end - --- for this test, use at most 24 bits (mantissa of a single float) -c = {0, 1, 2, 3, 10, 0x800000, 0xaaaaaa, 0x555555, 0xffffff, 0x7fffff} -for _, b in pairs(c) do - for i = -40, 40 do - local x = bit32.lshift(b, i) - local y = math.floor(math.fmod(b * 2.0^i, 2.0^32)) - assert(math.fmod(x - y, 2.0^32) == 0) - end -end - -assert(not pcall(bit32.band, {})) -assert(not pcall(bit32.bnot, "a")) -assert(not pcall(bit32.lshift, 45)) -assert(not pcall(bit32.lshift, 45, print)) -assert(not pcall(bit32.rshift, 45, print)) - -print("+") - - --- testing extract/replace - -assert(bit32.extract(0x12345678, 0, 4) == 8) -assert(bit32.extract(0x12345678, 4, 4) == 7) -assert(bit32.extract(0xa0001111, 28, 4) == 0xa) -assert(bit32.extract(0xa0001111, 31, 1) == 1) -assert(bit32.extract(0x50000111, 31, 1) == 0) -assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679) - -assert(not pcall(bit32.extract, 0, -1)) -assert(not pcall(bit32.extract, 0, 32)) -assert(not pcall(bit32.extract, 0, 0, 33)) -assert(not pcall(bit32.extract, 0, 31, 2)) - -assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678) -assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321) -assert(bit32.replace(0, 1, 2) == 2^2) -assert(bit32.replace(0, -1, 4) == 2^4) -assert(bit32.replace(-1, 0, 31) == (1 << 31) - 1) -assert(bit32.replace(-1, 0, 1, 2) == (1 << 32) - 7) - - --- testing conversion of floats - -assert(bit32.bor(3.0) == 3) -assert(bit32.bor(-4.0) == 0xfffffffc) - --- large floats and large-enough integers? -if 2.0^50 < 2.0^50 + 1.0 and 2.0^50 < (-1 >> 1) then - assert(bit32.bor(2.0^32 - 5.0) == 0xfffffffb) - assert(bit32.bor(-2.0^32 - 6.0) == 0xfffffffa) - assert(bit32.bor(2.0^48 - 5.0) == 0xfffffffb) - assert(bit32.bor(-2.0^48 - 6.0) == 0xfffffffa) -end - -print'OK' - diff --git a/lua-5.4.7-tests/bwcoercion.lua b/lua-5.4.7-tests/bwcoercion.lua deleted file mode 100644 index cd735ab..0000000 --- a/lua-5.4.7-tests/bwcoercion.lua +++ /dev/null @@ -1,78 +0,0 @@ -local tonumber, tointeger = tonumber, math.tointeger -local type, getmetatable, rawget, error = type, getmetatable, rawget, error -local strsub = string.sub - -local print = print - -_ENV = nil - --- Try to convert a value to an integer, without assuming any coercion. -local function toint (x) - x = tonumber(x) -- handle numerical strings - if not x then - return false -- not coercible to a number - end - return tointeger(x) -end - - --- If operation fails, maybe second operand has a metamethod that should --- have been called if not for this string metamethod, so try to --- call it. -local function trymt (x, y, mtname) - if type(y) ~= "string" then -- avoid recalling original metamethod - local mt = getmetatable(y) - local mm = mt and rawget(mt, mtname) - if mm then - return mm(x, y) - end - end - -- if any test fails, there is no other metamethod to be called - error("attempt to '" .. strsub(mtname, 3) .. - "' a " .. type(x) .. " with a " .. type(y), 4) -end - - -local function checkargs (x, y, mtname) - local xi = toint(x) - local yi = toint(y) - if xi and yi then - return xi, yi - else - return trymt(x, y, mtname), nil - end -end - - -local smt = getmetatable("") - -smt.__band = function (x, y) - local x, y = checkargs(x, y, "__band") - return y and x & y or x -end - -smt.__bor = function (x, y) - local x, y = checkargs(x, y, "__bor") - return y and x | y or x -end - -smt.__bxor = function (x, y) - local x, y = checkargs(x, y, "__bxor") - return y and x ~ y or x -end - -smt.__shl = function (x, y) - local x, y = checkargs(x, y, "__shl") - return y and x << y or x -end - -smt.__shr = function (x, y) - local x, y = checkargs(x, y, "__shr") - return y and x >> y or x -end - -smt.__bnot = function (x) - local x, y = checkargs(x, x, "__bnot") - return y and ~x or x -end - diff --git a/lua-5.4.7-tests/calls.lua b/lua-5.4.7-tests/calls.lua deleted file mode 100644 index a193858..0000000 --- a/lua-5.4.7-tests/calls.lua +++ /dev/null @@ -1,497 +0,0 @@ --- $Id: testes/calls.lua $ --- See Copyright Notice in file all.lua - -print("testing functions and calls") - -local debug = require "debug" - --- get the opportunity to test 'type' too ;) - -assert(type(1<2) == 'boolean') -assert(type(true) == 'boolean' and type(false) == 'boolean') -assert(type(nil) == 'nil' - and type(-3) == 'number' - and type'x' == 'string' - and type{} == 'table' - and type(type) == 'function') - -assert(type(assert) == type(print)) -local function f (x) return a:x (x) end -assert(type(f) == 'function') -assert(not pcall(type)) - - --- testing local-function recursion -fact = false -do - local res = 1 - local function fact (n) - if n==0 then return res - else return n*fact(n-1) - end - end - assert(fact(5) == 120) -end -assert(fact == false) -fact = nil - --- testing declarations -local a = {i = 10} -local self = 20 -function a:x (x) return x+self.i end -function a.y (x) return x+self end - -assert(a:x(1)+10 == a.y(1)) - -a.t = {i=-100} -a["t"].x = function (self, a,b) return self.i+a+b end - -assert(a.t:x(2,3) == -95) - -do - local a = {x=0} - function a:add (x) self.x, a.y = self.x+x, 20; return self end - assert(a:add(10):add(20):add(30).x == 60 and a.y == 20) -end - -local a = {b={c={}}} - -function a.b.c.f1 (x) return x+1 end -function a.b.c:f2 (x,y) self[x] = y end -assert(a.b.c.f1(4) == 5) -a.b.c:f2('k', 12); assert(a.b.c.k == 12) - -print('+') - -t = nil -- 'declare' t -function f(a,b,c) local d = 'a'; t={a,b,c,d} end - -f( -- this line change must be valid - 1,2) -assert(t[1] == 1 and t[2] == 2 and t[3] == nil and t[4] == 'a') -f(1,2, -- this one too - 3,4) -assert(t[1] == 1 and t[2] == 2 and t[3] == 3 and t[4] == 'a') - -t = nil -- delete 't' - -function fat(x) - if x <= 1 then return 1 - else return x*load("return fat(" .. x-1 .. ")", "")() - end -end - -assert(load "load 'assert(fat(6)==720)' () ")() -a = load('return fat(5), 3') -local a,b = a() -assert(a == 120 and b == 3) -fat = nil -print('+') - -local function err_on_n (n) - if n==0 then error(); exit(1); - else err_on_n (n-1); exit(1); - end -end - -do - local function dummy (n) - if n > 0 then - assert(not pcall(err_on_n, n)) - dummy(n-1) - end - end - - dummy(10) -end - -_G.deep = nil -- "declaration" (used by 'all.lua') - -function deep (n) - if n>0 then deep(n-1) end -end -deep(10) -deep(180) - - -print"testing tail calls" - -function deep (n) if n>0 then return deep(n-1) else return 101 end end -assert(deep(30000) == 101) -a = {} -function a:deep (n) if n>0 then return self:deep(n-1) else return 101 end end -assert(a:deep(30000) == 101) - -do -- tail calls x varargs - local function foo (x, ...) local a = {...}; return x, a[1], a[2] end - - local function foo1 (x) return foo(10, x, x + 1) end - - local a, b, c = foo1(-2) - assert(a == 10 and b == -2 and c == -1) - - -- tail calls x metamethods - local t = setmetatable({}, {__call = foo}) - local function foo2 (x) return t(10, x) end - a, b, c = foo2(100) - assert(a == t and b == 10 and c == 100) - - a, b = (function () return foo() end)() - assert(a == nil and b == nil) - - local X, Y, A - local function foo (x, y, ...) X = x; Y = y; A = {...} end - local function foo1 (...) return foo(...) end - - local a, b, c = foo1() - assert(X == nil and Y == nil and #A == 0) - - a, b, c = foo1(10) - assert(X == 10 and Y == nil and #A == 0) - - a, b, c = foo1(10, 20) - assert(X == 10 and Y == 20 and #A == 0) - - a, b, c = foo1(10, 20, 30) - assert(X == 10 and Y == 20 and #A == 1 and A[1] == 30) -end - - -do -- C-stack overflow while handling C-stack overflow - local function loop () - assert(pcall(loop)) - end - - local err, msg = xpcall(loop, loop) - assert(not err and string.find(msg, "error")) -end - - - -do -- tail calls x chain of __call - local n = 10000 -- depth - - local function foo () - if n == 0 then return 1023 - else n = n - 1; return foo() - end - end - - -- build a chain of __call metamethods ending in function 'foo' - for i = 1, 100 do - foo = setmetatable({}, {__call = foo}) - end - - -- call the first one as a tail call in a new coroutine - -- (to ensure stack is not preallocated) - assert(coroutine.wrap(function() return foo() end)() == 1023) -end - -print('+') - - -do -- testing chains of '__call' - local N = 20 - local u = table.pack - for i = 1, N do - u = setmetatable({i}, {__call = u}) - end - - local Res = u("a", "b", "c") - - assert(Res.n == N + 3) - for i = 1, N do - assert(Res[i][1] == i) - end - assert(Res[N + 1] == "a" and Res[N + 2] == "b" and Res[N + 3] == "c") -end - - -a = nil -(function (x) a=x end)(23) -assert(a == 23 and (function (x) return x*2 end)(20) == 40) - - --- testing closures - --- fixed-point operator -local Z = function (le) - local function a (f) - return le(function (x) return f(f)(x) end) - end - return a(a) - end - - --- non-recursive factorial - -local F = function (f) - return function (n) - if n == 0 then return 1 - else return n*f(n-1) end - end - end - -local fat = Z(F) - -assert(fat(0) == 1 and fat(4) == 24 and Z(F)(5)==5*Z(F)(4)) - -local function g (z) - local function f (a,b,c,d) - return function (x,y) return a+b+c+d+a+x+y+z end - end - return f(z,z+1,z+2,z+3) -end - -local f = g(10) -assert(f(9, 16) == 10+11+12+13+10+9+16+10) - -print('+') - --- testing multiple returns - -local function unlpack (t, i) - i = i or 1 - if (i <= #t) then - return t[i], unlpack(t, i+1) - end -end - -local function equaltab (t1, t2) - assert(#t1 == #t2) - for i = 1, #t1 do - assert(t1[i] == t2[i]) - end -end - -local pack = function (...) return (table.pack(...)) end - -local function f() return 1,2,30,4 end -local function ret2 (a,b) return a,b end - -local a,b,c,d = unlpack{1,2,3} -assert(a==1 and b==2 and c==3 and d==nil) -a = {1,2,3,4,false,10,'alo',false,assert} -equaltab(pack(unlpack(a)), a) -equaltab(pack(unlpack(a), -1), {1,-1}) -a,b,c,d = ret2(f()), ret2(f()) -assert(a==1 and b==1 and c==2 and d==nil) -a,b,c,d = unlpack(pack(ret2(f()), ret2(f()))) -assert(a==1 and b==1 and c==2 and d==nil) -a,b,c,d = unlpack(pack(ret2(f()), (ret2(f())))) -assert(a==1 and b==1 and c==nil and d==nil) - -a = ret2{ unlpack{1,2,3}, unlpack{3,2,1}, unlpack{"a", "b"}} -assert(a[1] == 1 and a[2] == 3 and a[3] == "a" and a[4] == "b") - - --- testing calls with 'incorrect' arguments -rawget({}, "x", 1) -rawset({}, "x", 1, 2) -assert(math.sin(1,2) == math.sin(1)) -table.sort({10,9,8,4,19,23,0,0}, function (a,b) return a 10 or a[i]() ~= x -assert(i == 11 and a[1]() == 1 and a[3]() == 3 and i == 4) - - --- testing closures created in 'then' and 'else' parts of 'if's -a = {} -for i = 1, 10 do - if i % 3 == 0 then - local y = 0 - a[i] = function (x) local t = y; y = x; return t end - elseif i % 3 == 1 then - goto L1 - error'not here' - ::L1:: - local y = 1 - a[i] = function (x) local t = y; y = x; return t end - elseif i % 3 == 2 then - local t - goto l4 - ::l4a:: a[i] = t; goto l4b - error("should never be here!") - ::l4:: - local y = 2 - t = function (x) local t = y; y = x; return t end - goto l4a - error("should never be here!") - ::l4b:: - end -end - -for i = 1, 10 do - assert(a[i](i * 10) == i % 3 and a[i]() == i * 10) -end - -print'+' - - --- test for correctly closing upvalues in tail calls of vararg functions -local function t () - local function c(a,b) assert(a=="test" and b=="OK") end - local function v(f, ...) c("test", f() ~= 1 and "FAILED" or "OK") end - local x = 1 - return v(function() return x end) -end -t() - - --- test for debug manipulation of upvalues -local debug = require'debug' - -local foo1, foo2, foo3 -do - local a , b, c = 3, 5, 7 - foo1 = function () return a+b end; - foo2 = function () return b+a end; - do - local a = 10 - foo3 = function () return a+b end; - end -end - -assert(debug.upvalueid(foo1, 1)) -assert(debug.upvalueid(foo1, 2)) -assert(not debug.upvalueid(foo1, 3)) -assert(debug.upvalueid(foo1, 1) == debug.upvalueid(foo2, 2)) -assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo2, 1)) -assert(debug.upvalueid(foo3, 1)) -assert(debug.upvalueid(foo1, 1) ~= debug.upvalueid(foo3, 1)) -assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo3, 2)) - -assert(debug.upvalueid(string.gmatch("x", "x"), 1) ~= nil) - -assert(foo1() == 3 + 5 and foo2() == 5 + 3) -debug.upvaluejoin(foo1, 2, foo2, 2) -assert(foo1() == 3 + 3 and foo2() == 5 + 3) -assert(foo3() == 10 + 5) -debug.upvaluejoin(foo3, 2, foo2, 1) -assert(foo3() == 10 + 5) -debug.upvaluejoin(foo3, 2, foo2, 2) -assert(foo3() == 10 + 3) - -assert(not pcall(debug.upvaluejoin, foo1, 3, foo2, 1)) -assert(not pcall(debug.upvaluejoin, foo1, 1, foo2, 3)) -assert(not pcall(debug.upvaluejoin, foo1, 0, foo2, 1)) -assert(not pcall(debug.upvaluejoin, print, 1, foo2, 1)) -assert(not pcall(debug.upvaluejoin, {}, 1, foo2, 1)) -assert(not pcall(debug.upvaluejoin, foo1, 1, print, 1)) - -print'OK' diff --git a/lua-5.4.7-tests/code.lua b/lua-5.4.7-tests/code.lua deleted file mode 100644 index bd4b10d..0000000 --- a/lua-5.4.7-tests/code.lua +++ /dev/null @@ -1,449 +0,0 @@ --- $Id: testes/code.lua $ --- See Copyright Notice in file all.lua - -if T==nil then - (Message or print)('\n >>> testC not active: skipping opcode tests <<<\n') - return -end -print "testing code generation and optimizations" - --- to test constant propagation -local k0aux = 0 -local k0 = k0aux -local k1 = 1 -local k3 = 3 -local k6 = k3 + (k3 << k0) -local kFF0 = 0xFF0 -local k3_78 = 3.78 -local x, k3_78_4 = 10, k3_78 / 4 -assert(x == 10) - -local kx = "x" - -local kTrue = true -local kFalse = false - -local kNil = nil - --- this code gave an error for the code checker -do - local function f (a) - for k,v,w in a do end - end -end - - --- testing reuse in constant table -local function checkKlist (func, list) - local k = T.listk(func) - assert(#k == #list) - for i = 1, #k do - assert(k[i] == list[i] and math.type(k[i]) == math.type(list[i])) - end -end - -local function foo () - local a - a = k3; - a = 0; a = 0.0; a = -7 + 7 - a = k3_78/4; a = k3_78_4 - a = -k3_78/4; a = k3_78/4; a = -3.78/4 - a = -3.79/4; a = 0.0; a = -0; - a = k3; a = 3.0; a = 3; a = 3.0 -end - -checkKlist(foo, {3.78/4, -3.78/4, -3.79/4}) - - -foo = function (f, a) - f(100 * 1000) - f(100.0 * 1000) - f(-100 * 1000) - f(-100 * 1000.0) - f(100000) - f(100000.0) - f(-100000) - f(-100000.0) - end - -checkKlist(foo, {100000, 100000.0, -100000, -100000.0}) - - --- floats x integers -foo = function (t, a) - t[a] = 1; t[a] = 1.0 - t[a] = 1; t[a] = 1.0 - t[a] = 2; t[a] = 2.0 - t[a] = 0; t[a] = 0.0 - t[a] = 1; t[a] = 1.0 - t[a] = 2; t[a] = 2.0 - t[a] = 0; t[a] = 0.0 -end - -checkKlist(foo, {1, 1.0, 2, 2.0, 0, 0.0}) - - --- testing opcodes - --- check that 'f' opcodes match '...' -local function check (f, ...) - local arg = {...} - local c = T.listcode(f) - for i=1, #arg do - local opcode = string.match(c[i], "%u%w+") - -- print(arg[i], opcode) - assert(arg[i] == opcode) - end - assert(c[#arg+2] == undef) -end - - --- check that 'f' opcodes match '...' and that 'f(p) == r'. -local function checkR (f, p, r, ...) - local r1 = f(p) - assert(r == r1 and math.type(r) == math.type(r1)) - check(f, ...) -end - - --- check that 'a' and 'b' has the same opcodes -local function checkequal (a, b) - a = T.listcode(a) - b = T.listcode(b) - assert(#a == #b) - for i = 1, #a do - a[i] = string.gsub(a[i], '%b()', '') -- remove line number - b[i] = string.gsub(b[i], '%b()', '') -- remove line number - assert(a[i] == b[i]) - end -end - - --- some basic instructions -check(function () -- function does not create upvalues - (function () end){f()} -end, 'CLOSURE', 'NEWTABLE', 'EXTRAARG', 'GETTABUP', 'CALL', - 'SETLIST', 'CALL', 'RETURN0') - -check(function (x) -- function creates upvalues - (function () return x end){f()} -end, 'CLOSURE', 'NEWTABLE', 'EXTRAARG', 'GETTABUP', 'CALL', - 'SETLIST', 'CALL', 'RETURN') - - --- sequence of LOADNILs -check(function () - local kNil = nil - local a,b,c - local d; local e; - local f,g,h; - d = nil; d=nil; b=nil; a=kNil; c=nil; -end, 'LOADNIL', 'RETURN0') - -check(function () - local a,b,c,d = 1,1,1,1 - d=nil;c=nil;b=nil;a=nil -end, 'LOADI', 'LOADI', 'LOADI', 'LOADI', 'LOADNIL', 'RETURN0') - -do - local a,b,c,d = 1,1,1,1 - d=nil;c=nil;b=nil;a=nil - assert(a == nil and b == nil and c == nil and d == nil) -end - - --- single return -check (function (a,b,c) return a end, 'RETURN1') - - --- infinite loops -check(function () while kTrue do local a = -1 end end, -'LOADI', 'JMP', 'RETURN0') - -check(function () while 1 do local a = -1 end end, -'LOADI', 'JMP', 'RETURN0') - -check(function () repeat local x = 1 until true end, -'LOADI', 'RETURN0') - - --- concat optimization -check(function (a,b,c,d) return a..b..c..d end, - 'MOVE', 'MOVE', 'MOVE', 'MOVE', 'CONCAT', 'RETURN1') - --- not -check(function () return not not nil end, 'LOADFALSE', 'RETURN1') -check(function () return not not kFalse end, 'LOADFALSE', 'RETURN1') -check(function () return not not true end, 'LOADTRUE', 'RETURN1') -check(function () return not not k3 end, 'LOADTRUE', 'RETURN1') - --- direct access to locals -check(function () - local a,b,c,d - a = b*a - c.x, a[b] = -((a + d/b - a[b]) ^ a.x), b -end, - 'LOADNIL', - 'MUL', 'MMBIN', - 'DIV', 'MMBIN', 'ADD', 'MMBIN', 'GETTABLE', 'SUB', 'MMBIN', - 'GETFIELD', 'POW', 'MMBIN', 'UNM', 'SETTABLE', 'SETFIELD', 'RETURN0') - - --- direct access to constants -check(function () - local a,b - local c = kNil - a[kx] = 3.2 - a.x = b - a[b] = 'x' -end, - 'LOADNIL', 'SETFIELD', 'SETFIELD', 'SETTABLE', 'RETURN0') - --- "get/set table" with numeric indices -check(function (a) - local k255 = 255 - a[1] = a[100] - a[k255] = a[256] - a[256] = 5 -end, - 'GETI', 'SETI', - 'LOADI', 'GETTABLE', 'SETI', - 'LOADI', 'SETTABLE', 'RETURN0') - -check(function () - local a,b - a = a - a - b = a/a - b = 5-4 -end, - 'LOADNIL', 'SUB', 'MMBIN', 'DIV', 'MMBIN', 'LOADI', 'RETURN0') - -check(function () - local a,b - a[kTrue] = false -end, - 'LOADNIL', 'LOADTRUE', 'SETTABLE', 'RETURN0') - - --- equalities -checkR(function (a) if a == 1 then return 2 end end, 1, 2, - 'EQI', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if -4.0 == a then return 2 end end, -4, 2, - 'EQI', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if a == "hi" then return 2 end end, 10, nil, - 'EQK', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if a == 10000 then return 2 end end, 1, nil, - 'EQK', 'JMP', 'LOADI', 'RETURN1') -- number too large - -checkR(function (a) if -10000 == a then return 2 end end, -10000, 2, - 'EQK', 'JMP', 'LOADI', 'RETURN1') -- number too large - --- comparisons - -checkR(function (a) if -10 <= a then return 2 end end, -10, 2, - 'GEI', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if 128.0 > a then return 2 end end, 129, nil, - 'LTI', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if -127.0 < a then return 2 end end, -127, nil, - 'GTI', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if 10 < a then return 2 end end, 11, 2, - 'GTI', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if 129 < a then return 2 end end, 130, 2, - 'LOADI', 'LT', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if a >= 23.0 then return 2 end end, 25, 2, - 'GEI', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if a >= 23.1 then return 2 end end, 0, nil, - 'LOADK', 'LE', 'JMP', 'LOADI', 'RETURN1') - -checkR(function (a) if a > 2300.0 then return 2 end end, 0, nil, - 'LOADF', 'LT', 'JMP', 'LOADI', 'RETURN1') - - --- constant folding -local function checkK (func, val) - check(func, 'LOADK', 'RETURN1') - checkKlist(func, {val}) - assert(func() == val) -end - -local function checkI (func, val) - check(func, 'LOADI', 'RETURN1') - checkKlist(func, {}) - assert(func() == val) -end - -local function checkF (func, val) - check(func, 'LOADF', 'RETURN1') - checkKlist(func, {}) - assert(func() == val) -end - -checkF(function () return 0.0 end, 0.0) -checkI(function () return k0 end, 0) -checkI(function () return -k0//1 end, 0) -checkK(function () return 3^-1 end, 1/3) -checkK(function () return (1 + 1)^(50 + 50) end, 2^100) -checkK(function () return (-2)^(31 - 2) end, -0x20000000 + 0.0) -checkF(function () return (-k3^0 + 5) // 3.0 end, 1.0) -checkI(function () return -k3 % 5 end, 2) -checkF(function () return -((2.0^8 + -(-1)) % 8)/2 * 4 - 3 end, -5.0) -checkF(function () return -((2^8 + -(-1)) % 8)//2 * 4 - 3 end, -7.0) -checkI(function () return 0xF0.0 | 0xCC.0 ~ 0xAA & 0xFD end, 0xF4) -checkI(function () return ~(~kFF0 | kFF0) end, 0) -checkI(function () return ~~-1024.0 end, -1024) -checkI(function () return ((100 << k6) << -4) >> 2 end, 100) - --- borders around MAXARG_sBx ((((1 << 17) - 1) >> 1) == 65535) -local a = 17; local sbx = ((1 << a) - 1) >> 1 -- avoid folding -local border = 65535 -checkI(function () return border end, sbx) -checkI(function () return -border end, -sbx) -checkI(function () return border + 1 end, sbx + 1) -checkK(function () return border + 2 end, sbx + 2) -checkK(function () return -(border + 1) end, -(sbx + 1)) - -local border = 65535.0 -checkF(function () return border end, sbx + 0.0) -checkF(function () return -border end, -sbx + 0.0) -checkF(function () return border + 1 end, (sbx + 1.0)) -checkK(function () return border + 2 end, (sbx + 2.0)) -checkK(function () return -(border + 1) end, -(sbx + 1.0)) - - --- immediate operands -checkR(function (x) return x + k1 end, 10, 11, 'ADDI', 'MMBINI', 'RETURN1') -checkR(function (x) return x - 127 end, 10, -117, 'ADDI', 'MMBINI', 'RETURN1') -checkR(function (x) return 128 + x end, 0.0, 128.0, - 'ADDI', 'MMBINI', 'RETURN1') -checkR(function (x) return x * -127 end, -1.0, 127.0, - 'MULK', 'MMBINK', 'RETURN1') -checkR(function (x) return 20 * x end, 2, 40, 'MULK', 'MMBINK', 'RETURN1') -checkR(function (x) return x ^ -2 end, 2, 0.25, 'POWK', 'MMBINK', 'RETURN1') -checkR(function (x) return x / 40 end, 40, 1.0, 'DIVK', 'MMBINK', 'RETURN1') -checkR(function (x) return x // 1 end, 10.0, 10.0, - 'IDIVK', 'MMBINK', 'RETURN1') -checkR(function (x) return x % (100 - 10) end, 91, 1, - 'MODK', 'MMBINK', 'RETURN1') -checkR(function (x) return k1 << x end, 3, 8, 'SHLI', 'MMBINI', 'RETURN1') -checkR(function (x) return x << 127 end, 10, 0, 'SHRI', 'MMBINI', 'RETURN1') -checkR(function (x) return x << -127 end, 10, 0, 'SHRI', 'MMBINI', 'RETURN1') -checkR(function (x) return x >> 128 end, 8, 0, 'SHRI', 'MMBINI', 'RETURN1') -checkR(function (x) return x >> -127 end, 8, 0, 'SHRI', 'MMBINI', 'RETURN1') -checkR(function (x) return x & 1 end, 9, 1, 'BANDK', 'MMBINK', 'RETURN1') -checkR(function (x) return 10 | x end, 1, 11, 'BORK', 'MMBINK', 'RETURN1') -checkR(function (x) return -10 ~ x end, -1, 9, 'BXORK', 'MMBINK', 'RETURN1') - --- K operands in arithmetic operations -checkR(function (x) return x + 0.0 end, 1, 1.0, 'ADDK', 'MMBINK', 'RETURN1') --- check(function (x) return 128 + x end, 'ADDK', 'MMBINK', 'RETURN1') -checkR(function (x) return x * -10000 end, 2, -20000, - 'MULK', 'MMBINK', 'RETURN1') --- check(function (x) return 20 * x end, 'MULK', 'MMBINK', 'RETURN1') -checkR(function (x) return x ^ 0.5 end, 4, 2.0, 'POWK', 'MMBINK', 'RETURN1') -checkR(function (x) return x / 2.0 end, 4, 2.0, 'DIVK', 'MMBINK', 'RETURN1') -checkR(function (x) return x // 10000 end, 10000, 1, - 'IDIVK', 'MMBINK', 'RETURN1') -checkR(function (x) return x % (100.0 - 10) end, 91, 1.0, - 'MODK', 'MMBINK', 'RETURN1') - --- no foldings (and immediate operands) -check(function () return -0.0 end, 'LOADF', 'UNM', 'RETURN1') -check(function () return k3/0 end, 'LOADI', 'DIVK', 'MMBINK', 'RETURN1') -check(function () return 0%0 end, 'LOADI', 'MODK', 'MMBINK', 'RETURN1') -check(function () return -4//0 end, 'LOADI', 'IDIVK', 'MMBINK', 'RETURN1') -check(function (x) return x >> 2.0 end, 'LOADF', 'SHR', 'MMBIN', 'RETURN1') -check(function (x) return x << 128 end, 'LOADI', 'SHL', 'MMBIN', 'RETURN1') -check(function (x) return x & 2.0 end, 'LOADF', 'BAND', 'MMBIN', 'RETURN1') - --- basic 'for' loops -check(function () for i = -10, 10.5 do end end, -'LOADI', 'LOADK', 'LOADI', 'FORPREP', 'FORLOOP', 'RETURN0') -check(function () for i = 0xfffffff, 10.0, 1 do end end, -'LOADK', 'LOADF', 'LOADI', 'FORPREP', 'FORLOOP', 'RETURN0') - --- bug in constant folding for 5.1 -check(function () return -nil end, 'LOADNIL', 'UNM', 'RETURN1') - - -check(function () - local a,b,c - b[c], a = c, b - b[a], a = c, b - a, b = c, a - a = a -end, - 'LOADNIL', - 'MOVE', 'MOVE', 'SETTABLE', - 'MOVE', 'MOVE', 'MOVE', 'SETTABLE', - 'MOVE', 'MOVE', 'MOVE', - -- no code for a = a - 'RETURN0') - - --- x == nil , x ~= nil --- checkequal(function (b) if (a==nil) then a=1 end; if a~=nil then a=1 end end, --- function () if (a==9) then a=1 end; if a~=9 then a=1 end end) - --- check(function () if a==nil then a='a' end end, --- 'GETTABUP', 'EQ', 'JMP', 'SETTABUP', 'RETURN') - -do -- tests for table access in upvalues - local t - check(function () t[kx] = t.y end, 'GETTABUP', 'SETTABUP') - check(function (a) t[a()] = t[a()] end, - 'MOVE', 'CALL', 'GETUPVAL', 'MOVE', 'CALL', - 'GETUPVAL', 'GETTABLE', 'SETTABLE') -end - --- de morgan -checkequal(function () local a; if not (a or b) then b=a end end, - function () local a; if (not a and not b) then b=a end end) - -checkequal(function (l) local a; return 0 <= a and a <= l end, - function (l) local a; return not (not(a >= 0) or not(a <= l)) end) - - --- if-break optimizations -check(function (a, b) - while a do - if b then break else a = a + 1 end - end - end, -'TEST', 'JMP', 'TEST', 'JMP', 'ADDI', 'MMBINI', 'JMP', 'RETURN0') - -checkequal(function () return 6 or true or nil end, - function () return k6 or kTrue or kNil end) - -checkequal(function () return 6 and true or nil end, - function () return k6 and kTrue or kNil end) - - -do -- string constants - local k0 = "00000000000000000000000000000000000000000000000000" - local function f1 () - local k = k0 - return function () - return function () return k end - end - end - - local f2 = f1() - local f3 = f2() - assert(f3() == k0) - checkK(f3, k0) - -- string is not needed by other functions - assert(T.listk(f1)[1] == nil) - assert(T.listk(f2)[1] == nil) -end - -print 'OK' - diff --git a/lua-5.4.7-tests/constructs.lua b/lua-5.4.7-tests/constructs.lua deleted file mode 100644 index 6ac6816..0000000 --- a/lua-5.4.7-tests/constructs.lua +++ /dev/null @@ -1,406 +0,0 @@ --- $Id: testes/constructs.lua $ --- See Copyright Notice in file all.lua - -;;print "testing syntax";; - -local debug = require "debug" - - -local function checkload (s, msg) - assert(string.find(select(2, load(s)), msg)) -end - --- testing semicollons -local a -do ;;; end -; do ; a = 3; assert(a == 3) end; -; - - --- invalid operations should not raise errors when not executed -if false then a = 3 // 0; a = 0 % 0 end - - --- testing priorities - -assert(2^3^2 == 2^(3^2)); -assert(2^3*4 == (2^3)*4); -assert(2.0^-2 == 1/4 and -2^- -2 == - - -4); -assert(not nil and 2 and not(2>3 or 3<2)); -assert(-3-1-5 == 0+0-9); -assert(-2^2 == -4 and (-2)^2 == 4 and 2*2-3-1 == 0); -assert(-3%5 == 2 and -3+5 == 2) -assert(2*1+3/3 == 3 and 1+2 .. 3*1 == "33"); -assert(not(2+1 > 3*1) and "a".."b" > "a"); - -assert(0xF0 | 0xCC ~ 0xAA & 0xFD == 0xF4) -assert(0xFD & 0xAA ~ 0xCC | 0xF0 == 0xF4) -assert(0xF0 & 0x0F + 1 == 0x10) - -assert(3^4//2^3//5 == 2) - -assert(-3+4*5//2^3^2//9+4%10/3 == (-3)+(((4*5)//(2^(3^2)))//9)+((4%10)/3)) - -assert(not ((true or false) and nil)) -assert( true or false and nil) - --- old bug -assert((((1 or false) and true) or false) == true) -assert((((nil and true) or false) and true) == false) - -local a,b = 1,nil; -assert(-(1 or 2) == -1 and (1 and 2)+(-1.25 or -4) == 0.75); -local x = ((b or a)+1 == 2 and (10 or a)+1 == 11); assert(x); -x = (((2<3) or 1) == true and (2<3 and 4) == 4); assert(x); - -local x, y = 1, 2; -assert((x>y) and x or y == 2); -x,y=2,1; -assert((x>y) and x or y == 2); - -assert(1234567890 == tonumber('1234567890') and 1234567890+1 == 1234567891) - -do -- testing operators with diffent kinds of constants - -- operands to consider: - -- * fit in register - -- * constant doesn't fit in register - -- * floats with integral values - local operand = {3, 100, 5.0, -10, -5.0, 10000, -10000} - local operator = {"+", "-", "*", "/", "//", "%", "^", - "&", "|", "^", "<<", ">>", - "==", "~=", "<", ">", "<=", ">=",} - for _, op in ipairs(operator) do - local f = assert(load(string.format([[return function (x,y) - return x %s y - end]], op)))(); - for _, o1 in ipairs(operand) do - for _, o2 in ipairs(operand) do - local gab = f(o1, o2) - - _ENV.XX = o1 - local code = string.format("return XX %s %s", op, o2) - local res = assert(load(code))() - assert(res == gab) - - _ENV.XX = o2 - code = string.format("return (%s) %s XX", o1, op) - res = assert(load(code))() - assert(res == gab) - - code = string.format("return (%s) %s %s", o1, op, o2) - res = assert(load(code))() - assert(res == gab) - end - end - end - _ENV.XX = nil -end - - --- silly loops -repeat until 1; repeat until true; -while false do end; while nil do end; - -do -- test old bug (first name could not be an `upvalue') - local a; local function f(x) x={a=1}; x={x=1}; x={G=1} end -end - - -do -- bug since 5.4.0 - -- create code with a table using more than 256 constants - local code = {"local x = {"} - for i = 1, 257 do - code[#code + 1] = i .. ".1," - end - code[#code + 1] = "};" - code = table.concat(code) - - -- add "ret" to the end of that code and checks that - -- it produces the expected value "val" - local function check (ret, val) - local code = code .. ret - code = load(code) - assert(code() == val) - end - - check("return (1 ~ (2 or 3))", 1 ~ 2) - check("return (1 | (2 or 3))", 1 | 2) - check("return (1 + (2 or 3))", 1 + 2) - check("return (1 << (2 or 3))", 1 << 2) -end - - -local function f (i) - if type(i) ~= 'number' then return i,'jojo'; end; - if i > 0 then return i, f(i-1); end; -end - -x = {f(3), f(5), f(10);}; -assert(x[1] == 3 and x[2] == 5 and x[3] == 10 and x[4] == 9 and x[12] == 1); -assert(x[nil] == nil) -x = {f'alo', f'xixi', nil}; -assert(x[1] == 'alo' and x[2] == 'xixi' and x[3] == nil); -x = {f'alo'..'xixi'}; -assert(x[1] == 'aloxixi') -x = {f{}} -assert(x[2] == 'jojo' and type(x[1]) == 'table') - - -local f = function (i) - if i < 10 then return 'a'; - elseif i < 20 then return 'b'; - elseif i < 30 then return 'c'; - end; -end - -assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == nil) - -for i=1,1000 do break; end; -local n=100; -local i=3; -local t = {}; -local a=nil -while not a do - a=0; for i=1,n do for i=i,1,-1 do a=a+1; t[i]=1; end; end; -end -assert(a == n*(n+1)/2 and i==3); -assert(t[1] and t[n] and not t[0] and not t[n+1]) - -function f(b) - local x = 1; - repeat - local a; - if b==1 then local b=1; x=10; break - elseif b==2 then x=20; break; - elseif b==3 then x=30; - else local a,b,c,d=math.sin(1); x=x+1; - end - until x>=12; - return x; -end; - -assert(f(1) == 10 and f(2) == 20 and f(3) == 30 and f(4)==12) - - -local f = function (i) - if i < 10 then return 'a' - elseif i < 20 then return 'b' - elseif i < 30 then return 'c' - else return 8 - end -end - -assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == 8) - -local a, b = nil, 23 -x = {f(100)*2+3 or a, a or b+2} -assert(x[1] == 19 and x[2] == 25) -x = {f=2+3 or a, a = b+2} -assert(x.f == 5 and x.a == 25) - -a={y=1} -x = {a.y} -assert(x[1] == 1) - -local function f (i) - while 1 do - if i>0 then i=i-1; - else return; end; - end; -end; - -local function g(i) - while 1 do - if i>0 then i=i-1 - else return end - end -end - -f(10); g(10); - -do - function f () return 1,2,3; end - local a, b, c = f(); - assert(a==1 and b==2 and c==3) - a, b, c = (f()); - assert(a==1 and b==nil and c==nil) -end - -local a,b = 3 and f(); -assert(a==1 and b==nil) - -function g() f(); return; end; -assert(g() == nil) -function g() return nil or f() end -a,b = g() -assert(a==1 and b==nil) - -print'+'; - -do -- testing constants - local prog = [[local x = 10]] - checkload(prog, "unknown attribute 'XXX'") - - checkload([[local xxx = 20; xxx = 10]], - ":1: attempt to assign to const variable 'xxx'") - - checkload([[ - local xx; - local xxx = 20; - local yyy; - local function foo () - local abc = xx + yyy + xxx; - return function () return function () xxx = yyy end end - end - ]], ":6: attempt to assign to const variable 'xxx'") - - checkload([[ - local x = nil - x = io.open() - ]], ":2: attempt to assign to const variable 'x'") -end - -f = [[ -return function ( a , b , c , d , e ) - local x = a >= b or c or ( d and e ) or nil - return x -end , { a = 1 , b = 2 >= 1 , } or { 1 }; -]] -f = string.gsub(f, "%s+", "\n"); -- force a SETLINE between opcodes -f,a = load(f)(); -assert(a.a == 1 and a.b) - -function g (a,b,c,d,e) - if not (a>=b or c or d and e or nil) then return 0; else return 1; end; -end - -local function h (a,b,c,d,e) - while (a>=b or c or (d and e) or nil) do return 1; end; - return 0; -end; - -assert(f(2,1) == true and g(2,1) == 1 and h(2,1) == 1) -assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1) -assert(f(1,2,'a') -~= -- force SETLINE before nil -nil, "") -assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1) -assert(f(1,2,nil,1,'x') == 'x' and g(1,2,nil,1,'x') == 1 and - h(1,2,nil,1,'x') == 1) -assert(f(1,2,nil,nil,'x') == nil and g(1,2,nil,nil,'x') == 0 and - h(1,2,nil,nil,'x') == 0) -assert(f(1,2,nil,1,nil) == nil and g(1,2,nil,1,nil) == 0 and - h(1,2,nil,1,nil) == 0) - -assert(1 and 2<3 == true and 2<3 and 'a'<'b' == true) -x = 2<3 and not 3; assert(x==false) -x = 2<1 or (2>1 and 'a'); assert(x=='a') - - -do - local a; if nil then a=1; else a=2; end; -- this nil comes as PUSHNIL 2 - assert(a==2) -end - -local function F (a) - assert(debug.getinfo(1, "n").name == 'F') - return a,2,3 -end - -a,b = F(1)~=nil; assert(a == true and b == nil); -a,b = F(nil)==nil; assert(a == true and b == nil) - ----------------------------------------------------------------- ------------------------------------------------------------------- - --- sometimes will be 0, sometimes will not... -_ENV.GLOB1 = math.random(0, 1) - --- basic expressions with their respective values -local basiccases = { - {"nil", nil}, - {"false", false}, - {"true", true}, - {"10", 10}, - {"(0==_ENV.GLOB1)", 0 == _ENV.GLOB1}, -} - -local prog - -if _ENV.GLOB1 == 0 then - basiccases[2][1] = "F" -- constant false - - prog = [[ - local F = false - if %s then IX = true end - return %s -]] -else - basiccases[4][1] = "k10" -- constant 10 - - prog = [[ - local k10 = 10 - if %s then IX = true end - return %s - ]] -end - -print('testing short-circuit optimizations (' .. _ENV.GLOB1 .. ')') - - --- operators with their respective values -local binops = { - {" and ", function (a,b) if not a then return a else return b end end}, - {" or ", function (a,b) if a then return a else return b end end}, -} - -local cases = {} - --- creates all combinations of '(cases[i] op cases[n-i])' plus --- 'not(cases[i] op cases[n-i])' (syntax + value) -local function createcases (n) - local res = {} - for i = 1, n - 1 do - for _, v1 in ipairs(cases[i]) do - for _, v2 in ipairs(cases[n - i]) do - for _, op in ipairs(binops) do - local t = { - "(" .. v1[1] .. op[1] .. v2[1] .. ")", - op[2](v1[2], v2[2]) - } - res[#res + 1] = t - res[#res + 1] = {"not" .. t[1], not t[2]} - end - end - end - end - return res -end - --- do not do too many combinations for soft tests -local level = _soft and 3 or 4 - -cases[1] = basiccases -for i = 2, level do cases[i] = createcases(i) end -print("+") - -local i = 0 -for n = 1, level do - for _, v in pairs(cases[n]) do - local s = v[1] - local p = load(string.format(prog, s, s), "") - IX = false - assert(p() == v[2] and IX == not not v[2]) - i = i + 1 - if i % 60000 == 0 then print('+') end - end -end -IX = nil -_G.GLOB1 = nil ------------------------------------------------------------------- - --- testing some syntax errors (chosen through 'gcov') -checkload("for x do", "expected") -checkload("x:call", "expected") - -print'OK' diff --git a/lua-5.4.7-tests/coroutine.lua b/lua-5.4.7-tests/coroutine.lua deleted file mode 100644 index e566c86..0000000 --- a/lua-5.4.7-tests/coroutine.lua +++ /dev/null @@ -1,1156 +0,0 @@ --- $Id: testes/coroutine.lua $ --- See Copyright Notice in file all.lua - -print "testing coroutines" - -local debug = require'debug' - -local f - -local main, ismain = coroutine.running() -assert(type(main) == "thread" and ismain) -assert(not coroutine.resume(main)) -assert(not coroutine.isyieldable(main) and not coroutine.isyieldable()) -assert(not pcall(coroutine.yield)) - - --- trivial errors -assert(not pcall(coroutine.resume, 0)) -assert(not pcall(coroutine.status, 0)) - - --- tests for multiple yield/resume arguments - -local function eqtab (t1, t2) - assert(#t1 == #t2) - for i = 1, #t1 do - local v = t1[i] - assert(t2[i] == v) - end -end - -_G.x = nil -- declare x -_G.f = nil -- declare f -local function foo (a, ...) - local x, y = coroutine.running() - assert(x == f and y == false) - -- next call should not corrupt coroutine (but must fail, - -- as it attempts to resume the running coroutine) - assert(coroutine.resume(f) == false) - assert(coroutine.status(f) == "running") - local arg = {...} - assert(coroutine.isyieldable(x)) - for i=1,#arg do - _G.x = {coroutine.yield(table.unpack(arg[i]))} - end - return table.unpack(a) -end - -f = coroutine.create(foo) -assert(coroutine.isyieldable(f)) -assert(type(f) == "thread" and coroutine.status(f) == "suspended") -assert(string.find(tostring(f), "thread")) -local s,a,b,c,d -s,a,b,c,d = coroutine.resume(f, {1,2,3}, {}, {1}, {'a', 'b', 'c'}) -assert(coroutine.isyieldable(f)) -assert(s and a == nil and coroutine.status(f) == "suspended") -s,a,b,c,d = coroutine.resume(f) -eqtab(_G.x, {}) -assert(s and a == 1 and b == nil) -assert(coroutine.isyieldable(f)) -s,a,b,c,d = coroutine.resume(f, 1, 2, 3) -eqtab(_G.x, {1, 2, 3}) -assert(s and a == 'a' and b == 'b' and c == 'c' and d == nil) -s,a,b,c,d = coroutine.resume(f, "xuxu") -eqtab(_G.x, {"xuxu"}) -assert(s and a == 1 and b == 2 and c == 3 and d == nil) -assert(coroutine.status(f) == "dead") -s, a = coroutine.resume(f, "xuxu") -assert(not s and string.find(a, "dead") and coroutine.status(f) == "dead") - -_G.f = nil - --- yields in tail calls -local function foo (i) return coroutine.yield(i) end -local f = coroutine.wrap(function () - for i=1,10 do - assert(foo(i) == _G.x) - end - return 'a' -end) -for i=1,10 do _G.x = i; assert(f(i) == i) end -_G.x = 'xuxu'; assert(f('xuxu') == 'a') - -_G.x = nil - --- recursive -local function pf (n, i) - coroutine.yield(n) - pf(n*i, i+1) -end - -f = coroutine.wrap(pf) -local s=1 -for i=1,10 do - assert(f(1, 1) == s) - s = s*i -end - --- sieve -local function gen (n) - return coroutine.wrap(function () - for i=2,n do coroutine.yield(i) end - end) -end - - -local function filter (p, g) - return coroutine.wrap(function () - while 1 do - local n = g() - if n == nil then return end - if math.fmod(n, p) ~= 0 then coroutine.yield(n) end - end - end) -end - -local x = gen(80) -local a = {} -while 1 do - local n = x() - if n == nil then break end - table.insert(a, n) - x = filter(n, x) -end - -assert(#a == 22 and a[#a] == 79) -x, a = nil - - -print("to-be-closed variables in coroutines") - -local function func2close (f) - return setmetatable({}, {__close = f}) -end - -do - -- ok to close a dead coroutine - local co = coroutine.create(print) - assert(coroutine.resume(co, "testing 'coroutine.close'")) - assert(coroutine.status(co) == "dead") - local st, msg = coroutine.close(co) - assert(st and msg == nil) - -- also ok to close it again - st, msg = coroutine.close(co) - assert(st and msg == nil) - - - -- cannot close the running coroutine - local st, msg = pcall(coroutine.close, coroutine.running()) - assert(not st and string.find(msg, "running")) - - local main = coroutine.running() - - -- cannot close a "normal" coroutine - ;(coroutine.wrap(function () - local st, msg = pcall(coroutine.close, main) - assert(not st and string.find(msg, "normal")) - end))() - - -- cannot close a coroutine while closing it - do - local co - co = coroutine.create( - function() - local x = func2close(function() - coroutine.close(co) -- try to close it again - end) - coroutine.yield(20) - end) - local st, msg = coroutine.resume(co) - assert(st and msg == 20) - st, msg = coroutine.close(co) - assert(not st and string.find(msg, "running coroutine")) - end - - -- to-be-closed variables in coroutines - local X - - -- closing a coroutine after an error - local co = coroutine.create(error) - local st, msg = coroutine.resume(co, 100) - assert(not st and msg == 100) - st, msg = coroutine.close(co) - assert(not st and msg == 100) - -- after closing, no more errors - st, msg = coroutine.close(co) - assert(st and msg == nil) - - co = coroutine.create(function () - local x = func2close(function (self, err) - assert(err == nil); X = false - end) - X = true - coroutine.yield() - end) - coroutine.resume(co) - assert(X) - assert(coroutine.close(co)) - assert(not X and coroutine.status(co) == "dead") - - -- error closing a coroutine - local x = 0 - co = coroutine.create(function() - local y = func2close(function (self,err) - assert(err == 111) - x = 200 - error(200) - end) - local x = func2close(function (self, err) - assert(err == nil); error(111) - end) - coroutine.yield() - end) - coroutine.resume(co) - assert(x == 0) - local st, msg = coroutine.close(co) - assert(st == false and coroutine.status(co) == "dead" and msg == 200) - assert(x == 200) - -- after closing, no more errors - st, msg = coroutine.close(co) - assert(st and msg == nil) -end - -do - -- versus pcall in coroutines - local X = false - local Y = false - local function foo () - local x = func2close(function (self, err) - Y = debug.getinfo(2) - X = err - end) - error(43) - end - local co = coroutine.create(function () return pcall(foo) end) - local st1, st2, err = coroutine.resume(co) - assert(st1 and not st2 and err == 43) - assert(X == 43 and Y.what == "C") - - -- recovering from errors in __close metamethods - local track = {} - - local function h (o) - local hv = o - return 1 - end - - local function foo () - local x = func2close(function(_,msg) - track[#track + 1] = msg or false - error(20) - end) - local y = func2close(function(_,msg) - track[#track + 1] = msg or false - return 1000 - end) - local z = func2close(function(_,msg) - track[#track + 1] = msg or false - error(10) - end) - coroutine.yield(1) - h(func2close(function(_,msg) - track[#track + 1] = msg or false - error(2) - end)) - end - - local co = coroutine.create(pcall) - - local st, res = coroutine.resume(co, foo) -- call 'foo' protected - assert(st and res == 1) -- yield 1 - local st, res1, res2 = coroutine.resume(co) -- continue - assert(coroutine.status(co) == "dead") - assert(st and not res1 and res2 == 20) -- last error (20) - assert(track[1] == false and track[2] == 2 and track[3] == 10 and - track[4] == 10) -end - - --- yielding across C boundaries - -local co = coroutine.wrap(function() - assert(not pcall(table.sort,{1,2,3}, coroutine.yield)) - assert(coroutine.isyieldable()) - coroutine.yield(20) - return 30 - end) - -assert(co() == 20) -assert(co() == 30) - - -local f = function (s, i) return coroutine.yield(i) end - -local f1 = coroutine.wrap(function () - return xpcall(pcall, function (...) return ... end, - function () - local s = 0 - for i in f, nil, 1 do pcall(function () s = s + i end) end - error({s}) - end) - end) - -f1() -for i = 1, 10 do assert(f1(i) == i) end -local r1, r2, v = f1(nil) -assert(r1 and not r2 and v[1] == (10 + 1)*10/2) - - -local function f (a, b) a = coroutine.yield(a); error{a + b} end -local function g(x) return x[1]*2 end - -co = coroutine.wrap(function () - coroutine.yield(xpcall(f, g, 10, 20)) - end) - -assert(co() == 10) -local r, msg = co(100) -assert(not r and msg == 240) - - --- unyieldable C call -do - local function f (c) - assert(not coroutine.isyieldable()) - return c .. c - end - - local co = coroutine.wrap(function (c) - assert(coroutine.isyieldable()) - local s = string.gsub("a", ".", f) - return s - end) - assert(co() == "aa") -end - - - -do -- testing single trace of coroutines - local X - local co = coroutine.create(function () - coroutine.yield(10) - return 20; - end) - local trace = {} - local function dotrace (event) - trace[#trace + 1] = event - end - debug.sethook(co, dotrace, "clr") - repeat until not coroutine.resume(co) - local correcttrace = {"call", "line", "call", "return", "line", "return"} - assert(#trace == #correcttrace) - for k, v in pairs(trace) do - assert(v == correcttrace[k]) - end -end - --- errors in coroutines -function foo () - assert(debug.getinfo(1).currentline == debug.getinfo(foo).linedefined + 1) - assert(debug.getinfo(2).currentline == debug.getinfo(goo).linedefined) - coroutine.yield(3) - error(foo) -end - -function goo() foo() end -x = coroutine.wrap(goo) -assert(x() == 3) -local a,b = pcall(x) -assert(not a and b == foo) - -x = coroutine.create(goo) -a,b = coroutine.resume(x) -assert(a and b == 3) -a,b = coroutine.resume(x) -assert(not a and b == foo and coroutine.status(x) == "dead") -a,b = coroutine.resume(x) -assert(not a and string.find(b, "dead") and coroutine.status(x) == "dead") - -goo = nil - --- co-routines x for loop -local function all (a, n, k) - if k == 0 then coroutine.yield(a) - else - for i=1,n do - a[k] = i - all(a, n, k-1) - end - end -end - -local a = 0 -for t in coroutine.wrap(function () all({}, 5, 4) end) do - a = a+1 -end -assert(a == 5^4) - - --- access to locals of collected corroutines -local C = {}; setmetatable(C, {__mode = "kv"}) -local x = coroutine.wrap (function () - local a = 10 - local function f () a = a+10; return a end - while true do - a = a+1 - coroutine.yield(f) - end - end) - -C[1] = x; - -local f = x() -assert(f() == 21 and x()() == 32 and x() == f) -x = nil -collectgarbage() -assert(C[1] == undef) -assert(f() == 43 and f() == 53) - - --- old bug: attempt to resume itself - -local function co_func (current_co) - assert(coroutine.running() == current_co) - assert(coroutine.resume(current_co) == false) - coroutine.yield(10, 20) - assert(coroutine.resume(current_co) == false) - coroutine.yield(23) - return 10 -end - -local co = coroutine.create(co_func) -local a,b,c = coroutine.resume(co, co) -assert(a == true and b == 10 and c == 20) -a,b = coroutine.resume(co, co) -assert(a == true and b == 23) -a,b = coroutine.resume(co, co) -assert(a == true and b == 10) -assert(coroutine.resume(co, co) == false) -assert(coroutine.resume(co, co) == false) - - --- other old bug when attempting to resume itself --- (trigger C-code assertions) -do - local A = coroutine.running() - local B = coroutine.create(function() return coroutine.resume(A) end) - local st, res = coroutine.resume(B) - assert(st == true and res == false) - - local X = false - A = coroutine.wrap(function() - local _ = func2close(function () X = true end) - return pcall(A, 1) - end) - st, res = A() - assert(not st and string.find(res, "non%-suspended") and X == true) -end - - --- bug in 5.4.1 -do - -- coroutine ran close metamethods with invalid status during a - -- reset. - local co - co = coroutine.wrap(function() - local x = func2close(function() return pcall(co) end) - error(111) - end) - local st, errobj = pcall(co) - assert(not st and errobj == 111) - st, errobj = pcall(co) - assert(not st and string.find(errobj, "dead coroutine")) -end - - --- attempt to resume 'normal' coroutine -local co1, co2 -co1 = coroutine.create(function () return co2() end) -co2 = coroutine.wrap(function () - assert(coroutine.status(co1) == 'normal') - assert(not coroutine.resume(co1)) - coroutine.yield(3) - end) - -a,b = coroutine.resume(co1) -assert(a and b == 3) -assert(coroutine.status(co1) == 'dead') - --- infinite recursion of coroutines -a = function(a) coroutine.wrap(a)(a) end -assert(not pcall(a, a)) -a = nil - - --- access to locals of erroneous coroutines -local x = coroutine.create (function () - local a = 10 - _G.F = function () a=a+1; return a end - error('x') - end) - -assert(not coroutine.resume(x)) --- overwrite previous position of local `a' -assert(not coroutine.resume(x, 1, 1, 1, 1, 1, 1, 1)) -assert(_G.F() == 11) -assert(_G.F() == 12) -_G.F = nil - - -if not T then - (Message or print) - ('\n >>> testC not active: skipping coroutine API tests <<<\n') -else - print "testing yields inside hooks" - - local turn - - local function fact (t, x) - assert(turn == t) - if x == 0 then return 1 - else return x*fact(t, x-1) - end - end - - local A, B = 0, 0 - - local x = coroutine.create(function () - T.sethook("yield 0", "", 2) - A = fact("A", 6) - end) - - local y = coroutine.create(function () - T.sethook("yield 0", "", 3) - B = fact("B", 7) - end) - - while A==0 or B==0 do -- A ~= 0 when 'x' finishes (similar for 'B','y') - if A==0 then turn = "A"; assert(T.resume(x)) end - if B==0 then turn = "B"; assert(T.resume(y)) end - - -- check that traceback works correctly after yields inside hooks - debug.traceback(x) - debug.traceback(y) - end - - assert(B // A == 7) -- fact(7) // fact(6) - - do -- hooks vs. multiple values - local done - local function test (n) - done = false - return coroutine.wrap(function () - local a = {} - for i = 1, n do a[i] = i end - -- 'pushint' just to perturb the stack - T.sethook("pushint 10; yield 0", "", 1) -- yield at each op. - local a1 = {table.unpack(a)} -- must keep top between ops. - assert(#a1 == n) - for i = 1, n do assert(a[i] == i) end - done = true - end) - end - -- arguments to the coroutine are just to perturb its stack - local co = test(0); while not done do co(30) end - co = test(1); while not done do co(20, 10) end - co = test(3); while not done do co() end - co = test(100); while not done do co() end - end - - local line = debug.getinfo(1, "l").currentline + 2 -- get line number - local function foo () - local x = 10 --<< this line is 'line' - x = x + 10 - _G.XX = x - end - - -- testing yields in line hook - local co = coroutine.wrap(function () - T.sethook("setglobal X; yield 0", "l", 0); foo(); return 10 end) - - _G.XX = nil; - _G.X = nil; co(); assert(_G.X == line) - _G.X = nil; co(); assert(_G.X == line + 1) - _G.X = nil; co(); assert(_G.X == line + 2 and _G.XX == nil) - _G.X = nil; co(); assert(_G.X == line + 3 and _G.XX == 20) - assert(co() == 10) - _G.X = nil - - -- testing yields in count hook - co = coroutine.wrap(function () - T.sethook("yield 0", "", 1); foo(); return 10 end) - - _G.XX = nil; - local c = 0 - repeat c = c + 1; local a = co() until a == 10 - assert(_G.XX == 20 and c >= 5) - - co = coroutine.wrap(function () - T.sethook("yield 0", "", 2); foo(); return 10 end) - - _G.XX = nil; - local c = 0 - repeat c = c + 1; local a = co() until a == 10 - assert(_G.XX == 20 and c >= 5) - _G.X = nil; _G.XX = nil - - do - -- testing debug library on a coroutine suspended inside a hook - -- (bug in 5.2/5.3) - c = coroutine.create(function (a, ...) - T.sethook("yield 0", "l") -- will yield on next two lines - local b = a - return ... - end) - - assert(coroutine.resume(c, 1, 2, 3)) -- start coroutine - local n,v = debug.getlocal(c, 0, 1) -- check its local - assert(n == "a" and v == 1 and debug.getlocal(c, 0, 2) ~= "b") - assert(debug.setlocal(c, 0, 1, 10)) -- test 'setlocal' - local t = debug.getinfo(c, 0) -- test 'getinfo' - assert(t.currentline == t.linedefined + 2) - assert(not debug.getinfo(c, 1)) -- no other level - assert(coroutine.resume(c)) -- run next line - local n,v = debug.getlocal(c, 0, 2) -- check next local - assert(n == "b" and v == 10) - v = {coroutine.resume(c)} -- finish coroutine - assert(v[1] == true and v[2] == 2 and v[3] == 3 and v[4] == undef) - assert(not coroutine.resume(c)) - end - - do - -- testing debug library on last function in a suspended coroutine - -- (bug in 5.2/5.3) - local c = coroutine.create(function () T.testC("yield 1", 10, 20) end) - local a, b = coroutine.resume(c) - assert(a and b == 20) - assert(debug.getinfo(c, 0).linedefined == -1) - a, b = debug.getlocal(c, 0, 2) - assert(b == 10) - end - - - print "testing coroutine API" - - -- reusing a thread - assert(T.testC([[ - newthread # create thread - pushvalue 2 # push body - pushstring 'a a a' # push argument - xmove 0 3 2 # move values to new thread - resume -1, 1 # call it first time - pushstatus - xmove 3 0 0 # move results back to stack - setglobal X # result - setglobal Y # status - pushvalue 2 # push body (to call it again) - pushstring 'b b b' - xmove 0 3 2 - resume -1, 1 # call it again - pushstatus - xmove 3 0 0 - return 1 # return result - ]], function (...) return ... end) == 'b b b') - - assert(X == 'a a a' and Y == 'OK') - - X, Y = nil - - - -- resuming running coroutine - C = coroutine.create(function () - return T.testC([[ - pushnum 10; - pushnum 20; - resume -3 2; - pushstatus - gettop; - return 3]], C) - end) - local a, b, c, d = coroutine.resume(C) - assert(a == true and string.find(b, "non%-suspended") and - c == "ERRRUN" and d == 4) - - a, b, c, d = T.testC([[ - rawgeti R 1 # get main thread - pushnum 10; - pushnum 20; - resume -3 2; - pushstatus - gettop; - return 4]]) - assert(a == coroutine.running() and string.find(b, "non%-suspended") and - c == "ERRRUN" and d == 4) - - - -- using a main thread as a coroutine (dubious use!) - local state = T.newstate() - - -- check that yielddable is working correctly - assert(T.testC(state, "newthread; isyieldable -1; remove 1; return 1")) - - -- main thread is not yieldable - assert(not T.testC(state, "rawgeti R 1; isyieldable -1; remove 1; return 1")) - - T.testC(state, "settop 0") - - T.loadlib(state) - - assert(T.doremote(state, [[ - coroutine = require'coroutine'; - X = function (x) coroutine.yield(x, 'BB'); return 'CC' end; - return 'ok']])) - - local t = table.pack(T.testC(state, [[ - rawgeti R 1 # get main thread - pushstring 'XX' - getglobal X # get function for body - pushstring AA # arg - resume 1 1 # 'resume' shadows previous stack! - gettop - setglobal T # top - setglobal B # second yielded value - setglobal A # fist yielded value - rawgeti R 1 # get main thread - pushnum 5 # arg (noise) - resume 1 1 # after coroutine ends, previous stack is back - pushstatus - return * - ]])) - assert(t.n == 4 and t[2] == 'XX' and t[3] == 'CC' and t[4] == 'OK') - assert(T.doremote(state, "return T") == '2') - assert(T.doremote(state, "return A") == 'AA') - assert(T.doremote(state, "return B") == 'BB') - - T.closestate(state) - - print'+' - -end - - --- leaving a pending coroutine open -_G.TO_SURVIVE = coroutine.wrap(function () - local a = 10 - local x = function () a = a+1 end - coroutine.yield() - end) - -_G.TO_SURVIVE() - - -if not _soft then - -- bug (stack overflow) - local lim = 1000000 -- stack limit; assume 32-bit machine - local t = {lim - 10, lim - 5, lim - 1, lim, lim + 1, lim + 5} - for i = 1, #t do - local j = t[i] - local co = coroutine.create(function() - return table.unpack({}, 1, j) - end) - local r, msg = coroutine.resume(co) - -- must fail for unpacking larger than stack limit - assert(j < lim or not r) - end -end - - -assert(coroutine.running() == main) - -print"+" - - -print"testing yields inside metamethods" - -local function val(x) - if type(x) == "table" then return x.x else return x end -end - -local mt = { - __eq = function(a,b) coroutine.yield(nil, "eq"); return val(a) == val(b) end, - __lt = function(a,b) coroutine.yield(nil, "lt"); return val(a) < val(b) end, - __le = function(a,b) coroutine.yield(nil, "le"); return a - b <= 0 end, - __add = function(a,b) coroutine.yield(nil, "add"); - return val(a) + val(b) end, - __sub = function(a,b) coroutine.yield(nil, "sub"); return val(a) - val(b) end, - __mul = function(a,b) coroutine.yield(nil, "mul"); return val(a) * val(b) end, - __div = function(a,b) coroutine.yield(nil, "div"); return val(a) / val(b) end, - __idiv = function(a,b) coroutine.yield(nil, "idiv"); - return val(a) // val(b) end, - __pow = function(a,b) coroutine.yield(nil, "pow"); return val(a) ^ val(b) end, - __mod = function(a,b) coroutine.yield(nil, "mod"); return val(a) % val(b) end, - __unm = function(a,b) coroutine.yield(nil, "unm"); return -val(a) end, - __bnot = function(a,b) coroutine.yield(nil, "bnot"); return ~val(a) end, - __shl = function(a,b) coroutine.yield(nil, "shl"); - return val(a) << val(b) end, - __shr = function(a,b) coroutine.yield(nil, "shr"); - return val(a) >> val(b) end, - __band = function(a,b) - coroutine.yield(nil, "band") - return val(a) & val(b) - end, - __bor = function(a,b) coroutine.yield(nil, "bor"); - return val(a) | val(b) end, - __bxor = function(a,b) coroutine.yield(nil, "bxor"); - return val(a) ~ val(b) end, - - __concat = function(a,b) - coroutine.yield(nil, "concat"); - return val(a) .. val(b) - end, - __index = function (t,k) coroutine.yield(nil, "idx"); return t.k[k] end, - __newindex = function (t,k,v) coroutine.yield(nil, "nidx"); t.k[k] = v end, -} - - -local function new (x) - return setmetatable({x = x, k = {}}, mt) -end - - -local a = new(10) -local b = new(12) -local c = new"hello" - -local function run (f, t) - local i = 1 - local c = coroutine.wrap(f) - while true do - local res, stat = c() - if res then assert(t[i] == undef); return res, t end - assert(stat == t[i]) - i = i + 1 - end -end - - -assert(run(function () if (a>=b) then return '>=' else return '<' end end, - {"le", "sub"}) == "<") -assert(run(function () if (a<=b) then return '<=' else return '>' end end, - {"le", "sub"}) == "<=") -assert(run(function () if (a==b) then return '==' else return '~=' end end, - {"eq"}) == "~=") - -assert(run(function () return a & b + a end, {"add", "band"}) == 2) - -assert(run(function () return 1 + a end, {"add"}) == 11) -assert(run(function () return a - 25 end, {"sub"}) == -15) -assert(run(function () return 2 * a end, {"mul"}) == 20) -assert(run(function () return a ^ 2 end, {"pow"}) == 100) -assert(run(function () return a / 2 end, {"div"}) == 5) -assert(run(function () return a % 6 end, {"mod"}) == 4) -assert(run(function () return a // 3 end, {"idiv"}) == 3) - -assert(run(function () return a + b end, {"add"}) == 22) -assert(run(function () return a - b end, {"sub"}) == -2) -assert(run(function () return a * b end, {"mul"}) == 120) -assert(run(function () return a ^ b end, {"pow"}) == 10^12) -assert(run(function () return a / b end, {"div"}) == 10/12) -assert(run(function () return a % b end, {"mod"}) == 10) -assert(run(function () return a // b end, {"idiv"}) == 0) - --- repeat tests with larger constants (to use 'K' opcodes) -local a1000 = new(1000) - -assert(run(function () return a1000 + 1000 end, {"add"}) == 2000) -assert(run(function () return a1000 - 25000 end, {"sub"}) == -24000) -assert(run(function () return 2000 * a end, {"mul"}) == 20000) -assert(run(function () return a1000 / 1000 end, {"div"}) == 1) -assert(run(function () return a1000 % 600 end, {"mod"}) == 400) -assert(run(function () return a1000 // 500 end, {"idiv"}) == 2) - - - -assert(run(function () return a % b end, {"mod"}) == 10) - -assert(run(function () return ~a & b end, {"bnot", "band"}) == ~10 & 12) -assert(run(function () return a | b end, {"bor"}) == 10 | 12) -assert(run(function () return a ~ b end, {"bxor"}) == 10 ~ 12) -assert(run(function () return a << b end, {"shl"}) == 10 << 12) -assert(run(function () return a >> b end, {"shr"}) == 10 >> 12) - -assert(run(function () return 10 & b end, {"band"}) == 10 & 12) -assert(run(function () return a | 2 end, {"bor"}) == 10 | 2) -assert(run(function () return a ~ 2 end, {"bxor"}) == 10 ~ 2) -assert(run(function () return a >> 2 end, {"shr"}) == 10 >> 2) -assert(run(function () return 1 >> a end, {"shr"}) == 1 >> 10) -assert(run(function () return a << 2 end, {"shl"}) == 10 << 2) -assert(run(function () return 1 << a end, {"shl"}) == 1 << 10) -assert(run(function () return 2 ~ a end, {"bxor"}) == 2 ~ 10) - - -assert(run(function () return a..b end, {"concat"}) == "1012") - -assert(run(function() return a .. b .. c .. a end, - {"concat", "concat", "concat"}) == "1012hello10") - -assert(run(function() return "a" .. "b" .. a .. "c" .. c .. b .. "x" end, - {"concat", "concat", "concat"}) == "ab10chello12x") - - -do -- a few more tests for comparison operators - local mt1 = { - __le = function (a,b) - coroutine.yield(10) - return (val(a) <= val(b)) - end, - __lt = function (a,b) - coroutine.yield(10) - return val(a) < val(b) - end, - } - local mt2 = { __lt = mt1.__lt, __le = mt1.__le } - - local function run (f) - local co = coroutine.wrap(f) - local res - repeat - res = co() - until res ~= 10 - return res - end - - local function test () - local a1 = setmetatable({x=1}, mt1) - local a2 = setmetatable({x=2}, mt2) - assert(a1 < a2) - assert(a1 <= a2) - assert(1 < a2) - assert(1 <= a2) - assert(2 > a1) - assert(2 >= a2) - return true - end - - run(test) - -end - -assert(run(function () - a.BB = print - return a.BB - end, {"nidx", "idx"}) == print) - --- getuptable & setuptable -do local _ENV = _ENV - f = function () AAA = BBB + 1; return AAA end -end -local g = new(10); g.k.BBB = 10; -debug.setupvalue(f, 1, g) -assert(run(f, {"idx", "nidx", "idx"}) == 11) -assert(g.k.AAA == 11) - -print"+" - -print"testing yields inside 'for' iterators" - -local f = function (s, i) - if i%2 == 0 then coroutine.yield(nil, "for") end - if i < s then return i + 1 end - end - -assert(run(function () - local s = 0 - for i in f, 4, 0 do s = s + i end - return s - end, {"for", "for", "for"}) == 10) - - - --- tests for coroutine API -if T==nil then - (Message or print)('\n >>> testC not active: skipping coroutine API tests <<<\n') - print "OK"; return -end - -print('testing coroutine API') - -local function apico (...) - local x = {...} - return coroutine.wrap(function () - return T.testC(table.unpack(x)) - end) -end - -local a = {apico( -[[ - pushstring errorcode - pcallk 1 0 2; - invalid command (should not arrive here) -]], -[[return *]], -"stackmark", -error -)()} -assert(#a == 4 and - a[3] == "stackmark" and - a[4] == "errorcode" and - _G.status == "ERRRUN" and - _G.ctx == 2) -- 'ctx' to pcallk - -local co = apico( - "pushvalue 2; pushnum 10; pcallk 1 2 3; invalid command;", - coroutine.yield, - "getglobal status; getglobal ctx; pushvalue 2; pushstring a; pcallk 1 0 4; invalid command", - "getglobal status; getglobal ctx; return *") - -assert(co() == 10) -assert(co(20, 30) == 'a') -a = {co()} -assert(#a == 10 and - a[2] == coroutine.yield and - a[5] == 20 and a[6] == 30 and - a[7] == "YIELD" and a[8] == 3 and - a[9] == "YIELD" and a[10] == 4) -assert(not pcall(co)) -- coroutine is dead now - - -f = T.makeCfunc("pushnum 3; pushnum 5; yield 1;") -co = coroutine.wrap(function () - assert(f() == 23); assert(f() == 23); return 10 -end) -assert(co(23,16) == 5) -assert(co(23,16) == 5) -assert(co(23,16) == 10) - - --- testing coroutines with C bodies -f = T.makeCfunc([[ - pushnum 102 - yieldk 1 U2 - cannot be here! -]], -[[ # continuation - pushvalue U3 # accessing upvalues inside a continuation - pushvalue U4 - return * -]], 23, "huu") - -x = coroutine.wrap(f) -assert(x() == 102) -eqtab({x()}, {23, "huu"}) - - -f = T.makeCfunc[[pushstring 'a'; pushnum 102; yield 2; ]] - -a, b, c, d = T.testC([[newthread; pushvalue 2; xmove 0 3 1; resume 3 0; - pushstatus; xmove 3 0 0; resume 3 0; pushstatus; - return 4; ]], f) - -assert(a == 'YIELD' and b == 'a' and c == 102 and d == 'OK') - - --- testing chain of suspendable C calls - -local count = 3 -- number of levels - -f = T.makeCfunc([[ - remove 1; # remove argument - pushvalue U3; # get selection function - call 0 1; # call it (result is 'f' or 'yield') - pushstring hello # single argument for selected function - pushupvalueindex 2; # index of continuation program - callk 1 -1 .; # call selected function - errorerror # should never arrive here -]], -[[ - # continuation program - pushnum 34 # return value - return * # return all results -]], -function () -- selection function - count = count - 1 - if count == 0 then return coroutine.yield - else return f - end -end -) - -co = coroutine.wrap(function () return f(nil) end) -assert(co() == "hello") -- argument to 'yield' -a = {co()} --- three '34's (one from each pending C call) -assert(#a == 3 and a[1] == a[2] and a[2] == a[3] and a[3] == 34) - - --- testing yields with continuations - -local y - -co = coroutine.wrap(function (...) return - T.testC([[ # initial function - yieldk 1 2 - cannot be here! - ]], - [[ # 1st continuation - yieldk 0 3 - cannot be here! - ]], - [[ # 2nd continuation - yieldk 0 4 - cannot be here! - ]], - [[ # 3th continuation - pushvalue 6 # function which is last arg. to 'testC' here - pushnum 10; pushnum 20; - pcall 2 0 0 # call should throw an error and return to next line - pop 1 # remove error message - pushvalue 6 - getglobal status; getglobal ctx - pcallk 2 2 5 # call should throw an error and jump to continuation - cannot be here! - ]], - [[ # 4th (and last) continuation - return * - ]], - -- function called by 3th continuation - function (a,b) x=a; y=b; error("errmsg") end, - ... -) -end) - -local a = {co(3,4,6)} -assert(a[1] == 6 and a[2] == undef) -a = {co()}; assert(a[1] == undef and _G.status == "YIELD" and _G.ctx == 2) -a = {co()}; assert(a[1] == undef and _G.status == "YIELD" and _G.ctx == 3) -a = {co(7,8)}; --- original arguments -assert(type(a[1]) == 'string' and type(a[2]) == 'string' and - type(a[3]) == 'string' and type(a[4]) == 'string' and - type(a[5]) == 'string' and type(a[6]) == 'function') --- arguments left from fist resume -assert(a[7] == 3 and a[8] == 4) --- arguments to last resume -assert(a[9] == 7 and a[10] == 8) --- error message and nothing more -assert(a[11]:find("errmsg") and #a == 11) --- check arguments to pcallk -assert(x == "YIELD" and y == 4) - -assert(not pcall(co)) -- coroutine should be dead - -_G.ctx = nil -_G.status = nil - - --- bug in nCcalls -local co = coroutine.wrap(function () - local a = {pcall(pcall,pcall,pcall,pcall,pcall,pcall,pcall,error,"hi")} - return pcall(assert, table.unpack(a)) -end) - -local a = {co()} -assert(a[10] == "hi") - -print'OK' diff --git a/lua-5.4.7-tests/cstack.lua b/lua-5.4.7-tests/cstack.lua deleted file mode 100644 index 97afe9f..0000000 --- a/lua-5.4.7-tests/cstack.lua +++ /dev/null @@ -1,197 +0,0 @@ --- $Id: testes/cstack.lua $ --- See Copyright Notice in file all.lua - - -local tracegc = require"tracegc" - -print"testing stack overflow detection" - --- Segmentation faults in these tests probably result from a C-stack --- overflow. To avoid these errors, you should set a smaller limit for --- the use of C stack by Lua, by changing the constant 'LUAI_MAXCCALLS'. --- Alternatively, you can ensure a larger stack for the program. - - -local function checkerror (msg, f, ...) - local s, err = pcall(f, ...) - assert(not s and string.find(err, msg)) -end - -do print("testing stack overflow in message handling") - local count = 0 - local function loop (x, y, z) - count = count + 1 - return 1 + loop(x, y, z) - end - tracegc.stop() -- __gc should not be called with a full stack - local res, msg = xpcall(loop, loop) - tracegc.start() - assert(msg == "error in error handling") - print("final count: ", count) -end - - --- bug since 2.5 (C-stack overflow in recursion inside pattern matching) -do print("testing recursion inside pattern matching") - local function f (size) - local s = string.rep("a", size) - local p = string.rep(".?", size) - return string.match(s, p) - end - local m = f(80) - assert(#m == 80) - checkerror("too complex", f, 2000) -end - - -do print("testing stack-overflow in recursive 'gsub'") - local count = 0 - local function foo () - count = count + 1 - string.gsub("a", ".", foo) - end - checkerror("stack overflow", foo) - print("final count: ", count) - - print("testing stack-overflow in recursive 'gsub' with metatables") - local count = 0 - local t = setmetatable({}, {__index = foo}) - foo = function () - count = count + 1 - string.gsub("a", ".", t) - end - checkerror("stack overflow", foo) - print("final count: ", count) -end - - -do -- bug in 5.4.0 - print("testing limits in coroutines inside deep calls") - local count = 0 - local lim = 1000 - local function stack (n) - if n > 0 then return stack(n - 1) + 1 - else coroutine.wrap(function () - count = count + 1 - stack(lim) - end)() - end - end - - local st, msg = xpcall(stack, function () return "ok" end, lim) - assert(not st and msg == "ok") - print("final count: ", count) -end - - -do -- bug since 5.4.0 - local count = 0 - print("chain of 'coroutine.close'") - -- create N coroutines forming a list so that each one, when closed, - -- closes the previous one. (With a large enough N, previous Lua - -- versions crash in this test.) - local coro = false - for i = 1, 1000 do - local previous = coro - coro = coroutine.create(function() - local cc = setmetatable({}, {__close=function() - count = count + 1 - if previous then - assert(coroutine.close(previous)) - end - end}) - coroutine.yield() -- leaves 'cc' pending to be closed - end) - assert(coroutine.resume(coro)) -- start it and run until it yields - end - local st, msg = coroutine.close(coro) - assert(not st and string.find(msg, "C stack overflow")) - print("final count: ", count) -end - - -do - print("nesting of resuming yielded coroutines") - local count = 0 - - local function body () - coroutine.yield() - local f = coroutine.wrap(body) - f(); -- start new coroutine (will stop in previous yield) - count = count + 1 - f() -- call it recursively - end - - local f = coroutine.wrap(body) - f() - assert(not pcall(f)) - print("final count: ", count) -end - - -do -- bug in 5.4.2 - print("nesting coroutines running after recoverable errors") - local count = 0 - local function foo() - count = count + 1 - pcall(1) -- create an error - -- running now inside 'precover' ("protected recover") - coroutine.wrap(foo)() -- call another coroutine - end - checkerror("C stack overflow", foo) - print("final count: ", count) -end - - -if T then - print("testing stack recovery") - local N = 0 -- trace number of calls - local LIM = -1 -- will store N just before stack overflow - - -- trace stack size; after stack overflow, it should be - -- the maximum allowed stack size. - local stack1 - local dummy - - local function err(msg) - assert(string.find(msg, "stack overflow")) - local _, stacknow = T.stacklevel() - assert(stacknow == stack1 + 200) - end - - -- When LIM==-1, the 'if' is not executed, so this function only - -- counts and stores the stack limits up to overflow. Then, LIM - -- becomes N, and then the 'if' code is run when the stack is - -- full. Then, there is a stack overflow inside 'xpcall', after which - -- the stack must have been restored back to its maximum normal size. - local function f() - dummy, stack1 = T.stacklevel() - if N == LIM then - xpcall(f, err) - local _, stacknow = T.stacklevel() - assert(stacknow == stack1) - return - end - N = N + 1 - f() - end - - local topB, sizeB -- top and size Before overflow - local topA, sizeA -- top and size After overflow - topB, sizeB = T.stacklevel() - tracegc.stop() -- __gc should not be called with a full stack - xpcall(f, err) - tracegc.start() - topA, sizeA = T.stacklevel() - -- sizes should be comparable - assert(topA == topB and sizeA < sizeB * 2) - print(string.format("maximum stack size: %d", stack1)) - LIM = N -- will stop recursion at maximum level - N = 0 -- to count again - tracegc.stop() -- __gc should not be called with a full stack - f() - tracegc.start() - print"+" -end - -print'OK' diff --git a/lua-5.4.7-tests/db.lua b/lua-5.4.7-tests/db.lua deleted file mode 100644 index 49ff8e3..0000000 --- a/lua-5.4.7-tests/db.lua +++ /dev/null @@ -1,1054 +0,0 @@ --- $Id: testes/db.lua $ --- See Copyright Notice in file all.lua - --- testing debug library - -local debug = require "debug" - -local function dostring(s) return assert(load(s))() end - -print"testing debug library and debug information" - -do -local a=1 -end - -assert(not debug.gethook()) - -local testline = 19 -- line where 'test' is defined -local function test (s, l, p) -- this must be line 19 - collectgarbage() -- avoid gc during trace - local function f (event, line) - assert(event == 'line') - local l = table.remove(l, 1) - if p then print(l, line) end - assert(l == line, "wrong trace!!") - end - debug.sethook(f,"l"); load(s)(); debug.sethook() - assert(#l == 0) -end - - -do - assert(not pcall(debug.getinfo, print, "X")) -- invalid option - assert(not pcall(debug.getinfo, 0, ">")) -- invalid option - assert(not debug.getinfo(1000)) -- out of range level - assert(not debug.getinfo(-1)) -- out of range level - local a = debug.getinfo(print) - assert(a.what == "C" and a.short_src == "[C]") - a = debug.getinfo(print, "L") - assert(a.activelines == nil) - local b = debug.getinfo(test, "SfL") - assert(b.name == nil and b.what == "Lua" and b.linedefined == testline and - b.lastlinedefined == b.linedefined + 10 and - b.func == test and not string.find(b.short_src, "%[")) - assert(b.activelines[b.linedefined + 1] and - b.activelines[b.lastlinedefined]) - assert(not b.activelines[b.linedefined] and - not b.activelines[b.lastlinedefined + 1]) -end - - --- bug in 5.4.4-5.4.6: activelines in vararg functions --- without debug information -do - local func = load(string.dump(load("print(10)"), true)) - local actl = debug.getinfo(func, "L").activelines - assert(#actl == 0) -- no line info -end - - --- test file and string names truncation -local a = "function f () end" -local function dostring (s, x) return load(s, x)() end -dostring(a) -assert(debug.getinfo(f).short_src == string.format('[string "%s"]', a)) -dostring(a..string.format("; %s\n=1", string.rep('p', 400))) -assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$')) -dostring(a..string.format("; %s=1", string.rep('p', 400))) -assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$')) -dostring("\n"..a) -assert(debug.getinfo(f).short_src == '[string "..."]') -dostring(a, "") -assert(debug.getinfo(f).short_src == '[string ""]') -dostring(a, "@xuxu") -assert(debug.getinfo(f).short_src == "xuxu") -dostring(a, "@"..string.rep('p', 1000)..'t') -assert(string.find(debug.getinfo(f).short_src, "^%.%.%.p*t$")) -dostring(a, "=xuxu") -assert(debug.getinfo(f).short_src == "xuxu") -dostring(a, string.format("=%s", string.rep('x', 500))) -assert(string.find(debug.getinfo(f).short_src, "^x*$")) -dostring(a, "=") -assert(debug.getinfo(f).short_src == "") -_G.a = nil; _G.f = nil; -_G[string.rep("p", 400)] = nil - - -repeat - local g = {x = function () - local a = debug.getinfo(2) - assert(a.name == 'f' and a.namewhat == 'local') - a = debug.getinfo(1) - assert(a.name == 'x' and a.namewhat == 'field') - return 'xixi' - end} - local f = function () return 1+1 and (not 1 or g.x()) end - assert(f() == 'xixi') - g = debug.getinfo(f) - assert(g.what == "Lua" and g.func == f and g.namewhat == "" and not g.name) - - function f (x, name) -- local! - name = name or 'f' - local a = debug.getinfo(1) - assert(a.name == name and a.namewhat == 'local') - return x - end - - -- breaks in different conditions - if 3>4 then break end; f() - if 3<4 then a=1 else break end; f() - while 1 do local x=10; break end; f() - local b = 1 - if 3>4 then return math.sin(1) end; f() - a = 3<4; f() - a = 3<4 or 1; f() - repeat local x=20; if 4>3 then f() else break end; f() until 1 - g = {} - f(g).x = f(2) and f(10)+f(9) - assert(g.x == f(19)) - function g(x) if not x then return 3 end return (x('a', 'x')) end - assert(g(f) == 'a') -until 1 - -test([[if -math.sin(1) -then - a=1 -else - a=2 -end -]], {2,3,4,7}) - - -test([[ -local function foo() -end -foo() -A = 1 -A = 2 -A = 3 -]], {2, 3, 2, 4, 5, 6}) -_G.A = nil - - -test([[-- -if nil then - a=1 -else - a=2 -end -]], {2,5,6}) - -test([[a=1 -repeat - a=a+1 -until a==3 -]], {1,3,4,3,4}) - -test([[ do - return -end -]], {2}) - -test([[local a -a=1 -while a<=3 do - a=a+1 -end -]], {1,2,3,4,3,4,3,4,3,5}) - -test([[while math.sin(1) do - if math.sin(1) - then break - end -end -a=1]], {1,2,3,6}) - -test([[for i=1,3 do - a=i -end -]], {1,2,1,2,1,2,1,3}) - -test([[for i,v in pairs{'a','b'} do - a=tostring(i) .. v -end -]], {1,2,1,2,1,3}) - -test([[for i=1,4 do a=1 end]], {1,1,1,1}) - -_G.a = nil - - -do -- testing line info/trace with large gaps in source - - local a = {1, 2, 3, 10, 124, 125, 126, 127, 128, 129, 130, - 255, 256, 257, 500, 1000} - local s = [[ - local b = {10} - a = b[1] X + Y b[1] - b = 4 - ]] - for _, i in ipairs(a) do - local subs = {X = string.rep("\n", i)} - for _, j in ipairs(a) do - subs.Y = string.rep("\n", j) - local s = string.gsub(s, "[XY]", subs) - test(s, {1, 2 + i, 2 + i + j, 2 + i, 2 + i + j, 3 + i + j}) - end - end -end -_G.a = nil - - -do -- testing active lines - local function checkactivelines (f, lines) - local t = debug.getinfo(f, "SL") - for _, l in pairs(lines) do - l = l + t.linedefined - assert(t.activelines[l]) - t.activelines[l] = undef - end - assert(next(t.activelines) == nil) -- no extra lines - end - - checkactivelines(function (...) -- vararg function - -- 1st line is empty - -- 2nd line is empty - -- 3th line is empty - local a = 20 - -- 5th line is empty - local b = 30 - -- 7th line is empty - end, {4, 6, 8}) - - checkactivelines(function (a) - -- 1st line is empty - -- 2nd line is empty - local a = 20 - local b = 30 - -- 5th line is empty - end, {3, 4, 6}) - - checkactivelines(function (a, b, ...) end, {0}) - - checkactivelines(function (a, b) - end, {1}) - - for _, n in pairs{0, 1, 2, 10, 50, 100, 1000, 10000} do - checkactivelines( - load(string.format("%s return 1", string.rep("\n", n))), - {n + 1}) - end - -end - -print'+' - --- invalid levels in [gs]etlocal -assert(not pcall(debug.getlocal, 20, 1)) -assert(not pcall(debug.setlocal, -1, 1, 10)) - - --- parameter names -local function foo (a,b,...) local d, e end -local co = coroutine.create(foo) - -assert(debug.getlocal(foo, 1) == 'a') -assert(debug.getlocal(foo, 2) == 'b') -assert(not debug.getlocal(foo, 3)) -assert(debug.getlocal(co, foo, 1) == 'a') -assert(debug.getlocal(co, foo, 2) == 'b') -assert(not debug.getlocal(co, foo, 3)) - -assert(not debug.getlocal(print, 1)) - - -local function foo () return (debug.getlocal(1, -1)) end -assert(not foo(10)) - - --- varargs -local function foo (a, ...) - local t = table.pack(...) - for i = 1, t.n do - local n, v = debug.getlocal(1, -i) - assert(n == "(vararg)" and v == t[i]) - end - assert(not debug.getlocal(1, -(t.n + 1))) - assert(not debug.setlocal(1, -(t.n + 1), 30)) - if t.n > 0 then - (function (x) - assert(debug.setlocal(2, -1, x) == "(vararg)") - assert(debug.setlocal(2, -t.n, x) == "(vararg)") - end)(430) - assert(... == 430) - end -end - -foo() -foo(print) -foo(200, 3, 4) -local a = {} -for i = 1, (_soft and 100 or 1000) do a[i] = i end -foo(table.unpack(a)) - - - -do -- test hook presence in debug info - assert(not debug.gethook()) - local count = 0 - local function f () - assert(debug.getinfo(1).namewhat == "hook") - local sndline = string.match(debug.traceback(), "\n(.-)\n") - assert(string.find(sndline, "hook")) - count = count + 1 - end - debug.sethook(f, "l") - local a = 0 - _ENV.a = a - a = 1 - debug.sethook() - assert(count == 4) -end -_ENV.a = nil - - --- hook table has weak keys -assert(getmetatable(debug.getregistry()._HOOKKEY).__mode == 'k') - - -a = {}; local L = nil -local glob = 1 -local oldglob = glob -debug.sethook(function (e,l) - collectgarbage() -- force GC during a hook - local f, m, c = debug.gethook() - assert(m == 'crl' and c == 0) - if e == "line" then - if glob ~= oldglob then - L = l-1 -- get the first line where "glob" has changed - oldglob = glob - end - elseif e == "call" then - local f = debug.getinfo(2, "f").func - a[f] = 1 - else assert(e == "return") - end -end, "crl") - - -function f(a,b) - collectgarbage() - local _, x = debug.getlocal(1, 1) - local _, y = debug.getlocal(1, 2) - assert(x == a and y == b) - assert(debug.setlocal(2, 3, "pera") == "AA".."AA") - assert(debug.setlocal(2, 4, "manga") == "B") - x = debug.getinfo(2) - assert(x.func == g and x.what == "Lua" and x.name == 'g' and - x.nups == 2 and string.find(x.source, "^@.*db%.lua$")) - glob = glob+1 - assert(debug.getinfo(1, "l").currentline == L+1) - assert(debug.getinfo(1, "l").currentline == L+2) -end - -function foo() - glob = glob+1 - assert(debug.getinfo(1, "l").currentline == L+1) -end; foo() -- set L --- check line counting inside strings and empty lines - -local _ = 'alo\ -alo' .. [[ - -]] ---[[ -]] -assert(debug.getinfo(1, "l").currentline == L+11) -- check count of lines - - -function g (...) - local arg = {...} - do local a,b,c; a=math.sin(40); end - local feijao - local AAAA,B = "xuxu", "abacate" - f(AAAA,B) - assert(AAAA == "pera" and B == "manga") - do - local B = 13 - local x,y = debug.getlocal(1,5) - assert(x == 'B' and y == 13) - end -end - -g() - - -assert(a[f] and a[g] and a[assert] and a[debug.getlocal] and not a[print]) - - --- tests for manipulating non-registered locals (C and Lua temporaries) - -local n, v = debug.getlocal(0, 1) -assert(v == 0 and n == "(C temporary)") -local n, v = debug.getlocal(0, 2) -assert(v == 2 and n == "(C temporary)") -assert(not debug.getlocal(0, 3)) -assert(not debug.getlocal(0, 0)) - -function f() - assert(select(2, debug.getlocal(2,3)) == 1) - assert(not debug.getlocal(2,4)) - debug.setlocal(2, 3, 10) - return 20 -end - -function g(a,b) return (a+1) + f() end - -assert(g(0,0) == 30) - -_G.f, _G.g = nil - -debug.sethook(nil); -assert(not debug.gethook()) - - --- minimal tests for setuservalue/getuservalue -do - assert(not debug.setuservalue(io.stdin, 10)) - local a, b = debug.getuservalue(io.stdin, 10) - assert(a == nil and not b) -end - --- testing iteraction between multiple values x hooks -do - local function f(...) return 3, ... end - local count = 0 - local a = {} - for i = 1, 100 do a[i] = i end - debug.sethook(function () count = count + 1 end, "", 1) - local t = {table.unpack(a)} - assert(#t == 100) - t = {table.unpack(a, 1, 3)} - assert(#t == 3) - t = {f(table.unpack(a, 1, 30))} - assert(#t == 31) -end - - --- testing access to function arguments - -local function collectlocals (level) - local tab = {} - for i = 1, math.huge do - local n, v = debug.getlocal(level + 1, i) - if not (n and string.find(n, "^[a-zA-Z0-9_]+$")) then - break -- consider only real variables - end - tab[n] = v - end - return tab -end - - -local X = nil -a = {} -function a:f (a, b, ...) local arg = {...}; local c = 13 end -debug.sethook(function (e) - assert(e == "call") - dostring("XX = 12") -- test dostring inside hooks - -- testing errors inside hooks - assert(not pcall(load("a='joao'+1"))) - debug.sethook(function (e, l) - assert(debug.getinfo(2, "l").currentline == l) - local f,m,c = debug.gethook() - assert(e == "line") - assert(m == 'l' and c == 0) - debug.sethook(nil) -- hook is called only once - assert(not X) -- check that - X = collectlocals(2) - end, "l") -end, "c") - -a:f(1,2,3,4,5) -assert(X.self == a and X.a == 1 and X.b == 2 and X.c == nil) -assert(XX == 12) -assert(not debug.gethook()) -_G.XX = nil - - --- testing access to local variables in return hook (bug in 5.2) -do - local X = false - - local function foo (a, b, ...) - do local x,y,z end - local c, d = 10, 20 - return - end - - local function aux () - if debug.getinfo(2).name == "foo" then - X = true -- to signal that it found 'foo' - local tab = {a = 100, b = 200, c = 10, d = 20} - for n, v in pairs(collectlocals(2)) do - assert(tab[n] == v) - tab[n] = undef - end - assert(next(tab) == nil) -- 'tab' must be empty - end - end - - debug.sethook(aux, "r"); foo(100, 200); debug.sethook() - assert(X) - -end - - -local function eqseq (t1, t2) - assert(#t1 == #t2) - for i = 1, #t1 do - assert(t1[i] == t2[i]) - end -end - - -do print("testing inspection of parameters/returned values") - local on = false - local inp, out - - local function hook (event) - if not on then return end - local ar = debug.getinfo(2, "ruS") - local t = {} - for i = ar.ftransfer, ar.ftransfer + ar.ntransfer - 1 do - local _, v = debug.getlocal(2, i) - t[#t + 1] = v - end - if event == "return" then - out = t - else - inp = t - end - end - - debug.sethook(hook, "cr") - - on = true; math.sin(3); on = false - eqseq(inp, {3}); eqseq(out, {math.sin(3)}) - - on = true; select(2, 10, 20, 30, 40); on = false - eqseq(inp, {2, 10, 20, 30, 40}); eqseq(out, {20, 30, 40}) - - local function foo (a, ...) return ... end - local function foo1 () on = not on; return foo(20, 10, 0) end - foo1(); on = false - eqseq(inp, {20}); eqseq(out, {10, 0}) - - debug.sethook() -end - - - --- testing upvalue access -local function getupvalues (f) - local t = {} - local i = 1 - while true do - local name, value = debug.getupvalue(f, i) - if not name then break end - assert(not t[name]) - t[name] = value - i = i + 1 - end - return t -end - -local a,b,c = 1,2,3 -local function foo1 (a) b = a; return c end -local function foo2 (x) a = x; return c+b end -assert(not debug.getupvalue(foo1, 3)) -assert(not debug.getupvalue(foo1, 0)) -assert(not debug.setupvalue(foo1, 3, "xuxu")) -local t = getupvalues(foo1) -assert(t.a == nil and t.b == 2 and t.c == 3) -t = getupvalues(foo2) -assert(t.a == 1 and t.b == 2 and t.c == 3) -assert(debug.setupvalue(foo1, 1, "xuxu") == "b") -assert(({debug.getupvalue(foo2, 3)})[2] == "xuxu") --- upvalues of C functions are allways "called" "" (the empty string) -assert(debug.getupvalue(string.gmatch("x", "x"), 1) == "") - - --- testing count hooks -local a=0 -debug.sethook(function (e) a=a+1 end, "", 1) -a=0; for i=1,1000 do end; assert(1000 < a and a < 1012) -debug.sethook(function (e) a=a+1 end, "", 4) -a=0; for i=1,1000 do end; assert(250 < a and a < 255) -local f,m,c = debug.gethook() -assert(m == "" and c == 4) -debug.sethook(function (e) a=a+1 end, "", 4000) -a=0; for i=1,1000 do end; assert(a == 0) - -do - debug.sethook(print, "", 2^24 - 1) -- count upperbound - local f,m,c = debug.gethook() - assert(({debug.gethook()})[3] == 2^24 - 1) -end - -debug.sethook() - -local g, g1 - --- tests for tail calls -local function f (x) - if x then - assert(debug.getinfo(1, "S").what == "Lua") - assert(debug.getinfo(1, "t").istailcall == true) - local tail = debug.getinfo(2) - assert(tail.func == g1 and tail.istailcall == true) - assert(debug.getinfo(3, "S").what == "main") - print"+" - end -end - -function g(x) return f(x) end - -function g1(x) g(x) end - -local function h (x) local f=g1; return f(x) end - -h(true) - -local b = {} -debug.sethook(function (e) table.insert(b, e) end, "cr") -h(false) -debug.sethook() -local res = {"return", -- first return (from sethook) - "call", "tail call", "call", "tail call", - "return", "return", - "call", -- last call (to sethook) -} -for i = 1, #res do assert(res[i] == table.remove(b, 1)) end - -b = 0 -debug.sethook(function (e) - if e == "tail call" then - b = b + 1 - assert(debug.getinfo(2, "t").istailcall == true) - else - assert(debug.getinfo(2, "t").istailcall == false) - end - end, "c") -h(false) -debug.sethook() -assert(b == 2) -- two tail calls - -local lim = _soft and 3000 or 30000 -local function foo (x) - if x==0 then - assert(debug.getinfo(2).what == "main") - local info = debug.getinfo(1) - assert(info.istailcall == true and info.func == foo) - else return foo(x-1) - end -end - -foo(lim) - - -print"+" - - --- testing local function information -co = load[[ - local A = function () - return x - end - return -]] - -local a = 0 --- 'A' should be visible to debugger only after its complete definition -debug.sethook(function (e, l) - if l == 3 then a = a + 1; assert(debug.getlocal(2, 1) == "(temporary)") - elseif l == 4 then a = a + 1; assert(debug.getlocal(2, 1) == "A") - end -end, "l") -co() -- run local function definition -debug.sethook() -- turn off hook -assert(a == 2) -- ensure all two lines where hooked - --- testing traceback - -assert(debug.traceback(print) == print) -assert(debug.traceback(print, 4) == print) -assert(string.find(debug.traceback("hi", 4), "^hi\n")) -assert(string.find(debug.traceback("hi"), "^hi\n")) -assert(not string.find(debug.traceback("hi"), "'debug.traceback'")) -assert(string.find(debug.traceback("hi", 0), "'debug.traceback'")) -assert(string.find(debug.traceback(), "^stack traceback:\n")) - -do -- C-function names in traceback - local st, msg = (function () return pcall end)()(debug.traceback) - assert(st == true and string.find(msg, "pcall")) -end - - --- testing nparams, nups e isvararg -local t = debug.getinfo(print, "u") -assert(t.isvararg == true and t.nparams == 0 and t.nups == 0) - -t = debug.getinfo(function (a,b,c) end, "u") -assert(t.isvararg == false and t.nparams == 3 and t.nups == 0) - -t = debug.getinfo(function (a,b,...) return t[a] end, "u") -assert(t.isvararg == true and t.nparams == 2 and t.nups == 1) - -t = debug.getinfo(1) -- main -assert(t.isvararg == true and t.nparams == 0 and t.nups == 1 and - debug.getupvalue(t.func, 1) == "_ENV") - -t = debug.getinfo(math.sin) -- C function -assert(t.isvararg == true and t.nparams == 0 and t.nups == 0) - -t = debug.getinfo(string.gmatch("abc", "a")) -- C closure -assert(t.isvararg == true and t.nparams == 0 and t.nups > 0) - - - --- testing debugging of coroutines - -local function checktraceback (co, p, level) - local tb = debug.traceback(co, nil, level) - local i = 0 - for l in string.gmatch(tb, "[^\n]+\n?") do - assert(i == 0 or string.find(l, p[i])) - i = i+1 - end - assert(p[i] == undef) -end - - -local function f (n) - if n > 0 then f(n-1) - else coroutine.yield() end -end - -local co = coroutine.create(f) -coroutine.resume(co, 3) -checktraceback(co, {"yield", "db.lua", "db.lua", "db.lua", "db.lua"}) -checktraceback(co, {"db.lua", "db.lua", "db.lua", "db.lua"}, 1) -checktraceback(co, {"db.lua", "db.lua", "db.lua"}, 2) -checktraceback(co, {"db.lua"}, 4) -checktraceback(co, {}, 40) - - -co = coroutine.create(function (x) - local a = 1 - coroutine.yield(debug.getinfo(1, "l")) - coroutine.yield(debug.getinfo(1, "l").currentline) - return a - end) - -local tr = {} -local foo = function (e, l) if l then table.insert(tr, l) end end -debug.sethook(co, foo, "lcr") - -local _, l = coroutine.resume(co, 10) -local x = debug.getinfo(co, 1, "lfLS") -assert(x.currentline == l.currentline and x.activelines[x.currentline]) -assert(type(x.func) == "function") -for i=x.linedefined + 1, x.lastlinedefined do - assert(x.activelines[i]) - x.activelines[i] = undef -end -assert(next(x.activelines) == nil) -- no 'extra' elements -assert(not debug.getinfo(co, 2)) -local a,b = debug.getlocal(co, 1, 1) -assert(a == "x" and b == 10) -a,b = debug.getlocal(co, 1, 2) -assert(a == "a" and b == 1) -debug.setlocal(co, 1, 2, "hi") -assert(debug.gethook(co) == foo) -assert(#tr == 2 and - tr[1] == l.currentline-1 and tr[2] == l.currentline) - -a,b,c = pcall(coroutine.resume, co) -assert(a and b and c == l.currentline+1) -checktraceback(co, {"yield", "in function <"}) - -a,b = coroutine.resume(co) -assert(a and b == "hi") -assert(#tr == 4 and tr[4] == l.currentline+2) -assert(debug.gethook(co) == foo) -assert(not debug.gethook()) -checktraceback(co, {}) - - --- check get/setlocal in coroutines -co = coroutine.create(function (x) - local a, b = coroutine.yield(x) - assert(a == 100 and b == nil) - return x -end) -a, b = coroutine.resume(co, 10) -assert(a and b == 10) -a, b = debug.getlocal(co, 1, 1) -assert(a == "x" and b == 10) -assert(not debug.getlocal(co, 1, 5)) -assert(debug.setlocal(co, 1, 1, 30) == "x") -assert(not debug.setlocal(co, 1, 5, 40)) -a, b = coroutine.resume(co, 100) -assert(a and b == 30) - - --- check traceback of suspended (or dead with error) coroutines - -function f(i) - if i == 0 then error(i) - else coroutine.yield(); f(i-1) - end -end - - -co = coroutine.create(function (x) f(x) end) -a, b = coroutine.resume(co, 3) -t = {"'coroutine.yield'", "'f'", "in function <"} -while coroutine.status(co) == "suspended" do - checktraceback(co, t) - a, b = coroutine.resume(co) - table.insert(t, 2, "'f'") -- one more recursive call to 'f' -end -t[1] = "'error'" -checktraceback(co, t) - - --- test acessing line numbers of a coroutine from a resume inside --- a C function (this is a known bug in Lua 5.0) - -local function g(x) - coroutine.yield(x) -end - -local function f (i) - debug.sethook(function () end, "l") - for j=1,1000 do - g(i+j) - end -end - -local co = coroutine.wrap(f) -co(10) -pcall(co) -pcall(co) - - -assert(type(debug.getregistry()) == "table") - - --- test tagmethod information -local a = {} -local function f (t) - local info = debug.getinfo(1); - assert(info.namewhat == "metamethod") - a.op = info.name - return info.name -end -setmetatable(a, { - __index = f; __add = f; __div = f; __mod = f; __concat = f; __pow = f; - __mul = f; __idiv = f; __unm = f; __len = f; __sub = f; - __shl = f; __shr = f; __bor = f; __bxor = f; - __eq = f; __le = f; __lt = f; __unm = f; __len = f; __band = f; - __bnot = f; -}) - -local b = setmetatable({}, getmetatable(a)) - -assert(a[3] == "index" and a^3 == "pow" and a..a == "concat") -assert(a/3 == "div" and 3%a == "mod") -assert(a+3 == "add" and 3-a == "sub" and a*3 == "mul" and - -a == "unm" and #a == "len" and a&3 == "band") -assert(a + 30000 == "add" and a - 3.0 == "sub" and a * 3.0 == "mul" and - -a == "unm" and #a == "len" and a & 3 == "band") -assert(a|3 == "bor" and 3~a == "bxor" and a<<3 == "shl" and a>>1 == "shr") -assert (a==b and a.op == "eq") -assert (a>=b and a.op == "le") -assert ("x">=a and a.op == "le") -assert (a>b and a.op == "lt") -assert (a>10 and a.op == "lt") -assert(~a == "bnot") - -do -- testing for-iterator name - local function f() - assert(debug.getinfo(1).name == "for iterator") - end - - for i in f do end -end - - -do -- testing debug info for finalizers - local name = nil - - -- create a piece of garbage with a finalizer - setmetatable({}, {__gc = function () - local t = debug.getinfo(1) -- get function information - assert(t.namewhat == "metamethod") - name = t.name - end}) - - -- repeat until previous finalizer runs (setting 'name') - repeat local a = {} until name - assert(name == "__gc") -end - - -do - print("testing traceback sizes") - - local function countlines (s) - return select(2, string.gsub(s, "\n", "")) - end - - local function deep (lvl, n) - if lvl == 0 then - return (debug.traceback("message", n)) - else - return (deep(lvl-1, n)) - end - end - - local function checkdeep (total, start) - local s = deep(total, start) - local rest = string.match(s, "^message\nstack traceback:\n(.*)$") - local cl = countlines(rest) - -- at most 10 lines in first part, 11 in second, plus '...' - assert(cl <= 10 + 11 + 1) - local brk = string.find(rest, "%.%.%.\t%(skip") - if brk then -- does message have '...'? - local rest1 = string.sub(rest, 1, brk) - local rest2 = string.sub(rest, brk, #rest) - assert(countlines(rest1) == 10 and countlines(rest2) == 11) - else - assert(cl == total - start + 2) - end - end - - for d = 1, 51, 10 do - for l = 1, d do - -- use coroutines to ensure complete control of the stack - coroutine.wrap(checkdeep)(d, l) - end - end - -end - - -print("testing debug functions on chunk without debug info") -local prog = [[-- program to be loaded without debug information (strip) -local debug = require'debug' -local a = 12 -- a local variable - -local n, v = debug.getlocal(1, 1) -assert(n == "(temporary)" and v == debug) -- unkown name but known value -n, v = debug.getlocal(1, 2) -assert(n == "(temporary)" and v == 12) -- unkown name but known value - --- a function with an upvalue -local f = function () local x; return a end -n, v = debug.getupvalue(f, 1) -assert(n == "(no name)" and v == 12) -assert(debug.setupvalue(f, 1, 13) == "(no name)") -assert(a == 13) - -local t = debug.getinfo(f) -assert(t.name == nil and t.linedefined > 0 and - t.lastlinedefined == t.linedefined and - t.short_src == "?") -assert(debug.getinfo(1).currentline == -1) - -t = debug.getinfo(f, "L").activelines -assert(next(t) == nil) -- active lines are empty - --- dump/load a function without debug info -f = load(string.dump(f)) - -t = debug.getinfo(f) -assert(t.name == nil and t.linedefined > 0 and - t.lastlinedefined == t.linedefined and - t.short_src == "?") -assert(debug.getinfo(1).currentline == -1) - -return a -]] - - --- load 'prog' without debug info -local f = assert(load(string.dump(load(prog), true))) - -assert(f() == 13) - -do -- bug in 5.4.0: line hooks in stripped code - local function foo () - local a = 1 - local b = 2 - return b - end - - local s = load(string.dump(foo, true)) - local line = true - debug.sethook(function (e, l) - assert(e == "line") - line = l - end, "l") - assert(s() == 2); debug.sethook(nil) - assert(line == nil) -- hook called withoug debug info for 1st instruction -end - -do -- tests for 'source' in binary dumps - local prog = [[ - return function (x) - return function (y) - return x + y - end - end - ]] - local name = string.rep("x", 1000) - local p = assert(load(prog, name)) - -- load 'p' as a binary chunk with debug information - local c = string.dump(p) - assert(#c > 1000 and #c < 2000) -- no repetition of 'source' in dump - local f = assert(load(c)) - local g = f() - local h = g(3) - assert(h(5) == 8) - assert(debug.getinfo(f).source == name and -- all functions have 'source' - debug.getinfo(g).source == name and - debug.getinfo(h).source == name) - -- again, without debug info - local c = string.dump(p, true) - assert(#c < 500) -- no 'source' in dump - local f = assert(load(c)) - local g = f() - local h = g(30) - assert(h(50) == 80) - assert(debug.getinfo(f).source == '=?' and -- no function has 'source' - debug.getinfo(g).source == '=?' and - debug.getinfo(h).source == '=?') -end - -print"OK" - diff --git a/lua-5.4.7-tests/errors.lua b/lua-5.4.7-tests/errors.lua deleted file mode 100644 index 80d91a9..0000000 --- a/lua-5.4.7-tests/errors.lua +++ /dev/null @@ -1,696 +0,0 @@ --- $Id: testes/errors.lua $ --- See Copyright Notice in file all.lua - -print("testing errors") - -local debug = require"debug" - --- avoid problems with 'strict' module (which may generate other error messages) -local mt = getmetatable(_G) or {} -local oldmm = mt.__index -mt.__index = nil - -local function checkerr (msg, f, ...) - local st, err = pcall(f, ...) - assert(not st and string.find(err, msg)) -end - - -local function doit (s) - local f, msg = load(s) - if not f then return msg end - local cond, msg = pcall(f) - return (not cond) and msg -end - - -local function checkmessage (prog, msg, debug) - local m = doit(prog) - if debug then print(m, msg) end - assert(string.find(m, msg, 1, true)) -end - -local function checksyntax (prog, extra, token, line) - local msg = doit(prog) - if not string.find(token, "^<%a") and not string.find(token, "^char%(") - then token = "'"..token.."'" end - token = string.gsub(token, "(%p)", "%%%1") - local pt = string.format([[^%%[string ".*"%%]:%d: .- near %s$]], - line, token) - assert(string.find(msg, pt)) - assert(string.find(msg, msg, 1, true)) -end - - --- test error message with no extra info -assert(doit("error('hi', 0)") == 'hi') - --- test error message with no info -assert(doit("error()") == nil) - - --- test common errors/errors that crashed in the past -assert(doit("table.unpack({}, 1, n=2^30)")) -assert(doit("a=math.sin()")) -assert(not doit("tostring(1)") and doit("tostring()")) -assert(doit"tonumber()") -assert(doit"repeat until 1; a") -assert(doit"return;;") -assert(doit"assert(false)") -assert(doit"assert(nil)") -assert(doit("function a (... , ...) end")) -assert(doit("function a (, ...) end")) -assert(doit("local t={}; t = t[#t] + 1")) - -checksyntax([[ - local a = {4 - -]], "'}' expected (to close '{' at line 1)", "", 3) - - -do -- testing errors in goto/break - local function checksyntax (prog, msg, line) - local st, err = load(prog) - assert(string.find(err, "line " .. line)) - assert(string.find(err, msg, 1, true)) - end - - checksyntax([[ - ::A:: a = 1 - ::A:: - ]], "label 'A' already defined", 1) - - checksyntax([[ - a = 1 - goto A - do ::A:: end - ]], "no visible label 'A'", 2) - -end - - -if not T then - (Message or print) - ('\n >>> testC not active: skipping tests for messages in C <<<\n') -else - print "testing memory error message" - local a = {} - for i = 1, 10000 do a[i] = true end -- preallocate array - collectgarbage() - T.totalmem(T.totalmem() + 10000) - -- force a memory error (by a small margin) - local st, msg = pcall(function() - for i = 1, 100000 do a[i] = tostring(i) end - end) - T.totalmem(0) - assert(not st and msg == "not enough" .. " memory") - - -- stack space for luaL_traceback (bug in 5.4.6) - local res = T.testC[[ - # push 16 elements on the stack - pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1; - pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1; - pushnum 1; pushnum 1; pushnum 1; pushnum 1; pushnum 1; - pushnum 1; - # traceback should work with 4 remaining slots - traceback xuxu 1; - return 1 - ]] - assert(string.find(res, "xuxu.-main chunk")) -end - - --- tests for better error messages - -checkmessage("a = {} + 1", "arithmetic") -checkmessage("a = {} | 1", "bitwise operation") -checkmessage("a = {} < 1", "attempt to compare") -checkmessage("a = {} <= 1", "attempt to compare") - -checkmessage("aaa=1; bbbb=2; aaa=math.sin(3)+bbbb(3)", "global 'bbbb'") -checkmessage("aaa={}; do local aaa=1 end aaa:bbbb(3)", "method 'bbbb'") -checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'") -assert(not string.find(doit"aaa={13}; local bbbb=1; aaa[bbbb](3)", "'bbbb'")) -checkmessage("aaa={13}; local bbbb=1; aaa[bbbb](3)", "number") -checkmessage("aaa=(1)..{}", "a table value") - --- bug in 5.4.6 -checkmessage("a = {_ENV = {}}; print(a._ENV.x + 1)", "field 'x'") - -_G.aaa, _G.bbbb = nil - --- calls -checkmessage("local a; a(13)", "local 'a'") -checkmessage([[ - local a = setmetatable({}, {__add = 34}) - a = a + 1 -]], "metamethod 'add'") -checkmessage([[ - local a = setmetatable({}, {__lt = {}}) - a = a > a -]], "metamethod 'lt'") - --- tail calls -checkmessage("local a={}; return a.bbbb(3)", "field 'bbbb'") -checkmessage("aaa={}; do local aaa=1 end; return aaa:bbbb(3)", "method 'bbbb'") - -checkmessage("aaa = #print", "length of a function value") -checkmessage("aaa = #3", "length of a number value") - -_G.aaa = nil - -checkmessage("aaa.bbb:ddd(9)", "global 'aaa'") -checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'") -checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'") -checkmessage("local a,b,c; (function () a = b+1.1 end)()", "upvalue 'b'") -assert(not doit"local aaa={bbb={ddd=next}}; aaa.bbb:ddd(nil)") - --- upvalues being indexed do not go to the stack -checkmessage("local a,b,cc; (function () a = cc[1] end)()", "upvalue 'cc'") -checkmessage("local a,b,cc; (function () a.x = 1 end)()", "upvalue 'a'") - -checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'") - -checkmessage("BB=1; local aaa={}; x=aaa+BB", "local 'aaa'") -checkmessage("aaa={}; x=3.3/aaa", "global 'aaa'") -checkmessage("aaa=2; BB=nil;x=aaa*BB", "global 'BB'") -checkmessage("aaa={}; x=-aaa", "global 'aaa'") - --- short circuit -checkmessage("aaa=1; local aaa,bbbb=2,3; aaa = math.sin(1) and bbbb(3)", - "local 'bbbb'") -checkmessage("aaa=1; local aaa,bbbb=2,3; aaa = bbbb(1) or aaa(3)", - "local 'bbbb'") -checkmessage("local a,b,c,f = 1,1,1; f((a and b) or c)", "local 'f'") -checkmessage("local a,b,c = 1,1,1; ((a and b) or c)()", "call a number value") -assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'")) -assert(not string.find(doit"aaa={}; (aaa or aaa)()", "'aaa'")) - -checkmessage("print(print < 10)", "function with number") -checkmessage("print(print < print)", "two function values") -checkmessage("print('10' < 10)", "string with number") -checkmessage("print(10 < '23')", "number with string") - --- float->integer conversions -checkmessage("local a = 2.0^100; x = a << 2", "local a") -checkmessage("local a = 1 >> 2.0^100", "has no integer representation") -checkmessage("local a = 10.1 << 2.0^100", "has no integer representation") -checkmessage("local a = 2.0^100 & 1", "has no integer representation") -checkmessage("local a = 2.0^100 & 1e100", "has no integer representation") -checkmessage("local a = 2.0 | 1e40", "has no integer representation") -checkmessage("local a = 2e100 ~ 1", "has no integer representation") -checkmessage("string.sub('a', 2.0^100)", "has no integer representation") -checkmessage("string.rep('a', 3.3)", "has no integer representation") -checkmessage("return 6e40 & 7", "has no integer representation") -checkmessage("return 34 << 7e30", "has no integer representation") -checkmessage("return ~-3e40", "has no integer representation") -checkmessage("return ~-3.009", "has no integer representation") -checkmessage("return 3.009 & 1", "has no integer representation") -checkmessage("return 34 >> {}", "table value") -checkmessage("aaa = 24 // 0", "divide by zero") -checkmessage("aaa = 1 % 0", "'n%0'") - - --- type error for an object which is neither in an upvalue nor a register. --- The following code will try to index the value 10 that is stored in --- the metatable, without moving it to a register. -checkmessage("local a = setmetatable({}, {__index = 10}).x", - "attempt to index a number value") - - --- numeric for loops -checkmessage("for i = {}, 10 do end", "table") -checkmessage("for i = io.stdin, 10 do end", "FILE") -checkmessage("for i = {}, 10 do end", "initial value") -checkmessage("for i = 1, 'x', 10 do end", "string") -checkmessage("for i = 1, {}, 10 do end", "limit") -checkmessage("for i = 1, {} do end", "limit") -checkmessage("for i = 1, 10, print do end", "step") -checkmessage("for i = 1, 10, print do end", "function") - --- passing light userdata instead of full userdata -_G.D = debug -checkmessage([[ - -- create light udata - local x = D.upvalueid(function () return debug end, 1) - D.setuservalue(x, {}) -]], "light userdata") -_G.D = nil - -do -- named objects (field '__name') - checkmessage("math.sin(io.input())", "(number expected, got FILE*)") - _G.XX = setmetatable({}, {__name = "My Type"}) - assert(string.find(tostring(XX), "^My Type")) - checkmessage("io.input(XX)", "(FILE* expected, got My Type)") - checkmessage("return XX + 1", "on a My Type value") - checkmessage("return ~io.stdin", "on a FILE* value") - checkmessage("return XX < XX", "two My Type values") - checkmessage("return {} < XX", "table with My Type") - checkmessage("return XX < io.stdin", "My Type with FILE*") - _G.XX = nil - - if T then -- extra tests for 'luaL_tolstring' - -- bug in 5.4.3; 'luaL_tolstring' with negative indices - local x = setmetatable({}, {__name="TABLE"}) - assert(T.testC("Ltolstring -1; return 1", x) == tostring(x)) - - local a, b = T.testC("pushint 10; Ltolstring -2; return 2", x) - assert(a == 10 and b == tostring(x)) - - setmetatable(x, {__tostring=function (o) - assert(o == x) - return "ABC" - end}) - local a, b, c = T.testC("pushint 10; Ltolstring -2; return 3", x) - assert(a == x and b == 10 and c == "ABC") - end -end - --- global functions -checkmessage("(io.write or print){}", "io.write") -checkmessage("(collectgarbage or print){}", "collectgarbage") - --- errors in functions without debug info -do - local f = function (a) return a + 1 end - f = assert(load(string.dump(f, true))) - assert(f(3) == 4) - checkerr("^%?:%-1:", f, {}) - - -- code with a move to a local var ('OP_MOV A B' with A3+1, - {d = x and aaa[x or y]}} -]], "global 'aaa'") - -checkmessage([[ -local x,y = {},1 -if math.sin(1) == 0 then return 3 end -- return -x.a()]], "field 'a'") - -checkmessage([[ -prefix = nil -insert = nil -while 1 do - local a - if nil then break end - insert(prefix, a) -end]], "global 'insert'") - -checkmessage([[ -- tail call - return math.sin("a") -]], "sin") - -checkmessage([[collectgarbage("nooption")]], "invalid option") - -checkmessage([[x = print .. "a"]], "concatenate") -checkmessage([[x = "a" .. false]], "concatenate") -checkmessage([[x = {} .. 2]], "concatenate") - -checkmessage("getmetatable(io.stdin).__gc()", "no value") - -checkmessage([[ -local Var -local function main() - NoSuchName (function() Var=0 end) -end -main() -]], "global 'NoSuchName'") -print'+' - -aaa = {}; setmetatable(aaa, {__index = string}) -checkmessage("aaa:sub()", "bad self") -checkmessage("string.sub('a', {})", "#2") -checkmessage("('a'):sub{}", "#1") - -checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'") -checkmessage("string.gsub('s', 's', setmetatable)", "'setmetatable'") - -_G.aaa = nil - - --- tests for errors in coroutines - -local function f (n) - local c = coroutine.create(f) - local a,b = coroutine.resume(c) - return b -end -assert(string.find(f(), "C stack overflow")) - -checkmessage("coroutine.yield()", "outside a coroutine") - -f = coroutine.wrap(function () table.sort({1,2,3}, coroutine.yield) end) -checkerr("yield across", f) - - --- testing size of 'source' info; size of buffer for that info is --- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'. -local idsize = 60 - 1 -local function checksize (source) - -- syntax error - local _, msg = load("x", source) - msg = string.match(msg, "^([^:]*):") -- get source (1st part before ':') - assert(msg:len() <= idsize) -end - -for i = 60 - 10, 60 + 10 do -- check border cases around 60 - checksize("@" .. string.rep("x", i)) -- file names - checksize(string.rep("x", i - 10)) -- string sources - checksize("=" .. string.rep("x", i)) -- exact sources -end - - --- testing line error - -local function lineerror (s, l) - local err,msg = pcall(load(s)) - local line = tonumber(string.match(msg, ":(%d+):")) - assert(line == l or (not line and not l)) -end - -lineerror("local a\n for i=1,'a' do \n print(i) \n end", 2) -lineerror("\n local a \n for k,v in 3 \n do \n print(k) \n end", 3) -lineerror("\n\n for k,v in \n 3 \n do \n print(k) \n end", 4) -lineerror("function a.x.y ()\na=a+1\nend", 1) - -lineerror("a = \na\n+\n{}", 3) -lineerror("a = \n3\n+\n(\n4\n/\nprint)", 6) -lineerror("a = \nprint\n+\n(\n4\n/\n7)", 3) - -lineerror("a\n=\n-\n\nprint\n;", 3) - -lineerror([[ -a -( -- << -23) -]], 2) - -lineerror([[ -local a = {x = 13} -a -. -x -( -- << -23 -) -]], 5) - -lineerror([[ -local a = {x = 13} -a -. -x -( -23 + a -) -]], 6) - -local p = [[ - function g() f() end - function f(x) error('a', XX) end -g() -]] -XX=3;lineerror((p), 3) -XX=0;lineerror((p), false) -XX=1;lineerror((p), 2) -XX=2;lineerror((p), 1) -_G.XX, _G.g, _G.f = nil - - -lineerror([[ -local b = false -if not b then - error 'test' -end]], 3) - -lineerror([[ -local b = false -if not b then - if not b then - if not b then - error 'test' - end - end -end]], 5) - - --- bug in 5.4.0 -lineerror([[ - local a = 0 - local b = 1 - local c = b % a -]], 3) - -do - -- Force a negative estimate for base line. Error in instruction 2 - -- (after VARARGPREP, GETGLOBAL), with first absolute line information - -- (forced by too many lines) in instruction 0. - local s = string.format("%s return __A.x", string.rep("\n", 300)) - lineerror(s, 301) -end - - -if not _soft then - -- several tests that exaust the Lua stack - collectgarbage() - print"testing stack overflow" - local C = 0 - -- get line where stack overflow will happen - local l = debug.getinfo(1, "l").currentline + 1 - local function auxy () C=C+1; auxy() end -- produce a stack overflow - function YY () - collectgarbage("stop") -- avoid running finalizers without stack space - auxy() - collectgarbage("restart") - end - - local function checkstackmessage (m) - print("(expected stack overflow after " .. C .. " calls)") - C = 0 -- prepare next count - return (string.find(m, "stack overflow")) - end - -- repeated stack overflows (to check stack recovery) - assert(checkstackmessage(doit('YY()'))) - assert(checkstackmessage(doit('YY()'))) - assert(checkstackmessage(doit('YY()'))) - - _G.YY = nil - - - -- error lines in stack overflow - local l1 - local function g(x) - l1 = debug.getinfo(x, "l").currentline + 2 - collectgarbage("stop") -- avoid running finalizers without stack space - auxy() - collectgarbage("restart") - end - local _, stackmsg = xpcall(g, debug.traceback, 1) - print('+') - local stack = {} - for line in string.gmatch(stackmsg, "[^\n]*") do - local curr = string.match(line, ":(%d+):") - if curr then table.insert(stack, tonumber(curr)) end - end - local i=1 - while stack[i] ~= l1 do - assert(stack[i] == l) - i = i+1 - end - assert(i > 15) - - - -- error in error handling - local res, msg = xpcall(error, error) - assert(not res and type(msg) == 'string') - print('+') - - local function f (x) - if x==0 then error('a\n') - else - local aux = function () return f(x-1) end - local a,b = xpcall(aux, aux) - return a,b - end - end - f(3) - - local function loop (x,y,z) return 1 + loop(x, y, z) end - - local res, msg = xpcall(loop, function (m) - assert(string.find(m, "stack overflow")) - checkerr("error handling", loop) - assert(math.sin(0) == 0) - return 15 - end) - assert(msg == 15) - - local f = function () - for i = 999900, 1000000, 1 do table.unpack({}, 1, i) end - end - checkerr("too many results", f) - -end - - -do - -- non string messages - local t = {} - local res, msg = pcall(function () error(t) end) - assert(not res and msg == t) - - res, msg = pcall(function () error(nil) end) - assert(not res and msg == nil) - - local function f() error{msg='x'} end - res, msg = xpcall(f, function (r) return {msg=r.msg..'y'} end) - assert(msg.msg == 'xy') - - -- 'assert' with extra arguments - res, msg = pcall(assert, false, "X", t) - assert(not res and msg == "X") - - -- 'assert' with no message - res, msg = pcall(function () assert(false) end) - local line = string.match(msg, "%w+%.lua:(%d+): assertion failed!$") - assert(tonumber(line) == debug.getinfo(1, "l").currentline - 2) - - -- 'assert' with non-string messages - res, msg = pcall(assert, false, t) - assert(not res and msg == t) - - res, msg = pcall(assert, nil, nil) - assert(not res and msg == nil) - - -- 'assert' without arguments - res, msg = pcall(assert) - assert(not res and string.find(msg, "value expected")) -end - --- xpcall with arguments -local a, b, c = xpcall(string.find, error, "alo", "al") -assert(a and b == 1 and c == 2) -a, b, c = xpcall(string.find, function (x) return {} end, true, "al") -assert(not a and type(b) == "table" and c == nil) - - -print("testing tokens in error messages") -checksyntax("syntax error", "", "error", 1) -checksyntax("1.000", "", "1.000", 1) -checksyntax("[[a]]", "", "[[a]]", 1) -checksyntax("'aa'", "", "'aa'", 1) -checksyntax("while << do end", "", "<<", 1) -checksyntax("for >> do end", "", ">>", 1) - --- test invalid non-printable char in a chunk -checksyntax("a\1a = 1", "", "<\\1>", 1) - --- test 255 as first char in a chunk -checksyntax("\255a = 1", "", "<\\255>", 1) - -doit('I = load("a=9+"); aaa=3') -assert(_G.aaa==3 and not _G.I) -_G.I,_G.aaa = nil -print('+') - -local lim = 1000 -if _soft then lim = 100 end -for i=1,lim do - doit('a = ') - doit('a = 4+nil') -end - - --- testing syntax limits - -local function testrep (init, rep, close, repc, finalresult) - local s = init .. string.rep(rep, 100) .. close .. string.rep(repc, 100) - local res, msg = load(s) - assert(res) -- 100 levels is OK - if (finalresult) then - assert(res() == finalresult) - end - s = init .. string.rep(rep, 500) - local res, msg = load(s) -- 500 levels not ok - assert(not res and (string.find(msg, "too many") or - string.find(msg, "overflow"))) -end - -testrep("local a; a", ",a", "= 1", ",1") -- multiple assignment -testrep("local a; a=", "{", "0", "}") -testrep("return ", "(", "2", ")", 2) -testrep("local function a (x) return x end; return ", "a(", "2.2", ")", 2.2) -testrep("", "do ", "", " end") -testrep("", "while a do ", "", " end") -testrep("local a; ", "if a then else ", "", " end") -testrep("", "function foo () ", "", " end") -testrep("local a = ''; return ", "a..", "'a'", "", "a") -testrep("local a = 1; return ", "a^", "a", "", 1) - -checkmessage("a = f(x" .. string.rep(",x", 260) .. ")", "too many registers") - - --- testing other limits - --- upvalues -local lim = 127 -local s = "local function fooA ()\n local " -for j = 1,lim do - s = s.."a"..j..", " -end -s = s.."b,c\n" -s = s.."local function fooB ()\n local " -for j = 1,lim do - s = s.."b"..j..", " -end -s = s.."b\n" -s = s.."function fooC () return b+c" -local c = 1+2 -for j = 1,lim do - s = s.."+a"..j.."+b"..j - c = c + 2 -end -s = s.."\nend end end" -local a,b = load(s) -assert(c > 255 and string.find(b, "too many upvalues") and - string.find(b, "line 5")) - --- local variables -s = "\nfunction foo ()\n local " -for j = 1,300 do - s = s.."a"..j..", " -end -s = s.."b\n" -local a,b = load(s) -assert(string.find(b, "line 2") and string.find(b, "too many local variables")) - -mt.__index = oldmm - -print('OK') diff --git a/lua-5.4.7-tests/events.lua b/lua-5.4.7-tests/events.lua deleted file mode 100644 index 8d8563b..0000000 --- a/lua-5.4.7-tests/events.lua +++ /dev/null @@ -1,491 +0,0 @@ --- $Id: testes/events.lua $ --- See Copyright Notice in file all.lua - -print('testing metatables') - -local debug = require'debug' - -X = 20; B = 30 - -_ENV = setmetatable({}, {__index=_G}) - -collectgarbage() - -X = X+10 -assert(X == 30 and _G.X == 20) -B = false -assert(B == false) -_ENV["B"] = undef -assert(B == 30) - -assert(getmetatable{} == nil) -assert(getmetatable(4) == nil) -assert(getmetatable(nil) == nil) -a={name = "NAME"}; setmetatable(a, {__metatable = "xuxu", - __tostring=function(x) return x.name end}) -assert(getmetatable(a) == "xuxu") -assert(tostring(a) == "NAME") --- cannot change a protected metatable -assert(pcall(setmetatable, a, {}) == false) -a.name = "gororoba" -assert(tostring(a) == "gororoba") - -local a, t = {10,20,30; x="10", y="20"}, {} -assert(setmetatable(a,t) == a) -assert(getmetatable(a) == t) -assert(setmetatable(a,nil) == a) -assert(getmetatable(a) == nil) -assert(setmetatable(a,t) == a) - - -function f (t, i, e) - assert(not e) - local p = rawget(t, "parent") - return (p and p[i]+3), "dummy return" -end - -t.__index = f - -a.parent = {z=25, x=12, [4] = 24} -assert(a[1] == 10 and a.z == 28 and a[4] == 27 and a.x == "10") - -collectgarbage() - -a = setmetatable({}, t) -function f(t, i, v) rawset(t, i, v-3) end -setmetatable(t, t) -- causes a bug in 5.1 ! -t.__newindex = f -a[1] = 30; a.x = "101"; a[5] = 200 -assert(a[1] == 27 and a.x == 98 and a[5] == 197) - -do -- bug in Lua 5.3.2 - local mt = {} - mt.__newindex = mt - local t = setmetatable({}, mt) - t[1] = 10 -- will segfault on some machines - assert(mt[1] == 10) -end - - -local c = {} -a = setmetatable({}, t) -t.__newindex = c -t.__index = c -a[1] = 10; a[2] = 20; a[3] = 90; -for i = 4, 20 do a[i] = i * 10 end -assert(a[1] == 10 and a[2] == 20 and a[3] == 90) -for i = 4, 20 do assert(a[i] == i * 10) end -assert(next(a) == nil) - - -do - local a; - a = setmetatable({}, {__index = setmetatable({}, - {__index = setmetatable({}, - {__index = function (_,n) return a[n-3]+4, "lixo" end})})}) - a[0] = 20 - for i=0,10 do - assert(a[i*3] == 20 + i*4) - end -end - - -do -- newindex - local foi - local a = {} - for i=1,10 do a[i] = 0; a['a'..i] = 0; end - setmetatable(a, {__newindex = function (t,k,v) foi=true; rawset(t,k,v) end}) - foi = false; a[1]=0; assert(not foi) - foi = false; a['a1']=0; assert(not foi) - foi = false; a['a11']=0; assert(foi) - foi = false; a[11]=0; assert(foi) - foi = false; a[1]=undef; assert(not foi) - a[1] = undef - foi = false; a[1]=nil; assert(foi) -end - - -setmetatable(t, nil) -function f (t, ...) return t, {...} end -t.__call = f - -do - local x,y = a(table.unpack{'a', 1}) - assert(x==a and y[1]=='a' and y[2]==1 and y[3]==undef) - x,y = a() - assert(x==a and y[1]==undef) -end - - -local b = setmetatable({}, t) -setmetatable(b,t) - -function f(op) - return function (...) cap = {[0] = op, ...} ; return (...) end -end -t.__add = f("add") -t.__sub = f("sub") -t.__mul = f("mul") -t.__div = f("div") -t.__idiv = f("idiv") -t.__mod = f("mod") -t.__unm = f("unm") -t.__pow = f("pow") -t.__len = f("len") -t.__band = f("band") -t.__bor = f("bor") -t.__bxor = f("bxor") -t.__shl = f("shl") -t.__shr = f("shr") -t.__bnot = f("bnot") -t.__lt = f("lt") -t.__le = f("le") - - -local function checkcap (t) - assert(#cap + 1 == #t) - for i = 1, #t do - assert(cap[i - 1] == t[i]) - assert(math.type(cap[i - 1]) == math.type(t[i])) - end -end - --- Some tests are done inside small anonymous functions to ensure --- that constants go to constant table even in debug compilation, --- when the constant table is very small. -assert(b+5 == b); checkcap{"add", b, 5} -assert(5.2 + b == 5.2); checkcap{"add", 5.2, b} -assert(b+'5' == b); checkcap{"add", b, '5'} -assert(5+b == 5); checkcap{"add", 5, b} -assert('5'+b == '5'); checkcap{"add", '5', b} -b=b-3; assert(getmetatable(b) == t); checkcap{"sub", b, 3} -assert(5-a == 5); checkcap{"sub", 5, a} -assert('5'-a == '5'); checkcap{"sub", '5', a} -assert(a*a == a); checkcap{"mul", a, a} -assert(a/0 == a); checkcap{"div", a, 0} -assert(a/0.0 == a); checkcap{"div", a, 0.0} -assert(a%2 == a); checkcap{"mod", a, 2} -assert(a // (1/0) == a); checkcap{"idiv", a, 1/0} -;(function () assert(a & "hi" == a) end)(); checkcap{"band", a, "hi"} -;(function () assert(10 & a == 10) end)(); checkcap{"band", 10, a} -;(function () assert(a | 10 == a) end)(); checkcap{"bor", a, 10} -assert(a | "hi" == a); checkcap{"bor", a, "hi"} -assert("hi" ~ a == "hi"); checkcap{"bxor", "hi", a} -;(function () assert(10 ~ a == 10) end)(); checkcap{"bxor", 10, a} -assert(-a == a); checkcap{"unm", a, a} -assert(a^4.0 == a); checkcap{"pow", a, 4.0} -assert(a^'4' == a); checkcap{"pow", a, '4'} -assert(4^a == 4); checkcap{"pow", 4, a} -assert('4'^a == '4'); checkcap{"pow", '4', a} -assert(#a == a); checkcap{"len", a, a} -assert(~a == a); checkcap{"bnot", a, a} -assert(a << 3 == a); checkcap{"shl", a, 3} -assert(1.5 >> a == 1.5); checkcap{"shr", 1.5, a} - --- for comparison operators, all results are true -assert(5.0 > a); checkcap{"lt", a, 5.0} -assert(a >= 10); checkcap{"le", 10, a} -assert(a <= -10.0); checkcap{"le", a, -10.0} -assert(a < -10); checkcap{"lt", a, -10} - - --- test for rawlen -t = setmetatable({1,2,3}, {__len = function () return 10 end}) -assert(#t == 10 and rawlen(t) == 3) -assert(rawlen"abc" == 3) -assert(not pcall(rawlen, io.stdin)) -assert(not pcall(rawlen, 34)) -assert(not pcall(rawlen)) - --- rawlen for long strings -assert(rawlen(string.rep('a', 1000)) == 1000) - - -t = {} -t.__lt = function (a,b,c) - collectgarbage() - assert(c == nil) - if type(a) == 'table' then a = a.x end - if type(b) == 'table' then b = b.x end - return aOp(1)) and not(Op(1)>Op(2)) and (Op(2)>Op(1))) - assert(not(Op('a')>Op('a')) and not(Op('a')>Op('b')) and (Op('b')>Op('a'))) - assert((Op(1)>=Op(1)) and not(Op(1)>=Op(2)) and (Op(2)>=Op(1))) - assert((1 >= Op(1)) and not(1 >= Op(2)) and (Op(2) >= 1)) - assert((Op('a')>=Op('a')) and not(Op('a')>=Op('b')) and (Op('b')>=Op('a'))) - assert(('a' >= Op('a')) and not(Op('a') >= 'b') and (Op('b') >= Op('a'))) - assert(Op(1) == Op(1) and Op(1) ~= Op(2)) - assert(Op('a') == Op('a') and Op('a') ~= Op('b')) - assert(a == a and a ~= b) - assert(Op(3) == c) -end - -test(Op(1), Op(2), Op(3)) - - --- test `partial order' - -local function rawSet(x) - local y = {} - for _,k in pairs(x) do y[k] = 1 end - return y -end - -local function Set(x) - return setmetatable(rawSet(x), t) -end - -t.__lt = function (a,b) - for k in pairs(a) do - if not b[k] then return false end - b[k] = undef - end - return next(b) ~= nil -end - -t.__le = function (a,b) - for k in pairs(a) do - if not b[k] then return false end - end - return true -end - -assert(Set{1,2,3} < Set{1,2,3,4}) -assert(not(Set{1,2,3,4} < Set{1,2,3,4})) -assert((Set{1,2,3,4} <= Set{1,2,3,4})) -assert((Set{1,2,3,4} >= Set{1,2,3,4})) -assert(not (Set{1,3} <= Set{3,5})) -assert(not(Set{1,3} <= Set{3,5})) -assert(not(Set{1,3} >= Set{3,5})) - - -t.__eq = function (a,b) - for k in pairs(a) do - if not b[k] then return false end - b[k] = undef - end - return next(b) == nil -end - -local s = Set{1,3,5} -assert(s == Set{3,5,1}) -assert(not rawequal(s, Set{3,5,1})) -assert(rawequal(s, s)) -assert(Set{1,3,5,1} == rawSet{3,5,1}) -assert(rawSet{1,3,5,1} == Set{3,5,1}) -assert(Set{1,3,5} ~= Set{3,5,1,6}) - --- '__eq' is not used for table accesses -t[Set{1,3,5}] = 1 -assert(t[Set{1,3,5}] == undef) - - -do -- test invalidating flags - local mt = {__eq = true} - local a = setmetatable({10}, mt) - local b = setmetatable({10}, mt) - mt.__eq = nil - assert(a ~= b) -- no metamethod - mt.__eq = function (x,y) return x[1] == y[1] end - assert(a == b) -- must use metamethod now -end - - -if not T then - (Message or print)('\n >>> testC not active: skipping tests for \z -userdata <<<\n') -else - local u1 = T.newuserdata(0, 1) - local u2 = T.newuserdata(0, 1) - local u3 = T.newuserdata(0, 1) - assert(u1 ~= u2 and u1 ~= u3) - debug.setuservalue(u1, 1); - debug.setuservalue(u2, 2); - debug.setuservalue(u3, 1); - debug.setmetatable(u1, {__eq = function (a, b) - return debug.getuservalue(a) == debug.getuservalue(b) - end}) - debug.setmetatable(u2, {__eq = function (a, b) - return true - end}) - assert(u1 == u3 and u3 == u1 and u1 ~= u2) - assert(u2 == u1 and u2 == u3 and u3 == u2) - assert(u2 ~= {}) -- different types cannot be equal - assert(rawequal(u1, u1) and not rawequal(u1, u3)) - - local mirror = {} - debug.setmetatable(u3, {__index = mirror, __newindex = mirror}) - for i = 1, 10 do u3[i] = i end - for i = 1, 10 do assert(u3[i] == i) end -end - - -t.__concat = function (a,b,c) - assert(c == nil) - if type(a) == 'table' then a = a.val end - if type(b) == 'table' then b = b.val end - if A then return a..b - else - return setmetatable({val=a..b}, t) - end -end - -c = {val="c"}; setmetatable(c, t) -d = {val="d"}; setmetatable(d, t) - -A = true -assert(c..d == 'cd') -assert(0 .."a".."b"..c..d.."e".."f"..(5+3).."g" == "0abcdef8g") - -A = false -assert((c..d..c..d).val == 'cdcd') -x = c..d -assert(getmetatable(x) == t and x.val == 'cd') -x = 0 .."a".."b"..c..d.."e".."f".."g" -assert(x.val == "0abcdefg") - - --- concat metamethod x numbers (bug in 5.1.1) -c = {} -local x -setmetatable(c, {__concat = function (a,b) - assert(type(a) == "number" and b == c or type(b) == "number" and a == c) - return c -end}) -assert(c..5 == c and 5 .. c == c) -assert(4 .. c .. 5 == c and 4 .. 5 .. 6 .. 7 .. c == c) - - --- test comparison compatibilities -local t1, t2, c, d -t1 = {}; c = {}; setmetatable(c, t1) -d = {} -t1.__eq = function () return true end -t1.__lt = function () return true end -t1.__le = function () return false end -setmetatable(d, t1) -assert(c == d and c < d and not(d <= c)) -t2 = {} -t2.__eq = t1.__eq -t2.__lt = t1.__lt -setmetatable(d, t2) -assert(c == d and c < d and not(d <= c)) - - - --- test for several levels of calls -local i -local tt = { - __call = function (t, ...) - i = i+1 - if t.f then return t.f(...) - else return {...} - end - end -} - -local a = setmetatable({}, tt) -local b = setmetatable({f=a}, tt) -local c = setmetatable({f=b}, tt) - -i = 0 -x = c(3,4,5) -assert(i == 3 and x[1] == 3 and x[3] == 5) - - -assert(_G.X == 20) - -_G.X, _G.B = nil - - -print'+' - -local _g = _G -_ENV = setmetatable({}, {__index=function (_,k) return _g[k] end}) - - -a = {} -rawset(a, "x", 1, 2, 3) -assert(a.x == 1 and rawget(a, "x", 3) == 1) - -print '+' - --- testing metatables for basic types -mt = {__index = function (a,b) return a+b end, - __len = function (x) return math.floor(x) end} -debug.setmetatable(10, mt) -assert(getmetatable(-2) == mt) -assert((10)[3] == 13) -assert((10)["3"] == 13) -assert(#3.45 == 3) -debug.setmetatable(23, nil) -assert(getmetatable(-2) == nil) - -debug.setmetatable(true, mt) -assert(getmetatable(false) == mt) -mt.__index = function (a,b) return a or b end -assert((true)[false] == true) -assert((false)[false] == false) -debug.setmetatable(false, nil) -assert(getmetatable(true) == nil) - -debug.setmetatable(nil, mt) -assert(getmetatable(nil) == mt) -mt.__add = function (a,b) return (a or 1) + (b or 2) end -assert(10 + nil == 12) -assert(nil + 23 == 24) -assert(nil + nil == 3) -debug.setmetatable(nil, nil) -assert(getmetatable(nil) == nil) - -debug.setmetatable(nil, {}) - - --- loops in delegation -a = {}; setmetatable(a, a); a.__index = a; a.__newindex = a -assert(not pcall(function (a,b) return a[b] end, a, 10)) -assert(not pcall(function (a,b,c) a[b] = c end, a, 10, true)) - --- bug in 5.1 -T, K, V = nil -grandparent = {} -grandparent.__newindex = function(t,k,v) T=t; K=k; V=v end - -parent = {} -parent.__newindex = parent -setmetatable(parent, grandparent) - -child = setmetatable({}, parent) -child.foo = 10 --> CRASH (on some machines) -assert(T == parent and K == "foo" and V == 10) - -print 'OK' - -return 12 - - diff --git a/lua-5.4.7-tests/files.lua b/lua-5.4.7-tests/files.lua deleted file mode 100644 index 1476006..0000000 --- a/lua-5.4.7-tests/files.lua +++ /dev/null @@ -1,951 +0,0 @@ --- $Id: testes/files.lua $ --- See Copyright Notice in file all.lua - -local debug = require "debug" - -local maxint = math.maxinteger - -assert(type(os.getenv"PATH") == "string") - -assert(io.input(io.stdin) == io.stdin) -assert(not pcall(io.input, "non-existent-file")) -assert(io.output(io.stdout) == io.stdout) - - -local function testerr (msg, f, ...) - local stat, err = pcall(f, ...) - return (not stat and string.find(err, msg, 1, true)) -end - - -local function checkerr (msg, f, ...) - assert(testerr(msg, f, ...)) -end - - --- cannot close standard files -assert(not io.close(io.stdin) and - not io.stdout:close() and - not io.stderr:close()) - --- cannot call close method without an argument (new in 5.3.5) -checkerr("got no value", io.stdin.close) - - -assert(type(io.input()) == "userdata" and io.type(io.output()) == "file") -assert(type(io.stdin) == "userdata" and io.type(io.stderr) == "file") -assert(not io.type(8)) -local a = {}; setmetatable(a, {}) -assert(not io.type(a)) - -assert(getmetatable(io.input()).__name == "FILE*") - -local a,b,c = io.open('xuxu_nao_existe') -assert(not a and type(b) == "string" and type(c) == "number") - -a,b,c = io.open('/a/b/c/d', 'w') -assert(not a and type(b) == "string" and type(c) == "number") - -local file = os.tmpname() -local f, msg = io.open(file, "w") -if not f then - (Message or print)("'os.tmpname' file cannot be open; skipping file tests") - -else --{ most tests here need tmpname -f:close() - -print('testing i/o') - -local otherfile = os.tmpname() - -checkerr("invalid mode", io.open, file, "rw") -checkerr("invalid mode", io.open, file, "rb+") -checkerr("invalid mode", io.open, file, "r+bk") -checkerr("invalid mode", io.open, file, "") -checkerr("invalid mode", io.open, file, "+") -checkerr("invalid mode", io.open, file, "b") -assert(io.open(file, "r+b")):close() -assert(io.open(file, "r+")):close() -assert(io.open(file, "rb")):close() - -assert(os.setlocale('C', 'all')) - -io.input(io.stdin); io.output(io.stdout); - -os.remove(file) -assert(not loadfile(file)) -checkerr("", dofile, file) -assert(not io.open(file)) -io.output(file) -assert(io.output() ~= io.stdout) - -if not _port then -- invalid seek - local status, msg, code = io.stdin:seek("set", 1000) - assert(not status and type(msg) == "string" and type(code) == "number") -end - -assert(io.output():seek() == 0) -assert(io.write("alo alo"):seek() == string.len("alo alo")) -assert(io.output():seek("cur", -3) == string.len("alo alo")-3) -assert(io.write("joao")) -assert(io.output():seek("end") == string.len("alo joao")) - -assert(io.output():seek("set") == 0) - -assert(io.write('"alo"', "{a}\n", "second line\n", "third line \n")) -assert(io.write('Xfourth_line')) -io.output(io.stdout) -collectgarbage() -- file should be closed by GC -assert(io.input() == io.stdin and rawequal(io.output(), io.stdout)) -print('+') - --- test GC for files -collectgarbage() -for i=1,120 do - for i=1,5 do - io.input(file) - assert(io.open(file, 'r')) - io.lines(file) - end - collectgarbage() -end - -io.input():close() -io.close() - -assert(os.rename(file, otherfile)) -assert(not os.rename(file, otherfile)) - -io.output(io.open(otherfile, "ab")) -assert(io.write("\n\n\t\t ", 3450, "\n")); -io.close() - - -do - -- closing file by scope - local F = nil - do - local f = assert(io.open(file, "w")) - F = f - end - assert(tostring(F) == "file (closed)") -end -assert(os.remove(file)) - - -do - -- test writing/reading numbers - local f = assert(io.open(file, "w")) - f:write(maxint, '\n') - f:write(string.format("0X%x\n", maxint)) - f:write("0xABCp-3", '\n') - f:write(0, '\n') - f:write(-maxint, '\n') - f:write(string.format("0x%X\n", -maxint)) - f:write("-0xABCp-3", '\n') - assert(f:close()) - local f = assert(io.open(file, "r")) - assert(f:read("n") == maxint) - assert(f:read("n") == maxint) - assert(f:read("n") == 0xABCp-3) - assert(f:read("n") == 0) - assert(f:read("*n") == -maxint) -- test old format (with '*') - assert(f:read("n") == -maxint) - assert(f:read("*n") == -0xABCp-3) -- test old format (with '*') -end -assert(os.remove(file)) - - --- testing multiple arguments to io.read -do - local f = assert(io.open(file, "w")) - f:write[[ -a line -another line -1234 -3.45 -one -two -three -]] - local l1, l2, l3, l4, n1, n2, c, dummy - assert(f:close()) - local f = assert(io.open(file, "r")) - l1, l2, n1, n2, dummy = f:read("l", "L", "n", "n") - assert(l1 == "a line" and l2 == "another line\n" and - n1 == 1234 and n2 == 3.45 and dummy == nil) - assert(f:close()) - local f = assert(io.open(file, "r")) - l1, l2, n1, n2, c, l3, l4, dummy = f:read(7, "l", "n", "n", 1, "l", "l") - assert(l1 == "a line\n" and l2 == "another line" and c == '\n' and - n1 == 1234 and n2 == 3.45 and l3 == "one" and l4 == "two" - and dummy == nil) - assert(f:close()) - local f = assert(io.open(file, "r")) - -- second item failing - l1, n1, n2, dummy = f:read("l", "n", "n", "l") - assert(l1 == "a line" and not n1) -end -assert(os.remove(file)) - - - --- test yielding during 'dofile' -f = assert(io.open(file, "w")) -f:write[[ -local x, z = coroutine.yield(10) -local y = coroutine.yield(20) -return x + y * z -]] -assert(f:close()) -f = coroutine.wrap(dofile) -assert(f(file) == 10) -assert(f(100, 101) == 20) -assert(f(200) == 100 + 200 * 101) -assert(os.remove(file)) - - -f = assert(io.open(file, "w")) --- test number termination -f:write[[ --12.3- -0xffff+ .3|5.E-3X +234e+13E 0xDEADBEEFDEADBEEFx -0x1.13Ap+3e -]] --- very long number -f:write("1234"); for i = 1, 1000 do f:write("0") end; f:write("\n") --- invalid sequences (must read and discard valid prefixes) -f:write[[ -.e+ 0.e; --; 0xX; -]] -assert(f:close()) -f = assert(io.open(file, "r")) -assert(f:read("n") == -12.3); assert(f:read(1) == "-") -assert(f:read("n") == -0xffff); assert(f:read(2) == "+ ") -assert(f:read("n") == 0.3); assert(f:read(1) == "|") -assert(f:read("n") == 5e-3); assert(f:read(1) == "X") -assert(f:read("n") == 234e13); assert(f:read(1) == "E") -assert(f:read("n") == 0Xdeadbeefdeadbeef); assert(f:read(2) == "x\n") -assert(f:read("n") == 0x1.13aP3); assert(f:read(1) == "e") - -do -- attempt to read too long number - assert(not f:read("n")) -- fails - local s = f:read("L") -- read rest of line - assert(string.find(s, "^00*\n$")) -- lots of 0's left -end - -assert(not f:read("n")); assert(f:read(2) == "e+") -assert(not f:read("n")); assert(f:read(1) == ";") -assert(not f:read("n")); assert(f:read(2) == "-;") -assert(not f:read("n")); assert(f:read(1) == "X") -assert(not f:read("n")); assert(f:read(1) == ";") -assert(not f:read("n")); assert(not f:read(0)) -- end of file -assert(f:close()) -assert(os.remove(file)) - - --- test line generators -assert(not pcall(io.lines, "non-existent-file")) -assert(os.rename(otherfile, file)) -io.output(otherfile) -local n = 0 -local f = io.lines(file) -while f() do n = n + 1 end; -assert(n == 6) -- number of lines in the file -checkerr("file is already closed", f) -checkerr("file is already closed", f) --- copy from file to otherfile -n = 0 -for l in io.lines(file) do io.write(l, "\n"); n = n + 1 end -io.close() -assert(n == 6) --- copy from otherfile back to file -local f = assert(io.open(otherfile)) -assert(io.type(f) == "file") -io.output(file) -assert(not io.output():read()) -n = 0 -for l in f:lines() do io.write(l, "\n"); n = n + 1 end -assert(tostring(f):sub(1, 5) == "file ") -assert(f:close()); io.close() -assert(n == 6) -checkerr("closed file", io.close, f) -assert(tostring(f) == "file (closed)") -assert(io.type(f) == "closed file") -io.input(file) -f = io.open(otherfile):lines() -n = 0 -for l in io.lines() do assert(l == f()); n = n + 1 end -f = nil; collectgarbage() -assert(n == 6) -assert(os.remove(otherfile)) - -do -- bug in 5.3.1 - io.output(otherfile) - io.write(string.rep("a", 300), "\n") - io.close() - local t ={}; for i = 1, 250 do t[i] = 1 end - t = {io.lines(otherfile, table.unpack(t))()} - -- everything ok here - assert(#t == 250 and t[1] == 'a' and t[#t] == 'a') - t[#t + 1] = 1 -- one too many - checkerr("too many arguments", io.lines, otherfile, table.unpack(t)) - collectgarbage() -- ensure 'otherfile' is closed - assert(os.remove(otherfile)) -end - -io.input(file) -do -- test error returns - local a,b,c = io.input():write("xuxu") - assert(not a and type(b) == "string" and type(c) == "number") -end -checkerr("invalid format", io.read, "x") -assert(io.read(0) == "") -- not eof -assert(io.read(5, 'l') == '"alo"') -assert(io.read(0) == "") -assert(io.read() == "second line") -local x = io.input():seek() -assert(io.read() == "third line ") -assert(io.input():seek("set", x)) -assert(io.read('L') == "third line \n") -assert(io.read(1) == "X") -assert(io.read(string.len"fourth_line") == "fourth_line") -assert(io.input():seek("cur", -string.len"fourth_line")) -assert(io.read() == "fourth_line") -assert(io.read() == "") -- empty line -assert(io.read('n') == 3450) -assert(io.read(1) == '\n') -assert(not io.read(0)) -- end of file -assert(not io.read(1)) -- end of file -assert(not io.read(30000)) -- end of file -assert(({io.read(1)})[2] == undef) -assert(not io.read()) -- end of file -assert(({io.read()})[2] == undef) -assert(not io.read('n')) -- end of file -assert(({io.read('n')})[2] == undef) -assert(io.read('a') == '') -- end of file (OK for 'a') -assert(io.read('a') == '') -- end of file (OK for 'a') -collectgarbage() -print('+') -io.close(io.input()) -checkerr(" input file is closed", io.read) - -assert(os.remove(file)) - -local t = '0123456789' -for i=1,10 do t = t..t; end -assert(string.len(t) == 10*2^10) - -io.output(file) -io.write("alo"):write("\n") -io.close() -checkerr(" output file is closed", io.write) -local f = io.open(file, "a+b") -io.output(f) -collectgarbage() - -assert(io.write(' ' .. t .. ' ')) -assert(io.write(';', 'end of file\n')) -f:flush(); io.flush() -f:close() -print('+') - -io.input(file) -assert(io.read() == "alo") -assert(io.read(1) == ' ') -assert(io.read(string.len(t)) == t) -assert(io.read(1) == ' ') -assert(io.read(0)) -assert(io.read('a') == ';end of file\n') -assert(not io.read(0)) -assert(io.close(io.input())) - - --- test errors in read/write -do - local function ismsg (m) - -- error message is not a code number - return (type(m) == "string" and not tonumber(m)) - end - - -- read - local f = io.open(file, "w") - local r, m, c = f:read() - assert(not r and ismsg(m) and type(c) == "number") - assert(f:close()) - -- write - f = io.open(file, "r") - r, m, c = f:write("whatever") - assert(not r and ismsg(m) and type(c) == "number") - assert(f:close()) - -- lines - f = io.open(file, "w") - r, m = pcall(f:lines()) - assert(r == false and ismsg(m)) - assert(f:close()) -end - -assert(os.remove(file)) - --- test for L format -io.output(file); io.write"\n\nline\nother":close() -io.input(file) -assert(io.read"L" == "\n") -assert(io.read"L" == "\n") -assert(io.read"L" == "line\n") -assert(io.read"L" == "other") -assert(not io.read"L") -io.input():close() - -local f = assert(io.open(file)) -local s = "" -for l in f:lines("L") do s = s .. l end -assert(s == "\n\nline\nother") -f:close() - -io.input(file) -s = "" -for l in io.lines(nil, "L") do s = s .. l end -assert(s == "\n\nline\nother") -io.input():close() - -s = "" -for l in io.lines(file, "L") do s = s .. l end -assert(s == "\n\nline\nother") - -s = "" -for l in io.lines(file, "l") do s = s .. l end -assert(s == "lineother") - -io.output(file); io.write"a = 10 + 34\na = 2*a\na = -a\n":close() -local t = {} -assert(load(io.lines(file, "L"), nil, nil, t))() -assert(t.a == -((10 + 34) * 2)) - - -do -- testing closing file in line iteration - - -- get the to-be-closed variable from a loop - local function gettoclose (lv) - lv = lv + 1 - local stvar = 0 -- to-be-closed is 4th state variable in the loop - for i = 1, 1000 do - local n, v = debug.getlocal(lv, i) - if n == "(for state)" then - stvar = stvar + 1 - if stvar == 4 then return v end - end - end - end - - local f - for l in io.lines(file) do - f = gettoclose(1) - assert(io.type(f) == "file") - break - end - assert(io.type(f) == "closed file") - - f = nil - local function foo (name) - for l in io.lines(name) do - f = gettoclose(1) - assert(io.type(f) == "file") - error(f) -- exit loop with an error - end - end - local st, msg = pcall(foo, file) - assert(st == false and io.type(msg) == "closed file") - -end - - --- test for multipe arguments in 'lines' -io.output(file); io.write"0123456789\n":close() -for a,b in io.lines(file, 1, 1) do - if a == "\n" then assert(not b) - else assert(tonumber(a) == tonumber(b) - 1) - end -end - -for a,b,c in io.lines(file, 1, 2, "a") do - assert(a == "0" and b == "12" and c == "3456789\n") -end - -for a,b,c in io.lines(file, "a", 0, 1) do - if a == "" then break end - assert(a == "0123456789\n" and not b and not c) -end -collectgarbage() -- to close file in previous iteration - -io.output(file); io.write"00\n10\n20\n30\n40\n":close() -for a, b in io.lines(file, "n", "n") do - if a == 40 then assert(not b) - else assert(a == b - 10) - end -end - - --- test load x lines -io.output(file); -io.write[[ -local y -= X -X = -X * -2 + -X; -X = -X -- y; -]]:close() -_G.X = 1 -assert(not load((io.lines(file)))) -collectgarbage() -- to close file in previous iteration -load((io.lines(file, "L")))() -assert(_G.X == 2) -load((io.lines(file, 1)))() -assert(_G.X == 4) -load((io.lines(file, 3)))() -assert(_G.X == 8) -_G.X = nil - -print('+') - -local x1 = "string\n\n\\com \"\"''coisas [[estranhas]] ]]'" -io.output(file) -assert(io.write(string.format("X2 = %q\n-- comment without ending EOS", x1))) -io.close() -assert(loadfile(file))() -assert(x1 == _G.X2) -_G.X2 = nil -print('+') -assert(os.remove(file)) -assert(not os.remove(file)) -assert(not os.remove(otherfile)) - --- testing loadfile -local function testloadfile (s, expres) - io.output(file) - if s then io.write(s) end - io.close() - local res = assert(loadfile(file))() - assert(os.remove(file)) - assert(res == expres) -end - --- loading empty file -testloadfile(nil, nil) - --- loading file with initial comment without end of line -testloadfile("# a non-ending comment", nil) - - --- checking Unicode BOM in files -testloadfile("\xEF\xBB\xBF# some comment\nreturn 234", 234) -testloadfile("\xEF\xBB\xBFreturn 239", 239) -testloadfile("\xEF\xBB\xBF", nil) -- empty file with a BOM - - --- checking line numbers in files with initial comments -testloadfile("# a comment\nreturn require'debug'.getinfo(1).currentline", 2) - - --- loading binary file -io.output(io.open(file, "wb")) -assert(io.write(string.dump(function () return 10, '\0alo\255', 'hi' end))) -io.close() -a, b, c = assert(loadfile(file))() -assert(a == 10 and b == "\0alo\255" and c == "hi") -assert(os.remove(file)) - --- bug in 5.2.1 -do - io.output(io.open(file, "wb")) - -- save function with no upvalues - assert(io.write(string.dump(function () return 1 end))) - io.close() - f = assert(loadfile(file, "b", {})) - assert(type(f) == "function" and f() == 1) - assert(os.remove(file)) -end - --- loading binary file with initial comment -io.output(io.open(file, "wb")) -assert(io.write("#this is a comment for a binary file\0\n", - string.dump(function () return 20, '\0\0\0' end))) -io.close() -a, b, c = assert(loadfile(file))() -assert(a == 20 and b == "\0\0\0" and c == nil) -assert(os.remove(file)) - - --- 'loadfile' with 'env' -do - local f = io.open(file, 'w') - f:write[[ - if (...) then a = 15; return b, c, d - else return _ENV - end - ]] - f:close() - local t = {b = 12, c = "xuxu", d = print} - local f = assert(loadfile(file, 't', t)) - local b, c, d = f(1) - assert(t.a == 15 and b == 12 and c == t.c and d == print) - assert(f() == t) - f = assert(loadfile(file, 't', nil)) - assert(f() == nil) - f = assert(loadfile(file)) - assert(f() == _G) - assert(os.remove(file)) -end - - --- 'loadfile' x modes -do - io.open(file, 'w'):write("return 10"):close() - local s, m = loadfile(file, 'b') - assert(not s and string.find(m, "a text chunk")) - io.open(file, 'w'):write("\27 return 10"):close() - local s, m = loadfile(file, 't') - assert(not s and string.find(m, "a binary chunk")) - assert(os.remove(file)) -end - - -io.output(file) -assert(io.write("qualquer coisa\n")) -assert(io.write("mais qualquer coisa")) -io.close() -assert(io.output(assert(io.open(otherfile, 'wb'))) - :write("outra coisa\0\1\3\0\0\0\0\255\0") - :close()) - -local filehandle = assert(io.open(file, 'r+')) -local otherfilehandle = assert(io.open(otherfile, 'rb')) -assert(filehandle ~= otherfilehandle) -assert(type(filehandle) == "userdata") -assert(filehandle:read('l') == "qualquer coisa") -io.input(otherfilehandle) -assert(io.read(string.len"outra coisa") == "outra coisa") -assert(filehandle:read('l') == "mais qualquer coisa") -filehandle:close(); -assert(type(filehandle) == "userdata") -io.input(otherfilehandle) -assert(io.read(4) == "\0\1\3\0") -assert(io.read(3) == "\0\0\0") -assert(io.read(0) == "") -- 255 is not eof -assert(io.read(1) == "\255") -assert(io.read('a') == "\0") -assert(not io.read(0)) -assert(otherfilehandle == io.input()) -otherfilehandle:close() -assert(os.remove(file)) -assert(os.remove(otherfile)) -collectgarbage() - -io.output(file) - :write[[ - 123.4 -56e-2 not a number -second line -third line - -and the rest of the file -]] - :close() -io.input(file) -local _,a,b,c,d,e,h,__ = io.read(1, 'n', 'n', 'l', 'l', 'l', 'a', 10) -assert(io.close(io.input())) -assert(_ == ' ' and not __) -assert(type(a) == 'number' and a==123.4 and b==-56e-2) -assert(d=='second line' and e=='third line') -assert(h==[[ - -and the rest of the file -]]) -assert(os.remove(file)) -collectgarbage() - --- testing buffers -do - local f = assert(io.open(file, "w")) - local fr = assert(io.open(file, "r")) - assert(f:setvbuf("full", 2000)) - f:write("x") - assert(fr:read("all") == "") -- full buffer; output not written yet - f:close() - fr:seek("set") - assert(fr:read("all") == "x") -- `close' flushes it - f = assert(io.open(file), "w") - assert(f:setvbuf("no")) - f:write("x") - fr:seek("set") - assert(fr:read("all") == "x") -- no buffer; output is ready - f:close() - f = assert(io.open(file, "a")) - assert(f:setvbuf("line")) - f:write("x") - fr:seek("set", 1) - assert(fr:read("all") == "") -- line buffer; no output without `\n' - f:write("a\n"):seek("set", 1) - assert(fr:read("all") == "xa\n") -- now we have a whole line - f:close(); fr:close() - assert(os.remove(file)) -end - - -if not _soft then - print("testing large files (> BUFSIZ)") - io.output(file) - for i=1,5001 do io.write('0123456789123') end - io.write('\n12346'):close() - io.input(file) - local x = io.read('a') - io.input():seek('set', 0) - local y = io.read(30001)..io.read(1005)..io.read(0).. - io.read(1)..io.read(100003) - assert(x == y and string.len(x) == 5001*13 + 6) - io.input():seek('set', 0) - y = io.read() -- huge line - assert(x == y..'\n'..io.read()) - assert(not io.read()) - io.close(io.input()) - assert(os.remove(file)) - x = nil; y = nil -end - -if not _port then - local progname - do -- get name of running executable - local arg = arg or ARG - local i = 0 - while arg[i] do i = i - 1 end - progname = '"' .. arg[i + 1] .. '"' - end - print("testing popen/pclose and execute") - -- invalid mode for popen - checkerr("invalid mode", io.popen, "cat", "") - checkerr("invalid mode", io.popen, "cat", "r+") - checkerr("invalid mode", io.popen, "cat", "rw") - do -- basic tests for popen - local file = os.tmpname() - local f = assert(io.popen("cat - > " .. file, "w")) - f:write("a line") - assert(f:close()) - local f = assert(io.popen("cat - < " .. file, "r")) - assert(f:read("a") == "a line") - assert(f:close()) - assert(os.remove(file)) - end - - local tests = { - -- command, what, code - {"ls > /dev/null", "ok"}, - {"not-to-be-found-command", "exit"}, - {"exit 3", "exit", 3}, - {"exit 129", "exit", 129}, - {"kill -s HUP $$", "signal", 1}, - {"kill -s KILL $$", "signal", 9}, - {"sh -c 'kill -s HUP $$'", "exit"}, - {progname .. ' -e " "', "ok"}, - {progname .. ' -e "os.exit(0, true)"', "ok"}, - {progname .. ' -e "os.exit(20, true)"', "exit", 20}, - } - print("\n(some error messages are expected now)") - for _, v in ipairs(tests) do - local x, y, z = io.popen(v[1]):close() - local x1, y1, z1 = os.execute(v[1]) - assert(x == x1 and y == y1 and z == z1) - if v[2] == "ok" then - assert(x and y == 'exit' and z == 0) - else - assert(not x and y == v[2]) -- correct status and 'what' - -- correct code if known (but always different from 0) - assert((v[3] == nil and z > 0) or v[3] == z) - end - end -end - - --- testing tmpfile -f = io.tmpfile() -assert(io.type(f) == "file") -f:write("alo") -f:seek("set") -assert(f:read"a" == "alo") - -end --} - -print'+' - -print("testing date/time") - -assert(os.date("") == "") -assert(os.date("!") == "") -assert(os.date("\0\0") == "\0\0") -assert(os.date("!\0\0") == "\0\0") -local x = string.rep("a", 10000) -assert(os.date(x) == x) -local t = os.time() -D = os.date("*t", t) -assert(os.date(string.rep("%d", 1000), t) == - string.rep(os.date("%d", t), 1000)) -assert(os.date(string.rep("%", 200)) == string.rep("%", 100)) - -local function checkDateTable (t) - _G.D = os.date("*t", t) - assert(os.time(D) == t) - load(os.date([[assert(D.year==%Y and D.month==%m and D.day==%d and - D.hour==%H and D.min==%M and D.sec==%S and - D.wday==%w+1 and D.yday==%j)]], t))() - _G.D = nil -end - -checkDateTable(os.time()) -if not _port then - -- assume that time_t can represent these values - checkDateTable(0) - checkDateTable(1) - checkDateTable(1000) - checkDateTable(0x7fffffff) - checkDateTable(0x80000000) -end - -checkerr("invalid conversion specifier", os.date, "%") -checkerr("invalid conversion specifier", os.date, "%9") -checkerr("invalid conversion specifier", os.date, "%") -checkerr("invalid conversion specifier", os.date, "%O") -checkerr("invalid conversion specifier", os.date, "%E") -checkerr("invalid conversion specifier", os.date, "%Ea") - -checkerr("not an integer", os.time, {year=1000, month=1, day=1, hour='x'}) -checkerr("not an integer", os.time, {year=1000, month=1, day=1, hour=1.5}) - -checkerr("missing", os.time, {hour = 12}) -- missing date - - -if string.packsize("i") == 4 then -- 4-byte ints - checkerr("field 'year' is out-of-bound", os.time, - {year = -(1 << 31) + 1899, month = 1, day = 1}) - - checkerr("field 'year' is out-of-bound", os.time, - {year = -(1 << 31), month = 1, day = 1}) - - if math.maxinteger > 2^31 then -- larger lua_integer? - checkerr("field 'year' is out-of-bound", os.time, - {year = (1 << 31) + 1900, month = 1, day = 1}) - end -end - - -if not _port then - -- test Posix-specific modifiers - assert(type(os.date("%Ex")) == 'string') - assert(type(os.date("%Oy")) == 'string') - - -- test large dates (assume at least 4-byte ints and time_t) - local t0 = os.time{year = 1970, month = 1, day = 0} - local t1 = os.time{year = 1970, month = 1, day = 0, sec = (1 << 31) - 1} - assert(t1 - t0 == (1 << 31) - 1) - t0 = os.time{year = 1970, month = 1, day = 1} - t1 = os.time{year = 1970, month = 1, day = 1, sec = -(1 << 31)} - assert(t1 - t0 == -(1 << 31)) - - -- test out-of-range dates (at least for Unix) - if maxint >= 2^62 then -- cannot do these tests in Small Lua - -- no arith overflows - checkerr("out-of-bound", os.time, {year = -maxint, month = 1, day = 1}) - if string.packsize("i") == 4 then -- 4-byte ints - if testerr("out-of-bound", os.date, "%Y", 2^40) then - -- time_t has 4 bytes and therefore cannot represent year 4000 - print(" 4-byte time_t") - checkerr("cannot be represented", os.time, {year=4000, month=1, day=1}) - else - -- time_t has 8 bytes; an int year cannot represent a huge time - print(" 8-byte time_t") - checkerr("cannot be represented", os.date, "%Y", 2^60) - - -- this is the maximum year - assert(tonumber(os.time - {year=(1 << 31) + 1899, month=12, day=31, hour=23, min=59, sec=59})) - - -- this is too much - checkerr("represented", os.time, - {year=(1 << 31) + 1899, month=12, day=31, hour=23, min=59, sec=60}) - end - - -- internal 'int' fields cannot hold these values - checkerr("field 'day' is out-of-bound", os.time, - {year = 0, month = 1, day = 2^32}) - - checkerr("field 'month' is out-of-bound", os.time, - {year = 0, month = -((1 << 31) + 1), day = 1}) - - checkerr("field 'year' is out-of-bound", os.time, - {year = (1 << 31) + 1900, month = 1, day = 1}) - - else -- 8-byte ints - -- assume time_t has 8 bytes too - print(" 8-byte time_t") - assert(tonumber(os.date("%Y", 2^60))) - - -- but still cannot represent a huge year - checkerr("cannot be represented", os.time, {year=2^60, month=1, day=1}) - end - end -end - -do - local D = os.date("*t") - local t = os.time(D) - if D.isdst == nil then - print("no daylight saving information") - else - assert(type(D.isdst) == 'boolean') - end - D.isdst = nil - local t1 = os.time(D) - assert(t == t1) -- if isdst is absent uses correct default -end - -local D = os.date("*t") -t = os.time(D) -D.year = D.year-1; -local t1 = os.time(D) --- allow for leap years -assert(math.abs(os.difftime(t,t1)/(24*3600) - 365) < 2) - --- should not take more than 1 second to execute these two lines -t = os.time() -t1 = os.time(os.date("*t")) -local diff = os.difftime(t1,t) -assert(0 <= diff and diff <= 1) -diff = os.difftime(t,t1) -assert(-1 <= diff and diff <= 0) - -local t1 = os.time{year=2000, month=10, day=1, hour=23, min=12} -local t2 = os.time{year=2000, month=10, day=1, hour=23, min=10, sec=19} -assert(os.difftime(t1,t2) == 60*2-19) - --- since 5.3.3, 'os.time' normalizes table fields -t1 = {year = 2005, month = 1, day = 1, hour = 1, min = 0, sec = -3602} -os.time(t1) -assert(t1.day == 31 and t1.month == 12 and t1.year == 2004 and - t1.hour == 23 and t1.min == 59 and t1.sec == 58 and - t1.yday == 366) - -io.output(io.stdout) -local t = os.date('%d %m %Y %H %M %S') -local d, m, a, h, min, s = string.match(t, - "(%d+) (%d+) (%d+) (%d+) (%d+) (%d+)") -d = tonumber(d) -m = tonumber(m) -a = tonumber(a) -h = tonumber(h) -min = tonumber(min) -s = tonumber(s) -io.write(string.format('test done on %2.2d/%2.2d/%d', d, m, a)) -io.write(string.format(', at %2.2d:%2.2d:%2.2d\n', h, min, s)) -io.write(string.format('%s\n', _VERSION)) - - diff --git a/lua-5.4.7-tests/gc.lua b/lua-5.4.7-tests/gc.lua deleted file mode 100644 index 03093e3..0000000 --- a/lua-5.4.7-tests/gc.lua +++ /dev/null @@ -1,695 +0,0 @@ --- $Id: testes/gc.lua $ --- See Copyright Notice in file all.lua - -print('testing incremental garbage collection') - -local debug = require"debug" - -assert(collectgarbage("isrunning")) - -collectgarbage() - -local oldmode = collectgarbage("incremental") - --- changing modes should return previous mode -assert(collectgarbage("generational") == "incremental") -assert(collectgarbage("generational") == "generational") -assert(collectgarbage("incremental") == "generational") -assert(collectgarbage("incremental") == "incremental") - - -local function nop () end - -local function gcinfo () - return collectgarbage"count" * 1024 -end - - --- test weird parameters to 'collectgarbage' -do - -- save original parameters - local a = collectgarbage("setpause", 200) - local b = collectgarbage("setstepmul", 200) - local t = {0, 2, 10, 90, 500, 5000, 30000, 0x7ffffffe} - for i = 1, #t do - local p = t[i] - for j = 1, #t do - local m = t[j] - collectgarbage("setpause", p) - collectgarbage("setstepmul", m) - collectgarbage("step", 0) - collectgarbage("step", 10000) - end - end - -- restore original parameters - collectgarbage("setpause", a) - collectgarbage("setstepmul", b) - collectgarbage() -end - - -_G["while"] = 234 - - --- --- tests for GC activation when creating different kinds of objects --- -local function GC1 () - local u - local b -- (above 'u' it in the stack) - local finish = false - u = setmetatable({}, {__gc = function () finish = true end}) - b = {34} - repeat u = {} until finish - assert(b[1] == 34) -- 'u' was collected, but 'b' was not - - finish = false; local i = 1 - u = setmetatable({}, {__gc = function () finish = true end}) - repeat i = i + 1; u = tostring(i) .. tostring(i) until finish - assert(b[1] == 34) -- 'u' was collected, but 'b' was not - - finish = false - u = setmetatable({}, {__gc = function () finish = true end}) - repeat local i; u = function () return i end until finish - assert(b[1] == 34) -- 'u' was collected, but 'b' was not -end - -local function GC2 () - local u - local finish = false - u = {setmetatable({}, {__gc = function () finish = true end})} - local b = {34} - repeat u = {{}} until finish - assert(b[1] == 34) -- 'u' was collected, but 'b' was not - - finish = false; local i = 1 - u = {setmetatable({}, {__gc = function () finish = true end})} - repeat i = i + 1; u = {tostring(i) .. tostring(i)} until finish - assert(b[1] == 34) -- 'u' was collected, but 'b' was not - - finish = false - u = {setmetatable({}, {__gc = function () finish = true end})} - repeat local i; u = {function () return i end} until finish - assert(b[1] == 34) -- 'u' was collected, but 'b' was not -end - -local function GC() GC1(); GC2() end - - -do - print("creating many objects") - - local limit = 5000 - - for i = 1, limit do - local a = {}; a = nil - end - - local a = "a" - - for i = 1, limit do - a = i .. "b"; - a = string.gsub(a, '(%d%d*)', "%1 %1") - a = "a" - end - - - - a = {} - - function a:test () - for i = 1, limit do - load(string.format("function temp(a) return 'a%d' end", i), "")() - assert(temp() == string.format('a%d', i)) - end - end - - a:test() - _G.temp = nil -end - - --- collection of functions without locals, globals, etc. -do local f = function () end end - - -print("functions with errors") -local prog = [[ -do - a = 10; - function foo(x,y) - a = sin(a+0.456-0.23e-12); - return function (z) return sin(%x+z) end - end - local x = function (w) a=a+w; end -end -]] -do - local step = 1 - if _soft then step = 13 end - for i=1, string.len(prog), step do - for j=i, string.len(prog), step do - pcall(load(string.sub(prog, i, j), "")) - end - end -end -rawset(_G, "a", nil) -_G.x = nil - -do - foo = nil - print('long strings') - local x = "01234567890123456789012345678901234567890123456789012345678901234567890123456789" - assert(string.len(x)==80) - local s = '' - local k = math.min(300, (math.maxinteger // 80) // 2) - for n = 1, k do s = s..x; local j=tostring(n) end - assert(string.len(s) == k*80) - s = string.sub(s, 1, 10000) - local s, i = string.gsub(s, '(%d%d%d%d)', '') - assert(i==10000 // 4) - - assert(_G["while"] == 234) - _G["while"] = nil -end - - --- --- test the "size" of basic GC steps (whatever they mean...) --- -do -print("steps") - - print("steps (2)") - - local function dosteps (siz) - collectgarbage() - local a = {} - for i=1,100 do a[i] = {{}}; local b = {} end - local x = gcinfo() - local i = 0 - repeat -- do steps until it completes a collection cycle - i = i+1 - until collectgarbage("step", siz) - assert(gcinfo() < x) - return i -- number of steps - end - - collectgarbage"stop" - - if not _port then - assert(dosteps(10) < dosteps(2)) - end - - -- collector should do a full collection with so many steps - assert(dosteps(20000) == 1) - assert(collectgarbage("step", 20000) == true) - assert(collectgarbage("step", 20000) == true) - - assert(not collectgarbage("isrunning")) - collectgarbage"restart" - assert(collectgarbage("isrunning")) - -end - - -if not _port then - -- test the pace of the collector - collectgarbage(); collectgarbage() - local x = gcinfo() - collectgarbage"stop" - repeat - local a = {} - until gcinfo() > 3 * x - collectgarbage"restart" - assert(collectgarbage("isrunning")) - repeat - local a = {} - until gcinfo() <= x * 2 -end - - -print("clearing tables") -local lim = 15 -local a = {} --- fill a with `collectable' indices -for i=1,lim do a[{}] = i end -b = {} -for k,v in pairs(a) do b[k]=v end --- remove all indices and collect them -for n in pairs(b) do - a[n] = undef - assert(type(n) == 'table' and next(n) == nil) - collectgarbage() -end -b = nil -collectgarbage() -for n in pairs(a) do error'cannot be here' end -for i=1,lim do a[i] = i end -for i=1,lim do assert(a[i] == i) end - - -print('weak tables') -a = {}; setmetatable(a, {__mode = 'k'}); --- fill a with some `collectable' indices -for i=1,lim do a[{}] = i end --- and some non-collectable ones -for i=1,lim do a[i] = i end -for i=1,lim do local s=string.rep('@', i); a[s] = s..'#' end -collectgarbage() -local i = 0 -for k,v in pairs(a) do assert(k==v or k..'#'==v); i=i+1 end -assert(i == 2*lim) - -a = {}; setmetatable(a, {__mode = 'v'}); -a[1] = string.rep('b', 21) -collectgarbage() -assert(a[1]) -- strings are *values* -a[1] = undef --- fill a with some `collectable' values (in both parts of the table) -for i=1,lim do a[i] = {} end -for i=1,lim do a[i..'x'] = {} end --- and some non-collectable ones -for i=1,lim do local t={}; a[t]=t end -for i=1,lim do a[i+lim]=i..'x' end -collectgarbage() -local i = 0 -for k,v in pairs(a) do assert(k==v or k-lim..'x' == v); i=i+1 end -assert(i == 2*lim) - -a = {}; setmetatable(a, {__mode = 'kv'}); -local x, y, z = {}, {}, {} --- keep only some items -a[1], a[2], a[3] = x, y, z -a[string.rep('$', 11)] = string.rep('$', 11) --- fill a with some `collectable' values -for i=4,lim do a[i] = {} end -for i=1,lim do a[{}] = i end -for i=1,lim do local t={}; a[t]=t end -collectgarbage() -assert(next(a) ~= nil) -local i = 0 -for k,v in pairs(a) do - assert((k == 1 and v == x) or - (k == 2 and v == y) or - (k == 3 and v == z) or k==v); - i = i+1 -end -assert(i == 4) -x,y,z=nil -collectgarbage() -assert(next(a) == string.rep('$', 11)) - - --- 'bug' in 5.1 -a = {} -local t = {x = 10} -local C = setmetatable({key = t}, {__mode = 'v'}) -local C1 = setmetatable({[t] = 1}, {__mode = 'k'}) -a.x = t -- this should not prevent 't' from being removed from - -- weak table 'C' by the time 'a' is finalized - -setmetatable(a, {__gc = function (u) - assert(C.key == nil) - assert(type(next(C1)) == 'table') - end}) - -a, t = nil -collectgarbage() -collectgarbage() -assert(next(C) == nil and next(C1) == nil) -C, C1 = nil - - --- ephemerons -local mt = {__mode = 'k'} -a = {{10},{20},{30},{40}}; setmetatable(a, mt) -x = nil -for i = 1, 100 do local n = {}; a[n] = {k = {x}}; x = n end -GC() -local n = x -local i = 0 -while n do n = a[n].k[1]; i = i + 1 end -assert(i == 100) -x = nil -GC() -for i = 1, 4 do assert(a[i][1] == i * 10); a[i] = undef end -assert(next(a) == nil) - -local K = {} -a[K] = {} -for i=1,10 do a[K][i] = {}; a[a[K][i]] = setmetatable({}, mt) end -x = nil -local k = 1 -for j = 1,100 do - local n = {}; local nk = k%10 + 1 - a[a[K][nk]][n] = {x, k = k}; x = n; k = nk -end -GC() -local n = x -local i = 0 -while n do local t = a[a[K][k]][n]; n = t[1]; k = t.k; i = i + 1 end -assert(i == 100) -K = nil -GC() --- assert(next(a) == nil) - - --- testing errors during GC -if T then - collectgarbage("stop") -- stop collection - local u = {} - local s = {}; setmetatable(s, {__mode = 'k'}) - setmetatable(u, {__gc = function (o) - local i = s[o] - s[i] = true - assert(not s[i - 1]) -- check proper finalization order - if i == 8 then error("@expected@") end -- error during GC - end}) - - for i = 6, 10 do - local n = setmetatable({}, getmetatable(u)) - s[n] = i - end - - warn("@on"); warn("@store") - collectgarbage() - assert(string.find(_WARN, "error in __gc")) - assert(string.match(_WARN, "@(.-)@") == "expected"); _WARN = false - for i = 8, 10 do assert(s[i]) end - - for i = 1, 5 do - local n = setmetatable({}, getmetatable(u)) - s[n] = i - end - - collectgarbage() - for i = 1, 10 do assert(s[i]) end - - getmetatable(u).__gc = nil - warn("@normal") - -end -print '+' - - --- testing userdata -if T==nil then - (Message or print)('\n >>> testC not active: skipping userdata GC tests <<<\n') - -else - - local function newproxy(u) - return debug.setmetatable(T.newuserdata(0), debug.getmetatable(u)) - end - - collectgarbage("stop") -- stop collection - local u = newproxy(nil) - debug.setmetatable(u, {__gc = true}) - local s = 0 - local a = {[u] = 0}; setmetatable(a, {__mode = 'vk'}) - for i=1,10 do a[newproxy(u)] = i end - for k in pairs(a) do assert(getmetatable(k) == getmetatable(u)) end - local a1 = {}; for k,v in pairs(a) do a1[k] = v end - for k,v in pairs(a1) do a[v] = k end - for i =1,10 do assert(a[i]) end - getmetatable(u).a = a1 - getmetatable(u).u = u - do - local u = u - getmetatable(u).__gc = function (o) - assert(a[o] == 10-s) - assert(a[10-s] == undef) -- udata already removed from weak table - assert(getmetatable(o) == getmetatable(u)) - assert(getmetatable(o).a[o] == 10-s) - s=s+1 - end - end - a1, u = nil - assert(next(a) ~= nil) - collectgarbage() - assert(s==11) - collectgarbage() - assert(next(a) == nil) -- finalized keys are removed in two cycles -end - - --- __gc x weak tables -local u = setmetatable({}, {__gc = true}) --- __gc metamethod should be collected before running -setmetatable(getmetatable(u), {__mode = "v"}) -getmetatable(u).__gc = function (o) os.exit(1) end -- cannot happen -u = nil -collectgarbage() - -local u = setmetatable({}, {__gc = true}) -local m = getmetatable(u) -m.x = {[{0}] = 1; [0] = {1}}; setmetatable(m.x, {__mode = "kv"}); -m.__gc = function (o) - assert(next(getmetatable(o).x) == nil) - m = 10 -end -u, m = nil -collectgarbage() -assert(m==10) - -do -- tests for string keys in weak tables - collectgarbage(); collectgarbage() - local m = collectgarbage("count") -- current memory - local a = setmetatable({}, {__mode = "kv"}) - a[string.rep("a", 2^22)] = 25 -- long string key -> number value - a[string.rep("b", 2^22)] = {} -- long string key -> colectable value - a[{}] = 14 -- colectable key - assert(collectgarbage("count") > m + 2^13) -- 2^13 == 2 * 2^22 in KB - collectgarbage() - assert(collectgarbage("count") >= m + 2^12 and - collectgarbage("count") < m + 2^13) -- one key was collected - local k, v = next(a) -- string key with number value preserved - assert(k == string.rep("a", 2^22) and v == 25) - assert(next(a, k) == nil) -- everything else cleared - assert(a[string.rep("b", 2^22)] == undef) - a[k] = undef -- erase this last entry - k = nil - collectgarbage() - assert(next(a) == nil) - -- make sure will not try to compare with dead key - assert(a[string.rep("b", 100)] == undef) - assert(collectgarbage("count") <= m + 1) -- eveything collected -end - - --- errors during collection -if T then - warn("@store") - u = setmetatable({}, {__gc = function () error "@expected error" end}) - u = nil - collectgarbage() - assert(string.find(_WARN, "@expected error")); _WARN = false - warn("@normal") -end - - -if not _soft then - print("long list") - local a = {} - for i = 1,200000 do - a = {next = a} - end - a = nil - collectgarbage() -end - --- create many threads with self-references and open upvalues -print("self-referenced threads") -local thread_id = 0 -local threads = {} - -local function fn (thread) - local x = {} - threads[thread_id] = function() - thread = x - end - coroutine.yield() -end - -while thread_id < 1000 do - local thread = coroutine.create(fn) - coroutine.resume(thread, thread) - thread_id = thread_id + 1 -end - - --- Create a closure (function inside 'f') with an upvalue ('param') that --- points (through a table) to the closure itself and to the thread --- ('co' and the initial value of 'param') where closure is running. --- Then, assert that table (and therefore everything else) will be --- collected. -do - local collected = false -- to detect collection - collectgarbage(); collectgarbage("stop") - do - local function f (param) - ;(function () - assert(type(f) == 'function' and type(param) == 'thread') - param = {param, f} - setmetatable(param, {__gc = function () collected = true end}) - coroutine.yield(100) - end)() - end - local co = coroutine.create(f) - assert(coroutine.resume(co, co)) - end - -- Now, thread and closure are not reacheable any more. - collectgarbage() - assert(collected) - collectgarbage("restart") -end - - -do - collectgarbage() - collectgarbage"stop" - collectgarbage("step", 0) -- steps should not unblock the collector - local x = gcinfo() - repeat - for i=1,1000 do _ENV.a = {} end -- no collection during the loop - until gcinfo() > 2 * x - collectgarbage"restart" - _ENV.a = nil -end - - -if T then -- tests for weird cases collecting upvalues - - local function foo () - local a = {x = 20} - coroutine.yield(function () return a.x end) -- will run collector - assert(a.x == 20) -- 'a' is 'ok' - a = {x = 30} -- create a new object - assert(T.gccolor(a) == "white") -- of course it is new... - coroutine.yield(100) -- 'a' is still local to this thread - end - - local t = setmetatable({}, {__mode = "kv"}) - collectgarbage(); collectgarbage('stop') - -- create coroutine in a weak table, so it will never be marked - t.co = coroutine.wrap(foo) - local f = t.co() -- create function to access local 'a' - T.gcstate("atomic") -- ensure all objects are traversed - assert(T.gcstate() == "atomic") - assert(t.co() == 100) -- resume coroutine, creating new table for 'a' - assert(T.gccolor(t.co) == "white") -- thread was not traversed - T.gcstate("pause") -- collect thread, but should mark 'a' before that - assert(t.co == nil and f() == 30) -- ensure correct access to 'a' - - collectgarbage("restart") - - -- test barrier in sweep phase (backing userdata to gray) - local u = T.newuserdata(0, 1) -- create a userdata - collectgarbage() - collectgarbage"stop" - local a = {} -- avoid 'u' as first element in 'allgc' - T.gcstate"atomic" - T.gcstate"sweepallgc" - local x = {} - assert(T.gccolor(u) == "black") -- userdata is "old" (black) - assert(T.gccolor(x) == "white") -- table is "new" (white) - debug.setuservalue(u, x) -- trigger barrier - assert(T.gccolor(u) == "gray") -- userdata changed back to gray - collectgarbage"restart" - - print"+" -end - - -if T then - local debug = require "debug" - collectgarbage("stop") - local x = T.newuserdata(0) - local y = T.newuserdata(0) - debug.setmetatable(y, {__gc = nop}) -- bless the new udata before... - debug.setmetatable(x, {__gc = nop}) -- ...the old one - assert(T.gccolor(y) == "white") - T.checkmemory() - collectgarbage("restart") -end - - -if T then - print("emergency collections") - collectgarbage() - collectgarbage() - T.totalmem(T.totalmem() + 200) - for i=1,200 do local a = {} end - T.totalmem(0) - collectgarbage() - local t = T.totalmem("table") - local a = {{}, {}, {}} -- create 4 new tables - assert(T.totalmem("table") == t + 4) - t = T.totalmem("function") - a = function () end -- create 1 new closure - assert(T.totalmem("function") == t + 1) - t = T.totalmem("thread") - a = coroutine.create(function () end) -- create 1 new coroutine - assert(T.totalmem("thread") == t + 1) -end - - --- create an object to be collected when state is closed -do - local setmetatable,assert,type,print,getmetatable = - setmetatable,assert,type,print,getmetatable - local tt = {} - tt.__gc = function (o) - assert(getmetatable(o) == tt) - -- create new objects during GC - local a = 'xuxu'..(10+3)..'joao', {} - ___Glob = o -- ressurrect object! - setmetatable({}, tt) -- creates a new one with same metatable - print(">>> closing state " .. "<<<\n") - end - local u = setmetatable({}, tt) - ___Glob = {u} -- avoid object being collected before program end -end - --- create several objects to raise errors when collected while closing state -if T then - local error, assert, find, warn = error, assert, string.find, warn - local n = 0 - local lastmsg - local mt = {__gc = function (o) - n = n + 1 - assert(n == o[1]) - if n == 1 then - _WARN = false - elseif n == 2 then - assert(find(_WARN, "@expected warning")) - lastmsg = _WARN -- get message from previous error (first 'o') - else - assert(lastmsg == _WARN) -- subsequent error messages are equal - end - warn("@store"); _WARN = false - error"@expected warning" - end} - for i = 10, 1, -1 do - -- create object and preserve it until the end - table.insert(___Glob, setmetatable({i}, mt)) - end -end - --- just to make sure -assert(collectgarbage'isrunning') - -do -- check that the collector is not reentrant in incremental mode - local res = true - setmetatable({}, {__gc = function () - res = collectgarbage() - end}) - collectgarbage() - assert(not res) -end - - -collectgarbage(oldmode) - -print('OK') diff --git a/lua-5.4.7-tests/gengc.lua b/lua-5.4.7-tests/gengc.lua deleted file mode 100644 index 3d4f67f..0000000 --- a/lua-5.4.7-tests/gengc.lua +++ /dev/null @@ -1,172 +0,0 @@ --- $Id: testes/gengc.lua $ --- See Copyright Notice in file all.lua - -print('testing generational garbage collection') - -local debug = require"debug" - -assert(collectgarbage("isrunning")) - -collectgarbage() - -local oldmode = collectgarbage("generational") - - --- ensure that table barrier evolves correctly -do - local U = {} - -- full collection makes 'U' old - collectgarbage() - assert(not T or T.gcage(U) == "old") - - -- U refers to a new table, so it becomes 'touched1' - U[1] = {x = {234}} - assert(not T or (T.gcage(U) == "touched1" and T.gcage(U[1]) == "new")) - - -- both U and the table survive one more collection - collectgarbage("step", 0) - assert(not T or (T.gcage(U) == "touched2" and T.gcage(U[1]) == "survival")) - - -- both U and the table survive yet another collection - -- now everything is old - collectgarbage("step", 0) - assert(not T or (T.gcage(U) == "old" and T.gcage(U[1]) == "old1")) - - -- data was not corrupted - assert(U[1].x[1] == 234) -end - - -do - -- ensure that 'firstold1' is corrected when object is removed from - -- the 'allgc' list - local function foo () end - local old = {10} - collectgarbage() -- make 'old' old - assert(not T or T.gcage(old) == "old") - setmetatable(old, {}) -- new table becomes OLD0 (barrier) - assert(not T or T.gcage(getmetatable(old)) == "old0") - collectgarbage("step", 0) -- new table becomes OLD1 and firstold1 - assert(not T or T.gcage(getmetatable(old)) == "old1") - setmetatable(getmetatable(old), {__gc = foo}) -- get it out of allgc list - collectgarbage("step", 0) -- should not seg. fault -end - - -do -- bug in 5.4.0 --- When an object aged OLD1 is finalized, it is moved from the list --- 'finobj' to the *beginning* of the list 'allgc', but that part of the --- list was not being visited by 'markold'. - local A = {} - A[1] = false -- old anchor for object - - -- obj finalizer - local function gcf (obj) - A[1] = obj -- anchor object - assert(not T or T.gcage(obj) == "old1") - obj = nil -- remove it from the stack - collectgarbage("step", 0) -- do a young collection - print(getmetatable(A[1]).x) -- metatable was collected - end - - collectgarbage() -- make A old - local obj = {} -- create a new object - collectgarbage("step", 0) -- make it a survival - assert(not T or T.gcage(obj) == "survival") - setmetatable(obj, {__gc = gcf, x = "+"}) -- create its metatable - assert(not T or T.gcage(getmetatable(obj)) == "new") - obj = nil -- clear object - collectgarbage("step", 0) -- will call obj's finalizer -end - - -do -- another bug in 5.4.0 - local old = {10} - collectgarbage() -- make 'old' old - local co = coroutine.create( - function () - local x = nil - local f = function () - return x[1] - end - x = coroutine.yield(f) - coroutine.yield() - end - ) - local _, f = coroutine.resume(co) -- create closure over 'x' in coroutine - collectgarbage("step", 0) -- make upvalue a survival - old[1] = {"hello"} -- 'old' go to grayagain as 'touched1' - coroutine.resume(co, {123}) -- its value will be new - co = nil - collectgarbage("step", 0) -- hit the barrier - assert(f() == 123 and old[1][1] == "hello") - collectgarbage("step", 0) -- run the collector once more - -- make sure old[1] was not collected - assert(f() == 123 and old[1][1] == "hello") -end - - -do -- bug introduced in commit 9cf3299fa - local t = setmetatable({}, {__mode = "kv"}) -- all-weak table - collectgarbage() -- full collection - assert(not T or T.gcage(t) == "old") - t[1] = {10} - assert(not T or (T.gcage(t) == "touched1" and T.gccolor(t) == "gray")) - collectgarbage("step", 0) -- minor collection - assert(not T or (T.gcage(t) == "touched2" and T.gccolor(t) == "black")) - collectgarbage("step", 0) -- minor collection - assert(not T or T.gcage(t) == "old") -- t should be black, but it was gray - t[1] = {10} -- no barrier here, so t was still old - collectgarbage("step", 0) -- minor collection - -- t, being old, is ignored by the collection, so it is not cleared - assert(t[1] == nil) -- fails with the bug -end - - -if T == nil then - (Message or print)('\n >>> testC not active: \z - skipping some generational tests <<<\n') - print 'OK' - return -end - - --- ensure that userdata barrier evolves correctly -do - local U = T.newuserdata(0, 1) - -- full collection makes 'U' old - collectgarbage() - assert(T.gcage(U) == "old") - - -- U refers to a new table, so it becomes 'touched1' - debug.setuservalue(U, {x = {234}}) - assert(T.gcage(U) == "touched1" and - T.gcage(debug.getuservalue(U)) == "new") - - -- both U and the table survive one more collection - collectgarbage("step", 0) - assert(T.gcage(U) == "touched2" and - T.gcage(debug.getuservalue(U)) == "survival") - - -- both U and the table survive yet another collection - -- now everything is old - collectgarbage("step", 0) - assert(T.gcage(U) == "old" and - T.gcage(debug.getuservalue(U)) == "old1") - - -- data was not corrupted - assert(debug.getuservalue(U).x[1] == 234) -end - --- just to make sure -assert(collectgarbage'isrunning') - - - --- just to make sure -assert(collectgarbage'isrunning') - -collectgarbage(oldmode) - -print('OK') - diff --git a/lua-5.4.7-tests/goto.lua b/lua-5.4.7-tests/goto.lua deleted file mode 100644 index 4ac6d7d..0000000 --- a/lua-5.4.7-tests/goto.lua +++ /dev/null @@ -1,271 +0,0 @@ --- $Id: testes/goto.lua $ --- See Copyright Notice in file all.lua - -collectgarbage() - -local function errmsg (code, m) - local st, msg = load(code) - assert(not st and string.find(msg, m)) -end - --- cannot see label inside block -errmsg([[ goto l1; do ::l1:: end ]], "label 'l1'") -errmsg([[ do ::l1:: end goto l1; ]], "label 'l1'") - --- repeated label -errmsg([[ ::l1:: ::l1:: ]], "label 'l1'") -errmsg([[ ::l1:: do ::l1:: end]], "label 'l1'") - - --- undefined label -errmsg([[ goto l1; local aa ::l1:: ::l2:: print(3) ]], "local 'aa'") - --- jumping over variable definition -errmsg([[ -do local bb, cc; goto l1; end -local aa -::l1:: print(3) -]], "local 'aa'") - --- jumping into a block -errmsg([[ do ::l1:: end goto l1 ]], "label 'l1'") -errmsg([[ goto l1 do ::l1:: end ]], "label 'l1'") - --- cannot continue a repeat-until with variables -errmsg([[ - repeat - if x then goto cont end - local xuxu = 10 - ::cont:: - until xuxu < x -]], "local 'xuxu'") - --- simple gotos -local x -do - local y = 12 - goto l1 - ::l2:: x = x + 1; goto l3 - ::l1:: x = y; goto l2 -end -::l3:: ::l3_1:: assert(x == 13) - - --- long labels -do - local prog = [[ - do - local a = 1 - goto l%sa; a = a + 1 - ::l%sa:: a = a + 10 - goto l%sb; a = a + 2 - ::l%sb:: a = a + 20 - return a - end - ]] - local label = string.rep("0123456789", 40) - prog = string.format(prog, label, label, label, label) - assert(assert(load(prog))() == 31) -end - - --- ok to jump over local dec. to end of block -do - goto l1 - local a = 23 - x = a - ::l1::; -end - -while true do - goto l4 - goto l1 -- ok to jump over local dec. to end of block - goto l1 -- multiple uses of same label - local x = 45 - ::l1:: ;;; -end -::l4:: assert(x == 13) - -if print then - goto l1 -- ok to jump over local dec. to end of block - error("should not be here") - goto l2 -- ok to jump over local dec. to end of block - local x - ::l1:: ; ::l2:: ;; -else end - --- to repeat a label in a different function is OK -local function foo () - local a = {} - goto l3 - ::l1:: a[#a + 1] = 1; goto l2; - ::l2:: a[#a + 1] = 2; goto l5; - ::l3:: - ::l3a:: a[#a + 1] = 3; goto l1; - ::l4:: a[#a + 1] = 4; goto l6; - ::l5:: a[#a + 1] = 5; goto l4; - ::l6:: assert(a[1] == 3 and a[2] == 1 and a[3] == 2 and - a[4] == 5 and a[5] == 4) - if not a[6] then a[6] = true; goto l3a end -- do it twice -end - -::l6:: foo() - - -do -- bug in 5.2 -> 5.3.2 - local x - ::L1:: - local y -- cannot join this SETNIL with previous one - assert(y == nil) - y = true - if x == nil then - x = 1 - goto L1 - else - x = x + 1 - end - assert(x == 2 and y == true) -end - --- bug in 5.3 -do - local first = true - local a = false - if true then - goto LBL - ::loop:: - a = true - ::LBL:: - if first then - first = false - goto loop - end - end - assert(a) -end - -do -- compiling infinite loops - goto escape -- do not run the infinite loops - ::a:: goto a - ::b:: goto c - ::c:: goto b -end -::escape:: --------------------------------------------------------------------------------- --- testing closing of upvalues - -local debug = require 'debug' - -local function foo () - local t = {} - do - local i = 1 - local a, b, c, d - t[1] = function () return a, b, c, d end - ::l1:: - local b - do - local c - t[#t + 1] = function () return a, b, c, d end -- t[2], t[4], t[6] - if i > 2 then goto l2 end - do - local d - t[#t + 1] = function () return a, b, c, d end -- t[3], t[5] - i = i + 1 - local a - goto l1 - end - end - end - ::l2:: return t -end - -local a = foo() -assert(#a == 6) - --- all functions share same 'a' -for i = 2, 6 do - assert(debug.upvalueid(a[1], 1) == debug.upvalueid(a[i], 1)) -end - --- 'b' and 'c' are shared among some of them -for i = 2, 6 do - -- only a[1] uses external 'b'/'b' - assert(debug.upvalueid(a[1], 2) ~= debug.upvalueid(a[i], 2)) - assert(debug.upvalueid(a[1], 3) ~= debug.upvalueid(a[i], 3)) -end - -for i = 3, 5, 2 do - -- inner functions share 'b'/'c' with previous ones - assert(debug.upvalueid(a[i], 2) == debug.upvalueid(a[i - 1], 2)) - assert(debug.upvalueid(a[i], 3) == debug.upvalueid(a[i - 1], 3)) - -- but not with next ones - assert(debug.upvalueid(a[i], 2) ~= debug.upvalueid(a[i + 1], 2)) - assert(debug.upvalueid(a[i], 3) ~= debug.upvalueid(a[i + 1], 3)) -end - --- only external 'd' is shared -for i = 2, 6, 2 do - assert(debug.upvalueid(a[1], 4) == debug.upvalueid(a[i], 4)) -end - --- internal 'd's are all different -for i = 3, 5, 2 do - for j = 1, 6 do - assert((debug.upvalueid(a[i], 4) == debug.upvalueid(a[j], 4)) - == (i == j)) - end -end - --------------------------------------------------------------------------------- --- testing if x goto optimizations - -local function testG (a) - if a == 1 then - goto l1 - error("should never be here!") - elseif a == 2 then goto l2 - elseif a == 3 then goto l3 - elseif a == 4 then - goto l1 -- go to inside the block - error("should never be here!") - ::l1:: a = a + 1 -- must go to 'if' end - else - goto l4 - ::l4a:: a = a * 2; goto l4b - error("should never be here!") - ::l4:: goto l4a - error("should never be here!") - ::l4b:: - end - do return a end - ::l2:: do return "2" end - ::l3:: do return "3" end - ::l1:: return "1" -end - -assert(testG(1) == "1") -assert(testG(2) == "2") -assert(testG(3) == "3") -assert(testG(4) == 5) -assert(testG(5) == 10) - -do - -- if x back goto out of scope of upvalue - local X - goto L1 - - ::L2:: goto L3 - - ::L1:: do - local a = setmetatable({}, {__close = function () X = true end}) - assert(X == nil) - if a then goto L2 end -- jumping back out of scope of 'a' - end - - ::L3:: assert(X == true) -- checks that 'a' was correctly closed -end --------------------------------------------------------------------------------- - - -print'OK' diff --git a/lua-5.4.7-tests/heavy.lua b/lua-5.4.7-tests/heavy.lua deleted file mode 100644 index 4731c74..0000000 --- a/lua-5.4.7-tests/heavy.lua +++ /dev/null @@ -1,173 +0,0 @@ --- $Id: heavy.lua,v 1.7 2017/12/29 15:42:15 roberto Exp $ --- See Copyright Notice in file all.lua - -local function teststring () - print("creating a string too long") - do - local a = "x" - local st, msg = pcall(function () - while true do - a = a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - .. a .. a.. a.. a.. a.. a.. a.. a.. a.. a - print(string.format("string with %d bytes", #a)) - end - end) - assert(not st and - (string.find(msg, "string length overflow") or - string.find(msg, "not enough memory"))) - print("string length overflow with " .. #a * 100) - end - print('+') -end - -local function loadrep (x, what) - local p = 1<<20 - local s = string.rep(x, p) - local count = 0 - local function f() - count = count + p - if count % (0x80*p) == 0 then - io.stderr:write("(", count // 2^20, " M)") - end - return s - end - local st, msg = load(f, "=big") - print("\nmemory: ", collectgarbage'count' * 1024) - msg = string.match(msg, "^[^\n]+") -- get only first line - print(string.format("total: 0x%x %s ('%s')", count, what, msg)) - return st, msg -end - - -function controlstruct () - print("control structure too long") - local lim = ((1 << 24) - 2) // 3 - local s = string.rep("a = a + 1\n", lim) - s = "while true do " .. s .. "end" - assert(load(s)) - print("ok with " .. lim .. " lines") - lim = lim + 3 - s = string.rep("a = a + 1\n", lim) - s = "while true do " .. s .. "end" - local st, msg = load(s) - assert(not st and string.find(msg, "too long")) - print(msg) -end - - -function manylines () - print("loading chunk with too many lines") - local st, msg = loadrep("\n", "lines") - assert(not st and string.find(msg, "too many lines")) - print('+') -end - - -function hugeid () - print("loading chunk with huge identifier") - local st, msg = loadrep("a", "chars") - assert(not st and - (string.find(msg, "lexical element too long") or - string.find(msg, "not enough memory"))) - print('+') -end - -function toomanyinst () - print("loading chunk with too many instructions") - local st, msg = loadrep("a = 10; ", "instructions") - print('+') -end - - -local function loadrepfunc (prefix, f) - local count = -1 - local function aux () - count = count + 1 - if count == 0 then - return prefix - else - if count % (0x100000) == 0 then - io.stderr:write("(", count // 2^20, " M)") - end - return f(count) - end - end - local st, msg = load(aux, "k") - print("\nmemory: ", collectgarbage'count' * 1024) - msg = string.match(msg, "^[^\n]+") -- get only first line - print("expected error: ", msg) -end - - -function toomanyconst () - print("loading function with too many constants") - loadrepfunc("function foo () return {0,", - function (n) - -- convert 'n' to a string in the format [["...",]], - -- where '...' is a kind of number in base 128 - -- (in a range that does not include either the double quote - -- and the escape.) - return string.char(34, - ((n // 128^0) & 127) + 128, - ((n // 128^1) & 127) + 128, - ((n // 128^2) & 127) + 128, - ((n // 128^3) & 127) + 128, - ((n // 128^4) & 127) + 128, - 34, 44) - end) -end - - -function toomanystr () - local a = {} - local st, msg = pcall(function () - for i = 1, math.huge do - if i % (0x100000) == 0 then - io.stderr:write("(", i // 2^20, " M)") - end - a[i] = string.pack("I", i) - end - end) - local size = #a - a = collectgarbage'count' - print("\nmemory:", a * 1024) - print("expected error:", msg) - print("size:", size) -end - - -function toomanyidx () - local a = {} - local st, msg = pcall(function () - for i = 1, math.huge do - if i % (0x100000) == 0 then - io.stderr:write("(", i // 2^20, " M)") - end - a[i] = i - end - end) - print("\nmemory: ", collectgarbage'count' * 1024) - print("expected error: ", msg) - print("size:", #a) -end - - - --- teststring() --- controlstruct() --- manylines() --- hugeid() --- toomanyinst() --- toomanyconst() --- toomanystr() -toomanyidx() - -print "OK" diff --git a/lua-5.4.7-tests/libs/lib1.c b/lua-5.4.7-tests/libs/lib1.c deleted file mode 100644 index 56b6ef4..0000000 --- a/lua-5.4.7-tests/libs/lib1.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "lua.h" -#include "lauxlib.h" - -static int id (lua_State *L) { - return lua_gettop(L); -} - - -static const struct luaL_Reg funcs[] = { - {"id", id}, - {NULL, NULL} -}; - - -/* function used by lib11.c */ -LUAMOD_API int lib1_export (lua_State *L) { - lua_pushstring(L, "exported"); - return 1; -} - - -LUAMOD_API int onefunction (lua_State *L) { - luaL_checkversion(L); - lua_settop(L, 2); - lua_pushvalue(L, 1); - return 2; -} - - -LUAMOD_API int anotherfunc (lua_State *L) { - luaL_checkversion(L); - lua_pushfstring(L, "%d%%%d\n", (int)lua_tointeger(L, 1), - (int)lua_tointeger(L, 2)); - return 1; -} - - -LUAMOD_API int luaopen_lib1_sub (lua_State *L) { - lua_setglobal(L, "y"); /* 2nd arg: extra value (file name) */ - lua_setglobal(L, "x"); /* 1st arg: module name */ - luaL_newlib(L, funcs); - return 1; -} - diff --git a/lua-5.4.7-tests/libs/lib11.c b/lua-5.4.7-tests/libs/lib11.c deleted file mode 100644 index 377d0c4..0000000 --- a/lua-5.4.7-tests/libs/lib11.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "lua.h" - -/* function from lib1.c */ -int lib1_export (lua_State *L); - -LUAMOD_API int luaopen_lib11 (lua_State *L) { - return lib1_export(L); -} - - diff --git a/lua-5.4.7-tests/libs/lib2.c b/lua-5.4.7-tests/libs/lib2.c deleted file mode 100644 index bc9651e..0000000 --- a/lua-5.4.7-tests/libs/lib2.c +++ /dev/null @@ -1,23 +0,0 @@ -#include "lua.h" -#include "lauxlib.h" - -static int id (lua_State *L) { - return lua_gettop(L); -} - - -static const struct luaL_Reg funcs[] = { - {"id", id}, - {NULL, NULL} -}; - - -LUAMOD_API int luaopen_lib2 (lua_State *L) { - lua_settop(L, 2); - lua_setglobal(L, "y"); /* y gets 2nd parameter */ - lua_setglobal(L, "x"); /* x gets 1st parameter */ - luaL_newlib(L, funcs); - return 1; -} - - diff --git a/lua-5.4.7-tests/libs/lib21.c b/lua-5.4.7-tests/libs/lib21.c deleted file mode 100644 index a39b683..0000000 --- a/lua-5.4.7-tests/libs/lib21.c +++ /dev/null @@ -1,10 +0,0 @@ -#include "lua.h" - - -int luaopen_lib2 (lua_State *L); - -LUAMOD_API int luaopen_lib21 (lua_State *L) { - return luaopen_lib2(L); -} - - diff --git a/lua-5.4.7-tests/libs/lib22.c b/lua-5.4.7-tests/libs/lib22.c deleted file mode 100644 index 8e65650..0000000 --- a/lua-5.4.7-tests/libs/lib22.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "lua.h" -#include "lauxlib.h" - -static int id (lua_State *L) { - lua_pushboolean(L, 1); - lua_insert(L, 1); - return lua_gettop(L); -} - - -static const struct luaL_Reg funcs[] = { - {"id", id}, - {NULL, NULL} -}; - - -LUAMOD_API int luaopen_lib2 (lua_State *L) { - lua_settop(L, 2); - lua_setglobal(L, "y"); /* y gets 2nd parameter */ - lua_setglobal(L, "x"); /* x gets 1st parameter */ - luaL_newlib(L, funcs); - return 1; -} - - diff --git a/lua-5.4.7-tests/libs/makefile b/lua-5.4.7-tests/libs/makefile deleted file mode 100644 index 9c0c4e3..0000000 --- a/lua-5.4.7-tests/libs/makefile +++ /dev/null @@ -1,27 +0,0 @@ -# change this variable to point to the directory with Lua headers -# of the version being tested -LUA_DIR = ../../ - -CC = gcc - -# compilation should generate Dynamic-Link Libraries -CFLAGS = -Wall -std=gnu99 -O2 -I$(LUA_DIR) -fPIC -shared - -# libraries used by the tests -all: lib1.so lib11.so lib2.so lib21.so lib2-v2.so - touch all - -lib1.so: lib1.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/lua.h - $(CC) $(CFLAGS) -o lib1.so lib1.c - -lib11.so: lib11.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/lua.h - $(CC) $(CFLAGS) -o lib11.so lib11.c - -lib2.so: lib2.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/lua.h - $(CC) $(CFLAGS) -o lib2.so lib2.c - -lib21.so: lib21.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/lua.h - $(CC) $(CFLAGS) -o lib21.so lib21.c - -lib2-v2.so: lib21.c $(LUA_DIR)/luaconf.h $(LUA_DIR)/lua.h - $(CC) $(CFLAGS) -o lib2-v2.so lib22.c diff --git a/lua-5.4.7-tests/literals.lua b/lua-5.4.7-tests/literals.lua deleted file mode 100644 index 30ab9ab..0000000 --- a/lua-5.4.7-tests/literals.lua +++ /dev/null @@ -1,343 +0,0 @@ --- $Id: testes/literals.lua $ --- See Copyright Notice in file all.lua - -print('testing scanner') - -local debug = require "debug" - - -local function dostring (x) return assert(load(x), "")() end - -dostring("x \v\f = \t\r 'a\0a' \v\f\f") -assert(x == 'a\0a' and string.len(x) == 3) -_G.x = nil - --- escape sequences -assert('\n\"\'\\' == [[ - -"'\]]) - -assert(string.find("\a\b\f\n\r\t\v", "^%c%c%c%c%c%c%c$")) - --- assume ASCII just for tests: -assert("\09912" == 'c12') -assert("\99ab" == 'cab') -assert("\099" == '\99') -assert("\099\n" == 'c\10') -assert('\0\0\0alo' == '\0' .. '\0\0' .. 'alo') - -assert(010 .. 020 .. -030 == "1020-30") - --- hexadecimal escapes -assert("\x00\x05\x10\x1f\x3C\xfF\xe8" == "\0\5\16\31\60\255\232") - -local function lexstring (x, y, n) - local f = assert(load('return ' .. x .. - ', require"debug".getinfo(1).currentline', '')) - local s, l = f() - assert(s == y and l == n) -end - -lexstring("'abc\\z \n efg'", "abcefg", 2) -lexstring("'abc\\z \n\n\n'", "abc", 4) -lexstring("'\\z \n\t\f\v\n'", "", 3) -lexstring("[[\nalo\nalo\n\n]]", "alo\nalo\n\n", 5) -lexstring("[[\nalo\ralo\n\n]]", "alo\nalo\n\n", 5) -lexstring("[[\nalo\ralo\r\n]]", "alo\nalo\n", 4) -lexstring("[[\ralo\n\ralo\r\n]]", "alo\nalo\n", 4) -lexstring("[[alo]\n]alo]]", "alo]\n]alo", 2) - -assert("abc\z - def\z - ghi\z - " == 'abcdefghi') - - --- UTF-8 sequences -assert("\u{0}\u{00000000}\x00\0" == string.char(0, 0, 0, 0)) - --- limits for 1-byte sequences -assert("\u{0}\u{7F}" == "\x00\x7F") - --- limits for 2-byte sequences -assert("\u{80}\u{7FF}" == "\xC2\x80\xDF\xBF") - --- limits for 3-byte sequences -assert("\u{800}\u{FFFF}" == "\xE0\xA0\x80\xEF\xBF\xBF") - --- limits for 4-byte sequences -assert("\u{10000}\u{1FFFFF}" == "\xF0\x90\x80\x80\xF7\xBF\xBF\xBF") - --- limits for 5-byte sequences -assert("\u{200000}\u{3FFFFFF}" == "\xF8\x88\x80\x80\x80\xFB\xBF\xBF\xBF\xBF") - --- limits for 6-byte sequences -assert("\u{4000000}\u{7FFFFFFF}" == - "\xFC\x84\x80\x80\x80\x80\xFD\xBF\xBF\xBF\xBF\xBF") - - --- Error in escape sequences -local function lexerror (s, err) - local st, msg = load('return ' .. s, '') - if err ~= '' then err = err .. "'" end - assert(not st and string.find(msg, "near .-" .. err)) -end - -lexerror([["abc\x"]], [[\x"]]) -lexerror([["abc\x]], [[\x]]) -lexerror([["\x]], [[\x]]) -lexerror([["\x5"]], [[\x5"]]) -lexerror([["\x5]], [[\x5]]) -lexerror([["\xr"]], [[\xr]]) -lexerror([["\xr]], [[\xr]]) -lexerror([["\x.]], [[\x.]]) -lexerror([["\x8%"]], [[\x8%%]]) -lexerror([["\xAG]], [[\xAG]]) -lexerror([["\g"]], [[\g]]) -lexerror([["\g]], [[\g]]) -lexerror([["\."]], [[\%.]]) - -lexerror([["\999"]], [[\999"]]) -lexerror([["xyz\300"]], [[\300"]]) -lexerror([[" \256"]], [[\256"]]) - --- errors in UTF-8 sequences -lexerror([["abc\u{100000000}"]], [[abc\u{100000000]]) -- too large -lexerror([["abc\u11r"]], [[abc\u1]]) -- missing '{' -lexerror([["abc\u"]], [[abc\u"]]) -- missing '{' -lexerror([["abc\u{11r"]], [[abc\u{11r]]) -- missing '}' -lexerror([["abc\u{11"]], [[abc\u{11"]]) -- missing '}' -lexerror([["abc\u{11]], [[abc\u{11]]) -- missing '}' -lexerror([["abc\u{r"]], [[abc\u{r]]) -- no digits - --- unfinished strings -lexerror("[=[alo]]", "") -lexerror("[=[alo]=", "") -lexerror("[=[alo]", "") -lexerror("'alo", "") -lexerror("'alo \\z \n\n", "") -lexerror("'alo \\z", "") -lexerror([['alo \98]], "") - --- valid characters in variable names -for i = 0, 255 do - local s = string.char(i) - assert(not string.find(s, "[a-zA-Z_]") == not load(s .. "=1", "")) - assert(not string.find(s, "[a-zA-Z_0-9]") == - not load("a" .. s .. "1 = 1", "")) -end - - --- long variable names - -local var1 = string.rep('a', 15000) .. '1' -local var2 = string.rep('a', 15000) .. '2' -local prog = string.format([[ - %s = 5 - %s = %s + 1 - return function () return %s - %s end -]], var1, var2, var1, var1, var2) -local f = dostring(prog) -assert(_G[var1] == 5 and _G[var2] == 6 and f() == -1) -_G[var1], _G[var2] = nil -print('+') - --- escapes -- -assert("\n\t" == [[ - - ]]) -assert([[ - - $debug]] == "\n $debug") -assert([[ [ ]] ~= [[ ] ]]) --- long strings -- -local b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" -assert(string.len(b) == 960) -prog = [=[ -print('+') - -local a1 = [["this is a 'string' with several 'quotes'"]] -local a2 = "'quotes'" - -assert(string.find(a1, a2) == 34) -print('+') - -a1 = [==[temp = [[an arbitrary value]]; ]==] -assert(load(a1))() -assert(temp == 'an arbitrary value') -_G.temp = nil --- long strings -- -local b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789" -assert(string.len(b) == 960) -print('+') - -local a = [[00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -00123456789012345678901234567890123456789123456789012345678901234567890123456789 -]] -assert(string.len(a) == 1863) -assert(string.sub(a, 1, 40) == string.sub(b, 1, 40)) -x = 1 -]=] - -print('+') -_G.x = nil -dostring(prog) -assert(x) -_G.x = nil - - - -do -- reuse of long strings - - -- get the address of a string - local function getadd (s) return string.format("%p", s) end - - local s1 = "01234567890123456789012345678901234567890123456789" - local s2 = "01234567890123456789012345678901234567890123456789" - local s3 = "01234567890123456789012345678901234567890123456789" - local function foo() return s1 end - local function foo1() return s3 end - local function foo2() - return "01234567890123456789012345678901234567890123456789" - end - local a1 = getadd(s1) - assert(a1 == getadd(s2)) - assert(a1 == getadd(foo())) - assert(a1 == getadd(foo1())) - assert(a1 == getadd(foo2())) - - local sd = "0123456789" .. "0123456789012345678901234567890123456789" - assert(sd == s1 and getadd(sd) ~= a1) -end - - --- testing line ends -prog = [[ -local a = 1 -- a comment -local b = 2 - - -x = [=[ -hi -]=] -y = "\ -hello\r\n\ -" -return require"debug".getinfo(1).currentline -]] - -for _, n in pairs{"\n", "\r", "\n\r", "\r\n"} do - local prog, nn = string.gsub(prog, "\n", n) - assert(dostring(prog) == nn) - assert(_G.x == "hi\n" and _G.y == "\nhello\r\n\n") -end -_G.x, _G.y = nil - - --- testing comments and strings with long brackets -local a = [==[]=]==] -assert(a == "]=") - -a = [==[[===[[=[]]=][====[]]===]===]==] -assert(a == "[===[[=[]]=][====[]]===]===") - -a = [====[[===[[=[]]=][====[]]===]===]====] -assert(a == "[===[[=[]]=][====[]]===]===") - -a = [=[]]]]]]]]]=] -assert(a == "]]]]]]]]") - - ---[===[ -x y z [==[ blu foo -]== -] -]=]==] -error error]=]===] - --- generate all strings of four of these chars -local x = {"=", "[", "]", "\n"} -local len = 4 -local function gen (c, n) - if n==0 then coroutine.yield(c) - else - for _, a in pairs(x) do - gen(c..a, n-1) - end - end -end - -for s in coroutine.wrap(function () gen("", len) end) do - assert(s == load("return [====[\n"..s.."]====]", "")()) -end - - --- testing decimal point locale -if os.setlocale("pt_BR") or os.setlocale("ptb") then - assert(tonumber("3,4") == 3.4 and tonumber"3.4" == 3.4) - assert(tonumber(" -.4 ") == -0.4) - assert(tonumber(" +0x.41 ") == 0X0.41) - assert(not load("a = (3,4)")) - assert(assert(load("return 3.4"))() == 3.4) - assert(assert(load("return .4,3"))() == .4) - assert(assert(load("return 4."))() == 4.) - assert(assert(load("return 4.+.5"))() == 4.5) - - assert(" 0x.1 " + " 0x,1" + "-0X.1\t" == 0x0.1) - - assert(not tonumber"inf" and not tonumber"NAN") - - assert(assert(load(string.format("return %q", 4.51)))() == 4.51) - - local a,b = load("return 4.5.") - assert(string.find(b, "'4%.5%.'")) - - assert(os.setlocale("C")) -else - (Message or print)( - '\n >>> pt_BR locale not available: skipping decimal point tests <<<\n') -end - - --- testing %q x line ends -local s = "a string with \r and \n and \r\n and \n\r" -local c = string.format("return %q", s) -assert(assert(load(c))() == s) - --- testing errors -assert(not load"a = 'non-ending string") -assert(not load"a = 'non-ending string\n'") -assert(not load"a = '\\345'") -assert(not load"a = [=x]") - -local function malformednum (n, exp) - local s, msg = load("return " .. n) - assert(not s and string.find(msg, exp)) -end - -malformednum("0xe-", "near ") -malformednum("0xep-p", "malformed number") -malformednum("1print()", "malformed number") - -print('OK') diff --git a/lua-5.4.7-tests/locals.lua b/lua-5.4.7-tests/locals.lua deleted file mode 100644 index 2c48546..0000000 --- a/lua-5.4.7-tests/locals.lua +++ /dev/null @@ -1,1181 +0,0 @@ --- $Id: testes/locals.lua $ --- See Copyright Notice in file all.lua - -print('testing local variables and environments') - -local debug = require"debug" - -local tracegc = require"tracegc" - - --- bug in 5.1: - -local function f(x) x = nil; return x end -assert(f(10) == nil) - -local function f() local x; return x end -assert(f(10) == nil) - -local function f(x) x = nil; local y; return x, y end -assert(f(10) == nil and select(2, f(20)) == nil) - -do - local i = 10 - do local i = 100; assert(i==100) end - do local i = 1000; assert(i==1000) end - assert(i == 10) - if i ~= 10 then - local i = 20 - else - local i = 30 - assert(i == 30) - end -end - - - -f = nil - -local f -local x = 1 - -a = nil -load('local a = {}')() -assert(a == nil) - -function f (a) - local _1, _2, _3, _4, _5 - local _6, _7, _8, _9, _10 - local x = 3 - local b = a - local c,d = a,b - if (d == b) then - local x = 'q' - x = b - assert(x == 2) - else - assert(nil) - end - assert(x == 3) - local f = 10 -end - -local b=10 -local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3 - - -assert(x == 1) - -f(2) -assert(type(f) == 'function') - - -local function getenv (f) - local a,b = debug.getupvalue(f, 1) - assert(a == '_ENV') - return b -end - --- test for global table of loaded chunks -assert(getenv(load"a=3") == _G) -local c = {}; local f = load("a = 3", nil, nil, c) -assert(getenv(f) == c) -assert(c.a == nil) -f() -assert(c.a == 3) - --- old test for limits for special instructions -do - local i = 2 - local p = 4 -- p == 2^i - repeat - for j=-3,3 do - assert(load(string.format([[local a=%s; - a=a+%s; - assert(a ==2^%s)]], j, p-j, i), '')) () - assert(load(string.format([[local a=%s; - a=a-%s; - assert(a==-2^%s)]], -j, p-j, i), '')) () - assert(load(string.format([[local a,b=0,%s; - a=b-%s; - assert(a==-2^%s)]], -j, p-j, i), '')) () - end - p = 2 * p; i = i + 1 - until p <= 0 -end - -print'+' - - -if rawget(_G, "T") then - -- testing clearing of dead elements from tables - collectgarbage("stop") -- stop GC - local a = {[{}] = 4, [3] = 0, alo = 1, - a1234567890123456789012345678901234567890 = 10} - - local t = T.querytab(a) - - for k,_ in pairs(a) do a[k] = undef end - collectgarbage() -- restore GC and collect dead fields in 'a' - for i=0,t-1 do - local k = querytab(a, i) - assert(k == nil or type(k) == 'number' or k == 'alo') - end - - -- testing allocation errors during table insertions - local a = {} - local function additems () - a.x = true; a.y = true; a.z = true - a[1] = true - a[2] = true - end - for i = 1, math.huge do - T.alloccount(i) - local st, msg = pcall(additems) - T.alloccount() - local count = 0 - for k, v in pairs(a) do - assert(a[k] == v) - count = count + 1 - end - if st then assert(count == 5); break end - end -end - - --- testing lexical environments - -assert(_ENV == _G) - -do -local dummy -local _ENV = (function (...) return ... end)(_G, dummy) -- { - -do local _ENV = {assert=assert}; assert(true) end -local mt = {_G = _G} -local foo,x -A = false -- "declare" A -do local _ENV = mt - function foo (x) - A = x - do local _ENV = _G; A = 1000 end - return function (x) return A .. x end - end -end -assert(getenv(foo) == mt) -x = foo('hi'); assert(mt.A == 'hi' and A == 1000) -assert(x('*') == mt.A .. '*') - -do local _ENV = {assert=assert, A=10}; - do local _ENV = {assert=assert, A=20}; - assert(A==20);x=A - end - assert(A==10 and x==20) -end -assert(x==20) - -A = nil - - -do -- constants - local a, b, c = 10, 20, 30 - b = a + c + b -- 'b' is not constant - assert(a == 10 and b == 60 and c == 30) - local function checkro (name, code) - local st, msg = load(code) - local gab = string.format("attempt to assign to const variable '%s'", name) - assert(not st and string.find(msg, gab)) - end - checkro("y", "local x, y , z = 10, 20, 30; x = 11; y = 12") - checkro("x", "local x , y, z = 10, 20, 30; x = 11") - checkro("z", "local x , y, z = 10, 20, 30; y = 10; z = 11") - checkro("foo", "local foo = 10; function foo() end") - checkro("foo", "local foo = {}; function foo() end") - - checkro("z", [[ - local a, z , b = 10; - function foo() a = 20; z = 32; end - ]]) - - checkro("var1", [[ - local a, var1 = 10; - function foo() a = 20; z = function () var1 = 12; end end - ]]) -end - - -print"testing to-be-closed variables" - -local function stack(n) n = ((n == 0) or stack(n - 1)) end - -local function func2close (f, x, y) - local obj = setmetatable({}, {__close = f}) - if x then - return x, obj, y - else - return obj - end -end - - -do - local a = {} - do - local b = false -- not to be closed - local x = setmetatable({"x"}, {__close = function (self) - a[#a + 1] = self[1] end}) - local w, y , z = func2close(function (self, err) - assert(err == nil); a[#a + 1] = "y" - end, 10, 20) - local c = nil -- not to be closed - a[#a + 1] = "in" - assert(w == 10 and z == 20) - end - a[#a + 1] = "out" - assert(a[1] == "in" and a[2] == "y" and a[3] == "x" and a[4] == "out") -end - -do - local X = false - - local x, closescope = func2close(function (_, msg) - stack(10); - assert(msg == nil) - X = true - end, 100) - assert(x == 100); x = 101; -- 'x' is not read-only - - -- closing functions do not corrupt returning values - local function foo (x) - local _ = closescope - return x, X, 23 - end - - local a, b, c = foo(1.5) - assert(a == 1.5 and b == false and c == 23 and X == true) - - X = false - foo = function (x) - local _ = func2close(function (_, msg) - -- without errors, enclosing function should be still active when - -- __close is called - assert(debug.getinfo(2).name == "foo") - assert(msg == nil) - end) - local _ = closescope - local y = 15 - return y - end - - assert(foo() == 15 and X == true) - - X = false - foo = function () - local x = closescope - return x - end - - assert(foo() == closescope and X == true) - -end - - --- testing to-be-closed x compile-time constants --- (there were some bugs here in Lua 5.4-rc3, due to a confusion --- between compile levels and stack levels of variables) -do - local flag = false - local x = setmetatable({}, - {__close = function() assert(flag == false); flag = true end}) - local y = nil - local z = nil - do - local a = x - end - assert(flag) -- 'x' must be closed here -end - -do - -- similar problem, but with implicit close in for loops - local flag = false - local x = setmetatable({}, - {__close = function () assert(flag == false); flag = true end}) - -- return an empty iterator, nil, nil, and 'x' to be closed - local function a () - return (function () return nil end), nil, nil, x - end - local v = 1 - local w = 1 - local x = 1 - local y = 1 - local z = 1 - for k in a() do - a = k - end -- ending the loop must close 'x' - assert(flag) -- 'x' must be closed here -end - - - -do - -- calls cannot be tail in the scope of to-be-closed variables - local X, Y - local function foo () - local _ = func2close(function () Y = 10 end) - assert(X == true and Y == nil) -- 'X' not closed yet - return 1,2,3 - end - - local function bar () - local _ = func2close(function () X = false end) - X = true - do - return foo() -- not a tail call! - end - end - - local a, b, c, d = bar() - assert(a == 1 and b == 2 and c == 3 and X == false and Y == 10 and d == nil) -end - - -do - -- bug in 5.4.3: previous condition (calls cannot be tail in the - -- scope of to-be-closed variables) must be valid for tbc variables - -- created by 'for' loops. - - local closed = false - - local function foo () - return function () return true end, 0, 0, - func2close(function () closed = true end) - end - - local function tail() return closed end - - local function foo1 () - for k in foo() do return tail() end - end - - assert(foo1() == false) - assert(closed == true) -end - - -do - -- bug in 5.4.4: 'break' may generate wrong 'close' instruction when - -- leaving a loop block. - - local closed = false - - local o1 = setmetatable({}, {__close=function() closed = true end}) - - local function test() - for k, v in next, {}, nil, o1 do - local function f() return k end -- create an upvalue - break - end - assert(closed) - end - - test() -end - - -do print("testing errors in __close") - - -- original error is in __close - local function foo () - - local x = - func2close(function (self, msg) - assert(string.find(msg, "@y")) - error("@x") - end) - - local x1 = - func2close(function (self, msg) - assert(string.find(msg, "@y")) - end) - - local gc = func2close(function () collectgarbage() end) - - local y = - func2close(function (self, msg) - assert(string.find(msg, "@z")) -- error in 'z' - error("@y") - end) - - local z = - func2close(function (self, msg) - assert(msg == nil) - error("@z") - end) - - return 200 - end - - local stat, msg = pcall(foo, false) - assert(string.find(msg, "@x")) - - - -- original error not in __close - local function foo () - - local x = - func2close(function (self, msg) - -- after error, 'foo' was discarded, so caller now - -- must be 'pcall' - assert(debug.getinfo(2).name == "pcall") - assert(string.find(msg, "@x1")) - end) - - local x1 = - func2close(function (self, msg) - assert(debug.getinfo(2).name == "pcall") - assert(string.find(msg, "@y")) - error("@x1") - end) - - local gc = func2close(function () collectgarbage() end) - - local y = - func2close(function (self, msg) - assert(debug.getinfo(2).name == "pcall") - assert(string.find(msg, "@z")) - error("@y") - end) - - local first = true - local z = - func2close(function (self, msg) - assert(debug.getinfo(2).name == "pcall") - -- 'z' close is called once - assert(first and msg == 4) - first = false - error("@z") - end) - - error(4) -- original error - end - - local stat, msg = pcall(foo, true) - assert(string.find(msg, "@x1")) - - -- error leaving a block - local function foo (...) - do - local x1 = - func2close(function (self, msg) - assert(string.find(msg, "@X")) - error("@Y") - end) - - local x123 = - func2close(function (_, msg) - assert(msg == nil) - error("@X") - end) - end - os.exit(false) -- should not run - end - - local st, msg = xpcall(foo, debug.traceback) - assert(string.match(msg, "^[^ ]* @Y")) - - -- error in toclose in vararg function - local function foo (...) - local x123 = func2close(function () error("@x123") end) - end - - local st, msg = xpcall(foo, debug.traceback) - assert(string.match(msg, "^[^ ]* @x123")) - assert(string.find(msg, "in metamethod 'close'")) -end - - -do -- errors due to non-closable values - local function foo () - local x = {} - os.exit(false) -- should not run - end - local stat, msg = pcall(foo) - assert(not stat and - string.find(msg, "variable 'x' got a non%-closable value")) - - local function foo () - local xyz = setmetatable({}, {__close = print}) - getmetatable(xyz).__close = nil -- remove metamethod - end - local stat, msg = pcall(foo) - assert(not stat and string.find(msg, "metamethod 'close'")) - - local function foo () - local a1 = func2close(function (_, msg) - assert(string.find(msg, "number value")) - error(12) - end) - local a2 = setmetatable({}, {__close = print}) - local a3 = func2close(function (_, msg) - assert(msg == nil) - error(123) - end) - getmetatable(a2).__close = 4 -- invalidate metamethod - end - local stat, msg = pcall(foo) - assert(not stat and msg == 12) -end - - -do -- tbc inside close methods - local track = {} - local function foo () - local x = func2close(function () - local xx = func2close(function (_, msg) - assert(msg == nil) - track[#track + 1] = "xx" - end) - track[#track + 1] = "x" - end) - track[#track + 1] = "foo" - return 20, 30, 40 - end - local a, b, c, d = foo() - assert(a == 20 and b == 30 and c == 40 and d == nil) - assert(track[1] == "foo" and track[2] == "x" and track[3] == "xx") - - -- again, with errors - local track = {} - local function foo () - local x0 = func2close(function (_, msg) - assert(msg == 202) - track[#track + 1] = "x0" - end) - local x = func2close(function () - local xx = func2close(function (_, msg) - assert(msg == 101) - track[#track + 1] = "xx" - error(202) - end) - track[#track + 1] = "x" - error(101) - end) - track[#track + 1] = "foo" - return 20, 30, 40 - end - local st, msg = pcall(foo) - assert(not st and msg == 202) - assert(track[1] == "foo" and track[2] == "x" and track[3] == "xx" and - track[4] == "x0") -end - - -local function checktable (t1, t2) - assert(#t1 == #t2) - for i = 1, #t1 do - assert(t1[i] == t2[i]) - end -end - - -do -- test for tbc variable high in the stack - - -- function to force a stack overflow - local function overflow (n) - overflow(n + 1) - end - - -- error handler will create tbc variable handling a stack overflow, - -- high in the stack - local function errorh (m) - assert(string.find(m, "stack overflow")) - local x = func2close(function (o) o[1] = 10 end) - return x - end - - local flag - local st, obj - -- run test in a coroutine so as not to swell the main stack - local co = coroutine.wrap(function () - -- tbc variable down the stack - local y = func2close(function (obj, msg) - assert(msg == nil) - obj[1] = 100 - flag = obj - end) - tracegc.stop() - st, obj = xpcall(overflow, errorh, 0) - tracegc.start() - end) - co() - assert(not st and obj[1] == 10 and flag[1] == 100) -end - - -if rawget(_G, "T") then - - do - -- bug in 5.4.3 - -- 'lua_settop' may use a pointer to stack invalidated by 'luaF_close' - - -- reduce stack size - collectgarbage(); collectgarbage(); collectgarbage() - - -- force a stack reallocation - local function loop (n) - if n < 400 then loop(n + 1) end - end - - -- close metamethod will reallocate the stack - local o = setmetatable({}, {__close = function () loop(0) end}) - - local script = [[toclose 2; settop 1; return 1]] - - assert(T.testC(script, o) == script) - - end - - - -- memory error inside closing function - local function foo () - local y = func2close(function () T.alloccount() end) - local x = setmetatable({}, {__close = function () - T.alloccount(0); local x = {} -- force a memory error - end}) - error(1000) -- common error inside the function's body - end - - stack(5) -- ensure a minimal number of CI structures - - -- despite memory error, 'y' will be executed and - -- memory limit will be lifted - local _, msg = pcall(foo) - assert(msg == "not enough memory") - - local closemsg - local close = func2close(function (self, msg) - T.alloccount() - closemsg = msg - end) - - -- set a memory limit and return a closing object to remove the limit - local function enter (count) - stack(10) -- reserve some stack space - T.alloccount(count) - closemsg = nil - return close - end - - local function test () - local x = enter(0) -- set a memory limit - local y = {} -- raise a memory error - end - - local _, msg = pcall(test) - assert(msg == "not enough memory" and closemsg == "not enough memory") - - - -- repeat test with extra closing upvalues - local function test () - local xxx = func2close(function (self, msg) - assert(msg == "not enough memory"); - error(1000) -- raise another error - end) - local xx = func2close(function (self, msg) - assert(msg == "not enough memory"); - end) - local x = enter(0) -- set a memory limit - local y = {} -- raise a memory error - end - - local _, msg = pcall(test) - assert(msg == 1000 and closemsg == "not enough memory") - - do -- testing 'toclose' in C string buffer - collectgarbage() - local s = string.rep('a', 10000) -- large string - local m = T.totalmem() - collectgarbage("stop") - s = string.upper(s) -- allocate buffer + new string (10K each) - -- ensure buffer was deallocated - assert(T.totalmem() - m <= 11000) - collectgarbage("restart") - end - - do -- now some tests for freeing buffer in case of errors - local lim = 10000 -- some size larger than the static buffer - local extra = 2000 -- some extra memory (for callinfo, etc.) - - local s = string.rep("a", lim) - - -- concat this table needs two buffer resizes (one for each 's') - local a = {s, s} - - collectgarbage(); collectgarbage() - - local m = T.totalmem() - collectgarbage("stop") - - -- error in the first buffer allocation - T. totalmem(m + extra) - assert(not pcall(table.concat, a)) - -- first buffer was not even allocated - assert(T.totalmem() - m <= extra) - - -- error in the second buffer allocation - T. totalmem(m + lim + extra) - assert(not pcall(table.concat, a)) - -- first buffer was released by 'toclose' - assert(T.totalmem() - m <= extra) - - -- error in creation of final string - T.totalmem(m + 2 * lim + extra) - assert(not pcall(table.concat, a)) - -- second buffer was released by 'toclose' - assert(T.totalmem() - m <= extra) - - -- userdata, buffer, buffer, final string - T.totalmem(m + 4*lim + extra) - assert(#table.concat(a) == 2*lim) - - T.totalmem(0) -- remove memory limit - collectgarbage("restart") - - print'+' - end - - - do - -- '__close' vs. return hooks in C functions - local trace = {} - - local function hook (event) - trace[#trace + 1] = event .. " " .. (debug.getinfo(2).name or "?") - end - - -- create tbc variables to be used by C function - local x = func2close(function (_,msg) - trace[#trace + 1] = "x" - end) - - local y = func2close(function (_,msg) - trace[#trace + 1] = "y" - end) - - debug.sethook(hook, "r") - local t = {T.testC([[ - toclose 2 # x - pushnum 10 - pushint 20 - toclose 3 # y - return 2 - ]], x, y)} - debug.sethook() - - -- hooks ran before return hook from 'testC' - checktable(trace, - {"return sethook", "y", "return ?", "x", "return ?", "return testC"}) - -- results are correct - checktable(t, {10, 20}) - end -end - - -do -- '__close' vs. return hooks in Lua functions - local trace = {} - - local function hook (event) - trace[#trace + 1] = event .. " " .. debug.getinfo(2).name - end - - local function foo (...) - local x = func2close(function (_,msg) - trace[#trace + 1] = "x" - end) - - local y = func2close(function (_,msg) - debug.sethook(hook, "r") - end) - - return ... - end - - local t = {foo(10,20,30)} - debug.sethook() - checktable(t, {10, 20, 30}) - checktable(trace, - {"return sethook", "return close", "x", "return close", "return foo"}) -end - - -print "to-be-closed variables in coroutines" - -do - -- yielding inside closing metamethods - - local trace = {} - local co = coroutine.wrap(function () - - trace[#trace + 1] = "nowX" - - -- will be closed after 'y' - local x = func2close(function (_, msg) - assert(msg == nil) - trace[#trace + 1] = "x1" - coroutine.yield("x") - trace[#trace + 1] = "x2" - end) - - return pcall(function () - do -- 'z' will be closed first - local z = func2close(function (_, msg) - assert(msg == nil) - trace[#trace + 1] = "z1" - coroutine.yield("z") - trace[#trace + 1] = "z2" - end) - end - - trace[#trace + 1] = "nowY" - - -- will be closed after 'z' - local y = func2close(function(_, msg) - assert(msg == nil) - trace[#trace + 1] = "y1" - coroutine.yield("y") - trace[#trace + 1] = "y2" - end) - - return 10, 20, 30 - end) - end) - - assert(co() == "z") - assert(co() == "y") - assert(co() == "x") - checktable({co()}, {true, 10, 20, 30}) - checktable(trace, {"nowX", "z1", "z2", "nowY", "y1", "y2", "x1", "x2"}) - -end - - -do - -- yielding inside closing metamethods while returning - -- (bug in 5.4.3) - - local extrares -- result from extra yield (if any) - - local function check (body, extra, ...) - local t = table.pack(...) -- expected returns - local co = coroutine.wrap(body) - if extra then - extrares = co() -- runs until first (extra) yield - end - local res = table.pack(co()) -- runs until yield inside '__close' - assert(res.n == 2 and res[2] == nil) - local res2 = table.pack(co()) -- runs until end of function - assert(res2.n == t.n) - for i = 1, #t do - if t[i] == "x" then - assert(res2[i] == res[1]) -- value that was closed - else - assert(res2[i] == t[i]) - end - end - end - - local function foo () - local x = func2close(coroutine.yield) - local extra = func2close(function (self) - assert(self == extrares) - coroutine.yield(100) - end) - extrares = extra - return table.unpack{10, x, 30} - end - check(foo, true, 10, "x", 30) - assert(extrares == 100) - - local function foo () - local x = func2close(coroutine.yield) - return - end - check(foo, false) - - local function foo () - local x = func2close(coroutine.yield) - local y, z = 20, 30 - return x - end - check(foo, false, "x") - - local function foo () - local x = func2close(coroutine.yield) - local extra = func2close(coroutine.yield) - return table.unpack({}, 1, 100) -- 100 nils - end - check(foo, true, table.unpack({}, 1, 100)) - -end - -do - -- yielding inside closing metamethods after an error - - local co = coroutine.wrap(function () - - local function foo (err) - - local z = func2close(function(_, msg) - assert(msg == nil or msg == err + 20) - coroutine.yield("z") - return 100, 200 - end) - - local y = func2close(function(_, msg) - -- still gets the original error (if any) - assert(msg == err or (msg == nil and err == 1)) - coroutine.yield("y") - if err then error(err + 20) end -- creates or changes the error - end) - - local x = func2close(function(_, msg) - assert(msg == err or (msg == nil and err == 1)) - coroutine.yield("x") - return 100, 200 - end) - - if err == 10 then error(err) else return 10, 20 end - end - - coroutine.yield(pcall(foo, nil)) -- no error - coroutine.yield(pcall(foo, 1)) -- error in __close - return pcall(foo, 10) -- 'foo' will raise an error - end) - - local a, b = co() -- first foo: no error - assert(a == "x" and b == nil) -- yields inside 'x'; Ok - a, b = co() - assert(a == "y" and b == nil) -- yields inside 'y'; Ok - a, b = co() - assert(a == "z" and b == nil) -- yields inside 'z'; Ok - local a, b, c = co() - assert(a and b == 10 and c == 20) -- returns from 'pcall(foo, nil)' - - local a, b = co() -- second foo: error in __close - assert(a == "x" and b == nil) -- yields inside 'x'; Ok - a, b = co() - assert(a == "y" and b == nil) -- yields inside 'y'; Ok - a, b = co() - assert(a == "z" and b == nil) -- yields inside 'z'; Ok - local st, msg = co() -- reports the error in 'y' - assert(not st and msg == 21) - - local a, b = co() -- third foo: error in function body - assert(a == "x" and b == nil) -- yields inside 'x'; Ok - a, b = co() - assert(a == "y" and b == nil) -- yields inside 'y'; Ok - a, b = co() - assert(a == "z" and b == nil) -- yields inside 'z'; Ok - local st, msg = co() -- gets final error - assert(not st and msg == 10 + 20) - -end - - -do - -- an error in a wrapped coroutine closes variables - local x = false - local y = false - local co = coroutine.wrap(function () - local xv = func2close(function () x = true end) - do - local yv = func2close(function () y = true end) - coroutine.yield(100) -- yield doesn't close variable - end - coroutine.yield(200) -- yield doesn't close variable - error(23) -- error does - end) - - local b = co() - assert(b == 100 and not x and not y) - b = co() - assert(b == 200 and not x and y) - local a, b = pcall(co) - assert(not a and b == 23 and x and y) -end - - -do - - -- error in a wrapped coroutine raising errors when closing a variable - local x = 0 - local co = coroutine.wrap(function () - local xx = func2close(function (_, msg) - x = x + 1; - assert(string.find(msg, "@XXX")) - error("@YYY") - end) - local xv = func2close(function () x = x + 1; error("@XXX") end) - coroutine.yield(100) - error(200) - end) - assert(co() == 100); assert(x == 0) - local st, msg = pcall(co); assert(x == 2) - assert(not st and string.find(msg, "@YYY")) -- should get error raised - - local x = 0 - local y = 0 - co = coroutine.wrap(function () - local xx = func2close(function (_, err) - y = y + 1; - assert(string.find(err, "XXX")) - error("YYY") - end) - local xv = func2close(function () - x = x + 1; error("XXX") - end) - coroutine.yield(100) - return 200 - end) - assert(co() == 100); assert(x == 0) - local st, msg = pcall(co) - assert(x == 1 and y == 1) - -- should get first error raised - assert(not st and string.find(msg, "%w+%.%w+:%d+: YYY")) - -end - - --- a suspended coroutine should not close its variables when collected -local co -co = coroutine.wrap(function() - -- should not run - local x = func2close(function () os.exit(false) end) - co = nil - coroutine.yield() -end) -co() -- start coroutine -assert(co == nil) -- eventually it will be collected -collectgarbage() - - -if rawget(_G, "T") then - print("to-be-closed variables x coroutines in C") - do - local token = 0 - local count = 0 - local f = T.makeCfunc[[ - toclose 1 - toclose 2 - return . - ]] - - local obj = func2close(function (_, msg) - count = count + 1 - token = coroutine.yield(count, token) - end) - - local co = coroutine.wrap(f) - local ct, res = co(obj, obj, 10, 20, 30, 3) -- will return 10, 20, 30 - -- initial token value, after closing 2nd obj - assert(ct == 1 and res == 0) - -- run until yield when closing 1st obj - ct, res = co(100) - assert(ct == 2 and res == 100) - res = {co(200)} -- run until end - assert(res[1] == 10 and res[2] == 20 and res[3] == 30 and res[4] == nil) - assert(token == 200) - end - - do - local f = T.makeCfunc[[ - toclose 1 - return . - ]] - - local obj = func2close(function () - local temp - local x = func2close(function () - coroutine.yield(temp) - return 1,2,3 -- to be ignored - end) - temp = coroutine.yield("closing obj") - return 1,2,3 -- to be ignored - end) - - local co = coroutine.wrap(f) - local res = co(obj, 10, 30, 1) -- will return only 30 - assert(res == "closing obj") - res = co("closing x") - assert(res == "closing x") - res = {co()} - assert(res[1] == 30 and res[2] == nil) - end - - do - -- still cannot yield inside 'closeslot' - local f = T.makeCfunc[[ - toclose 1 - closeslot 1 - ]] - local obj = func2close(coroutine.yield) - local co = coroutine.create(f) - local st, msg = coroutine.resume(co, obj) - assert(not st and string.find(msg, "attempt to yield across")) - - -- nor outside a coroutine - local f = T.makeCfunc[[ - toclose 1 - ]] - local st, msg = pcall(f, obj) - assert(not st and string.find(msg, "attempt to yield from outside")) - end -end - - - --- to-be-closed variables in generic for loops -do - local numopen = 0 - local function open (x) - numopen = numopen + 1 - return - function () -- iteraction function - x = x - 1 - if x > 0 then return x end - end, - nil, -- state - nil, -- control variable - func2close(function () numopen = numopen - 1 end) -- closing function - end - - local s = 0 - for i in open(10) do - s = s + i - end - assert(s == 45 and numopen == 0) - - local s = 0 - for i in open(10) do - if i < 5 then break end - s = s + i - end - assert(s == 35 and numopen == 0) - - local s = 0 - for i in open(10) do - for j in open(10) do - if i + j < 5 then goto endloop end - s = s + i - end - end - ::endloop:: - assert(s == 375 and numopen == 0) -end - -print('OK') - -return 5,f - -end -- } - diff --git a/lua-5.4.7-tests/ltests/ltests.c b/lua-5.4.7-tests/ltests/ltests.c deleted file mode 100644 index a27cdb0..0000000 --- a/lua-5.4.7-tests/ltests/ltests.c +++ /dev/null @@ -1,1983 +0,0 @@ -/* -** $Id: ltests.c $ -** Internal Module for Debugging of the Lua Implementation -** See Copyright Notice in lua.h -*/ - -#define ltests_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include -#include -#include -#include - -#include "lua.h" - -#include "lapi.h" -#include "lauxlib.h" -#include "lcode.h" -#include "lctype.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lopcodes.h" -#include "lopnames.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "lualib.h" - - - -/* -** The whole module only makes sense with LUA_DEBUG on -*/ -#if defined(LUA_DEBUG) - - -void *l_Trick = 0; - - -#define obj_at(L,k) s2v(L->ci->func.p + (k)) - - -static int runC (lua_State *L, lua_State *L1, const char *pc); - - -static void setnameval (lua_State *L, const char *name, int val) { - lua_pushinteger(L, val); - lua_setfield(L, -2, name); -} - - -static void pushobject (lua_State *L, const TValue *o) { - setobj2s(L, L->top.p, o); - api_incr_top(L); -} - - -static void badexit (const char *fmt, const char *s1, const char *s2) { - fprintf(stderr, fmt, s1); - if (s2) - fprintf(stderr, "extra info: %s\n", s2); - /* avoid assertion failures when exiting */ - l_memcontrol.numblocks = l_memcontrol.total = 0; - exit(EXIT_FAILURE); -} - - -static int tpanic (lua_State *L) { - const char *msg = (lua_type(L, -1) == LUA_TSTRING) - ? lua_tostring(L, -1) - : "error object is not a string"; - return (badexit("PANIC: unprotected error in call to Lua API (%s)\n", - msg, NULL), - 0); /* do not return to Lua */ -} - - -/* -** Warning function for tests. First, it concatenates all parts of -** a warning in buffer 'buff'. Then, it has three modes: -** - 0.normal: messages starting with '#' are shown on standard output; -** - other messages abort the tests (they represent real warning -** conditions; the standard tests should not generate these conditions -** unexpectedly); -** - 1.allow: all messages are shown; -** - 2.store: all warnings go to the global '_WARN'; -*/ -static void warnf (void *ud, const char *msg, int tocont) { - lua_State *L = cast(lua_State *, ud); - static char buff[200] = ""; /* should be enough for tests... */ - static int onoff = 0; - static int mode = 0; /* start in normal mode */ - static int lasttocont = 0; - if (!lasttocont && !tocont && *msg == '@') { /* control message? */ - if (buff[0] != '\0') - badexit("Control warning during warning: %s\naborting...\n", msg, buff); - if (strcmp(msg, "@off") == 0) - onoff = 0; - else if (strcmp(msg, "@on") == 0) - onoff = 1; - else if (strcmp(msg, "@normal") == 0) - mode = 0; - else if (strcmp(msg, "@allow") == 0) - mode = 1; - else if (strcmp(msg, "@store") == 0) - mode = 2; - else - badexit("Invalid control warning in test mode: %s\naborting...\n", - msg, NULL); - return; - } - lasttocont = tocont; - if (strlen(msg) >= sizeof(buff) - strlen(buff)) - badexit("warnf-buffer overflow (%s)\n", msg, buff); - strcat(buff, msg); /* add new message to current warning */ - if (!tocont) { /* message finished? */ - lua_unlock(L); - luaL_checkstack(L, 1, "warn stack space"); - lua_getglobal(L, "_WARN"); - if (!lua_toboolean(L, -1)) - lua_pop(L, 1); /* ok, no previous unexpected warning */ - else { - badexit("Unhandled warning in store mode: %s\naborting...\n", - lua_tostring(L, -1), buff); - } - lua_lock(L); - switch (mode) { - case 0: { /* normal */ - if (buff[0] != '#' && onoff) /* unexpected warning? */ - badexit("Unexpected warning in test mode: %s\naborting...\n", - buff, NULL); - } /* FALLTHROUGH */ - case 1: { /* allow */ - if (onoff) - fprintf(stderr, "Lua warning: %s\n", buff); /* print warning */ - break; - } - case 2: { /* store */ - lua_unlock(L); - luaL_checkstack(L, 1, "warn stack space"); - lua_pushstring(L, buff); - lua_setglobal(L, "_WARN"); /* assign message to global '_WARN' */ - lua_lock(L); - break; - } - } - buff[0] = '\0'; /* prepare buffer for next warning */ - } -} - - -/* -** {====================================================================== -** Controlled version for realloc. -** ======================================================================= -*/ - -#define MARK 0x55 /* 01010101 (a nice pattern) */ - -typedef union Header { - LUAI_MAXALIGN; - struct { - size_t size; - int type; - } d; -} Header; - - -#if !defined(EXTERNMEMCHECK) - -/* full memory check */ -#define MARKSIZE 16 /* size of marks after each block */ -#define fillmem(mem,size) memset(mem, -MARK, size) - -#else - -/* external memory check: don't do it twice */ -#define MARKSIZE 0 -#define fillmem(mem,size) /* empty */ - -#endif - - -Memcontrol l_memcontrol = - {0, 0UL, 0UL, 0UL, 0UL, (~0UL), - {0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL}}; - - -static void freeblock (Memcontrol *mc, Header *block) { - if (block) { - size_t size = block->d.size; - int i; - for (i = 0; i < MARKSIZE; i++) /* check marks after block */ - lua_assert(*(cast_charp(block + 1) + size + i) == MARK); - mc->objcount[block->d.type]--; - fillmem(block, sizeof(Header) + size + MARKSIZE); /* erase block */ - free(block); /* actually free block */ - mc->numblocks--; /* update counts */ - mc->total -= size; - } -} - - -void *debug_realloc (void *ud, void *b, size_t oldsize, size_t size) { - Memcontrol *mc = cast(Memcontrol *, ud); - Header *block = cast(Header *, b); - int type; - if (mc->memlimit == 0) { /* first time? */ - char *limit = getenv("MEMLIMIT"); /* initialize memory limit */ - mc->memlimit = limit ? strtoul(limit, NULL, 10) : ULONG_MAX; - } - if (block == NULL) { - type = (oldsize < LUA_NUMTAGS) ? oldsize : 0; - oldsize = 0; - } - else { - block--; /* go to real header */ - type = block->d.type; - lua_assert(oldsize == block->d.size); - } - if (size == 0) { - freeblock(mc, block); - return NULL; - } - if (mc->failnext) { - mc->failnext = 0; - return NULL; /* fake a single memory allocation error */ - } - if (mc->countlimit != ~0UL && size != oldsize) { /* count limit in use? */ - if (mc->countlimit == 0) - return NULL; /* fake a memory allocation error */ - mc->countlimit--; - } - if (size > oldsize && mc->total+size-oldsize > mc->memlimit) - return NULL; /* fake a memory allocation error */ - else { - Header *newblock; - int i; - size_t commonsize = (oldsize < size) ? oldsize : size; - size_t realsize = sizeof(Header) + size + MARKSIZE; - if (realsize < size) return NULL; /* arithmetic overflow! */ - newblock = cast(Header *, malloc(realsize)); /* alloc a new block */ - if (newblock == NULL) - return NULL; /* really out of memory? */ - if (block) { - memcpy(newblock + 1, block + 1, commonsize); /* copy old contents */ - freeblock(mc, block); /* erase (and check) old copy */ - } - /* initialize new part of the block with something weird */ - fillmem(cast_charp(newblock + 1) + commonsize, size - commonsize); - /* initialize marks after block */ - for (i = 0; i < MARKSIZE; i++) - *(cast_charp(newblock + 1) + size + i) = MARK; - newblock->d.size = size; - newblock->d.type = type; - mc->total += size; - if (mc->total > mc->maxmem) - mc->maxmem = mc->total; - mc->numblocks++; - mc->objcount[type]++; - return newblock + 1; - } -} - - -/* }====================================================================== */ - - - -/* -** {===================================================================== -** Functions to check memory consistency. -** Most of these checks are done through asserts, so this code does -** not make sense with asserts off. For this reason, it uses 'assert' -** directly, instead of 'lua_assert'. -** ====================================================================== -*/ - -#include - -/* -** Check GC invariants. For incremental mode, a black object cannot -** point to a white one. For generational mode, really old objects -** cannot point to young objects. Both old1 and touched2 objects -** cannot point to new objects (but can point to survivals). -** (Threads and open upvalues, despite being marked "really old", -** continue to be visited in all collections, and therefore can point to -** new objects. They, and only they, are old but gray.) -*/ -static int testobjref1 (global_State *g, GCObject *f, GCObject *t) { - if (isdead(g,t)) return 0; - if (issweepphase(g)) - return 1; /* no invariants */ - else if (g->gckind == KGC_INC) - return !(isblack(f) && iswhite(t)); /* basic incremental invariant */ - else { /* generational mode */ - if ((getage(f) == G_OLD && isblack(f)) && !isold(t)) - return 0; - if (((getage(f) == G_OLD1 || getage(f) == G_TOUCHED2) && isblack(f)) && - getage(t) == G_NEW) - return 0; - return 1; - } -} - - -static void printobj (global_State *g, GCObject *o) { - printf("||%s(%p)-%c%c(%02X)||", - ttypename(novariant(o->tt)), (void *)o, - isdead(g,o) ? 'd' : isblack(o) ? 'b' : iswhite(o) ? 'w' : 'g', - "ns01oTt"[getage(o)], o->marked); - if (o->tt == LUA_VSHRSTR || o->tt == LUA_VLNGSTR) - printf(" '%s'", getstr(gco2ts(o))); -} - - -void lua_printobj (lua_State *L, struct GCObject *o) { - printobj(G(L), o); -} - -static int testobjref (global_State *g, GCObject *f, GCObject *t) { - int r1 = testobjref1(g, f, t); - if (!r1) { - printf("%d(%02X) - ", g->gcstate, g->currentwhite); - printobj(g, f); - printf(" -> "); - printobj(g, t); - printf("\n"); - } - return r1; -} - - -static void checkobjref (global_State *g, GCObject *f, GCObject *t) { - assert(testobjref(g, f, t)); -} - - -/* -** Version where 't' can be NULL. In that case, it should not apply the -** macro 'obj2gco' over the object. ('t' may have several types, so this -** definition must be a macro.) Most checks need this version, because -** the check may run while an object is still being created. -*/ -#define checkobjrefN(g,f,t) { if (t) checkobjref(g,f,obj2gco(t)); } - - -static void checkvalref (global_State *g, GCObject *f, const TValue *t) { - assert(!iscollectable(t) || (righttt(t) && testobjref(g, f, gcvalue(t)))); -} - - -static void checktable (global_State *g, Table *h) { - unsigned int i; - unsigned int asize = luaH_realasize(h); - Node *n, *limit = gnode(h, sizenode(h)); - GCObject *hgc = obj2gco(h); - checkobjrefN(g, hgc, h->metatable); - for (i = 0; i < asize; i++) - checkvalref(g, hgc, &h->array[i]); - for (n = gnode(h, 0); n < limit; n++) { - if (!isempty(gval(n))) { - TValue k; - getnodekey(g->mainthread, &k, n); - assert(!keyisnil(n)); - checkvalref(g, hgc, &k); - checkvalref(g, hgc, gval(n)); - } - } -} - - -static void checkudata (global_State *g, Udata *u) { - int i; - GCObject *hgc = obj2gco(u); - checkobjrefN(g, hgc, u->metatable); - for (i = 0; i < u->nuvalue; i++) - checkvalref(g, hgc, &u->uv[i].uv); -} - - -static void checkproto (global_State *g, Proto *f) { - int i; - GCObject *fgc = obj2gco(f); - checkobjrefN(g, fgc, f->source); - for (i=0; isizek; i++) { - if (iscollectable(f->k + i)) - checkobjref(g, fgc, gcvalue(f->k + i)); - } - for (i=0; isizeupvalues; i++) - checkobjrefN(g, fgc, f->upvalues[i].name); - for (i=0; isizep; i++) - checkobjrefN(g, fgc, f->p[i]); - for (i=0; isizelocvars; i++) - checkobjrefN(g, fgc, f->locvars[i].varname); -} - - -static void checkCclosure (global_State *g, CClosure *cl) { - GCObject *clgc = obj2gco(cl); - int i; - for (i = 0; i < cl->nupvalues; i++) - checkvalref(g, clgc, &cl->upvalue[i]); -} - - -static void checkLclosure (global_State *g, LClosure *cl) { - GCObject *clgc = obj2gco(cl); - int i; - checkobjrefN(g, clgc, cl->p); - for (i=0; inupvalues; i++) { - UpVal *uv = cl->upvals[i]; - if (uv) { - checkobjrefN(g, clgc, uv); - if (!upisopen(uv)) - checkvalref(g, obj2gco(uv), uv->v.p); - } - } -} - - -static int lua_checkpc (CallInfo *ci) { - if (!isLua(ci)) return 1; - else { - StkId f = ci->func.p; - Proto *p = clLvalue(s2v(f))->p; - return p->code <= ci->u.l.savedpc && - ci->u.l.savedpc <= p->code + p->sizecode; - } -} - - -static void checkstack (global_State *g, lua_State *L1) { - StkId o; - CallInfo *ci; - UpVal *uv; - assert(!isdead(g, L1)); - if (L1->stack.p == NULL) { /* incomplete thread? */ - assert(L1->openupval == NULL && L1->ci == NULL); - return; - } - for (uv = L1->openupval; uv != NULL; uv = uv->u.open.next) - assert(upisopen(uv)); /* must be open */ - assert(L1->top.p <= L1->stack_last.p); - assert(L1->tbclist.p <= L1->top.p); - for (ci = L1->ci; ci != NULL; ci = ci->previous) { - assert(ci->top.p <= L1->stack_last.p); - assert(lua_checkpc(ci)); - } - for (o = L1->stack.p; o < L1->stack_last.p; o++) - checkliveness(L1, s2v(o)); /* entire stack must have valid values */ -} - - -static void checkrefs (global_State *g, GCObject *o) { - switch (o->tt) { - case LUA_VUSERDATA: { - checkudata(g, gco2u(o)); - break; - } - case LUA_VUPVAL: { - checkvalref(g, o, gco2upv(o)->v.p); - break; - } - case LUA_VTABLE: { - checktable(g, gco2t(o)); - break; - } - case LUA_VTHREAD: { - checkstack(g, gco2th(o)); - break; - } - case LUA_VLCL: { - checkLclosure(g, gco2lcl(o)); - break; - } - case LUA_VCCL: { - checkCclosure(g, gco2ccl(o)); - break; - } - case LUA_VPROTO: { - checkproto(g, gco2p(o)); - break; - } - case LUA_VSHRSTR: - case LUA_VLNGSTR: { - assert(!isgray(o)); /* strings are never gray */ - break; - } - default: assert(0); - } -} - - -/* -** Check consistency of an object: -** - Dead objects can only happen in the 'allgc' list during a sweep -** phase (controlled by the caller through 'maybedead'). -** - During pause, all objects must be white. -** - In generational mode: -** * objects must be old enough for their lists ('listage'). -** * old objects cannot be white. -** * old objects must be black, except for 'touched1', 'old0', -** threads, and open upvalues. -*/ -static void checkobject (global_State *g, GCObject *o, int maybedead, - int listage) { - if (isdead(g, o)) - assert(maybedead); - else { - assert(g->gcstate != GCSpause || iswhite(o)); - if (g->gckind == KGC_GEN) { /* generational mode? */ - assert(getage(o) >= listage); - assert(!iswhite(o) || !isold(o)); - if (isold(o)) { - assert(isblack(o) || - getage(o) == G_TOUCHED1 || - getage(o) == G_OLD0 || - o->tt == LUA_VTHREAD || - (o->tt == LUA_VUPVAL && upisopen(gco2upv(o)))); - } - } - checkrefs(g, o); - } -} - - -static lu_mem checkgraylist (global_State *g, GCObject *o) { - int total = 0; /* count number of elements in the list */ - cast_void(g); /* better to keep it if we need to print an object */ - while (o) { - assert(!!isgray(o) ^ (getage(o) == G_TOUCHED2)); - assert(!testbit(o->marked, TESTBIT)); - if (keepinvariant(g)) - l_setbit(o->marked, TESTBIT); /* mark that object is in a gray list */ - total++; - switch (o->tt) { - case LUA_VTABLE: o = gco2t(o)->gclist; break; - case LUA_VLCL: o = gco2lcl(o)->gclist; break; - case LUA_VCCL: o = gco2ccl(o)->gclist; break; - case LUA_VTHREAD: o = gco2th(o)->gclist; break; - case LUA_VPROTO: o = gco2p(o)->gclist; break; - case LUA_VUSERDATA: - assert(gco2u(o)->nuvalue > 0); - o = gco2u(o)->gclist; - break; - default: assert(0); /* other objects cannot be in a gray list */ - } - } - return total; -} - - -/* -** Check objects in gray lists. -*/ -static lu_mem checkgrays (global_State *g) { - int total = 0; /* count number of elements in all lists */ - if (!keepinvariant(g)) return total; - total += checkgraylist(g, g->gray); - total += checkgraylist(g, g->grayagain); - total += checkgraylist(g, g->weak); - total += checkgraylist(g, g->allweak); - total += checkgraylist(g, g->ephemeron); - return total; -} - - -/* -** Check whether 'o' should be in a gray list. If so, increment -** 'count' and check its TESTBIT. (It must have been previously set by -** 'checkgraylist'.) -*/ -static void incifingray (global_State *g, GCObject *o, lu_mem *count) { - if (!keepinvariant(g)) - return; /* gray lists not being kept in these phases */ - if (o->tt == LUA_VUPVAL) { - /* only open upvalues can be gray */ - assert(!isgray(o) || upisopen(gco2upv(o))); - return; /* upvalues are never in gray lists */ - } - /* these are the ones that must be in gray lists */ - if (isgray(o) || getage(o) == G_TOUCHED2) { - (*count)++; - assert(testbit(o->marked, TESTBIT)); - resetbit(o->marked, TESTBIT); /* prepare for next cycle */ - } -} - - -static lu_mem checklist (global_State *g, int maybedead, int tof, - GCObject *newl, GCObject *survival, GCObject *old, GCObject *reallyold) { - GCObject *o; - lu_mem total = 0; /* number of object that should be in gray lists */ - for (o = newl; o != survival; o = o->next) { - checkobject(g, o, maybedead, G_NEW); - incifingray(g, o, &total); - assert(!tof == !tofinalize(o)); - } - for (o = survival; o != old; o = o->next) { - checkobject(g, o, 0, G_SURVIVAL); - incifingray(g, o, &total); - assert(!tof == !tofinalize(o)); - } - for (o = old; o != reallyold; o = o->next) { - checkobject(g, o, 0, G_OLD1); - incifingray(g, o, &total); - assert(!tof == !tofinalize(o)); - } - for (o = reallyold; o != NULL; o = o->next) { - checkobject(g, o, 0, G_OLD); - incifingray(g, o, &total); - assert(!tof == !tofinalize(o)); - } - return total; -} - - -int lua_checkmemory (lua_State *L) { - global_State *g = G(L); - GCObject *o; - int maybedead; - lu_mem totalin; /* total of objects that are in gray lists */ - lu_mem totalshould; /* total of objects that should be in gray lists */ - if (keepinvariant(g)) { - assert(!iswhite(g->mainthread)); - assert(!iswhite(gcvalue(&g->l_registry))); - } - assert(!isdead(g, gcvalue(&g->l_registry))); - assert(g->sweepgc == NULL || issweepphase(g)); - totalin = checkgrays(g); - - /* check 'fixedgc' list */ - for (o = g->fixedgc; o != NULL; o = o->next) { - assert(o->tt == LUA_VSHRSTR && isgray(o) && getage(o) == G_OLD); - } - - /* check 'allgc' list */ - maybedead = (GCSatomic < g->gcstate && g->gcstate <= GCSswpallgc); - totalshould = checklist(g, maybedead, 0, g->allgc, - g->survival, g->old1, g->reallyold); - - /* check 'finobj' list */ - totalshould += checklist(g, 0, 1, g->finobj, - g->finobjsur, g->finobjold1, g->finobjrold); - - /* check 'tobefnz' list */ - for (o = g->tobefnz; o != NULL; o = o->next) { - checkobject(g, o, 0, G_NEW); - incifingray(g, o, &totalshould); - assert(tofinalize(o)); - assert(o->tt == LUA_VUSERDATA || o->tt == LUA_VTABLE); - } - if (keepinvariant(g)) - assert(totalin == totalshould); - return 0; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** Disassembler -** ======================================================= -*/ - - -static char *buildop (Proto *p, int pc, char *buff) { - char *obuff = buff; - Instruction i = p->code[pc]; - OpCode o = GET_OPCODE(i); - const char *name = opnames[o]; - int line = luaG_getfuncline(p, pc); - int lineinfo = (p->lineinfo != NULL) ? p->lineinfo[pc] : 0; - if (lineinfo == ABSLINEINFO) - buff += sprintf(buff, "(__"); - else - buff += sprintf(buff, "(%2d", lineinfo); - buff += sprintf(buff, " - %4d) %4d - ", line, pc); - switch (getOpMode(o)) { - case iABC: - sprintf(buff, "%-12s%4d %4d %4d%s", name, - GETARG_A(i), GETARG_B(i), GETARG_C(i), - GETARG_k(i) ? " (k)" : ""); - break; - case iABx: - sprintf(buff, "%-12s%4d %4d", name, GETARG_A(i), GETARG_Bx(i)); - break; - case iAsBx: - sprintf(buff, "%-12s%4d %4d", name, GETARG_A(i), GETARG_sBx(i)); - break; - case iAx: - sprintf(buff, "%-12s%4d", name, GETARG_Ax(i)); - break; - case isJ: - sprintf(buff, "%-12s%4d", name, GETARG_sJ(i)); - break; - } - return obuff; -} - - -#if 0 -void luaI_printcode (Proto *pt, int size) { - int pc; - for (pc=0; pcmaxstacksize); - setnameval(L, "numparams", p->numparams); - for (pc=0; pcsizecode; pc++) { - char buff[100]; - lua_pushinteger(L, pc+1); - lua_pushstring(L, buildop(p, pc, buff)); - lua_settable(L, -3); - } - return 1; -} - - -static int printcode (lua_State *L) { - int pc; - Proto *p; - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = getproto(obj_at(L, 1)); - printf("maxstack: %d\n", p->maxstacksize); - printf("numparams: %d\n", p->numparams); - for (pc=0; pcsizecode; pc++) { - char buff[100]; - printf("%s\n", buildop(p, pc, buff)); - } - return 0; -} - - -static int listk (lua_State *L) { - Proto *p; - int i; - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = getproto(obj_at(L, 1)); - lua_createtable(L, p->sizek, 0); - for (i=0; isizek; i++) { - pushobject(L, p->k+i); - lua_rawseti(L, -2, i+1); - } - return 1; -} - - -static int listabslineinfo (lua_State *L) { - Proto *p; - int i; - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = getproto(obj_at(L, 1)); - luaL_argcheck(L, p->abslineinfo != NULL, 1, "function has no debug info"); - lua_createtable(L, 2 * p->sizeabslineinfo, 0); - for (i=0; i < p->sizeabslineinfo; i++) { - lua_pushinteger(L, p->abslineinfo[i].pc); - lua_rawseti(L, -2, 2 * i + 1); - lua_pushinteger(L, p->abslineinfo[i].line); - lua_rawseti(L, -2, 2 * i + 2); - } - return 1; -} - - -static int listlocals (lua_State *L) { - Proto *p; - int pc = cast_int(luaL_checkinteger(L, 2)) - 1; - int i = 0; - const char *name; - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = getproto(obj_at(L, 1)); - while ((name = luaF_getlocalname(p, ++i, pc)) != NULL) - lua_pushstring(L, name); - return i-1; -} - -/* }====================================================== */ - - - -static void printstack (lua_State *L) { - int i; - int n = lua_gettop(L); - printf("stack: >>\n"); - for (i = 1; i <= n; i++) { - printf("%3d: %s\n", i, luaL_tolstring(L, i, NULL)); - lua_pop(L, 1); - } - printf("<<\n"); -} - - -static int get_limits (lua_State *L) { - lua_createtable(L, 0, 6); - setnameval(L, "IS32INT", LUAI_IS32INT); - setnameval(L, "MAXARG_Ax", MAXARG_Ax); - setnameval(L, "MAXARG_Bx", MAXARG_Bx); - setnameval(L, "OFFSET_sBx", OFFSET_sBx); - setnameval(L, "LFPF", LFIELDS_PER_FLUSH); - setnameval(L, "NUM_OPCODES", NUM_OPCODES); - return 1; -} - - -static int mem_query (lua_State *L) { - if (lua_isnone(L, 1)) { - lua_pushinteger(L, l_memcontrol.total); - lua_pushinteger(L, l_memcontrol.numblocks); - lua_pushinteger(L, l_memcontrol.maxmem); - return 3; - } - else if (lua_isnumber(L, 1)) { - unsigned long limit = cast(unsigned long, luaL_checkinteger(L, 1)); - if (limit == 0) limit = ULONG_MAX; - l_memcontrol.memlimit = limit; - return 0; - } - else { - const char *t = luaL_checkstring(L, 1); - int i; - for (i = LUA_NUMTAGS - 1; i >= 0; i--) { - if (strcmp(t, ttypename(i)) == 0) { - lua_pushinteger(L, l_memcontrol.objcount[i]); - return 1; - } - } - return luaL_error(L, "unknown type '%s'", t); - } -} - - -static int alloc_count (lua_State *L) { - if (lua_isnone(L, 1)) - l_memcontrol.countlimit = ~0L; - else - l_memcontrol.countlimit = luaL_checkinteger(L, 1); - return 0; -} - - -static int alloc_failnext (lua_State *L) { - UNUSED(L); - l_memcontrol.failnext = 1; - return 0; -} - - -static int settrick (lua_State *L) { - if (ttisnil(obj_at(L, 1))) - l_Trick = NULL; - else - l_Trick = gcvalue(obj_at(L, 1)); - return 0; -} - - -static int gc_color (lua_State *L) { - TValue *o; - luaL_checkany(L, 1); - o = obj_at(L, 1); - if (!iscollectable(o)) - lua_pushstring(L, "no collectable"); - else { - GCObject *obj = gcvalue(o); - lua_pushstring(L, isdead(G(L), obj) ? "dead" : - iswhite(obj) ? "white" : - isblack(obj) ? "black" : "gray"); - } - return 1; -} - - -static int gc_age (lua_State *L) { - TValue *o; - luaL_checkany(L, 1); - o = obj_at(L, 1); - if (!iscollectable(o)) - lua_pushstring(L, "no collectable"); - else { - static const char *gennames[] = {"new", "survival", "old0", "old1", - "old", "touched1", "touched2"}; - GCObject *obj = gcvalue(o); - lua_pushstring(L, gennames[getage(obj)]); - } - return 1; -} - - -static int gc_printobj (lua_State *L) { - TValue *o; - luaL_checkany(L, 1); - o = obj_at(L, 1); - if (!iscollectable(o)) - printf("no collectable\n"); - else { - GCObject *obj = gcvalue(o); - printobj(G(L), obj); - printf("\n"); - } - return 0; -} - - -static int gc_state (lua_State *L) { - static const char *statenames[] = { - "propagate", "atomic", "enteratomic", "sweepallgc", "sweepfinobj", - "sweeptobefnz", "sweepend", "callfin", "pause", ""}; - static const int states[] = { - GCSpropagate, GCSenteratomic, GCSatomic, GCSswpallgc, GCSswpfinobj, - GCSswptobefnz, GCSswpend, GCScallfin, GCSpause, -1}; - int option = states[luaL_checkoption(L, 1, "", statenames)]; - if (option == -1) { - lua_pushstring(L, statenames[G(L)->gcstate]); - return 1; - } - else { - global_State *g = G(L); - if (G(L)->gckind == KGC_GEN) - luaL_error(L, "cannot change states in generational mode"); - lua_lock(L); - if (option < g->gcstate) { /* must cross 'pause'? */ - luaC_runtilstate(L, bitmask(GCSpause)); /* run until pause */ - } - luaC_runtilstate(L, bitmask(option)); - lua_assert(G(L)->gcstate == option); - lua_unlock(L); - return 0; - } -} - - -static int hash_query (lua_State *L) { - if (lua_isnone(L, 2)) { - luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "string expected"); - lua_pushinteger(L, tsvalue(obj_at(L, 1))->hash); - } - else { - TValue *o = obj_at(L, 1); - Table *t; - luaL_checktype(L, 2, LUA_TTABLE); - t = hvalue(obj_at(L, 2)); - lua_pushinteger(L, luaH_mainposition(t, o) - t->node); - } - return 1; -} - - -static int stacklevel (lua_State *L) { - unsigned long a = 0; - lua_pushinteger(L, (L->top.p - L->stack.p)); - lua_pushinteger(L, stacksize(L)); - lua_pushinteger(L, L->nCcalls); - lua_pushinteger(L, L->nci); - lua_pushinteger(L, (unsigned long)&a); - return 5; -} - - -static int table_query (lua_State *L) { - const Table *t; - int i = cast_int(luaL_optinteger(L, 2, -1)); - unsigned int asize; - luaL_checktype(L, 1, LUA_TTABLE); - t = hvalue(obj_at(L, 1)); - asize = luaH_realasize(t); - if (i == -1) { - lua_pushinteger(L, asize); - lua_pushinteger(L, allocsizenode(t)); - lua_pushinteger(L, isdummy(t) ? 0 : t->lastfree - t->node); - lua_pushinteger(L, t->alimit); - return 4; - } - else if ((unsigned int)i < asize) { - lua_pushinteger(L, i); - pushobject(L, &t->array[i]); - lua_pushnil(L); - } - else if ((i -= asize) < sizenode(t)) { - TValue k; - getnodekey(L, &k, gnode(t, i)); - if (!isempty(gval(gnode(t, i))) || - ttisnil(&k) || - ttisnumber(&k)) { - pushobject(L, &k); - } - else - lua_pushliteral(L, ""); - pushobject(L, gval(gnode(t, i))); - if (gnext(&t->node[i]) != 0) - lua_pushinteger(L, gnext(&t->node[i])); - else - lua_pushnil(L); - } - return 3; -} - - -static int string_query (lua_State *L) { - stringtable *tb = &G(L)->strt; - int s = cast_int(luaL_optinteger(L, 1, 0)) - 1; - if (s == -1) { - lua_pushinteger(L ,tb->size); - lua_pushinteger(L ,tb->nuse); - return 2; - } - else if (s < tb->size) { - TString *ts; - int n = 0; - for (ts = tb->hash[s]; ts != NULL; ts = ts->u.hnext) { - setsvalue2s(L, L->top.p, ts); - api_incr_top(L); - n++; - } - return n; - } - else return 0; -} - - -static int tref (lua_State *L) { - int level = lua_gettop(L); - luaL_checkany(L, 1); - lua_pushvalue(L, 1); - lua_pushinteger(L, luaL_ref(L, LUA_REGISTRYINDEX)); - cast_void(level); /* to avoid warnings */ - lua_assert(lua_gettop(L) == level+1); /* +1 for result */ - return 1; -} - -static int getref (lua_State *L) { - int level = lua_gettop(L); - lua_rawgeti(L, LUA_REGISTRYINDEX, luaL_checkinteger(L, 1)); - cast_void(level); /* to avoid warnings */ - lua_assert(lua_gettop(L) == level+1); - return 1; -} - -static int unref (lua_State *L) { - int level = lua_gettop(L); - luaL_unref(L, LUA_REGISTRYINDEX, cast_int(luaL_checkinteger(L, 1))); - cast_void(level); /* to avoid warnings */ - lua_assert(lua_gettop(L) == level); - return 0; -} - - -static int upvalue (lua_State *L) { - int n = cast_int(luaL_checkinteger(L, 2)); - luaL_checktype(L, 1, LUA_TFUNCTION); - if (lua_isnone(L, 3)) { - const char *name = lua_getupvalue(L, 1, n); - if (name == NULL) return 0; - lua_pushstring(L, name); - return 2; - } - else { - const char *name = lua_setupvalue(L, 1, n); - lua_pushstring(L, name); - return 1; - } -} - - -static int newuserdata (lua_State *L) { - size_t size = cast_sizet(luaL_optinteger(L, 1, 0)); - int nuv = luaL_optinteger(L, 2, 0); - char *p = cast_charp(lua_newuserdatauv(L, size, nuv)); - while (size--) *p++ = '\0'; - return 1; -} - - -static int pushuserdata (lua_State *L) { - lua_Integer u = luaL_checkinteger(L, 1); - lua_pushlightuserdata(L, cast_voidp(cast_sizet(u))); - return 1; -} - - -static int udataval (lua_State *L) { - lua_pushinteger(L, cast(long, lua_touserdata(L, 1))); - return 1; -} - - -static int doonnewstack (lua_State *L) { - lua_State *L1 = lua_newthread(L); - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - int status = luaL_loadbuffer(L1, s, l, s); - if (status == LUA_OK) - status = lua_pcall(L1, 0, 0, 0); - lua_pushinteger(L, status); - return 1; -} - - -static int s2d (lua_State *L) { - lua_pushnumber(L, cast_num(*cast(const double *, luaL_checkstring(L, 1)))); - return 1; -} - - -static int d2s (lua_State *L) { - double d = cast(double, luaL_checknumber(L, 1)); - lua_pushlstring(L, cast_charp(&d), sizeof(d)); - return 1; -} - - -static int num2int (lua_State *L) { - lua_pushinteger(L, lua_tointeger(L, 1)); - return 1; -} - - -static int newstate (lua_State *L) { - void *ud; - lua_Alloc f = lua_getallocf(L, &ud); - lua_State *L1 = lua_newstate(f, ud); - if (L1) { - lua_atpanic(L1, tpanic); - lua_pushlightuserdata(L, L1); - } - else - lua_pushnil(L); - return 1; -} - - -static lua_State *getstate (lua_State *L) { - lua_State *L1 = cast(lua_State *, lua_touserdata(L, 1)); - luaL_argcheck(L, L1 != NULL, 1, "state expected"); - return L1; -} - - -static int loadlib (lua_State *L) { - static const luaL_Reg libs[] = { - {LUA_GNAME, luaopen_base}, - {"coroutine", luaopen_coroutine}, - {"debug", luaopen_debug}, - {"io", luaopen_io}, - {"os", luaopen_os}, - {"math", luaopen_math}, - {"string", luaopen_string}, - {"table", luaopen_table}, - {"T", luaB_opentests}, - {NULL, NULL} - }; - lua_State *L1 = getstate(L); - int i; - luaL_requiref(L1, "package", luaopen_package, 0); - lua_assert(lua_type(L1, -1) == LUA_TTABLE); - /* 'requiref' should not reload module already loaded... */ - luaL_requiref(L1, "package", NULL, 1); /* seg. fault if it reloads */ - /* ...but should return the same module */ - lua_assert(lua_compare(L1, -1, -2, LUA_OPEQ)); - luaL_getsubtable(L1, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); - for (i = 0; libs[i].name; i++) { - lua_pushcfunction(L1, libs[i].func); - lua_setfield(L1, -2, libs[i].name); - } - return 0; -} - -static int closestate (lua_State *L) { - lua_State *L1 = getstate(L); - lua_close(L1); - return 0; -} - -static int doremote (lua_State *L) { - lua_State *L1 = getstate(L); - size_t lcode; - const char *code = luaL_checklstring(L, 2, &lcode); - int status; - lua_settop(L1, 0); - status = luaL_loadbuffer(L1, code, lcode, code); - if (status == LUA_OK) - status = lua_pcall(L1, 0, LUA_MULTRET, 0); - if (status != LUA_OK) { - lua_pushnil(L); - lua_pushstring(L, lua_tostring(L1, -1)); - lua_pushinteger(L, status); - return 3; - } - else { - int i = 0; - while (!lua_isnone(L1, ++i)) - lua_pushstring(L, lua_tostring(L1, i)); - lua_pop(L1, i-1); - return i-1; - } -} - - -static int log2_aux (lua_State *L) { - unsigned int x = (unsigned int)luaL_checkinteger(L, 1); - lua_pushinteger(L, luaO_ceillog2(x)); - return 1; -} - - -struct Aux { jmp_buf jb; const char *paniccode; lua_State *L; }; - -/* -** does a long-jump back to "main program". -*/ -static int panicback (lua_State *L) { - struct Aux *b; - lua_checkstack(L, 1); /* open space for 'Aux' struct */ - lua_getfield(L, LUA_REGISTRYINDEX, "_jmpbuf"); /* get 'Aux' struct */ - b = (struct Aux *)lua_touserdata(L, -1); - lua_pop(L, 1); /* remove 'Aux' struct */ - runC(b->L, L, b->paniccode); /* run optional panic code */ - longjmp(b->jb, 1); - return 1; /* to avoid warnings */ -} - -static int checkpanic (lua_State *L) { - struct Aux b; - void *ud; - lua_State *L1; - const char *code = luaL_checkstring(L, 1); - lua_Alloc f = lua_getallocf(L, &ud); - b.paniccode = luaL_optstring(L, 2, ""); - b.L = L; - L1 = lua_newstate(f, ud); /* create new state */ - if (L1 == NULL) { /* error? */ - lua_pushnil(L); - return 1; - } - lua_atpanic(L1, panicback); /* set its panic function */ - lua_pushlightuserdata(L1, &b); - lua_setfield(L1, LUA_REGISTRYINDEX, "_jmpbuf"); /* store 'Aux' struct */ - if (setjmp(b.jb) == 0) { /* set jump buffer */ - runC(L, L1, code); /* run code unprotected */ - lua_pushliteral(L, "no errors"); - } - else { /* error handling */ - /* move error message to original state */ - lua_pushstring(L, lua_tostring(L1, -1)); - } - lua_close(L1); - return 1; -} - - - -/* -** {==================================================================== -** function to test the API with C. It interprets a kind of assembler -** language with calls to the API, so the test can be driven by Lua code -** ===================================================================== -*/ - - -static void sethookaux (lua_State *L, int mask, int count, const char *code); - -static const char *const delimits = " \t\n,;"; - -static void skip (const char **pc) { - for (;;) { - if (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; - else if (**pc == '#') { /* comment? */ - while (**pc != '\n' && **pc != '\0') (*pc)++; /* until end-of-line */ - } - else break; - } -} - -static int getnum_aux (lua_State *L, lua_State *L1, const char **pc) { - int res = 0; - int sig = 1; - skip(pc); - if (**pc == '.') { - res = cast_int(lua_tointeger(L1, -1)); - lua_pop(L1, 1); - (*pc)++; - return res; - } - else if (**pc == '*') { - res = lua_gettop(L1); - (*pc)++; - return res; - } - else if (**pc == '-') { - sig = -1; - (*pc)++; - } - if (!lisdigit(cast_uchar(**pc))) - luaL_error(L, "number expected (%s)", *pc); - while (lisdigit(cast_uchar(**pc))) res = res*10 + (*(*pc)++) - '0'; - return sig*res; -} - -static const char *getstring_aux (lua_State *L, char *buff, const char **pc) { - int i = 0; - skip(pc); - if (**pc == '"' || **pc == '\'') { /* quoted string? */ - int quote = *(*pc)++; - while (**pc != quote) { - if (**pc == '\0') luaL_error(L, "unfinished string in C script"); - buff[i++] = *(*pc)++; - } - (*pc)++; - } - else { - while (**pc != '\0' && !strchr(delimits, **pc)) - buff[i++] = *(*pc)++; - } - buff[i] = '\0'; - return buff; -} - - -static int getindex_aux (lua_State *L, lua_State *L1, const char **pc) { - skip(pc); - switch (*(*pc)++) { - case 'R': return LUA_REGISTRYINDEX; - case 'G': return luaL_error(L, "deprecated index 'G'"); - case 'U': return lua_upvalueindex(getnum_aux(L, L1, pc)); - default: (*pc)--; return getnum_aux(L, L1, pc); - } -} - - -static const char *const statcodes[] = {"OK", "YIELD", "ERRRUN", - "ERRSYNTAX", MEMERRMSG, "ERRGCMM", "ERRERR"}; - -/* -** Avoid these stat codes from being collected, to avoid possible -** memory error when pushing them. -*/ -static void regcodes (lua_State *L) { - unsigned int i; - for (i = 0; i < sizeof(statcodes) / sizeof(statcodes[0]); i++) { - lua_pushboolean(L, 1); - lua_setfield(L, LUA_REGISTRYINDEX, statcodes[i]); - } -} - - -#define EQ(s1) (strcmp(s1, inst) == 0) - -#define getnum (getnum_aux(L, L1, &pc)) -#define getstring (getstring_aux(L, buff, &pc)) -#define getindex (getindex_aux(L, L1, &pc)) - - -static int testC (lua_State *L); -static int Cfunck (lua_State *L, int status, lua_KContext ctx); - -/* -** arithmetic operation encoding for 'arith' instruction -** LUA_OPIDIV -> \ -** LUA_OPSHL -> < -** LUA_OPSHR -> > -** LUA_OPUNM -> _ -** LUA_OPBNOT -> ! -*/ -static const char ops[] = "+-*%^/\\&|~<>_!"; - -static int runC (lua_State *L, lua_State *L1, const char *pc) { - char buff[300]; - int status = 0; - if (pc == NULL) return luaL_error(L, "attempt to runC null script"); - for (;;) { - const char *inst = getstring; - if EQ("") return 0; - else if EQ("absindex") { - lua_pushnumber(L1, lua_absindex(L1, getindex)); - } - else if EQ("append") { - int t = getindex; - int i = lua_rawlen(L1, t); - lua_rawseti(L1, t, i + 1); - } - else if EQ("arith") { - int op; - skip(&pc); - op = strchr(ops, *pc++) - ops; - lua_arith(L1, op); - } - else if EQ("call") { - int narg = getnum; - int nres = getnum; - lua_call(L1, narg, nres); - } - else if EQ("callk") { - int narg = getnum; - int nres = getnum; - int i = getindex; - lua_callk(L1, narg, nres, i, Cfunck); - } - else if EQ("checkstack") { - int sz = getnum; - const char *msg = getstring; - if (*msg == '\0') - msg = NULL; /* to test 'luaL_checkstack' with no message */ - luaL_checkstack(L1, sz, msg); - } - else if EQ("rawcheckstack") { - int sz = getnum; - lua_pushboolean(L1, lua_checkstack(L1, sz)); - } - else if EQ("compare") { - const char *opt = getstring; /* EQ, LT, or LE */ - int op = (opt[0] == 'E') ? LUA_OPEQ - : (opt[1] == 'T') ? LUA_OPLT : LUA_OPLE; - int a = getindex; - int b = getindex; - lua_pushboolean(L1, lua_compare(L1, a, b, op)); - } - else if EQ("concat") { - lua_concat(L1, getnum); - } - else if EQ("copy") { - int f = getindex; - lua_copy(L1, f, getindex); - } - else if EQ("func2num") { - lua_CFunction func = lua_tocfunction(L1, getindex); - lua_pushnumber(L1, cast_sizet(func)); - } - else if EQ("getfield") { - int t = getindex; - lua_getfield(L1, t, getstring); - } - else if EQ("getglobal") { - lua_getglobal(L1, getstring); - } - else if EQ("getmetatable") { - if (lua_getmetatable(L1, getindex) == 0) - lua_pushnil(L1); - } - else if EQ("gettable") { - lua_gettable(L1, getindex); - } - else if EQ("gettop") { - lua_pushinteger(L1, lua_gettop(L1)); - } - else if EQ("gsub") { - int a = getnum; int b = getnum; int c = getnum; - luaL_gsub(L1, lua_tostring(L1, a), - lua_tostring(L1, b), - lua_tostring(L1, c)); - } - else if EQ("insert") { - lua_insert(L1, getnum); - } - else if EQ("iscfunction") { - lua_pushboolean(L1, lua_iscfunction(L1, getindex)); - } - else if EQ("isfunction") { - lua_pushboolean(L1, lua_isfunction(L1, getindex)); - } - else if EQ("isnil") { - lua_pushboolean(L1, lua_isnil(L1, getindex)); - } - else if EQ("isnull") { - lua_pushboolean(L1, lua_isnone(L1, getindex)); - } - else if EQ("isnumber") { - lua_pushboolean(L1, lua_isnumber(L1, getindex)); - } - else if EQ("isstring") { - lua_pushboolean(L1, lua_isstring(L1, getindex)); - } - else if EQ("istable") { - lua_pushboolean(L1, lua_istable(L1, getindex)); - } - else if EQ("isudataval") { - lua_pushboolean(L1, lua_islightuserdata(L1, getindex)); - } - else if EQ("isuserdata") { - lua_pushboolean(L1, lua_isuserdata(L1, getindex)); - } - else if EQ("len") { - lua_len(L1, getindex); - } - else if EQ("Llen") { - lua_pushinteger(L1, luaL_len(L1, getindex)); - } - else if EQ("loadfile") { - luaL_loadfile(L1, luaL_checkstring(L1, getnum)); - } - else if EQ("loadstring") { - const char *s = luaL_checkstring(L1, getnum); - luaL_loadstring(L1, s); - } - else if EQ("newmetatable") { - lua_pushboolean(L1, luaL_newmetatable(L1, getstring)); - } - else if EQ("newtable") { - lua_newtable(L1); - } - else if EQ("newthread") { - lua_newthread(L1); - } - else if EQ("resetthread") { - lua_pushinteger(L1, lua_resetthread(L1)); /* deprecated */ - } - else if EQ("newuserdata") { - lua_newuserdata(L1, getnum); - } - else if EQ("next") { - lua_next(L1, -2); - } - else if EQ("objsize") { - lua_pushinteger(L1, lua_rawlen(L1, getindex)); - } - else if EQ("pcall") { - int narg = getnum; - int nres = getnum; - status = lua_pcall(L1, narg, nres, getnum); - } - else if EQ("pcallk") { - int narg = getnum; - int nres = getnum; - int i = getindex; - status = lua_pcallk(L1, narg, nres, 0, i, Cfunck); - } - else if EQ("pop") { - lua_pop(L1, getnum); - } - else if EQ("printstack") { - int n = getnum; - if (n != 0) { - printf("%s\n", luaL_tolstring(L1, n, NULL)); - lua_pop(L1, 1); - } - else printstack(L1); - } - else if EQ("print") { - const char *msg = getstring; - printf("%s\n", msg); - } - else if EQ("warningC") { - const char *msg = getstring; - lua_warning(L1, msg, 1); - } - else if EQ("warning") { - const char *msg = getstring; - lua_warning(L1, msg, 0); - } - else if EQ("pushbool") { - lua_pushboolean(L1, getnum); - } - else if EQ("pushcclosure") { - lua_pushcclosure(L1, testC, getnum); - } - else if EQ("pushint") { - lua_pushinteger(L1, getnum); - } - else if EQ("pushnil") { - lua_pushnil(L1); - } - else if EQ("pushnum") { - lua_pushnumber(L1, (lua_Number)getnum); - } - else if EQ("pushstatus") { - lua_pushstring(L1, statcodes[status]); - } - else if EQ("pushstring") { - lua_pushstring(L1, getstring); - } - else if EQ("pushupvalueindex") { - lua_pushinteger(L1, lua_upvalueindex(getnum)); - } - else if EQ("pushvalue") { - lua_pushvalue(L1, getindex); - } - else if EQ("pushfstringI") { - lua_pushfstring(L1, lua_tostring(L, -2), (int)lua_tointeger(L, -1)); - } - else if EQ("pushfstringS") { - lua_pushfstring(L1, lua_tostring(L, -2), lua_tostring(L, -1)); - } - else if EQ("pushfstringP") { - lua_pushfstring(L1, lua_tostring(L, -2), lua_topointer(L, -1)); - } - else if EQ("rawget") { - int t = getindex; - lua_rawget(L1, t); - } - else if EQ("rawgeti") { - int t = getindex; - lua_rawgeti(L1, t, getnum); - } - else if EQ("rawgetp") { - int t = getindex; - lua_rawgetp(L1, t, cast_voidp(cast_sizet(getnum))); - } - else if EQ("rawset") { - int t = getindex; - lua_rawset(L1, t); - } - else if EQ("rawseti") { - int t = getindex; - lua_rawseti(L1, t, getnum); - } - else if EQ("rawsetp") { - int t = getindex; - lua_rawsetp(L1, t, cast_voidp(cast_sizet(getnum))); - } - else if EQ("remove") { - lua_remove(L1, getnum); - } - else if EQ("replace") { - lua_replace(L1, getindex); - } - else if EQ("resume") { - int i = getindex; - int nres; - status = lua_resume(lua_tothread(L1, i), L, getnum, &nres); - } - else if EQ("traceback") { - const char *msg = getstring; - int level = getnum; - luaL_traceback(L1, L1, msg, level); - } - else if EQ("return") { - int n = getnum; - if (L1 != L) { - int i; - for (i = 0; i < n; i++) { - int idx = -(n - i); - switch (lua_type(L1, idx)) { - case LUA_TBOOLEAN: - lua_pushboolean(L, lua_toboolean(L1, idx)); - break; - default: - lua_pushstring(L, lua_tostring(L1, idx)); - break; - } - } - } - return n; - } - else if EQ("rotate") { - int i = getindex; - lua_rotate(L1, i, getnum); - } - else if EQ("setfield") { - int t = getindex; - const char *s = getstring; - lua_setfield(L1, t, s); - } - else if EQ("seti") { - int t = getindex; - lua_seti(L1, t, getnum); - } - else if EQ("setglobal") { - const char *s = getstring; - lua_setglobal(L1, s); - } - else if EQ("sethook") { - int mask = getnum; - int count = getnum; - const char *s = getstring; - sethookaux(L1, mask, count, s); - } - else if EQ("setmetatable") { - int idx = getindex; - lua_setmetatable(L1, idx); - } - else if EQ("settable") { - lua_settable(L1, getindex); - } - else if EQ("settop") { - lua_settop(L1, getnum); - } - else if EQ("testudata") { - int i = getindex; - lua_pushboolean(L1, luaL_testudata(L1, i, getstring) != NULL); - } - else if EQ("error") { - lua_error(L1); - } - else if EQ("abort") { - abort(); - } - else if EQ("throw") { -#if defined(__cplusplus) -static struct X { int x; } x; - throw x; -#else - luaL_error(L1, "C++"); -#endif - break; - } - else if EQ("tobool") { - lua_pushboolean(L1, lua_toboolean(L1, getindex)); - } - else if EQ("tocfunction") { - lua_pushcfunction(L1, lua_tocfunction(L1, getindex)); - } - else if EQ("tointeger") { - lua_pushinteger(L1, lua_tointeger(L1, getindex)); - } - else if EQ("tonumber") { - lua_pushnumber(L1, lua_tonumber(L1, getindex)); - } - else if EQ("topointer") { - lua_pushlightuserdata(L1, cast_voidp(lua_topointer(L1, getindex))); - } - else if EQ("touserdata") { - lua_pushlightuserdata(L1, lua_touserdata(L1, getindex)); - } - else if EQ("tostring") { - const char *s = lua_tostring(L1, getindex); - const char *s1 = lua_pushstring(L1, s); - cast_void(s1); /* to avoid warnings */ - lua_longassert((s == NULL && s1 == NULL) || strcmp(s, s1) == 0); - } - else if EQ("Ltolstring") { - luaL_tolstring(L1, getindex, NULL); - } - else if EQ("type") { - lua_pushstring(L1, luaL_typename(L1, getnum)); - } - else if EQ("xmove") { - int f = getindex; - int t = getindex; - lua_State *fs = (f == 0) ? L1 : lua_tothread(L1, f); - lua_State *ts = (t == 0) ? L1 : lua_tothread(L1, t); - int n = getnum; - if (n == 0) n = lua_gettop(fs); - lua_xmove(fs, ts, n); - } - else if EQ("isyieldable") { - lua_pushboolean(L1, lua_isyieldable(lua_tothread(L1, getindex))); - } - else if EQ("yield") { - return lua_yield(L1, getnum); - } - else if EQ("yieldk") { - int nres = getnum; - int i = getindex; - return lua_yieldk(L1, nres, i, Cfunck); - } - else if EQ("toclose") { - lua_toclose(L1, getnum); - } - else if EQ("closeslot") { - lua_closeslot(L1, getnum); - } - else luaL_error(L, "unknown instruction %s", buff); - } - return 0; -} - - -static int testC (lua_State *L) { - lua_State *L1; - const char *pc; - if (lua_isuserdata(L, 1)) { - L1 = getstate(L); - pc = luaL_checkstring(L, 2); - } - else if (lua_isthread(L, 1)) { - L1 = lua_tothread(L, 1); - pc = luaL_checkstring(L, 2); - } - else { - L1 = L; - pc = luaL_checkstring(L, 1); - } - return runC(L, L1, pc); -} - - -static int Cfunc (lua_State *L) { - return runC(L, L, lua_tostring(L, lua_upvalueindex(1))); -} - - -static int Cfunck (lua_State *L, int status, lua_KContext ctx) { - lua_pushstring(L, statcodes[status]); - lua_setglobal(L, "status"); - lua_pushinteger(L, ctx); - lua_setglobal(L, "ctx"); - return runC(L, L, lua_tostring(L, ctx)); -} - - -static int makeCfunc (lua_State *L) { - luaL_checkstring(L, 1); - lua_pushcclosure(L, Cfunc, lua_gettop(L)); - return 1; -} - - -/* }====================================================== */ - - -/* -** {====================================================== -** tests for C hooks -** ======================================================= -*/ - -/* -** C hook that runs the C script stored in registry.C_HOOK[L] -*/ -static void Chook (lua_State *L, lua_Debug *ar) { - const char *scpt; - const char *const events [] = {"call", "ret", "line", "count", "tailcall"}; - lua_getfield(L, LUA_REGISTRYINDEX, "C_HOOK"); - lua_pushlightuserdata(L, L); - lua_gettable(L, -2); /* get C_HOOK[L] (script saved by sethookaux) */ - scpt = lua_tostring(L, -1); /* not very religious (string will be popped) */ - lua_pop(L, 2); /* remove C_HOOK and script */ - lua_pushstring(L, events[ar->event]); /* may be used by script */ - lua_pushinteger(L, ar->currentline); /* may be used by script */ - runC(L, L, scpt); /* run script from C_HOOK[L] */ -} - - -/* -** sets 'registry.C_HOOK[L] = scpt' and sets 'Chook' as a hook -*/ -static void sethookaux (lua_State *L, int mask, int count, const char *scpt) { - if (*scpt == '\0') { /* no script? */ - lua_sethook(L, NULL, 0, 0); /* turn off hooks */ - return; - } - lua_getfield(L, LUA_REGISTRYINDEX, "C_HOOK"); /* get C_HOOK table */ - if (!lua_istable(L, -1)) { /* no hook table? */ - lua_pop(L, 1); /* remove previous value */ - lua_newtable(L); /* create new C_HOOK table */ - lua_pushvalue(L, -1); - lua_setfield(L, LUA_REGISTRYINDEX, "C_HOOK"); /* register it */ - } - lua_pushlightuserdata(L, L); - lua_pushstring(L, scpt); - lua_settable(L, -3); /* C_HOOK[L] = script */ - lua_sethook(L, Chook, mask, count); -} - - -static int sethook (lua_State *L) { - if (lua_isnoneornil(L, 1)) - lua_sethook(L, NULL, 0, 0); /* turn off hooks */ - else { - const char *scpt = luaL_checkstring(L, 1); - const char *smask = luaL_checkstring(L, 2); - int count = cast_int(luaL_optinteger(L, 3, 0)); - int mask = 0; - if (strchr(smask, 'c')) mask |= LUA_MASKCALL; - if (strchr(smask, 'r')) mask |= LUA_MASKRET; - if (strchr(smask, 'l')) mask |= LUA_MASKLINE; - if (count > 0) mask |= LUA_MASKCOUNT; - sethookaux(L, mask, count, scpt); - } - return 0; -} - - -static int coresume (lua_State *L) { - int status, nres; - lua_State *co = lua_tothread(L, 1); - luaL_argcheck(L, co, 1, "coroutine expected"); - status = lua_resume(co, L, 0, &nres); - if (status != LUA_OK && status != LUA_YIELD) { - lua_pushboolean(L, 0); - lua_insert(L, -2); - return 2; /* return false + error message */ - } - else { - lua_pushboolean(L, 1); - return 1; - } -} - -/* }====================================================== */ - - - -static const struct luaL_Reg tests_funcs[] = { - {"checkmemory", lua_checkmemory}, - {"closestate", closestate}, - {"d2s", d2s}, - {"doonnewstack", doonnewstack}, - {"doremote", doremote}, - {"gccolor", gc_color}, - {"gcage", gc_age}, - {"gcstate", gc_state}, - {"pobj", gc_printobj}, - {"getref", getref}, - {"hash", hash_query}, - {"log2", log2_aux}, - {"limits", get_limits}, - {"listcode", listcode}, - {"printcode", printcode}, - {"listk", listk}, - {"listabslineinfo", listabslineinfo}, - {"listlocals", listlocals}, - {"loadlib", loadlib}, - {"checkpanic", checkpanic}, - {"newstate", newstate}, - {"newuserdata", newuserdata}, - {"num2int", num2int}, - {"pushuserdata", pushuserdata}, - {"querystr", string_query}, - {"querytab", table_query}, - {"ref", tref}, - {"resume", coresume}, - {"s2d", s2d}, - {"sethook", sethook}, - {"stacklevel", stacklevel}, - {"testC", testC}, - {"makeCfunc", makeCfunc}, - {"totalmem", mem_query}, - {"alloccount", alloc_count}, - {"allocfailnext", alloc_failnext}, - {"trick", settrick}, - {"udataval", udataval}, - {"unref", unref}, - {"upvalue", upvalue}, - {NULL, NULL} -}; - - -static void checkfinalmem (void) { - lua_assert(l_memcontrol.numblocks == 0); - lua_assert(l_memcontrol.total == 0); -} - - -int luaB_opentests (lua_State *L) { - void *ud; - lua_Alloc f = lua_getallocf(L, &ud); - lua_atpanic(L, &tpanic); - lua_setwarnf(L, &warnf, L); - lua_pushboolean(L, 0); - lua_setglobal(L, "_WARN"); /* _WARN = false */ - regcodes(L); - atexit(checkfinalmem); - lua_assert(f == debug_realloc && ud == cast_voidp(&l_memcontrol)); - lua_setallocf(L, f, ud); /* exercise this function */ - luaL_newlib(L, tests_funcs); - return 1; -} - -#endif - diff --git a/lua-5.4.7-tests/ltests/ltests.h b/lua-5.4.7-tests/ltests/ltests.h deleted file mode 100644 index ec52049..0000000 --- a/lua-5.4.7-tests/ltests/ltests.h +++ /dev/null @@ -1,151 +0,0 @@ -/* -** $Id: ltests.h $ -** Internal Header for Debugging of the Lua Implementation -** See Copyright Notice in lua.h -*/ - -#ifndef ltests_h -#define ltests_h - - -#include -#include - -/* test Lua with compatibility code */ -#define LUA_COMPAT_MATHLIB -#define LUA_COMPAT_LT_LE - - -#define LUA_DEBUG - - -/* turn on assertions */ -#define LUAI_ASSERT - - -/* to avoid warnings, and to make sure value is really unused */ -#define UNUSED(x) (x=0, (void)(x)) - - -/* test for sizes in 'l_sprintf' (make sure whole buffer is available) */ -#undef l_sprintf -#if !defined(LUA_USE_C89) -#define l_sprintf(s,sz,f,i) (memset(s,0xAB,sz), snprintf(s,sz,f,i)) -#else -#define l_sprintf(s,sz,f,i) (memset(s,0xAB,sz), sprintf(s,f,i)) -#endif - - -/* get a chance to test code without jump tables */ -#define LUA_USE_JUMPTABLE 0 - - -/* use 32-bit integers in random generator */ -#define LUA_RAND32 - - -/* memory-allocator control variables */ -typedef struct Memcontrol { - int failnext; - unsigned long numblocks; - unsigned long total; - unsigned long maxmem; - unsigned long memlimit; - unsigned long countlimit; - unsigned long objcount[LUA_NUMTYPES]; -} Memcontrol; - -LUA_API Memcontrol l_memcontrol; - - -/* -** generic variable for debug tricks -*/ -extern void *l_Trick; - - - -/* -** Function to traverse and check all memory used by Lua -*/ -LUAI_FUNC int lua_checkmemory (lua_State *L); - -/* -** Function to print an object GC-friendly -*/ -struct GCObject; -LUAI_FUNC void lua_printobj (lua_State *L, struct GCObject *o); - - -/* test for lock/unlock */ - -struct L_EXTRA { int lock; int *plock; }; -#undef LUA_EXTRASPACE -#define LUA_EXTRASPACE sizeof(struct L_EXTRA) -#define getlock(l) cast(struct L_EXTRA*, lua_getextraspace(l)) -#define luai_userstateopen(l) \ - (getlock(l)->lock = 0, getlock(l)->plock = &(getlock(l)->lock)) -#define luai_userstateclose(l) \ - lua_assert(getlock(l)->lock == 1 && getlock(l)->plock == &(getlock(l)->lock)) -#define luai_userstatethread(l,l1) \ - lua_assert(getlock(l1)->plock == getlock(l)->plock) -#define luai_userstatefree(l,l1) \ - lua_assert(getlock(l)->plock == getlock(l1)->plock) -#define lua_lock(l) lua_assert((*getlock(l)->plock)++ == 0) -#define lua_unlock(l) lua_assert(--(*getlock(l)->plock) == 0) - - - -LUA_API int luaB_opentests (lua_State *L); - -LUA_API void *debug_realloc (void *ud, void *block, - size_t osize, size_t nsize); - -#if defined(lua_c) -#define luaL_newstate() lua_newstate(debug_realloc, &l_memcontrol) -#define luaL_openlibs(L) \ - { (luaL_openlibs)(L); \ - luaL_requiref(L, "T", luaB_opentests, 1); \ - lua_pop(L, 1); } -#endif - - - -/* change some sizes to give some bugs a chance */ - -#undef LUAL_BUFFERSIZE -#define LUAL_BUFFERSIZE 23 -#define MINSTRTABSIZE 2 -#define MAXIWTHABS 3 - -#define STRCACHE_N 23 -#define STRCACHE_M 5 - -#undef LUAI_USER_ALIGNMENT_T -#define LUAI_USER_ALIGNMENT_T union { char b[sizeof(void*) * 8]; } - - -/* -** This one is not compatible with tests for opcode optimizations, -** as it blocks some optimizations -#define MAXINDEXRK 0 -*/ - - -/* make stack-overflow tests run faster */ -#undef LUAI_MAXSTACK -#define LUAI_MAXSTACK 50000 - - -/* test mode uses more stack space */ -#undef LUAI_MAXCCALLS -#define LUAI_MAXCCALLS 180 - - -/* force Lua to use its own implementations */ -#undef lua_strx2number -#undef lua_number2strx - - -#endif - diff --git a/lua-5.4.7-tests/main.lua b/lua-5.4.7-tests/main.lua deleted file mode 100644 index 11b14b4..0000000 --- a/lua-5.4.7-tests/main.lua +++ /dev/null @@ -1,563 +0,0 @@ -# testing special comment on first line --- $Id: testes/main.lua $ --- See Copyright Notice in file all.lua - --- most (all?) tests here assume a reasonable "Unix-like" shell -if _port then return end - --- use only "double quotes" inside shell scripts (better change to --- run on Windows) - - -print ("testing stand-alone interpreter") - -assert(os.execute()) -- machine has a system command - -local arg = arg or ARG - -local prog = os.tmpname() -local otherprog = os.tmpname() -local out = os.tmpname() - -local progname -do - local i = 0 - while arg[i] do i=i-1 end - progname = arg[i+1] -end -print("progname: "..progname) - - -local prepfile = function (s, mod, p) - mod = mod and "wb" or "w" -- mod true means binary files - p = p or prog -- file to write the program - local f = io.open(p, mod) - f:write(s) - assert(f:close()) -end - -local function getoutput () - local f = io.open(out) - local t = f:read("a") - f:close() - assert(os.remove(out)) - return t -end - -local function checkprogout (s) - -- expected result must end with new line - assert(string.sub(s, -1) == "\n") - local t = getoutput() - for line in string.gmatch(s, ".-\n") do - assert(string.find(t, line, 1, true)) - end -end - -local function checkout (s) - local t = getoutput() - if s ~= t then print(string.format("'%s' - '%s'\n", s, t)) end - assert(s == t) - return t -end - - -local function RUN (p, ...) - p = string.gsub(p, "lua", '"'..progname..'"', 1) - local s = string.format(p, ...) - assert(os.execute(s)) -end - - -local function NoRun (msg, p, ...) - p = string.gsub(p, "lua", '"'..progname..'"', 1) - local s = string.format(p, ...) - s = string.format("%s >%s 2>&1", s, out) -- send output and error to 'out' - assert(not os.execute(s)) - assert(string.find(getoutput(), msg, 1, true)) -- check error message -end - -RUN('lua -v') - -print(string.format("(temporary program file used in these tests: %s)", prog)) - --- running stdin as a file -prepfile"" -RUN('lua - < %s > %s', prog, out) -checkout("") - -prepfile[[ - print( -1, a -) -]] -RUN('lua - < %s > %s', prog, out) -checkout("1\tnil\n") - -RUN('echo "print(10)\nprint(2)\n" | lua > %s', out) -checkout("10\n2\n") - - --- testing BOM -prepfile("\xEF\xBB\xBF") -RUN('lua %s > %s', prog, out) -checkout("") - -prepfile("\xEF\xBB\xBFprint(3)") -RUN('lua %s > %s', prog, out) -checkout("3\n") - -prepfile("\xEF\xBB\xBF# comment!!\nprint(3)") -RUN('lua %s > %s', prog, out) -checkout("3\n") - --- bad BOMs -prepfile("\xEF", true) -NoRun("unexpected symbol", 'lua %s', prog) - -prepfile("\xEF\xBB", true) -NoRun("unexpected symbol", 'lua %s', prog) - -prepfile("\xEFprint(3)", true) -NoRun("unexpected symbol", 'lua %s', prog) - -prepfile("\xEF\xBBprint(3)", true) -NoRun("unexpected symbol", 'lua %s', prog) - - --- test option '-' -RUN('echo "print(arg[1])" | lua - -h > %s', out) -checkout("-h\n") - --- test environment variables used by Lua - -prepfile("print(package.path)") - --- test LUA_PATH -RUN('env LUA_INIT= LUA_PATH=x lua %s > %s', prog, out) -checkout("x\n") - --- test LUA_PATH_version -RUN('env LUA_INIT= LUA_PATH_5_4=y LUA_PATH=x lua %s > %s', prog, out) -checkout("y\n") - --- test LUA_CPATH -prepfile("print(package.cpath)") -RUN('env LUA_INIT= LUA_CPATH=xuxu lua %s > %s', prog, out) -checkout("xuxu\n") - --- test LUA_CPATH_version -RUN('env LUA_INIT= LUA_CPATH_5_4=yacc LUA_CPATH=x lua %s > %s', prog, out) -checkout("yacc\n") - --- test LUA_INIT (and its access to 'arg' table) -prepfile("print(X)") -RUN('env LUA_INIT="X=tonumber(arg[1])" lua %s 3.2 > %s', prog, out) -checkout("3.2\n") - --- test LUA_INIT_version -prepfile("print(X)") -RUN('env LUA_INIT_5_4="X=10" LUA_INIT="X=3" lua %s > %s', prog, out) -checkout("10\n") - --- test LUA_INIT for files -prepfile("x = x or 10; print(x); x = x + 1") -RUN('env LUA_INIT="@%s" lua %s > %s', prog, prog, out) -checkout("10\n11\n") - --- test errors in LUA_INIT -NoRun('LUA_INIT:1: msg', 'env LUA_INIT="error(\'msg\')" lua') - --- test option '-E' -local defaultpath, defaultCpath - -do - prepfile("print(package.path, package.cpath)") - RUN('env LUA_INIT="error(10)" LUA_PATH=xxx LUA_CPATH=xxx lua -E %s > %s', - prog, out) - local output = getoutput() - defaultpath = string.match(output, "^(.-)\t") - defaultCpath = string.match(output, "\t(.-)$") - - -- running with an empty environment - RUN('env -i lua %s > %s', prog, out) - local out = getoutput() - assert(defaultpath == string.match(output, "^(.-)\t")) - assert(defaultCpath == string.match(output, "\t(.-)$")) -end - --- paths did not change -assert(not string.find(defaultpath, "xxx") and - string.find(defaultpath, "lua") and - not string.find(defaultCpath, "xxx") and - string.find(defaultCpath, "lua")) - - --- test replacement of ';;' to default path -local function convert (p) - prepfile("print(package.path)") - RUN('env LUA_PATH="%s" lua %s > %s', p, prog, out) - local expected = getoutput() - expected = string.sub(expected, 1, -2) -- cut final end of line - if string.find(p, ";;") then - p = string.gsub(p, ";;", ";"..defaultpath..";") - p = string.gsub(p, "^;", "") -- remove ';' at the beginning - p = string.gsub(p, ";$", "") -- remove ';' at the end - end - assert(p == expected) -end - -convert(";") -convert(";;") -convert("a;;b") -convert(";;b") -convert("a;;") -convert("a;b;;c") - - --- test -l over multiple libraries -prepfile("print(1); a=2; return {x=15}") -prepfile(("print(a); print(_G['%s'].x)"):format(prog), false, otherprog) -RUN('env LUA_PATH="?;;" lua -l %s -l%s -lstring -l io %s > %s', prog, otherprog, otherprog, out) -checkout("1\n2\n15\n2\n15\n") - --- test explicit global names in -l -prepfile("print(str.upper'alo alo', m.max(10, 20))") -RUN("lua -l 'str=string' '-lm=math' -e 'print(m.sin(0))' %s > %s", prog, out) -checkout("0.0\nALO ALO\t20\n") - - --- test module names with version sufix ("libs/lib2-v2") -RUN("env LUA_CPATH='./libs/?.so' lua -l lib2-v2 -e 'print(lib2.id())' > %s", - out) -checkout("true\n") - - --- test 'arg' table -local a = [[ - assert(#arg == 3 and arg[1] == 'a' and - arg[2] == 'b' and arg[3] == 'c') - assert(arg[-1] == '--' and arg[-2] == "-e " and arg[-3] == '%s') - assert(arg[4] == undef and arg[-4] == undef) - local a, b, c = ... - assert(... == 'a' and a == 'a' and b == 'b' and c == 'c') -]] -a = string.format(a, progname) -prepfile(a) -RUN('lua "-e " -- %s a b c', prog) -- "-e " runs an empty command - --- test 'arg' availability in libraries -prepfile"assert(arg)" -prepfile("assert(arg)", false, otherprog) -RUN('env LUA_PATH="?;;" lua -l%s - < %s', prog, otherprog) - --- test messing up the 'arg' table -RUN('echo "print(...)" | lua -e "arg[1] = 100" - > %s', out) -checkout("100\n") -NoRun("'arg' is not a table", 'echo "" | lua -e "arg = 1" -') - --- test error in 'print' -RUN('echo 10 | lua -e "print=nil" -i > /dev/null 2> %s', out) -assert(string.find(getoutput(), "error calling 'print'")) - --- test 'debug.debug' -RUN('echo "io.stderr:write(1000)\ncont" | lua -e "require\'debug\'.debug()" 2> %s', out) -checkout("lua_debug> 1000lua_debug> ") - - -print("testing warnings") - --- no warnings by default -RUN('echo "io.stderr:write(1); warn[[XXX]]" | lua 2> %s', out) -checkout("1") - -prepfile[[ -warn("@allow") -- unknown control, ignored -warn("@off", "XXX", "@off") -- these are not control messages -warn("@off") -- this one is -warn("@on", "YYY", "@on") -- not control, but warn is off -warn("@off") -- keep it off -warn("@on") -- restart warnings -warn("", "@on") -- again, no control, real warning -warn("@on") -- keep it "started" -warn("Z", "Z", "Z") -- common warning -]] -RUN('lua -W %s 2> %s', prog, out) -checkout[[ -Lua warning: @offXXX@off -Lua warning: @on -Lua warning: ZZZ -]] - -prepfile[[ -warn("@allow") --- create two objects to be finalized when closing state --- the errors in the finalizers must generate warnings -u1 = setmetatable({}, {__gc = function () error("XYZ") end}) -u2 = setmetatable({}, {__gc = function () error("ZYX") end}) -]] -RUN('lua -W %s 2> %s', prog, out) -checkprogout("ZYX)\nXYZ)\n") - --- bug since 5.2: finalizer called when closing a state could --- subvert finalization order -prepfile[[ --- should be called last -print("creating 1") -setmetatable({}, {__gc = function () print(1) end}) - -print("creating 2") -setmetatable({}, {__gc = function () - print("2") - print("creating 3") - -- this finalizer should not be called, as object will be - -- created after 'lua_close' has been called - setmetatable({}, {__gc = function () print(3) end}) - print(collectgarbage()) -- cannot call collector here - os.exit(0, true) -end}) -]] -RUN('lua -W %s > %s', prog, out) -checkout[[ -creating 1 -creating 2 -2 -creating 3 -nil -1 -]] - - --- test many arguments -prepfile[[print(({...})[30])]] -RUN('lua %s %s > %s', prog, string.rep(" a", 30), out) -checkout("a\n") - -RUN([[lua "-eprint(1)" -ea=3 -e "print(a)" > %s]], out) -checkout("1\n3\n") - --- test iteractive mode -prepfile[[ -(6*2-6) -- === -a = -10 -print(a) -a]] -RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) -checkprogout("6\n10\n10\n\n") - -prepfile("a = [[b\nc\nd\ne]]\n=a") -RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) -checkprogout("b\nc\nd\ne\n\n") - -local prompt = "alo" -prepfile[[ -- -a = 2 -]] -RUN([[lua "-e_PROMPT='%s'" -i < %s > %s]], prompt, prog, out) -local t = getoutput() -assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt)) - --- using the prompt default -prepfile[[ -- -a = 2 -]] -RUN([[lua -i < %s > %s]], prog, out) -local t = getoutput() -prompt = "> " -- the default -assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt)) - - --- non-string prompt -prompt = - "local C = 0;\z - _PROMPT=setmetatable({},{__tostring = function () \z - C = C + 1; return C end})" -prepfile[[ -- -a = 2 -]] -RUN([[lua -e "%s" -i < %s > %s]], prompt, prog, out) -local t = getoutput() -assert(string.find(t, [[ -1 -- -2a = 2 -3 -]], 1, true)) - - --- test for error objects -prepfile[[ -debug = require "debug" -m = {x=0} -setmetatable(m, {__tostring = function(x) - return tostring(debug.getinfo(4).currentline + x.x) -end}) -error(m) -]] -NoRun(progname .. ": 6\n", [[lua %s]], prog) - -prepfile("error{}") -NoRun("error object is a table value", [[lua %s]], prog) - - --- chunk broken in many lines -local s = [=[ -- -function f ( x ) - local a = [[ -xuxu -]] - local b = "\ -xuxu\n" - if x == 11 then return 1 + 12 , 2 + 20 end --[[ test multiple returns ]] - return x + 1 - --\\ -end -return( f( 100 ) ) -assert( a == b ) -do return f( 11 ) end ]=] -s = string.gsub(s, ' ', '\n\n') -- change all spaces for newlines -prepfile(s) -RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out) -checkprogout("101\n13\t22\n\n") - -prepfile[[#comment in 1st line without \n at the end]] -RUN('lua %s', prog) - --- first-line comment with binary file -prepfile("#comment\n" .. string.dump(load("print(3)")), true) -RUN('lua %s > %s', prog, out) -checkout('3\n') - --- close Lua with an open file -prepfile(string.format([[io.output(%q); io.write('alo')]], out)) -RUN('lua %s', prog) -checkout('alo') - --- bug in 5.2 beta (extra \0 after version line) -RUN([[lua -v -e"print'hello'" > %s]], out) -t = getoutput() -assert(string.find(t, "PUC%-Rio\nhello")) - - --- testing os.exit -prepfile("os.exit(nil, true)") -RUN('lua %s', prog) -prepfile("os.exit(0, true)") -RUN('lua %s', prog) -prepfile("os.exit(true, true)") -RUN('lua %s', prog) -prepfile("os.exit(1, true)") -NoRun("", "lua %s", prog) -- no message -prepfile("os.exit(false, true)") -NoRun("", "lua %s", prog) -- no message - - --- to-be-closed variables in main chunk -prepfile[[ - local x = setmetatable({}, - {__close = function (self, err) - assert(err == nil) - print("Ok") - end}) - local e1 = setmetatable({}, {__close = function () print(120) end}) - os.exit(true, true) -]] -RUN('lua %s > %s', prog, out) -checkprogout("120\nOk\n") - - --- remove temporary files -assert(os.remove(prog)) -assert(os.remove(otherprog)) -assert(not os.remove(out)) - --- invalid options -NoRun("unrecognized option '-h'", "lua -h") -NoRun("unrecognized option '---'", "lua ---") -NoRun("unrecognized option '-Ex'", "lua -Ex") -NoRun("unrecognized option '-vv'", "lua -vv") -NoRun("unrecognized option '-iv'", "lua -iv") -NoRun("'-e' needs argument", "lua -e") -NoRun("syntax error", "lua -e a") -NoRun("'-l' needs argument", "lua -l") - - -if T then -- test library? - print("testing 'not enough memory' to create a state") - NoRun("not enough memory", "env MEMLIMIT=100 lua") - - -- testing 'warn' - warn("@store") - warn("@123", "456", "789") - assert(_WARN == "@123456789"); _WARN = false - - warn("zip", "", " ", "zap") - assert(_WARN == "zip zap"); _WARN = false - warn("ZIP", "", " ", "ZAP") - assert(_WARN == "ZIP ZAP"); _WARN = false - warn("@normal") -end - -do - -- 'warn' must get at least one argument - local st, msg = pcall(warn) - assert(string.find(msg, "string expected")) - - -- 'warn' does not leave unfinished warning in case of errors - -- (message would appear in next warning) - st, msg = pcall(warn, "SHOULD NOT APPEAR", {}) - assert(string.find(msg, "string expected")) -end - -print('+') - -print('testing Ctrl C') -do - -- interrupt a script - local function kill (pid) - return os.execute(string.format('kill -INT %s 2> /dev/null', pid)) - end - - -- function to run a script in background, returning its output file - -- descriptor and its pid - local function runback (luaprg) - -- shell script to run 'luaprg' in background and echo its pid - local shellprg = string.format('%s -e "%s" & echo $!', progname, luaprg) - local f = io.popen(shellprg, "r") -- run shell script - local pid = f:read() -- get pid for Lua script - print("(if test fails now, it may leave a Lua script running in \z - background, pid " .. pid .. ")") - return f, pid - end - - -- Lua script that runs protected infinite loop and then prints '42' - local f, pid = runback[[ - pcall(function () print(12); while true do end end); print(42)]] - -- wait until script is inside 'pcall' - assert(f:read() == "12") - kill(pid) -- send INT signal to Lua script - -- check that 'pcall' captured the exception and script continued running - assert(f:read() == "42") -- expected output - assert(f:close()) - print("done") - - -- Lua script in a long unbreakable search - local f, pid = runback[[ - print(15); string.find(string.rep('a', 100000), '.*b')]] - -- wait (so script can reach the loop) - assert(f:read() == "15") - assert(os.execute("sleep 1")) - -- must send at least two INT signals to stop this Lua script - local n = 100 - for i = 0, 100 do -- keep sending signals - if not kill(pid) then -- until it fails - n = i -- number of non-failed kills - break - end - end - assert(f:close()) - assert(n >= 2) - print(string.format("done (with %d kills)", n)) - -end - -print("OK") diff --git a/lua-5.4.7-tests/math.lua b/lua-5.4.7-tests/math.lua deleted file mode 100644 index 0191f7d..0000000 --- a/lua-5.4.7-tests/math.lua +++ /dev/null @@ -1,1024 +0,0 @@ --- $Id: testes/math.lua $ --- See Copyright Notice in file all.lua - -print("testing numbers and math lib") - -local minint = math.mininteger -local maxint = math.maxinteger - -local intbits = math.floor(math.log(maxint, 2) + 0.5) + 1 -assert((1 << intbits) == 0) - -assert(minint == 1 << (intbits - 1)) -assert(maxint == minint - 1) - --- number of bits in the mantissa of a floating-point number -local floatbits = 24 -do - local p = 2.0^floatbits - while p < p + 1.0 do - p = p * 2.0 - floatbits = floatbits + 1 - end -end - -local function isNaN (x) - return (x ~= x) -end - -assert(isNaN(0/0)) -assert(not isNaN(1/0)) - - -do - local x = 2.0^floatbits - assert(x > x - 1.0 and x == x + 1.0) - - print(string.format("%d-bit integers, %d-bit (mantissa) floats", - intbits, floatbits)) -end - -assert(math.type(0) == "integer" and math.type(0.0) == "float" - and not math.type("10")) - - -local function checkerror (msg, f, ...) - local s, err = pcall(f, ...) - assert(not s and string.find(err, msg)) -end - -local msgf2i = "number.* has no integer representation" - --- float equality -local function eq (a,b,limit) - if not limit then - if floatbits >= 50 then limit = 1E-11 - else limit = 1E-5 - end - end - -- a == b needed for +inf/-inf - return a == b or math.abs(a-b) <= limit -end - - --- equality with types -local function eqT (a,b) - return a == b and math.type(a) == math.type(b) -end - - --- basic float notation -assert(0e12 == 0 and .0 == 0 and 0. == 0 and .2e2 == 20 and 2.E-1 == 0.2) - -do - local a,b,c = "2", " 3e0 ", " 10 " - assert(a+b == 5 and -b == -3 and b+"2" == 5 and "10"-c == 0) - assert(type(a) == 'string' and type(b) == 'string' and type(c) == 'string') - assert(a == "2" and b == " 3e0 " and c == " 10 " and -c == -" 10 ") - assert(c%a == 0 and a^b == 08) - a = 0 - assert(a == -a and 0 == -0) -end - -do - local x = -1 - local mz = 0/x -- minus zero - local t = {[0] = 10, 20, 30, 40, 50} - assert(t[mz] == t[0] and t[-0] == t[0]) -end - -do -- tests for 'modf' - local a,b = math.modf(3.5) - assert(a == 3.0 and b == 0.5) - a,b = math.modf(-2.5) - assert(a == -2.0 and b == -0.5) - a,b = math.modf(-3e23) - assert(a == -3e23 and b == 0.0) - a,b = math.modf(3e35) - assert(a == 3e35 and b == 0.0) - a,b = math.modf(-1/0) -- -inf - assert(a == -1/0 and b == 0.0) - a,b = math.modf(1/0) -- inf - assert(a == 1/0 and b == 0.0) - a,b = math.modf(0/0) -- NaN - assert(isNaN(a) and isNaN(b)) - a,b = math.modf(3) -- integer argument - assert(eqT(a, 3) and eqT(b, 0.0)) - a,b = math.modf(minint) - assert(eqT(a, minint) and eqT(b, 0.0)) -end - -assert(math.huge > 10e30) -assert(-math.huge < -10e30) - - --- integer arithmetic -assert(minint < minint + 1) -assert(maxint - 1 < maxint) -assert(0 - minint == minint) -assert(minint * minint == 0) -assert(maxint * maxint * maxint == maxint) - - --- testing floor division and conversions - -for _, i in pairs{-16, -15, -3, -2, -1, 0, 1, 2, 3, 15} do - for _, j in pairs{-16, -15, -3, -2, -1, 1, 2, 3, 15} do - for _, ti in pairs{0, 0.0} do -- try 'i' as integer and as float - for _, tj in pairs{0, 0.0} do -- try 'j' as integer and as float - local x = i + ti - local y = j + tj - assert(i//j == math.floor(i/j)) - end - end - end -end - -assert(1//0.0 == 1/0) -assert(-1 // 0.0 == -1/0) -assert(eqT(3.5 // 1.5, 2.0)) -assert(eqT(3.5 // -1.5, -3.0)) - -do -- tests for different kinds of opcodes - local x, y - x = 1; assert(x // 0.0 == 1/0) - x = 1.0; assert(x // 0 == 1/0) - x = 3.5; assert(eqT(x // 1, 3.0)) - assert(eqT(x // -1, -4.0)) - - x = 3.5; y = 1.5; assert(eqT(x // y, 2.0)) - x = 3.5; y = -1.5; assert(eqT(x // y, -3.0)) -end - -assert(maxint // maxint == 1) -assert(maxint // 1 == maxint) -assert((maxint - 1) // maxint == 0) -assert(maxint // (maxint - 1) == 1) -assert(minint // minint == 1) -assert(minint // minint == 1) -assert((minint + 1) // minint == 0) -assert(minint // (minint + 1) == 1) -assert(minint // 1 == minint) - -assert(minint // -1 == -minint) -assert(minint // -2 == 2^(intbits - 2)) -assert(maxint // -1 == -maxint) - - --- negative exponents -do - assert(2^-3 == 1 / 2^3) - assert(eq((-3)^-3, 1 / (-3)^3)) - for i = -3, 3 do -- variables avoid constant folding - for j = -3, 3 do - -- domain errors (0^(-n)) are not portable - if not _port or i ~= 0 or j > 0 then - assert(eq(i^j, 1 / i^(-j))) - end - end - end -end - --- comparison between floats and integers (border cases) -if floatbits < intbits then - assert(2.0^floatbits == (1 << floatbits)) - assert(2.0^floatbits - 1.0 == (1 << floatbits) - 1.0) - assert(2.0^floatbits - 1.0 ~= (1 << floatbits)) - -- float is rounded, int is not - assert(2.0^floatbits + 1.0 ~= (1 << floatbits) + 1) -else -- floats can express all integers with full accuracy - assert(maxint == maxint + 0.0) - assert(maxint - 1 == maxint - 1.0) - assert(minint + 1 == minint + 1.0) - assert(maxint ~= maxint - 1.0) -end -assert(maxint + 0.0 == 2.0^(intbits - 1) - 1.0) -assert(minint + 0.0 == minint) -assert(minint + 0.0 == -2.0^(intbits - 1)) - - --- order between floats and integers -assert(1 < 1.1); assert(not (1 < 0.9)) -assert(1 <= 1.1); assert(not (1 <= 0.9)) -assert(-1 < -0.9); assert(not (-1 < -1.1)) -assert(1 <= 1.1); assert(not (-1 <= -1.1)) -assert(-1 < -0.9); assert(not (-1 < -1.1)) -assert(-1 <= -0.9); assert(not (-1 <= -1.1)) -assert(minint <= minint + 0.0) -assert(minint + 0.0 <= minint) -assert(not (minint < minint + 0.0)) -assert(not (minint + 0.0 < minint)) -assert(maxint < minint * -1.0) -assert(maxint <= minint * -1.0) - -do - local fmaxi1 = 2^(intbits - 1) - assert(maxint < fmaxi1) - assert(maxint <= fmaxi1) - assert(not (fmaxi1 <= maxint)) - assert(minint <= -2^(intbits - 1)) - assert(-2^(intbits - 1) <= minint) -end - -if floatbits < intbits then - print("testing order (floats cannot represent all integers)") - local fmax = 2^floatbits - local ifmax = fmax | 0 - assert(fmax < ifmax + 1) - assert(fmax - 1 < ifmax) - assert(-(fmax - 1) > -ifmax) - assert(not (fmax <= ifmax - 1)) - assert(-fmax > -(ifmax + 1)) - assert(not (-fmax >= -(ifmax - 1))) - - assert(fmax/2 - 0.5 < ifmax//2) - assert(-(fmax/2 - 0.5) > -ifmax//2) - - assert(maxint < 2^intbits) - assert(minint > -2^intbits) - assert(maxint <= 2^intbits) - assert(minint >= -2^intbits) -else - print("testing order (floats can represent all integers)") - assert(maxint < maxint + 1.0) - assert(maxint < maxint + 0.5) - assert(maxint - 1.0 < maxint) - assert(maxint - 0.5 < maxint) - assert(not (maxint + 0.0 < maxint)) - assert(maxint + 0.0 <= maxint) - assert(not (maxint < maxint + 0.0)) - assert(maxint + 0.0 <= maxint) - assert(maxint <= maxint + 0.0) - assert(not (maxint + 1.0 <= maxint)) - assert(not (maxint + 0.5 <= maxint)) - assert(not (maxint <= maxint - 1.0)) - assert(not (maxint <= maxint - 0.5)) - - assert(minint < minint + 1.0) - assert(minint < minint + 0.5) - assert(minint <= minint + 0.5) - assert(minint - 1.0 < minint) - assert(minint - 1.0 <= minint) - assert(not (minint + 0.0 < minint)) - assert(not (minint + 0.5 < minint)) - assert(not (minint < minint + 0.0)) - assert(minint + 0.0 <= minint) - assert(minint <= minint + 0.0) - assert(not (minint + 1.0 <= minint)) - assert(not (minint + 0.5 <= minint)) - assert(not (minint <= minint - 1.0)) -end - -do - local NaN = 0/0 - assert(not (NaN < 0)) - assert(not (NaN > minint)) - assert(not (NaN <= -9)) - assert(not (NaN <= maxint)) - assert(not (NaN < maxint)) - assert(not (minint <= NaN)) - assert(not (minint < NaN)) - assert(not (4 <= NaN)) - assert(not (4 < NaN)) -end - - --- avoiding errors at compile time -local function checkcompt (msg, code) - checkerror(msg, assert(load(code))) -end -checkcompt("divide by zero", "return 2 // 0") -checkcompt(msgf2i, "return 2.3 >> 0") -checkcompt(msgf2i, ("return 2.0^%d & 1"):format(intbits - 1)) -checkcompt("field 'huge'", "return math.huge << 1") -checkcompt(msgf2i, ("return 1 | 2.0^%d"):format(intbits - 1)) -checkcompt(msgf2i, "return 2.3 ~ 0.0") - - --- testing overflow errors when converting from float to integer (runtime) -local function f2i (x) return x | x end -checkerror(msgf2i, f2i, math.huge) -- +inf -checkerror(msgf2i, f2i, -math.huge) -- -inf -checkerror(msgf2i, f2i, 0/0) -- NaN - -if floatbits < intbits then - -- conversion tests when float cannot represent all integers - assert(maxint + 1.0 == maxint + 0.0) - assert(minint - 1.0 == minint + 0.0) - checkerror(msgf2i, f2i, maxint + 0.0) - assert(f2i(2.0^(intbits - 2)) == 1 << (intbits - 2)) - assert(f2i(-2.0^(intbits - 2)) == -(1 << (intbits - 2))) - assert((2.0^(floatbits - 1) + 1.0) // 1 == (1 << (floatbits - 1)) + 1) - -- maximum integer representable as a float - local mf = maxint - (1 << (floatbits - intbits)) + 1 - assert(f2i(mf + 0.0) == mf) -- OK up to here - mf = mf + 1 - assert(f2i(mf + 0.0) ~= mf) -- no more representable -else - -- conversion tests when float can represent all integers - assert(maxint + 1.0 > maxint) - assert(minint - 1.0 < minint) - assert(f2i(maxint + 0.0) == maxint) - checkerror("no integer rep", f2i, maxint + 1.0) - checkerror("no integer rep", f2i, minint - 1.0) -end - --- 'minint' should be representable as a float no matter the precision -assert(f2i(minint + 0.0) == minint) - - --- testing numeric strings - -assert("2" + 1 == 3) -assert("2 " + 1 == 3) -assert(" -2 " + 1 == -1) -assert(" -0xa " + 1 == -9) - - --- Literal integer Overflows (new behavior in 5.3.3) -do - -- no overflows - assert(eqT(tonumber(tostring(maxint)), maxint)) - assert(eqT(tonumber(tostring(minint)), minint)) - - -- add 1 to last digit as a string (it cannot be 9...) - local function incd (n) - local s = string.format("%d", n) - s = string.gsub(s, "%d$", function (d) - assert(d ~= '9') - return string.char(string.byte(d) + 1) - end) - return s - end - - -- 'tonumber' with overflow by 1 - assert(eqT(tonumber(incd(maxint)), maxint + 1.0)) - assert(eqT(tonumber(incd(minint)), minint - 1.0)) - - -- large numbers - assert(eqT(tonumber("1"..string.rep("0", 30)), 1e30)) - assert(eqT(tonumber("-1"..string.rep("0", 30)), -1e30)) - - -- hexa format still wraps around - assert(eqT(tonumber("0x1"..string.rep("0", 30)), 0)) - - -- lexer in the limits - assert(minint == load("return " .. minint)()) - assert(eqT(maxint, load("return " .. maxint)())) - - assert(eqT(10000000000000000000000.0, 10000000000000000000000)) - assert(eqT(-10000000000000000000000.0, -10000000000000000000000)) -end - - --- testing 'tonumber' - --- 'tonumber' with numbers -assert(tonumber(3.4) == 3.4) -assert(eqT(tonumber(3), 3)) -assert(eqT(tonumber(maxint), maxint) and eqT(tonumber(minint), minint)) -assert(tonumber(1/0) == 1/0) - --- 'tonumber' with strings -assert(tonumber("0") == 0) -assert(not tonumber("")) -assert(not tonumber(" ")) -assert(not tonumber("-")) -assert(not tonumber(" -0x ")) -assert(not tonumber{}) -assert(tonumber'+0.01' == 1/100 and tonumber'+.01' == 0.01 and - tonumber'.01' == 0.01 and tonumber'-1.' == -1 and - tonumber'+1.' == 1) -assert(not tonumber'+ 0.01' and not tonumber'+.e1' and - not tonumber'1e' and not tonumber'1.0e+' and - not tonumber'.') -assert(tonumber('-012') == -010-2) -assert(tonumber('-1.2e2') == - - -120) - -assert(tonumber("0xffffffffffff") == (1 << (4*12)) - 1) -assert(tonumber("0x"..string.rep("f", (intbits//4))) == -1) -assert(tonumber("-0x"..string.rep("f", (intbits//4))) == 1) - --- testing 'tonumber' with base -assert(tonumber(' 001010 ', 2) == 10) -assert(tonumber(' 001010 ', 10) == 001010) -assert(tonumber(' -1010 ', 2) == -10) -assert(tonumber('10', 36) == 36) -assert(tonumber(' -10 ', 36) == -36) -assert(tonumber(' +1Z ', 36) == 36 + 35) -assert(tonumber(' -1z ', 36) == -36 + -35) -assert(tonumber('-fFfa', 16) == -(10+(16*(15+(16*(15+(16*15))))))) -assert(tonumber(string.rep('1', (intbits - 2)), 2) + 1 == 2^(intbits - 2)) -assert(tonumber('ffffFFFF', 16)+1 == (1 << 32)) -assert(tonumber('0ffffFFFF', 16)+1 == (1 << 32)) -assert(tonumber('-0ffffffFFFF', 16) - 1 == -(1 << 40)) -for i = 2,36 do - local i2 = i * i - local i10 = i2 * i2 * i2 * i2 * i2 -- i^10 - assert(tonumber('\t10000000000\t', i) == i10) -end - -if not _soft then - -- tests with very long numerals - assert(tonumber("0x"..string.rep("f", 13)..".0") == 2.0^(4*13) - 1) - assert(tonumber("0x"..string.rep("f", 150)..".0") == 2.0^(4*150) - 1) - assert(tonumber("0x"..string.rep("f", 300)..".0") == 2.0^(4*300) - 1) - assert(tonumber("0x"..string.rep("f", 500)..".0") == 2.0^(4*500) - 1) - assert(tonumber('0x3.' .. string.rep('0', 1000)) == 3) - assert(tonumber('0x' .. string.rep('0', 1000) .. 'a') == 10) - assert(tonumber('0x0.' .. string.rep('0', 13).."1") == 2.0^(-4*14)) - assert(tonumber('0x0.' .. string.rep('0', 150).."1") == 2.0^(-4*151)) - assert(tonumber('0x0.' .. string.rep('0', 300).."1") == 2.0^(-4*301)) - assert(tonumber('0x0.' .. string.rep('0', 500).."1") == 2.0^(-4*501)) - - assert(tonumber('0xe03' .. string.rep('0', 1000) .. 'p-4000') == 3587.0) - assert(tonumber('0x.' .. string.rep('0', 1000) .. '74p4004') == 0x7.4) -end - --- testing 'tonumber' for invalid formats - -local function f (...) - if select('#', ...) == 1 then - return (...) - else - return "***" - end -end - -assert(not f(tonumber('fFfa', 15))) -assert(not f(tonumber('099', 8))) -assert(not f(tonumber('1\0', 2))) -assert(not f(tonumber('', 8))) -assert(not f(tonumber(' ', 9))) -assert(not f(tonumber(' ', 9))) -assert(not f(tonumber('0xf', 10))) - -assert(not f(tonumber('inf'))) -assert(not f(tonumber(' INF '))) -assert(not f(tonumber('Nan'))) -assert(not f(tonumber('nan'))) - -assert(not f(tonumber(' '))) -assert(not f(tonumber(''))) -assert(not f(tonumber('1 a'))) -assert(not f(tonumber('1 a', 2))) -assert(not f(tonumber('1\0'))) -assert(not f(tonumber('1 \0'))) -assert(not f(tonumber('1\0 '))) -assert(not f(tonumber('e1'))) -assert(not f(tonumber('e 1'))) -assert(not f(tonumber(' 3.4.5 '))) - - --- testing 'tonumber' for invalid hexadecimal formats - -assert(not tonumber('0x')) -assert(not tonumber('x')) -assert(not tonumber('x3')) -assert(not tonumber('0x3.3.3')) -- two decimal points -assert(not tonumber('00x2')) -assert(not tonumber('0x 2')) -assert(not tonumber('0 x2')) -assert(not tonumber('23x')) -assert(not tonumber('- 0xaa')) -assert(not tonumber('-0xaaP ')) -- no exponent -assert(not tonumber('0x0.51p')) -assert(not tonumber('0x5p+-2')) - - --- testing hexadecimal numerals - -assert(0x10 == 16 and 0xfff == 2^12 - 1 and 0XFB == 251) -assert(0x0p12 == 0 and 0x.0p-3 == 0) -assert(0xFFFFFFFF == (1 << 32) - 1) -assert(tonumber('+0x2') == 2) -assert(tonumber('-0xaA') == -170) -assert(tonumber('-0xffFFFfff') == -(1 << 32) + 1) - --- possible confusion with decimal exponent -assert(0E+1 == 0 and 0xE+1 == 15 and 0xe-1 == 13) - - --- floating hexas - -assert(tonumber(' 0x2.5 ') == 0x25/16) -assert(tonumber(' -0x2.5 ') == -0x25/16) -assert(tonumber(' +0x0.51p+8 ') == 0x51) -assert(0x.FfffFFFF == 1 - '0x.00000001') -assert('0xA.a' + 0 == 10 + 10/16) -assert(0xa.aP4 == 0XAA) -assert(0x4P-2 == 1) -assert(0x1.1 == '0x1.' + '+0x.1') -assert(0Xabcdef.0 == 0x.ABCDEFp+24) - - -assert(1.1 == 1.+.1) -assert(100.0 == 1E2 and .01 == 1e-2) -assert(1111111111 - 1111111110 == 1000.00e-03) -assert(1.1 == '1.'+'.1') -assert(tonumber'1111111111' - tonumber'1111111110' == - tonumber" +0.001e+3 \n\t") - -assert(0.1e-30 > 0.9E-31 and 0.9E30 < 0.1e31) - -assert(0.123456 > 0.123455) - -assert(tonumber('+1.23E18') == 1.23*10.0^18) - --- testing order operators -assert(not(1<1) and (1<2) and not(2<1)) -assert(not('a'<'a') and ('a'<'b') and not('b'<'a')) -assert((1<=1) and (1<=2) and not(2<=1)) -assert(('a'<='a') and ('a'<='b') and not('b'<='a')) -assert(not(1>1) and not(1>2) and (2>1)) -assert(not('a'>'a') and not('a'>'b') and ('b'>'a')) -assert((1>=1) and not(1>=2) and (2>=1)) -assert(('a'>='a') and not('a'>='b') and ('b'>='a')) -assert(1.3 < 1.4 and 1.3 <= 1.4 and not (1.3 < 1.3) and 1.3 <= 1.3) - --- testing mod operator -assert(eqT(-4 % 3, 2)) -assert(eqT(4 % -3, -2)) -assert(eqT(-4.0 % 3, 2.0)) -assert(eqT(4 % -3.0, -2.0)) -assert(eqT(4 % -5, -1)) -assert(eqT(4 % -5.0, -1.0)) -assert(eqT(4 % 5, 4)) -assert(eqT(4 % 5.0, 4.0)) -assert(eqT(-4 % -5, -4)) -assert(eqT(-4 % -5.0, -4.0)) -assert(eqT(-4 % 5, 1)) -assert(eqT(-4 % 5.0, 1.0)) -assert(eqT(4.25 % 4, 0.25)) -assert(eqT(10.0 % 2, 0.0)) -assert(eqT(-10.0 % 2, 0.0)) -assert(eqT(-10.0 % -2, 0.0)) -assert(math.pi - math.pi % 1 == 3) -assert(math.pi - math.pi % 0.001 == 3.141) - -do -- very small numbers - local i, j = 0, 20000 - while i < j do - local m = (i + j) // 2 - if 10^-m > 0 then - i = m + 1 - else - j = m - end - end - -- 'i' is the smallest possible ten-exponent - local b = 10^-(i - (i // 10)) -- a very small number - assert(b > 0 and b * b == 0) - local delta = b / 1000 - assert(eq((2.1 * b) % (2 * b), (0.1 * b), delta)) - assert(eq((-2.1 * b) % (2 * b), (2 * b) - (0.1 * b), delta)) - assert(eq((2.1 * b) % (-2 * b), (0.1 * b) - (2 * b), delta)) - assert(eq((-2.1 * b) % (-2 * b), (-0.1 * b), delta)) -end - - --- basic consistency between integer modulo and float modulo -for i = -10, 10 do - for j = -10, 10 do - if j ~= 0 then - assert((i + 0.0) % j == i % j) - end - end -end - -for i = 0, 10 do - for j = -10, 10 do - if j ~= 0 then - assert((2^i) % j == (1 << i) % j) - end - end -end - -do -- precision of module for large numbers - local i = 10 - while (1 << i) > 0 do - assert((1 << i) % 3 == i % 2 + 1) - i = i + 1 - end - - i = 10 - while 2^i < math.huge do - assert(2^i % 3 == i % 2 + 1) - i = i + 1 - end -end - -assert(eqT(minint % minint, 0)) -assert(eqT(maxint % maxint, 0)) -assert((minint + 1) % minint == minint + 1) -assert((maxint - 1) % maxint == maxint - 1) -assert(minint % maxint == maxint - 1) - -assert(minint % -1 == 0) -assert(minint % -2 == 0) -assert(maxint % -2 == -1) - --- non-portable tests because Windows C library cannot compute --- fmod(1, huge) correctly -if not _port then - local function anan (x) assert(isNaN(x)) end -- assert Not a Number - anan(0.0 % 0) - anan(1.3 % 0) - anan(math.huge % 1) - anan(math.huge % 1e30) - anan(-math.huge % 1e30) - anan(-math.huge % -1e30) - assert(1 % math.huge == 1) - assert(1e30 % math.huge == 1e30) - assert(1e30 % -math.huge == -math.huge) - assert(-1 % math.huge == math.huge) - assert(-1 % -math.huge == -1) -end - - --- testing unsigned comparisons -assert(math.ult(3, 4)) -assert(not math.ult(4, 4)) -assert(math.ult(-2, -1)) -assert(math.ult(2, -1)) -assert(not math.ult(-2, -2)) -assert(math.ult(maxint, minint)) -assert(not math.ult(minint, maxint)) - - -assert(eq(math.sin(-9.8)^2 + math.cos(-9.8)^2, 1)) -assert(eq(math.tan(math.pi/4), 1)) -assert(eq(math.sin(math.pi/2), 1) and eq(math.cos(math.pi/2), 0)) -assert(eq(math.atan(1), math.pi/4) and eq(math.acos(0), math.pi/2) and - eq(math.asin(1), math.pi/2)) -assert(eq(math.deg(math.pi/2), 90) and eq(math.rad(90), math.pi/2)) -assert(math.abs(-10.43) == 10.43) -assert(eqT(math.abs(minint), minint)) -assert(eqT(math.abs(maxint), maxint)) -assert(eqT(math.abs(-maxint), maxint)) -assert(eq(math.atan(1,0), math.pi/2)) -assert(math.fmod(10,3) == 1) -assert(eq(math.sqrt(10)^2, 10)) -assert(eq(math.log(2, 10), math.log(2)/math.log(10))) -assert(eq(math.log(2, 2), 1)) -assert(eq(math.log(9, 3), 2)) -assert(eq(math.exp(0), 1)) -assert(eq(math.sin(10), math.sin(10%(2*math.pi)))) - - -assert(tonumber(' 1.3e-2 ') == 1.3e-2) -assert(tonumber(' -1.00000000000001 ') == -1.00000000000001) - --- testing constant limits --- 2^23 = 8388608 -assert(8388609 + -8388609 == 0) -assert(8388608 + -8388608 == 0) -assert(8388607 + -8388607 == 0) - - - -do -- testing floor & ceil - assert(eqT(math.floor(3.4), 3)) - assert(eqT(math.ceil(3.4), 4)) - assert(eqT(math.floor(-3.4), -4)) - assert(eqT(math.ceil(-3.4), -3)) - assert(eqT(math.floor(maxint), maxint)) - assert(eqT(math.ceil(maxint), maxint)) - assert(eqT(math.floor(minint), minint)) - assert(eqT(math.floor(minint + 0.0), minint)) - assert(eqT(math.ceil(minint), minint)) - assert(eqT(math.ceil(minint + 0.0), minint)) - assert(math.floor(1e50) == 1e50) - assert(math.ceil(1e50) == 1e50) - assert(math.floor(-1e50) == -1e50) - assert(math.ceil(-1e50) == -1e50) - for _, p in pairs{31,32,63,64} do - assert(math.floor(2^p) == 2^p) - assert(math.floor(2^p + 0.5) == 2^p) - assert(math.ceil(2^p) == 2^p) - assert(math.ceil(2^p - 0.5) == 2^p) - end - checkerror("number expected", math.floor, {}) - checkerror("number expected", math.ceil, print) - assert(eqT(math.tointeger(minint), minint)) - assert(eqT(math.tointeger(minint .. ""), minint)) - assert(eqT(math.tointeger(maxint), maxint)) - assert(eqT(math.tointeger(maxint .. ""), maxint)) - assert(eqT(math.tointeger(minint + 0.0), minint)) - assert(not math.tointeger(0.0 - minint)) - assert(not math.tointeger(math.pi)) - assert(not math.tointeger(-math.pi)) - assert(math.floor(math.huge) == math.huge) - assert(math.ceil(math.huge) == math.huge) - assert(not math.tointeger(math.huge)) - assert(math.floor(-math.huge) == -math.huge) - assert(math.ceil(-math.huge) == -math.huge) - assert(not math.tointeger(-math.huge)) - assert(math.tointeger("34.0") == 34) - assert(not math.tointeger("34.3")) - assert(not math.tointeger({})) - assert(not math.tointeger(0/0)) -- NaN -end - - --- testing fmod for integers -for i = -6, 6 do - for j = -6, 6 do - if j ~= 0 then - local mi = math.fmod(i, j) - local mf = math.fmod(i + 0.0, j) - assert(mi == mf) - assert(math.type(mi) == 'integer' and math.type(mf) == 'float') - if (i >= 0 and j >= 0) or (i <= 0 and j <= 0) or mi == 0 then - assert(eqT(mi, i % j)) - end - end - end -end -assert(eqT(math.fmod(minint, minint), 0)) -assert(eqT(math.fmod(maxint, maxint), 0)) -assert(eqT(math.fmod(minint + 1, minint), minint + 1)) -assert(eqT(math.fmod(maxint - 1, maxint), maxint - 1)) - -checkerror("zero", math.fmod, 3, 0) - - -do -- testing max/min - checkerror("value expected", math.max) - checkerror("value expected", math.min) - assert(eqT(math.max(3), 3)) - assert(eqT(math.max(3, 5, 9, 1), 9)) - assert(math.max(maxint, 10e60) == 10e60) - assert(eqT(math.max(minint, minint + 1), minint + 1)) - assert(eqT(math.min(3), 3)) - assert(eqT(math.min(3, 5, 9, 1), 1)) - assert(math.min(3.2, 5.9, -9.2, 1.1) == -9.2) - assert(math.min(1.9, 1.7, 1.72) == 1.7) - assert(math.min(-10e60, minint) == -10e60) - assert(eqT(math.min(maxint, maxint - 1), maxint - 1)) - assert(eqT(math.min(maxint - 2, maxint, maxint - 1), maxint - 2)) -end --- testing implicit conversions - -local a,b = '10', '20' -assert(a*b == 200 and a+b == 30 and a-b == -10 and a/b == 0.5 and -b == -20) -assert(a == '10' and b == '20') - - -do - print("testing -0 and NaN") - local mz = -0.0 - local z = 0.0 - assert(mz == z) - assert(1/mz < 0 and 0 < 1/z) - local a = {[mz] = 1} - assert(a[z] == 1 and a[mz] == 1) - a[z] = 2 - assert(a[z] == 2 and a[mz] == 2) - local inf = math.huge * 2 + 1 - local mz = -1/inf - local z = 1/inf - assert(mz == z) - assert(1/mz < 0 and 0 < 1/z) - local NaN = inf - inf - assert(NaN ~= NaN) - assert(not (NaN < NaN)) - assert(not (NaN <= NaN)) - assert(not (NaN > NaN)) - assert(not (NaN >= NaN)) - assert(not (0 < NaN) and not (NaN < 0)) - local NaN1 = 0/0 - assert(NaN ~= NaN1 and not (NaN <= NaN1) and not (NaN1 <= NaN)) - local a = {} - assert(not pcall(rawset, a, NaN, 1)) - assert(a[NaN] == undef) - a[1] = 1 - assert(not pcall(rawset, a, NaN, 1)) - assert(a[NaN] == undef) - -- strings with same binary representation as 0.0 (might create problems - -- for constant manipulation in the pre-compiler) - local a1, a2, a3, a4, a5 = 0, 0, "\0\0\0\0\0\0\0\0", 0, "\0\0\0\0\0\0\0\0" - assert(a1 == a2 and a2 == a4 and a1 ~= a3) - assert(a3 == a5) -end - - -print("testing 'math.random'") - -local random, max, min = math.random, math.max, math.min - -local function testnear (val, ref, tol) - return (math.abs(val - ref) < ref * tol) -end - - --- low-level!! For the current implementation of random in Lua, --- the first call after seed 1007 should return 0x7a7040a5a323c9d6 -do - -- all computations should work with 32-bit integers - local h = 0x7a7040a5 -- higher half - local l = 0xa323c9d6 -- lower half - - math.randomseed(1007) - -- get the low 'intbits' of the 64-bit expected result - local res = (h << 32 | l) & ~(~0 << intbits) - assert(random(0) == res) - - math.randomseed(1007, 0) - -- using higher bits to generate random floats; (the '% 2^32' converts - -- 32-bit integers to floats as unsigned) - local res - if floatbits <= 32 then - -- get all bits from the higher half - res = (h >> (32 - floatbits)) % 2^32 - else - -- get 32 bits from the higher half and the rest from the lower half - res = (h % 2^32) * 2^(floatbits - 32) + ((l >> (64 - floatbits)) % 2^32) - end - local rand = random() - assert(eq(rand, 0x0.7a7040a5a323c9d6, 2^-floatbits)) - assert(rand * 2^floatbits == res) -end - -do - -- testing return of 'randomseed' - local x, y = math.randomseed() - local res = math.random(0) - x, y = math.randomseed(x, y) -- should repeat the state - assert(math.random(0) == res) - math.randomseed(x, y) -- again should repeat the state - assert(math.random(0) == res) - -- keep the random seed for following tests - print(string.format("random seeds: %d, %d", x, y)) -end - -do -- test random for floats - local randbits = math.min(floatbits, 64) -- at most 64 random bits - local mult = 2^randbits -- to make random float into an integral - local counts = {} -- counts for bits - for i = 1, randbits do counts[i] = 0 end - local up = -math.huge - local low = math.huge - local rounds = 100 * randbits -- 100 times for each bit - local totalrounds = 0 - ::doagain:: -- will repeat test until we get good statistics - for i = 0, rounds do - local t = random() - assert(0 <= t and t < 1) - up = max(up, t) - low = min(low, t) - assert(t * mult % 1 == 0) -- no extra bits - local bit = i % randbits -- bit to be tested - if (t * 2^bit) % 1 >= 0.5 then -- is bit set? - counts[bit + 1] = counts[bit + 1] + 1 -- increment its count - end - end - totalrounds = totalrounds + rounds - if not (eq(up, 1, 0.001) and eq(low, 0, 0.001)) then - goto doagain - end - -- all bit counts should be near 50% - local expected = (totalrounds / randbits / 2) - for i = 1, randbits do - if not testnear(counts[i], expected, 0.10) then - goto doagain - end - end - print(string.format("float random range in %d calls: [%f, %f]", - totalrounds, low, up)) -end - - -do -- test random for full integers - local up = 0 - local low = 0 - local counts = {} -- counts for bits - for i = 1, intbits do counts[i] = 0 end - local rounds = 100 * intbits -- 100 times for each bit - local totalrounds = 0 - ::doagain:: -- will repeat test until we get good statistics - for i = 0, rounds do - local t = random(0) - up = max(up, t) - low = min(low, t) - local bit = i % intbits -- bit to be tested - -- increment its count if it is set - counts[bit + 1] = counts[bit + 1] + ((t >> bit) & 1) - end - totalrounds = totalrounds + rounds - local lim = maxint >> 10 - if not (maxint - up < lim and low - minint < lim) then - goto doagain - end - -- all bit counts should be near 50% - local expected = (totalrounds / intbits / 2) - for i = 1, intbits do - if not testnear(counts[i], expected, 0.10) then - goto doagain - end - end - print(string.format( - "integer random range in %d calls: [minint + %.0fppm, maxint - %.0fppm]", - totalrounds, (minint - low) / minint * 1e6, - (maxint - up) / maxint * 1e6)) -end - -do - -- test distribution for a dice - local count = {0, 0, 0, 0, 0, 0} - local rep = 200 - local totalrep = 0 - ::doagain:: - for i = 1, rep * 6 do - local r = random(6) - count[r] = count[r] + 1 - end - totalrep = totalrep + rep - for i = 1, 6 do - if not testnear(count[i], totalrep, 0.05) then - goto doagain - end - end -end - -do - local function aux (x1, x2) -- test random for small intervals - local mark = {}; local count = 0 -- to check that all values appeared - while true do - local t = random(x1, x2) - assert(x1 <= t and t <= x2) - if not mark[t] then -- new value - mark[t] = true - count = count + 1 - if count == x2 - x1 + 1 then -- all values appeared; OK - goto ok - end - end - end - ::ok:: - end - - aux(-10,0) - aux(1, 6) - aux(1, 2) - aux(1, 13) - aux(1, 31) - aux(1, 32) - aux(1, 33) - aux(-10, 10) - aux(-10,-10) -- unit set - aux(minint, minint) -- unit set - aux(maxint, maxint) -- unit set - aux(minint, minint + 9) - aux(maxint - 3, maxint) -end - -do - local function aux(p1, p2) -- test random for large intervals - local max = minint - local min = maxint - local n = 100 - local mark = {}; local count = 0 -- to count how many different values - ::doagain:: - for _ = 1, n do - local t = random(p1, p2) - if not mark[t] then -- new value - assert(p1 <= t and t <= p2) - max = math.max(max, t) - min = math.min(min, t) - mark[t] = true - count = count + 1 - end - end - -- at least 80% of values are different - if not (count >= n * 0.8) then - goto doagain - end - -- min and max not too far from formal min and max - local diff = (p2 - p1) >> 4 - if not (min < p1 + diff and max > p2 - diff) then - goto doagain - end - end - aux(0, maxint) - aux(1, maxint) - aux(3, maxint // 3) - aux(minint, -1) - aux(minint // 2, maxint // 2) - aux(minint, maxint) - aux(minint + 1, maxint) - aux(minint, maxint - 1) - aux(0, 1 << (intbits - 5)) -end - - -assert(not pcall(random, 1, 2, 3)) -- too many arguments - --- empty interval -assert(not pcall(random, minint + 1, minint)) -assert(not pcall(random, maxint, maxint - 1)) -assert(not pcall(random, maxint, minint)) - - - -print('OK') diff --git a/lua-5.4.7-tests/nextvar.lua b/lua-5.4.7-tests/nextvar.lua deleted file mode 100644 index 02b7dea..0000000 --- a/lua-5.4.7-tests/nextvar.lua +++ /dev/null @@ -1,825 +0,0 @@ --- $Id: testes/nextvar.lua $ --- See Copyright Notice in file all.lua - -print('testing tables, next, and for') - -local function checkerror (msg, f, ...) - local s, err = pcall(f, ...) - assert(not s and string.find(err, msg)) -end - - -local function check (t, na, nh) - if not T then return end - local a, h = T.querytab(t) - if a ~= na or h ~= nh then - print(na, nh, a, h) - assert(nil) - end -end - - -local a = {} - --- make sure table has lots of space in hash part -for i=1,100 do a[i.."+"] = true end -for i=1,100 do a[i.."+"] = undef end --- fill hash part with numeric indices testing size operator -for i=1,100 do - a[i] = true - assert(#a == i) -end - - -do -- rehash moving elements from array to hash - local a = {} - for i = 1, 100 do a[i] = i end - check(a, 128, 0) - - for i = 5, 95 do a[i] = nil end - check(a, 128, 0) - - a.x = 1 -- force a re-hash - check(a, 4, 8) - - for i = 1, 4 do assert(a[i] == i) end - for i = 5, 95 do assert(a[i] == nil) end - for i = 96, 100 do assert(a[i] == i) end - assert(a.x == 1) -end - - --- testing ipairs -local x = 0 -for k,v in ipairs{10,20,30;x=12} do - x = x + 1 - assert(k == x and v == x * 10) -end - -for _ in ipairs{x=12, y=24} do assert(nil) end - --- test for 'false' x ipair -x = false -local i = 0 -for k,v in ipairs{true,false,true,false} do - i = i + 1 - x = not x - assert(x == v) -end -assert(i == 4) - --- iterator function is always the same -assert(type(ipairs{}) == 'function' and ipairs{} == ipairs{}) - - -do -- overflow (must wrap-around) - local f = ipairs{} - local k, v = f({[math.mininteger] = 10}, math.maxinteger) - assert(k == math.mininteger and v == 10) - k, v = f({[math.mininteger] = 10}, k) - assert(k == nil) -end - -if not T then - (Message or print) - ('\n >>> testC not active: skipping tests for table sizes <<<\n') -else --[ --- testing table sizes - - -local function mp2 (n) -- minimum power of 2 >= n - local mp = 2^math.ceil(math.log(n, 2)) - assert(n == 0 or (mp/2 < n and n <= mp)) - return mp -end - - --- testing C library sizes -do - local s = 0 - for _ in pairs(math) do s = s + 1 end - check(math, 0, mp2(s)) -end - - --- testing constructor sizes -local sizes = {0, 1, 2, 3, 4, 5, 7, 8, 9, 15, 16, 17, - 30, 31, 32, 33, 34, 254, 255, 256, 500, 1000} - -for _, sa in ipairs(sizes) do -- 'sa' is size of the array part - local arr = {"return {"} - for i = 1, sa do arr[1 + i] = "1," end -- build array part - for _, sh in ipairs(sizes) do -- 'sh' is size of the hash part - for j = 1, sh do -- build hash part - arr[1 + sa + j] = string.format('k%x=%d,', j, j) - end - arr[1 + sa + sh + 1] = "}" - local prog = table.concat(arr) - local f = assert(load(prog)) - collectgarbage("stop") - f() -- call once to ensure stack space - -- make sure table is not resized after being created - if sa == 0 or sh == 0 then - T.alloccount(2); -- header + array or hash part - else - T.alloccount(3); -- header + array part + hash part - end - local t = f() - T.alloccount(); - collectgarbage("restart") - assert(#t == sa) - check(t, sa, mp2(sh)) - end -end - - --- tests with unknown number of elements -local a = {} -for i=1,sizes[#sizes] do a[i] = i end -- build auxiliary table -for k in ipairs(sizes) do - local t = {table.unpack(a,1,k)} - assert(#t == k) - check(t, k, 0) - t = {1,2,3,table.unpack(a,1,k)} - check(t, k+3, 0) - assert(#t == k + 3) -end - - --- testing tables dynamically built -local lim = 130 -local a = {}; a[2] = 1; check(a, 0, 1) -a = {}; a[0] = 1; check(a, 0, 1); a[2] = 1; check(a, 0, 2) -a = {}; a[0] = 1; a[1] = 1; check(a, 1, 1) -a = {} -for i = 1,lim do - a[i] = 1 - assert(#a == i) - check(a, mp2(i), 0) -end - -a = {} -for i = 1,lim do - a['a'..i] = 1 - assert(#a == 0) - check(a, 0, mp2(i)) -end - -a = {} -for i=1,16 do a[i] = i end -check(a, 16, 0) -do - for i=1,11 do a[i] = undef end - for i=30,50 do a[i] = true; a[i] = undef end -- force a rehash (?) - check(a, 0, 8) -- 5 elements in the table - a[10] = 1 - for i=30,50 do a[i] = true; a[i] = undef end -- force a rehash (?) - check(a, 0, 8) -- only 6 elements in the table - for i=1,14 do a[i] = true; a[i] = undef end - for i=18,50 do a[i] = true; a[i] = undef end -- force a rehash (?) - check(a, 0, 4) -- only 2 elements ([15] and [16]) -end - --- reverse filling -for i=1,lim do - local a = {} - for i=i,1,-1 do a[i] = i end -- fill in reverse - check(a, mp2(i), 0) -end - --- size tests for vararg -lim = 35 -local function foo (n, ...) - local arg = {...} - check(arg, n, 0) - assert(select('#', ...) == n) - arg[n+1] = true - check(arg, mp2(n+1), 0) - arg.x = true - check(arg, mp2(n+1), 1) -end -local a = {} -for i=1,lim do a[i] = true; foo(i, table.unpack(a)) end - - --- Table length with limit smaller than maximum value at array -local a = {} -for i = 1,64 do a[i] = true end -- make its array size 64 -for i = 1,64 do a[i] = nil end -- erase all elements -assert(T.querytab(a) == 64) -- array part has 64 elements -a[32] = true; a[48] = true; -- binary search will find these ones -a[51] = true -- binary search will miss this one -assert(#a == 48) -- this will set the limit -assert(select(4, T.querytab(a)) == 48) -- this is the limit now -a[50] = true -- this will set a new limit -assert(select(4, T.querytab(a)) == 50) -- this is the limit now --- but the size is larger (and still inside the array part) -assert(#a == 51) - -end --] - - --- test size operation on tables with nils -assert(#{} == 0) -assert(#{nil} == 0) -assert(#{nil, nil} == 0) -assert(#{nil, nil, nil} == 0) -assert(#{nil, nil, nil, nil} == 0) -assert(#{1, 2, 3, nil, nil} == 3) -print'+' - - -local nofind = {} - -a,b,c = 1,2,3 -a,b,c = nil - - --- next uses always the same iteraction function -assert(next{} == next{}) - -local function find (name) - local n,v - while 1 do - n,v = next(_G, n) - if not n then return nofind end - assert(_G[n] ~= undef) - if n == name then return v end - end -end - -local function find1 (name) - for n,v in pairs(_G) do - if n==name then return v end - end - return nil -- not found -end - - -assert(print==find("print") and print == find1("print")) -assert(_G["print"]==find("print")) -assert(assert==find1("assert")) -assert(nofind==find("return")) -assert(not find1("return")) -_G["ret" .. "urn"] = undef -assert(nofind==find("return")) -_G["xxx"] = 1 -assert(xxx==find("xxx")) - --- invalid key to 'next' -checkerror("invalid key", next, {10,20}, 3) - --- both 'pairs' and 'ipairs' need an argument -checkerror("bad argument", pairs) -checkerror("bad argument", ipairs) - -print('+') - -a = {} -for i=0,10000 do - if math.fmod(i,10) ~= 0 then - a['x'..i] = i - end -end - -n = {n=0} -for i,v in pairs(a) do - n.n = n.n+1 - assert(i and v and a[i] == v) -end -assert(n.n == 9000) -a = nil - -do -- clear global table - local a = {} - for n,v in pairs(_G) do a[n]=v end - for n,v in pairs(a) do - if not package.loaded[n] and type(v) ~= "function" and - not string.find(n, "^[%u_]") then - _G[n] = undef - end - collectgarbage() - end -end - - --- - -local function checknext (a) - local b = {} - do local k,v = next(a); while k do b[k] = v; k,v = next(a,k) end end - for k,v in pairs(b) do assert(a[k] == v) end - for k,v in pairs(a) do assert(b[k] == v) end -end - -checknext{1,x=1,y=2,z=3} -checknext{1,2,x=1,y=2,z=3} -checknext{1,2,3,x=1,y=2,z=3} -checknext{1,2,3,4,x=1,y=2,z=3} -checknext{1,2,3,4,5,x=1,y=2,z=3} - -assert(#{} == 0) -assert(#{[-1] = 2} == 0) -for i=0,40 do - local a = {} - for j=1,i do a[j]=j end - assert(#a == i) -end - --- 'maxn' is now deprecated, but it is easily defined in Lua -function table.maxn (t) - local max = 0 - for k in pairs(t) do - max = (type(k) == 'number') and math.max(max, k) or max - end - return max -end - -assert(table.maxn{} == 0) -assert(table.maxn{["1000"] = true} == 0) -assert(table.maxn{["1000"] = true, [24.5] = 3} == 24.5) -assert(table.maxn{[1000] = true} == 1000) -assert(table.maxn{[10] = true, [100*math.pi] = print} == 100*math.pi) - -table.maxn = nil - --- int overflow -a = {} -for i=0,50 do a[2^i] = true end -assert(a[#a]) - -print('+') - - -do -- testing 'next' with all kinds of keys - local a = { - [1] = 1, -- integer - [1.1] = 2, -- float - ['x'] = 3, -- short string - [string.rep('x', 1000)] = 4, -- long string - [print] = 5, -- C function - [checkerror] = 6, -- Lua function - [coroutine.running()] = 7, -- thread - [true] = 8, -- boolean - [io.stdin] = 9, -- userdata - [{}] = 10, -- table - } - local b = {}; for i = 1, 10 do b[i] = true end - for k, v in pairs(a) do - assert(b[v]); b[v] = undef - end - assert(next(b) == nil) -- 'b' now is empty -end - - --- erasing values -local t = {[{1}] = 1, [{2}] = 2, [string.rep("x ", 4)] = 3, - [100.3] = 4, [4] = 5} - -local n = 0 -for k, v in pairs( t ) do - n = n+1 - assert(t[k] == v) - t[k] = undef - collectgarbage() - assert(t[k] == undef) -end -assert(n == 5) - - -do - print("testing next x GC of deleted keys") - -- bug in 5.4.1 - local co = coroutine.wrap(function (t) - for k, v in pairs(t) do - local k1 = next(t) -- all previous keys were deleted - assert(k == k1) -- current key is the first in the table - t[k] = nil - local expected = (type(k) == "table" and k[1] or - type(k) == "function" and k() or - string.sub(k, 1, 1)) - assert(expected == v) - coroutine.yield(v) - end - end) - local t = {} - t[{1}] = 1 -- add several unanchored, collectable keys - t[{2}] = 2 - t[string.rep("a", 50)] = "a" -- long string - t[string.rep("b", 50)] = "b" - t[{3}] = 3 - t[string.rep("c", 10)] = "c" -- short string - t[function () return 10 end] = 10 - local count = 7 - while co(t) do - collectgarbage("collect") -- collect dead keys - count = count - 1 - end - assert(count == 0 and next(t) == nil) -- traversed the whole table -end - - -local function test (a) - assert(not pcall(table.insert, a, 2, 20)); - table.insert(a, 10); table.insert(a, 2, 20); - table.insert(a, 1, -1); table.insert(a, 40); - table.insert(a, #a+1, 50) - table.insert(a, 2, -2) - assert(a[2] ~= undef) - assert(a["2"] == undef) - assert(not pcall(table.insert, a, 0, 20)); - assert(not pcall(table.insert, a, #a + 2, 20)); - assert(table.remove(a,1) == -1) - assert(table.remove(a,1) == -2) - assert(table.remove(a,1) == 10) - assert(table.remove(a,1) == 20) - assert(table.remove(a,1) == 40) - assert(table.remove(a,1) == 50) - assert(table.remove(a,1) == nil) - assert(table.remove(a) == nil) - assert(table.remove(a, #a) == nil) -end - -a = {n=0, [-7] = "ban"} -test(a) -assert(a.n == 0 and a[-7] == "ban") - -a = {[-7] = "ban"}; -test(a) -assert(a.n == nil and #a == 0 and a[-7] == "ban") - -a = {[-1] = "ban"} -test(a) -assert(#a == 0 and table.remove(a) == nil and a[-1] == "ban") - -a = {[0] = "ban"} -assert(#a == 0 and table.remove(a) == "ban" and a[0] == undef) - -table.insert(a, 1, 10); table.insert(a, 1, 20); table.insert(a, 1, -1) -assert(table.remove(a) == 10) -assert(table.remove(a) == 20) -assert(table.remove(a) == -1) -assert(table.remove(a) == nil) - -a = {'c', 'd'} -table.insert(a, 3, 'a') -table.insert(a, 'b') -assert(table.remove(a, 1) == 'c') -assert(table.remove(a, 1) == 'd') -assert(table.remove(a, 1) == 'a') -assert(table.remove(a, 1) == 'b') -assert(table.remove(a, 1) == nil) -assert(#a == 0 and a.n == nil) - -a = {10,20,30,40} -assert(table.remove(a, #a + 1) == nil) -assert(not pcall(table.remove, a, 0)) -assert(a[#a] == 40) -assert(table.remove(a, #a) == 40) -assert(a[#a] == 30) -assert(table.remove(a, 2) == 20) -assert(a[#a] == 30 and #a == 2) - -do -- testing table library with metamethods - local function test (proxy, t) - for i = 1, 10 do - table.insert(proxy, 1, i) - end - assert(#proxy == 10 and #t == 10 and proxy[1] ~= undef) - for i = 1, 10 do - assert(t[i] == 11 - i) - end - table.sort(proxy) - for i = 1, 10 do - assert(t[i] == i and proxy[i] == i) - end - assert(table.concat(proxy, ",") == "1,2,3,4,5,6,7,8,9,10") - for i = 1, 8 do - assert(table.remove(proxy, 1) == i) - end - assert(#proxy == 2 and #t == 2) - local a, b, c = table.unpack(proxy) - assert(a == 9 and b == 10 and c == nil) - end - - -- all virtual - local t = {} - local proxy = setmetatable({}, { - __len = function () return #t end, - __index = t, - __newindex = t, - }) - test(proxy, t) - - -- only __newindex - local count = 0 - t = setmetatable({}, { - __newindex = function (t,k,v) count = count + 1; rawset(t,k,v) end}) - test(t, t) - assert(count == 10) -- after first 10, all other sets are not new - - -- no __newindex - t = setmetatable({}, { - __index = function (_,k) return k + 1 end, - __len = function (_) return 5 end}) - assert(table.concat(t, ";") == "2;3;4;5;6") - -end - - -do -- testing overflow in table.insert (must wrap-around) - - local t = setmetatable({}, - {__len = function () return math.maxinteger end}) - table.insert(t, 20) - local k, v = next(t) - assert(k == math.mininteger and v == 20) -end - -if not T then - (Message or print) - ('\n >>> testC not active: skipping tests for table library on non-tables <<<\n') -else --[ - local debug = require'debug' - local tab = {10, 20, 30} - local mt = {} - local u = T.newuserdata(0) - checkerror("table expected", table.insert, u, 40) - checkerror("table expected", table.remove, u) - debug.setmetatable(u, mt) - checkerror("table expected", table.insert, u, 40) - checkerror("table expected", table.remove, u) - mt.__index = tab - checkerror("table expected", table.insert, u, 40) - checkerror("table expected", table.remove, u) - mt.__newindex = tab - checkerror("table expected", table.insert, u, 40) - checkerror("table expected", table.remove, u) - mt.__len = function () return #tab end - table.insert(u, 40) - assert(#u == 4 and #tab == 4 and u[4] == 40 and tab[4] == 40) - assert(table.remove(u) == 40) - table.insert(u, 1, 50) - assert(#u == 4 and #tab == 4 and u[4] == 30 and tab[1] == 50) - - mt.__newindex = nil - mt.__len = nil - local tab2 = {} - local u2 = T.newuserdata(0) - debug.setmetatable(u2, {__newindex = function (_, k, v) tab2[k] = v end}) - table.move(u, 1, 4, 1, u2) - assert(#tab2 == 4 and tab2[1] == tab[1] and tab2[4] == tab[4]) - -end -- ] - -print('+') - -a = {} -for i=1,1000 do - a[i] = i; a[i - 1] = undef -end -assert(next(a,nil) == 1000 and next(a,1000) == nil) - -assert(next({}) == nil) -assert(next({}, nil) == nil) - -for a,b in pairs{} do error"not here" end -for i=1,0 do error'not here' end -for i=0,1,-1 do error'not here' end -a = nil; for i=1,1 do assert(not a); a=1 end; assert(a) -a = nil; for i=1,1,-1 do assert(not a); a=1 end; assert(a) - -do - print("testing floats in numeric for") - local a - -- integer count - a = 0; for i=1, 1, 1 do a=a+1 end; assert(a==1) - a = 0; for i=10000, 1e4, -1 do a=a+1 end; assert(a==1) - a = 0; for i=1, 0.99999, 1 do a=a+1 end; assert(a==0) - a = 0; for i=9999, 1e4, -1 do a=a+1 end; assert(a==0) - a = 0; for i=1, 0.99999, -1 do a=a+1 end; assert(a==1) - - -- float count - a = 0; for i=0, 0.999999999, 0.1 do a=a+1 end; assert(a==10) - a = 0; for i=1.0, 1, 1 do a=a+1 end; assert(a==1) - a = 0; for i=-1.5, -1.5, 1 do a=a+1 end; assert(a==1) - a = 0; for i=1e6, 1e6, -1 do a=a+1 end; assert(a==1) - a = 0; for i=1.0, 0.99999, 1 do a=a+1 end; assert(a==0) - a = 0; for i=99999, 1e5, -1.0 do a=a+1 end; assert(a==0) - a = 0; for i=1.0, 0.99999, -1 do a=a+1 end; assert(a==1) -end - -do -- changing the control variable - local a - a = 0; for i = 1, 10 do a = a + 1; i = "x" end; assert(a == 10) - a = 0; for i = 10.0, 1, -1 do a = a + 1; i = "x" end; assert(a == 10) -end - --- conversion -a = 0; for i="10","1","-2" do a=a+1 end; assert(a==5) - -do -- checking types - local c - local function checkfloat (i) - assert(math.type(i) == "float") - c = c + 1 - end - - c = 0; for i = 1.0, 10 do checkfloat(i) end - assert(c == 10) - - c = 0; for i = -1, -10, -1.0 do checkfloat(i) end - assert(c == 10) - - local function checkint (i) - assert(math.type(i) == "integer") - c = c + 1 - end - - local m = math.maxinteger - c = 0; for i = m, m - 10, -1 do checkint(i) end - assert(c == 11) - - c = 0; for i = 1, 10.9 do checkint(i) end - assert(c == 10) - - c = 0; for i = 10, 0.001, -1 do checkint(i) end - assert(c == 10) - - c = 0; for i = 1, "10.8" do checkint(i) end - assert(c == 10) - - c = 0; for i = 9, "3.4", -1 do checkint(i) end - assert(c == 6) - - c = 0; for i = 0, " -3.4 ", -1 do checkint(i) end - assert(c == 4) - - c = 0; for i = 100, "96.3", -2 do checkint(i) end - assert(c == 2) - - c = 0; for i = 1, math.huge do if i > 10 then break end; checkint(i) end - assert(c == 10) - - c = 0; for i = -1, -math.huge, -1 do - if i < -10 then break end; checkint(i) - end - assert(c == 10) - - - for i = math.mininteger, -10e100 do assert(false) end - for i = math.maxinteger, 10e100, -1 do assert(false) end - -end - - -do -- testing other strange cases for numeric 'for' - - local function checkfor (from, to, step, t) - local c = 0 - for i = from, to, step do - c = c + 1 - assert(i == t[c]) - end - assert(c == #t) - end - - local maxi = math.maxinteger - local mini = math.mininteger - - checkfor(mini, maxi, maxi, {mini, -1, maxi - 1}) - - checkfor(mini, math.huge, maxi, {mini, -1, maxi - 1}) - - checkfor(maxi, mini, mini, {maxi, -1}) - - checkfor(maxi, mini, -maxi, {maxi, 0, -maxi}) - - checkfor(maxi, -math.huge, mini, {maxi, -1}) - - checkfor(maxi, mini, 1, {}) - checkfor(mini, maxi, -1, {}) - - checkfor(maxi - 6, maxi, 3, {maxi - 6, maxi - 3, maxi}) - checkfor(mini + 4, mini, -2, {mini + 4, mini + 2, mini}) - - local step = maxi // 10 - local c = mini - for i = mini, maxi, step do - assert(i == c) - c = c + step - end - - c = maxi - for i = maxi, mini, -step do - assert(i == c) - c = c - step - end - - checkfor(maxi, maxi, maxi, {maxi}) - checkfor(maxi, maxi, mini, {maxi}) - checkfor(mini, mini, maxi, {mini}) - checkfor(mini, mini, mini, {mini}) -end - - -checkerror("'for' step is zero", function () - for i = 1, 10, 0 do end -end) - -checkerror("'for' step is zero", function () - for i = 1, -10, 0 do end -end) - -checkerror("'for' step is zero", function () - for i = 1.0, -10, 0.0 do end -end) - -collectgarbage() - - --- testing generic 'for' - -local function f (n, p) - local t = {}; for i=1,p do t[i] = i*10 end - return function (_, n, ...) - assert(select("#", ...) == 0) -- no extra arguments - if n > 0 then - n = n-1 - return n, table.unpack(t) - end - end, nil, n -end - -local x = 0 -for n,a,b,c,d in f(5,3) do - x = x+1 - assert(a == 10 and b == 20 and c == 30 and d == nil) -end -assert(x == 5) - - - --- testing __pairs and __ipairs metamethod -a = {} -do - local x,y,z = pairs(a) - assert(type(x) == 'function' and y == a and z == nil) -end - -local function foo (e,i) - assert(e == a) - if i <= 10 then return i+1, i+2 end -end - -local function foo1 (e,i) - i = i + 1 - assert(e == a) - if i <= e.n then return i,a[i] end -end - -setmetatable(a, {__pairs = function (x) return foo, x, 0 end}) - -local i = 0 -for k,v in pairs(a) do - i = i + 1 - assert(k == i and v == k+1) -end - -a.n = 5 -a[3] = 30 - --- testing ipairs with metamethods -a = {n=10} -setmetatable(a, { __index = function (t,k) - if k <= t.n then return k * 10 end - end}) -i = 0 -for k,v in ipairs(a) do - i = i + 1 - assert(k == i and v == i * 10) -end -assert(i == a.n) - - --- testing yield inside __pairs -do - local t = setmetatable({10, 20, 30}, {__pairs = function (t) - local inc = coroutine.yield() - return function (t, i) - if i > 1 then return i - inc, t[i - inc] else return nil end - end, t, #t + 1 - end}) - - local res = {} - local co = coroutine.wrap(function () - for i,p in pairs(t) do res[#res + 1] = p end - end) - - co() -- start coroutine - co(1) -- continue after yield - assert(res[1] == 30 and res[2] == 20 and res[3] == 10 and #res == 3) - -end - -print"OK" diff --git a/lua-5.4.7-tests/pm.lua b/lua-5.4.7-tests/pm.lua deleted file mode 100644 index e5e3f7a..0000000 --- a/lua-5.4.7-tests/pm.lua +++ /dev/null @@ -1,440 +0,0 @@ --- $Id: testes/pm.lua $ --- See Copyright Notice in file all.lua - --- UTF-8 file - - -print('testing pattern matching') - -local function checkerror (msg, f, ...) - local s, err = pcall(f, ...) - assert(not s and string.find(err, msg)) -end - - -local function f (s, p) - local i,e = string.find(s, p) - if i then return string.sub(s, i, e) end -end - -local a,b = string.find('', '') -- empty patterns are tricky -assert(a == 1 and b == 0); -a,b = string.find('alo', '') -assert(a == 1 and b == 0) -a,b = string.find('a\0o a\0o a\0o', 'a', 1) -- first position -assert(a == 1 and b == 1) -a,b = string.find('a\0o a\0o a\0o', 'a\0o', 2) -- starts in the midle -assert(a == 5 and b == 7) -a,b = string.find('a\0o a\0o a\0o', 'a\0o', 9) -- starts in the midle -assert(a == 9 and b == 11) -a,b = string.find('a\0a\0a\0a\0\0ab', '\0ab', 2); -- finds at the end -assert(a == 9 and b == 11); -a,b = string.find('a\0a\0a\0a\0\0ab', 'b') -- last position -assert(a == 11 and b == 11) -assert(not string.find('a\0a\0a\0a\0\0ab', 'b\0')) -- check ending -assert(not string.find('', '\0')) -assert(string.find('alo123alo', '12') == 4) -assert(not string.find('alo123alo', '^12')) - -assert(string.match("aaab", ".*b") == "aaab") -assert(string.match("aaa", ".*a") == "aaa") -assert(string.match("b", ".*b") == "b") - -assert(string.match("aaab", ".+b") == "aaab") -assert(string.match("aaa", ".+a") == "aaa") -assert(not string.match("b", ".+b")) - -assert(string.match("aaab", ".?b") == "ab") -assert(string.match("aaa", ".?a") == "aa") -assert(string.match("b", ".?b") == "b") - -assert(f('aloALO', '%l*') == 'alo') -assert(f('aLo_ALO', '%a*') == 'aLo') - -assert(f(" \n\r*&\n\r xuxu \n\n", "%g%g%g+") == "xuxu") - - --- Adapt a pattern to UTF-8 -local function PU (p) - -- reapply '?' into each individual byte of a character. - -- (For instance, "á?" becomes "\195?\161?".) - p = string.gsub(p, "(" .. utf8.charpattern .. ")%?", function (c) - return string.gsub(c, ".", "%0?") - end) - -- change '.' to utf-8 character patterns - p = string.gsub(p, "%.", utf8.charpattern) - return p -end - - -assert(f('aaab', 'a*') == 'aaa'); -assert(f('aaa', '^.*$') == 'aaa'); -assert(f('aaa', 'b*') == ''); -assert(f('aaa', 'ab*a') == 'aa') -assert(f('aba', 'ab*a') == 'aba') -assert(f('aaab', 'a+') == 'aaa') -assert(f('aaa', '^.+$') == 'aaa') -assert(not f('aaa', 'b+')) -assert(not f('aaa', 'ab+a')) -assert(f('aba', 'ab+a') == 'aba') -assert(f('a$a', '.$') == 'a') -assert(f('a$a', '.%$') == 'a$') -assert(f('a$a', '.$.') == 'a$a') -assert(not f('a$a', '$$')) -assert(not f('a$b', 'a$')) -assert(f('a$a', '$') == '') -assert(f('', 'b*') == '') -assert(not f('aaa', 'bb*')) -assert(f('aaab', 'a-') == '') -assert(f('aaa', '^.-$') == 'aaa') -assert(f('aabaaabaaabaaaba', 'b.*b') == 'baaabaaabaaab') -assert(f('aabaaabaaabaaaba', 'b.-b') == 'baaab') -assert(f('alo xo', '.o$') == 'xo') -assert(f(' \n isto é assim', '%S%S*') == 'isto') -assert(f(' \n isto é assim', '%S*$') == 'assim') -assert(f(' \n isto é assim', '[a-z]*$') == 'assim') -assert(f('um caracter ? extra', '[^%sa-z]') == '?') -assert(f('', 'a?') == '') -assert(f('á', PU'á?') == 'á') -assert(f('ábl', PU'á?b?l?') == 'ábl') -assert(f(' ábl', PU'á?b?l?') == '') -assert(f('aa', '^aa?a?a') == 'aa') -assert(f(']]]áb', '[^]]+') == 'áb') -assert(f("0alo alo", "%x*") == "0a") -assert(f("alo alo", "%C+") == "alo alo") -print('+') - - -local function f1 (s, p) - p = string.gsub(p, "%%([0-9])", function (s) - return "%" .. (tonumber(s)+1) - end) - p = string.gsub(p, "^(^?)", "%1()", 1) - p = string.gsub(p, "($?)$", "()%1", 1) - local t = {string.match(s, p)} - return string.sub(s, t[1], t[#t] - 1) -end - -assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o") -assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3') -assert(f1('=======', '^(=*)=%1$') == '=======') -assert(not string.match('==========', '^([=]*)=%1$')) - -local function range (i, j) - if i <= j then - return i, range(i+1, j) - end -end - -local abc = string.char(range(0, 127)) .. string.char(range(128, 255)); - -assert(string.len(abc) == 256) - -local function strset (p) - local res = {s=''} - string.gsub(abc, p, function (c) res.s = res.s .. c end) - return res.s -end; - -assert(string.len(strset('[\200-\210]')) == 11) - -assert(strset('[a-z]') == "abcdefghijklmnopqrstuvwxyz") -assert(strset('[a-z%d]') == strset('[%da-uu-z]')) -assert(strset('[a-]') == "-a") -assert(strset('[^%W]') == strset('[%w]')) -assert(strset('[]%%]') == '%]') -assert(strset('[a%-z]') == '-az') -assert(strset('[%^%[%-a%]%-b]') == '-[]^ab') -assert(strset('%Z') == strset('[\1-\255]')) -assert(strset('.') == strset('[\1-\255%z]')) -print('+'); - -assert(string.match("alo xyzK", "(%w+)K") == "xyz") -assert(string.match("254 K", "(%d*)K") == "") -assert(string.match("alo ", "(%w*)$") == "") -assert(not string.match("alo ", "(%w+)$")) -assert(string.find("(álo)", "%(á") == 1) -local a, b, c, d, e = string.match("âlo alo", PU"^(((.).). (%w*))$") -assert(a == 'âlo alo' and b == 'âl' and c == 'â' and d == 'alo' and e == nil) -a, b, c, d = string.match('0123456789', '(.+(.?)())') -assert(a == '0123456789' and b == '' and c == 11 and d == nil) -print('+') - -assert(string.gsub('ülo ülo', 'ü', 'x') == 'xlo xlo') -assert(string.gsub('alo úlo ', ' +$', '') == 'alo úlo') -- trim -assert(string.gsub(' alo alo ', '^%s*(.-)%s*$', '%1') == 'alo alo') -- double trim -assert(string.gsub('alo alo \n 123\n ', '%s+', ' ') == 'alo alo 123 ') -local t = "abç d" -a, b = string.gsub(t, PU'(.)', '%1@') -assert(a == "a@b@ç@ @d@" and b == 5) -a, b = string.gsub('abçd', PU'(.)', '%0@', 2) -assert(a == 'a@b@çd' and b == 2) -assert(string.gsub('alo alo', '()[al]', '%1') == '12o 56o') -assert(string.gsub("abc=xyz", "(%w*)(%p)(%w+)", "%3%2%1-%0") == - "xyz=abc-abc=xyz") -assert(string.gsub("abc", "%w", "%1%0") == "aabbcc") -assert(string.gsub("abc", "%w+", "%0%1") == "abcabc") -assert(string.gsub('áéí', '$', '\0óú') == 'áéí\0óú') -assert(string.gsub('', '^', 'r') == 'r') -assert(string.gsub('', '$', 'r') == 'r') -print('+') - - -do -- new (5.3.3) semantics for empty matches - assert(string.gsub("a b cd", " *", "-") == "-a-b-c-d-") - - local res = "" - local sub = "a \nbc\t\td" - local i = 1 - for p, e in string.gmatch(sub, "()%s*()") do - res = res .. string.sub(sub, i, p - 1) .. "-" - i = e - end - assert(res == "-a-b-c-d-") -end - - -assert(string.gsub("um (dois) tres (quatro)", "(%(%w+%))", string.upper) == - "um (DOIS) tres (QUATRO)") - -do - local function setglobal (n,v) rawset(_G, n, v) end - string.gsub("a=roberto,roberto=a", "(%w+)=(%w%w*)", setglobal) - assert(_G.a=="roberto" and _G.roberto=="a") - _G.a = nil; _G.roberto = nil -end - -function f(a,b) return string.gsub(a,'.',b) end -assert(string.gsub("trocar tudo em |teste|b| é |beleza|al|", "|([^|]*)|([^|]*)|", f) == - "trocar tudo em bbbbb é alalalalalal") - -local function dostring (s) return load(s, "")() or "" end -assert(string.gsub("alo $a='x'$ novamente $return a$", - "$([^$]*)%$", - dostring) == "alo novamente x") - -local x = string.gsub("$x=string.gsub('alo', '.', string.upper)$ assim vai para $return x$", - "$([^$]*)%$", dostring) -assert(x == ' assim vai para ALO') -_G.a, _G.x = nil - -local t = {} -local s = 'a alo jose joao' -local r = string.gsub(s, '()(%w+)()', function (a,w,b) - assert(string.len(w) == b-a); - t[a] = b-a; - end) -assert(s == r and t[1] == 1 and t[3] == 3 and t[7] == 4 and t[13] == 4) - - -local function isbalanced (s) - return not string.find(string.gsub(s, "%b()", ""), "[()]") -end - -assert(isbalanced("(9 ((8))(\0) 7) \0\0 a b ()(c)() a")) -assert(not isbalanced("(9 ((8) 7) a b (\0 c) a")) -assert(string.gsub("alo 'oi' alo", "%b''", '"') == 'alo " alo') - - -local t = {"apple", "orange", "lime"; n=0} -assert(string.gsub("x and x and x", "x", function () t.n=t.n+1; return t[t.n] end) - == "apple and orange and lime") - -t = {n=0} -string.gsub("first second word", "%w%w*", function (w) t.n=t.n+1; t[t.n] = w end) -assert(t[1] == "first" and t[2] == "second" and t[3] == "word" and t.n == 3) - -t = {n=0} -assert(string.gsub("first second word", "%w+", - function (w) t.n=t.n+1; t[t.n] = w end, 2) == "first second word") -assert(t[1] == "first" and t[2] == "second" and t[3] == undef) - -checkerror("invalid replacement value %(a table%)", - string.gsub, "alo", ".", {a = {}}) -checkerror("invalid capture index %%2", string.gsub, "alo", ".", "%2") -checkerror("invalid capture index %%0", string.gsub, "alo", "(%0)", "a") -checkerror("invalid capture index %%1", string.gsub, "alo", "(%1)", "a") -checkerror("invalid use of '%%'", string.gsub, "alo", ".", "%x") - - -if not _soft then - print("big strings") - local a = string.rep('a', 300000) - assert(string.find(a, '^a*.?$')) - assert(not string.find(a, '^a*.?b$')) - assert(string.find(a, '^a-.?$')) - - -- bug in 5.1.2 - a = string.rep('a', 10000) .. string.rep('b', 10000) - assert(not pcall(string.gsub, a, 'b')) -end - --- recursive nest of gsubs -local function rev (s) - return string.gsub(s, "(.)(.+)", function (c,s1) return rev(s1)..c end) -end - -local x = "abcdef" -assert(rev(rev(x)) == x) - - --- gsub with tables -assert(string.gsub("alo alo", ".", {}) == "alo alo") -assert(string.gsub("alo alo", "(.)", {a="AA", l=""}) == "AAo AAo") -assert(string.gsub("alo alo", "(.).", {a="AA", l="K"}) == "AAo AAo") -assert(string.gsub("alo alo", "((.)(.?))", {al="AA", o=false}) == "AAo AAo") - -assert(string.gsub("alo alo", "().", {'x','yy','zzz'}) == "xyyzzz alo") - -t = {}; setmetatable(t, {__index = function (t,s) return string.upper(s) end}) -assert(string.gsub("a alo b hi", "%w%w+", t) == "a ALO b HI") - - --- tests for gmatch -local a = 0 -for i in string.gmatch('abcde', '()') do assert(i == a+1); a=i end -assert(a==6) - -t = {n=0} -for w in string.gmatch("first second word", "%w+") do - t.n=t.n+1; t[t.n] = w -end -assert(t[1] == "first" and t[2] == "second" and t[3] == "word") - -t = {3, 6, 9} -for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do - assert(i == table.remove(t, 1)) -end -assert(#t == 0) - -t = {} -for i,j in string.gmatch("13 14 10 = 11, 15= 16, 22=23", "(%d+)%s*=%s*(%d+)") do - t[tonumber(i)] = tonumber(j) -end -a = 0 -for k,v in pairs(t) do assert(k+1 == v+0); a=a+1 end -assert(a == 3) - - -do -- init parameter in gmatch - local s = 0 - for k in string.gmatch("10 20 30", "%d+", 3) do - s = s + tonumber(k) - end - assert(s == 50) - - s = 0 - for k in string.gmatch("11 21 31", "%d+", -4) do - s = s + tonumber(k) - end - assert(s == 32) - - -- there is an empty string at the end of the subject - s = 0 - for k in string.gmatch("11 21 31", "%w*", 9) do - s = s + 1 - end - assert(s == 1) - - -- there are no empty strings after the end of the subject - s = 0 - for k in string.gmatch("11 21 31", "%w*", 10) do - s = s + 1 - end - assert(s == 0) -end - - --- tests for `%f' (`frontiers') - -assert(string.gsub("aaa aa a aaa a", "%f[%w]a", "x") == "xaa xa x xaa x") -assert(string.gsub("[[]] [][] [[[[", "%f[[].", "x") == "x[]] x]x] x[[[") -assert(string.gsub("01abc45de3", "%f[%d]", ".") == ".01abc.45de.3") -assert(string.gsub("01abc45 de3x", "%f[%D]%w", ".") == "01.bc45 de3.") -assert(string.gsub("function", "%f[\1-\255]%w", ".") == ".unction") -assert(string.gsub("function", "%f[^\1-\255]", ".") == "function.") - -assert(string.find("a", "%f[a]") == 1) -assert(string.find("a", "%f[^%z]") == 1) -assert(string.find("a", "%f[^%l]") == 2) -assert(string.find("aba", "%f[a%z]") == 3) -assert(string.find("aba", "%f[%z]") == 4) -assert(not string.find("aba", "%f[%l%z]")) -assert(not string.find("aba", "%f[^%l%z]")) - -local i, e = string.find(" alo aalo allo", "%f[%S].-%f[%s].-%f[%S]") -assert(i == 2 and e == 5) -local k = string.match(" alo aalo allo", "%f[%S](.-%f[%s].-%f[%S])") -assert(k == 'alo ') - -local a = {1, 5, 9, 14, 17,} -for k in string.gmatch("alo alo th02 is 1hat", "()%f[%w%d]") do - assert(table.remove(a, 1) == k) -end -assert(#a == 0) - - --- malformed patterns -local function malform (p, m) - m = m or "malformed" - local r, msg = pcall(string.find, "a", p) - assert(not r and string.find(msg, m)) -end - -malform("(.", "unfinished capture") -malform(".)", "invalid pattern capture") -malform("[a") -malform("[]") -malform("[^]") -malform("[a%]") -malform("[a%") -malform("%b") -malform("%ba") -malform("%") -malform("%f", "missing") - --- \0 in patterns -assert(string.match("ab\0\1\2c", "[\0-\2]+") == "\0\1\2") -assert(string.match("ab\0\1\2c", "[\0-\0]+") == "\0") -assert(string.find("b$a", "$\0?") == 2) -assert(string.find("abc\0efg", "%\0") == 4) -assert(string.match("abc\0efg\0\1e\1g", "%b\0\1") == "\0efg\0\1e\1") -assert(string.match("abc\0\0\0", "%\0+") == "\0\0\0") -assert(string.match("abc\0\0\0", "%\0%\0?") == "\0\0") - --- magic char after \0 -assert(string.find("abc\0\0","\0.") == 4) -assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4) - - -do -- test reuse of original string in gsub - local s = string.rep("a", 100) - local r = string.gsub(s, "b", "c") -- no match - assert(string.format("%p", s) == string.format("%p", r)) - - r = string.gsub(s, ".", {x = "y"}) -- no substitutions - assert(string.format("%p", s) == string.format("%p", r)) - - local count = 0 - r = string.gsub(s, ".", function (x) - assert(x == "a") - count = count + 1 - return nil -- no substitution - end) - r = string.gsub(r, ".", {b = 'x'}) -- "a" is not a key; no subst. - assert(count == 100) - assert(string.format("%p", s) == string.format("%p", r)) - - count = 0 - r = string.gsub(s, ".", function (x) - assert(x == "a") - count = count + 1 - return x -- substitution... - end) - assert(count == 100) - -- no reuse in this case - assert(r == s and string.format("%p", s) ~= string.format("%p", r)) -end - -print('OK') - diff --git a/lua-5.4.7-tests/sort.lua b/lua-5.4.7-tests/sort.lua deleted file mode 100644 index 40bb2d8..0000000 --- a/lua-5.4.7-tests/sort.lua +++ /dev/null @@ -1,311 +0,0 @@ --- $Id: testes/sort.lua $ --- See Copyright Notice in file all.lua - -print "testing (parts of) table library" - -print "testing unpack" - -local unpack = table.unpack - -local maxI = math.maxinteger -local minI = math.mininteger - - -local function checkerror (msg, f, ...) - local s, err = pcall(f, ...) - assert(not s and string.find(err, msg)) -end - - -checkerror("wrong number of arguments", table.insert, {}, 2, 3, 4) - -local x,y,z,a,n -a = {}; local lim = _soft and 200 or 2000 -for i=1, lim do a[i]=i end -assert(select(lim, unpack(a)) == lim and select('#', unpack(a)) == lim) -x = unpack(a) -assert(x == 1) -x = {unpack(a)} -assert(#x == lim and x[1] == 1 and x[lim] == lim) -x = {unpack(a, lim-2)} -assert(#x == 3 and x[1] == lim-2 and x[3] == lim) -x = {unpack(a, 10, 6)} -assert(next(x) == nil) -- no elements -x = {unpack(a, 11, 10)} -assert(next(x) == nil) -- no elements -x,y = unpack(a, 10, 10) -assert(x == 10 and y == nil) -x,y,z = unpack(a, 10, 11) -assert(x == 10 and y == 11 and z == nil) -a,x = unpack{1} -assert(a==1 and x==nil) -a,x = unpack({1,2}, 1, 1) -assert(a==1 and x==nil) - -do - local maxi = (1 << 31) - 1 -- maximum value for an int (usually) - local mini = -(1 << 31) -- minimum value for an int (usually) - checkerror("too many results", unpack, {}, 0, maxi) - checkerror("too many results", unpack, {}, 1, maxi) - checkerror("too many results", unpack, {}, 0, maxI) - checkerror("too many results", unpack, {}, 1, maxI) - checkerror("too many results", unpack, {}, mini, maxi) - checkerror("too many results", unpack, {}, -maxi, maxi) - checkerror("too many results", unpack, {}, minI, maxI) - unpack({}, maxi, 0) - unpack({}, maxi, 1) - unpack({}, maxI, minI) - pcall(unpack, {}, 1, maxi + 1) - local a, b = unpack({[maxi] = 20}, maxi, maxi) - assert(a == 20 and b == nil) - a, b = unpack({[maxi] = 20}, maxi - 1, maxi) - assert(a == nil and b == 20) - local t = {[maxI - 1] = 12, [maxI] = 23} - a, b = unpack(t, maxI - 1, maxI); assert(a == 12 and b == 23) - a, b = unpack(t, maxI, maxI); assert(a == 23 and b == nil) - a, b = unpack(t, maxI, maxI - 1); assert(a == nil and b == nil) - t = {[minI] = 12.3, [minI + 1] = 23.5} - a, b = unpack(t, minI, minI + 1); assert(a == 12.3 and b == 23.5) - a, b = unpack(t, minI, minI); assert(a == 12.3 and b == nil) - a, b = unpack(t, minI + 1, minI); assert(a == nil and b == nil) -end - -do -- length is not an integer - local t = setmetatable({}, {__len = function () return 'abc' end}) - assert(#t == 'abc') - checkerror("object length is not an integer", table.insert, t, 1) -end - -print "testing pack" - -a = table.pack() -assert(a[1] == undef and a.n == 0) - -a = table.pack(table) -assert(a[1] == table and a.n == 1) - -a = table.pack(nil, nil, nil, nil) -assert(a[1] == nil and a.n == 4) - - --- testing move -do - - checkerror("table expected", table.move, 1, 2, 3, 4) - - local function eqT (a, b) - for k, v in pairs(a) do assert(b[k] == v) end - for k, v in pairs(b) do assert(a[k] == v) end - end - - local a = table.move({10,20,30}, 1, 3, 2) -- move forward - eqT(a, {10,10,20,30}) - - -- move forward with overlap of 1 - a = table.move({10, 20, 30}, 1, 3, 3) - eqT(a, {10, 20, 10, 20, 30}) - - -- moving to the same table (not being explicit about it) - a = {10, 20, 30, 40} - table.move(a, 1, 4, 2, a) - eqT(a, {10, 10, 20, 30, 40}) - - a = table.move({10,20,30}, 2, 3, 1) -- move backward - eqT(a, {20,30,30}) - - a = {} -- move to new table - assert(table.move({10,20,30}, 1, 3, 1, a) == a) - eqT(a, {10,20,30}) - - a = {} - assert(table.move({10,20,30}, 1, 0, 3, a) == a) -- empty move (no move) - eqT(a, {}) - - a = table.move({10,20,30}, 1, 10, 1) -- move to the same place - eqT(a, {10,20,30}) - - -- moving on the fringes - a = table.move({[maxI - 2] = 1, [maxI - 1] = 2, [maxI] = 3}, - maxI - 2, maxI, -10, {}) - eqT(a, {[-10] = 1, [-9] = 2, [-8] = 3}) - - a = table.move({[minI] = 1, [minI + 1] = 2, [minI + 2] = 3}, - minI, minI + 2, -10, {}) - eqT(a, {[-10] = 1, [-9] = 2, [-8] = 3}) - - a = table.move({45}, 1, 1, maxI) - eqT(a, {45, [maxI] = 45}) - - a = table.move({[maxI] = 100}, maxI, maxI, minI) - eqT(a, {[minI] = 100, [maxI] = 100}) - - a = table.move({[minI] = 100}, minI, minI, maxI) - eqT(a, {[minI] = 100, [maxI] = 100}) - - a = setmetatable({}, { - __index = function (_,k) return k * 10 end, - __newindex = error}) - local b = table.move(a, 1, 10, 3, {}) - eqT(a, {}) - eqT(b, {nil,nil,10,20,30,40,50,60,70,80,90,100}) - - b = setmetatable({""}, { - __index = error, - __newindex = function (t,k,v) - t[1] = string.format("%s(%d,%d)", t[1], k, v) - end}) - table.move(a, 10, 13, 3, b) - assert(b[1] == "(3,100)(4,110)(5,120)(6,130)") - local stat, msg = pcall(table.move, b, 10, 13, 3, b) - assert(not stat and msg == b) -end - -do - -- for very long moves, just check initial accesses and interrupt - -- move with an error - local function checkmove (f, e, t, x, y) - local pos1, pos2 - local a = setmetatable({}, { - __index = function (_,k) pos1 = k end, - __newindex = function (_,k) pos2 = k; error() end, }) - local st, msg = pcall(table.move, a, f, e, t) - assert(not st and not msg and pos1 == x and pos2 == y) - end - checkmove(1, maxI, 0, 1, 0) - checkmove(0, maxI - 1, 1, maxI - 1, maxI) - checkmove(minI, -2, -5, -2, maxI - 6) - checkmove(minI + 1, -1, -2, -1, maxI - 3) - checkmove(minI, -2, 0, minI, 0) -- non overlapping - checkmove(minI + 1, -1, 1, minI + 1, 1) -- non overlapping -end - -checkerror("too many", table.move, {}, 0, maxI, 1) -checkerror("too many", table.move, {}, -1, maxI - 1, 1) -checkerror("too many", table.move, {}, minI, -1, 1) -checkerror("too many", table.move, {}, minI, maxI, 1) -checkerror("wrap around", table.move, {}, 1, maxI, 2) -checkerror("wrap around", table.move, {}, 1, 2, maxI) -checkerror("wrap around", table.move, {}, minI, -2, 2) - - -print"testing sort" - - --- strange lengths -local a = setmetatable({}, {__len = function () return -1 end}) -assert(#a == -1) -table.sort(a, error) -- should not compare anything -a = setmetatable({}, {__len = function () return maxI end}) -checkerror("too big", table.sort, a) - --- test checks for invalid order functions -local function check (t) - local function f(a, b) assert(a and b); return true end - checkerror("invalid order function", table.sort, t, f) -end - -check{1,2,3,4} -check{1,2,3,4,5} -check{1,2,3,4,5,6} - - -function check (a, f) - f = f or function (x,y) return x = math.maxinteger -local mini = math.mininteger - - -local function checkerror (msg, f, ...) - local s, err = pcall(f, ...) - assert(not s and string.find(err, msg)) -end - - --- testing string comparisons -assert('alo' < 'alo1') -assert('' < 'a') -assert('alo\0alo' < 'alo\0b') -assert('alo\0alo\0\0' > 'alo\0alo\0') -assert('alo' < 'alo\0') -assert('alo\0' > 'alo') -assert('\0' < '\1') -assert('\0\0' < '\0\1') -assert('\1\0a\0a' <= '\1\0a\0a') -assert(not ('\1\0a\0b' <= '\1\0a\0a')) -assert('\0\0\0' < '\0\0\0\0') -assert(not('\0\0\0\0' < '\0\0\0')) -assert('\0\0\0' <= '\0\0\0\0') -assert(not('\0\0\0\0' <= '\0\0\0')) -assert('\0\0\0' <= '\0\0\0') -assert('\0\0\0' >= '\0\0\0') -assert(not ('\0\0b' < '\0\0a\0')) - --- testing string.sub -assert(string.sub("123456789",2,4) == "234") -assert(string.sub("123456789",7) == "789") -assert(string.sub("123456789",7,6) == "") -assert(string.sub("123456789",7,7) == "7") -assert(string.sub("123456789",0,0) == "") -assert(string.sub("123456789",-10,10) == "123456789") -assert(string.sub("123456789",1,9) == "123456789") -assert(string.sub("123456789",-10,-20) == "") -assert(string.sub("123456789",-1) == "9") -assert(string.sub("123456789",-4) == "6789") -assert(string.sub("123456789",-6, -4) == "456") -assert(string.sub("123456789", mini, -4) == "123456") -assert(string.sub("123456789", mini, maxi) == "123456789") -assert(string.sub("123456789", mini, mini) == "") -assert(string.sub("\000123456789",3,5) == "234") -assert(("\000123456789"):sub(8) == "789") - --- testing string.find -assert(string.find("123456789", "345") == 3) -local a,b = string.find("123456789", "345") -assert(string.sub("123456789", a, b) == "345") -assert(string.find("1234567890123456789", "345", 3) == 3) -assert(string.find("1234567890123456789", "345", 4) == 13) -assert(not string.find("1234567890123456789", "346", 4)) -assert(string.find("1234567890123456789", ".45", -9) == 13) -assert(not string.find("abcdefg", "\0", 5, 1)) -assert(string.find("", "") == 1) -assert(string.find("", "", 1) == 1) -assert(not string.find("", "", 2)) -assert(not string.find('', 'aaa', 1)) -assert(('alo(.)alo'):find('(.)', 1, 1) == 4) - -assert(string.len("") == 0) -assert(string.len("\0\0\0") == 3) -assert(string.len("1234567890") == 10) - -assert(#"" == 0) -assert(#"\0\0\0" == 3) -assert(#"1234567890" == 10) - --- testing string.byte/string.char -assert(string.byte("a") == 97) -assert(string.byte("\xe4") > 127) -assert(string.byte(string.char(255)) == 255) -assert(string.byte(string.char(0)) == 0) -assert(string.byte("\0") == 0) -assert(string.byte("\0\0alo\0x", -1) == string.byte('x')) -assert(string.byte("ba", 2) == 97) -assert(string.byte("\n\n", 2, -1) == 10) -assert(string.byte("\n\n", 2, 2) == 10) -assert(string.byte("") == nil) -assert(string.byte("hi", -3) == nil) -assert(string.byte("hi", 3) == nil) -assert(string.byte("hi", 9, 10) == nil) -assert(string.byte("hi", 2, 1) == nil) -assert(string.char() == "") -assert(string.char(0, 255, 0) == "\0\255\0") -assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0") -assert(string.char(string.byte("\xe4l\0óu", 1, -1)) == "\xe4l\0óu") -assert(string.char(string.byte("\xe4l\0óu", 1, 0)) == "") -assert(string.char(string.byte("\xe4l\0óu", -10, 100)) == "\xe4l\0óu") - -checkerror("out of range", string.char, 256) -checkerror("out of range", string.char, -1) -checkerror("out of range", string.char, math.maxinteger) -checkerror("out of range", string.char, math.mininteger) - -assert(string.upper("ab\0c") == "AB\0C") -assert(string.lower("\0ABCc%$") == "\0abcc%$") -assert(string.rep('teste', 0) == '') -assert(string.rep('tés\00tê', 2) == 'tés\0têtés\000tê') -assert(string.rep('', 10) == '') - -if string.packsize("i") == 4 then - -- result length would be 2^31 (int overflow) - checkerror("too large", string.rep, 'aa', (1 << 30)) - checkerror("too large", string.rep, 'a', (1 << 30), ',') -end - --- repetitions with separator -assert(string.rep('teste', 0, 'xuxu') == '') -assert(string.rep('teste', 1, 'xuxu') == 'teste') -assert(string.rep('\1\0\1', 2, '\0\0') == '\1\0\1\0\0\1\0\1') -assert(string.rep('', 10, '.') == string.rep('.', 9)) -assert(not pcall(string.rep, "aa", maxi // 2 + 10)) -assert(not pcall(string.rep, "", maxi // 2 + 10, "aa")) - -assert(string.reverse"" == "") -assert(string.reverse"\0\1\2\3" == "\3\2\1\0") -assert(string.reverse"\0001234" == "4321\0") - -for i=0,30 do assert(string.len(string.rep('a', i)) == i) end - -assert(type(tostring(nil)) == 'string') -assert(type(tostring(12)) == 'string') -assert(string.find(tostring{}, 'table:')) -assert(string.find(tostring(print), 'function:')) -assert(#tostring('\0') == 1) -assert(tostring(true) == "true") -assert(tostring(false) == "false") -assert(tostring(-1203) == "-1203") -assert(tostring(1203.125) == "1203.125") -assert(tostring(-0.5) == "-0.5") -assert(tostring(-32767) == "-32767") -if math.tointeger(2147483647) then -- no overflow? (32 bits) - assert(tostring(-2147483647) == "-2147483647") -end -if math.tointeger(4611686018427387904) then -- no overflow? (64 bits) - assert(tostring(4611686018427387904) == "4611686018427387904") - assert(tostring(-4611686018427387904) == "-4611686018427387904") -end - -if tostring(0.0) == "0.0" then -- "standard" coercion float->string - assert('' .. 12 == '12' and 12.0 .. '' == '12.0') - assert(tostring(-1203 + 0.0) == "-1203.0") -else -- compatible coercion - assert(tostring(0.0) == "0") - assert('' .. 12 == '12' and 12.0 .. '' == '12') - assert(tostring(-1203 + 0.0) == "-1203") -end - -do -- tests for '%p' format - -- not much to test, as C does not specify what '%p' does. - -- ("The value of the pointer is converted to a sequence of printing - -- characters, in an implementation-defined manner.") - local null = "(null)" -- nulls are formatted by Lua - assert(string.format("%p", 4) == null) - assert(string.format("%p", true) == null) - assert(string.format("%p", nil) == null) - assert(string.format("%p", {}) ~= null) - assert(string.format("%p", print) ~= null) - assert(string.format("%p", coroutine.running()) ~= null) - assert(string.format("%p", io.stdin) ~= null) - assert(string.format("%p", io.stdin) == string.format("%p", io.stdin)) - assert(string.format("%p", print) == string.format("%p", print)) - assert(string.format("%p", print) ~= string.format("%p", assert)) - - assert(#string.format("%90p", {}) == 90) - assert(#string.format("%-60p", {}) == 60) - assert(string.format("%10p", false) == string.rep(" ", 10 - #null) .. null) - assert(string.format("%-12p", 1.5) == null .. string.rep(" ", 12 - #null)) - - do - local t1 = {}; local t2 = {} - assert(string.format("%p", t1) ~= string.format("%p", t2)) - end - - do -- short strings are internalized - local s1 = string.rep("a", 10) - local s2 = string.rep("aa", 5) - assert(string.format("%p", s1) == string.format("%p", s2)) - end - - do -- long strings aren't internalized - local s1 = string.rep("a", 300); local s2 = string.rep("a", 300) - assert(string.format("%p", s1) ~= string.format("%p", s2)) - end -end - -local x = '"ílo"\n\\' -assert(string.format('%q%s', x, x) == '"\\"ílo\\"\\\n\\\\""ílo"\n\\') -assert(string.format('%q', "\0") == [["\0"]]) -assert(load(string.format('return %q', x))() == x) -x = "\0\1\0023\5\0009" -assert(load(string.format('return %q', x))() == x) -assert(string.format("\0%c\0%c%x\0", string.byte("\xe4"), string.byte("b"), 140) == - "\0\xe4\0b8c\0") -assert(string.format('') == "") -assert(string.format("%c",34)..string.format("%c",48)..string.format("%c",90)..string.format("%c",100) == - string.format("%1c%-c%-1c%c", 34, 48, 90, 100)) -assert(string.format("%s\0 is not \0%s", 'not be', 'be') == 'not be\0 is not \0be') -assert(string.format("%%%d %010d", 10, 23) == "%10 0000000023") -assert(tonumber(string.format("%f", 10.3)) == 10.3) -assert(string.format('"%-50s"', 'a') == '"a' .. string.rep(' ', 49) .. '"') - -assert(string.format("-%.20s.20s", string.rep("%", 2000)) == - "-"..string.rep("%", 20)..".20s") -assert(string.format('"-%20s.20s"', string.rep("%", 2000)) == - string.format("%q", "-"..string.rep("%", 2000)..".20s")) - -do - local function checkQ (v) - local s = string.format("%q", v) - local nv = load("return " .. s)() - assert(v == nv and math.type(v) == math.type(nv)) - end - checkQ("\0\0\1\255\u{234}") - checkQ(math.maxinteger) - checkQ(math.mininteger) - checkQ(math.pi) - checkQ(0.1) - checkQ(true) - checkQ(nil) - checkQ(false) - checkQ(math.huge) - checkQ(-math.huge) - assert(string.format("%q", 0/0) == "(0/0)") -- NaN - checkerror("no literal", string.format, "%q", {}) -end - -assert(string.format("\0%s\0", "\0\0\1") == "\0\0\0\1\0") -checkerror("contains zeros", string.format, "%10s", "\0") - --- format x tostring -assert(string.format("%s %s", nil, true) == "nil true") -assert(string.format("%s %.4s", false, true) == "false true") -assert(string.format("%.3s %.3s", false, true) == "fal tru") -local m = setmetatable({}, {__tostring = function () return "hello" end, - __name = "hi"}) -assert(string.format("%s %.10s", m, m) == "hello hello") -getmetatable(m).__tostring = nil -- will use '__name' from now on -assert(string.format("%.4s", m) == "hi: ") - -getmetatable(m).__tostring = function () return {} end -checkerror("'__tostring' must return a string", tostring, m) - - -assert(string.format("%x", 0.0) == "0") -assert(string.format("%02x", 0.0) == "00") -assert(string.format("%08X", 0xFFFFFFFF) == "FFFFFFFF") -assert(string.format("%+08d", 31501) == "+0031501") -assert(string.format("%+08d", -30927) == "-0030927") - - -do -- longest number that can be formatted - local i = 1 - local j = 10000 - while i + 1 < j do -- binary search for maximum finite float - local m = (i + j) // 2 - if 10^m < math.huge then i = m else j = m end - end - assert(10^i < math.huge and 10^j == math.huge) - local s = string.format('%.99f', -(10^i)) - assert(string.len(s) >= i + 101) - assert(tonumber(s) == -(10^i)) - - -- limit for floats - assert(10^38 < math.huge) - local s = string.format('%.99f', -(10^38)) - assert(string.len(s) >= 38 + 101) - assert(tonumber(s) == -(10^38)) -end - - --- testing large numbers for format -do -- assume at least 32 bits - local max, min = 0x7fffffff, -0x80000000 -- "large" for 32 bits - assert(string.sub(string.format("%8x", -1), -8) == "ffffffff") - assert(string.format("%x", max) == "7fffffff") - assert(string.sub(string.format("%x", min), -8) == "80000000") - assert(string.format("%d", max) == "2147483647") - assert(string.format("%d", min) == "-2147483648") - assert(string.format("%u", 0xffffffff) == "4294967295") - assert(string.format("%o", 0xABCD) == "125715") - - max, min = 0x7fffffffffffffff, -0x8000000000000000 - if max > 2.0^53 then -- only for 64 bits - assert(string.format("%x", (2^52 | 0) - 1) == "fffffffffffff") - assert(string.format("0x%8X", 0x8f000003) == "0x8F000003") - assert(string.format("%d", 2^53) == "9007199254740992") - assert(string.format("%i", -2^53) == "-9007199254740992") - assert(string.format("%x", max) == "7fffffffffffffff") - assert(string.format("%x", min) == "8000000000000000") - assert(string.format("%d", max) == "9223372036854775807") - assert(string.format("%d", min) == "-9223372036854775808") - assert(string.format("%u", ~(-1 << 64)) == "18446744073709551615") - assert(tostring(1234567890123) == '1234567890123') - end -end - - -do print("testing 'format %a %A'") - local function matchhexa (n) - local s = string.format("%a", n) - -- result matches ISO C requirements - assert(string.find(s, "^%-?0x[1-9a-f]%.?[0-9a-f]*p[-+]?%d+$")) - assert(tonumber(s) == n) -- and has full precision - s = string.format("%A", n) - assert(string.find(s, "^%-?0X[1-9A-F]%.?[0-9A-F]*P[-+]?%d+$")) - assert(tonumber(s) == n) - end - for _, n in ipairs{0.1, -0.1, 1/3, -1/3, 1e30, -1e30, - -45/247, 1, -1, 2, -2, 3e-20, -3e-20} do - matchhexa(n) - end - - assert(string.find(string.format("%A", 0.0), "^0X0%.?0*P%+?0$")) - assert(string.find(string.format("%a", -0.0), "^%-0x0%.?0*p%+?0$")) - - if not _port then -- test inf, -inf, NaN, and -0.0 - assert(string.find(string.format("%a", 1/0), "^inf")) - assert(string.find(string.format("%A", -1/0), "^%-INF")) - assert(string.find(string.format("%a", 0/0), "^%-?nan")) - assert(string.find(string.format("%a", -0.0), "^%-0x0")) - end - - if not pcall(string.format, "%.3a", 0) then - (Message or print)("\n >>> modifiers for format '%a' not available <<<\n") - else - assert(string.find(string.format("%+.2A", 12), "^%+0X%x%.%x0P%+?%d$")) - assert(string.find(string.format("%.4A", -12), "^%-0X%x%.%x000P%+?%d$")) - end -end - - --- testing some flags (all these results are required by ISO C) -assert(string.format("%#12o", 10) == " 012") -assert(string.format("%#10x", 100) == " 0x64") -assert(string.format("%#-17X", 100) == "0X64 ") -assert(string.format("%013i", -100) == "-000000000100") -assert(string.format("%2.5d", -100) == "-00100") -assert(string.format("%.u", 0) == "") -assert(string.format("%+#014.0f", 100) == "+000000000100.") -assert(string.format("%-16c", 97) == "a ") -assert(string.format("%+.3G", 1.5) == "+1.5") -assert(string.format("%.0s", "alo") == "") -assert(string.format("%.s", "alo") == "") - --- ISO C89 says that "The exponent always contains at least two digits", --- but unlike ISO C99 it does not ensure that it contains "only as many --- more digits as necessary". -assert(string.match(string.format("% 1.0E", 100), "^ 1E%+0+2$")) -assert(string.match(string.format("% .1g", 2^10), "^ 1e%+0+3$")) - - --- errors in format - -local function check (fmt, msg) - checkerror(msg, string.format, fmt, 10) -end - -local aux = string.rep('0', 600) -check("%100.3d", "invalid conversion") -check("%1"..aux..".3d", "too long") -check("%1.100d", "invalid conversion") -check("%10.1"..aux.."004d", "too long") -check("%t", "invalid conversion") -check("%"..aux.."d", "too long") -check("%d %d", "no value") -check("%010c", "invalid conversion") -check("%.10c", "invalid conversion") -check("%0.34s", "invalid conversion") -check("%#i", "invalid conversion") -check("%3.1p", "invalid conversion") -check("%0.s", "invalid conversion") -check("%10q", "cannot have modifiers") -check("%F", "invalid conversion") -- useless and not in C89 - - -assert(load("return 1\n--comment without ending EOL")() == 1) - - -checkerror("table expected", table.concat, 3) -checkerror("at index " .. maxi, table.concat, {}, " ", maxi, maxi) --- '%' escapes following minus signal -checkerror("at index %" .. mini, table.concat, {}, " ", mini, mini) -assert(table.concat{} == "") -assert(table.concat({}, 'x') == "") -assert(table.concat({'\0', '\0\1', '\0\1\2'}, '.\0.') == "\0.\0.\0\1.\0.\0\1\2") -local a = {}; for i=1,300 do a[i] = "xuxu" end -assert(table.concat(a, "123").."123" == string.rep("xuxu123", 300)) -assert(table.concat(a, "b", 20, 20) == "xuxu") -assert(table.concat(a, "", 20, 21) == "xuxuxuxu") -assert(table.concat(a, "x", 22, 21) == "") -assert(table.concat(a, "3", 299) == "xuxu3xuxu") -assert(table.concat({}, "x", maxi, maxi - 1) == "") -assert(table.concat({}, "x", mini + 1, mini) == "") -assert(table.concat({}, "x", maxi, mini) == "") -assert(table.concat({[maxi] = "alo"}, "x", maxi, maxi) == "alo") -assert(table.concat({[maxi] = "alo", [maxi - 1] = "y"}, "-", maxi - 1, maxi) - == "y-alo") - -assert(not pcall(table.concat, {"a", "b", {}})) - -a = {"a","b","c"} -assert(table.concat(a, ",", 1, 0) == "") -assert(table.concat(a, ",", 1, 1) == "a") -assert(table.concat(a, ",", 1, 2) == "a,b") -assert(table.concat(a, ",", 2) == "b,c") -assert(table.concat(a, ",", 3) == "c") -assert(table.concat(a, ",", 4) == "") - -if not _port then - - local locales = { "ptb", "pt_BR.iso88591", "ISO-8859-1" } - local function trylocale (w) - for i = 1, #locales do - if os.setlocale(locales[i], w) then - print(string.format("'%s' locale set to '%s'", w, locales[i])) - return locales[i] - end - end - print(string.format("'%s' locale not found", w)) - return false - end - - if trylocale("collate") then - assert("alo" < "álo" and "álo" < "amo") - end - - if trylocale("ctype") then - assert(string.gsub("áéíóú", "%a", "x") == "xxxxx") - assert(string.gsub("áÁéÉ", "%l", "x") == "xÁxÉ") - assert(string.gsub("áÁéÉ", "%u", "x") == "áxéx") - assert(string.upper"áÁé{xuxu}ção" == "ÁÁÉ{XUXU}ÇÃO") - end - - os.setlocale("C") - assert(os.setlocale() == 'C') - assert(os.setlocale(nil, "numeric") == 'C') - -end - - --- bug in Lua 5.3.2 --- 'gmatch' iterator does not work across coroutines -do - local f = string.gmatch("1 2 3 4 5", "%d+") - assert(f() == "1") - local co = coroutine.wrap(f) - assert(co() == "2") -end - - -if T==nil then - (Message or print) - ("\n >>> testC not active: skipping 'pushfstring' tests <<<\n") -else - - print"testing 'pushfstring'" - - -- formats %U, %f, %I already tested elsewhere - - local blen = 200 -- internal buffer length in 'luaO_pushfstring' - - local function callpfs (op, fmt, n) - local x = {T.testC("pushfstring" .. op .. "; return *", fmt, n)} - -- stack has code, 'fmt', 'n', and result from operation - assert(#x == 4) -- make sure nothing else was left in the stack - return x[4] - end - - local function testpfs (op, fmt, n) - assert(callpfs(op, fmt, n) == string.format(fmt, n)) - end - - testpfs("I", "", 0) - testpfs("I", string.rep("a", blen - 1), 0) - testpfs("I", string.rep("a", blen), 0) - testpfs("I", string.rep("a", blen + 1), 0) - - local str = string.rep("ab", blen) .. "%d" .. string.rep("d", blen / 2) - testpfs("I", str, 2^14) - testpfs("I", str, -2^15) - - str = "%d" .. string.rep("cd", blen) - testpfs("I", str, 2^14) - testpfs("I", str, -2^15) - - str = string.rep("c", blen - 2) .. "%d" - testpfs("I", str, 2^14) - testpfs("I", str, -2^15) - - for l = 12, 14 do - local str1 = string.rep("a", l) - for i = 0, 500, 13 do - for j = 0, 500, 13 do - str = string.rep("a", i) .. "%s" .. string.rep("d", j) - testpfs("S", str, str1) - testpfs("S", str, str) - end - end - end - - str = "abc %c def" - testpfs("I", str, string.byte("A")) - testpfs("I", str, 255) - - str = string.rep("a", blen - 1) .. "%p" .. string.rep("cd", blen) - testpfs("P", str, {}) - - str = string.rep("%%", 3 * blen) .. "%p" .. string.rep("%%", 2 * blen) - testpfs("P", str, {}) -end - - -print('OK') - diff --git a/lua-5.4.7-tests/tpack.lua b/lua-5.4.7-tests/tpack.lua deleted file mode 100644 index bfa63fc..0000000 --- a/lua-5.4.7-tests/tpack.lua +++ /dev/null @@ -1,322 +0,0 @@ --- $Id: testes/tpack.lua $ --- See Copyright Notice in file all.lua - -local pack = string.pack -local packsize = string.packsize -local unpack = string.unpack - -print "testing pack/unpack" - --- maximum size for integers -local NB = 16 - -local sizeshort = packsize("h") -local sizeint = packsize("i") -local sizelong = packsize("l") -local sizesize_t = packsize("T") -local sizeLI = packsize("j") -local sizefloat = packsize("f") -local sizedouble = packsize("d") -local sizenumber = packsize("n") -local little = (pack("i2", 1) == "\1\0") -local align = packsize("!xXi16") - -assert(1 <= sizeshort and sizeshort <= sizeint and sizeint <= sizelong and - sizefloat <= sizedouble) - -print("platform:") -print(string.format( - "\tshort %d, int %d, long %d, size_t %d, float %d, double %d,\n\z - \tlua Integer %d, lua Number %d", - sizeshort, sizeint, sizelong, sizesize_t, sizefloat, sizedouble, - sizeLI, sizenumber)) -print("\t" .. (little and "little" or "big") .. " endian") -print("\talignment: " .. align) - - --- check errors in arguments -local function checkerror (msg, f, ...) - local status, err = pcall(f, ...) - -- print(status, err, msg) - assert(not status and string.find(err, msg)) -end - --- minimum behavior for integer formats -assert(unpack("B", pack("B", 0xff)) == 0xff) -assert(unpack("b", pack("b", 0x7f)) == 0x7f) -assert(unpack("b", pack("b", -0x80)) == -0x80) - -assert(unpack("H", pack("H", 0xffff)) == 0xffff) -assert(unpack("h", pack("h", 0x7fff)) == 0x7fff) -assert(unpack("h", pack("h", -0x8000)) == -0x8000) - -assert(unpack("L", pack("L", 0xffffffff)) == 0xffffffff) -assert(unpack("l", pack("l", 0x7fffffff)) == 0x7fffffff) -assert(unpack("l", pack("l", -0x80000000)) == -0x80000000) - - -for i = 1, NB do - -- small numbers with signal extension ("\xFF...") - local s = string.rep("\xff", i) - assert(pack("i" .. i, -1) == s) - assert(packsize("i" .. i) == #s) - assert(unpack("i" .. i, s) == -1) - - -- small unsigned number ("\0...\xAA") - s = "\xAA" .. string.rep("\0", i - 1) - assert(pack("I" .. i, 0xAA) == s:reverse()) - assert(unpack(">I" .. i, s:reverse()) == 0xAA) -end - -do - local lnum = 0x13121110090807060504030201 - local s = pack("i" .. i, ("\xFF"):rep(i - sizeLI) .. s:reverse()) == -lnum) - assert(unpack("i" .. i, "\1" .. ("\x00"):rep(i - 1)) - end -end - -for i = 1, sizeLI do - local lstr = "\1\2\3\4\5\6\7\8\9\10\11\12\13" - local lnum = 0x13121110090807060504030201 - local n = lnum & (~(-1 << (i * 8))) - local s = string.sub(lstr, 1, i) - assert(pack("i" .. i, n) == s:reverse()) - assert(unpack(">i" .. i, s:reverse()) == n) -end - --- sign extension -do - local u = 0xf0 - for i = 1, sizeLI - 1 do - assert(unpack("I"..i, "\xf0"..("\xff"):rep(i - 1)) == u) - u = u * 256 + 0xff - end -end - --- mixed endianness -do - assert(pack(">i2 i2", "\10\0\0\20") - assert(a == 10 and b == 20) - assert(pack("=i4", 2001) == pack("i4", 2001)) -end - -print("testing invalid formats") - -checkerror("out of limits", pack, "i0", 0) -checkerror("out of limits", pack, "i" .. NB + 1, 0) -checkerror("out of limits", pack, "!" .. NB + 1, 0) -checkerror("%(17%) out of limits %[1,16%]", pack, "Xi" .. NB + 1) -checkerror("invalid format option 'r'", pack, "i3r", 0) -checkerror("16%-byte integer", unpack, "i16", string.rep('\3', 16)) -checkerror("not power of 2", pack, "!4i3", 0); -checkerror("missing size", pack, "c", "") -checkerror("variable%-length format", packsize, "s") -checkerror("variable%-length format", packsize, "z") - --- overflow in option size (error will be in digit after limit) -checkerror("invalid format", packsize, "c1" .. string.rep("0", 40)) - -if packsize("i") == 4 then - -- result would be 2^31 (2^3 repetitions of 2^28 strings) - local s = string.rep("c268435456", 2^3) - checkerror("too large", packsize, s) - -- one less is OK - s = string.rep("c268435456", 2^3 - 1) .. "c268435455" - assert(packsize(s) == 0x7fffffff) -end - --- overflow in packing -for i = 1, sizeLI - 1 do - local umax = (1 << (i * 8)) - 1 - local max = umax >> 1 - local min = ~max - checkerror("overflow", pack, "I" .. i, umax + 1) - - checkerror("overflow", pack, ">i" .. i, umax) - checkerror("overflow", pack, ">i" .. i, max + 1) - checkerror("overflow", pack, "i" .. i, pack(">i" .. i, max)) == max) - assert(unpack("I" .. i, pack(">I" .. i, umax)) == umax) -end - --- Lua integer size -assert(unpack(">j", pack(">j", math.maxinteger)) == math.maxinteger) -assert(unpack("f", 24)) -end - -print "testing pack/unpack of floating-point numbers" - -for _, n in ipairs{0, -1.1, 1.9, 1/0, -1/0, 1e20, -1e20, 0.1, 2000.7} do - assert(unpack("n", pack("n", n)) == n) - assert(unpack("n", pack(">n", n)) == n) - assert(pack("f", n):reverse()) - assert(pack(">d", n) == pack("f", pack(">f", n)) == n) - assert(unpack("d", pack(">d", n)) == n) -end - -print "testing pack/unpack of strings" -do - local s = string.rep("abc", 1000) - assert(pack("zB", s, 247) == s .. "\0\xF7") - local s1, b = unpack("zB", s .. "\0\xF9") - assert(b == 249 and s1 == s) - s1 = pack("s", s) - assert(unpack("s", s1) == s) - - checkerror("does not fit", pack, "s1", s) - - checkerror("contains zeros", pack, "z", "alo\0"); - - checkerror("unfinished string", unpack, "zc10000000", "alo") - - for i = 2, NB do - local s1 = pack("s" .. i, s) - assert(unpack("s" .. i, s1) == s and #s1 == #s + i) - end -end - -do - local x = pack("s", "alo") - checkerror("too short", unpack, "s", x:sub(1, -2)) - checkerror("too short", unpack, "c5", "abcd") - checkerror("out of limits", pack, "s100", "alo") -end - -do - assert(pack("c0", "") == "") - assert(packsize("c0") == 0) - assert(unpack("c0", "") == "") - assert(pack("!4 c6", "abcdef") == "abcdef") - assert(pack("c3", "123") == "123") - assert(pack("c0", "") == "") - assert(pack("c8", "123456") == "123456\0\0") - assert(pack("c88", "") == string.rep("\0", 88)) - assert(pack("c188", "ab") == "ab" .. string.rep("\0", 188 - 2)) - local a, b, c = unpack("!4 z c3", "abcdefghi\0xyz") - assert(a == "abcdefghi" and b == "xyz" and c == 14) - checkerror("longer than", pack, "c3", "1234") -end - - --- testing multiple types and sequence -do - local x = pack("!8 b Xh i4 i8 c1 Xi8", -12, 100, 200, "\xEC") - assert(#x == packsize(">!8 b Xh i4 i8 c1 Xi8")) - assert(x == "\xf4" .. "\0\0\0" .. - "\0\0\0\100" .. - "\0\0\0\0\0\0\0\xC8" .. - "\xEC" .. "\0\0\0\0\0\0\0") - local a, b, c, d, pos = unpack(">!8 c1 Xh i4 i8 b Xi8 XI XH", x) - assert(a == "\xF4" and b == 100 and c == 200 and d == -20 and (pos - 1) == #x) - - x = pack(">!4 c3 c4 c2 z i4 c5 c2 Xi4", - "abc", "abcd", "xz", "hello", 5, "world", "xy") - assert(x == "abcabcdxzhello\0\0\0\0\0\5worldxy\0") - local a, b, c, d, e, f, g, pos = unpack(">!4 c3 c4 c2 z i4 c5 c2 Xh Xi4", x) - assert(a == "abc" and b == "abcd" and c == "xz" and d == "hello" and - e == 5 and f == "world" and g == "xy" and (pos - 1) % 4 == 0) - - x = pack(" b b Xd b Xb x", 1, 2, 3) - assert(packsize(" b b Xd b Xb x") == 4) - assert(x == "\1\2\3\0") - a, b, c, pos = unpack("bbXdb", x) - assert(a == 1 and b == 2 and c == 3 and pos == #x) - - -- only alignment - assert(packsize("!8 xXi8") == 8) - local pos = unpack("!8 xXi8", "0123456701234567"); assert(pos == 9) - assert(packsize("!8 xXi2") == 2) - local pos = unpack("!8 xXi2", "0123456701234567"); assert(pos == 3) - assert(packsize("!2 xXi2") == 2) - local pos = unpack("!2 xXi2", "0123456701234567"); assert(pos == 3) - assert(packsize("!2 xXi8") == 2) - local pos = unpack("!2 xXi8", "0123456701234567"); assert(pos == 3) - assert(packsize("!16 xXi16") == 16) - local pos = unpack("!16 xXi16", "0123456701234567"); assert(pos == 17) - - checkerror("invalid next option", pack, "X") - checkerror("invalid next option", unpack, "XXi", "") - checkerror("invalid next option", unpack, "X i", "") - checkerror("invalid next option", pack, "Xc1") -end - -do -- testing initial position - local x = pack("i4i4i4i4", 1, 2, 3, 4) - for pos = 1, 16, 4 do - local i, p = unpack("i4", x, pos) - assert(i == pos//4 + 1 and p == pos + 4) - end - - -- with alignment - for pos = 0, 12 do -- will always round position to power of 2 - local i, p = unpack("!4 i4", x, pos + 1) - assert(i == (pos + 3)//4 + 1 and p == i*4 + 1) - end - - -- negative indices - local i, p = unpack("!4 i4", x, -4) - assert(i == 4 and p == 17) - local i, p = unpack("!4 i4", x, -7) - assert(i == 4 and p == 17) - local i, p = unpack("!4 i4", x, -#x) - assert(i == 1 and p == 5) - - -- limits - for i = 1, #x + 1 do - assert(unpack("c0", x, i) == "") - end - checkerror("out of string", unpack, "c0", x, #x + 2) - -end - -print "OK" - diff --git a/lua-5.4.7-tests/tracegc.lua b/lua-5.4.7-tests/tracegc.lua deleted file mode 100644 index 9c5c1b3..0000000 --- a/lua-5.4.7-tests/tracegc.lua +++ /dev/null @@ -1,40 +0,0 @@ --- track collections - -local M = {} - --- import list -local setmetatable, stderr, collectgarbage = - setmetatable, io.stderr, collectgarbage - -_ENV = nil - -local active = false - - --- each time a table is collected, remark it for finalization on next --- cycle -local mt = {} -function mt.__gc (o) - stderr:write'.' -- mark progress - if active then - setmetatable(o, mt) -- remark object for finalization - end -end - - -function M.start () - if not active then - active = true - setmetatable({}, mt) -- create initial object - end -end - - -function M.stop () - if active then - active = false - collectgarbage() -- call finalizer for the last time - end -end - -return M diff --git a/lua-5.4.7-tests/utf8.lua b/lua-5.4.7-tests/utf8.lua deleted file mode 100644 index efadbd5..0000000 --- a/lua-5.4.7-tests/utf8.lua +++ /dev/null @@ -1,259 +0,0 @@ --- $Id: testes/utf8.lua $ --- See Copyright Notice in file all.lua - --- UTF-8 file - -print "testing UTF-8 library" - -local utf8 = require'utf8' - - -local function checkerror (msg, f, ...) - local s, err = pcall(f, ...) - assert(not s and string.find(err, msg)) -end - - -local function len (s) - return #string.gsub(s, "[\x80-\xBF]", "") -end - - -local justone = "^" .. utf8.charpattern .. "$" - --- 't' is the list of codepoints of 's' -local function checksyntax (s, t) - -- creates a string "return '\u{t[1]}...\u{t[n]}'" - local ts = {"return '"} - for i = 1, #t do ts[i + 1] = string.format("\\u{%x}", t[i]) end - ts[#t + 2] = "'" - ts = table.concat(ts) - -- its execution should result in 's' - assert(assert(load(ts))() == s) -end - -assert(not utf8.offset("alo", 5)) -assert(not utf8.offset("alo", -4)) - --- 'check' makes several tests over the validity of string 's'. --- 't' is the list of codepoints of 's'. -local function check (s, t, nonstrict) - local l = utf8.len(s, 1, -1, nonstrict) - assert(#t == l and len(s) == l) - assert(utf8.char(table.unpack(t)) == s) -- 't' and 's' are equivalent - - assert(utf8.offset(s, 0) == 1) - - checksyntax(s, t) - - -- creates new table with all codepoints of 's' - local t1 = {utf8.codepoint(s, 1, -1, nonstrict)} - assert(#t == #t1) - for i = 1, #t do assert(t[i] == t1[i]) end -- 't' is equal to 't1' - - for i = 1, l do -- for all codepoints - local pi = utf8.offset(s, i) -- position of i-th char - local pi1 = utf8.offset(s, 2, pi) -- position of next char - assert(string.find(string.sub(s, pi, pi1 - 1), justone)) - assert(utf8.offset(s, -1, pi1) == pi) - assert(utf8.offset(s, i - l - 1) == pi) - assert(pi1 - pi == #utf8.char(utf8.codepoint(s, pi, pi, nonstrict))) - for j = pi, pi1 - 1 do - assert(utf8.offset(s, 0, j) == pi) - end - for j = pi + 1, pi1 - 1 do - assert(not utf8.len(s, j)) - end - assert(utf8.len(s, pi, pi, nonstrict) == 1) - assert(utf8.len(s, pi, pi1 - 1, nonstrict) == 1) - assert(utf8.len(s, pi, -1, nonstrict) == l - i + 1) - assert(utf8.len(s, pi1, -1, nonstrict) == l - i) - assert(utf8.len(s, 1, pi, nonstrict) == i) - end - - local i = 0 - for p, c in utf8.codes(s, nonstrict) do - i = i + 1 - assert(c == t[i] and p == utf8.offset(s, i)) - assert(utf8.codepoint(s, p, p, nonstrict) == c) - end - assert(i == #t) - - i = 0 - for c in string.gmatch(s, utf8.charpattern) do - i = i + 1 - assert(c == utf8.char(t[i])) - end - assert(i == #t) - - for i = 1, l do - assert(utf8.offset(s, i) == utf8.offset(s, i - l - 1, #s + 1)) - end - -end - - -do -- error indication in utf8.len - local function check (s, p) - local a, b = utf8.len(s) - assert(not a and b == p) - end - check("abc\xE3def", 4) - check("\xF4\x9F\xBF", 1) - check("\xF4\x9F\xBF\xBF", 1) - -- spurious continuation bytes - check("汉字\x80", #("汉字") + 1) - check("\x80hello", 1) - check("hel\x80lo", 4) - check("汉字\xBF", #("汉字") + 1) - check("\xBFhello", 1) - check("hel\xBFlo", 4) -end - --- errors in utf8.codes -do - local function errorcodes (s) - checkerror("invalid UTF%-8 code", - function () - for c in utf8.codes(s) do assert(c) end - end) - end - errorcodes("ab\xff") - errorcodes("\u{110000}") - errorcodes("in\x80valid") - errorcodes("\xbfinvalid") - errorcodes("αλφ\xBFα") - - -- calling interation function with invalid arguments - local f = utf8.codes("") - assert(f("", 2) == nil) - assert(f("", -1) == nil) - assert(f("", math.mininteger) == nil) - -end - --- error in initial position for offset -checkerror("position out of bounds", utf8.offset, "abc", 1, 5) -checkerror("position out of bounds", utf8.offset, "abc", 1, -4) -checkerror("position out of bounds", utf8.offset, "", 1, 2) -checkerror("position out of bounds", utf8.offset, "", 1, -1) -checkerror("continuation byte", utf8.offset, "𦧺", 1, 2) -checkerror("continuation byte", utf8.offset, "𦧺", 1, 2) -checkerror("continuation byte", utf8.offset, "\x80", 1) - --- error in indices for len -checkerror("out of bounds", utf8.len, "abc", 0, 2) -checkerror("out of bounds", utf8.len, "abc", 1, 4) - - -local s = "hello World" -local t = {string.byte(s, 1, -1)} -for i = 1, utf8.len(s) do assert(t[i] == string.byte(s, i)) end -check(s, t) - -check("汉字/漢字", {27721, 23383, 47, 28450, 23383,}) - -do - local s = "áéí\128" - local t = {utf8.codepoint(s,1,#s - 1)} - assert(#t == 3 and t[1] == 225 and t[2] == 233 and t[3] == 237) - checkerror("invalid UTF%-8 code", utf8.codepoint, s, 1, #s) - checkerror("out of bounds", utf8.codepoint, s, #s + 1) - t = {utf8.codepoint(s, 4, 3)} - assert(#t == 0) - checkerror("out of bounds", utf8.codepoint, s, -(#s + 1), 1) - checkerror("out of bounds", utf8.codepoint, s, 1, #s + 1) - -- surrogates - assert(utf8.codepoint("\u{D7FF}") == 0xD800 - 1) - assert(utf8.codepoint("\u{E000}") == 0xDFFF + 1) - assert(utf8.codepoint("\u{D800}", 1, 1, true) == 0xD800) - assert(utf8.codepoint("\u{DFFF}", 1, 1, true) == 0xDFFF) - assert(utf8.codepoint("\u{7FFFFFFF}", 1, 1, true) == 0x7FFFFFFF) -end - -assert(utf8.char() == "") -assert(utf8.char(0, 97, 98, 99, 1) == "\0abc\1") - -assert(utf8.codepoint(utf8.char(0x10FFFF)) == 0x10FFFF) -assert(utf8.codepoint(utf8.char(0x7FFFFFFF), 1, 1, true) == (1<<31) - 1) - -checkerror("value out of range", utf8.char, 0x7FFFFFFF + 1) -checkerror("value out of range", utf8.char, -1) - -local function invalid (s) - checkerror("invalid UTF%-8 code", utf8.codepoint, s) - assert(not utf8.len(s)) -end - --- UTF-8 representation for 0x11ffff (value out of valid range) -invalid("\xF4\x9F\xBF\xBF") - --- surrogates -invalid("\u{D800}") -invalid("\u{DFFF}") - --- overlong sequences -invalid("\xC0\x80") -- zero -invalid("\xC1\xBF") -- 0x7F (should be coded in 1 byte) -invalid("\xE0\x9F\xBF") -- 0x7FF (should be coded in 2 bytes) -invalid("\xF0\x8F\xBF\xBF") -- 0xFFFF (should be coded in 3 bytes) - - --- invalid bytes -invalid("\x80") -- continuation byte -invalid("\xBF") -- continuation byte -invalid("\xFE") -- invalid byte -invalid("\xFF") -- invalid byte - - --- empty string -check("", {}) - --- minimum and maximum values for each sequence size -s = "\0 \x7F\z - \xC2\x80 \xDF\xBF\z - \xE0\xA0\x80 \xEF\xBF\xBF\z - \xF0\x90\x80\x80 \xF4\x8F\xBF\xBF" -s = string.gsub(s, " ", "") -check(s, {0,0x7F, 0x80,0x7FF, 0x800,0xFFFF, 0x10000,0x10FFFF}) - -do - -- original UTF-8 values - local s = "\u{4000000}\u{7FFFFFFF}" - assert(#s == 12) - check(s, {0x4000000, 0x7FFFFFFF}, true) - - s = "\u{200000}\u{3FFFFFF}" - assert(#s == 10) - check(s, {0x200000, 0x3FFFFFF}, true) - - s = "\u{10000}\u{1fffff}" - assert(#s == 8) - check(s, {0x10000, 0x1FFFFF}, true) -end - -local x = "日本語a-4\0éó" -check(x, {26085, 26412, 35486, 97, 45, 52, 0, 233, 243}) - - --- Supplementary Characters -check("𣲷𠜎𠱓ð¡�»ð µ¼ab𠺢", - {0x23CB7, 0x2070E, 0x20C53, 0x2107B, 0x20D7C, 0x61, 0x62, 0x20EA2,}) - -check("𨳊𩶘𦧺𨳒𥄫𤓓\xF4\x8F\xBF\xBF", - {0x28CCA, 0x29D98, 0x269FA, 0x28CD2, 0x2512B, 0x244D3, 0x10ffff}) - - -local i = 0 -for p, c in string.gmatch(x, "()(" .. utf8.charpattern .. ")") do - i = i + 1 - assert(utf8.offset(x, i) == p) - assert(utf8.len(x, p) == utf8.len(x) - i + 1) - assert(utf8.len(c) == 1) - for j = 1, #c - 1 do - assert(utf8.offset(x, 0, p + j - 1) == p) - end -end - -print'ok' - diff --git a/lua-5.4.7-tests/vararg.lua b/lua-5.4.7-tests/vararg.lua deleted file mode 100644 index 1b02510..0000000 --- a/lua-5.4.7-tests/vararg.lua +++ /dev/null @@ -1,151 +0,0 @@ --- $Id: testes/vararg.lua $ --- See Copyright Notice in file all.lua - -print('testing vararg') - -local function f (a, ...) - local x = {n = select('#', ...), ...} - for i = 1, x.n do assert(a[i] == x[i]) end - return x.n -end - -local function c12 (...) - assert(arg == _G.arg) -- no local 'arg' - local x = {...}; x.n = #x - local res = (x.n==2 and x[1] == 1 and x[2] == 2) - if res then res = 55 end - return res, 2 -end - -local function vararg (...) return {n = select('#', ...), ...} end - -local call = function (f, args) return f(table.unpack(args, 1, args.n)) end - -assert(f() == 0) -assert(f({1,2,3}, 1, 2, 3) == 3) -assert(f({"alo", nil, 45, f, nil}, "alo", nil, 45, f, nil) == 5) - -assert(vararg().n == 0) -assert(vararg(nil, nil).n == 2) - -assert(c12(1,2)==55) -local a,b = assert(call(c12, {1,2})) -assert(a == 55 and b == 2) -a = call(c12, {1,2;n=2}) -assert(a == 55 and b == 2) -a = call(c12, {1,2;n=1}) -assert(not a) -assert(c12(1,2,3) == false) -local a = vararg(call(next, {_G,nil;n=2})) -local b,c = next(_G) -assert(a[1] == b and a[2] == c and a.n == 2) -a = vararg(call(call, {c12, {1,2}})) -assert(a.n == 2 and a[1] == 55 and a[2] == 2) -a = call(print, {'+'}) -assert(a == nil) - -local t = {1, 10} -function t:f (...) local arg = {...}; return self[...]+#arg end -assert(t:f(1,4) == 3 and t:f(2) == 11) -print('+') - -local lim = 20 -local i, a = 1, {} -while i <= lim do a[i] = i+0.3; i=i+1 end - -function f(a, b, c, d, ...) - local more = {...} - assert(a == 1.3 and more[1] == 5.3 and - more[lim-4] == lim+0.3 and not more[lim-3]) -end - -local function g (a,b,c) - assert(a == 1.3 and b == 2.3 and c == 3.3) -end - -call(f, a) -call(g, a) - -a = {} -i = 1 -while i <= lim do a[i] = i; i=i+1 end -assert(call(math.max, a) == lim) - -print("+") - - --- new-style varargs - -local function oneless (a, ...) return ... end - -function f (n, a, ...) - local b - assert(arg == _G.arg) -- no local 'arg' - if n == 0 then - local b, c, d = ... - return a, b, c, d, oneless(oneless(oneless(...))) - else - n, b, a = n-1, ..., a - assert(b == ...) - return f(n, a, ...) - end -end - -a,b,c,d,e = assert(f(10,5,4,3,2,1)) -assert(a==5 and b==4 and c==3 and d==2 and e==1) - -a,b,c,d,e = f(4) -assert(a==nil and b==nil and c==nil and d==nil and e==nil) - - --- varargs for main chunks -local f = load[[ return {...} ]] -local x = f(2,3) -assert(x[1] == 2 and x[2] == 3 and x[3] == undef) - - -f = load[[ - local x = {...} - for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end - assert(x[select('#', ...)+1] == undef) - return true -]] - -assert(f("a", "b", nil, {}, assert)) -assert(f()) - -a = {select(3, table.unpack{10,20,30,40})} -assert(#a == 2 and a[1] == 30 and a[2] == 40) -a = {select(1)} -assert(next(a) == nil) -a = {select(-1, 3, 5, 7)} -assert(a[1] == 7 and a[2] == undef) -a = {select(-2, 3, 5, 7)} -assert(a[1] == 5 and a[2] == 7 and a[3] == undef) -pcall(select, 10000) -pcall(select, -10000) - - --- bug in 5.2.2 - -function f(p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, -p11, p12, p13, p14, p15, p16, p17, p18, p19, p20, -p21, p22, p23, p24, p25, p26, p27, p28, p29, p30, -p31, p32, p33, p34, p35, p36, p37, p38, p39, p40, -p41, p42, p43, p44, p45, p46, p48, p49, p50, ...) - local a1,a2,a3,a4,a5,a6,a7 - local a8,a9,a10,a11,a12,a13,a14 -end - --- assertion fail here -f() - --- missing arguments in tail call -do - local function f(a,b,c) return c, b end - local function g() return f(1,2) end - local a, b = g() - assert(a == nil and b == 2) -end -print('OK') - diff --git a/lua-5.4.7-tests/verybig.lua b/lua-5.4.7-tests/verybig.lua deleted file mode 100644 index 250ea79..0000000 --- a/lua-5.4.7-tests/verybig.lua +++ /dev/null @@ -1,152 +0,0 @@ --- $Id: testes/verybig.lua $ --- See Copyright Notice in file all.lua - -print "testing RK" - --- testing opcodes with RK arguments larger than K limit -local function foo () - local dummy = { - -- fill first 256 entries in table of constants - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97, 98, 99, 100, 101, 102, 103, 104, - 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, - 121, 122, 123, 124, 125, 126, 127, 128, - 129, 130, 131, 132, 133, 134, 135, 136, - 137, 138, 139, 140, 141, 142, 143, 144, - 145, 146, 147, 148, 149, 150, 151, 152, - 153, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 165, 166, 167, 168, - 169, 170, 171, 172, 173, 174, 175, 176, - 177, 178, 179, 180, 181, 182, 183, 184, - 185, 186, 187, 188, 189, 190, 191, 192, - 193, 194, 195, 196, 197, 198, 199, 200, - 201, 202, 203, 204, 205, 206, 207, 208, - 209, 210, 211, 212, 213, 214, 215, 216, - 217, 218, 219, 220, 221, 222, 223, 224, - 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, - 241, 242, 243, 244, 245, 246, 247, 248, - 249, 250, 251, 252, 253, 254, 255, 256, - } - assert(24.5 + 0.6 == 25.1) - local t = {foo = function (self, x) return x + self.x end, x = 10} - t.t = t - assert(t:foo(1.5) == 11.5) - assert(t.t:foo(0.5) == 10.5) -- bug in 5.2 alpha - assert(24.3 == 24.3) - assert((function () return t.x end)() == 10) -end - - -foo() -foo = nil - -if _soft then return 10 end - -print "testing large programs (>64k)" - --- template to create a very big test file -local prog = [[$ - -local a,b - -b = {$1$ - b30009 = 65534, - b30010 = 65535, - b30011 = 65536, - b30012 = 65537, - b30013 = 16777214, - b30014 = 16777215, - b30015 = 16777216, - b30016 = 16777217, - b30017 = 0x7fffff, - b30018 = -0x7fffff, - b30019 = 0x1ffffff, - b30020 = -0x1ffffd, - b30021 = -65534, - b30022 = -65535, - b30023 = -65536, - b30024 = -0xffffff, - b30025 = 15012.5, - $2$ -}; - -assert(b.a50008 == 25004 and b["a11"] == -5.5) -assert(b.a33007 == -16503.5 and b.a50009 == -25004.5) -assert(b["b"..30024] == -0xffffff) - -function b:xxx (a,b) return a+b end -assert(b:xxx(10, 12) == 22) -- pushself with non-constant index -b["xxx"] = undef - -local s = 0; local n=0 -for a,b in pairs(b) do s=s+b; n=n+1 end --- with 32-bit floats, exact value of 's' depends on summation order -assert(81800000.0 < s and s < 81860000 and n == 70001) - -a = nil; b = nil -print'+' - -local function f(x) b=x end - -a = f{$3$} or 10 - -assert(a==10) -assert(b[1] == "a10" and b[2] == 5 and b[#b-1] == "a50009") - - -function xxxx (x) return b[x] end - -assert(xxxx(3) == "a11") - -a = nil; b=nil -xxxx = nil - -return 10 - -]] - --- functions to fill in the $n$ - -local function sig (x) - return (x % 2 == 0) and '' or '-' -end - -local F = { -function () -- $1$ - for i=10,50009 do - io.write('a', i, ' = ', sig(i), 5+((i-10)/2), ',\n') - end -end, - -function () -- $2$ - for i=30026,50009 do - io.write('b', i, ' = ', sig(i), 15013+((i-30026)/2), ',\n') - end -end, - -function () -- $3$ - for i=10,50009 do - io.write('"a', i, '", ', sig(i), 5+((i-10)/2), ',\n') - end -end, -} - -local file = os.tmpname() -io.output(file) -for s in string.gmatch(prog, "$([^$]+)") do - local n = tonumber(s) - if not n then io.write(s) else F[n]() end -end -io.close() -local result = dofile(file) -assert(os.remove(file)) -print'OK' -return result - diff --git a/lua-5.4.7/CMakeLists.txt b/lua-5.4.7/CMakeLists.txt deleted file mode 100644 index ce5eff2..0000000 --- a/lua-5.4.7/CMakeLists.txt +++ /dev/null @@ -1,175 +0,0 @@ -set(LUA_LIB_SRCS - "src/lapi.c" - "src/lcode.c" - "src/lctype.c" - "src/ldebug.c" - "src/ldo.c" - "src/ldump.c" - "src/lfunc.c" - "src/lgc.c" - "src/llex.c" - "src/lmem.c" - "src/lobject.c" - "src/lopcodes.c" - "src/lparser.c" - "src/lstate.c" - "src/lstring.c" - "src/ltable.c" - "src/ltm.c" - "src/lundump.c" - "src/lvm.c" - "src/lzio.c" - "src/lauxlib.c" - "src/lbaselib.c" - "src/lcorolib.c" - "src/ldblib.c" - "src/liolib.c" - "src/lmathlib.c" - "src/loadlib.c" - "src/loslib.c" - "src/lstrlib.c" - "src/ltablib.c" - "src/lutf8lib.c" - "src/linit.c" -) - -set(TARGETS_TO_INSTALL lua_internal lua_include) - -set(LUA_LINKED_LIBRARIES) - -if(LUA_BUILD_AS_CXX) - set_source_files_properties(${LUA_LIB_SRCS} "src/lua.c" "src/luac.c" PROPERTIES LANGUAGE CXX ) -endif() - -add_library(lua_internal INTERFACE) - -add_library(lua_include INTERFACE) - -target_include_directories(lua_include INTERFACE - $ - $ -) - -target_link_libraries(lua_internal INTERFACE lua_include) - -if(LUA_ENABLE_SHARED) - add_library(lua_shared SHARED ${LUA_LIB_SRCS}) - target_link_libraries(lua_shared PRIVATE lua_internal PUBLIC lua_include) - set_target_properties(lua_shared PROPERTIES - VERSION "${PACKAGE_VERSION}" - OUTPUT_NAME "lua54" - ) - if(WIN32) - target_compile_definitions(lua_shared PRIVATE LUA_BUILD_AS_DLL) - endif() - list(APPEND TARGETS_TO_INSTALL lua_shared) - if(BUILD_SHARED_LIBS) - add_library(Lua::Library ALIAS lua_shared) - elseif(NOT TOP_LEVEL) - set_target_properties(lua_shared PROPERTIES - EXCLUDE_FROM_ALL ON - ) - endif() -endif() - -add_library(lua_static STATIC ${LUA_LIB_SRCS}) -target_link_libraries(lua_static PRIVATE lua_internal PUBLIC lua_include) -set_target_properties(lua_static PROPERTIES - VERSION "${PACKAGE_VERSION}" - OUTPUT_NAME "lua54" -) -list(APPEND TARGETS_TO_INSTALL lua_static) -if(NOT BUILD_SHARED_LIBS OR NOT LUA_ENABLE_SHARED) - add_library(Lua::Library ALIAS lua_static) -endif() - - -if(UNIX) - if(NOT EMSCRIPTEN) - find_library(LIBM m) - #TODO: Redo this with find_package - if(NOT LIBM) - message(FATAL_ERROR "libm not found and is required by lua") - endif() - target_compile_definitions(lua_internal INTERFACE "LUA_USE_POSIX") - target_link_libraries(lua_internal INTERFACE m) - list(APPEND LUA_LINKED_LIBRARIES m) - if(LUA_SUPPORT_DL) - find_library(LIBDL "${CMAKE_DL_LIBS}") - if(NOT LIBDL) - message(FATAL_ERROR "libdl not found and is required by lua") - endif() - target_compile_definitions(lua_internal INTERFACE "LUA_USE_DLOPEN") - target_link_libraries(lua_internal INTERFACE "${CMAKE_DL_LIBS}") - list(APPEND LUA_LINKED_LIBRARIES "${CMAKE_DL_LIBS}") - endif() - endif() - - target_compile_options(lua_internal - INTERFACE "-Wall" "-Wextra" - ) -elseif(WIN32) - target_compile_options(lua_internal - INTERFACE "/Wall" - ) -endif() - -if(LUA_BUILD_BINARY) - include(CheckIncludeFile) - CHECK_INCLUDE_FILE("readline/readline.h" HAVE_READLINE_READLINE_H) - - add_executable(lua "src/lua.c") - # Can not use lua_shared because some symbols are not exported - target_link_libraries(lua PRIVATE lua_static) - set_target_properties(lua PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} - OUTPUT_NAME "lua54" - ) - if (HAVE_READLINE_READLINE_H) - target_compile_definitions(lua PRIVATE "LUA_USE_READLINE") - target_link_libraries(lua PUBLIC readline) - endif() - list(APPEND TARGETS_TO_INSTALL lua) -endif() - -if(LUA_BUILD_COMPILER) - add_executable(luac "src/luac.c") - target_link_libraries(luac PRIVATE lua_static) - set_target_properties(luac PROPERTIES - RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR} - OUTPUT_NAME "luac54" - ) - list(APPEND TARGETS_TO_INSTALL luac) -endif() - -install(TARGETS ${TARGETS_TO_INSTALL} - EXPORT LuaTargets -) - -install(DIRECTORY include/ TYPE INCLUDE) - -include(CMakePackageConfigHelpers) - -get_target_property(LUA_EXPORT_LIBRARY Lua::Library ALIASED_TARGET) -write_basic_package_version_file( - LuaConfigVersion.cmake - VERSION ${PACKAGE_VERSION} - COMPATIBILITY SameMajorVersion -) - -install(EXPORT LuaTargets - FILE LuaTargets.cmake - DESTINATION "share/cmake/Lua" - NAMESPACE Lua:: -) - -configure_package_config_file( - LuaConfig.cmake.in - "${CMAKE_CURRENT_BINARY_DIR}/LuaConfig.cmake" - INSTALL_DESTINATION "share/cmake/Lua" -) - -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/LuaConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/LuaConfigVersion.cmake" - DESTINATION "share/cmake/Lua" -) diff --git a/lua-5.4.7/Makefile b/lua-5.4.7/Makefile deleted file mode 100644 index 72ca8ff..0000000 --- a/lua-5.4.7/Makefile +++ /dev/null @@ -1,106 +0,0 @@ -# Makefile for installing Lua -# See doc/readme.html for installation and customization instructions. - -# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= - -# Your platform. See PLATS for possible values. -PLAT= guess - -# Where to install. The installation starts in the src and doc directories, -# so take care if INSTALL_TOP is not an absolute path. See the local target. -# You may want to make INSTALL_LMOD and INSTALL_CMOD consistent with -# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h. -INSTALL_TOP= /usr/local -INSTALL_BIN= $(INSTALL_TOP)/bin -INSTALL_INC= $(INSTALL_TOP)/include -INSTALL_LIB= $(INSTALL_TOP)/lib -INSTALL_MAN= $(INSTALL_TOP)/man/man1 -INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V -INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V - -# How to install. If your install program does not support "-p", then -# you may have to run ranlib on the installed liblua.a. -INSTALL= install -p -INSTALL_EXEC= $(INSTALL) -m 0755 -INSTALL_DATA= $(INSTALL) -m 0644 -# -# If you don't have "install" you can use "cp" instead. -# INSTALL= cp -p -# INSTALL_EXEC= $(INSTALL) -# INSTALL_DATA= $(INSTALL) - -# Other utilities. -MKDIR= mkdir -p -RM= rm -f - -# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= - -# Convenience platforms targets. -PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris - -# What to install. -TO_BIN= lua luac -TO_INC= lua.h luaconf.h lualib.h lauxlib.h lua.hpp -TO_LIB= liblua.a -TO_MAN= lua.1 luac.1 - -# Lua version and release. -V= 5.4 -R= $V.7 - -# Targets start here. -all: $(PLAT) - -$(PLATS) help test clean: - @cd src && $(MAKE) $@ - -install: dummy - cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD) - cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN) - cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC) - cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB) - cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN) - -uninstall: - cd src && cd $(INSTALL_BIN) && $(RM) $(TO_BIN) - cd src && cd $(INSTALL_INC) && $(RM) $(TO_INC) - cd src && cd $(INSTALL_LIB) && $(RM) $(TO_LIB) - cd doc && cd $(INSTALL_MAN) && $(RM) $(TO_MAN) - -local: - $(MAKE) install INSTALL_TOP=../install - -# make may get confused with install/ if it does not support .PHONY. -dummy: - -# Echo config parameters. -echo: - @cd src && $(MAKE) -s echo - @echo "PLAT= $(PLAT)" - @echo "V= $V" - @echo "R= $R" - @echo "TO_BIN= $(TO_BIN)" - @echo "TO_INC= $(TO_INC)" - @echo "TO_LIB= $(TO_LIB)" - @echo "TO_MAN= $(TO_MAN)" - @echo "INSTALL_TOP= $(INSTALL_TOP)" - @echo "INSTALL_BIN= $(INSTALL_BIN)" - @echo "INSTALL_INC= $(INSTALL_INC)" - @echo "INSTALL_LIB= $(INSTALL_LIB)" - @echo "INSTALL_MAN= $(INSTALL_MAN)" - @echo "INSTALL_LMOD= $(INSTALL_LMOD)" - @echo "INSTALL_CMOD= $(INSTALL_CMOD)" - @echo "INSTALL_EXEC= $(INSTALL_EXEC)" - @echo "INSTALL_DATA= $(INSTALL_DATA)" - -# Echo pkg-config data. -pc: - @echo "version=$R" - @echo "prefix=$(INSTALL_TOP)" - @echo "libdir=$(INSTALL_LIB)" - @echo "includedir=$(INSTALL_INC)" - -# Targets that do not create files (not all makes understand .PHONY). -.PHONY: all $(PLATS) help test clean install uninstall local dummy echo pc - -# (end of Makefile) diff --git a/lua-5.4.7/README b/lua-5.4.7/README deleted file mode 100644 index fe99b87..0000000 --- a/lua-5.4.7/README +++ /dev/null @@ -1,6 +0,0 @@ - -This is Lua 5.4.7, released on 13 Jun 2024. - -For installation instructions, license details, and -further information about Lua, see doc/readme.html. - diff --git a/lua-5.4.7/doc/OSIApproved_100X125.png b/lua-5.4.7/doc/OSIApproved_100X125.png deleted file mode 100644 index 795f7a06ed5b32131e69f245f1e1e0f4fc22c5aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12127 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 - - -Lua 5.4 Reference Manual - contents - - - - - - - -

-Lua -Lua 5.4 Reference Manual -

- -

-The reference manual is the official definition of the Lua language. -
-For a complete introduction to Lua programming, see the book -Programming in Lua. - -

- -

- -Copyright © 2020–2024 Lua.org, PUC-Rio. -Freely available under the terms of the -Lua license. - - -

Contents

- - -

Index

- - - - - - - - - - - - - - diff --git a/lua-5.4.7/doc/index.css b/lua-5.4.7/doc/index.css deleted file mode 100644 index c961835..0000000 --- a/lua-5.4.7/doc/index.css +++ /dev/null @@ -1,21 +0,0 @@ -ul { - list-style-type: none ; -} - -ul.contents { - padding: 0 ; -} - -table { - border: none ; - border-spacing: 0 ; - border-collapse: collapse ; -} - -td { - vertical-align: top ; - padding: 0 ; - text-align: left ; - line-height: 1.25 ; - width: 15% ; -} diff --git a/lua-5.4.7/doc/logo.gif b/lua-5.4.7/doc/logo.gif deleted file mode 100644 index 5c77eacc3b8f397fb2e87d2aaecd89128e53a117..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9893 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%0A-^7`I=ZfR-o#M>pI(&x#FQO~-wA&6X` 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 M5|b0H5Z3qqKj-ldMF0Q* diff --git a/lua-5.4.7/doc/lua.1 b/lua-5.4.7/doc/lua.1 deleted file mode 100644 index 3c9e000..0000000 --- a/lua-5.4.7/doc/lua.1 +++ /dev/null @@ -1,155 +0,0 @@ -.\" $Id: lua.man,v 1.14 2024/05/08 18:48:27 lhf Exp $ -.TH LUA 1 "$Date: 2024/05/08 18:48:27 $" -.SH NAME -lua \- Lua interpreter -.SH SYNOPSIS -.B lua -[ -.I options -] -[ -.I script -[ -.I args -] -] -.SH DESCRIPTION -.B lua -is the standalone Lua interpreter. -It loads and executes Lua programs, -either in textual source form or -in precompiled binary form. -(Precompiled binaries are output by -.BR luac , -the Lua compiler.) -.B lua -can be used as a batch interpreter and also interactively. -.LP -After handling the -.IR options , -the Lua program in file -.I script -is loaded and executed. -The -.I args -are available to -.I script -as strings in a global table named -.B arg -and also as arguments to its main function. -When called without arguments, -.B lua -behaves as -.B "lua \-v \-i" -if the standard input is a terminal, -and as -.B "lua \-" -otherwise. -.LP -In interactive mode, -.B lua -prompts the user, -reads lines from the standard input, -and executes them as they are read. -If the line contains an expression, -then the line is evaluated and the result is printed. -If a line does not contain a complete statement, -then a secondary prompt is displayed and -lines are read until a complete statement is formed or -a syntax error is found. -.LP -Before handling command line options and scripts, -.B lua -checks the contents of the environment variables -.B LUA_INIT_5_4 -and -.BR LUA_INIT , -in that order. -If the contents are of the form -.RI '@ filename ', -then -.I filename -is executed. -Otherwise, the contents are assumed to be a Lua statement and is executed. -When -.B LUA_INIT_5_4 -is defined, -.B LUA_INIT -is ignored. -.SH OPTIONS -.TP -.BI \-e " stat" -execute statement -.IR stat . -.TP -.B \-i -enter interactive mode after executing -.IR script . -.TP -.BI \-l " mod" -require library -.I mod -into global -.IR mod . -.TP -.BI \-l " g=mod" -require library -.I mod -into global -.IR g . -.TP -.B \-v -show version information. -.TP -.B \-E -ignore environment variables. -.TP -.B \-W -turn warnings on. -.TP -.B \-\- -stop handling options. -.TP -.B \- -stop handling options and execute the standard input as a file. -.SH ENVIRONMENT VARIABLES -The following environment variables affect the execution of -.BR lua . -When defined, -the version-specific variants take priority -and the version-neutral variants are ignored. -.TP -.B LUA_INIT, LUA_INIT_5_4 -Code to be executed before command line options and scripts. -.TP -.B LUA_PATH, LUA_PATH_5_4 -Initial value of package.path, -the path used by require to search for Lua loaders. -.TP -.B LUA_CPATH, LUA_CPATH_5_4 -Initial value of package.cpath, -the path used by require to search for C loaders. -.SH EXIT STATUS -If a script calls os.exit, -then -.B lua -exits with the given exit status. -Otherwise, -.B lua -exits -with EXIT_SUCCESS (0 on POSIX systems) if there were no errors -and -with EXIT_FAILURE (1 on POSIX systems) if there were errors. -Errors raised in interactive mode do not cause exits. -.SH DIAGNOSTICS -Error messages should be self explanatory. -.SH "SEE ALSO" -.BR luac (1) -.br -The documentation at lua.org, -especially section 7 of the reference manual. -.SH AUTHORS -R. Ierusalimschy, -L. H. de Figueiredo, -W. Celes -.\" EOF diff --git a/lua-5.4.7/doc/lua.css b/lua-5.4.7/doc/lua.css deleted file mode 100644 index 9013b44..0000000 --- a/lua-5.4.7/doc/lua.css +++ /dev/null @@ -1,162 +0,0 @@ -html { - background-color: #F8F8F8 ; -} - -body { - background-color: #FFFFFF ; - color: #000000 ; - font-family: Helvetica, Arial, sans-serif ; - text-align: justify ; - line-height: 1.25 ; - margin: 16px auto ; - padding: 32px ; - border: solid #ccc 1px ; - border-radius: 20px ; - max-width: 70em ; - width: 90% ; -} - -h1, h2, h3, h4 { - color: #000080 ; - font-family: Verdana, Geneva, sans-serif ; - font-weight: normal ; - font-style: normal ; - text-align: left ; -} - -h1 { - font-size: 28pt ; -} - -h1 img { - vertical-align: text-bottom ; -} - -h2:before { - content: "\2756" ; - padding-right: 0.5em ; -} - -a { - text-decoration: none ; -} - -a:link { - color: #000080 ; -} - -a:link:hover, a:visited:hover { - background-color: #D0D0FF ; - color: #000080 ; - border-radius: 4px ; -} - -a:link:active, a:visited:active { - color: #FF0000 ; -} - -div.menubar { - padding-bottom: 0.5em ; -} - -p.menubar { - margin-left: 2.5em ; -} - -.menubar a:hover { - margin: -3px -3px -3px -3px ; - padding: 3px 3px 3px 3px ; - border-radius: 4px ; -} - -:target { - background-color: #F0F0F0 ; - margin: -8px ; - padding: 8px ; - border-radius: 8px ; - outline: none ; -} - -hr { - display: none ; -} - -table hr { - background-color: #a0a0a0 ; - color: #a0a0a0 ; - border: 0 ; - height: 1px ; - display: block ; -} - -.footer { - color: gray ; - font-size: x-small ; - text-transform: lowercase ; -} - -input[type=text] { - border: solid #a0a0a0 2px ; - border-radius: 2em ; - background-image: url('images/search.png') ; - background-repeat: no-repeat ; - background-position: 4px center ; - padding-left: 20px ; - height: 2em ; -} - -pre.session { - background-color: #F8F8F8 ; - padding: 1em ; - border-radius: 8px ; -} - -table { - border: none ; - border-spacing: 0 ; - border-collapse: collapse ; -} - -td { - padding: 0 ; - margin: 0 ; -} - -td.gutter { - width: 4% ; -} - -table.columns td { - vertical-align: top ; - padding-bottom: 1em ; - text-align: justify ; - line-height: 1.25 ; -} - -table.book td { - vertical-align: top ; -} - -table.book td.cover { - padding-right: 1em ; -} - -table.book img { - border: solid #000080 1px ; - border-radius: 2px ; -} - -table.book span { - font-size: small ; - text-align: left ; - display: block ; - margin-top: 0.25em ; -} - -p.logos a:link:hover, p.logos a:visited:hover { - background-color: inherit ; -} - -img { - background-color: white ; -} diff --git a/lua-5.4.7/doc/luac.1 b/lua-5.4.7/doc/luac.1 deleted file mode 100644 index 33a4ed0..0000000 --- a/lua-5.4.7/doc/luac.1 +++ /dev/null @@ -1,118 +0,0 @@ -.\" $Id: luac.man,v 1.29 2011/11/16 13:53:40 lhf Exp $ -.TH LUAC 1 "$Date: 2011/11/16 13:53:40 $" -.SH NAME -luac \- Lua compiler -.SH SYNOPSIS -.B luac -[ -.I options -] [ -.I filenames -] -.SH DESCRIPTION -.B luac -is the Lua compiler. -It translates programs written in the Lua programming language -into binary files containing precompiled chunks -that can be later loaded and executed. -.LP -The main advantages of precompiling chunks are: -faster loading, -protecting source code from accidental user changes, -and -off-line syntax checking. -Precompiling does not imply faster execution -because in Lua chunks are always compiled into bytecodes before being executed. -.B luac -simply allows those bytecodes to be saved in a file for later execution. -Precompiled chunks are not necessarily smaller than the corresponding source. -The main goal in precompiling is faster loading. -.LP -In the command line, -you can mix -text files containing Lua source and -binary files containing precompiled chunks. -.B luac -produces a single output file containing the combined bytecodes -for all files given. -Executing the combined file is equivalent to executing the given files. -By default, -the output file is named -.BR luac.out , -but you can change this with the -.B \-o -option. -.LP -Precompiled chunks are -.I not -portable across different architectures. -Moreover, -the internal format of precompiled chunks -is likely to change when a new version of Lua is released. -Make sure you save the source files of all Lua programs that you precompile. -.LP -.SH OPTIONS -.TP -.B \-l -produce a listing of the compiled bytecode for Lua's virtual machine. -Listing bytecodes is useful to learn about Lua's virtual machine. -If no files are given, then -.B luac -loads -.B luac.out -and lists its contents. -Use -.B \-l \-l -for a full listing. -.TP -.BI \-o " file" -output to -.IR file , -instead of the default -.BR luac.out . -(You can use -.B "'\-'" -for standard output, -but not on platforms that open standard output in text mode.) -The output file may be one of the given files because -all files are loaded before the output file is written. -Be careful not to overwrite precious files. -.TP -.B \-p -load files but do not generate any output file. -Used mainly for syntax checking and for testing precompiled chunks: -corrupted files will probably generate errors when loaded. -If no files are given, then -.B luac -loads -.B luac.out -and tests its contents. -No messages are displayed if the file loads without errors. -.TP -.B \-s -strip debug information before writing the output file. -This saves some space in very large chunks, -but if errors occur when running a stripped chunk, -then the error messages may not contain the full information they usually do. -In particular, -line numbers and names of local variables are lost. -.TP -.B \-v -show version information. -.TP -.B \-\- -stop handling options. -.TP -.B \- -stop handling options and process standard input. -.SH "SEE ALSO" -.BR lua (1) -.br -The documentation at lua.org. -.SH DIAGNOSTICS -Error messages should be self explanatory. -.SH AUTHORS -R. Ierusalimschy, -L. H. de Figueiredo, -W. Celes -.\" EOF diff --git a/lua-5.4.7/doc/manual.css b/lua-5.4.7/doc/manual.css deleted file mode 100644 index aa0e677..0000000 --- a/lua-5.4.7/doc/manual.css +++ /dev/null @@ -1,21 +0,0 @@ -h3 code { - font-family: inherit ; - font-size: inherit ; -} - -pre, code { - font-size: 12pt ; -} - -span.apii { - color: gray ; - float: right ; - font-family: inherit ; - font-style: normal ; - font-size: small ; -} - -h2:before { - content: "" ; - padding-right: 0em ; -} diff --git a/lua-5.4.7/doc/manual.html b/lua-5.4.7/doc/manual.html deleted file mode 100644 index 574c743..0000000 --- a/lua-5.4.7/doc/manual.html +++ /dev/null @@ -1,12060 +0,0 @@ - - - -Lua 5.4 Reference Manual - - - - - - - -

-Lua -Lua 5.4 Reference Manual -

- -

-by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes - -

- -Copyright © 2020–2024 Lua.org, PUC-Rio. -Freely available under the terms of the -Lua license. - - -

- - -

- - - - - - -

1 – Introduction

- -

-Lua is a powerful, efficient, lightweight, embeddable scripting language. -It supports procedural programming, -object-oriented programming, functional programming, -data-driven programming, and data description. - - -

-Lua combines simple procedural syntax with powerful data description -constructs based on associative arrays and extensible semantics. -Lua is dynamically typed, -runs by interpreting bytecode with a register-based -virtual machine, -and has automatic memory management with -a generational garbage collection, -making it ideal for configuration, scripting, -and rapid prototyping. - - -

-Lua is implemented as a library, written in clean C, -the common subset of standard C and C++. -The Lua distribution includes a host program called lua, -which uses the Lua library to offer a complete, -standalone Lua interpreter, -for interactive or batch use. -Lua is intended to be used both as a powerful, lightweight, -embeddable scripting language for any program that needs one, -and as a powerful but lightweight and efficient stand-alone language. - - -

-As an extension language, Lua has no notion of a "main" program: -it works embedded in a host client, -called the embedding program or simply the host. -(Frequently, this host is the stand-alone lua program.) -The host program can invoke functions to execute a piece of Lua code, -can write and read Lua variables, -and can register C functions to be called by Lua code. -Through the use of C functions, Lua can be augmented to cope with -a wide range of different domains, -thus creating customized programming languages sharing a syntactical framework. - - -

-Lua is free software, -and is provided as usual with no guarantees, -as stated in its license. -The implementation described in this manual is available -at Lua's official web site, www.lua.org. - - -

-Like any other reference manual, -this document is dry in places. -For a discussion of the decisions behind the design of Lua, -see the technical papers available at Lua's web site. -For a detailed introduction to programming in Lua, -see Roberto's book, Programming in Lua. - - - -

2 – Basic Concepts

- - - -

-This section describes the basic concepts of the language. - - - - - -

2.1 – Values and Types

- -

-Lua is a dynamically typed language. -This means that -variables do not have types; only values do. -There are no type definitions in the language. -All values carry their own type. - - -

-All values in Lua are first-class values. -This means that all values can be stored in variables, -passed as arguments to other functions, and returned as results. - - -

-There are eight basic types in Lua: -nil, boolean, number, -string, function, userdata, -thread, and table. -The type nil has one single value, nil, -whose main property is to be different from any other value; -it often represents the absence of a useful value. -The type boolean has two values, false and true. -Both nil and false make a condition false; -they are collectively called false values. -Any other value makes a condition true. -Despite its name, -false is frequently used as an alternative to nil, -with the key difference that false behaves -like a regular value in a table, -while a nil in a table represents an absent key. - - -

-The type number represents both -integer numbers and real (floating-point) numbers, -using two subtypes: integer and float. -Standard Lua uses 64-bit integers and double-precision (64-bit) floats, -but you can also compile Lua so that it -uses 32-bit integers and/or single-precision (32-bit) floats. -The option with 32 bits for both integers and floats -is particularly attractive -for small machines and embedded systems. -(See macro LUA_32BITS in file luaconf.h.) - - -

-Unless stated otherwise, -any overflow when manipulating integer values wrap around, -according to the usual rules of two-complement arithmetic. -(In other words, -the actual result is the unique representable integer -that is equal modulo 2n to the mathematical result, -where n is the number of bits of the integer type.) - - -

-Lua has explicit rules about when each subtype is used, -but it also converts between them automatically as needed (see §3.4.3). -Therefore, -the programmer may choose to mostly ignore the difference -between integers and floats -or to assume complete control over the representation of each number. - - -

-The type string represents immutable sequences of bytes. - -Lua is 8-bit clean: -strings can contain any 8-bit value, -including embedded zeros ('\0'). -Lua is also encoding-agnostic; -it makes no assumptions about the contents of a string. -The length of any string in Lua must fit in a Lua integer. - - -

-Lua can call (and manipulate) functions written in Lua and -functions written in C (see §3.4.10). -Both are represented by the type function. - - -

-The type userdata is provided to allow arbitrary C data to -be stored in Lua variables. -A userdata value represents a block of raw memory. -There are two kinds of userdata: -full userdata, -which is an object with a block of memory managed by Lua, -and light userdata, -which is simply a C pointer value. -Userdata has no predefined operations in Lua, -except assignment and identity test. -By using metatables, -the programmer can define operations for full userdata values -(see §2.4). -Userdata values cannot be created or modified in Lua, -only through the C API. -This guarantees the integrity of data owned by -the host program and C libraries. - - -

-The type thread represents independent threads of execution -and it is used to implement coroutines (see §2.6). -Lua threads are not related to operating-system threads. -Lua supports coroutines on all systems, -even those that do not support threads natively. - - -

-The type table implements associative arrays, -that is, arrays that can have as indices not only numbers, -but any Lua value except nil and NaN. -(Not a Number is a special floating-point value -used by the IEEE 754 standard to represent -undefined numerical results, such as 0/0.) -Tables can be heterogeneous; -that is, they can contain values of all types (except nil). -Any key associated to the value nil is not considered part of the table. -Conversely, any key that is not part of a table has -an associated value nil. - - -

-Tables are the sole data-structuring mechanism in Lua; -they can be used to represent ordinary arrays, lists, -symbol tables, sets, records, graphs, trees, etc. -To represent records, Lua uses the field name as an index. -The language supports this representation by -providing a.name as syntactic sugar for a["name"]. -There are several convenient ways to create tables in Lua -(see §3.4.9). - - -

-Like indices, -the values of table fields can be of any type. -In particular, -because functions are first-class values, -table fields can contain functions. -Thus tables can also carry methods (see §3.4.11). - - -

-The indexing of tables follows -the definition of raw equality in the language. -The expressions a[i] and a[j] -denote the same table element -if and only if i and j are raw equal -(that is, equal without metamethods). -In particular, floats with integral values -are equal to their respective integers -(e.g., 1.0 == 1). -To avoid ambiguities, -any float used as a key that is equal to an integer -is converted to that integer. -For instance, if you write a[2.0] = true, -the actual key inserted into the table will be the integer 2. - - -

-Tables, functions, threads, and (full) userdata values are objects: -variables do not actually contain these values, -only references to them. -Assignment, parameter passing, and function returns -always manipulate references to such values; -these operations do not imply any kind of copy. - - -

-The library function type returns a string describing the type -of a given value (see type). - - - - - -

2.2 – Environments and the Global Environment

- -

-As we will discuss further in §3.2 and §3.3.3, -any reference to a free name -(that is, a name not bound to any declaration) var -is syntactically translated to _ENV.var. -Moreover, every chunk is compiled in the scope of -an external local variable named _ENV (see §3.3.2), -so _ENV itself is never a free name in a chunk. - - -

-Despite the existence of this external _ENV variable and -the translation of free names, -_ENV is a completely regular name. -In particular, -you can define new variables and parameters with that name. -Each reference to a free name uses the _ENV that is -visible at that point in the program, -following the usual visibility rules of Lua (see §3.5). - - -

-Any table used as the value of _ENV is called an environment. - - -

-Lua keeps a distinguished environment called the global environment. -This value is kept at a special index in the C registry (see §4.3). -In Lua, the global variable _G is initialized with this same value. -(_G is never used internally, -so changing its value will affect only your own code.) - - -

-When Lua loads a chunk, -the default value for its _ENV variable -is the global environment (see load). -Therefore, by default, -free names in Lua code refer to entries in the global environment -and, therefore, they are also called global variables. -Moreover, all standard libraries are loaded in the global environment -and some functions there operate on that environment. -You can use load (or loadfile) -to load a chunk with a different environment. -(In C, you have to load the chunk and then change the value -of its first upvalue; see lua_setupvalue.) - - - - - -

2.3 – Error Handling

- -

-Several operations in Lua can raise an error. -An error interrupts the normal flow of the program, -which can continue by catching the error. - - -

-Lua code can explicitly raise an error by calling the -error function. -(This function never returns.) - - -

-To catch errors in Lua, -you can do a protected call, -using pcall (or xpcall). -The function pcall calls a given function in protected mode. -Any error while running the function stops its execution, -and control returns immediately to pcall, -which returns a status code. - - -

-Because Lua is an embedded extension language, -Lua code starts running by a call -from C code in the host program. -(When you use Lua standalone, -the lua application is the host program.) -Usually, this call is protected; -so, when an otherwise unprotected error occurs during -the compilation or execution of a Lua chunk, -control returns to the host, -which can take appropriate measures, -such as printing an error message. - - -

-Whenever there is an error, -an error object -is propagated with information about the error. -Lua itself only generates errors whose error object is a string, -but programs can generate errors with -any value as the error object. -It is up to the Lua program or its host to handle such error objects. -For historical reasons, -an error object is often called an error message, -even though it does not have to be a string. - - -

-When you use xpcall (or lua_pcall, in C) -you can give a message handler -to be called in case of errors. -This function is called with the original error object -and returns a new error object. -It is called before the error unwinds the stack, -so that it can gather more information about the error, -for instance by inspecting the stack and creating a stack traceback. -This message handler is still protected by the protected call; -so, an error inside the message handler -will call the message handler again. -If this loop goes on for too long, -Lua breaks it and returns an appropriate message. -The message handler is called only for regular runtime errors. -It is not called for memory-allocation errors -nor for errors while running finalizers or other message handlers. - - -

-Lua also offers a system of warnings (see warn). -Unlike errors, warnings do not interfere -in any way with program execution. -They typically only generate a message to the user, -although this behavior can be adapted from C (see lua_setwarnf). - - - - - -

2.4 – Metatables and Metamethods

- -

-Every value in Lua can have a metatable. -This metatable is an ordinary Lua table -that defines the behavior of the original value -under certain events. -You can change several aspects of the behavior -of a value by setting specific fields in its metatable. -For instance, when a non-numeric value is the operand of an addition, -Lua checks for a function in the field __add of the value's metatable. -If it finds one, -Lua calls this function to perform the addition. - - -

-The key for each event in a metatable is a string -with the event name prefixed by two underscores; -the corresponding value is called a metavalue. -For most events, the metavalue must be a function, -which is then called a metamethod. -In the previous example, the key is the string "__add" -and the metamethod is the function that performs the addition. -Unless stated otherwise, -a metamethod can in fact be any callable value, -which is either a function or a value with a __call metamethod. - - -

-You can query the metatable of any value -using the getmetatable function. -Lua queries metamethods in metatables using a raw access (see rawget). - - -

-You can replace the metatable of tables -using the setmetatable function. -You cannot change the metatable of other types from Lua code, -except by using the debug library (§6.10). - - -

-Tables and full userdata have individual metatables, -although multiple tables and userdata can share their metatables. -Values of all other types share one single metatable per type; -that is, there is one single metatable for all numbers, -one for all strings, etc. -By default, a value has no metatable, -but the string library sets a metatable for the string type (see §6.4). - - -

-A detailed list of operations controlled by metatables is given next. -Each event is identified by its corresponding key. -By convention, all metatable keys used by Lua are composed by -two underscores followed by lowercase Latin letters. - - - -

    - -
  • __add: -the addition (+) operation. -If any operand for an addition is not a number, -Lua will try to call a metamethod. -It starts by checking the first operand (even if it is a number); -if that operand does not define a metamethod for __add, -then Lua will check the second operand. -If Lua can find a metamethod, -it calls the metamethod with the two operands as arguments, -and the result of the call -(adjusted to one value) -is the result of the operation. -Otherwise, if no metamethod is found, -Lua raises an error. -
  • - -
  • __sub: -the subtraction (-) operation. -Behavior similar to the addition operation. -
  • - -
  • __mul: -the multiplication (*) operation. -Behavior similar to the addition operation. -
  • - -
  • __div: -the division (/) operation. -Behavior similar to the addition operation. -
  • - -
  • __mod: -the modulo (%) operation. -Behavior similar to the addition operation. -
  • - -
  • __pow: -the exponentiation (^) operation. -Behavior similar to the addition operation. -
  • - -
  • __unm: -the negation (unary -) operation. -Behavior similar to the addition operation. -
  • - -
  • __idiv: -the floor division (//) operation. -Behavior similar to the addition operation. -
  • - -
  • __band: -the bitwise AND (&) operation. -Behavior similar to the addition operation, -except that Lua will try a metamethod -if any operand is neither an integer -nor a float coercible to an integer (see §3.4.3). -
  • - -
  • __bor: -the bitwise OR (|) operation. -Behavior similar to the bitwise AND operation. -
  • - -
  • __bxor: -the bitwise exclusive OR (binary ~) operation. -Behavior similar to the bitwise AND operation. -
  • - -
  • __bnot: -the bitwise NOT (unary ~) operation. -Behavior similar to the bitwise AND operation. -
  • - -
  • __shl: -the bitwise left shift (<<) operation. -Behavior similar to the bitwise AND operation. -
  • - -
  • __shr: -the bitwise right shift (>>) operation. -Behavior similar to the bitwise AND operation. -
  • - -
  • __concat: -the concatenation (..) operation. -Behavior similar to the addition operation, -except that Lua will try a metamethod -if any operand is neither a string nor a number -(which is always coercible to a string). -
  • - -
  • __len: -the length (#) operation. -If the object is not a string, -Lua will try its metamethod. -If there is a metamethod, -Lua calls it with the object as argument, -and the result of the call -(always adjusted to one value) -is the result of the operation. -If there is no metamethod but the object is a table, -then Lua uses the table length operation (see §3.4.7). -Otherwise, Lua raises an error. -
  • - -
  • __eq: -the equal (==) operation. -Behavior similar to the addition operation, -except that Lua will try a metamethod only when the values -being compared are either both tables or both full userdata -and they are not primitively equal. -The result of the call is always converted to a boolean. -
  • - -
  • __lt: -the less than (<) operation. -Behavior similar to the addition operation, -except that Lua will try a metamethod only when the values -being compared are neither both numbers nor both strings. -Moreover, the result of the call is always converted to a boolean. -
  • - -
  • __le: -the less equal (<=) operation. -Behavior similar to the less than operation. -
  • - -
  • __index: -The indexing access operation table[key]. -This event happens when table is not a table or -when key is not present in table. -The metavalue is looked up in the metatable of table. - - -

    -The metavalue for this event can be either a function, a table, -or any value with an __index metavalue. -If it is a function, -it is called with table and key as arguments, -and the result of the call -(adjusted to one value) -is the result of the operation. -Otherwise, -the final result is the result of indexing this metavalue with key. -This indexing is regular, not raw, -and therefore can trigger another __index metavalue. -

  • - -
  • __newindex: -The indexing assignment table[key] = value. -Like the index event, -this event happens when table is not a table or -when key is not present in table. -The metavalue is looked up in the metatable of table. - - -

    -Like with indexing, -the metavalue for this event can be either a function, a table, -or any value with an __newindex metavalue. -If it is a function, -it is called with table, key, and value as arguments. -Otherwise, -Lua repeats the indexing assignment over this metavalue -with the same key and value. -This assignment is regular, not raw, -and therefore can trigger another __newindex metavalue. - - -

    -Whenever a __newindex metavalue is invoked, -Lua does not perform the primitive assignment. -If needed, -the metamethod itself can call rawset -to do the assignment. -

  • - -
  • __call: -The call operation func(args). -This event happens when Lua tries to call a non-function value -(that is, func is not a function). -The metamethod is looked up in func. -If present, -the metamethod is called with func as its first argument, -followed by the arguments of the original call (args). -All results of the call -are the results of the operation. -This is the only metamethod that allows multiple results. -
  • - -
- -

-In addition to the previous list, -the interpreter also respects the following keys in metatables: -__gc (see §2.5.3), -__close (see §3.3.8), -__mode (see §2.5.4), -and __name. -(The entry __name, -when it contains a string, -may be used by tostring and in error messages.) - - -

-For the unary operators (negation, length, and bitwise NOT), -the metamethod is computed and called with a dummy second operand, -equal to the first one. -This extra operand is only to simplify Lua's internals -(by making these operators behave like a binary operation) -and may be removed in future versions. -For most uses this extra operand is irrelevant. - - -

-Because metatables are regular tables, -they can contain arbitrary fields, -not only the event names defined above. -Some functions in the standard library -(e.g., tostring) -use other fields in metatables for their own purposes. - - -

-It is a good practice to add all needed metamethods to a table -before setting it as a metatable of some object. -In particular, the __gc metamethod works only when this order -is followed (see §2.5.3). -It is also a good practice to set the metatable of an object -right after its creation. - - - - - -

2.5 – Garbage Collection

- - - -

-Lua performs automatic memory management. -This means that -you do not have to worry about allocating memory for new objects -or freeing it when the objects are no longer needed. -Lua manages memory automatically by running -a garbage collector to collect all dead objects. -All memory used by Lua is subject to automatic management: -strings, tables, userdata, functions, threads, internal structures, etc. - - -

-An object is considered dead -as soon as the collector can be sure the object -will not be accessed again in the normal execution of the program. -("Normal execution" here excludes finalizers, -which can resurrect dead objects (see §2.5.3), -and excludes also operations using the debug library.) -Note that the time when the collector can be sure that an object -is dead may not coincide with the programmer's expectations. -The only guarantees are that Lua will not collect an object -that may still be accessed in the normal execution of the program, -and it will eventually collect an object -that is inaccessible from Lua. -(Here, -inaccessible from Lua means that neither a variable nor -another live object refer to the object.) -Because Lua has no knowledge about C code, -it never collects objects accessible through the registry (see §4.3), -which includes the global environment (see §2.2). - - -

-The garbage collector (GC) in Lua can work in two modes: -incremental and generational. - - -

-The default GC mode with the default parameters -are adequate for most uses. -However, programs that waste a large proportion of their time -allocating and freeing memory can benefit from other settings. -Keep in mind that the GC behavior is non-portable -both across platforms and across different Lua releases; -therefore, optimal settings are also non-portable. - - -

-You can change the GC mode and parameters by calling -lua_gc in C -or collectgarbage in Lua. -You can also use these functions to control -the collector directly (e.g., to stop and restart it). - - - - - -

2.5.1 – Incremental Garbage Collection

- -

-In incremental mode, -each GC cycle performs a mark-and-sweep collection in small steps -interleaved with the program's execution. -In this mode, -the collector uses three numbers to control its garbage-collection cycles: -the garbage-collector pause, -the garbage-collector step multiplier, -and the garbage-collector step size. - - -

-The garbage-collector pause -controls how long the collector waits before starting a new cycle. -The collector starts a new cycle when the use of memory -hits n% of the use after the previous collection. -Larger values make the collector less aggressive. -Values equal to or less than 100 mean the collector will not wait to -start a new cycle. -A value of 200 means that the collector waits for the total memory in use -to double before starting a new cycle. -The default value is 200; the maximum value is 1000. - - -

-The garbage-collector step multiplier -controls the speed of the collector relative to -memory allocation, -that is, -how many elements it marks or sweeps for each -kilobyte of memory allocated. -Larger values make the collector more aggressive but also increase -the size of each incremental step. -You should not use values less than 100, -because they make the collector too slow and -can result in the collector never finishing a cycle. -The default value is 100; the maximum value is 1000. - - -

-The garbage-collector step size controls the -size of each incremental step, -specifically how many bytes the interpreter allocates -before performing a step. -This parameter is logarithmic: -A value of n means the interpreter will allocate 2n -bytes between steps and perform equivalent work during the step. -A large value (e.g., 60) makes the collector a stop-the-world -(non-incremental) collector. -The default value is 13, -which means steps of approximately 8 Kbytes. - - - - - -

2.5.2 – Generational Garbage Collection

- -

-In generational mode, -the collector does frequent minor collections, -which traverses only objects recently created. -If after a minor collection the use of memory is still above a limit, -the collector does a stop-the-world major collection, -which traverses all objects. -The generational mode uses two parameters: -the minor multiplier and the the major multiplier. - - -

-The minor multiplier controls the frequency of minor collections. -For a minor multiplier x, -a new minor collection will be done when memory -grows x% larger than the memory in use after the previous major -collection. -For instance, for a multiplier of 20, -the collector will do a minor collection when the use of memory -gets 20% larger than the use after the previous major collection. -The default value is 20; the maximum value is 200. - - -

-The major multiplier controls the frequency of major collections. -For a major multiplier x, -a new major collection will be done when memory -grows x% larger than the memory in use after the previous major -collection. -For instance, for a multiplier of 100, -the collector will do a major collection when the use of memory -gets larger than twice the use after the previous collection. -The default value is 100; the maximum value is 1000. - - - - - -

2.5.3 – Garbage-Collection Metamethods

- -

-You can set garbage-collector metamethods for tables -and, using the C API, -for full userdata (see §2.4). -These metamethods, called finalizers, -are called when the garbage collector detects that the -corresponding table or userdata is dead. -Finalizers allow you to coordinate Lua's garbage collection -with external resource management such as closing files, -network or database connections, -or freeing your own memory. - - -

-For an object (table or userdata) to be finalized when collected, -you must mark it for finalization. - -You mark an object for finalization when you set its metatable -and the metatable has a __gc metamethod. -Note that if you set a metatable without a __gc field -and later create that field in the metatable, -the object will not be marked for finalization. - - -

-When a marked object becomes dead, -it is not collected immediately by the garbage collector. -Instead, Lua puts it in a list. -After the collection, -Lua goes through that list. -For each object in the list, -it checks the object's __gc metamethod: -If it is present, -Lua calls it with the object as its single argument. - - -

-At the end of each garbage-collection cycle, -the finalizers are called in -the reverse order that the objects were marked for finalization, -among those collected in that cycle; -that is, the first finalizer to be called is the one associated -with the object marked last in the program. -The execution of each finalizer may occur at any point during -the execution of the regular code. - - -

-Because the object being collected must still be used by the finalizer, -that object (and other objects accessible only through it) -must be resurrected by Lua. -Usually, this resurrection is transient, -and the object memory is freed in the next garbage-collection cycle. -However, if the finalizer stores the object in some global place -(e.g., a global variable), -then the resurrection is permanent. -Moreover, if the finalizer marks a finalizing object for finalization again, -its finalizer will be called again in the next cycle where the -object is dead. -In any case, -the object memory is freed only in a GC cycle where -the object is dead and not marked for finalization. - - -

-When you close a state (see lua_close), -Lua calls the finalizers of all objects marked for finalization, -following the reverse order that they were marked. -If any finalizer marks objects for collection during that phase, -these marks have no effect. - - -

-Finalizers cannot yield nor run the garbage collector. -Because they can run in unpredictable times, -it is good practice to restrict each finalizer -to the minimum necessary to properly release -its associated resource. - - -

-Any error while running a finalizer generates a warning; -the error is not propagated. - - - - - -

2.5.4 – Weak Tables

- -

-A weak table is a table whose elements are -weak references. -A weak reference is ignored by the garbage collector. -In other words, -if the only references to an object are weak references, -then the garbage collector will collect that object. - - -

-A weak table can have weak keys, weak values, or both. -A table with weak values allows the collection of its values, -but prevents the collection of its keys. -A table with both weak keys and weak values allows the collection of -both keys and values. -In any case, if either the key or the value is collected, -the whole pair is removed from the table. -The weakness of a table is controlled by the -__mode field of its metatable. -This metavalue, if present, must be one of the following strings: -"k", for a table with weak keys; -"v", for a table with weak values; -or "kv", for a table with both weak keys and values. - - -

-A table with weak keys and strong values -is also called an ephemeron table. -In an ephemeron table, -a value is considered reachable only if its key is reachable. -In particular, -if the only reference to a key comes through its value, -the pair is removed. - - -

-Any change in the weakness of a table may take effect only -at the next collect cycle. -In particular, if you change the weakness to a stronger mode, -Lua may still collect some items from that table -before the change takes effect. - - -

-Only objects that have an explicit construction -are removed from weak tables. -Values, such as numbers and light C functions, -are not subject to garbage collection, -and therefore are not removed from weak tables -(unless their associated values are collected). -Although strings are subject to garbage collection, -they do not have an explicit construction and -their equality is by value; -they behave more like values than like objects. -Therefore, they are not removed from weak tables. - - -

-Resurrected objects -(that is, objects being finalized -and objects accessible only through objects being finalized) -have a special behavior in weak tables. -They are removed from weak values before running their finalizers, -but are removed from weak keys only in the next collection -after running their finalizers, when such objects are actually freed. -This behavior allows the finalizer to access properties -associated with the object through weak tables. - - -

-If a weak table is among the resurrected objects in a collection cycle, -it may not be properly cleared until the next cycle. - - - - - - - -

2.6 – Coroutines

- -

-Lua supports coroutines, -also called collaborative multithreading. -A coroutine in Lua represents an independent thread of execution. -Unlike threads in multithread systems, however, -a coroutine only suspends its execution by explicitly calling -a yield function. - - -

-You create a coroutine by calling coroutine.create. -Its sole argument is a function -that is the main function of the coroutine. -The create function only creates a new coroutine and -returns a handle to it (an object of type thread); -it does not start the coroutine. - - -

-You execute a coroutine by calling coroutine.resume. -When you first call coroutine.resume, -passing as its first argument -a thread returned by coroutine.create, -the coroutine starts its execution by -calling its main function. -Extra arguments passed to coroutine.resume are passed -as arguments to that function. -After the coroutine starts running, -it runs until it terminates or yields. - - -

-A coroutine can terminate its execution in two ways: -normally, when its main function returns -(explicitly or implicitly, after the last instruction); -and abnormally, if there is an unprotected error. -In case of normal termination, -coroutine.resume returns true, -plus any values returned by the coroutine main function. -In case of errors, coroutine.resume returns false -plus the error object. -In this case, the coroutine does not unwind its stack, -so that it is possible to inspect it after the error -with the debug API. - - -

-A coroutine yields by calling coroutine.yield. -When a coroutine yields, -the corresponding coroutine.resume returns immediately, -even if the yield happens inside nested function calls -(that is, not in the main function, -but in a function directly or indirectly called by the main function). -In the case of a yield, coroutine.resume also returns true, -plus any values passed to coroutine.yield. -The next time you resume the same coroutine, -it continues its execution from the point where it yielded, -with the call to coroutine.yield returning any extra -arguments passed to coroutine.resume. - - -

-Like coroutine.create, -the coroutine.wrap function also creates a coroutine, -but instead of returning the coroutine itself, -it returns a function that, when called, resumes the coroutine. -Any arguments passed to this function -go as extra arguments to coroutine.resume. -coroutine.wrap returns all the values returned by coroutine.resume, -except the first one (the boolean error code). -Unlike coroutine.resume, -the function created by coroutine.wrap -propagates any error to the caller. -In this case, -the function also closes the coroutine (see coroutine.close). - - -

-As an example of how coroutines work, -consider the following code: - -

-     function foo (a)
-       print("foo", a)
-       return coroutine.yield(2*a)
-     end
-     
-     co = coroutine.create(function (a,b)
-           print("co-body", a, b)
-           local r = foo(a+1)
-           print("co-body", r)
-           local r, s = coroutine.yield(a+b, a-b)
-           print("co-body", r, s)
-           return b, "end"
-     end)
-     
-     print("main", coroutine.resume(co, 1, 10))
-     print("main", coroutine.resume(co, "r"))
-     print("main", coroutine.resume(co, "x", "y"))
-     print("main", coroutine.resume(co, "x", "y"))
-

-When you run it, it produces the following output: - -

-     co-body 1       10
-     foo     2
-     main    true    4
-     co-body r
-     main    true    11      -9
-     co-body x       y
-     main    true    10      end
-     main    false   cannot resume dead coroutine
-
- -

-You can also create and manipulate coroutines through the C API: -see functions lua_newthread, lua_resume, -and lua_yield. - - - - - -

3 – The Language

- - - -

-This section describes the lexis, the syntax, and the semantics of Lua. -In other words, -this section describes -which tokens are valid, -how they can be combined, -and what their combinations mean. - - -

-Language constructs will be explained using the usual extended BNF notation, -in which -{a} means 0 or more a's, and -[a] means an optional a. -Non-terminals are shown like non-terminal, -keywords are shown like kword, -and other terminal symbols are shown like ‘=’. -The complete syntax of Lua can be found in §9 -at the end of this manual. - - - - - -

3.1 – Lexical Conventions

- -

-Lua is a free-form language. -It ignores spaces and comments between lexical elements (tokens), -except as delimiters between two tokens. -In source code, -Lua recognizes as spaces the standard ASCII whitespace -characters space, form feed, newline, -carriage return, horizontal tab, and vertical tab. - - -

-Names -(also called identifiers) -in Lua can be any string of Latin letters, -Arabic-Indic digits, and underscores, -not beginning with a digit and -not being a reserved word. -Identifiers are used to name variables, table fields, and labels. - - -

-The following keywords are reserved -and cannot be used as names: - - -

-     and       break     do        else      elseif    end
-     false     for       function  goto      if        in
-     local     nil       not       or        repeat    return
-     then      true      until     while
-
- -

-Lua is a case-sensitive language: -and is a reserved word, but And and AND -are two different, valid names. -As a convention, -programs should avoid creating -names that start with an underscore followed by -one or more uppercase letters (such as _VERSION). - - -

-The following strings denote other tokens: - -

-     +     -     *     /     %     ^     #
-     &     ~     |     <<    >>    //
-     ==    ~=    <=    >=    <     >     =
-     (     )     {     }     [     ]     ::
-     ;     :     ,     .     ..    ...
-
- -

-A short literal string -can be delimited by matching single or double quotes, -and can contain the following C-like escape sequences: -'\a' (bell), -'\b' (backspace), -'\f' (form feed), -'\n' (newline), -'\r' (carriage return), -'\t' (horizontal tab), -'\v' (vertical tab), -'\\' (backslash), -'\"' (quotation mark [double quote]), -and '\'' (apostrophe [single quote]). -A backslash followed by a line break -results in a newline in the string. -The escape sequence '\z' skips the following span -of whitespace characters, -including line breaks; -it is particularly useful to break and indent a long literal string -into multiple lines without adding the newlines and spaces -into the string contents. -A short literal string cannot contain unescaped line breaks -nor escapes not forming a valid escape sequence. - - -

-We can specify any byte in a short literal string, -including embedded zeros, -by its numeric value. -This can be done -with the escape sequence \xXX, -where XX is a sequence of exactly two hexadecimal digits, -or with the escape sequence \ddd, -where ddd is a sequence of up to three decimal digits. -(Note that if a decimal escape sequence is to be followed by a digit, -it must be expressed using exactly three digits.) - - -

-The UTF-8 encoding of a Unicode character -can be inserted in a literal string with -the escape sequence \u{XXX} -(with mandatory enclosing braces), -where XXX is a sequence of one or more hexadecimal digits -representing the character code point. -This code point can be any value less than 231. -(Lua uses the original UTF-8 specification here, -which is not restricted to valid Unicode code points.) - - -

-Literal strings can also be defined using a long format -enclosed by long brackets. -We define an opening long bracket of level n as an opening -square bracket followed by n equal signs followed by another -opening square bracket. -So, an opening long bracket of level 0 is written as [[, -an opening long bracket of level 1 is written as [=[, -and so on. -A closing long bracket is defined similarly; -for instance, -a closing long bracket of level 4 is written as ]====]. -A long literal starts with an opening long bracket of any level and -ends at the first closing long bracket of the same level. -It can contain any text except a closing bracket of the same level. -Literals in this bracketed form can run for several lines, -do not interpret any escape sequences, -and ignore long brackets of any other level. -Any kind of end-of-line sequence -(carriage return, newline, carriage return followed by newline, -or newline followed by carriage return) -is converted to a simple newline. -When the opening long bracket is immediately followed by a newline, -the newline is not included in the string. - - -

-As an example, in a system using ASCII -(in which 'a' is coded as 97, -newline is coded as 10, and '1' is coded as 49), -the five literal strings below denote the same string: - -

-     a = 'alo\n123"'
-     a = "alo\n123\""
-     a = '\97lo\10\04923"'
-     a = [[alo
-     123"]]
-     a = [==[
-     alo
-     123"]==]
-
- -

-Any byte in a literal string not -explicitly affected by the previous rules represents itself. -However, Lua opens files for parsing in text mode, -and the system's file functions may have problems with -some control characters. -So, it is safer to represent -binary data as a quoted literal with -explicit escape sequences for the non-text characters. - - -

-A numeric constant (or numeral) -can be written with an optional fractional part -and an optional decimal exponent, -marked by a letter 'e' or 'E'. -Lua also accepts hexadecimal constants, -which start with 0x or 0X. -Hexadecimal constants also accept an optional fractional part -plus an optional binary exponent, -marked by a letter 'p' or 'P' and written in decimal. -(For instance, 0x1.fp10 denotes 1984, -which is 0x1f / 16 multiplied by 210.) - - -

-A numeric constant with a radix point or an exponent -denotes a float; -otherwise, -if its value fits in an integer or it is a hexadecimal constant, -it denotes an integer; -otherwise (that is, a decimal integer numeral that overflows), -it denotes a float. -Hexadecimal numerals with neither a radix point nor an exponent -always denote an integer value; -if the value overflows, it wraps around -to fit into a valid integer. - - -

-Examples of valid integer constants are - -

-     3   345   0xff   0xBEBADA
-

-Examples of valid float constants are - -

-     3.0     3.1416     314.16e-2     0.31416E1     34e1
-     0x0.1E  0xA23p-4   0X1.921FB54442D18P+1
-
- -

-A comment starts with a double hyphen (--) -anywhere outside a string. -If the text immediately after -- is not an opening long bracket, -the comment is a short comment, -which runs until the end of the line. -Otherwise, it is a long comment, -which runs until the corresponding closing long bracket. - - - - - -

3.2 – Variables

- -

-Variables are places that store values. -There are three kinds of variables in Lua: -global variables, local variables, and table fields. - - -

-A single name can denote a global variable or a local variable -(or a function's formal parameter, -which is a particular kind of local variable): - -

-	var ::= Name
-

-Name denotes identifiers (see §3.1). - - -

-Any variable name is assumed to be global unless explicitly declared -as a local (see §3.3.7). -Local variables are lexically scoped: -local variables can be freely accessed by functions -defined inside their scope (see §3.5). - - -

-Before the first assignment to a variable, its value is nil. - - -

-Square brackets are used to index a table: - -

-	var ::= prefixexp ‘[’ exp ‘]’
-

-The meaning of accesses to table fields can be changed via metatables -(see §2.4). - - -

-The syntax var.Name is just syntactic sugar for -var["Name"]: - -

-	var ::= prefixexp ‘.’ Name
-
- -

-An access to a global variable x -is equivalent to _ENV.x. -Due to the way that chunks are compiled, -the variable _ENV itself is never global (see §2.2). - - - - - -

3.3 – Statements

- - - -

-Lua supports an almost conventional set of statements, -similar to those in other conventional languages. -This set includes -blocks, assignments, control structures, function calls, -and variable declarations. - - - - - -

3.3.1 – Blocks

- -

-A block is a list of statements, -which are executed sequentially: - -

-	block ::= {stat}
-

-Lua has empty statements -that allow you to separate statements with semicolons, -start a block with a semicolon -or write two semicolons in sequence: - -

-	stat ::= ‘;’
-
- -

-Both function calls and assignments -can start with an open parenthesis. -This possibility leads to an ambiguity in Lua's grammar. -Consider the following fragment: - -

-     a = b + c
-     (print or io.write)('done')
-

-The grammar could see this fragment in two ways: - -

-     a = b + c(print or io.write)('done')
-     
-     a = b + c; (print or io.write)('done')
-

-The current parser always sees such constructions -in the first way, -interpreting the open parenthesis -as the start of the arguments to a call. -To avoid this ambiguity, -it is a good practice to always precede with a semicolon -statements that start with a parenthesis: - -

-     ;(print or io.write)('done')
-
- -

-A block can be explicitly delimited to produce a single statement: - -

-	stat ::= do block end
-

-Explicit blocks are useful -to control the scope of variable declarations. -Explicit blocks are also sometimes used to -add a return statement in the middle -of another block (see §3.3.4). - - - - - -

3.3.2 – Chunks

- -

-The unit of compilation of Lua is called a chunk. -Syntactically, -a chunk is simply a block: - -

-	chunk ::= block
-
- -

-Lua handles a chunk as the body of an anonymous function -with a variable number of arguments -(see §3.4.11). -As such, chunks can define local variables, -receive arguments, and return values. -Moreover, such anonymous function is compiled as in the -scope of an external local variable called _ENV (see §2.2). -The resulting function always has _ENV as its only external variable, -even if it does not use that variable. - - -

-A chunk can be stored in a file or in a string inside the host program. -To execute a chunk, -Lua first loads it, -precompiling the chunk's code into instructions for a virtual machine, -and then Lua executes the compiled code -with an interpreter for the virtual machine. - - -

-Chunks can also be precompiled into binary form; -see the program luac and the function string.dump for details. -Programs in source and compiled forms are interchangeable; -Lua automatically detects the file type and acts accordingly (see load). - - - - - -

3.3.3 – Assignment

- -

-Lua allows multiple assignments. -Therefore, the syntax for assignment -defines a list of variables on the left side -and a list of expressions on the right side. -The elements in both lists are separated by commas: - -

-	stat ::= varlist ‘=’ explist
-	varlist ::= var {‘,’ var}
-	explist ::= exp {‘,’ exp}
-

-Expressions are discussed in §3.4. - - -

-Before the assignment, -the list of values is adjusted to the length of -the list of variables (see §3.4.12). - - -

-If a variable is both assigned and read -inside a multiple assignment, -Lua ensures that all reads get the value of the variable -before the assignment. -Thus the code - -

-     i = 3
-     i, a[i] = i+1, 20
-

-sets a[3] to 20, without affecting a[4] -because the i in a[i] is evaluated (to 3) -before it is assigned 4. -Similarly, the line - -

-     x, y = y, x
-

-exchanges the values of x and y, -and - -

-     x, y, z = y, z, x
-

-cyclically permutes the values of x, y, and z. - - -

-Note that this guarantee covers only accesses -syntactically inside the assignment statement. -If a function or a metamethod called during the assignment -changes the value of a variable, -Lua gives no guarantees about the order of that access. - - -

-An assignment to a global name x = val -is equivalent to the assignment -_ENV.x = val (see §2.2). - - -

-The meaning of assignments to table fields and -global variables (which are actually table fields, too) -can be changed via metatables (see §2.4). - - - - - -

3.3.4 – Control Structures

-The control structures -if, while, and repeat have the usual meaning and -familiar syntax: - - - - -

-	stat ::= while exp do block end
-	stat ::= repeat block until exp
-	stat ::= if exp then block {elseif exp then block} [else block] end
-

-Lua also has a for statement, in two flavors (see §3.3.5). - - -

-The condition expression of a -control structure can return any value. -Both false and nil test false. -All values different from nil and false test true. -In particular, the number 0 and the empty string also test true. - - -

-In the repeat–until loop, -the inner block does not end at the until keyword, -but only after the condition. -So, the condition can refer to local variables -declared inside the loop block. - - -

-The goto statement transfers the program control to a label. -For syntactical reasons, -labels in Lua are considered statements too: - - - -

-	stat ::= goto Name
-	stat ::= label
-	label ::= ‘::’ Name ‘::’
-
- -

-A label is visible in the entire block where it is defined, -except inside nested functions. -A goto can jump to any visible label as long as it does not -enter into the scope of a local variable. -A label should not be declared -where a label with the same name is visible, -even if this other label has been declared in an enclosing block. - - -

-The break statement terminates the execution of a -while, repeat, or for loop, -skipping to the next statement after the loop: - - -

-	stat ::= break
-

-A break ends the innermost enclosing loop. - - -

-The return statement is used to return values -from a function or a chunk -(which is handled as an anonymous function). - -Functions can return more than one value, -so the syntax for the return statement is - -

-	stat ::= return [explist] [‘;’]
-
- -

-The return statement can only be written -as the last statement of a block. -If it is necessary to return in the middle of a block, -then an explicit inner block can be used, -as in the idiom do return end, -because now return is the last statement in its (inner) block. - - - - - -

3.3.5 – For Statement

- -

- -The for statement has two forms: -one numerical and one generic. - - - -

The numerical for loop

- -

-The numerical for loop repeats a block of code while a -control variable goes through an arithmetic progression. -It has the following syntax: - -

-	stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end
-

-The given identifier (Name) defines the control variable, -which is a new variable local to the loop body (block). - - -

-The loop starts by evaluating once the three control expressions. -Their values are called respectively -the initial value, the limit, and the step. -If the step is absent, it defaults to 1. - - -

-If both the initial value and the step are integers, -the loop is done with integers; -note that the limit may not be an integer. -Otherwise, the three values are converted to -floats and the loop is done with floats. -Beware of floating-point accuracy in this case. - - -

-After that initialization, -the loop body is repeated with the value of the control variable -going through an arithmetic progression, -starting at the initial value, -with a common difference given by the step. -A negative step makes a decreasing sequence; -a step equal to zero raises an error. -The loop continues while the value is less than -or equal to the limit -(greater than or equal to for a negative step). -If the initial value is already greater than the limit -(or less than, if the step is negative), -the body is not executed. - - -

-For integer loops, -the control variable never wraps around; -instead, the loop ends in case of an overflow. - - -

-You should not change the value of the control variable -during the loop. -If you need its value after the loop, -assign it to another variable before exiting the loop. - - - - - -

The generic for loop

- -

-The generic for statement works over functions, -called iterators. -On each iteration, the iterator function is called to produce a new value, -stopping when this new value is nil. -The generic for loop has the following syntax: - -

-	stat ::= for namelist in explist do block end
-	namelist ::= Name {‘,’ Name}
-

-A for statement like - -

-     for var_1, ···, var_n in explist do body end
-

-works as follows. - - -

-The names var_i declare loop variables local to the loop body. -The first of these variables is the control variable. - - -

-The loop starts by evaluating explist -to produce four values: -an iterator function, -a state, -an initial value for the control variable, -and a closing value. - - -

-Then, at each iteration, -Lua calls the iterator function with two arguments: -the state and the control variable. -The results from this call are then assigned to the loop variables, -following the rules of multiple assignments (see §3.3.3). -If the control variable becomes nil, -the loop terminates. -Otherwise, the body is executed and the loop goes -to the next iteration. - - -

-The closing value behaves like a -to-be-closed variable (see §3.3.8), -which can be used to release resources when the loop ends. -Otherwise, it does not interfere with the loop. - - -

-You should not change the value of the control variable -during the loop. - - - - - - - -

3.3.6 – Function Calls as Statements

-To allow possible side-effects, -function calls can be executed as statements: - -

-	stat ::= functioncall
-

-In this case, all returned values are thrown away. -Function calls are explained in §3.4.10. - - - - - -

3.3.7 – Local Declarations

-Local variables can be declared anywhere inside a block. -The declaration can include an initialization: - -

-	stat ::= local attnamelist [‘=’ explist]
-	attnamelist ::=  Name attrib {‘,’ Name attrib}
-

-If present, an initial assignment has the same semantics -of a multiple assignment (see §3.3.3). -Otherwise, all variables are initialized with nil. - - -

-Each variable name may be postfixed by an attribute -(a name between angle brackets): - -

-	attrib ::= [‘<’ Name ‘>’]
-

-There are two possible attributes: -const, which declares a constant variable, -that is, a variable that cannot be assigned to -after its initialization; -and close, which declares a to-be-closed variable (see §3.3.8). -A list of variables can contain at most one to-be-closed variable. - - -

-A chunk is also a block (see §3.3.2), -and so local variables can be declared in a chunk outside any explicit block. - - -

-The visibility rules for local variables are explained in §3.5. - - - - - -

3.3.8 – To-be-closed Variables

- -

-A to-be-closed variable behaves like a constant local variable, -except that its value is closed whenever the variable -goes out of scope, including normal block termination, -exiting its block by break/goto/return, -or exiting by an error. - - -

-Here, to close a value means -to call its __close metamethod. -When calling the metamethod, -the value itself is passed as the first argument -and the error object that caused the exit (if any) -is passed as a second argument; -if there was no error, the second argument is nil. - - -

-The value assigned to a to-be-closed variable -must have a __close metamethod -or be a false value. -(nil and false are ignored as to-be-closed values.) - - -

-If several to-be-closed variables go out of scope at the same event, -they are closed in the reverse order that they were declared. - - -

-If there is any error while running a closing method, -that error is handled like an error in the regular code -where the variable was defined. -After an error, -the other pending closing methods will still be called. - - -

-If a coroutine yields and is never resumed again, -some variables may never go out of scope, -and therefore they will never be closed. -(These variables are the ones created inside the coroutine -and in scope at the point where the coroutine yielded.) -Similarly, if a coroutine ends with an error, -it does not unwind its stack, -so it does not close any variable. -In both cases, -you can either use finalizers -or call coroutine.close to close the variables. -However, if the coroutine was created -through coroutine.wrap, -then its corresponding function will close the coroutine -in case of errors. - - - - - - - -

3.4 – Expressions

- - - -

-The basic expressions in Lua are the following: - -

-	exp ::= prefixexp
-	exp ::= nil | false | true
-	exp ::= Numeral
-	exp ::= LiteralString
-	exp ::= functiondef
-	exp ::= tableconstructor
-	exp ::= ‘...’
-	exp ::= exp binop exp
-	exp ::= unop exp
-	prefixexp ::= var | functioncall | ‘(’ exp ‘)’
-
- -

-Numerals and literal strings are explained in §3.1; -variables are explained in §3.2; -function definitions are explained in §3.4.11; -function calls are explained in §3.4.10; -table constructors are explained in §3.4.9. -Vararg expressions, -denoted by three dots ('...'), can only be used when -directly inside a variadic function; -they are explained in §3.4.11. - - -

-Binary operators comprise arithmetic operators (see §3.4.1), -bitwise operators (see §3.4.2), -relational operators (see §3.4.4), logical operators (see §3.4.5), -and the concatenation operator (see §3.4.6). -Unary operators comprise the unary minus (see §3.4.1), -the unary bitwise NOT (see §3.4.2), -the unary logical not (see §3.4.5), -and the unary length operator (see §3.4.7). - - - - - -

3.4.1 – Arithmetic Operators

-Lua supports the following arithmetic operators: - -

    -
  • +: addition
  • -
  • -: subtraction
  • -
  • *: multiplication
  • -
  • /: float division
  • -
  • //: floor division
  • -
  • %: modulo
  • -
  • ^: exponentiation
  • -
  • -: unary minus
  • -
- -

-With the exception of exponentiation and float division, -the arithmetic operators work as follows: -If both operands are integers, -the operation is performed over integers and the result is an integer. -Otherwise, if both operands are numbers, -then they are converted to floats, -the operation is performed following the machine's rules -for floating-point arithmetic -(usually the IEEE 754 standard), -and the result is a float. -(The string library coerces strings to numbers in -arithmetic operations; see §3.4.3 for details.) - - -

-Exponentiation and float division (/) -always convert their operands to floats -and the result is always a float. -Exponentiation uses the ISO C function pow, -so that it works for non-integer exponents too. - - -

-Floor division (//) is a division -that rounds the quotient towards minus infinity, -resulting in the floor of the division of its operands. - - -

-Modulo is defined as the remainder of a division -that rounds the quotient towards minus infinity (floor division). - - -

-In case of overflows in integer arithmetic, -all operations wrap around. - - - -

3.4.2 – Bitwise Operators

-Lua supports the following bitwise operators: - -

    -
  • &: bitwise AND
  • -
  • |: bitwise OR
  • -
  • ~: bitwise exclusive OR
  • -
  • >>: right shift
  • -
  • <<: left shift
  • -
  • ~: unary bitwise NOT
  • -
- -

-All bitwise operations convert its operands to integers -(see §3.4.3), -operate on all bits of those integers, -and result in an integer. - - -

-Both right and left shifts fill the vacant bits with zeros. -Negative displacements shift to the other direction; -displacements with absolute values equal to or higher than -the number of bits in an integer -result in zero (as all bits are shifted out). - - - - - -

3.4.3 – Coercions and Conversions

-Lua provides some automatic conversions between some -types and representations at run time. -Bitwise operators always convert float operands to integers. -Exponentiation and float division -always convert integer operands to floats. -All other arithmetic operations applied to mixed numbers -(integers and floats) convert the integer operand to a float. -The C API also converts both integers to floats and -floats to integers, as needed. -Moreover, string concatenation accepts numbers as arguments, -besides strings. - - -

-In a conversion from integer to float, -if the integer value has an exact representation as a float, -that is the result. -Otherwise, -the conversion gets the nearest higher or -the nearest lower representable value. -This kind of conversion never fails. - - -

-The conversion from float to integer -checks whether the float has an exact representation as an integer -(that is, the float has an integral value and -it is in the range of integer representation). -If it does, that representation is the result. -Otherwise, the conversion fails. - - -

-Several places in Lua coerce strings to numbers when necessary. -In particular, -the string library sets metamethods that try to coerce -strings to numbers in all arithmetic operations. -If the conversion fails, -the library calls the metamethod of the other operand -(if present) or it raises an error. -Note that bitwise operators do not do this coercion. - - -

-It is always a good practice not to rely on the -implicit coercions from strings to numbers, -as they are not always applied; -in particular, "1"==1 is false and "1"<1 raises an error -(see §3.4.4). -These coercions exist mainly for compatibility and may be removed -in future versions of the language. - - -

-A string is converted to an integer or a float -following its syntax and the rules of the Lua lexer. -The string may have also leading and trailing whitespaces and a sign. -All conversions from strings to numbers -accept both a dot and the current locale mark -as the radix character. -(The Lua lexer, however, accepts only a dot.) -If the string is not a valid numeral, -the conversion fails. -If necessary, the result of this first step is then converted -to a specific number subtype following the previous rules -for conversions between floats and integers. - - -

-The conversion from numbers to strings uses a -non-specified human-readable format. -To convert numbers to strings in any specific way, -use the function string.format. - - - - - -

3.4.4 – Relational Operators

-Lua supports the following relational operators: - -

    -
  • ==: equality
  • -
  • ~=: inequality
  • -
  • <: less than
  • -
  • >: greater than
  • -
  • <=: less or equal
  • -
  • >=: greater or equal
  • -

-These operators always result in false or true. - - -

-Equality (==) first compares the type of its operands. -If the types are different, then the result is false. -Otherwise, the values of the operands are compared. -Strings are equal if they have the same byte content. -Numbers are equal if they denote the same mathematical value. - - -

-Tables, userdata, and threads -are compared by reference: -two objects are considered equal only if they are the same object. -Every time you create a new object -(a table, a userdata, or a thread), -this new object is different from any previously existing object. -A function is always equal to itself. -Functions with any detectable difference -(different behavior, different definition) are always different. -Functions created at different times but with no detectable differences -may be classified as equal or not -(depending on internal caching details). - - -

-You can change the way that Lua compares tables and userdata -by using the __eq metamethod (see §2.4). - - -

-Equality comparisons do not convert strings to numbers -or vice versa. -Thus, "0"==0 evaluates to false, -and t[0] and t["0"] denote different -entries in a table. - - -

-The operator ~= is exactly the negation of equality (==). - - -

-The order operators work as follows. -If both arguments are numbers, -then they are compared according to their mathematical values, -regardless of their subtypes. -Otherwise, if both arguments are strings, -then their values are compared according to the current locale. -Otherwise, Lua tries to call the __lt or the __le -metamethod (see §2.4). -A comparison a > b is translated to b < a -and a >= b is translated to b <= a. - - -

-Following the IEEE 754 standard, -the special value NaN is considered neither less than, -nor equal to, nor greater than any value, including itself. - - - - - -

3.4.5 – Logical Operators

-The logical operators in Lua are -and, or, and not. -Like the control structures (see §3.3.4), -all logical operators consider both false and nil as false -and anything else as true. - - -

-The negation operator not always returns false or true. -The conjunction operator and returns its first argument -if this value is false or nil; -otherwise, and returns its second argument. -The disjunction operator or returns its first argument -if this value is different from nil and false; -otherwise, or returns its second argument. -Both and and or use short-circuit evaluation; -that is, -the second operand is evaluated only if necessary. -Here are some examples: - -

-     10 or 20            --> 10
-     10 or error()       --> 10
-     nil or "a"          --> "a"
-     nil and 10          --> nil
-     false and error()   --> false
-     false and nil       --> false
-     false or nil        --> nil
-     10 and 20           --> 20
-
- - - - -

3.4.6 – Concatenation

-The string concatenation operator in Lua is -denoted by two dots ('..'). -If both operands are strings or numbers, -then the numbers are converted to strings -in a non-specified format (see §3.4.3). -Otherwise, the __concat metamethod is called (see §2.4). - - - - - -

3.4.7 – The Length Operator

- -

-The length operator is denoted by the unary prefix operator #. - - -

-The length of a string is its number of bytes. -(That is the usual meaning of string length when each -character is one byte.) - - -

-The length operator applied on a table -returns a border in that table. -A border in a table t is any non-negative integer -that satisfies the following condition: - -

-     (border == 0 or t[border] ~= nil) and
-     (t[border + 1] == nil or border == math.maxinteger)
-

-In words, -a border is any positive integer index present in the table -that is followed by an absent index, -plus two limit cases: -zero, when index 1 is absent; -and the maximum value for an integer, when that index is present. -Note that keys that are not positive integers -do not interfere with borders. - - -

-A table with exactly one border is called a sequence. -For instance, the table {10, 20, 30, 40, 50} is a sequence, -as it has only one border (5). -The table {10, 20, 30, nil, 50} has two borders (3 and 5), -and therefore it is not a sequence. -(The nil at index 4 is called a hole.) -The table {nil, 20, 30, nil, nil, 60, nil} -has three borders (0, 3, and 6), -so it is not a sequence, too. -The table {} is a sequence with border 0. - - -

-When t is a sequence, -#t returns its only border, -which corresponds to the intuitive notion of the length of the sequence. -When t is not a sequence, -#t can return any of its borders. -(The exact one depends on details of -the internal representation of the table, -which in turn can depend on how the table was populated and -the memory addresses of its non-numeric keys.) - - -

-The computation of the length of a table -has a guaranteed worst time of O(log n), -where n is the largest integer key in the table. - - -

-A program can modify the behavior of the length operator for -any value but strings through the __len metamethod (see §2.4). - - - - - -

3.4.8 – Precedence

-Operator precedence in Lua follows the table below, -from lower to higher priority: - -

-     or
-     and
-     <     >     <=    >=    ~=    ==
-     |
-     ~
-     &
-     <<    >>
-     ..
-     +     -
-     *     /     //    %
-     unary operators (not   #     -     ~)
-     ^
-

-As usual, -you can use parentheses to change the precedences of an expression. -The concatenation ('..') and exponentiation ('^') -operators are right associative. -All other binary operators are left associative. - - - - - -

3.4.9 – Table Constructors

-Table constructors are expressions that create tables. -Every time a constructor is evaluated, a new table is created. -A constructor can be used to create an empty table -or to create a table and initialize some of its fields. -The general syntax for constructors is - -

-	tableconstructor ::= ‘{’ [fieldlist] ‘}’
-	fieldlist ::= field {fieldsep field} [fieldsep]
-	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
-	fieldsep ::= ‘,’ | ‘;’
-
- -

-Each field of the form [exp1] = exp2 adds to the new table an entry -with key exp1 and value exp2. -A field of the form name = exp is equivalent to -["name"] = exp. -Fields of the form exp are equivalent to -[i] = exp, where i are consecutive integers -starting with 1; -fields in the other formats do not affect this counting. -For example, - -

-     a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
-

-is equivalent to - -

-     do
-       local t = {}
-       t[f(1)] = g
-       t[1] = "x"         -- 1st exp
-       t[2] = "y"         -- 2nd exp
-       t.x = 1            -- t["x"] = 1
-       t[3] = f(x)        -- 3rd exp
-       t[30] = 23
-       t[4] = 45          -- 4th exp
-       a = t
-     end
-
- -

-The order of the assignments in a constructor is undefined. -(This order would be relevant only when there are repeated keys.) - - -

-If the last field in the list has the form exp -and the expression is a multires expression, -then all values returned by this expression enter the list consecutively -(see §3.4.12). - - -

-The field list can have an optional trailing separator, -as a convenience for machine-generated code. - - - - - -

3.4.10 – Function Calls

-A function call in Lua has the following syntax: - -

-	functioncall ::= prefixexp args
-

-In a function call, -first prefixexp and args are evaluated. -If the value of prefixexp has type function, -then this function is called -with the given arguments. -Otherwise, if present, -the prefixexp __call metamethod is called: -its first argument is the value of prefixexp, -followed by the original call arguments -(see §2.4). - - -

-The form - -

-	functioncall ::= prefixexp ‘:’ Name args
-

-can be used to emulate methods. -A call v:name(args) -is syntactic sugar for v.name(v,args), -except that v is evaluated only once. - - -

-Arguments have the following syntax: - -

-	args ::= ‘(’ [explist] ‘)’
-	args ::= tableconstructor
-	args ::= LiteralString
-

-All argument expressions are evaluated before the call. -A call of the form f{fields} is -syntactic sugar for f({fields}); -that is, the argument list is a single new table. -A call of the form f'string' -(or f"string" or f[[string]]) -is syntactic sugar for f('string'); -that is, the argument list is a single literal string. - - -

-A call of the form return functioncall not in the -scope of a to-be-closed variable is called a tail call. -Lua implements proper tail calls -(or proper tail recursion): -In a tail call, -the called function reuses the stack entry of the calling function. -Therefore, there is no limit on the number of nested tail calls that -a program can execute. -However, a tail call erases any debug information about the -calling function. -Note that a tail call only happens with a particular syntax, -where the return has one single function call as argument, -and it is outside the scope of any to-be-closed variable. -This syntax makes the calling function return exactly -the returns of the called function, -without any intervening action. -So, none of the following examples are tail calls: - -

-     return (f(x))        -- results adjusted to 1
-     return 2 * f(x)      -- result multiplied by 2
-     return x, f(x)       -- additional results
-     f(x); return         -- results discarded
-     return x or f(x)     -- results adjusted to 1
-
- - - - -

3.4.11 – Function Definitions

- -

-The syntax for function definition is - -

-	functiondef ::= function funcbody
-	funcbody ::= ‘(’ [parlist] ‘)’ block end
-
- -

-The following syntactic sugar simplifies function definitions: - -

-	stat ::= function funcname funcbody
-	stat ::= local function Name funcbody
-	funcname ::= Name {‘.’ Name} [‘:’ Name]
-

-The statement - -

-     function f () body end
-

-translates to - -

-     f = function () body end
-

-The statement - -

-     function t.a.b.c.f () body end
-

-translates to - -

-     t.a.b.c.f = function () body end
-

-The statement - -

-     local function f () body end
-

-translates to - -

-     local f; f = function () body end
-

-not to - -

-     local f = function () body end
-

-(This only makes a difference when the body of the function -contains references to f.) - - -

-A function definition is an executable expression, -whose value has type function. -When Lua precompiles a chunk, -all its function bodies are precompiled too, -but they are not created yet. -Then, whenever Lua executes the function definition, -the function is instantiated (or closed). -This function instance, or closure, -is the final value of the expression. - - -

-Parameters act as local variables that are -initialized with the argument values: - -

-	parlist ::= namelist [‘,’ ‘...’] | ‘...’
-

-When a Lua function is called, -it adjusts its list of arguments to -the length of its list of parameters (see §3.4.12), -unless the function is a variadic function, -which is indicated by three dots ('...') -at the end of its parameter list. -A variadic function does not adjust its argument list; -instead, it collects all extra arguments and supplies them -to the function through a vararg expression, -which is also written as three dots. -The value of this expression is a list of all actual extra arguments, -similar to a function with multiple results (see §3.4.12). - - -

-As an example, consider the following definitions: - -

-     function f(a, b) end
-     function g(a, b, ...) end
-     function r() return 1,2,3 end
-

-Then, we have the following mapping from arguments to parameters and -to the vararg expression: - -

-     CALL             PARAMETERS
-     
-     f(3)             a=3, b=nil
-     f(3, 4)          a=3, b=4
-     f(3, 4, 5)       a=3, b=4
-     f(r(), 10)       a=1, b=10
-     f(r())           a=1, b=2
-     
-     g(3)             a=3, b=nil, ... -->  (nothing)
-     g(3, 4)          a=3, b=4,   ... -->  (nothing)
-     g(3, 4, 5, 8)    a=3, b=4,   ... -->  5  8
-     g(5, r())        a=5, b=1,   ... -->  2  3
-
- -

-Results are returned using the return statement (see §3.3.4). -If control reaches the end of a function -without encountering a return statement, -then the function returns with no results. - - -

- -There is a system-dependent limit on the number of values -that a function may return. -This limit is guaranteed to be greater than 1000. - - -

-The colon syntax -is used to emulate methods, -adding an implicit extra parameter self to the function. -Thus, the statement - -

-     function t.a.b.c:f (params) body end
-

-is syntactic sugar for - -

-     t.a.b.c.f = function (self, params) body end
-
- - - - -

3.4.12 – Lists of expressions, multiple results, -and adjustment

- -

-Both function calls and vararg expressions can result in multiple values. -These expressions are called multires expressions. - - -

-When a multires expression is used as the last element -of a list of expressions, -all results from the expression are added to the -list of values produced by the list of expressions. -Note that a single expression -in a place that expects a list of expressions -is the last expression in that (singleton) list. - - -

-These are the places where Lua expects a list of expressions: - -

    - -
  • A return statement, -for instance return e1, e2, e3 (see §3.3.4).
  • - -
  • A table constructor, -for instance {e1, e2, e3} (see §3.4.9).
  • - -
  • The arguments of a function call, -for instance foo(e1, e2, e3) (see §3.4.10).
  • - -
  • A multiple assignment, -for instance a , b, c = e1, e2, e3 (see §3.3.3).
  • - -
  • A local declaration, -for instance local a , b, c = e1, e2, e3 (see §3.3.7).
  • - -
  • The initial values in a generic for loop, -for instance for k in e1, e2, e3 do ... end (see §3.3.5).
  • - -

-In the last four cases, -the list of values from the list of expressions -must be adjusted to a specific length: -the number of parameters in a call to a non-variadic function -(see §3.4.11), -the number of variables in a multiple assignment or -a local declaration, -and exactly four values for a generic for loop. -The adjustment follows these rules: -If there are more values than needed, -the extra values are thrown away; -if there are fewer values than needed, -the list is extended with nil's. -When the list of expressions ends with a multires expression, -all results from that expression enter the list of values -before the adjustment. - - -

-When a multires expression is used -in a list of expressions without being the last element, -or in a place where the syntax expects a single expression, -Lua adjusts the result list of that expression to one element. -As a particular case, -the syntax expects a single expression inside a parenthesized expression; -therefore, adding parentheses around a multires expression -forces it to produce exactly one result. - - -

-We seldom need to use a vararg expression in a place -where the syntax expects a single expression. -(Usually it is simpler to add a regular parameter before -the variadic part and use that parameter.) -When there is such a need, -we recommend assigning the vararg expression -to a single variable and using that variable -in its place. - - -

-Here are some examples of uses of mutlres expressions. -In all cases, when the construction needs -"the n-th result" and there is no such result, -it uses a nil. - -

-     print(x, f())      -- prints x and all results from f().
-     print(x, (f()))    -- prints x and the first result from f().
-     print(f(), x)      -- prints the first result from f() and x.
-     print(1 + f())     -- prints 1 added to the first result from f().
-     local x = ...      -- x gets the first vararg argument.
-     x,y = ...          -- x gets the first vararg argument,
-                        -- y gets the second vararg argument.
-     x,y,z = w, f()     -- x gets w, y gets the first result from f(),
-                        -- z gets the second result from f().
-     x,y,z = f()        -- x gets the first result from f(),
-                        -- y gets the second result from f(),
-                        -- z gets the third result from f().
-     x,y,z = f(), g()   -- x gets the first result from f(),
-                        -- y gets the first result from g(),
-                        -- z gets the second result from g().
-     x,y,z = (f())      -- x gets the first result from f(), y and z get nil.
-     return f()         -- returns all results from f().
-     return x, ...      -- returns x and all received vararg arguments.
-     return x,y,f()     -- returns x, y, and all results from f().
-     {f()}              -- creates a list with all results from f().
-     {...}              -- creates a list with all vararg arguments.
-     {f(), 5}           -- creates a list with the first result from f() and 5.
-
- - - - - - -

3.5 – Visibility Rules

- -

- -Lua is a lexically scoped language. -The scope of a local variable begins at the first statement after -its declaration and lasts until the last non-void statement -of the innermost block that includes the declaration. -(Void statements are labels and empty statements.) -Consider the following example: - -

-     x = 10                -- global variable
-     do                    -- new block
-       local x = x         -- new 'x', with value 10
-       print(x)            --> 10
-       x = x+1
-       do                  -- another block
-         local x = x+1     -- another 'x'
-         print(x)          --> 12
-       end
-       print(x)            --> 11
-     end
-     print(x)              --> 10  (the global one)
-
- -

-Notice that, in a declaration like local x = x, -the new x being declared is not in scope yet, -and so the second x refers to the outside variable. - - -

-Because of the lexical scoping rules, -local variables can be freely accessed by functions -defined inside their scope. -A local variable used by an inner function is called an upvalue -(or external local variable, or simply external variable) -inside the inner function. - - -

-Notice that each execution of a local statement -defines new local variables. -Consider the following example: - -

-     a = {}
-     local x = 20
-     for i = 1, 10 do
-       local y = 0
-       a[i] = function () y = y + 1; return x + y end
-     end
-

-The loop creates ten closures -(that is, ten instances of the anonymous function). -Each of these closures uses a different y variable, -while all of them share the same x. - - - - - -

4 – The Application Program Interface

- - - -

- -This section describes the C API for Lua, that is, -the set of C functions available to the host program to communicate -with Lua. -All API functions and related types and constants -are declared in the header file lua.h. - - -

-Even when we use the term "function", -any facility in the API may be provided as a macro instead. -Except where stated otherwise, -all such macros use each of their arguments exactly once -(except for the first argument, which is always a Lua state), -and so do not generate any hidden side-effects. - - -

-As in most C libraries, -the Lua API functions do not check their arguments -for validity or consistency. -However, you can change this behavior by compiling Lua -with the macro LUA_USE_APICHECK defined. - - -

-The Lua library is fully reentrant: -it has no global variables. -It keeps all information it needs in a dynamic structure, -called the Lua state. - - -

-Each Lua state has one or more threads, -which correspond to independent, cooperative lines of execution. -The type lua_State (despite its name) refers to a thread. -(Indirectly, through the thread, it also refers to the -Lua state associated to the thread.) - - -

-A pointer to a thread must be passed as the first argument to -every function in the library, except to lua_newstate, -which creates a Lua state from scratch and returns a pointer -to the main thread in the new state. - - - - - -

4.1 – The Stack

- - - -

-Lua uses a virtual stack to pass values to and from C. -Each element in this stack represents a Lua value -(nil, number, string, etc.). -Functions in the API can access this stack through the -Lua state parameter that they receive. - - -

-Whenever Lua calls C, the called function gets a new stack, -which is independent of previous stacks and of stacks of -C functions that are still active. -This stack initially contains any arguments to the C function -and it is where the C function can store temporary -Lua values and must push its results -to be returned to the caller (see lua_CFunction). - - -

-For convenience, -most query operations in the API do not follow a strict stack discipline. -Instead, they can refer to any element in the stack -by using an index: -A positive index represents an absolute stack position, -starting at 1 as the bottom of the stack; -a negative index represents an offset relative to the top of the stack. -More specifically, if the stack has n elements, -then index 1 represents the first element -(that is, the element that was pushed onto the stack first) -and -index n represents the last element; -index -1 also represents the last element -(that is, the element at the top) -and index -n represents the first element. - - - - - -

4.1.1 – Stack Size

- -

-When you interact with the Lua API, -you are responsible for ensuring consistency. -In particular, -you are responsible for controlling stack overflow. -When you call any API function, -you must ensure the stack has enough room to accommodate the results. - - -

-There is one exception to the above rule: -When you call a Lua function -without a fixed number of results (see lua_call), -Lua ensures that the stack has enough space for all results. -However, it does not ensure any extra space. -So, before pushing anything on the stack after such a call -you should use lua_checkstack. - - -

-Whenever Lua calls C, -it ensures that the stack has space for -at least LUA_MINSTACK extra elements; -that is, you can safely push up to LUA_MINSTACK values into it. -LUA_MINSTACK is defined as 20, -so that usually you do not have to worry about stack space -unless your code has loops pushing elements onto the stack. -Whenever necessary, -you can use the function lua_checkstack -to ensure that the stack has enough space for pushing new elements. - - - - - -

4.1.2 – Valid and Acceptable Indices

- -

-Any function in the API that receives stack indices -works only with valid indices or acceptable indices. - - -

-A valid index is an index that refers to a -position that stores a modifiable Lua value. -It comprises stack indices between 1 and the stack top -(1 ≤ abs(index) ≤ top) - -plus pseudo-indices, -which represent some positions that are accessible to C code -but that are not in the stack. -Pseudo-indices are used to access the registry (see §4.3) -and the upvalues of a C function (see §4.2). - - -

-Functions that do not need a specific mutable position, -but only a value (e.g., query functions), -can be called with acceptable indices. -An acceptable index can be any valid index, -but it also can be any positive index after the stack top -within the space allocated for the stack, -that is, indices up to the stack size. -(Note that 0 is never an acceptable index.) -Indices to upvalues (see §4.2) greater than the real number -of upvalues in the current C function are also acceptable (but invalid). -Except when noted otherwise, -functions in the API work with acceptable indices. - - -

-Acceptable indices serve to avoid extra tests -against the stack top when querying the stack. -For instance, a C function can query its third argument -without the need to check whether there is a third argument, -that is, without the need to check whether 3 is a valid index. - - -

-For functions that can be called with acceptable indices, -any non-valid index is treated as if it -contains a value of a virtual type LUA_TNONE, -which behaves like a nil value. - - - - - -

4.1.3 – Pointers to strings

- -

-Several functions in the API return pointers (const char*) -to Lua strings in the stack. -(See lua_pushfstring, lua_pushlstring, -lua_pushstring, and lua_tolstring. -See also luaL_checklstring, luaL_checkstring, -and luaL_tolstring in the auxiliary library.) - - -

-In general, -Lua's garbage collection can free or move internal memory -and then invalidate pointers to internal strings. -To allow a safe use of these pointers, -the API guarantees that any pointer to a string in a stack index -is valid while the string value at that index is not removed from the stack. -(It can be moved to another index, though.) -When the index is a pseudo-index (referring to an upvalue), -the pointer is valid while the corresponding call is active and -the corresponding upvalue is not modified. - - -

-Some functions in the debug interface -also return pointers to strings, -namely lua_getlocal, lua_getupvalue, -lua_setlocal, and lua_setupvalue. -For these functions, the pointer is guaranteed to -be valid while the caller function is active and -the given closure (if one was given) is in the stack. - - -

-Except for these guarantees, -the garbage collector is free to invalidate -any pointer to internal strings. - - - - - - - -

4.2 – C Closures

- -

-When a C function is created, -it is possible to associate some values with it, -thus creating a C closure -(see lua_pushcclosure); -these values are called upvalues and are -accessible to the function whenever it is called. - - -

-Whenever a C function is called, -its upvalues are located at specific pseudo-indices. -These pseudo-indices are produced by the macro -lua_upvalueindex. -The first upvalue associated with a function is at index -lua_upvalueindex(1), and so on. -Any access to lua_upvalueindex(n), -where n is greater than the number of upvalues of the -current function -(but not greater than 256, -which is one plus the maximum number of upvalues in a closure), -produces an acceptable but invalid index. - - -

-A C closure can also change the values -of its corresponding upvalues. - - - - - -

4.3 – Registry

- -

-Lua provides a registry, -a predefined table that can be used by any C code to -store whatever Lua values it needs to store. -The registry table is always accessible at pseudo-index -LUA_REGISTRYINDEX. -Any C library can store data into this table, -but it must take care to choose keys -that are different from those used -by other libraries, to avoid collisions. -Typically, you should use as key a string containing your library name, -or a light userdata with the address of a C object in your code, -or any Lua object created by your code. -As with variable names, -string keys starting with an underscore followed by -uppercase letters are reserved for Lua. - - -

-The integer keys in the registry are used -by the reference mechanism (see luaL_ref) -and by some predefined values. -Therefore, integer keys in the registry -must not be used for other purposes. - - -

-When you create a new Lua state, -its registry comes with some predefined values. -These predefined values are indexed with integer keys -defined as constants in lua.h. -The following constants are defined: - -

    -
  • LUA_RIDX_MAINTHREAD: At this index the registry has -the main thread of the state. -(The main thread is the one created together with the state.) -
  • - -
  • LUA_RIDX_GLOBALS: At this index the registry has -the global environment. -
  • -
- - - - -

4.4 – Error Handling in C

- - - -

-Internally, Lua uses the C longjmp facility to handle errors. -(Lua will use exceptions if you compile it as C++; -search for LUAI_THROW in the source code for details.) -When Lua faces any error, -such as a memory allocation error or a type error, -it raises an error; -that is, it does a long jump. -A protected environment uses setjmp -to set a recovery point; -any error jumps to the most recent active recovery point. - - -

-Inside a C function you can raise an error explicitly -by calling lua_error. - - -

-Most functions in the API can raise an error, -for instance due to a memory allocation error. -The documentation for each function indicates whether -it can raise errors. - - -

-If an error happens outside any protected environment, -Lua calls a panic function (see lua_atpanic) -and then calls abort, -thus exiting the host application. -Your panic function can avoid this exit by -never returning -(e.g., doing a long jump to your own recovery point outside Lua). - - -

-The panic function, -as its name implies, -is a mechanism of last resort. -Programs should avoid it. -As a general rule, -when a C function is called by Lua with a Lua state, -it can do whatever it wants on that Lua state, -as it should be already protected. -However, -when C code operates on other Lua states -(e.g., a Lua-state argument to the function, -a Lua state stored in the registry, or -the result of lua_newthread), -it should use them only in API calls that cannot raise errors. - - -

-The panic function runs as if it were a message handler (see §2.3); -in particular, the error object is on the top of the stack. -However, there is no guarantee about stack space. -To push anything on the stack, -the panic function must first check the available space (see §4.1.1). - - - - - -

4.4.1 – Status Codes

- -

-Several functions that report errors in the API use the following -status codes to indicate different kinds of errors or other conditions: - -

    - -
  • LUA_OK (0): no errors.
  • - -
  • LUA_ERRRUN: a runtime error.
  • - -
  • LUA_ERRMEM: -memory allocation error. -For such errors, Lua does not call the message handler. -
  • - -
  • LUA_ERRERR: error while running the message handler.
  • - -
  • LUA_ERRSYNTAX: syntax error during precompilation.
  • - -
  • LUA_YIELD: the thread (coroutine) yields.
  • - -
  • LUA_ERRFILE: a file-related error; -e.g., it cannot open or read the file.
  • - -

-These constants are defined in the header file lua.h. - - - - - - - -

4.5 – Handling Yields in C

- -

-Internally, Lua uses the C longjmp facility to yield a coroutine. -Therefore, if a C function foo calls an API function -and this API function yields -(directly or indirectly by calling another function that yields), -Lua cannot return to foo any more, -because the longjmp removes its frame from the C stack. - - -

-To avoid this kind of problem, -Lua raises an error whenever it tries to yield across an API call, -except for three functions: -lua_yieldk, lua_callk, and lua_pcallk. -All those functions receive a continuation function -(as a parameter named k) to continue execution after a yield. - - -

-We need to set some terminology to explain continuations. -We have a C function called from Lua which we will call -the original function. -This original function then calls one of those three functions in the C API, -which we will call the callee function, -that then yields the current thread. -This can happen when the callee function is lua_yieldk, -or when the callee function is either lua_callk or lua_pcallk -and the function called by them yields. - - -

-Suppose the running thread yields while executing the callee function. -After the thread resumes, -it eventually will finish running the callee function. -However, -the callee function cannot return to the original function, -because its frame in the C stack was destroyed by the yield. -Instead, Lua calls a continuation function, -which was given as an argument to the callee function. -As the name implies, -the continuation function should continue the task -of the original function. - - -

-As an illustration, consider the following function: - -

-     int original_function (lua_State *L) {
-       ...     /* code 1 */
-       status = lua_pcall(L, n, m, h);  /* calls Lua */
-       ...     /* code 2 */
-     }
-

-Now we want to allow -the Lua code being run by lua_pcall to yield. -First, we can rewrite our function like here: - -

-     int k (lua_State *L, int status, lua_KContext ctx) {
-       ...  /* code 2 */
-     }
-     
-     int original_function (lua_State *L) {
-       ...     /* code 1 */
-       return k(L, lua_pcall(L, n, m, h), ctx);
-     }
-

-In the above code, -the new function k is a -continuation function (with type lua_KFunction), -which should do all the work that the original function -was doing after calling lua_pcall. -Now, we must inform Lua that it must call k if the Lua code -being executed by lua_pcall gets interrupted in some way -(errors or yielding), -so we rewrite the code as here, -replacing lua_pcall by lua_pcallk: - -

-     int original_function (lua_State *L) {
-       ...     /* code 1 */
-       return k(L, lua_pcallk(L, n, m, h, ctx2, k), ctx1);
-     }
-

-Note the external, explicit call to the continuation: -Lua will call the continuation only if needed, that is, -in case of errors or resuming after a yield. -If the called function returns normally without ever yielding, -lua_pcallk (and lua_callk) will also return normally. -(Of course, instead of calling the continuation in that case, -you can do the equivalent work directly inside the original function.) - - -

-Besides the Lua state, -the continuation function has two other parameters: -the final status of the call and the context value (ctx) that -was passed originally to lua_pcallk. -Lua does not use this context value; -it only passes this value from the original function to the -continuation function. -For lua_pcallk, -the status is the same value that would be returned by lua_pcallk, -except that it is LUA_YIELD when being executed after a yield -(instead of LUA_OK). -For lua_yieldk and lua_callk, -the status is always LUA_YIELD when Lua calls the continuation. -(For these two functions, -Lua will not call the continuation in case of errors, -because they do not handle errors.) -Similarly, when using lua_callk, -you should call the continuation function -with LUA_OK as the status. -(For lua_yieldk, there is not much point in calling -directly the continuation function, -because lua_yieldk usually does not return.) - - -

-Lua treats the continuation function as if it were the original function. -The continuation function receives the same Lua stack -from the original function, -in the same state it would be if the callee function had returned. -(For instance, -after a lua_callk the function and its arguments are -removed from the stack and replaced by the results from the call.) -It also has the same upvalues. -Whatever it returns is handled by Lua as if it were the return -of the original function. - - - - - -

4.6 – Functions and Types

- -

-Here we list all functions and types from the C API in -alphabetical order. -Each function has an indicator like this: -[-o, +p, x] - - -

-The first field, o, -is how many elements the function pops from the stack. -The second field, p, -is how many elements the function pushes onto the stack. -(Any function always pushes its results after popping its arguments.) -A field in the form x|y means the function can push (or pop) -x or y elements, -depending on the situation; -an interrogation mark '?' means that -we cannot know how many elements the function pops/pushes -by looking only at its arguments. -(For instance, they may depend on what is in the stack.) -The third field, x, -tells whether the function may raise errors: -'-' means the function never raises any error; -'m' means the function may raise only out-of-memory errors; -'v' means the function may raise the errors explained in the text; -'e' means the function can run arbitrary Lua code, -either directly or through metamethods, -and therefore may raise any errors. - - - -


lua_absindex

-[-0, +0, –] -

int lua_absindex (lua_State *L, int idx);
- -

-Converts the acceptable index idx -into an equivalent absolute index -(that is, one that does not depend on the stack size). - - - - - -


lua_Alloc

-
typedef void * (*lua_Alloc) (void *ud,
-                             void *ptr,
-                             size_t osize,
-                             size_t nsize);
- -

-The type of the memory-allocation function used by Lua states. -The allocator function must provide a -functionality similar to realloc, -but not exactly the same. -Its arguments are -ud, an opaque pointer passed to lua_newstate; -ptr, a pointer to the block being allocated/reallocated/freed; -osize, the original size of the block or some code about what -is being allocated; -and nsize, the new size of the block. - - -

-When ptr is not NULL, -osize is the size of the block pointed by ptr, -that is, the size given when it was allocated or reallocated. - - -

-When ptr is NULL, -osize encodes the kind of object that Lua is allocating. -osize is any of -LUA_TSTRING, LUA_TTABLE, LUA_TFUNCTION, -LUA_TUSERDATA, or LUA_TTHREAD when (and only when) -Lua is creating a new object of that type. -When osize is some other value, -Lua is allocating memory for something else. - - -

-Lua assumes the following behavior from the allocator function: - - -

-When nsize is zero, -the allocator must behave like free -and then return NULL. - - -

-When nsize is not zero, -the allocator must behave like realloc. -In particular, the allocator returns NULL -if and only if it cannot fulfill the request. - - -

-Here is a simple implementation for the allocator function. -It is used in the auxiliary library by luaL_newstate. - -

-     static void *l_alloc (void *ud, void *ptr, size_t osize,
-                                                size_t nsize) {
-       (void)ud;  (void)osize;  /* not used */
-       if (nsize == 0) {
-         free(ptr);
-         return NULL;
-       }
-       else
-         return realloc(ptr, nsize);
-     }
-

-Note that ISO C ensures -that free(NULL) has no effect and that -realloc(NULL,size) is equivalent to malloc(size). - - - - - -


lua_arith

-[-(2|1), +1, e] -

void lua_arith (lua_State *L, int op);
- -

-Performs an arithmetic or bitwise operation over the two values -(or one, in the case of negations) -at the top of the stack, -with the value on the top being the second operand, -pops these values, and pushes the result of the operation. -The function follows the semantics of the corresponding Lua operator -(that is, it may call metamethods). - - -

-The value of op must be one of the following constants: - -

- - - - -

lua_atpanic

-[-0, +0, –] -

lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);
- -

-Sets a new panic function and returns the old one (see §4.4). - - - - - -


lua_call

-[-(nargs+1), +nresults, e] -

void lua_call (lua_State *L, int nargs, int nresults);
- -

-Calls a function. -Like regular Lua calls, -lua_call respects the __call metamethod. -So, here the word "function" -means any callable value. - - -

-To do a call you must use the following protocol: -first, the function to be called is pushed onto the stack; -then, the arguments to the call are pushed -in direct order; -that is, the first argument is pushed first. -Finally you call lua_call; -nargs is the number of arguments that you pushed onto the stack. -When the function returns, -all arguments and the function value are popped -and the call results are pushed onto the stack. -The number of results is adjusted to nresults, -unless nresults is LUA_MULTRET. -In this case, all results from the function are pushed; -Lua takes care that the returned values fit into the stack space, -but it does not ensure any extra space in the stack. -The function results are pushed onto the stack in direct order -(the first result is pushed first), -so that after the call the last result is on the top of the stack. - - -

-Any error while calling and running the function is propagated upwards -(with a longjmp). - - -

-The following example shows how the host program can do the -equivalent to this Lua code: - -

-     a = f("how", t.x, 14)
-

-Here it is in C: - -

-     lua_getglobal(L, "f");                  /* function to be called */
-     lua_pushliteral(L, "how");                       /* 1st argument */
-     lua_getglobal(L, "t");                    /* table to be indexed */
-     lua_getfield(L, -1, "x");        /* push result of t.x (2nd arg) */
-     lua_remove(L, -2);                  /* remove 't' from the stack */
-     lua_pushinteger(L, 14);                          /* 3rd argument */
-     lua_call(L, 3, 1);     /* call 'f' with 3 arguments and 1 result */
-     lua_setglobal(L, "a");                         /* set global 'a' */
-

-Note that the code above is balanced: -at its end, the stack is back to its original configuration. -This is considered good programming practice. - - - - - -


lua_callk

-[-(nargs + 1), +nresults, e] -

void lua_callk (lua_State *L,
-                int nargs,
-                int nresults,
-                lua_KContext ctx,
-                lua_KFunction k);
- -

-This function behaves exactly like lua_call, -but allows the called function to yield (see §4.5). - - - - - -


lua_CFunction

-
typedef int (*lua_CFunction) (lua_State *L);
- -

-Type for C functions. - - -

-In order to communicate properly with Lua, -a C function must use the following protocol, -which defines the way parameters and results are passed: -a C function receives its arguments from Lua in its stack -in direct order (the first argument is pushed first). -So, when the function starts, -lua_gettop(L) returns the number of arguments received by the function. -The first argument (if any) is at index 1 -and its last argument is at index lua_gettop(L). -To return values to Lua, a C function just pushes them onto the stack, -in direct order (the first result is pushed first), -and returns in C the number of results. -Any other value in the stack below the results will be properly -discarded by Lua. -Like a Lua function, a C function called by Lua can also return -many results. - - -

-As an example, the following function receives a variable number -of numeric arguments and returns their average and their sum: - -

-     static int foo (lua_State *L) {
-       int n = lua_gettop(L);    /* number of arguments */
-       lua_Number sum = 0.0;
-       int i;
-       for (i = 1; i <= n; i++) {
-         if (!lua_isnumber(L, i)) {
-           lua_pushliteral(L, "incorrect argument");
-           lua_error(L);
-         }
-         sum += lua_tonumber(L, i);
-       }
-       lua_pushnumber(L, sum/n);        /* first result */
-       lua_pushnumber(L, sum);         /* second result */
-       return 2;                   /* number of results */
-     }
-
- - - - -

lua_checkstack

-[-0, +0, –] -

int lua_checkstack (lua_State *L, int n);
- -

-Ensures that the stack has space for at least n extra elements, -that is, that you can safely push up to n values into it. -It returns false if it cannot fulfill the request, -either because it would cause the stack -to be greater than a fixed maximum size -(typically at least several thousand elements) or -because it cannot allocate memory for the extra space. -This function never shrinks the stack; -if the stack already has space for the extra elements, -it is left unchanged. - - - - - -


lua_close

-[-0, +0, –] -

void lua_close (lua_State *L);
- -

-Close all active to-be-closed variables in the main thread, -release all objects in the given Lua state -(calling the corresponding garbage-collection metamethods, if any), -and frees all dynamic memory used by this state. - - -

-On several platforms, you may not need to call this function, -because all resources are naturally released when the host program ends. -On the other hand, long-running programs that create multiple states, -such as daemons or web servers, -will probably need to close states as soon as they are not needed. - - - - - -


lua_closeslot

-[-0, +0, e] -

void lua_closeslot (lua_State *L, int index);
- -

-Close the to-be-closed slot at the given index and set its value to nil. -The index must be the last index previously marked to be closed -(see lua_toclose) that is still active (that is, not closed yet). - - -

-A __close metamethod cannot yield -when called through this function. - - -

-(This function was introduced in release 5.4.3.) - - - - - -


lua_closethread

-[-0, +?, –] -

int lua_closethread (lua_State *L, lua_State *from);
- -

-Resets a thread, cleaning its call stack and closing all pending -to-be-closed variables. -Returns a status code: -LUA_OK for no errors in the thread -(either the original error that stopped the thread or -errors in closing methods), -or an error status otherwise. -In case of error, -leaves the error object on the top of the stack. - - -

-The parameter from represents the coroutine that is resetting L. -If there is no such coroutine, -this parameter can be NULL. - - -

-(This function was introduced in release 5.4.6.) - - - - - -


lua_compare

-[-0, +0, e] -

int lua_compare (lua_State *L, int index1, int index2, int op);
- -

-Compares two Lua values. -Returns 1 if the value at index index1 satisfies op -when compared with the value at index index2, -following the semantics of the corresponding Lua operator -(that is, it may call metamethods). -Otherwise returns 0. -Also returns 0 if any of the indices is not valid. - - -

-The value of op must be one of the following constants: - -

    - -
  • LUA_OPEQ: compares for equality (==)
  • -
  • LUA_OPLT: compares for less than (<)
  • -
  • LUA_OPLE: compares for less or equal (<=)
  • - -
- - - - -

lua_concat

-[-n, +1, e] -

void lua_concat (lua_State *L, int n);
- -

-Concatenates the n values at the top of the stack, -pops them, and leaves the result on the top. -If n is 1, the result is the single value on the stack -(that is, the function does nothing); -if n is 0, the result is the empty string. -Concatenation is performed following the usual semantics of Lua -(see §3.4.6). - - - - - -


lua_copy

-[-0, +0, –] -

void lua_copy (lua_State *L, int fromidx, int toidx);
- -

-Copies the element at index fromidx -into the valid index toidx, -replacing the value at that position. -Values at other positions are not affected. - - - - - -


lua_createtable

-[-0, +1, m] -

void lua_createtable (lua_State *L, int narr, int nrec);
- -

-Creates a new empty table and pushes it onto the stack. -Parameter narr is a hint for how many elements the table -will have as a sequence; -parameter nrec is a hint for how many other elements -the table will have. -Lua may use these hints to preallocate memory for the new table. -This preallocation may help performance when you know in advance -how many elements the table will have. -Otherwise you can use the function lua_newtable. - - - - - -


lua_dump

-[-0, +0, –] -

int lua_dump (lua_State *L,
-                        lua_Writer writer,
-                        void *data,
-                        int strip);
- -

-Dumps a function as a binary chunk. -Receives a Lua function on the top of the stack -and produces a binary chunk that, -if loaded again, -results in a function equivalent to the one dumped. -As it produces parts of the chunk, -lua_dump calls function writer (see lua_Writer) -with the given data -to write them. - - -

-If strip is true, -the binary representation may not include all debug information -about the function, -to save space. - - -

-The value returned is the error code returned by the last -call to the writer; -0 means no errors. - - -

-This function does not pop the Lua function from the stack. - - - - - -


lua_error

-[-1, +0, v] -

int lua_error (lua_State *L);
- -

-Raises a Lua error, -using the value on the top of the stack as the error object. -This function does a long jump, -and therefore never returns -(see luaL_error). - - - - - -


lua_gc

-[-0, +0, –] -

int lua_gc (lua_State *L, int what, ...);
- -

-Controls the garbage collector. - - -

-This function performs several tasks, -according to the value of the parameter what. -For options that need extra arguments, -they are listed after the option. - -

    - -
  • LUA_GCCOLLECT: -Performs a full garbage-collection cycle. -
  • - -
  • LUA_GCSTOP: -Stops the garbage collector. -
  • - -
  • LUA_GCRESTART: -Restarts the garbage collector. -
  • - -
  • LUA_GCCOUNT: -Returns the current amount of memory (in Kbytes) in use by Lua. -
  • - -
  • LUA_GCCOUNTB: -Returns the remainder of dividing the current amount of bytes of -memory in use by Lua by 1024. -
  • - -
  • LUA_GCSTEP (int stepsize): -Performs an incremental step of garbage collection, -corresponding to the allocation of stepsize Kbytes. -
  • - -
  • LUA_GCISRUNNING: -Returns a boolean that tells whether the collector is running -(i.e., not stopped). -
  • - -
  • LUA_GCINC (int pause, int stepmul, stepsize): -Changes the collector to incremental mode -with the given parameters (see §2.5.1). -Returns the previous mode (LUA_GCGEN or LUA_GCINC). -
  • - -
  • LUA_GCGEN (int minormul, int majormul): -Changes the collector to generational mode -with the given parameters (see §2.5.2). -Returns the previous mode (LUA_GCGEN or LUA_GCINC). -
  • - -

-For more details about these options, -see collectgarbage. - - -

-This function should not be called by a finalizer. - - - - - -


lua_getallocf

-[-0, +0, –] -

lua_Alloc lua_getallocf (lua_State *L, void **ud);
- -

-Returns the memory-allocation function of a given state. -If ud is not NULL, Lua stores in *ud the -opaque pointer given when the memory-allocator function was set. - - - - - -


lua_getfield

-[-0, +1, e] -

int lua_getfield (lua_State *L, int index, const char *k);
- -

-Pushes onto the stack the value t[k], -where t is the value at the given index. -As in Lua, this function may trigger a metamethod -for the "index" event (see §2.4). - - -

-Returns the type of the pushed value. - - - - - -


lua_getextraspace

-[-0, +0, –] -

void *lua_getextraspace (lua_State *L);
- -

-Returns a pointer to a raw memory area associated with the -given Lua state. -The application can use this area for any purpose; -Lua does not use it for anything. - - -

-Each new thread has this area initialized with a copy -of the area of the main thread. - - -

-By default, this area has the size of a pointer to void, -but you can recompile Lua with a different size for this area. -(See LUA_EXTRASPACE in luaconf.h.) - - - - - -


lua_getglobal

-[-0, +1, e] -

int lua_getglobal (lua_State *L, const char *name);
- -

-Pushes onto the stack the value of the global name. -Returns the type of that value. - - - - - -


lua_geti

-[-0, +1, e] -

int lua_geti (lua_State *L, int index, lua_Integer i);
- -

-Pushes onto the stack the value t[i], -where t is the value at the given index. -As in Lua, this function may trigger a metamethod -for the "index" event (see §2.4). - - -

-Returns the type of the pushed value. - - - - - -


lua_getmetatable

-[-0, +(0|1), –] -

int lua_getmetatable (lua_State *L, int index);
- -

-If the value at the given index has a metatable, -the function pushes that metatable onto the stack and returns 1. -Otherwise, -the function returns 0 and pushes nothing on the stack. - - - - - -


lua_gettable

-[-1, +1, e] -

int lua_gettable (lua_State *L, int index);
- -

-Pushes onto the stack the value t[k], -where t is the value at the given index -and k is the value on the top of the stack. - - -

-This function pops the key from the stack, -pushing the resulting value in its place. -As in Lua, this function may trigger a metamethod -for the "index" event (see §2.4). - - -

-Returns the type of the pushed value. - - - - - -


lua_gettop

-[-0, +0, –] -

int lua_gettop (lua_State *L);
- -

-Returns the index of the top element in the stack. -Because indices start at 1, -this result is equal to the number of elements in the stack; -in particular, 0 means an empty stack. - - - - - -


lua_getiuservalue

-[-0, +1, –] -

int lua_getiuservalue (lua_State *L, int index, int n);
- -

-Pushes onto the stack the n-th user value associated with the -full userdata at the given index and -returns the type of the pushed value. - - -

-If the userdata does not have that value, -pushes nil and returns LUA_TNONE. - - - - - -


lua_insert

-[-1, +1, –] -

void lua_insert (lua_State *L, int index);
- -

-Moves the top element into the given valid index, -shifting up the elements above this index to open space. -This function cannot be called with a pseudo-index, -because a pseudo-index is not an actual stack position. - - - - - -


lua_Integer

-
typedef ... lua_Integer;
- -

-The type of integers in Lua. - - -

-By default this type is long long, -(usually a 64-bit two-complement integer), -but that can be changed to long or int -(usually a 32-bit two-complement integer). -(See LUA_INT_TYPE in luaconf.h.) - - -

-Lua also defines the constants -LUA_MININTEGER and LUA_MAXINTEGER, -with the minimum and the maximum values that fit in this type. - - - - - -


lua_isboolean

-[-0, +0, –] -

int lua_isboolean (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a boolean, -and 0 otherwise. - - - - - -


lua_iscfunction

-[-0, +0, –] -

int lua_iscfunction (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a C function, -and 0 otherwise. - - - - - -


lua_isfunction

-[-0, +0, –] -

int lua_isfunction (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a function -(either C or Lua), and 0 otherwise. - - - - - -


lua_isinteger

-[-0, +0, –] -

int lua_isinteger (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is an integer -(that is, the value is a number and is represented as an integer), -and 0 otherwise. - - - - - -


lua_islightuserdata

-[-0, +0, –] -

int lua_islightuserdata (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a light userdata, -and 0 otherwise. - - - - - -


lua_isnil

-[-0, +0, –] -

int lua_isnil (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is nil, -and 0 otherwise. - - - - - -


lua_isnone

-[-0, +0, –] -

int lua_isnone (lua_State *L, int index);
- -

-Returns 1 if the given index is not valid, -and 0 otherwise. - - - - - -


lua_isnoneornil

-[-0, +0, –] -

int lua_isnoneornil (lua_State *L, int index);
- -

-Returns 1 if the given index is not valid -or if the value at this index is nil, -and 0 otherwise. - - - - - -


lua_isnumber

-[-0, +0, –] -

int lua_isnumber (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a number -or a string convertible to a number, -and 0 otherwise. - - - - - -


lua_isstring

-[-0, +0, –] -

int lua_isstring (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a string -or a number (which is always convertible to a string), -and 0 otherwise. - - - - - -


lua_istable

-[-0, +0, –] -

int lua_istable (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a table, -and 0 otherwise. - - - - - -


lua_isthread

-[-0, +0, –] -

int lua_isthread (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a thread, -and 0 otherwise. - - - - - -


lua_isuserdata

-[-0, +0, –] -

int lua_isuserdata (lua_State *L, int index);
- -

-Returns 1 if the value at the given index is a userdata -(either full or light), and 0 otherwise. - - - - - -


lua_isyieldable

-[-0, +0, –] -

int lua_isyieldable (lua_State *L);
- -

-Returns 1 if the given coroutine can yield, -and 0 otherwise. - - - - - -


lua_KContext

-
typedef ... lua_KContext;
- -

-The type for continuation-function contexts. -It must be a numeric type. -This type is defined as intptr_t -when intptr_t is available, -so that it can store pointers too. -Otherwise, it is defined as ptrdiff_t. - - - - - -


lua_KFunction

-
typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx);
- -

-Type for continuation functions (see §4.5). - - - - - -


lua_len

-[-0, +1, e] -

void lua_len (lua_State *L, int index);
- -

-Returns the length of the value at the given index. -It is equivalent to the '#' operator in Lua (see §3.4.7) and -may trigger a metamethod for the "length" event (see §2.4). -The result is pushed on the stack. - - - - - -


lua_load

-[-0, +1, –] -

int lua_load (lua_State *L,
-              lua_Reader reader,
-              void *data,
-              const char *chunkname,
-              const char *mode);
- -

-Loads a Lua chunk without running it. -If there are no errors, -lua_load pushes the compiled chunk as a Lua -function on top of the stack. -Otherwise, it pushes an error message. - - -

-The lua_load function uses a user-supplied reader function -to read the chunk (see lua_Reader). -The data argument is an opaque value passed to the reader function. - - -

-The chunkname argument gives a name to the chunk, -which is used for error messages and in debug information (see §4.7). - - -

-lua_load automatically detects whether the chunk is text or binary -and loads it accordingly (see program luac). -The string mode works as in function load, -with the addition that -a NULL value is equivalent to the string "bt". - - -

-lua_load uses the stack internally, -so the reader function must always leave the stack -unmodified when returning. - - -

-lua_load can return -LUA_OK, LUA_ERRSYNTAX, or LUA_ERRMEM. -The function may also return other values corresponding to -errors raised by the read function (see §4.4.1). - - -

-If the resulting function has upvalues, -its first upvalue is set to the value of the global environment -stored at index LUA_RIDX_GLOBALS in the registry (see §4.3). -When loading main chunks, -this upvalue will be the _ENV variable (see §2.2). -Other upvalues are initialized with nil. - - - - - -


lua_newstate

-[-0, +0, –] -

lua_State *lua_newstate (lua_Alloc f, void *ud);
- -

-Creates a new independent state and returns its main thread. -Returns NULL if it cannot create the state -(due to lack of memory). -The argument f is the allocator function; -Lua will do all memory allocation for this state -through this function (see lua_Alloc). -The second argument, ud, is an opaque pointer that Lua -passes to the allocator in every call. - - - - - -


lua_newtable

-[-0, +1, m] -

void lua_newtable (lua_State *L);
- -

-Creates a new empty table and pushes it onto the stack. -It is equivalent to lua_createtable(L, 0, 0). - - - - - -


lua_newthread

-[-0, +1, m] -

lua_State *lua_newthread (lua_State *L);
- -

-Creates a new thread, pushes it on the stack, -and returns a pointer to a lua_State that represents this new thread. -The new thread returned by this function shares with the original thread -its global environment, -but has an independent execution stack. - - -

-Threads are subject to garbage collection, -like any Lua object. - - - - - -


lua_newuserdatauv

-[-0, +1, m] -

void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue);
- -

-This function creates and pushes on the stack a new full userdata, -with nuvalue associated Lua values, called user values, -plus an associated block of raw memory with size bytes. -(The user values can be set and read with the functions -lua_setiuservalue and lua_getiuservalue.) - - -

-The function returns the address of the block of memory. -Lua ensures that this address is valid as long as -the corresponding userdata is alive (see §2.5). -Moreover, if the userdata is marked for finalization (see §2.5.3), -its address is valid at least until the call to its finalizer. - - - - - -


lua_next

-[-1, +(2|0), v] -

int lua_next (lua_State *L, int index);
- -

-Pops a key from the stack, -and pushes a key–value pair from the table at the given index, -the "next" pair after the given key. -If there are no more elements in the table, -then lua_next returns 0 and pushes nothing. - - -

-A typical table traversal looks like this: - -

-     /* table is in the stack at index 't' */
-     lua_pushnil(L);  /* first key */
-     while (lua_next(L, t) != 0) {
-       /* uses 'key' (at index -2) and 'value' (at index -1) */
-       printf("%s - %s\n",
-              lua_typename(L, lua_type(L, -2)),
-              lua_typename(L, lua_type(L, -1)));
-       /* removes 'value'; keeps 'key' for next iteration */
-       lua_pop(L, 1);
-     }
-
- -

-While traversing a table, -avoid calling lua_tolstring directly on a key, -unless you know that the key is actually a string. -Recall that lua_tolstring may change -the value at the given index; -this confuses the next call to lua_next. - - -

-This function may raise an error if the given key -is neither nil nor present in the table. -See function next for the caveats of modifying -the table during its traversal. - - - - - -


lua_Number

-
typedef ... lua_Number;
- -

-The type of floats in Lua. - - -

-By default this type is double, -but that can be changed to a single float or a long double. -(See LUA_FLOAT_TYPE in luaconf.h.) - - - - - -


lua_numbertointeger

-
int lua_numbertointeger (lua_Number n, lua_Integer *p);
- -

-Tries to convert a Lua float to a Lua integer; -the float n must have an integral value. -If that value is within the range of Lua integers, -it is converted to an integer and assigned to *p. -The macro results in a boolean indicating whether the -conversion was successful. -(Note that this range test can be tricky to do -correctly without this macro, due to rounding.) - - -

-This macro may evaluate its arguments more than once. - - - - - -


lua_pcall

-[-(nargs + 1), +(nresults|1), –] -

int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);
- -

-Calls a function (or a callable object) in protected mode. - - -

-Both nargs and nresults have the same meaning as -in lua_call. -If there are no errors during the call, -lua_pcall behaves exactly like lua_call. -However, if there is any error, -lua_pcall catches it, -pushes a single value on the stack (the error object), -and returns an error code. -Like lua_call, -lua_pcall always removes the function -and its arguments from the stack. - - -

-If msgh is 0, -then the error object returned on the stack -is exactly the original error object. -Otherwise, msgh is the stack index of a -message handler. -(This index cannot be a pseudo-index.) -In case of runtime errors, -this handler will be called with the error object -and its return value will be the object -returned on the stack by lua_pcall. - - -

-Typically, the message handler is used to add more debug -information to the error object, such as a stack traceback. -Such information cannot be gathered after the return of lua_pcall, -since by then the stack has unwound. - - -

-The lua_pcall function returns one of the following status codes: -LUA_OK, LUA_ERRRUN, LUA_ERRMEM, or LUA_ERRERR. - - - - - -


lua_pcallk

-[-(nargs + 1), +(nresults|1), –] -

int lua_pcallk (lua_State *L,
-                int nargs,
-                int nresults,
-                int msgh,
-                lua_KContext ctx,
-                lua_KFunction k);
- -

-This function behaves exactly like lua_pcall, -except that it allows the called function to yield (see §4.5). - - - - - -


lua_pop

-[-n, +0, e] -

void lua_pop (lua_State *L, int n);
- -

-Pops n elements from the stack. -It is implemented as a macro over lua_settop. - - - - - -


lua_pushboolean

-[-0, +1, –] -

void lua_pushboolean (lua_State *L, int b);
- -

-Pushes a boolean value with value b onto the stack. - - - - - -


lua_pushcclosure

-[-n, +1, m] -

void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
- -

-Pushes a new C closure onto the stack. -This function receives a pointer to a C function -and pushes onto the stack a Lua value of type function that, -when called, invokes the corresponding C function. -The parameter n tells how many upvalues this function will have -(see §4.2). - - -

-Any function to be callable by Lua must -follow the correct protocol to receive its parameters -and return its results (see lua_CFunction). - - -

-When a C function is created, -it is possible to associate some values with it, -the so called upvalues; -these upvalues are then accessible to the function whenever it is called. -This association is called a C closure (see §4.2). -To create a C closure, -first the initial values for its upvalues must be pushed onto the stack. -(When there are multiple upvalues, the first value is pushed first.) -Then lua_pushcclosure -is called to create and push the C function onto the stack, -with the argument n telling how many values will be -associated with the function. -lua_pushcclosure also pops these values from the stack. - - -

-The maximum value for n is 255. - - -

-When n is zero, -this function creates a light C function, -which is just a pointer to the C function. -In that case, it never raises a memory error. - - - - - -


lua_pushcfunction

-[-0, +1, –] -

void lua_pushcfunction (lua_State *L, lua_CFunction f);
- -

-Pushes a C function onto the stack. -This function is equivalent to lua_pushcclosure with no upvalues. - - - - - -


lua_pushfstring

-[-0, +1, v] -

const char *lua_pushfstring (lua_State *L, const char *fmt, ...);
- -

-Pushes onto the stack a formatted string -and returns a pointer to this string (see §4.1.3). -It is similar to the ISO C function sprintf, -but has two important differences. -First, -you do not have to allocate space for the result; -the result is a Lua string and Lua takes care of memory allocation -(and deallocation, through garbage collection). -Second, -the conversion specifiers are quite restricted. -There are no flags, widths, or precisions. -The conversion specifiers can only be -'%%' (inserts the character '%'), -'%s' (inserts a zero-terminated string, with no size restrictions), -'%f' (inserts a lua_Number), -'%I' (inserts a lua_Integer), -'%p' (inserts a pointer), -'%d' (inserts an int), -'%c' (inserts an int as a one-byte character), and -'%U' (inserts a long int as a UTF-8 byte sequence). - - -

-This function may raise errors due to memory overflow -or an invalid conversion specifier. - - - - - -


lua_pushglobaltable

-[-0, +1, –] -

void lua_pushglobaltable (lua_State *L);
- -

-Pushes the global environment onto the stack. - - - - - -


lua_pushinteger

-[-0, +1, –] -

void lua_pushinteger (lua_State *L, lua_Integer n);
- -

-Pushes an integer with value n onto the stack. - - - - - -


lua_pushlightuserdata

-[-0, +1, –] -

void lua_pushlightuserdata (lua_State *L, void *p);
- -

-Pushes a light userdata onto the stack. - - -

-Userdata represent C values in Lua. -A light userdata represents a pointer, a void*. -It is a value (like a number): -you do not create it, it has no individual metatable, -and it is not collected (as it was never created). -A light userdata is equal to "any" -light userdata with the same C address. - - - - - -


lua_pushliteral

-[-0, +1, m] -

const char *lua_pushliteral (lua_State *L, const char *s);
- -

-This macro is equivalent to lua_pushstring, -but should be used only when s is a literal string. -(Lua may optimize this case.) - - - - - -


lua_pushlstring

-[-0, +1, m] -

const char *lua_pushlstring (lua_State *L, const char *s, size_t len);
- -

-Pushes the string pointed to by s with size len -onto the stack. -Lua will make or reuse an internal copy of the given string, -so the memory at s can be freed or reused immediately after -the function returns. -The string can contain any binary data, -including embedded zeros. - - -

-Returns a pointer to the internal copy of the string (see §4.1.3). - - - - - -


lua_pushnil

-[-0, +1, –] -

void lua_pushnil (lua_State *L);
- -

-Pushes a nil value onto the stack. - - - - - -


lua_pushnumber

-[-0, +1, –] -

void lua_pushnumber (lua_State *L, lua_Number n);
- -

-Pushes a float with value n onto the stack. - - - - - -


lua_pushstring

-[-0, +1, m] -

const char *lua_pushstring (lua_State *L, const char *s);
- -

-Pushes the zero-terminated string pointed to by s -onto the stack. -Lua will make or reuse an internal copy of the given string, -so the memory at s can be freed or reused immediately after -the function returns. - - -

-Returns a pointer to the internal copy of the string (see §4.1.3). - - -

-If s is NULL, pushes nil and returns NULL. - - - - - -


lua_pushthread

-[-0, +1, –] -

int lua_pushthread (lua_State *L);
- -

-Pushes the thread represented by L onto the stack. -Returns 1 if this thread is the main thread of its state. - - - - - -


lua_pushvalue

-[-0, +1, –] -

void lua_pushvalue (lua_State *L, int index);
- -

-Pushes a copy of the element at the given index -onto the stack. - - - - - -


lua_pushvfstring

-[-0, +1, v] -

const char *lua_pushvfstring (lua_State *L,
-                              const char *fmt,
-                              va_list argp);
- -

-Equivalent to lua_pushfstring, except that it receives a va_list -instead of a variable number of arguments. - - - - - -


lua_rawequal

-[-0, +0, –] -

int lua_rawequal (lua_State *L, int index1, int index2);
- -

-Returns 1 if the two values in indices index1 and -index2 are primitively equal -(that is, equal without calling the __eq metamethod). -Otherwise returns 0. -Also returns 0 if any of the indices are not valid. - - - - - -


lua_rawget

-[-1, +1, –] -

int lua_rawget (lua_State *L, int index);
- -

-Similar to lua_gettable, but does a raw access -(i.e., without metamethods). -The value at index must be a table. - - - - - -


lua_rawgeti

-[-0, +1, –] -

int lua_rawgeti (lua_State *L, int index, lua_Integer n);
- -

-Pushes onto the stack the value t[n], -where t is the table at the given index. -The access is raw, -that is, it does not use the __index metavalue. - - -

-Returns the type of the pushed value. - - - - - -


lua_rawgetp

-[-0, +1, –] -

int lua_rawgetp (lua_State *L, int index, const void *p);
- -

-Pushes onto the stack the value t[k], -where t is the table at the given index and -k is the pointer p represented as a light userdata. -The access is raw; -that is, it does not use the __index metavalue. - - -

-Returns the type of the pushed value. - - - - - -


lua_rawlen

-[-0, +0, –] -

lua_Unsigned lua_rawlen (lua_State *L, int index);
- -

-Returns the raw "length" of the value at the given index: -for strings, this is the string length; -for tables, this is the result of the length operator ('#') -with no metamethods; -for userdata, this is the size of the block of memory allocated -for the userdata. -For other values, this call returns 0. - - - - - -


lua_rawset

-[-2, +0, m] -

void lua_rawset (lua_State *L, int index);
- -

-Similar to lua_settable, but does a raw assignment -(i.e., without metamethods). -The value at index must be a table. - - - - - -


lua_rawseti

-[-1, +0, m] -

void lua_rawseti (lua_State *L, int index, lua_Integer i);
- -

-Does the equivalent of t[i] = v, -where t is the table at the given index -and v is the value on the top of the stack. - - -

-This function pops the value from the stack. -The assignment is raw, -that is, it does not use the __newindex metavalue. - - - - - -


lua_rawsetp

-[-1, +0, m] -

void lua_rawsetp (lua_State *L, int index, const void *p);
- -

-Does the equivalent of t[p] = v, -where t is the table at the given index, -p is encoded as a light userdata, -and v is the value on the top of the stack. - - -

-This function pops the value from the stack. -The assignment is raw, -that is, it does not use the __newindex metavalue. - - - - - -


lua_Reader

-
typedef const char * (*lua_Reader) (lua_State *L,
-                                    void *data,
-                                    size_t *size);
- -

-The reader function used by lua_load. -Every time lua_load needs another piece of the chunk, -it calls the reader, -passing along its data parameter. -The reader must return a pointer to a block of memory -with a new piece of the chunk -and set size to the block size. -The block must exist until the reader function is called again. -To signal the end of the chunk, -the reader must return NULL or set size to zero. -The reader function may return pieces of any size greater than zero. - - - - - -


lua_register

-[-0, +0, e] -

void lua_register (lua_State *L, const char *name, lua_CFunction f);
- -

-Sets the C function f as the new value of global name. -It is defined as a macro: - -

-     #define lua_register(L,n,f) \
-            (lua_pushcfunction(L, f), lua_setglobal(L, n))
-
- - - - -

lua_remove

-[-1, +0, –] -

void lua_remove (lua_State *L, int index);
- -

-Removes the element at the given valid index, -shifting down the elements above this index to fill the gap. -This function cannot be called with a pseudo-index, -because a pseudo-index is not an actual stack position. - - - - - -


lua_replace

-[-1, +0, –] -

void lua_replace (lua_State *L, int index);
- -

-Moves the top element into the given valid index -without shifting any element -(therefore replacing the value at that given index), -and then pops the top element. - - - - - -


lua_resetthread

-[-0, +?, –] -

int lua_resetthread (lua_State *L);
- -

-This function is deprecated; -it is equivalent to lua_closethread with -from being NULL. - - - - - -


lua_resume

-[-?, +?, –] -

int lua_resume (lua_State *L, lua_State *from, int nargs,
-                          int *nresults);
- -

-Starts and resumes a coroutine in the given thread L. - - -

-To start a coroutine, -you push the main function plus any arguments -onto the empty stack of the thread. -then you call lua_resume, -with nargs being the number of arguments. -This call returns when the coroutine suspends or finishes its execution. -When it returns, -*nresults is updated and -the top of the stack contains -the *nresults values passed to lua_yield -or returned by the body function. -lua_resume returns -LUA_YIELD if the coroutine yields, -LUA_OK if the coroutine finishes its execution -without errors, -or an error code in case of errors (see §4.4.1). -In case of errors, -the error object is on the top of the stack. - - -

-To resume a coroutine, -you remove the *nresults yielded values from its stack, -push the values to be passed as results from yield, -and then call lua_resume. - - -

-The parameter from represents the coroutine that is resuming L. -If there is no such coroutine, -this parameter can be NULL. - - - - - -


lua_rotate

-[-0, +0, –] -

void lua_rotate (lua_State *L, int idx, int n);
- -

-Rotates the stack elements between the valid index idx -and the top of the stack. -The elements are rotated n positions in the direction of the top, -for a positive n, -or -n positions in the direction of the bottom, -for a negative n. -The absolute value of n must not be greater than the size -of the slice being rotated. -This function cannot be called with a pseudo-index, -because a pseudo-index is not an actual stack position. - - - - - -


lua_setallocf

-[-0, +0, –] -

void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
- -

-Changes the allocator function of a given state to f -with user data ud. - - - - - -


lua_setfield

-[-1, +0, e] -

void lua_setfield (lua_State *L, int index, const char *k);
- -

-Does the equivalent to t[k] = v, -where t is the value at the given index -and v is the value on the top of the stack. - - -

-This function pops the value from the stack. -As in Lua, this function may trigger a metamethod -for the "newindex" event (see §2.4). - - - - - -


lua_setglobal

-[-1, +0, e] -

void lua_setglobal (lua_State *L, const char *name);
- -

-Pops a value from the stack and -sets it as the new value of global name. - - - - - -


lua_seti

-[-1, +0, e] -

void lua_seti (lua_State *L, int index, lua_Integer n);
- -

-Does the equivalent to t[n] = v, -where t is the value at the given index -and v is the value on the top of the stack. - - -

-This function pops the value from the stack. -As in Lua, this function may trigger a metamethod -for the "newindex" event (see §2.4). - - - - - -


lua_setiuservalue

-[-1, +0, –] -

int lua_setiuservalue (lua_State *L, int index, int n);
- -

-Pops a value from the stack and sets it as -the new n-th user value associated to the -full userdata at the given index. -Returns 0 if the userdata does not have that value. - - - - - -


lua_setmetatable

-[-1, +0, –] -

int lua_setmetatable (lua_State *L, int index);
- -

-Pops a table or nil from the stack and -sets that value as the new metatable for the value at the given index. -(nil means no metatable.) - - -

-(For historical reasons, this function returns an int, -which now is always 1.) - - - - - -


lua_settable

-[-2, +0, e] -

void lua_settable (lua_State *L, int index);
- -

-Does the equivalent to t[k] = v, -where t is the value at the given index, -v is the value on the top of the stack, -and k is the value just below the top. - - -

-This function pops both the key and the value from the stack. -As in Lua, this function may trigger a metamethod -for the "newindex" event (see §2.4). - - - - - -


lua_settop

-[-?, +?, e] -

void lua_settop (lua_State *L, int index);
- -

-Accepts any index, or 0, -and sets the stack top to this index. -If the new top is greater than the old one, -then the new elements are filled with nil. -If index is 0, then all stack elements are removed. - - -

-This function can run arbitrary code when removing an index -marked as to-be-closed from the stack. - - - - - -


lua_setwarnf

-[-0, +0, –] -

void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud);
- -

-Sets the warning function to be used by Lua to emit warnings -(see lua_WarnFunction). -The ud parameter sets the value ud passed to -the warning function. - - - - - -


lua_State

-
typedef struct lua_State lua_State;
- -

-An opaque structure that points to a thread and indirectly -(through the thread) to the whole state of a Lua interpreter. -The Lua library is fully reentrant: -it has no global variables. -All information about a state is accessible through this structure. - - -

-A pointer to this structure must be passed as the first argument to -every function in the library, except to lua_newstate, -which creates a Lua state from scratch. - - - - - -


lua_status

-[-0, +0, –] -

int lua_status (lua_State *L);
- -

-Returns the status of the thread L. - - -

-The status can be LUA_OK for a normal thread, -an error code if the thread finished the execution -of a lua_resume with an error, -or LUA_YIELD if the thread is suspended. - - -

-You can call functions only in threads with status LUA_OK. -You can resume threads with status LUA_OK -(to start a new coroutine) or LUA_YIELD -(to resume a coroutine). - - - - - -


lua_stringtonumber

-[-0, +1, –] -

size_t lua_stringtonumber (lua_State *L, const char *s);
- -

-Converts the zero-terminated string s to a number, -pushes that number into the stack, -and returns the total size of the string, -that is, its length plus one. -The conversion can result in an integer or a float, -according to the lexical conventions of Lua (see §3.1). -The string may have leading and trailing whitespaces and a sign. -If the string is not a valid numeral, -returns 0 and pushes nothing. -(Note that the result can be used as a boolean, -true if the conversion succeeds.) - - - - - -


lua_toboolean

-[-0, +0, –] -

int lua_toboolean (lua_State *L, int index);
- -

-Converts the Lua value at the given index to a C boolean -value (0 or 1). -Like all tests in Lua, -lua_toboolean returns true for any Lua value -different from false and nil; -otherwise it returns false. -(If you want to accept only actual boolean values, -use lua_isboolean to test the value's type.) - - - - - -


lua_tocfunction

-[-0, +0, –] -

lua_CFunction lua_tocfunction (lua_State *L, int index);
- -

-Converts a value at the given index to a C function. -That value must be a C function; -otherwise, returns NULL. - - - - - -


lua_toclose

-[-0, +0, v] -

void lua_toclose (lua_State *L, int index);
- -

-Marks the given index in the stack as a -to-be-closed slot (see §3.3.8). -Like a to-be-closed variable in Lua, -the value at that slot in the stack will be closed -when it goes out of scope. -Here, in the context of a C function, -to go out of scope means that the running function returns to Lua, -or there is an error, -or the slot is removed from the stack through -lua_settop or lua_pop, -or there is a call to lua_closeslot. -A slot marked as to-be-closed should not be removed from the stack -by any other function in the API except lua_settop or lua_pop, -unless previously deactivated by lua_closeslot. - - -

-This function raises an error if the value at the given slot -neither has a __close metamethod nor is a false value. - - -

-This function should not be called for an index -that is equal to or below an active to-be-closed slot. - - -

-Note that, both in case of errors and of a regular return, -by the time the __close metamethod runs, -the C stack was already unwound, -so that any automatic C variable declared in the calling function -(e.g., a buffer) will be out of scope. - - - - - -


lua_tointeger

-[-0, +0, –] -

lua_Integer lua_tointeger (lua_State *L, int index);
- -

-Equivalent to lua_tointegerx with isnum equal to NULL. - - - - - -


lua_tointegerx

-[-0, +0, –] -

lua_Integer lua_tointegerx (lua_State *L, int index, int *isnum);
- -

-Converts the Lua value at the given index -to the signed integral type lua_Integer. -The Lua value must be an integer, -or a number or string convertible to an integer (see §3.4.3); -otherwise, lua_tointegerx returns 0. - - -

-If isnum is not NULL, -its referent is assigned a boolean value that -indicates whether the operation succeeded. - - - - - -


lua_tolstring

-[-0, +0, m] -

const char *lua_tolstring (lua_State *L, int index, size_t *len);
- -

-Converts the Lua value at the given index to a C string. -If len is not NULL, -it sets *len with the string length. -The Lua value must be a string or a number; -otherwise, the function returns NULL. -If the value is a number, -then lua_tolstring also -changes the actual value in the stack to a string. -(This change confuses lua_next -when lua_tolstring is applied to keys during a table traversal.) - - -

-lua_tolstring returns a pointer -to a string inside the Lua state (see §4.1.3). -This string always has a zero ('\0') -after its last character (as in C), -but can contain other zeros in its body. - - -

-This function can raise memory errors only -when converting a number to a string -(as then it may create a new string). - - - - - -


lua_tonumber

-[-0, +0, –] -

lua_Number lua_tonumber (lua_State *L, int index);
- -

-Equivalent to lua_tonumberx with isnum equal to NULL. - - - - - -


lua_tonumberx

-[-0, +0, –] -

lua_Number lua_tonumberx (lua_State *L, int index, int *isnum);
- -

-Converts the Lua value at the given index -to the C type lua_Number (see lua_Number). -The Lua value must be a number or a string convertible to a number -(see §3.4.3); -otherwise, lua_tonumberx returns 0. - - -

-If isnum is not NULL, -its referent is assigned a boolean value that -indicates whether the operation succeeded. - - - - - -


lua_topointer

-[-0, +0, –] -

const void *lua_topointer (lua_State *L, int index);
- -

-Converts the value at the given index to a generic -C pointer (void*). -The value can be a userdata, a table, a thread, a string, or a function; -otherwise, lua_topointer returns NULL. -Different objects will give different pointers. -There is no way to convert the pointer back to its original value. - - -

-Typically this function is used only for hashing and debug information. - - - - - -


lua_tostring

-[-0, +0, m] -

const char *lua_tostring (lua_State *L, int index);
- -

-Equivalent to lua_tolstring with len equal to NULL. - - - - - -


lua_tothread

-[-0, +0, –] -

lua_State *lua_tothread (lua_State *L, int index);
- -

-Converts the value at the given index to a Lua thread -(represented as lua_State*). -This value must be a thread; -otherwise, the function returns NULL. - - - - - -


lua_touserdata

-[-0, +0, –] -

void *lua_touserdata (lua_State *L, int index);
- -

-If the value at the given index is a full userdata, -returns its memory-block address. -If the value is a light userdata, -returns its value (a pointer). -Otherwise, returns NULL. - - - - - -


lua_type

-[-0, +0, –] -

int lua_type (lua_State *L, int index);
- -

-Returns the type of the value in the given valid index, -or LUA_TNONE for a non-valid but acceptable index. -The types returned by lua_type are coded by the following constants -defined in lua.h: -LUA_TNIL, -LUA_TNUMBER, -LUA_TBOOLEAN, -LUA_TSTRING, -LUA_TTABLE, -LUA_TFUNCTION, -LUA_TUSERDATA, -LUA_TTHREAD, -and -LUA_TLIGHTUSERDATA. - - - - - -


lua_typename

-[-0, +0, –] -

const char *lua_typename (lua_State *L, int tp);
- -

-Returns the name of the type encoded by the value tp, -which must be one the values returned by lua_type. - - - - - -


lua_Unsigned

-
typedef ... lua_Unsigned;
- -

-The unsigned version of lua_Integer. - - - - - -


lua_upvalueindex

-[-0, +0, –] -

int lua_upvalueindex (int i);
- -

-Returns the pseudo-index that represents the i-th upvalue of -the running function (see §4.2). -i must be in the range [1,256]. - - - - - -


lua_version

-[-0, +0, –] -

lua_Number lua_version (lua_State *L);
- -

-Returns the version number of this core. - - - - - -


lua_WarnFunction

-
typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont);
- -

-The type of warning functions, called by Lua to emit warnings. -The first parameter is an opaque pointer -set by lua_setwarnf. -The second parameter is the warning message. -The third parameter is a boolean that -indicates whether the message is -to be continued by the message in the next call. - - -

-See warn for more details about warnings. - - - - - -


lua_warning

-[-0, +0, –] -

void lua_warning (lua_State *L, const char *msg, int tocont);
- -

-Emits a warning with the given message. -A message in a call with tocont true should be -continued in another call to this function. - - -

-See warn for more details about warnings. - - - - - -


lua_Writer

-
typedef int (*lua_Writer) (lua_State *L,
-                           const void* p,
-                           size_t sz,
-                           void* ud);
- -

-The type of the writer function used by lua_dump. -Every time lua_dump produces another piece of chunk, -it calls the writer, -passing along the buffer to be written (p), -its size (sz), -and the ud parameter supplied to lua_dump. - - -

-The writer returns an error code: -0 means no errors; -any other value means an error and stops lua_dump from -calling the writer again. - - - - - -


lua_xmove

-[-?, +?, –] -

void lua_xmove (lua_State *from, lua_State *to, int n);
- -

-Exchange values between different threads of the same state. - - -

-This function pops n values from the stack from, -and pushes them onto the stack to. - - - - - -


lua_yield

-[-?, +?, v] -

int lua_yield (lua_State *L, int nresults);
- -

-This function is equivalent to lua_yieldk, -but it has no continuation (see §4.5). -Therefore, when the thread resumes, -it continues the function that called -the function calling lua_yield. -To avoid surprises, -this function should be called only in a tail call. - - - - - -


lua_yieldk

-[-?, +?, v] -

int lua_yieldk (lua_State *L,
-                int nresults,
-                lua_KContext ctx,
-                lua_KFunction k);
- -

-Yields a coroutine (thread). - - -

-When a C function calls lua_yieldk, -the running coroutine suspends its execution, -and the call to lua_resume that started this coroutine returns. -The parameter nresults is the number of values from the stack -that will be passed as results to lua_resume. - - -

-When the coroutine is resumed again, -Lua calls the given continuation function k to continue -the execution of the C function that yielded (see §4.5). -This continuation function receives the same stack -from the previous function, -with the n results removed and -replaced by the arguments passed to lua_resume. -Moreover, -the continuation function receives the value ctx -that was passed to lua_yieldk. - - -

-Usually, this function does not return; -when the coroutine eventually resumes, -it continues executing the continuation function. -However, there is one special case, -which is when this function is called -from inside a line or a count hook (see §4.7). -In that case, lua_yieldk should be called with no continuation -(probably in the form of lua_yield) and no results, -and the hook should return immediately after the call. -Lua will yield and, -when the coroutine resumes again, -it will continue the normal execution -of the (Lua) function that triggered the hook. - - -

-This function can raise an error if it is called from a thread -with a pending C call with no continuation function -(what is called a C-call boundary), -or it is called from a thread that is not running inside a resume -(typically the main thread). - - - - - - - -

4.7 – The Debug Interface

- -

-Lua has no built-in debugging facilities. -Instead, it offers a special interface -by means of functions and hooks. -This interface allows the construction of different -kinds of debuggers, profilers, and other tools -that need "inside information" from the interpreter. - - - -


lua_Debug

-
typedef struct lua_Debug {
-  int event;
-  const char *name;           /* (n) */
-  const char *namewhat;       /* (n) */
-  const char *what;           /* (S) */
-  const char *source;         /* (S) */
-  size_t srclen;              /* (S) */
-  int currentline;            /* (l) */
-  int linedefined;            /* (S) */
-  int lastlinedefined;        /* (S) */
-  unsigned char nups;         /* (u) number of upvalues */
-  unsigned char nparams;      /* (u) number of parameters */
-  char isvararg;              /* (u) */
-  char istailcall;            /* (t) */
-  unsigned short ftransfer;   /* (r) index of first value transferred */
-  unsigned short ntransfer;   /* (r) number of transferred values */
-  char short_src[LUA_IDSIZE]; /* (S) */
-  /* private part */
-  other fields
-} lua_Debug;
- -

-A structure used to carry different pieces of -information about a function or an activation record. -lua_getstack fills only the private part -of this structure, for later use. -To fill the other fields of lua_Debug with useful information, -you must call lua_getinfo with an appropriate parameter. -(Specifically, to get a field, -you must add the letter between parentheses in the field's comment -to the parameter what of lua_getinfo.) - - -

-The fields of lua_Debug have the following meaning: - -

    - -
  • source: -the source of the chunk that created the function. -If source starts with a '@', -it means that the function was defined in a file where -the file name follows the '@'. -If source starts with a '=', -the remainder of its contents describes the source in a user-dependent manner. -Otherwise, -the function was defined in a string where -source is that string. -
  • - -
  • srclen: -The length of the string source. -
  • - -
  • short_src: -a "printable" version of source, to be used in error messages. -
  • - -
  • linedefined: -the line number where the definition of the function starts. -
  • - -
  • lastlinedefined: -the line number where the definition of the function ends. -
  • - -
  • what: -the string "Lua" if the function is a Lua function, -"C" if it is a C function, -"main" if it is the main part of a chunk. -
  • - -
  • currentline: -the current line where the given function is executing. -When no line information is available, -currentline is set to -1. -
  • - -
  • name: -a reasonable name for the given function. -Because functions in Lua are first-class values, -they do not have a fixed name: -some functions can be the value of multiple global variables, -while others can be stored only in a table field. -The lua_getinfo function checks how the function was -called to find a suitable name. -If it cannot find a name, -then name is set to NULL. -
  • - -
  • namewhat: -explains the name field. -The value of namewhat can be -"global", "local", "method", -"field", "upvalue", or "" (the empty string), -according to how the function was called. -(Lua uses the empty string when no other option seems to apply.) -
  • - -
  • istailcall: -true if this function invocation was called by a tail call. -In this case, the caller of this level is not in the stack. -
  • - -
  • nups: -the number of upvalues of the function. -
  • - -
  • nparams: -the number of parameters of the function -(always 0 for C functions). -
  • - -
  • isvararg: -true if the function is a variadic function -(always true for C functions). -
  • - -
  • ftransfer: -the index in the stack of the first value being "transferred", -that is, parameters in a call or return values in a return. -(The other values are in consecutive indices.) -Using this index, you can access and modify these values -through lua_getlocal and lua_setlocal. -This field is only meaningful during a -call hook, denoting the first parameter, -or a return hook, denoting the first value being returned. -(For call hooks, this value is always 1.) -
  • - -
  • ntransfer: -The number of values being transferred (see previous item). -(For calls of Lua functions, -this value is always equal to nparams.) -
  • - -
- - - - -

lua_gethook

-[-0, +0, –] -

lua_Hook lua_gethook (lua_State *L);
- -

-Returns the current hook function. - - - - - -


lua_gethookcount

-[-0, +0, –] -

int lua_gethookcount (lua_State *L);
- -

-Returns the current hook count. - - - - - -


lua_gethookmask

-[-0, +0, –] -

int lua_gethookmask (lua_State *L);
- -

-Returns the current hook mask. - - - - - -


lua_getinfo

-[-(0|1), +(0|1|2), m] -

int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar);
- -

-Gets information about a specific function or function invocation. - - -

-To get information about a function invocation, -the parameter ar must be a valid activation record that was -filled by a previous call to lua_getstack or -given as argument to a hook (see lua_Hook). - - -

-To get information about a function, you push it onto the stack -and start the what string with the character '>'. -(In that case, -lua_getinfo pops the function from the top of the stack.) -For instance, to know in which line a function f was defined, -you can write the following code: - -

-     lua_Debug ar;
-     lua_getglobal(L, "f");  /* get global 'f' */
-     lua_getinfo(L, ">S", &ar);
-     printf("%d\n", ar.linedefined);
-
- -

-Each character in the string what -selects some fields of the structure ar to be filled or -a value to be pushed on the stack. -(These characters are also documented in the declaration of -the structure lua_Debug, -between parentheses in the comments following each field.) - -

    - -
  • 'f': -pushes onto the stack the function that is -running at the given level; -
  • - -
  • 'l': fills in the field currentline; -
  • - -
  • 'n': fills in the fields name and namewhat; -
  • - -
  • 'r': fills in the fields ftransfer and ntransfer; -
  • - -
  • 'S': -fills in the fields source, short_src, -linedefined, lastlinedefined, and what; -
  • - -
  • 't': fills in the field istailcall; -
  • - -
  • 'u': fills in the fields -nups, nparams, and isvararg; -
  • - -
  • 'L': -pushes onto the stack a table whose indices are -the lines on the function with some associated code, -that is, the lines where you can put a break point. -(Lines with no code include empty lines and comments.) -If this option is given together with option 'f', -its table is pushed after the function. -This is the only option that can raise a memory error. -
  • - -
- -

-This function returns 0 to signal an invalid option in what; -even then the valid options are handled correctly. - - - - - -


lua_getlocal

-[-0, +(0|1), –] -

const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n);
- -

-Gets information about a local variable or a temporary value -of a given activation record or a given function. - - -

-In the first case, -the parameter ar must be a valid activation record that was -filled by a previous call to lua_getstack or -given as argument to a hook (see lua_Hook). -The index n selects which local variable to inspect; -see debug.getlocal for details about variable indices -and names. - - -

-lua_getlocal pushes the variable's value onto the stack -and returns its name. - - -

-In the second case, ar must be NULL and the function -to be inspected must be on the top of the stack. -In this case, only parameters of Lua functions are visible -(as there is no information about what variables are active) -and no values are pushed onto the stack. - - -

-Returns NULL (and pushes nothing) -when the index is greater than -the number of active local variables. - - - - - -


lua_getstack

-[-0, +0, –] -

int lua_getstack (lua_State *L, int level, lua_Debug *ar);
- -

-Gets information about the interpreter runtime stack. - - -

-This function fills parts of a lua_Debug structure with -an identification of the activation record -of the function executing at a given level. -Level 0 is the current running function, -whereas level n+1 is the function that has called level n -(except for tail calls, which do not count in the stack). -When called with a level greater than the stack depth, -lua_getstack returns 0; -otherwise it returns 1. - - - - - -


lua_getupvalue

-[-0, +(0|1), –] -

const char *lua_getupvalue (lua_State *L, int funcindex, int n);
- -

-Gets information about the n-th upvalue -of the closure at index funcindex. -It pushes the upvalue's value onto the stack -and returns its name. -Returns NULL (and pushes nothing) -when the index n is greater than the number of upvalues. - - -

-See debug.getupvalue for more information about upvalues. - - - - - -


lua_Hook

-
typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar);
- -

-Type for debugging hook functions. - - -

-Whenever a hook is called, its ar argument has its field -event set to the specific event that triggered the hook. -Lua identifies these events with the following constants: -LUA_HOOKCALL, LUA_HOOKRET, -LUA_HOOKTAILCALL, LUA_HOOKLINE, -and LUA_HOOKCOUNT. -Moreover, for line events, the field currentline is also set. -To get the value of any other field in ar, -the hook must call lua_getinfo. - - -

-For call events, event can be LUA_HOOKCALL, -the normal value, or LUA_HOOKTAILCALL, for a tail call; -in this case, there will be no corresponding return event. - - -

-While Lua is running a hook, it disables other calls to hooks. -Therefore, if a hook calls back Lua to execute a function or a chunk, -this execution occurs without any calls to hooks. - - -

-Hook functions cannot have continuations, -that is, they cannot call lua_yieldk, -lua_pcallk, or lua_callk with a non-null k. - - -

-Hook functions can yield under the following conditions: -Only count and line events can yield; -to yield, a hook function must finish its execution -calling lua_yield with nresults equal to zero -(that is, with no values). - - - - - -


lua_sethook

-[-0, +0, –] -

void lua_sethook (lua_State *L, lua_Hook f, int mask, int count);
- -

-Sets the debugging hook function. - - -

-Argument f is the hook function. -mask specifies on which events the hook will be called: -it is formed by a bitwise OR of the constants -LUA_MASKCALL, -LUA_MASKRET, -LUA_MASKLINE, -and LUA_MASKCOUNT. -The count argument is only meaningful when the mask -includes LUA_MASKCOUNT. -For each event, the hook is called as explained below: - -

    - -
  • The call hook: is called when the interpreter calls a function. -The hook is called just after Lua enters the new function. -
  • - -
  • The return hook: is called when the interpreter returns from a function. -The hook is called just before Lua leaves the function. -
  • - -
  • The line hook: is called when the interpreter is about to -start the execution of a new line of code, -or when it jumps back in the code (even to the same line). -This event only happens while Lua is executing a Lua function. -
  • - -
  • The count hook: is called after the interpreter executes every -count instructions. -This event only happens while Lua is executing a Lua function. -
  • - -
- -

-Hooks are disabled by setting mask to zero. - - - - - -


lua_setlocal

-[-(0|1), +0, –] -

const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n);
- -

-Sets the value of a local variable of a given activation record. -It assigns the value on the top of the stack -to the variable and returns its name. -It also pops the value from the stack. - - -

-Returns NULL (and pops nothing) -when the index is greater than -the number of active local variables. - - -

-Parameters ar and n are as in the function lua_getlocal. - - - - - -


lua_setupvalue

-[-(0|1), +0, –] -

const char *lua_setupvalue (lua_State *L, int funcindex, int n);
- -

-Sets the value of a closure's upvalue. -It assigns the value on the top of the stack -to the upvalue and returns its name. -It also pops the value from the stack. - - -

-Returns NULL (and pops nothing) -when the index n is greater than the number of upvalues. - - -

-Parameters funcindex and n are as in -the function lua_getupvalue. - - - - - -


lua_upvalueid

-[-0, +0, –] -

void *lua_upvalueid (lua_State *L, int funcindex, int n);
- -

-Returns a unique identifier for the upvalue numbered n -from the closure at index funcindex. - - -

-These unique identifiers allow a program to check whether different -closures share upvalues. -Lua closures that share an upvalue -(that is, that access a same external local variable) -will return identical ids for those upvalue indices. - - -

-Parameters funcindex and n are as in -the function lua_getupvalue, -but n cannot be greater than the number of upvalues. - - - - - -


lua_upvaluejoin

-[-0, +0, –] -

void lua_upvaluejoin (lua_State *L, int funcindex1, int n1,
-                                    int funcindex2, int n2);
- -

-Make the n1-th upvalue of the Lua closure at index funcindex1 -refer to the n2-th upvalue of the Lua closure at index funcindex2. - - - - - - - -

5 – The Auxiliary Library

- - - -

- -The auxiliary library provides several convenient functions -to interface C with Lua. -While the basic API provides the primitive functions for all -interactions between C and Lua, -the auxiliary library provides higher-level functions for some -common tasks. - - -

-All functions and types from the auxiliary library -are defined in header file lauxlib.h and -have a prefix luaL_. - - -

-All functions in the auxiliary library are built on -top of the basic API, -and so they provide nothing that cannot be done with that API. -Nevertheless, the use of the auxiliary library ensures -more consistency to your code. - - -

-Several functions in the auxiliary library use internally some -extra stack slots. -When a function in the auxiliary library uses less than five slots, -it does not check the stack size; -it simply assumes that there are enough slots. - - -

-Several functions in the auxiliary library are used to -check C function arguments. -Because the error message is formatted for arguments -(e.g., "bad argument #1"), -you should not use these functions for other stack values. - - -

-Functions called luaL_check* -always raise an error if the check is not satisfied. - - - - - -

5.1 – Functions and Types

- -

-Here we list all functions and types from the auxiliary library -in alphabetical order. - - - -


luaL_addchar

-[-?, +?, m] -

void luaL_addchar (luaL_Buffer *B, char c);
- -

-Adds the byte c to the buffer B -(see luaL_Buffer). - - - - - -


luaL_addgsub

-[-?, +?, m] -

const void luaL_addgsub (luaL_Buffer *B, const char *s,
-                         const char *p, const char *r);
- -

-Adds a copy of the string s to the buffer B (see luaL_Buffer), -replacing any occurrence of the string p -with the string r. - - - - - -


luaL_addlstring

-[-?, +?, m] -

void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l);
- -

-Adds the string pointed to by s with length l to -the buffer B -(see luaL_Buffer). -The string can contain embedded zeros. - - - - - -


luaL_addsize

-[-?, +?, –] -

void luaL_addsize (luaL_Buffer *B, size_t n);
- -

-Adds to the buffer B -a string of length n previously copied to the -buffer area (see luaL_prepbuffer). - - - - - -


luaL_addstring

-[-?, +?, m] -

void luaL_addstring (luaL_Buffer *B, const char *s);
- -

-Adds the zero-terminated string pointed to by s -to the buffer B -(see luaL_Buffer). - - - - - -


luaL_addvalue

-[-?, +?, m] -

void luaL_addvalue (luaL_Buffer *B);
- -

-Adds the value on the top of the stack -to the buffer B -(see luaL_Buffer). -Pops the value. - - -

-This is the only function on string buffers that can (and must) -be called with an extra element on the stack, -which is the value to be added to the buffer. - - - - - -


luaL_argcheck

-[-0, +0, v] -

void luaL_argcheck (lua_State *L,
-                    int cond,
-                    int arg,
-                    const char *extramsg);
- -

-Checks whether cond is true. -If it is not, raises an error with a standard message (see luaL_argerror). - - - - - -


luaL_argerror

-[-0, +0, v] -

int luaL_argerror (lua_State *L, int arg, const char *extramsg);
- -

-Raises an error reporting a problem with argument arg -of the C function that called it, -using a standard message -that includes extramsg as a comment: - -

-     bad argument #arg to 'funcname' (extramsg)
-

-This function never returns. - - - - - -


luaL_argexpected

-[-0, +0, v] -

void luaL_argexpected (lua_State *L,
-                       int cond,
-                       int arg,
-                       const char *tname);
- -

-Checks whether cond is true. -If it is not, raises an error about the type of the argument arg -with a standard message (see luaL_typeerror). - - - - - -


luaL_Buffer

-
typedef struct luaL_Buffer luaL_Buffer;
- -

-Type for a string buffer. - - -

-A string buffer allows C code to build Lua strings piecemeal. -Its pattern of use is as follows: - -

    - -
  • First declare a variable b of type luaL_Buffer.
  • - -
  • Then initialize it with a call luaL_buffinit(L, &b).
  • - -
  • -Then add string pieces to the buffer calling any of -the luaL_add* functions. -
  • - -
  • -Finish by calling luaL_pushresult(&b). -This call leaves the final string on the top of the stack. -
  • - -
- -

-If you know beforehand the maximum size of the resulting string, -you can use the buffer like this: - -

    - -
  • First declare a variable b of type luaL_Buffer.
  • - -
  • Then initialize it and preallocate a space of -size sz with a call luaL_buffinitsize(L, &b, sz).
  • - -
  • Then produce the string into that space.
  • - -
  • -Finish by calling luaL_pushresultsize(&b, sz), -where sz is the total size of the resulting string -copied into that space (which may be less than or -equal to the preallocated size). -
  • - -
- -

-During its normal operation, -a string buffer uses a variable number of stack slots. -So, while using a buffer, you cannot assume that you know where -the top of the stack is. -You can use the stack between successive calls to buffer operations -as long as that use is balanced; -that is, -when you call a buffer operation, -the stack is at the same level -it was immediately after the previous buffer operation. -(The only exception to this rule is luaL_addvalue.) -After calling luaL_pushresult, -the stack is back to its level when the buffer was initialized, -plus the final string on its top. - - - - - -


luaL_buffaddr

-[-0, +0, –] -

char *luaL_buffaddr (luaL_Buffer *B);
- -

-Returns the address of the current content of buffer B -(see luaL_Buffer). -Note that any addition to the buffer may invalidate this address. - - - - - -


luaL_buffinit

-[-0, +?, –] -

void luaL_buffinit (lua_State *L, luaL_Buffer *B);
- -

-Initializes a buffer B -(see luaL_Buffer). -This function does not allocate any space; -the buffer must be declared as a variable. - - - - - -


luaL_bufflen

-[-0, +0, –] -

size_t luaL_bufflen (luaL_Buffer *B);
- -

-Returns the length of the current content of buffer B -(see luaL_Buffer). - - - - - -


luaL_buffinitsize

-[-?, +?, m] -

char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz);
- -

-Equivalent to the sequence -luaL_buffinit, luaL_prepbuffsize. - - - - - -


luaL_buffsub

-[-?, +?, –] -

void luaL_buffsub (luaL_Buffer *B, int n);
- -

-Removes n bytes from the buffer B -(see luaL_Buffer). -The buffer must have at least that many bytes. - - - - - -


luaL_callmeta

-[-0, +(0|1), e] -

int luaL_callmeta (lua_State *L, int obj, const char *e);
- -

-Calls a metamethod. - - -

-If the object at index obj has a metatable and this -metatable has a field e, -this function calls this field passing the object as its only argument. -In this case this function returns true and pushes onto the -stack the value returned by the call. -If there is no metatable or no metamethod, -this function returns false without pushing any value on the stack. - - - - - -


luaL_checkany

-[-0, +0, v] -

void luaL_checkany (lua_State *L, int arg);
- -

-Checks whether the function has an argument -of any type (including nil) at position arg. - - - - - -


luaL_checkinteger

-[-0, +0, v] -

lua_Integer luaL_checkinteger (lua_State *L, int arg);
- -

-Checks whether the function argument arg is an integer -(or can be converted to an integer) -and returns this integer. - - - - - -


luaL_checklstring

-[-0, +0, v] -

const char *luaL_checklstring (lua_State *L, int arg, size_t *l);
- -

-Checks whether the function argument arg is a string -and returns this string; -if l is not NULL fills its referent -with the string's length. - - -

-This function uses lua_tolstring to get its result, -so all conversions and caveats of that function apply here. - - - - - -


luaL_checknumber

-[-0, +0, v] -

lua_Number luaL_checknumber (lua_State *L, int arg);
- -

-Checks whether the function argument arg is a number -and returns this number converted to a lua_Number. - - - - - -


luaL_checkoption

-[-0, +0, v] -

int luaL_checkoption (lua_State *L,
-                      int arg,
-                      const char *def,
-                      const char *const lst[]);
- -

-Checks whether the function argument arg is a string and -searches for this string in the array lst -(which must be NULL-terminated). -Returns the index in the array where the string was found. -Raises an error if the argument is not a string or -if the string cannot be found. - - -

-If def is not NULL, -the function uses def as a default value when -there is no argument arg or when this argument is nil. - - -

-This is a useful function for mapping strings to C enums. -(The usual convention in Lua libraries is -to use strings instead of numbers to select options.) - - - - - -


luaL_checkstack

-[-0, +0, v] -

void luaL_checkstack (lua_State *L, int sz, const char *msg);
- -

-Grows the stack size to top + sz elements, -raising an error if the stack cannot grow to that size. -msg is an additional text to go into the error message -(or NULL for no additional text). - - - - - -


luaL_checkstring

-[-0, +0, v] -

const char *luaL_checkstring (lua_State *L, int arg);
- -

-Checks whether the function argument arg is a string -and returns this string. - - -

-This function uses lua_tolstring to get its result, -so all conversions and caveats of that function apply here. - - - - - -


luaL_checktype

-[-0, +0, v] -

void luaL_checktype (lua_State *L, int arg, int t);
- -

-Checks whether the function argument arg has type t. -See lua_type for the encoding of types for t. - - - - - -


luaL_checkudata

-[-0, +0, v] -

void *luaL_checkudata (lua_State *L, int arg, const char *tname);
- -

-Checks whether the function argument arg is a userdata -of the type tname (see luaL_newmetatable) and -returns the userdata's memory-block address (see lua_touserdata). - - - - - -


luaL_checkversion

-[-0, +0, v] -

void luaL_checkversion (lua_State *L);
- -

-Checks whether the code making the call and the Lua library being called -are using the same version of Lua and the same numeric types. - - - - - -


luaL_dofile

-[-0, +?, m] -

int luaL_dofile (lua_State *L, const char *filename);
- -

-Loads and runs the given file. -It is defined as the following macro: - -

-     (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
-

-It returns 0 (LUA_OK) if there are no errors, -or 1 in case of errors. - - - - - -


luaL_dostring

-[-0, +?, –] -

int luaL_dostring (lua_State *L, const char *str);
- -

-Loads and runs the given string. -It is defined as the following macro: - -

-     (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
-

-It returns 0 (LUA_OK) if there are no errors, -or 1 in case of errors. - - - - - -


luaL_error

-[-0, +0, v] -

int luaL_error (lua_State *L, const char *fmt, ...);
- -

-Raises an error. -The error message format is given by fmt -plus any extra arguments, -following the same rules of lua_pushfstring. -It also adds at the beginning of the message the file name and -the line number where the error occurred, -if this information is available. - - -

-This function never returns, -but it is an idiom to use it in C functions -as return luaL_error(args). - - - - - -


luaL_execresult

-[-0, +3, m] -

int luaL_execresult (lua_State *L, int stat);
- -

-This function produces the return values for -process-related functions in the standard library -(os.execute and io.close). - - - - - -


luaL_fileresult

-[-0, +(1|3), m] -

int luaL_fileresult (lua_State *L, int stat, const char *fname);
- -

-This function produces the return values for -file-related functions in the standard library -(io.open, os.rename, file:seek, etc.). - - - - - -


luaL_getmetafield

-[-0, +(0|1), m] -

int luaL_getmetafield (lua_State *L, int obj, const char *e);
- -

-Pushes onto the stack the field e from the metatable -of the object at index obj and returns the type of the pushed value. -If the object does not have a metatable, -or if the metatable does not have this field, -pushes nothing and returns LUA_TNIL. - - - - - -


luaL_getmetatable

-[-0, +1, m] -

int luaL_getmetatable (lua_State *L, const char *tname);
- -

-Pushes onto the stack the metatable associated with the name tname -in the registry (see luaL_newmetatable), -or nil if there is no metatable associated with that name. -Returns the type of the pushed value. - - - - - -


luaL_getsubtable

-[-0, +1, e] -

int luaL_getsubtable (lua_State *L, int idx, const char *fname);
- -

-Ensures that the value t[fname], -where t is the value at index idx, -is a table, -and pushes that table onto the stack. -Returns true if it finds a previous table there -and false if it creates a new table. - - - - - -


luaL_gsub

-[-0, +1, m] -

const char *luaL_gsub (lua_State *L,
-                       const char *s,
-                       const char *p,
-                       const char *r);
- -

-Creates a copy of string s, -replacing any occurrence of the string p -with the string r. -Pushes the resulting string on the stack and returns it. - - - - - -


luaL_len

-[-0, +0, e] -

lua_Integer luaL_len (lua_State *L, int index);
- -

-Returns the "length" of the value at the given index -as a number; -it is equivalent to the '#' operator in Lua (see §3.4.7). -Raises an error if the result of the operation is not an integer. -(This case can only happen through metamethods.) - - - - - -


luaL_loadbuffer

-[-0, +1, –] -

int luaL_loadbuffer (lua_State *L,
-                     const char *buff,
-                     size_t sz,
-                     const char *name);
- -

-Equivalent to luaL_loadbufferx with mode equal to NULL. - - - - - -


luaL_loadbufferx

-[-0, +1, –] -

int luaL_loadbufferx (lua_State *L,
-                      const char *buff,
-                      size_t sz,
-                      const char *name,
-                      const char *mode);
- -

-Loads a buffer as a Lua chunk. -This function uses lua_load to load the chunk in the -buffer pointed to by buff with size sz. - - -

-This function returns the same results as lua_load. -name is the chunk name, -used for debug information and error messages. -The string mode works as in the function lua_load. - - - - - -


luaL_loadfile

-[-0, +1, m] -

int luaL_loadfile (lua_State *L, const char *filename);
- -

-Equivalent to luaL_loadfilex with mode equal to NULL. - - - - - -


luaL_loadfilex

-[-0, +1, m] -

int luaL_loadfilex (lua_State *L, const char *filename,
-                                            const char *mode);
- -

-Loads a file as a Lua chunk. -This function uses lua_load to load the chunk in the file -named filename. -If filename is NULL, -then it loads from the standard input. -The first line in the file is ignored if it starts with a #. - - -

-The string mode works as in the function lua_load. - - -

-This function returns the same results as lua_load -or LUA_ERRFILE for file-related errors. - - -

-As lua_load, this function only loads the chunk; -it does not run it. - - - - - -


luaL_loadstring

-[-0, +1, –] -

int luaL_loadstring (lua_State *L, const char *s);
- -

-Loads a string as a Lua chunk. -This function uses lua_load to load the chunk in -the zero-terminated string s. - - -

-This function returns the same results as lua_load. - - -

-Also as lua_load, this function only loads the chunk; -it does not run it. - - - - - -


luaL_newlib

-[-0, +1, m] -

void luaL_newlib (lua_State *L, const luaL_Reg l[]);
- -

-Creates a new table and registers there -the functions in the list l. - - -

-It is implemented as the following macro: - -

-     (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
-

-The array l must be the actual array, -not a pointer to it. - - - - - -


luaL_newlibtable

-[-0, +1, m] -

void luaL_newlibtable (lua_State *L, const luaL_Reg l[]);
- -

-Creates a new table with a size optimized -to store all entries in the array l -(but does not actually store them). -It is intended to be used in conjunction with luaL_setfuncs -(see luaL_newlib). - - -

-It is implemented as a macro. -The array l must be the actual array, -not a pointer to it. - - - - - -


luaL_newmetatable

-[-0, +1, m] -

int luaL_newmetatable (lua_State *L, const char *tname);
- -

-If the registry already has the key tname, -returns 0. -Otherwise, -creates a new table to be used as a metatable for userdata, -adds to this new table the pair __name = tname, -adds to the registry the pair [tname] = new table, -and returns 1. - - -

-In both cases, -the function pushes onto the stack the final value associated -with tname in the registry. - - - - - -


luaL_newstate

-[-0, +0, –] -

lua_State *luaL_newstate (void);
- -

-Creates a new Lua state. -It calls lua_newstate with an -allocator based on the ISO C allocation functions -and then sets a warning function and a panic function (see §4.4) -that print messages to the standard error output. - - -

-Returns the new state, -or NULL if there is a memory allocation error. - - - - - -


luaL_openlibs

-[-0, +0, e] -

void luaL_openlibs (lua_State *L);
- -

-Opens all standard Lua libraries into the given state. - - - - - -


luaL_opt

-[-0, +0, –] -

T luaL_opt (L, func, arg, dflt);
- -

-This macro is defined as follows: - -

-     (lua_isnoneornil(L,(arg)) ? (dflt) : func(L,(arg)))
-

-In words, if the argument arg is nil or absent, -the macro results in the default dflt. -Otherwise, it results in the result of calling func -with the state L and the argument index arg as -arguments. -Note that it evaluates the expression dflt only if needed. - - - - - -


luaL_optinteger

-[-0, +0, v] -

lua_Integer luaL_optinteger (lua_State *L,
-                             int arg,
-                             lua_Integer d);
- -

-If the function argument arg is an integer -(or it is convertible to an integer), -returns this integer. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - - - - -


luaL_optlstring

-[-0, +0, v] -

const char *luaL_optlstring (lua_State *L,
-                             int arg,
-                             const char *d,
-                             size_t *l);
- -

-If the function argument arg is a string, -returns this string. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - -

-If l is not NULL, -fills its referent with the result's length. -If the result is NULL -(only possible when returning d and d == NULL), -its length is considered zero. - - -

-This function uses lua_tolstring to get its result, -so all conversions and caveats of that function apply here. - - - - - -


luaL_optnumber

-[-0, +0, v] -

lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number d);
- -

-If the function argument arg is a number, -returns this number as a lua_Number. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - - - - -


luaL_optstring

-[-0, +0, v] -

const char *luaL_optstring (lua_State *L,
-                            int arg,
-                            const char *d);
- -

-If the function argument arg is a string, -returns this string. -If this argument is absent or is nil, -returns d. -Otherwise, raises an error. - - - - - -


luaL_prepbuffer

-[-?, +?, m] -

char *luaL_prepbuffer (luaL_Buffer *B);
- -

-Equivalent to luaL_prepbuffsize -with the predefined size LUAL_BUFFERSIZE. - - - - - -


luaL_prepbuffsize

-[-?, +?, m] -

char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz);
- -

-Returns an address to a space of size sz -where you can copy a string to be added to buffer B -(see luaL_Buffer). -After copying the string into this space you must call -luaL_addsize with the size of the string to actually add -it to the buffer. - - - - - -


luaL_pushfail

-[-0, +1, –] -

void luaL_pushfail (lua_State *L);
- -

-Pushes the fail value onto the stack (see §6). - - - - - -


luaL_pushresult

-[-?, +1, m] -

void luaL_pushresult (luaL_Buffer *B);
- -

-Finishes the use of buffer B leaving the final string on -the top of the stack. - - - - - -


luaL_pushresultsize

-[-?, +1, m] -

void luaL_pushresultsize (luaL_Buffer *B, size_t sz);
- -

-Equivalent to the sequence luaL_addsize, luaL_pushresult. - - - - - -


luaL_ref

-[-1, +0, m] -

int luaL_ref (lua_State *L, int t);
- -

-Creates and returns a reference, -in the table at index t, -for the object on the top of the stack (and pops the object). - - -

-A reference is a unique integer key. -As long as you do not manually add integer keys into the table t, -luaL_ref ensures the uniqueness of the key it returns. -You can retrieve an object referred by the reference r -by calling lua_rawgeti(L, t, r). -The function luaL_unref frees a reference. - - -

-If the object on the top of the stack is nil, -luaL_ref returns the constant LUA_REFNIL. -The constant LUA_NOREF is guaranteed to be different -from any reference returned by luaL_ref. - - - - - -


luaL_Reg

-
typedef struct luaL_Reg {
-  const char *name;
-  lua_CFunction func;
-} luaL_Reg;
- -

-Type for arrays of functions to be registered by -luaL_setfuncs. -name is the function name and func is a pointer to -the function. -Any array of luaL_Reg must end with a sentinel entry -in which both name and func are NULL. - - - - - -


luaL_requiref

-[-0, +1, e] -

void luaL_requiref (lua_State *L, const char *modname,
-                    lua_CFunction openf, int glb);
- -

-If package.loaded[modname] is not true, -calls the function openf with the string modname as an argument -and sets the call result to package.loaded[modname], -as if that function has been called through require. - - -

-If glb is true, -also stores the module into the global modname. - - -

-Leaves a copy of the module on the stack. - - - - - -


luaL_setfuncs

-[-nup, +0, m] -

void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
- -

-Registers all functions in the array l -(see luaL_Reg) into the table on the top of the stack -(below optional upvalues, see next). - - -

-When nup is not zero, -all functions are created with nup upvalues, -initialized with copies of the nup values -previously pushed on the stack -on top of the library table. -These values are popped from the stack after the registration. - - -

-A function with a NULL value represents a placeholder, -which is filled with false. - - - - - -


luaL_setmetatable

-[-0, +0, –] -

void luaL_setmetatable (lua_State *L, const char *tname);
- -

-Sets the metatable of the object on the top of the stack -as the metatable associated with name tname -in the registry (see luaL_newmetatable). - - - - - -


luaL_Stream

-
typedef struct luaL_Stream {
-  FILE *f;
-  lua_CFunction closef;
-} luaL_Stream;
- -

-The standard representation for file handles -used by the standard I/O library. - - -

-A file handle is implemented as a full userdata, -with a metatable called LUA_FILEHANDLE -(where LUA_FILEHANDLE is a macro with the actual metatable's name). -The metatable is created by the I/O library -(see luaL_newmetatable). - - -

-This userdata must start with the structure luaL_Stream; -it can contain other data after this initial structure. -The field f points to the corresponding C stream -(or it can be NULL to indicate an incompletely created handle). -The field closef points to a Lua function -that will be called to close the stream -when the handle is closed or collected; -this function receives the file handle as its sole argument and -must return either a true value, in case of success, -or a false value plus an error message, in case of error. -Once Lua calls this field, -it changes the field value to NULL -to signal that the handle is closed. - - - - - -


luaL_testudata

-[-0, +0, m] -

void *luaL_testudata (lua_State *L, int arg, const char *tname);
- -

-This function works like luaL_checkudata, -except that, when the test fails, -it returns NULL instead of raising an error. - - - - - -


luaL_tolstring

-[-0, +1, e] -

const char *luaL_tolstring (lua_State *L, int idx, size_t *len);
- -

-Converts any Lua value at the given index to a C string -in a reasonable format. -The resulting string is pushed onto the stack and also -returned by the function (see §4.1.3). -If len is not NULL, -the function also sets *len with the string length. - - -

-If the value has a metatable with a __tostring field, -then luaL_tolstring calls the corresponding metamethod -with the value as argument, -and uses the result of the call as its result. - - - - - -


luaL_traceback

-[-0, +1, m] -

void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
-                     int level);
- -

-Creates and pushes a traceback of the stack L1. -If msg is not NULL, it is appended -at the beginning of the traceback. -The level parameter tells at which level -to start the traceback. - - - - - -


luaL_typeerror

-[-0, +0, v] -

int luaL_typeerror (lua_State *L, int arg, const char *tname);
- -

-Raises a type error for the argument arg -of the C function that called it, -using a standard message; -tname is a "name" for the expected type. -This function never returns. - - - - - -


luaL_typename

-[-0, +0, –] -

const char *luaL_typename (lua_State *L, int index);
- -

-Returns the name of the type of the value at the given index. - - - - - -


luaL_unref

-[-0, +0, –] -

void luaL_unref (lua_State *L, int t, int ref);
- -

-Releases the reference ref from the table at index t -(see luaL_ref). -The entry is removed from the table, -so that the referred object can be collected. -The reference ref is also freed to be used again. - - -

-If ref is LUA_NOREF or LUA_REFNIL, -luaL_unref does nothing. - - - - - -


luaL_where

-[-0, +1, m] -

void luaL_where (lua_State *L, int lvl);
- -

-Pushes onto the stack a string identifying the current position -of the control at level lvl in the call stack. -Typically this string has the following format: - -

-     chunkname:currentline:
-

-Level 0 is the running function, -level 1 is the function that called the running function, -etc. - - -

-This function is used to build a prefix for error messages. - - - - - - - -

6 – The Standard Libraries

- - - -

-The standard Lua libraries provide useful functions -that are implemented in C through the C API. -Some of these functions provide essential services to the language -(e.g., type and getmetatable); -others provide access to outside services (e.g., I/O); -and others could be implemented in Lua itself, -but that for different reasons -deserve an implementation in C (e.g., table.sort). - - -

-All libraries are implemented through the official C API -and are provided as separate C modules. -Unless otherwise noted, -these library functions do not adjust its number of arguments -to its expected parameters. -For instance, a function documented as foo(arg) -should not be called without an argument. - - -

-The notation fail means a false value representing -some kind of failure. -(Currently, fail is equal to nil, -but that may change in future versions. -The recommendation is to always test the success of these functions -with (not status), instead of (status == nil).) - - -

-Currently, Lua has the following standard libraries: - -

    - -
  • basic library (§6.1);
  • - -
  • coroutine library (§6.2);
  • - -
  • package library (§6.3);
  • - -
  • string manipulation (§6.4);
  • - -
  • basic UTF-8 support (§6.5);
  • - -
  • table manipulation (§6.6);
  • - -
  • mathematical functions (§6.7) (sin, log, etc.);
  • - -
  • input and output (§6.8);
  • - -
  • operating system facilities (§6.9);
  • - -
  • debug facilities (§6.10).
  • - -

-Except for the basic and the package libraries, -each library provides all its functions as fields of a global table -or as methods of its objects. - - -

-To have access to these libraries, -the C host program should call the luaL_openlibs function, -which opens all standard libraries. -Alternatively, -the host program can open them individually by using -luaL_requiref to call -luaopen_base (for the basic library), -luaopen_package (for the package library), -luaopen_coroutine (for the coroutine library), -luaopen_string (for the string library), -luaopen_utf8 (for the UTF-8 library), -luaopen_table (for the table library), -luaopen_math (for the mathematical library), -luaopen_io (for the I/O library), -luaopen_os (for the operating system library), -and luaopen_debug (for the debug library). -These functions are declared in lualib.h. - - - - - -

6.1 – Basic Functions

- -

-The basic library provides core functions to Lua. -If you do not include this library in your application, -you should check carefully whether you need to provide -implementations for some of its facilities. - - -

-


assert (v [, message])

- - -

-Raises an error if -the value of its argument v is false (i.e., nil or false); -otherwise, returns all its arguments. -In case of error, -message is the error object; -when absent, it defaults to "assertion failed!" - - - - -

-


collectgarbage ([opt [, arg]])

- - -

-This function is a generic interface to the garbage collector. -It performs different functions according to its first argument, opt: - -

    - -
  • "collect": -Performs a full garbage-collection cycle. -This is the default option. -
  • - -
  • "stop": -Stops automatic execution of the garbage collector. -The collector will run only when explicitly invoked, -until a call to restart it. -
  • - -
  • "restart": -Restarts automatic execution of the garbage collector. -
  • - -
  • "count": -Returns the total memory in use by Lua in Kbytes. -The value has a fractional part, -so that it multiplied by 1024 -gives the exact number of bytes in use by Lua. -
  • - -
  • "step": -Performs a garbage-collection step. -The step "size" is controlled by arg. -With a zero value, -the collector will perform one basic (indivisible) step. -For non-zero values, -the collector will perform as if that amount of memory -(in Kbytes) had been allocated by Lua. -Returns true if the step finished a collection cycle. -
  • - -
  • "isrunning": -Returns a boolean that tells whether the collector is running -(i.e., not stopped). -
  • - -
  • "incremental": -Change the collector mode to incremental. -This option can be followed by three numbers: -the garbage-collector pause, -the step multiplier, -and the step size (see §2.5.1). -A zero means to not change that value. -
  • - -
  • "generational": -Change the collector mode to generational. -This option can be followed by two numbers: -the garbage-collector minor multiplier -and the major multiplier (see §2.5.2). -A zero means to not change that value. -
  • - -

-See §2.5 for more details about garbage collection -and some of these options. - - -

-This function should not be called by a finalizer. - - - - -

-


dofile ([filename])

-Opens the named file and executes its content as a Lua chunk. -When called without arguments, -dofile executes the content of the standard input (stdin). -Returns all values returned by the chunk. -In case of errors, dofile propagates the error -to its caller. -(That is, dofile does not run in protected mode.) - - - - -

-


error (message [, level])

-Raises an error (see §2.3) with message as the error object. -This function never returns. - - -

-Usually, error adds some information about the error position -at the beginning of the message, if the message is a string. -The level argument specifies how to get the error position. -With level 1 (the default), the error position is where the -error function was called. -Level 2 points the error to where the function -that called error was called; and so on. -Passing a level 0 avoids the addition of error position information -to the message. - - - - -

-


_G

-A global variable (not a function) that -holds the global environment (see §2.2). -Lua itself does not use this variable; -changing its value does not affect any environment, -nor vice versa. - - - - -

-


getmetatable (object)

- - -

-If object does not have a metatable, returns nil. -Otherwise, -if the object's metatable has a __metatable field, -returns the associated value. -Otherwise, returns the metatable of the given object. - - - - -

-


ipairs (t)

- - -

-Returns three values (an iterator function, the table t, and 0) -so that the construction - -

-     for i,v in ipairs(t) do body end
-

-will iterate over the key–value pairs -(1,t[1]), (2,t[2]), ..., -up to the first absent index. - - - - -

-


load (chunk [, chunkname [, mode [, env]]])

- - -

-Loads a chunk. - - -

-If chunk is a string, the chunk is this string. -If chunk is a function, -load calls it repeatedly to get the chunk pieces. -Each call to chunk must return a string that concatenates -with previous results. -A return of an empty string, nil, or no value signals the end of the chunk. - - -

-If there are no syntactic errors, -load returns the compiled chunk as a function; -otherwise, it returns fail plus the error message. - - -

-When you load a main chunk, -the resulting function will always have exactly one upvalue, -the _ENV variable (see §2.2). -However, -when you load a binary chunk created from a function (see string.dump), -the resulting function can have an arbitrary number of upvalues, -and there is no guarantee that its first upvalue will be -the _ENV variable. -(A non-main function may not even have an _ENV upvalue.) - - -

-Regardless, if the resulting function has any upvalues, -its first upvalue is set to the value of env, -if that parameter is given, -or to the value of the global environment. -Other upvalues are initialized with nil. -All upvalues are fresh, that is, -they are not shared with any other function. - - -

-chunkname is used as the name of the chunk for error messages -and debug information (see §4.7). -When absent, -it defaults to chunk, if chunk is a string, -or to "=(load)" otherwise. - - -

-The string mode controls whether the chunk can be text or binary -(that is, a precompiled chunk). -It may be the string "b" (only binary chunks), -"t" (only text chunks), -or "bt" (both binary and text). -The default is "bt". - - -

-It is safe to load malformed binary chunks; -load signals an appropriate error. -However, -Lua does not check the consistency of the code inside binary chunks; -running maliciously crafted bytecode can crash the interpreter. - - - - -

-


loadfile ([filename [, mode [, env]]])

- - -

-Similar to load, -but gets the chunk from file filename -or from the standard input, -if no file name is given. - - - - -

-


next (table [, index])

- - -

-Allows a program to traverse all fields of a table. -Its first argument is a table and its second argument -is an index in this table. -A call to next returns the next index of the table -and its associated value. -When called with nil as its second argument, -next returns an initial index -and its associated value. -When called with the last index, -or with nil in an empty table, -next returns nil. -If the second argument is absent, then it is interpreted as nil. -In particular, -you can use next(t) to check whether a table is empty. - - -

-The order in which the indices are enumerated is not specified, -even for numeric indices. -(To traverse a table in numerical order, -use a numerical for.) - - -

-You should not assign any value to a non-existent field in a table -during its traversal. -You may however modify existing fields. -In particular, you may set existing fields to nil. - - - - -

-


pairs (t)

- - -

-If t has a metamethod __pairs, -calls it with t as argument and returns the first three -results from the call. - - -

-Otherwise, -returns three values: the next function, the table t, and nil, -so that the construction - -

-     for k,v in pairs(t) do body end
-

-will iterate over all key–value pairs of table t. - - -

-See function next for the caveats of modifying -the table during its traversal. - - - - -

-


pcall (f [, arg1, ···])

- - -

-Calls the function f with -the given arguments in protected mode. -This means that any error inside f is not propagated; -instead, pcall catches the error -and returns a status code. -Its first result is the status code (a boolean), -which is true if the call succeeds without errors. -In such case, pcall also returns all results from the call, -after this first result. -In case of any error, pcall returns false plus the error object. -Note that errors caught by pcall do not call a message handler. - - - - -

-


print (···)

-Receives any number of arguments -and prints their values to stdout, -converting each argument to a string -following the same rules of tostring. - - -

-The function print is not intended for formatted output, -but only as a quick way to show a value, -for instance for debugging. -For complete control over the output, -use string.format and io.write. - - - - -

-


rawequal (v1, v2)

-Checks whether v1 is equal to v2, -without invoking the __eq metamethod. -Returns a boolean. - - - - -

-


rawget (table, index)

-Gets the real value of table[index], -without using the __index metavalue. -table must be a table; -index may be any value. - - - - -

-


rawlen (v)

-Returns the length of the object v, -which must be a table or a string, -without invoking the __len metamethod. -Returns an integer. - - - - -

-


rawset (table, index, value)

-Sets the real value of table[index] to value, -without using the __newindex metavalue. -table must be a table, -index any value different from nil and NaN, -and value any Lua value. - - -

-This function returns table. - - - - -

-


select (index, ···)

- - -

-If index is a number, -returns all arguments after argument number index; -a negative number indexes from the end (-1 is the last argument). -Otherwise, index must be the string "#", -and select returns the total number of extra arguments it received. - - - - -

-


setmetatable (table, metatable)

- - -

-Sets the metatable for the given table. -If metatable is nil, -removes the metatable of the given table. -If the original metatable has a __metatable field, -raises an error. - - -

-This function returns table. - - -

-To change the metatable of other types from Lua code, -you must use the debug library (§6.10). - - - - -

-


tonumber (e [, base])

- - -

-When called with no base, -tonumber tries to convert its argument to a number. -If the argument is already a number or -a string convertible to a number, -then tonumber returns this number; -otherwise, it returns fail. - - -

-The conversion of strings can result in integers or floats, -according to the lexical conventions of Lua (see §3.1). -The string may have leading and trailing spaces and a sign. - - -

-When called with base, -then e must be a string to be interpreted as -an integer numeral in that base. -The base may be any integer between 2 and 36, inclusive. -In bases above 10, the letter 'A' (in either upper or lower case) -represents 10, 'B' represents 11, and so forth, -with 'Z' representing 35. -If the string e is not a valid numeral in the given base, -the function returns fail. - - - - -

-


tostring (v)

- - -

-Receives a value of any type and -converts it to a string in a human-readable format. - - -

-If the metatable of v has a __tostring field, -then tostring calls the corresponding value -with v as argument, -and uses the result of the call as its result. -Otherwise, if the metatable of v has a __name field -with a string value, -tostring may use that string in its final result. - - -

-For complete control of how numbers are converted, -use string.format. - - - - -

-


type (v)

- - -

-Returns the type of its only argument, coded as a string. -The possible results of this function are -"nil" (a string, not the value nil), -"number", -"string", -"boolean", -"table", -"function", -"thread", -and "userdata". - - - - -

-


_VERSION

- - -

-A global variable (not a function) that -holds a string containing the running Lua version. -The current value of this variable is "Lua 5.4". - - - - -

-


warn (msg1, ···)

- - -

-Emits a warning with a message composed by the concatenation -of all its arguments (which should be strings). - - -

-By convention, -a one-piece message starting with '@' -is intended to be a control message, -which is a message to the warning system itself. -In particular, the standard warning function in Lua -recognizes the control messages "@off", -to stop the emission of warnings, -and "@on", to (re)start the emission; -it ignores unknown control messages. - - - - -

-


xpcall (f, msgh [, arg1, ···])

- - -

-This function is similar to pcall, -except that it sets a new message handler msgh. - - - - - - - -

6.2 – Coroutine Manipulation

- -

-This library comprises the operations to manipulate coroutines, -which come inside the table coroutine. -See §2.6 for a general description of coroutines. - - -

-


coroutine.close (co)

- - -

-Closes coroutine co, -that is, -closes all its pending to-be-closed variables -and puts the coroutine in a dead state. -The given coroutine must be dead or suspended. -In case of error -(either the original error that stopped the coroutine or -errors in closing methods), -returns false plus the error object; -otherwise returns true. - - - - -

-


coroutine.create (f)

- - -

-Creates a new coroutine, with body f. -f must be a function. -Returns this new coroutine, -an object with type "thread". - - - - -

-


coroutine.isyieldable ([co])

- - -

-Returns true when the coroutine co can yield. -The default for co is the running coroutine. - - -

-A coroutine is yieldable if it is not the main thread and -it is not inside a non-yieldable C function. - - - - -

-


coroutine.resume (co [, val1, ···])

- - -

-Starts or continues the execution of coroutine co. -The first time you resume a coroutine, -it starts running its body. -The values val1, ... are passed -as the arguments to the body function. -If the coroutine has yielded, -resume restarts it; -the values val1, ... are passed -as the results from the yield. - - -

-If the coroutine runs without any errors, -resume returns true plus any values passed to yield -(when the coroutine yields) or any values returned by the body function -(when the coroutine terminates). -If there is any error, -resume returns false plus the error message. - - - - -

-


coroutine.running ()

- - -

-Returns the running coroutine plus a boolean, -true when the running coroutine is the main one. - - - - -

-


coroutine.status (co)

- - -

-Returns the status of the coroutine co, as a string: -"running", -if the coroutine is running -(that is, it is the one that called status); -"suspended", if the coroutine is suspended in a call to yield, -or if it has not started running yet; -"normal" if the coroutine is active but not running -(that is, it has resumed another coroutine); -and "dead" if the coroutine has finished its body function, -or if it has stopped with an error. - - - - -

-


coroutine.wrap (f)

- - -

-Creates a new coroutine, with body f; -f must be a function. -Returns a function that resumes the coroutine each time it is called. -Any arguments passed to this function behave as the -extra arguments to resume. -The function returns the same values returned by resume, -except the first boolean. -In case of error, -the function closes the coroutine and propagates the error. - - - - -

-


coroutine.yield (···)

- - -

-Suspends the execution of the calling coroutine. -Any arguments to yield are passed as extra results to resume. - - - - - - - -

6.3 – Modules

- -

-The package library provides basic -facilities for loading modules in Lua. -It exports one function directly in the global environment: -require. -Everything else is exported in the table package. - - -

-


require (modname)

- - -

-Loads the given module. -The function starts by looking into the package.loaded table -to determine whether modname is already loaded. -If it is, then require returns the value stored -at package.loaded[modname]. -(The absence of a second result in this case -signals that this call did not have to load the module.) -Otherwise, it tries to find a loader for the module. - - -

-To find a loader, -require is guided by the table package.searchers. -Each item in this table is a search function, -that searches for the module in a particular way. -By changing this table, -we can change how require looks for a module. -The following explanation is based on the default configuration -for package.searchers. - - -

-First require queries package.preload[modname]. -If it has a value, -this value (which must be a function) is the loader. -Otherwise require searches for a Lua loader using the -path stored in package.path. -If that also fails, it searches for a C loader using the -path stored in package.cpath. -If that also fails, -it tries an all-in-one loader (see package.searchers). - - -

-Once a loader is found, -require calls the loader with two arguments: -modname and an extra value, -a loader data, -also returned by the searcher. -The loader data can be any value useful to the module; -for the default searchers, -it indicates where the loader was found. -(For instance, if the loader came from a file, -this extra value is the file path.) -If the loader returns any non-nil value, -require assigns the returned value to package.loaded[modname]. -If the loader does not return a non-nil value and -has not assigned any value to package.loaded[modname], -then require assigns true to this entry. -In any case, require returns the -final value of package.loaded[modname]. -Besides that value, require also returns as a second result -the loader data returned by the searcher, -which indicates how require found the module. - - -

-If there is any error loading or running the module, -or if it cannot find any loader for the module, -then require raises an error. - - - - -

-


package.config

- - -

-A string describing some compile-time configurations for packages. -This string is a sequence of lines: - -

    - -
  • The first line is the directory separator string. -Default is '\' for Windows and '/' for all other systems.
  • - -
  • The second line is the character that separates templates in a path. -Default is ';'.
  • - -
  • The third line is the string that marks the -substitution points in a template. -Default is '?'.
  • - -
  • The fourth line is a string that, in a path in Windows, -is replaced by the executable's directory. -Default is '!'.
  • - -
  • The fifth line is a mark to ignore all text after it -when building the luaopen_ function name. -Default is '-'.
  • - -
- - - -

-


package.cpath

- - -

-A string with the path used by require -to search for a C loader. - - -

-Lua initializes the C path package.cpath in the same way -it initializes the Lua path package.path, -using the environment variable LUA_CPATH_5_4, -or the environment variable LUA_CPATH, -or a default path defined in luaconf.h. - - - - -

-


package.loaded

- - -

-A table used by require to control which -modules are already loaded. -When you require a module modname and -package.loaded[modname] is not false, -require simply returns the value stored there. - - -

-This variable is only a reference to the real table; -assignments to this variable do not change the -table used by require. -The real table is stored in the C registry (see §4.3), -indexed by the key LUA_LOADED_TABLE, a string. - - - - -

-


package.loadlib (libname, funcname)

- - -

-Dynamically links the host program with the C library libname. - - -

-If funcname is "*", -then it only links with the library, -making the symbols exported by the library -available to other dynamically linked libraries. -Otherwise, -it looks for a function funcname inside the library -and returns this function as a C function. -So, funcname must follow the lua_CFunction prototype -(see lua_CFunction). - - -

-This is a low-level function. -It completely bypasses the package and module system. -Unlike require, -it does not perform any path searching and -does not automatically adds extensions. -libname must be the complete file name of the C library, -including if necessary a path and an extension. -funcname must be the exact name exported by the C library -(which may depend on the C compiler and linker used). - - -

-This functionality is not supported by ISO C. -As such, it is only available on some platforms -(Windows, Linux, Mac OS X, Solaris, BSD, -plus other Unix systems that support the dlfcn standard). - - -

-This function is inherently insecure, -as it allows Lua to call any function in any readable dynamic -library in the system. -(Lua calls any function assuming the function -has a proper prototype and respects a proper protocol -(see lua_CFunction). -Therefore, -calling an arbitrary function in an arbitrary dynamic library -more often than not results in an access violation.) - - - - -

-


package.path

- - -

-A string with the path used by require -to search for a Lua loader. - - -

-At start-up, Lua initializes this variable with -the value of the environment variable LUA_PATH_5_4 or -the environment variable LUA_PATH or -with a default path defined in luaconf.h, -if those environment variables are not defined. -A ";;" in the value of the environment variable -is replaced by the default path. - - - - -

-


package.preload

- - -

-A table to store loaders for specific modules -(see require). - - -

-This variable is only a reference to the real table; -assignments to this variable do not change the -table used by require. -The real table is stored in the C registry (see §4.3), -indexed by the key LUA_PRELOAD_TABLE, a string. - - - - -

-


package.searchers

- - -

-A table used by require to control how to find modules. - - -

-Each entry in this table is a searcher function. -When looking for a module, -require calls each of these searchers in ascending order, -with the module name (the argument given to require) as its -sole argument. -If the searcher finds the module, -it returns another function, the module loader, -plus an extra value, a loader data, -that will be passed to that loader and -returned as a second result by require. -If it cannot find the module, -it returns a string explaining why -(or nil if it has nothing to say). - - -

-Lua initializes this table with four searcher functions. - - -

-The first searcher simply looks for a loader in the -package.preload table. - - -

-The second searcher looks for a loader as a Lua library, -using the path stored at package.path. -The search is done as described in function package.searchpath. - - -

-The third searcher looks for a loader as a C library, -using the path given by the variable package.cpath. -Again, -the search is done as described in function package.searchpath. -For instance, -if the C path is the string - -

-     "./?.so;./?.dll;/usr/local/?/init.so"
-

-the searcher for module foo -will try to open the files ./foo.so, ./foo.dll, -and /usr/local/foo/init.so, in that order. -Once it finds a C library, -this searcher first uses a dynamic link facility to link the -application with the library. -Then it tries to find a C function inside the library to -be used as the loader. -The name of this C function is the string "luaopen_" -concatenated with a copy of the module name where each dot -is replaced by an underscore. -Moreover, if the module name has a hyphen, -its suffix after (and including) the first hyphen is removed. -For instance, if the module name is a.b.c-v2.1, -the function name will be luaopen_a_b_c. - - -

-The fourth searcher tries an all-in-one loader. -It searches the C path for a library for -the root name of the given module. -For instance, when requiring a.b.c, -it will search for a C library for a. -If found, it looks into it for an open function for -the submodule; -in our example, that would be luaopen_a_b_c. -With this facility, a package can pack several C submodules -into one single library, -with each submodule keeping its original open function. - - -

-All searchers except the first one (preload) return as the extra value -the file path where the module was found, -as returned by package.searchpath. -The first searcher always returns the string ":preload:". - - -

-Searchers should raise no errors and have no side effects in Lua. -(They may have side effects in C, -for instance by linking the application with a library.) - - - - -

-


package.searchpath (name, path [, sep [, rep]])

- - -

-Searches for the given name in the given path. - - -

-A path is a string containing a sequence of -templates separated by semicolons. -For each template, -the function replaces each interrogation mark (if any) -in the template with a copy of name -wherein all occurrences of sep -(a dot, by default) -were replaced by rep -(the system's directory separator, by default), -and then tries to open the resulting file name. - - -

-For instance, if the path is the string - -

-     "./?.lua;./?.lc;/usr/local/?/init.lua"
-

-the search for the name foo.a -will try to open the files -./foo/a.lua, ./foo/a.lc, and -/usr/local/foo/a/init.lua, in that order. - - -

-Returns the resulting name of the first file that it can -open in read mode (after closing the file), -or fail plus an error message if none succeeds. -(This error message lists all file names it tried to open.) - - - - - - - -

6.4 – String Manipulation

- - - -

-This library provides generic functions for string manipulation, -such as finding and extracting substrings, and pattern matching. -When indexing a string in Lua, the first character is at position 1 -(not at 0, as in C). -Indices are allowed to be negative and are interpreted as indexing backwards, -from the end of the string. -Thus, the last character is at position -1, and so on. - - -

-The string library provides all its functions inside the table -string. -It also sets a metatable for strings -where the __index field points to the string table. -Therefore, you can use the string functions in object-oriented style. -For instance, string.byte(s,i) -can be written as s:byte(i). - - -

-The string library assumes one-byte character encodings. - - -

-


string.byte (s [, i [, j]])

-Returns the internal numeric codes of the characters s[i], -s[i+1], ..., s[j]. -The default value for i is 1; -the default value for j is i. -These indices are corrected -following the same rules of function string.sub. - - -

-Numeric codes are not necessarily portable across platforms. - - - - -

-


string.char (···)

-Receives zero or more integers. -Returns a string with length equal to the number of arguments, -in which each character has the internal numeric code equal -to its corresponding argument. - - -

-Numeric codes are not necessarily portable across platforms. - - - - -

-


string.dump (function [, strip])

- - -

-Returns a string containing a binary representation -(a binary chunk) -of the given function, -so that a later load on this string returns -a copy of the function (but with new upvalues). -If strip is a true value, -the binary representation may not include all debug information -about the function, -to save space. - - -

-Functions with upvalues have only their number of upvalues saved. -When (re)loaded, -those upvalues receive fresh instances. -(See the load function for details about -how these upvalues are initialized. -You can use the debug library to serialize -and reload the upvalues of a function -in a way adequate to your needs.) - - - - -

-


string.find (s, pattern [, init [, plain]])

- - -

-Looks for the first match of -pattern (see §6.4.1) in the string s. -If it finds a match, then find returns the indices of s -where this occurrence starts and ends; -otherwise, it returns fail. -A third, optional numeric argument init specifies -where to start the search; -its default value is 1 and can be negative. -A true as a fourth, optional argument plain -turns off the pattern matching facilities, -so the function does a plain "find substring" operation, -with no characters in pattern being considered magic. - - -

-If the pattern has captures, -then in a successful match -the captured values are also returned, -after the two indices. - - - - -

-


string.format (formatstring, ···)

- - -

-Returns a formatted version of its variable number of arguments -following the description given in its first argument, -which must be a string. -The format string follows the same rules as the ISO C function sprintf. -The only differences are that the conversion specifiers and modifiers -F, n, *, h, L, and l are not supported -and that there is an extra specifier, q. -Both width and precision, when present, -are limited to two digits. - - -

-The specifier q formats booleans, nil, numbers, and strings -in a way that the result is a valid constant in Lua source code. -Booleans and nil are written in the obvious way -(true, false, nil). -Floats are written in hexadecimal, -to preserve full precision. -A string is written between double quotes, -using escape sequences when necessary to ensure that -it can safely be read back by the Lua interpreter. -For instance, the call - -

-     string.format('%q', 'a string with "quotes" and \n new line')
-

-may produce the string: - -

-     "a string with \"quotes\" and \
-      new line"
-

-This specifier does not support modifiers (flags, width, precision). - - -

-The conversion specifiers -A, a, E, e, f, -G, and g all expect a number as argument. -The specifiers c, d, -i, o, u, X, and x -expect an integer. -When Lua is compiled with a C89 compiler, -the specifiers A and a (hexadecimal floats) -do not support modifiers. - - -

-The specifier s expects a string; -if its argument is not a string, -it is converted to one following the same rules of tostring. -If the specifier has any modifier, -the corresponding string argument should not contain embedded zeros. - - -

-The specifier p formats the pointer -returned by lua_topointer. -That gives a unique string identifier for tables, userdata, -threads, strings, and functions. -For other values (numbers, nil, booleans), -this specifier results in a string representing -the pointer NULL. - - - - -

-


string.gmatch (s, pattern [, init])

-Returns an iterator function that, -each time it is called, -returns the next captures from pattern (see §6.4.1) -over the string s. -If pattern specifies no captures, -then the whole match is produced in each call. -A third, optional numeric argument init specifies -where to start the search; -its default value is 1 and can be negative. - - -

-As an example, the following loop -will iterate over all the words from string s, -printing one per line: - -

-     s = "hello world from Lua"
-     for w in string.gmatch(s, "%a+") do
-       print(w)
-     end
-

-The next example collects all pairs key=value from the -given string into a table: - -

-     t = {}
-     s = "from=world, to=Lua"
-     for k, v in string.gmatch(s, "(%w+)=(%w+)") do
-       t[k] = v
-     end
-
- -

-For this function, a caret '^' at the start of a pattern does not -work as an anchor, as this would prevent the iteration. - - - - -

-


string.gsub (s, pattern, repl [, n])

-Returns a copy of s -in which all (or the first n, if given) -occurrences of the pattern (see §6.4.1) have been -replaced by a replacement string specified by repl, -which can be a string, a table, or a function. -gsub also returns, as its second value, -the total number of matches that occurred. -The name gsub comes from Global SUBstitution. - - -

-If repl is a string, then its value is used for replacement. -The character % works as an escape character: -any sequence in repl of the form %d, -with d between 1 and 9, -stands for the value of the d-th captured substring; -the sequence %0 stands for the whole match; -the sequence %% stands for a single %. - - -

-If repl is a table, then the table is queried for every match, -using the first capture as the key. - - -

-If repl is a function, then this function is called every time a -match occurs, with all captured substrings passed as arguments, -in order. - - -

-In any case, -if the pattern specifies no captures, -then it behaves as if the whole pattern was inside a capture. - - -

-If the value returned by the table query or by the function call -is a string or a number, -then it is used as the replacement string; -otherwise, if it is false or nil, -then there is no replacement -(that is, the original match is kept in the string). - - -

-Here are some examples: - -

-     x = string.gsub("hello world", "(%w+)", "%1 %1")
-     --> x="hello hello world world"
-     
-     x = string.gsub("hello world", "%w+", "%0 %0", 1)
-     --> x="hello hello world"
-     
-     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
-     --> x="world hello Lua from"
-     
-     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
-     --> x="home = /home/roberto, user = roberto"
-     
-     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
-           return load(s)()
-         end)
-     --> x="4+5 = 9"
-     
-     local t = {name="lua", version="5.4"}
-     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
-     --> x="lua-5.4.tar.gz"
-
- - - -

-


string.len (s)

- - -

-Receives a string and returns its length. -The empty string "" has length 0. -Embedded zeros are counted, -so "a\000bc\000" has length 5. - - - - -

-


string.lower (s)

- - -

-Receives a string and returns a copy of this string with all -uppercase letters changed to lowercase. -All other characters are left unchanged. -The definition of what an uppercase letter is depends on the current locale. - - - - -

-


string.match (s, pattern [, init])

- - -

-Looks for the first match of -the pattern (see §6.4.1) in the string s. -If it finds one, then match returns -the captures from the pattern; -otherwise it returns fail. -If pattern specifies no captures, -then the whole match is returned. -A third, optional numeric argument init specifies -where to start the search; -its default value is 1 and can be negative. - - - - -

-


string.pack (fmt, v1, v2, ···)

- - -

-Returns a binary string containing the values v1, v2, etc. -serialized in binary form (packed) -according to the format string fmt (see §6.4.2). - - - - -

-


string.packsize (fmt)

- - -

-Returns the length of a string resulting from string.pack -with the given format. -The format string cannot have the variable-length options -'s' or 'z' (see §6.4.2). - - - - -

-


string.rep (s, n [, sep])

- - -

-Returns a string that is the concatenation of n copies of -the string s separated by the string sep. -The default value for sep is the empty string -(that is, no separator). -Returns the empty string if n is not positive. - - -

-(Note that it is very easy to exhaust the memory of your machine -with a single call to this function.) - - - - -

-


string.reverse (s)

- - -

-Returns a string that is the string s reversed. - - - - -

-


string.sub (s, i [, j])

- - -

-Returns the substring of s that -starts at i and continues until j; -i and j can be negative. -If j is absent, then it is assumed to be equal to -1 -(which is the same as the string length). -In particular, -the call string.sub(s,1,j) returns a prefix of s -with length j, -and string.sub(s, -i) (for a positive i) -returns a suffix of s -with length i. - - -

-If, after the translation of negative indices, -i is less than 1, -it is corrected to 1. -If j is greater than the string length, -it is corrected to that length. -If, after these corrections, -i is greater than j, -the function returns the empty string. - - - - -

-


string.unpack (fmt, s [, pos])

- - -

-Returns the values packed in string s (see string.pack) -according to the format string fmt (see §6.4.2). -An optional pos marks where -to start reading in s (default is 1). -After the read values, -this function also returns the index of the first unread byte in s. - - - - -

-


string.upper (s)

- - -

-Receives a string and returns a copy of this string with all -lowercase letters changed to uppercase. -All other characters are left unchanged. -The definition of what a lowercase letter is depends on the current locale. - - - - - - - -

6.4.1 – Patterns

- - - -

-Patterns in Lua are described by regular strings, -which are interpreted as patterns by the pattern-matching functions -string.find, -string.gmatch, -string.gsub, -and string.match. -This section describes the syntax and the meaning -(that is, what they match) of these strings. - - - - - -

Character Class:

-A character class is used to represent a set of characters. -The following combinations are allowed in describing a character class: - -

    - -
  • x: -(where x is not one of the magic characters -^$()%.[]*+-?) -represents the character x itself. -
  • - -
  • .: (a dot) represents all characters.
  • - -
  • %a: represents all letters.
  • - -
  • %c: represents all control characters.
  • - -
  • %d: represents all digits.
  • - -
  • %g: represents all printable characters except space.
  • - -
  • %l: represents all lowercase letters.
  • - -
  • %p: represents all punctuation characters.
  • - -
  • %s: represents all space characters.
  • - -
  • %u: represents all uppercase letters.
  • - -
  • %w: represents all alphanumeric characters.
  • - -
  • %x: represents all hexadecimal digits.
  • - -
  • %x: (where x is any non-alphanumeric character) -represents the character x. -This is the standard way to escape the magic characters. -Any non-alphanumeric character -(including all punctuation characters, even the non-magical) -can be preceded by a '%' to represent itself in a pattern. -
  • - -
  • [set]: -represents the class which is the union of all -characters in set. -A range of characters can be specified by -separating the end characters of the range, -in ascending order, with a '-'. -All classes %x described above can also be used as -components in set. -All other characters in set represent themselves. -For example, [%w_] (or [_%w]) -represents all alphanumeric characters plus the underscore, -[0-7] represents the octal digits, -and [0-7%l%-] represents the octal digits plus -the lowercase letters plus the '-' character. - - -

    -You can put a closing square bracket in a set -by positioning it as the first character in the set. -You can put a hyphen in a set -by positioning it as the first or the last character in the set. -(You can also use an escape for both cases.) - - -

    -The interaction between ranges and classes is not defined. -Therefore, patterns like [%a-z] or [a-%%] -have no meaning. -

  • - -
  • [^set]: -represents the complement of set, -where set is interpreted as above. -
  • - -

-For all classes represented by single letters (%a, %c, etc.), -the corresponding uppercase letter represents the complement of the class. -For instance, %S represents all non-space characters. - - -

-The definitions of letter, space, and other character groups -depend on the current locale. -In particular, the class [a-z] may not be equivalent to %l. - - - - - -

Pattern Item:

-A pattern item can be - -

    - -
  • -a single character class, -which matches any single character in the class; -
  • - -
  • -a single character class followed by '*', -which matches sequences of zero or more characters in the class. -These repetition items will always match the longest possible sequence; -
  • - -
  • -a single character class followed by '+', -which matches sequences of one or more characters in the class. -These repetition items will always match the longest possible sequence; -
  • - -
  • -a single character class followed by '-', -which also matches sequences of zero or more characters in the class. -Unlike '*', -these repetition items will always match the shortest possible sequence; -
  • - -
  • -a single character class followed by '?', -which matches zero or one occurrence of a character in the class. -It always matches one occurrence if possible; -
  • - -
  • -%n, for n between 1 and 9; -such item matches a substring equal to the n-th captured string -(see below); -
  • - -
  • -%bxy, where x and y are two distinct characters; -such item matches strings that start with x, end with y, -and where the x and y are balanced. -This means that, if one reads the string from left to right, -counting +1 for an x and -1 for a y, -the ending y is the first y where the count reaches 0. -For instance, the item %b() matches expressions with -balanced parentheses. -
  • - -
  • -%f[set], a frontier pattern; -such item matches an empty string at any position such that -the next character belongs to set -and the previous character does not belong to set. -The set set is interpreted as previously described. -The beginning and the end of the subject are handled as if -they were the character '\0'. -
  • - -
- - - - -

Pattern:

-A pattern is a sequence of pattern items. -A caret '^' at the beginning of a pattern anchors the match at the -beginning of the subject string. -A '$' at the end of a pattern anchors the match at the -end of the subject string. -At other positions, -'^' and '$' have no special meaning and represent themselves. - - - - - -

Captures:

-A pattern can contain sub-patterns enclosed in parentheses; -they describe captures. -When a match succeeds, the substrings of the subject string -that match captures are stored (captured) for future use. -Captures are numbered according to their left parentheses. -For instance, in the pattern "(a*(.)%w(%s*))", -the part of the string matching "a*(.)%w(%s*)" is -stored as the first capture, and therefore has number 1; -the character matching "." is captured with number 2, -and the part matching "%s*" has number 3. - - -

-As a special case, the capture () captures -the current string position (a number). -For instance, if we apply the pattern "()aa()" on the -string "flaaap", there will be two captures: 3 and 5. - - - - - -

Multiple matches:

-The function string.gsub and the iterator string.gmatch -match multiple occurrences of the given pattern in the subject. -For these functions, -a new match is considered valid only -if it ends at least one byte after the end of the previous match. -In other words, the pattern machine never accepts the -empty string as a match immediately after another match. -As an example, -consider the results of the following code: - -

-     > string.gsub("abc", "()a*()", print);
-     --> 1   2
-     --> 3   3
-     --> 4   4
-

-The second and third results come from Lua matching an empty -string after 'b' and another one after 'c'. -Lua does not match an empty string after 'a', -because it would end at the same position of the previous match. - - - - - - - -

6.4.2 – Format Strings for Pack and Unpack

- -

-The first argument to string.pack, -string.packsize, and string.unpack -is a format string, -which describes the layout of the structure being created or read. - - -

-A format string is a sequence of conversion options. -The conversion options are as follows: - -

    -
  • <: sets little endian
  • -
  • >: sets big endian
  • -
  • =: sets native endian
  • -
  • ![n]: sets maximum alignment to n -(default is native alignment)
  • -
  • b: a signed byte (char)
  • -
  • B: an unsigned byte (char)
  • -
  • h: a signed short (native size)
  • -
  • H: an unsigned short (native size)
  • -
  • l: a signed long (native size)
  • -
  • L: an unsigned long (native size)
  • -
  • j: a lua_Integer
  • -
  • J: a lua_Unsigned
  • -
  • T: a size_t (native size)
  • -
  • i[n]: a signed int with n bytes -(default is native size)
  • -
  • I[n]: an unsigned int with n bytes -(default is native size)
  • -
  • f: a float (native size)
  • -
  • d: a double (native size)
  • -
  • n: a lua_Number
  • -
  • cn: a fixed-sized string with n bytes
  • -
  • z: a zero-terminated string
  • -
  • s[n]: a string preceded by its length -coded as an unsigned integer with n bytes -(default is a size_t)
  • -
  • x: one byte of padding
  • -
  • Xop: an empty item that aligns -according to option op -(which is otherwise ignored)
  • -
  • ' ': (space) ignored
  • -

-(A "[n]" means an optional integral numeral.) -Except for padding, spaces, and configurations -(options "xX <=>!"), -each option corresponds to an argument in string.pack -or a result in string.unpack. - - -

-For options "!n", "sn", "in", and "In", -n can be any integer between 1 and 16. -All integral options check overflows; -string.pack checks whether the given value fits in the given size; -string.unpack checks whether the read value fits in a Lua integer. -For the unsigned options, -Lua integers are treated as unsigned values too. - - -

-Any format string starts as if prefixed by "!1=", -that is, -with maximum alignment of 1 (no alignment) -and native endianness. - - -

-Native endianness assumes that the whole system is -either big or little endian. -The packing functions will not emulate correctly the behavior -of mixed-endian formats. - - -

-Alignment works as follows: -For each option, -the format gets extra padding until the data starts -at an offset that is a multiple of the minimum between the -option size and the maximum alignment; -this minimum must be a power of 2. -Options "c" and "z" are not aligned; -option "s" follows the alignment of its starting integer. - - -

-All padding is filled with zeros by string.pack -and ignored by string.unpack. - - - - - - - -

6.5 – UTF-8 Support

- -

-This library provides basic support for UTF-8 encoding. -It provides all its functions inside the table utf8. -This library does not provide any support for Unicode other -than the handling of the encoding. -Any operation that needs the meaning of a character, -such as character classification, is outside its scope. - - -

-Unless stated otherwise, -all functions that expect a byte position as a parameter -assume that the given position is either the start of a byte sequence -or one plus the length of the subject string. -As in the string library, -negative indices count from the end of the string. - - -

-Functions that create byte sequences -accept all values up to 0x7FFFFFFF, -as defined in the original UTF-8 specification; -that implies byte sequences of up to six bytes. - - -

-Functions that interpret byte sequences only accept -valid sequences (well formed and not overlong). -By default, they only accept byte sequences -that result in valid Unicode code points, -rejecting values greater than 10FFFF and surrogates. -A boolean argument lax, when available, -lifts these checks, -so that all values up to 0x7FFFFFFF are accepted. -(Not well formed and overlong sequences are still rejected.) - - -

-


utf8.char (···)

- - -

-Receives zero or more integers, -converts each one to its corresponding UTF-8 byte sequence -and returns a string with the concatenation of all these sequences. - - - - -

-


utf8.charpattern

- - -

-The pattern (a string, not a function) "[\0-\x7F\xC2-\xFD][\x80-\xBF]*" -(see §6.4.1), -which matches exactly one UTF-8 byte sequence, -assuming that the subject is a valid UTF-8 string. - - - - -

-


utf8.codes (s [, lax])

- - -

-Returns values so that the construction - -

-     for p, c in utf8.codes(s) do body end
-

-will iterate over all UTF-8 characters in string s, -with p being the position (in bytes) and c the code point -of each character. -It raises an error if it meets any invalid byte sequence. - - - - -

-


utf8.codepoint (s [, i [, j [, lax]]])

- - -

-Returns the code points (as integers) from all characters in s -that start between byte position i and j (both included). -The default for i is 1 and for j is i. -It raises an error if it meets any invalid byte sequence. - - - - -

-


utf8.len (s [, i [, j [, lax]]])

- - -

-Returns the number of UTF-8 characters in string s -that start between positions i and j (both inclusive). -The default for i is 1 and for j is -1. -If it finds any invalid byte sequence, -returns fail plus the position of the first invalid byte. - - - - -

-


utf8.offset (s, n [, i])

- - -

-Returns the position (in bytes) where the encoding of the -n-th character of s -(counting from position i) starts. -A negative n gets characters before position i. -The default for i is 1 when n is non-negative -and #s + 1 otherwise, -so that utf8.offset(s, -n) gets the offset of the -n-th character from the end of the string. -If the specified character is neither in the subject -nor right after its end, -the function returns fail. - - -

-As a special case, -when n is 0 the function returns the start of the encoding -of the character that contains the i-th byte of s. - - -

-This function assumes that s is a valid UTF-8 string. - - - - - - - -

6.6 – Table Manipulation

- -

-This library provides generic functions for table manipulation. -It provides all its functions inside the table table. - - -

-Remember that, whenever an operation needs the length of a table, -all caveats about the length operator apply (see §3.4.7). -All functions ignore non-numeric keys -in the tables given as arguments. - - -

-


table.concat (list [, sep [, i [, j]]])

- - -

-Given a list where all elements are strings or numbers, -returns the string list[i]..sep..list[i+1] ··· sep..list[j]. -The default value for sep is the empty string, -the default for i is 1, -and the default for j is #list. -If i is greater than j, returns the empty string. - - - - -

-


table.insert (list, [pos,] value)

- - -

-Inserts element value at position pos in list, -shifting up the elements -list[pos], list[pos+1], ···, list[#list]. -The default value for pos is #list+1, -so that a call table.insert(t,x) inserts x at the end -of the list t. - - - - -

-


table.move (a1, f, e, t [,a2])

- - -

-Moves elements from the table a1 to the table a2, -performing the equivalent to the following -multiple assignment: -a2[t],··· = a1[f],···,a1[e]. -The default for a2 is a1. -The destination range can overlap with the source range. -The number of elements to be moved must fit in a Lua integer. - - -

-Returns the destination table a2. - - - - -

-


table.pack (···)

- - -

-Returns a new table with all arguments stored into keys 1, 2, etc. -and with a field "n" with the total number of arguments. -Note that the resulting table may not be a sequence, -if some arguments are nil. - - - - -

-


table.remove (list [, pos])

- - -

-Removes from list the element at position pos, -returning the value of the removed element. -When pos is an integer between 1 and #list, -it shifts down the elements -list[pos+1], list[pos+2], ···, list[#list] -and erases element list[#list]; -The index pos can also be 0 when #list is 0, -or #list + 1. - - -

-The default value for pos is #list, -so that a call table.remove(l) removes the last element -of the list l. - - - - -

-


table.sort (list [, comp])

- - -

-Sorts the list elements in a given order, in-place, -from list[1] to list[#list]. -If comp is given, -then it must be a function that receives two list elements -and returns true when the first element must come -before the second in the final order, -so that, after the sort, -i <= j implies not comp(list[j],list[i]). -If comp is not given, -then the standard Lua operator < is used instead. - - -

-The comp function must define a consistent order; -more formally, the function must define a strict weak order. -(A weak order is similar to a total order, -but it can equate different elements for comparison purposes.) - - -

-The sort algorithm is not stable: -Different elements considered equal by the given order -may have their relative positions changed by the sort. - - - - -

-


table.unpack (list [, i [, j]])

- - -

-Returns the elements from the given list. -This function is equivalent to - -

-     return list[i], list[i+1], ···, list[j]
-

-By default, i is 1 and j is #list. - - - - - - - -

6.7 – Mathematical Functions

- -

-This library provides basic mathematical functions. -It provides all its functions and constants inside the table math. -Functions with the annotation "integer/float" give -integer results for integer arguments -and float results for non-integer arguments. -The rounding functions -math.ceil, math.floor, and math.modf -return an integer when the result fits in the range of an integer, -or a float otherwise. - - -

-


math.abs (x)

- - -

-Returns the maximum value between x and -x. (integer/float) - - - - -

-


math.acos (x)

- - -

-Returns the arc cosine of x (in radians). - - - - -

-


math.asin (x)

- - -

-Returns the arc sine of x (in radians). - - - - -

-


math.atan (y [, x])

- - -

- -Returns the arc tangent of y/x (in radians), -using the signs of both arguments to find the -quadrant of the result. -It also handles correctly the case of x being zero. - - -

-The default value for x is 1, -so that the call math.atan(y) -returns the arc tangent of y. - - - - -

-


math.ceil (x)

- - -

-Returns the smallest integral value greater than or equal to x. - - - - -

-


math.cos (x)

- - -

-Returns the cosine of x (assumed to be in radians). - - - - -

-


math.deg (x)

- - -

-Converts the angle x from radians to degrees. - - - - -

-


math.exp (x)

- - -

-Returns the value ex -(where e is the base of natural logarithms). - - - - -

-


math.floor (x)

- - -

-Returns the largest integral value less than or equal to x. - - - - -

-


math.fmod (x, y)

- - -

-Returns the remainder of the division of x by y -that rounds the quotient towards zero. (integer/float) - - - - -

-


math.huge

- - -

-The float value HUGE_VAL, -a value greater than any other numeric value. - - - - -

-


math.log (x [, base])

- - -

-Returns the logarithm of x in the given base. -The default for base is e -(so that the function returns the natural logarithm of x). - - - - -

-


math.max (x, ···)

- - -

-Returns the argument with the maximum value, -according to the Lua operator <. - - - - -

-


math.maxinteger

-An integer with the maximum value for an integer. - - - - -

-


math.min (x, ···)

- - -

-Returns the argument with the minimum value, -according to the Lua operator <. - - - - -

-


math.mininteger

-An integer with the minimum value for an integer. - - - - -

-


math.modf (x)

- - -

-Returns the integral part of x and the fractional part of x. -Its second result is always a float. - - - - -

-


math.pi

- - -

-The value of π. - - - - -

-


math.rad (x)

- - -

-Converts the angle x from degrees to radians. - - - - -

-


math.random ([m [, n]])

- - -

-When called without arguments, -returns a pseudo-random float with uniform distribution -in the range [0,1). -When called with two integers m and n, -math.random returns a pseudo-random integer -with uniform distribution in the range [m, n]. -The call math.random(n), for a positive n, -is equivalent to math.random(1,n). -The call math.random(0) produces an integer with -all bits (pseudo)random. - - -

-This function uses the xoshiro256** algorithm to produce -pseudo-random 64-bit integers, -which are the results of calls with argument 0. -Other results (ranges and floats) -are unbiased extracted from these integers. - - -

-Lua initializes its pseudo-random generator with the equivalent of -a call to math.randomseed with no arguments, -so that math.random should generate -different sequences of results each time the program runs. - - - - -

-


math.randomseed ([x [, y]])

- - -

-When called with at least one argument, -the integer parameters x and y are -joined into a 128-bit seed that -is used to reinitialize the pseudo-random generator; -equal seeds produce equal sequences of numbers. -The default for y is zero. - - -

-When called with no arguments, -Lua generates a seed with -a weak attempt for randomness. - - -

-This function returns the two seed components -that were effectively used, -so that setting them again repeats the sequence. - - -

-To ensure a required level of randomness to the initial state -(or contrarily, to have a deterministic sequence, -for instance when debugging a program), -you should call math.randomseed with explicit arguments. - - - - -

-


math.sin (x)

- - -

-Returns the sine of x (assumed to be in radians). - - - - -

-


math.sqrt (x)

- - -

-Returns the square root of x. -(You can also use the expression x^0.5 to compute this value.) - - - - -

-


math.tan (x)

- - -

-Returns the tangent of x (assumed to be in radians). - - - - -

-


math.tointeger (x)

- - -

-If the value x is convertible to an integer, -returns that integer. -Otherwise, returns fail. - - - - -

-


math.type (x)

- - -

-Returns "integer" if x is an integer, -"float" if it is a float, -or fail if x is not a number. - - - - -

-


math.ult (m, n)

- - -

-Returns a boolean, -true if and only if integer m is below integer n when -they are compared as unsigned integers. - - - - - - - -

6.8 – Input and Output Facilities

- -

-The I/O library provides two different styles for file manipulation. -The first one uses implicit file handles; -that is, there are operations to set a default input file and a -default output file, -and all input/output operations are done over these default files. -The second style uses explicit file handles. - - -

-When using implicit file handles, -all operations are supplied by table io. -When using explicit file handles, -the operation io.open returns a file handle -and then all operations are supplied as methods of the file handle. - - -

-The metatable for file handles provides metamethods -for __gc and __close that try -to close the file when called. - - -

-The table io also provides -three predefined file handles with their usual meanings from C: -io.stdin, io.stdout, and io.stderr. -The I/O library never closes these files. - - -

-Unless otherwise stated, -all I/O functions return fail on failure, -plus an error message as a second result and -a system-dependent error code as a third result, -and some non-false value on success. -On non-POSIX systems, -the computation of the error message and error code -in case of errors -may be not thread safe, -because they rely on the global C variable errno. - - -

-


io.close ([file])

- - -

-Equivalent to file:close(). -Without a file, closes the default output file. - - - - -

-


io.flush ()

- - -

-Equivalent to io.output():flush(). - - - - -

-


io.input ([file])

- - -

-When called with a file name, it opens the named file (in text mode), -and sets its handle as the default input file. -When called with a file handle, -it simply sets this file handle as the default input file. -When called without arguments, -it returns the current default input file. - - -

-In case of errors this function raises the error, -instead of returning an error code. - - - - -

-


io.lines ([filename, ···])

- - -

-Opens the given file name in read mode -and returns an iterator function that -works like file:lines(···) over the opened file. -When the iterator function fails to read any value, -it automatically closes the file. -Besides the iterator function, -io.lines returns three other values: -two nil values as placeholders, -plus the created file handle. -Therefore, when used in a generic for loop, -the file is closed also if the loop is interrupted by an -error or a break. - - -

-The call io.lines() (with no file name) is equivalent -to io.input():lines("l"); -that is, it iterates over the lines of the default input file. -In this case, the iterator does not close the file when the loop ends. - - -

-In case of errors opening the file, -this function raises the error, -instead of returning an error code. - - - - -

-


io.open (filename [, mode])

- - -

-This function opens a file, -in the mode specified in the string mode. -In case of success, -it returns a new file handle. - - -

-The mode string can be any of the following: - -

    -
  • "r": read mode (the default);
  • -
  • "w": write mode;
  • -
  • "a": append mode;
  • -
  • "r+": update mode, all previous data is preserved;
  • -
  • "w+": update mode, all previous data is erased;
  • -
  • "a+": append update mode, previous data is preserved, - writing is only allowed at the end of file.
  • -

-The mode string can also have a 'b' at the end, -which is needed in some systems to open the file in binary mode. - - - - -

-


io.output ([file])

- - -

-Similar to io.input, but operates over the default output file. - - - - -

-


io.popen (prog [, mode])

- - -

-This function is system dependent and is not available -on all platforms. - - -

-Starts the program prog in a separated process and returns -a file handle that you can use to read data from this program -(if mode is "r", the default) -or to write data to this program -(if mode is "w"). - - - - -

-


io.read (···)

- - -

-Equivalent to io.input():read(···). - - - - -

-


io.tmpfile ()

- - -

-In case of success, -returns a handle for a temporary file. -This file is opened in update mode -and it is automatically removed when the program ends. - - - - -

-


io.type (obj)

- - -

-Checks whether obj is a valid file handle. -Returns the string "file" if obj is an open file handle, -"closed file" if obj is a closed file handle, -or fail if obj is not a file handle. - - - - -

-


io.write (···)

- - -

-Equivalent to io.output():write(···). - - - - -

-


file:close ()

- - -

-Closes file. -Note that files are automatically closed when -their handles are garbage collected, -but that takes an unpredictable amount of time to happen. - - -

-When closing a file handle created with io.popen, -file:close returns the same values -returned by os.execute. - - - - -

-


file:flush ()

- - -

-Saves any written data to file. - - - - -

-


file:lines (···)

- - -

-Returns an iterator function that, -each time it is called, -reads the file according to the given formats. -When no format is given, -uses "l" as a default. -As an example, the construction - -

-     for c in file:lines(1) do body end
-

-will iterate over all characters of the file, -starting at the current position. -Unlike io.lines, this function does not close the file -when the loop ends. - - - - -

-


file:read (···)

- - -

-Reads the file file, -according to the given formats, which specify what to read. -For each format, -the function returns a string or a number with the characters read, -or fail if it cannot read data with the specified format. -(In this latter case, -the function does not read subsequent formats.) -When called without arguments, -it uses a default format that reads the next line -(see below). - - -

-The available formats are - -

    - -
  • "n": -reads a numeral and returns it as a float or an integer, -following the lexical conventions of Lua. -(The numeral may have leading whitespaces and a sign.) -This format always reads the longest input sequence that -is a valid prefix for a numeral; -if that prefix does not form a valid numeral -(e.g., an empty string, "0x", or "3.4e-") -or it is too long (more than 200 characters), -it is discarded and the format returns fail. -
  • - -
  • "a": -reads the whole file, starting at the current position. -On end of file, it returns the empty string; -this format never fails. -
  • - -
  • "l": -reads the next line skipping the end of line, -returning fail on end of file. -This is the default format. -
  • - -
  • "L": -reads the next line keeping the end-of-line character (if present), -returning fail on end of file. -
  • - -
  • number: -reads a string with up to this number of bytes, -returning fail on end of file. -If number is zero, -it reads nothing and returns an empty string, -or fail on end of file. -
  • - -

-The formats "l" and "L" should be used only for text files. - - - - -

-


file:seek ([whence [, offset]])

- - -

-Sets and gets the file position, -measured from the beginning of the file, -to the position given by offset plus a base -specified by the string whence, as follows: - -

    -
  • "set": base is position 0 (beginning of the file);
  • -
  • "cur": base is current position;
  • -
  • "end": base is end of file;
  • -

-In case of success, seek returns the final file position, -measured in bytes from the beginning of the file. -If seek fails, it returns fail, -plus a string describing the error. - - -

-The default value for whence is "cur", -and for offset is 0. -Therefore, the call file:seek() returns the current -file position, without changing it; -the call file:seek("set") sets the position to the -beginning of the file (and returns 0); -and the call file:seek("end") sets the position to the -end of the file, and returns its size. - - - - -

-


file:setvbuf (mode [, size])

- - -

-Sets the buffering mode for a file. -There are three available modes: - -

    -
  • "no": no buffering.
  • -
  • "full": full buffering.
  • -
  • "line": line buffering.
  • -
- -

-For the last two cases, -size is a hint for the size of the buffer, in bytes. -The default is an appropriate size. - - -

-The specific behavior of each mode is non portable; -check the underlying ISO C function setvbuf in your platform for -more details. - - - - -

-


file:write (···)

- - -

-Writes the value of each of its arguments to file. -The arguments must be strings or numbers. - - -

-In case of success, this function returns file. - - - - - - - -

6.9 – Operating System Facilities

- -

-This library is implemented through table os. - - -

-


os.clock ()

- - -

-Returns an approximation of the amount in seconds of CPU time -used by the program, -as returned by the underlying ISO C function clock. - - - - -

-


os.date ([format [, time]])

- - -

-Returns a string or a table containing date and time, -formatted according to the given string format. - - -

-If the time argument is present, -this is the time to be formatted -(see the os.time function for a description of this value). -Otherwise, date formats the current time. - - -

-If format starts with '!', -then the date is formatted in Coordinated Universal Time. -After this optional character, -if format is the string "*t", -then date returns a table with the following fields: -year, month (1–12), day (1–31), -hour (0–23), min (0–59), -sec (0–61, due to leap seconds), -wday (weekday, 1–7, Sunday is 1), -yday (day of the year, 1–366), -and isdst (daylight saving flag, a boolean). -This last field may be absent -if the information is not available. - - -

-If format is not "*t", -then date returns the date as a string, -formatted according to the same rules as the ISO C function strftime. - - -

-If format is absent, it defaults to "%c", -which gives a human-readable date and time representation -using the current locale. - - -

-On non-POSIX systems, -this function may be not thread safe -because of its reliance on C function gmtime and C function localtime. - - - - -

-


os.difftime (t2, t1)

- - -

-Returns the difference, in seconds, -from time t1 to time t2 -(where the times are values returned by os.time). -In POSIX, Windows, and some other systems, -this value is exactly t2-t1. - - - - -

-


os.execute ([command])

- - -

-This function is equivalent to the ISO C function system. -It passes command to be executed by an operating system shell. -Its first result is true -if the command terminated successfully, -or fail otherwise. -After this first result -the function returns a string plus a number, -as follows: - -

    - -
  • "exit": -the command terminated normally; -the following number is the exit status of the command. -
  • - -
  • "signal": -the command was terminated by a signal; -the following number is the signal that terminated the command. -
  • - -
- -

-When called without a command, -os.execute returns a boolean that is true if a shell is available. - - - - -

-


os.exit ([code [, close]])

- - -

-Calls the ISO C function exit to terminate the host program. -If code is true, -the returned status is EXIT_SUCCESS; -if code is false, -the returned status is EXIT_FAILURE; -if code is a number, -the returned status is this number. -The default value for code is true. - - -

-If the optional second argument close is true, -the function closes the Lua state before exiting (see lua_close). - - - - -

-


os.getenv (varname)

- - -

-Returns the value of the process environment variable varname -or fail if the variable is not defined. - - - - -

-


os.remove (filename)

- - -

-Deletes the file (or empty directory, on POSIX systems) -with the given name. -If this function fails, it returns fail -plus a string describing the error and the error code. -Otherwise, it returns true. - - - - -

-


os.rename (oldname, newname)

- - -

-Renames the file or directory named oldname to newname. -If this function fails, it returns fail, -plus a string describing the error and the error code. -Otherwise, it returns true. - - - - -

-


os.setlocale (locale [, category])

- - -

-Sets the current locale of the program. -locale is a system-dependent string specifying a locale; -category is an optional string describing which category to change: -"all", "collate", "ctype", -"monetary", "numeric", or "time"; -the default category is "all". -The function returns the name of the new locale, -or fail if the request cannot be honored. - - -

-If locale is the empty string, -the current locale is set to an implementation-defined native locale. -If locale is the string "C", -the current locale is set to the standard C locale. - - -

-When called with nil as the first argument, -this function only returns the name of the current locale -for the given category. - - -

-This function may be not thread safe -because of its reliance on C function setlocale. - - - - -

-


os.time ([table])

- - -

-Returns the current time when called without arguments, -or a time representing the local date and time specified by the given table. -This table must have fields year, month, and day, -and may have fields -hour (default is 12), -min (default is 0), -sec (default is 0), -and isdst (default is nil). -Other fields are ignored. -For a description of these fields, see the os.date function. - - -

-When the function is called, -the values in these fields do not need to be inside their valid ranges. -For instance, if sec is -10, -it means 10 seconds before the time specified by the other fields; -if hour is 1000, -it means 1000 hours after the time specified by the other fields. - - -

-The returned value is a number, whose meaning depends on your system. -In POSIX, Windows, and some other systems, -this number counts the number -of seconds since some given start time (the "epoch"). -In other systems, the meaning is not specified, -and the number returned by time can be used only as an argument to -os.date and os.difftime. - - -

-When called with a table, -os.time also normalizes all the fields -documented in the os.date function, -so that they represent the same time as before the call -but with values inside their valid ranges. - - - - -

-


os.tmpname ()

- - -

-Returns a string with a file name that can -be used for a temporary file. -The file must be explicitly opened before its use -and explicitly removed when no longer needed. - - -

-In POSIX systems, -this function also creates a file with that name, -to avoid security risks. -(Someone else might create the file with wrong permissions -in the time between getting the name and creating the file.) -You still have to open the file to use it -and to remove it (even if you do not use it). - - -

-When possible, -you may prefer to use io.tmpfile, -which automatically removes the file when the program ends. - - - - - - - -

6.10 – The Debug Library

- -

-This library provides -the functionality of the debug interface (§4.7) to Lua programs. -You should exert care when using this library. -Several of its functions -violate basic assumptions about Lua code -(e.g., that variables local to a function -cannot be accessed from outside; -that userdata metatables cannot be changed by Lua code; -that Lua programs do not crash) -and therefore can compromise otherwise secure code. -Moreover, some functions in this library may be slow. - - -

-All functions in this library are provided -inside the debug table. -All functions that operate over a thread -have an optional first argument which is the -thread to operate over. -The default is always the current thread. - - -

-


debug.debug ()

- - -

-Enters an interactive mode with the user, -running each string that the user enters. -Using simple commands and other debug facilities, -the user can inspect global and local variables, -change their values, evaluate expressions, and so on. -A line containing only the word cont finishes this function, -so that the caller continues its execution. - - -

-Note that commands for debug.debug are not lexically nested -within any function and so have no direct access to local variables. - - - - -

-


debug.gethook ([thread])

- - -

-Returns the current hook settings of the thread, as three values: -the current hook function, the current hook mask, -and the current hook count, -as set by the debug.sethook function. - - -

-Returns fail if there is no active hook. - - - - -

-


debug.getinfo ([thread,] f [, what])

- - -

-Returns a table with information about a function. -You can give the function directly -or you can give a number as the value of f, -which means the function running at level f of the call stack -of the given thread: -level 0 is the current function (getinfo itself); -level 1 is the function that called getinfo -(except for tail calls, which do not count in the stack); -and so on. -If f is a number greater than the number of active functions, -then getinfo returns fail. - - -

-The returned table can contain all the fields returned by lua_getinfo, -with the string what describing which fields to fill in. -The default for what is to get all information available, -except the table of valid lines. -The option 'f' -adds a field named func with the function itself. -The option 'L' adds a field named activelines -with the table of valid lines, -provided the function is a Lua function. -If the function has no debug information, -the table is empty. - - -

-For instance, the expression debug.getinfo(1,"n").name returns -a name for the current function, -if a reasonable name can be found, -and the expression debug.getinfo(print) -returns a table with all available information -about the print function. - - - - -

-


debug.getlocal ([thread,] f, local)

- - -

-This function returns the name and the value of the local variable -with index local of the function at level f of the stack. -This function accesses not only explicit local variables, -but also parameters and temporary values. - - -

-The first parameter or local variable has index 1, and so on, -following the order that they are declared in the code, -counting only the variables that are active -in the current scope of the function. -Compile-time constants may not appear in this listing, -if they were optimized away by the compiler. -Negative indices refer to vararg arguments; --1 is the first vararg argument. -The function returns fail -if there is no variable with the given index, -and raises an error when called with a level out of range. -(You can call debug.getinfo to check whether the level is valid.) - - -

-Variable names starting with '(' (open parenthesis) -represent variables with no known names -(internal variables such as loop control variables, -and variables from chunks saved without debug information). - - -

-The parameter f may also be a function. -In that case, getlocal returns only the name of function parameters. - - - - -

-


debug.getmetatable (value)

- - -

-Returns the metatable of the given value -or nil if it does not have a metatable. - - - - -

-


debug.getregistry ()

- - -

-Returns the registry table (see §4.3). - - - - -

-


debug.getupvalue (f, up)

- - -

-This function returns the name and the value of the upvalue -with index up of the function f. -The function returns fail -if there is no upvalue with the given index. - - -

-(For Lua functions, -upvalues are the external local variables that the function uses, -and that are consequently included in its closure.) - - -

-For C functions, this function uses the empty string "" -as a name for all upvalues. - - -

-Variable name '?' (interrogation mark) -represents variables with no known names -(variables from chunks saved without debug information). - - - - -

-


debug.getuservalue (u, n)

- - -

-Returns the n-th user value associated -to the userdata u plus a boolean, -false if the userdata does not have that value. - - - - -

-


debug.sethook ([thread,] hook, mask [, count])

- - -

-Sets the given function as the debug hook. -The string mask and the number count describe -when the hook will be called. -The string mask may have any combination of the following characters, -with the given meaning: - -

    -
  • 'c': the hook is called every time Lua calls a function;
  • -
  • 'r': the hook is called every time Lua returns from a function;
  • -
  • 'l': the hook is called every time Lua enters a new line of code.
  • -

-Moreover, -with a count different from zero, -the hook is called also after every count instructions. - - -

-When called without arguments, -debug.sethook turns off the hook. - - -

-When the hook is called, its first parameter is a string -describing the event that has triggered its call: -"call", "tail call", "return", -"line", and "count". -For line events, -the hook also gets the new line number as its second parameter. -Inside a hook, -you can call getinfo with level 2 to get more information about -the running function. -(Level 0 is the getinfo function, -and level 1 is the hook function.) - - - - -

-


debug.setlocal ([thread,] level, local, value)

- - -

-This function assigns the value value to the local variable -with index local of the function at level level of the stack. -The function returns fail if there is no local -variable with the given index, -and raises an error when called with a level out of range. -(You can call getinfo to check whether the level is valid.) -Otherwise, it returns the name of the local variable. - - -

-See debug.getlocal for more information about -variable indices and names. - - - - -

-


debug.setmetatable (value, table)

- - -

-Sets the metatable for the given value to the given table -(which can be nil). -Returns value. - - - - -

-


debug.setupvalue (f, up, value)

- - -

-This function assigns the value value to the upvalue -with index up of the function f. -The function returns fail if there is no upvalue -with the given index. -Otherwise, it returns the name of the upvalue. - - -

-See debug.getupvalue for more information about upvalues. - - - - -

-


debug.setuservalue (udata, value, n)

- - -

-Sets the given value as -the n-th user value associated to the given udata. -udata must be a full userdata. - - -

-Returns udata, -or fail if the userdata does not have that value. - - - - -

-


debug.traceback ([thread,] [message [, level]])

- - -

-If message is present but is neither a string nor nil, -this function returns message without further processing. -Otherwise, -it returns a string with a traceback of the call stack. -The optional message string is appended -at the beginning of the traceback. -An optional level number tells at which level -to start the traceback -(default is 1, the function calling traceback). - - - - -

-


debug.upvalueid (f, n)

- - -

-Returns a unique identifier (as a light userdata) -for the upvalue numbered n -from the given function. - - -

-These unique identifiers allow a program to check whether different -closures share upvalues. -Lua closures that share an upvalue -(that is, that access a same external local variable) -will return identical ids for those upvalue indices. - - - - -

-


debug.upvaluejoin (f1, n1, f2, n2)

- - -

-Make the n1-th upvalue of the Lua closure f1 -refer to the n2-th upvalue of the Lua closure f2. - - - - - - - -

7 – Lua Standalone

- -

-Although Lua has been designed as an extension language, -to be embedded in a host C program, -it is also frequently used as a standalone language. -An interpreter for Lua as a standalone language, -called simply lua, -is provided with the standard distribution. -The standalone interpreter includes -all standard libraries. -Its usage is: - -

-     lua [options] [script [args]]
-

-The options are: - -

    -
  • -e stat: execute string stat;
  • -
  • -i: enter interactive mode after running script;
  • -
  • -l mod: "require" mod and assign the - result to global mod;
  • -
  • -l g=mod: "require" mod and assign the - result to global g;
  • -
  • -v: print version information;
  • -
  • -E: ignore environment variables;
  • -
  • -W: turn warnings on;
  • -
  • --: stop handling options;
  • -
  • -: execute stdin as a file and stop handling options.
  • -

-(The form -l g=mod was introduced in release 5.4.4.) - - -

-After handling its options, lua runs the given script. -When called without arguments, -lua behaves as lua -v -i -when the standard input (stdin) is a terminal, -and as lua - otherwise. - - -

-When called without the option -E, -the interpreter checks for an environment variable LUA_INIT_5_4 -(or LUA_INIT if the versioned name is not defined) -before running any argument. -If the variable content has the format @filename, -then lua executes the file. -Otherwise, lua executes the string itself. - - -

-When called with the option -E, -Lua does not consult any environment variables. -In particular, -the values of package.path and package.cpath -are set with the default paths defined in luaconf.h. -To signal to the libraries that this option is on, -the stand-alone interpreter sets the field -"LUA_NOENV" in the registry to a true value. -Other libraries may consult this field for the same purpose. - - -

-The options -e, -l, and -W are handled in -the order they appear. -For instance, an invocation like - -

-     $ lua -e 'a=1' -llib1 script.lua
-

-will first set a to 1, then require the library lib1, -and finally run the file script.lua with no arguments. -(Here $ is the shell prompt. Your prompt may be different.) - - -

-Before running any code, -lua collects all command-line arguments -in a global table called arg. -The script name goes to index 0, -the first argument after the script name goes to index 1, -and so on. -Any arguments before the script name -(that is, the interpreter name plus its options) -go to negative indices. -For instance, in the call - -

-     $ lua -la b.lua t1 t2
-

-the table is like this: - -

-     arg = { [-2] = "lua", [-1] = "-la",
-             [0] = "b.lua",
-             [1] = "t1", [2] = "t2" }
-

-If there is no script in the call, -the interpreter name goes to index 0, -followed by the other arguments. -For instance, the call - -

-     $ lua -e "print(arg[1])"
-

-will print "-e". -If there is a script, -the script is called with arguments -arg[1], ···, arg[#arg]. -Like all chunks in Lua, -the script is compiled as a variadic function. - - -

-In interactive mode, -Lua repeatedly prompts and waits for a line. -After reading a line, -Lua first try to interpret the line as an expression. -If it succeeds, it prints its value. -Otherwise, it interprets the line as a statement. -If you write an incomplete statement, -the interpreter waits for its completion -by issuing a different prompt. - - -

-If the global variable _PROMPT contains a string, -then its value is used as the prompt. -Similarly, if the global variable _PROMPT2 contains a string, -its value is used as the secondary prompt -(issued during incomplete statements). - - -

-In case of unprotected errors in the script, -the interpreter reports the error to the standard error stream. -If the error object is not a string but -has a metamethod __tostring, -the interpreter calls this metamethod to produce the final message. -Otherwise, the interpreter converts the error object to a string -and adds a stack traceback to it. -When warnings are on, -they are simply printed in the standard error output. - - -

-When finishing normally, -the interpreter closes its main Lua state -(see lua_close). -The script can avoid this step by -calling os.exit to terminate. - - -

-To allow the use of Lua as a -script interpreter in Unix systems, -Lua skips the first line of a file chunk if it starts with #. -Therefore, Lua scripts can be made into executable programs -by using chmod +x and the #! form, -as in - -

-     #!/usr/local/bin/lua
-

-Of course, -the location of the Lua interpreter may be different in your machine. -If lua is in your PATH, -then - -

-     #!/usr/bin/env lua
-

-is a more portable solution. - - - -

8 – Incompatibilities with the Previous Version

- - - -

-Here we list the incompatibilities that you may find when moving a program -from Lua 5.3 to Lua 5.4. - - -

-You can avoid some incompatibilities by compiling Lua with -appropriate options (see file luaconf.h). -However, -all these compatibility options will be removed in the future. -More often than not, -compatibility issues arise when these compatibility options -are removed. -So, whenever you have the chance, -you should try to test your code with a version of Lua compiled -with all compatibility options turned off. -That will ease transitions to newer versions of Lua. - - -

-Lua versions can always change the C API in ways that -do not imply source-code changes in a program, -such as the numeric values for constants -or the implementation of functions as macros. -Therefore, -you should never assume that binaries are compatible between -different Lua versions. -Always recompile clients of the Lua API when -using a new version. - - -

-Similarly, Lua versions can always change the internal representation -of precompiled chunks; -precompiled chunks are not compatible between different Lua versions. - - -

-The standard paths in the official distribution may -change between versions. - - - - - -

8.1 – Incompatibilities in the Language

-
    - -
  • -The coercion of strings to numbers in -arithmetic and bitwise operations -has been removed from the core language. -The string library does a similar job -for arithmetic (but not for bitwise) operations -using the string metamethods. -However, unlike in previous versions, -the new implementation preserves the implicit type of the numeral -in the string. -For instance, the result of "1" + "2" now is an integer, -not a float. -
  • - -
  • -Literal decimal integer constants that overflow are read as floats, -instead of wrapping around. -You can use hexadecimal notation for such constants if you -want the old behavior -(reading them as integers with wrap around). -
  • - -
  • -The use of the __lt metamethod to emulate __le -has been removed. -When needed, this metamethod must be explicitly defined. -
  • - -
  • -The semantics of the numerical for loop -over integers changed in some details. -In particular, the control variable never wraps around. -
  • - -
  • -A label for a goto cannot be declared where a label with the same -name is visible, even if this other label is declared in an enclosing -block. -
  • - -
  • -When finalizing an object, -Lua does not ignore __gc metamethods that are not functions. -Any value will be called, if present. -(Non-callable values will generate a warning, -like any other error when calling a finalizer.) -
  • - -
- - - - -

8.2 – Incompatibilities in the Libraries

-
    - -
  • -The function print does not call tostring -to format its arguments; -instead, it has this functionality hardwired. -You should use __tostring to modify how values are printed. -
  • - -
  • -The pseudo-random number generator used by the function math.random -now starts with a somewhat random seed. -Moreover, it uses a different algorithm. -
  • - -
  • -By default, the decoding functions in the utf8 library -do not accept surrogates as valid code points. -An extra parameter in these functions makes them more permissive. -
  • - -
  • -The options "setpause" and "setstepmul" -of the function collectgarbage are deprecated. -You should use the new option "incremental" to set them. -
  • - -
  • -The function io.lines now returns four values, -instead of just one. -That can be a problem when it is used as the sole -argument to another function that has optional parameters, -such as in load(io.lines(filename, "L")). -To fix that issue, -you can wrap the call into parentheses, -to adjust its number of results to one. -
  • - -
- - - - -

8.3 – Incompatibilities in the API

- - -
    - -
  • -Full userdata now has an arbitrary number of associated user values. -Therefore, the functions lua_newuserdata, -lua_setuservalue, and lua_getuservalue were -replaced by lua_newuserdatauv, -lua_setiuservalue, and lua_getiuservalue, -which have an extra argument. - - -

    -For compatibility, the old names still work as macros assuming -one single user value. -Note, however, that userdata with zero user values -are more efficient memory-wise. -

  • - -
  • -The function lua_resume has an extra parameter. -This out parameter returns the number of values on -the top of the stack that were yielded or returned by the coroutine. -(In previous versions, -those values were the entire stack.) -
  • - -
  • -The function lua_version returns the version number, -instead of an address of the version number. -The Lua core should work correctly with libraries using their -own static copies of the same core, -so there is no need to check whether they are using the same -address space. -
  • - -
  • -The constant LUA_ERRGCMM was removed. -Errors in finalizers are never propagated; -instead, they generate a warning. -
  • - -
  • -The options LUA_GCSETPAUSE and LUA_GCSETSTEPMUL -of the function lua_gc are deprecated. -You should use the new option LUA_GCINC to set them. -
  • - -
- - - - -

9 – The Complete Syntax of Lua

- -

-Here is the complete syntax of Lua in extended BNF. -As usual in extended BNF, -{A} means 0 or more As, -and [A] means an optional A. -(For operator precedences, see §3.4.8; -for a description of the terminals -Name, Numeral, -and LiteralString, see §3.1.) - - - - -

-
-	chunk ::= block
-
-	block ::= {stat} [retstat]
-
-	stat ::=  ‘;’ | 
-		 varlist ‘=’ explist | 
-		 functioncall | 
-		 label | 
-		 break | 
-		 goto Name | 
-		 do block end | 
-		 while exp do block end | 
-		 repeat block until exp | 
-		 if exp then block {elseif exp then block} [else block] end | 
-		 for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | 
-		 for namelist in explist do block end | 
-		 function funcname funcbody | 
-		 local function Name funcbody | 
-		 local attnamelist [‘=’ explist] 
-
-	attnamelist ::=  Name attrib {‘,’ Name attrib}
-
-	attrib ::= [‘<’ Name ‘>’]
-
-	retstat ::= return [explist] [‘;’]
-
-	label ::= ‘::’ Name ‘::’
-
-	funcname ::= Name {‘.’ Name} [‘:’ Name]
-
-	varlist ::= var {‘,’ var}
-
-	var ::=  Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 
-
-	namelist ::= Name {‘,’ Name}
-
-	explist ::= exp {‘,’ exp}
-
-	exp ::=  nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | 
-		 prefixexp | tableconstructor | exp binop exp | unop exp 
-
-	prefixexp ::= var | functioncall | ‘(’ exp ‘)’
-
-	functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 
-
-	args ::=  ‘(’ [explist] ‘)’ | tableconstructor | LiteralString 
-
-	functiondef ::= function funcbody
-
-	funcbody ::= ‘(’ [parlist] ‘)’ block end
-
-	parlist ::= namelist [‘,’ ‘...’] | ‘...’
-
-	tableconstructor ::= ‘{’ [fieldlist] ‘}’
-
-	fieldlist ::= field {fieldsep field} [fieldsep]
-
-	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
-
-	fieldsep ::= ‘,’ | ‘;’
-
-	binop ::=  ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘//’ | ‘^’ | ‘%’ | 
-		 ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ | 
-		 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | 
-		 and | or
-
-	unop ::= ‘-’ | not | ‘#’ | ‘~’
-
-
- -

- - - - - - -

- - - - diff --git a/lua-5.4.7/doc/readme.html b/lua-5.4.7/doc/readme.html deleted file mode 100644 index 3bcefad..0000000 --- a/lua-5.4.7/doc/readme.html +++ /dev/null @@ -1,339 +0,0 @@ - - - -Lua 5.4 readme - - - - - - - -

-Lua -Welcome to Lua 5.4 -

- - - -

About Lua

-

-Lua is a powerful, efficient, lightweight, embeddable scripting language -developed by a -team -at -PUC-Rio, -the Pontifical Catholic University of Rio de Janeiro in Brazil. -Lua is -free software -used in -many products and projects -around the world. - -

-Lua's -official website -provides complete information -about Lua, -including -an -executive summary, -tips on -getting started, -and -updated -documentation, -especially the -reference manual, -which may differ slightly from the -local copy -distributed in this package. - -

Installing Lua

-

-Lua is distributed in -source -form. -You need to build it before using it. -Building Lua should be straightforward -because -Lua is implemented in pure ANSI C and compiles unmodified in all known -platforms that have an ANSI C compiler. -Lua also compiles unmodified as C++. -The instructions given below for building Lua are for Unix-like platforms, -such as Linux and macOS. -See also -instructions for other systems -and -customization options. - -

-If you don't have the time or the inclination to compile Lua yourself, -get a binary from -LuaBinaries. - -

Building Lua

-

-In most common Unix-like platforms, simply do "make". -Here are the details. - -

    -
  1. -Open a terminal window and move to -the top-level directory, which is named lua-5.4.7. -The Makefile there controls both the build process and the installation process. -

    -

  2. - Do "make". The Makefile will guess your platform and build Lua for it. -

    -

  3. - If the guess failed, do "make help" and see if your platform is listed. - The platforms currently supported are: -

    -

    - guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris -

    -

    - If your platform is listed, just do "make xxx", where xxx - is your platform name. -

    - If your platform is not listed, try the closest one or posix, generic, - c89, in this order. -

    -

  4. -The compilation takes only a few moments -and produces three files in the src directory: -lua (the interpreter), -luac (the compiler), -and liblua.a (the library). -

    -

  5. - To check that Lua has been built correctly, do "make test" - after building Lua. This will run the interpreter and print its version. -
-

-If you're running Linux, try "make linux-readline" to build the interactive Lua interpreter with handy line-editing and history capabilities. -If you get compilation errors, -make sure you have installed the readline development package -(which is probably named libreadline-dev or readline-devel). -If you get link errors after that, -then try "make linux-readline MYLIBS=-ltermcap". - -

Installing Lua

-

- Once you have built Lua, you may want to install it in an official - place in your system. In this case, do "make install". The official - place and the way to install files are defined in the Makefile. You'll - probably need the right permissions to install files, and so may need to do "sudo make install". - -

- To build and install Lua in one step, do "make all install", - or "make xxx install", - where xxx is your platform name. - -

- To install Lua locally after building it, do "make local". - This will create a directory install with subdirectories - bin, include, lib, man, share, - and install Lua as listed below. - - To install Lua locally, but in some other directory, do - "make install INSTALL_TOP=xxx", where xxx is your chosen directory. - The installation starts in the src and doc directories, - so take care if INSTALL_TOP is not an absolute path. - -

-
- bin: -
- lua luac -
- include: -
- lua.h luaconf.h lualib.h lauxlib.h lua.hpp -
- lib: -
- liblua.a -
- man/man1: -
- lua.1 luac.1 -
- -

- These are the only directories you need for development. - If you only want to run Lua programs, - you only need the files in bin and man. - The files in include and lib are needed for - embedding Lua in C or C++ programs. - -

Customization

-

- Three kinds of things can be customized by editing a file: -

    -
  • Where and how to install Lua — edit Makefile. -
  • How to build Lua — edit src/Makefile. -
  • Lua features — edit src/luaconf.h. -
- -

- You don't actually need to edit the Makefiles because you may set the - relevant variables in the command line when invoking make. - Nevertheless, it's probably best to edit and save the Makefiles to - record the changes you've made. - -

- On the other hand, if you need to customize some Lua features, - edit src/luaconf.h before building and installing Lua. - The edited file will be the one installed, and - it will be used by any Lua clients that you build, to ensure consistency. - Further customization is available to experts by editing the Lua sources. - -

Building Lua on other systems

-

- If you're not using the usual Unix tools, then the instructions for - building Lua depend on the compiler you use. You'll need to create - projects (or whatever your compiler uses) for building the library, - the interpreter, and the compiler, as follows: - -

-
-library: -
-lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c -lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c lmathlib.c loadlib.c loslib.c lstrlib.c ltablib.c lutf8lib.c linit.c -
-interpreter: -
- library, lua.c -
-compiler: -
- library, luac.c -
- -

- To use Lua as a library in your own programs, you need to know how to - create and use libraries with your compiler. Moreover, to dynamically load - C libraries for Lua, you'll need to know how to create dynamic libraries - and you'll need to make sure that the Lua API functions are accessible to - those dynamic libraries — but don't link the Lua library - into each dynamic library. For Unix, we recommend that the Lua library - be linked statically into the host program and its symbols exported for - dynamic linking; src/Makefile does this for the Lua interpreter. - For Windows, we recommend that the Lua library be a DLL. - In all cases, the compiler luac should be linked statically. - -

- As mentioned above, you may edit src/luaconf.h to customize - some features before building Lua. - -

Changes since Lua 5.3

-

-Here are the main changes introduced in Lua 5.4. -The -reference manual -lists the -incompatibilities that had to be introduced. - -

Main changes

-
    -
  • new generational mode for garbage collection -
  • to-be-closed variables -
  • const variables -
  • userdata can have multiple user values -
  • new implementation for math.random -
  • warning system -
  • debug information about function arguments and returns -
  • new semantics for the integer 'for' loop -
  • optional 'init' argument to 'string.gmatch' -
  • new functions 'lua_resetthread' and 'coroutine.close' -
  • string-to-number coercions moved to the string library -
  • allocation function allowed to fail when shrinking a memory block -
  • new format '%p' in 'string.format' -
  • utf8 library accepts codepoints up to 2^31 -
- -

License

-

- -[Open Source Initiative Approved License] - -Lua is free software distributed under the terms of the -MIT license -reproduced below; -it may be used for any purpose, including commercial purposes, -at absolutely no cost without having to ask us. - -The only requirement is that if you do use Lua, -then you should give us credit by including the appropriate copyright notice somewhere in your product or its documentation. - -For details, see the -license page. - -

-Copyright © 1994–2024 Lua.org, PUC-Rio. - -

-Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -

-The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -

-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -

-

- -

- - - - diff --git a/lua-5.4.7/src/Makefile b/lua-5.4.7/src/Makefile deleted file mode 100644 index b771196..0000000 --- a/lua-5.4.7/src/Makefile +++ /dev/null @@ -1,225 +0,0 @@ -# Makefile for building Lua -# See ../doc/readme.html for installation and customization instructions. - -# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= - -# Your platform. See PLATS for possible values. -PLAT= guess - -CC= gcc -std=gnu99 -CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_3 $(SYSCFLAGS) $(MYCFLAGS) -LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS) -LIBS= -lm $(SYSLIBS) $(MYLIBS) - -AR= ar rcu -RANLIB= ranlib -RM= rm -f -UNAME= uname - -SYSCFLAGS= -SYSLDFLAGS= -SYSLIBS= - -MYCFLAGS= -MYLDFLAGS= -MYLIBS= -MYOBJS= - -# Special flags for compiler modules; -Os reduces code size. -CMCFLAGS= - -# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= - -PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris - -LUA_A= liblua.a -CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o -LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o -BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS) - -LUA_T= lua -LUA_O= lua.o - -LUAC_T= luac -LUAC_O= luac.o - -ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O) -ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) -ALL_A= $(LUA_A) - -# Targets start here. -default: $(PLAT) - -all: $(ALL_T) - -o: $(ALL_O) - -a: $(ALL_A) - -$(LUA_A): $(BASE_O) - $(AR) $@ $(BASE_O) - $(RANLIB) $@ - -$(LUA_T): $(LUA_O) $(LUA_A) - $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) - -$(LUAC_T): $(LUAC_O) $(LUA_A) - $(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) - -test: - ./$(LUA_T) -v - -clean: - $(RM) $(ALL_T) $(ALL_O) - -depend: - @$(CC) $(CFLAGS) -MM l*.c - -echo: - @echo "PLAT= $(PLAT)" - @echo "CC= $(CC)" - @echo "CFLAGS= $(CFLAGS)" - @echo "LDFLAGS= $(LDFLAGS)" - @echo "LIBS= $(LIBS)" - @echo "AR= $(AR)" - @echo "RANLIB= $(RANLIB)" - @echo "RM= $(RM)" - @echo "UNAME= $(UNAME)" - -# Convenience targets for popular platforms. -ALL= all - -help: - @echo "Do 'make PLATFORM' where PLATFORM is one of these:" - @echo " $(PLATS)" - @echo "See doc/readme.html for complete instructions." - -guess: - @echo Guessing `$(UNAME)` - @$(MAKE) `$(UNAME)` - -AIX aix: - $(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall" - -bsd: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E" - -c89: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89" - @echo '' - @echo '*** C89 does not guarantee 64-bit integers for Lua.' - @echo '*** Make sure to compile all external Lua libraries' - @echo '*** with LUA_USE_C89 to ensure consistency' - @echo '' - -FreeBSD NetBSD OpenBSD freebsd: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE -I/usr/include/edit" SYSLIBS="-Wl,-E -ledit" CC="cc" - -generic: $(ALL) - -ios: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_IOS" - -Linux linux: linux-noreadline - -linux-noreadline: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl" - -linux-readline: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE" SYSLIBS="-Wl,-E -ldl -lreadline" - -Darwin macos macosx: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX -DLUA_USE_READLINE" SYSLIBS="-lreadline" - -mingw: - $(MAKE) "LUA_A=lua54.dll" "LUA_T=lua.exe" \ - "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ - "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe - $(MAKE) "LUAC_T=luac.exe" luac.exe - -posix: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX" - -SunOS solaris: - $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-ldl" - -# Targets that do not create files (not all makes understand .PHONY). -.PHONY: all $(PLATS) help test clean default o a depend echo - -# Compiler modules may use special flags. -llex.o: - $(CC) $(CFLAGS) $(CMCFLAGS) -c llex.c - -lparser.o: - $(CC) $(CFLAGS) $(CMCFLAGS) -c lparser.c - -lcode.o: - $(CC) $(CFLAGS) $(CMCFLAGS) -c lcode.c - -# DO NOT DELETE - -lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ - ltable.h lundump.h lvm.h -lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h -lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ - llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ - ldo.h lgc.h lstring.h ltable.h lvm.h -lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h -ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ - ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h -ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ - lparser.h lstring.h ltable.h lundump.h lvm.h -ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ - ltm.h lzio.h lmem.h lundump.h -lfunc.o: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h -lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h -linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h -liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \ - lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \ - lstring.h ltable.h -lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h -loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ - ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ - lvm.h -lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h -loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ - llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ - ldo.h lfunc.h lstring.h lgc.h ltable.h -lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ - lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ - lstring.h ltable.h -lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ - lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h -lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h -ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h -lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h ldebug.h lstate.h \ - lobject.h llimits.h ltm.h lzio.h lmem.h lopcodes.h lopnames.h lundump.h -lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ - lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ - lundump.h -lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h -lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ - llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ - ltable.h lvm.h ljumptab.h -lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ - lobject.h ltm.h lzio.h - -# (end of Makefile) diff --git a/lua-5.4.7/src/lapi.h b/lua-5.4.7/src/lapi.h deleted file mode 100644 index a742427..0000000 --- a/lua-5.4.7/src/lapi.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -** $Id: lapi.h $ -** Auxiliary functions from Lua API -** See Copyright Notice in lua.h -*/ - -#ifndef lapi_h -#define lapi_h - - -#include "llimits.h" -#include "lstate.h" - - -/* Increments 'L->top.p', checking for stack overflows */ -#define api_incr_top(L) {L->top.p++; \ - api_check(L, L->top.p <= L->ci->top.p, \ - "stack overflow");} - - -/* -** If a call returns too many multiple returns, the callee may not have -** stack space to accommodate all results. In this case, this macro -** increases its stack space ('L->ci->top.p'). -*/ -#define adjustresults(L,nres) \ - { if ((nres) <= LUA_MULTRET && L->ci->top.p < L->top.p) \ - L->ci->top.p = L->top.p; } - - -/* Ensure the stack has at least 'n' elements */ -#define api_checknelems(L,n) \ - api_check(L, (n) < (L->top.p - L->ci->func.p), \ - "not enough elements in the stack") - - -/* -** To reduce the overhead of returning from C functions, the presence of -** to-be-closed variables in these functions is coded in the CallInfo's -** field 'nresults', in a way that functions with no to-be-closed variables -** with zero, one, or "all" wanted results have no overhead. Functions -** with other number of wanted results, as well as functions with -** variables to be closed, have an extra check. -*/ - -#define hastocloseCfunc(n) ((n) < LUA_MULTRET) - -/* Map [-1, inf) (range of 'nresults') into (-inf, -2] */ -#define codeNresults(n) (-(n) - 3) -#define decodeNresults(n) (-(n) - 3) - -#endif diff --git a/lua-5.4.7/src/ldump.c b/lua-5.4.7/src/ldump.c deleted file mode 100644 index f231691..0000000 --- a/lua-5.4.7/src/ldump.c +++ /dev/null @@ -1,230 +0,0 @@ -/* -** $Id: ldump.c $ -** save precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#define ldump_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "lobject.h" -#include "lstate.h" -#include "lundump.h" - - -typedef struct { - lua_State *L; - lua_Writer writer; - void *data; - int strip; - int status; -} DumpState; - - -/* -** All high-level dumps go through dumpVector; you can change it to -** change the endianness of the result -*/ -#define dumpVector(D,v,n) dumpBlock(D,v,(n)*sizeof((v)[0])) - -#define dumpLiteral(D, s) dumpBlock(D,s,sizeof(s) - sizeof(char)) - - -static void dumpBlock (DumpState *D, const void *b, size_t size) { - if (D->status == 0 && size > 0) { - lua_unlock(D->L); - D->status = (*D->writer)(D->L, b, size, D->data); - lua_lock(D->L); - } -} - - -#define dumpVar(D,x) dumpVector(D,&x,1) - - -static void dumpByte (DumpState *D, int y) { - lu_byte x = (lu_byte)y; - dumpVar(D, x); -} - - -/* -** 'dumpSize' buffer size: each byte can store up to 7 bits. (The "+6" -** rounds up the division.) -*/ -#define DIBS ((sizeof(size_t) * CHAR_BIT + 6) / 7) - -static void dumpSize (DumpState *D, size_t x) { - lu_byte buff[DIBS]; - int n = 0; - do { - buff[DIBS - (++n)] = x & 0x7f; /* fill buffer in reverse order */ - x >>= 7; - } while (x != 0); - buff[DIBS - 1] |= 0x80; /* mark last byte */ - dumpVector(D, buff + DIBS - n, n); -} - - -static void dumpInt (DumpState *D, int x) { - dumpSize(D, x); -} - - -static void dumpNumber (DumpState *D, lua_Number x) { - dumpVar(D, x); -} - - -static void dumpInteger (DumpState *D, lua_Integer x) { - dumpVar(D, x); -} - - -static void dumpString (DumpState *D, const TString *s) { - if (s == NULL) - dumpSize(D, 0); - else { - size_t size = tsslen(s); - const char *str = getstr(s); - dumpSize(D, size + 1); - dumpVector(D, str, size); - } -} - - -static void dumpCode (DumpState *D, const Proto *f) { - dumpInt(D, f->sizecode); - dumpVector(D, f->code, f->sizecode); -} - - -static void dumpFunction(DumpState *D, const Proto *f, TString *psource); - -static void dumpConstants (DumpState *D, const Proto *f) { - int i; - int n = f->sizek; - dumpInt(D, n); - for (i = 0; i < n; i++) { - const TValue *o = &f->k[i]; - int tt = ttypetag(o); - dumpByte(D, tt); - switch (tt) { - case LUA_VNUMFLT: - dumpNumber(D, fltvalue(o)); - break; - case LUA_VNUMINT: - dumpInteger(D, ivalue(o)); - break; - case LUA_VSHRSTR: - case LUA_VLNGSTR: - dumpString(D, tsvalue(o)); - break; - default: - lua_assert(tt == LUA_VNIL || tt == LUA_VFALSE || tt == LUA_VTRUE); - } - } -} - - -static void dumpProtos (DumpState *D, const Proto *f) { - int i; - int n = f->sizep; - dumpInt(D, n); - for (i = 0; i < n; i++) - dumpFunction(D, f->p[i], f->source); -} - - -static void dumpUpvalues (DumpState *D, const Proto *f) { - int i, n = f->sizeupvalues; - dumpInt(D, n); - for (i = 0; i < n; i++) { - dumpByte(D, f->upvalues[i].instack); - dumpByte(D, f->upvalues[i].idx); - dumpByte(D, f->upvalues[i].kind); - } -} - - -static void dumpDebug (DumpState *D, const Proto *f) { - int i, n; - n = (D->strip) ? 0 : f->sizelineinfo; - dumpInt(D, n); - dumpVector(D, f->lineinfo, n); - n = (D->strip) ? 0 : f->sizeabslineinfo; - dumpInt(D, n); - for (i = 0; i < n; i++) { - dumpInt(D, f->abslineinfo[i].pc); - dumpInt(D, f->abslineinfo[i].line); - } - n = (D->strip) ? 0 : f->sizelocvars; - dumpInt(D, n); - for (i = 0; i < n; i++) { - dumpString(D, f->locvars[i].varname); - dumpInt(D, f->locvars[i].startpc); - dumpInt(D, f->locvars[i].endpc); - } - n = (D->strip) ? 0 : f->sizeupvalues; - dumpInt(D, n); - for (i = 0; i < n; i++) - dumpString(D, f->upvalues[i].name); -} - - -static void dumpFunction (DumpState *D, const Proto *f, TString *psource) { - if (D->strip || f->source == psource) - dumpString(D, NULL); /* no debug info or same source as its parent */ - else - dumpString(D, f->source); - dumpInt(D, f->linedefined); - dumpInt(D, f->lastlinedefined); - dumpByte(D, f->numparams); - dumpByte(D, f->is_vararg); - dumpByte(D, f->maxstacksize); - dumpCode(D, f); - dumpConstants(D, f); - dumpUpvalues(D, f); - dumpProtos(D, f); - dumpDebug(D, f); -} - - -static void dumpHeader (DumpState *D) { - dumpLiteral(D, LUA_SIGNATURE); - dumpByte(D, LUAC_VERSION); - dumpByte(D, LUAC_FORMAT); - dumpLiteral(D, LUAC_DATA); - dumpByte(D, sizeof(Instruction)); - dumpByte(D, sizeof(lua_Integer)); - dumpByte(D, sizeof(lua_Number)); - dumpInteger(D, LUAC_INT); - dumpNumber(D, LUAC_NUM); -} - - -/* -** dump Lua function as precompiled chunk -*/ -int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data, - int strip) { - DumpState D; - D.L = L; - D.writer = w; - D.data = data; - D.strip = strip; - D.status = 0; - dumpHeader(&D); - dumpByte(&D, f->sizeupvalues); - dumpFunction(&D, f, NULL); - return D.status; -} - diff --git a/lua-5.4.7/src/linit.c b/lua-5.4.7/src/linit.c deleted file mode 100644 index 69808f8..0000000 --- a/lua-5.4.7/src/linit.c +++ /dev/null @@ -1,65 +0,0 @@ -/* -** $Id: linit.c $ -** Initialization of libraries for lua.c and other clients -** See Copyright Notice in lua.h -*/ - - -#define linit_c -#define LUA_LIB - -/* -** If you embed Lua in your program and need to open the standard -** libraries, call luaL_openlibs in your program. If you need a -** different set of libraries, copy this file to your project and edit -** it to suit your needs. -** -** You can also *preload* libraries, so that a later 'require' can -** open the library, which is already linked to the application. -** For that, do the following code: -** -** luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); -** lua_pushcfunction(L, luaopen_modname); -** lua_setfield(L, -2, modname); -** lua_pop(L, 1); // remove PRELOAD table -*/ - -#include "lprefix.h" - - -#include - -#include "lua.h" - -#include "lualib.h" -#include "lauxlib.h" - - -/* -** these libs are loaded by lua.c and are readily available to any Lua -** program -*/ -static const luaL_Reg loadedlibs[] = { - {LUA_GNAME, luaopen_base}, - {LUA_LOADLIBNAME, luaopen_package}, - {LUA_COLIBNAME, luaopen_coroutine}, - {LUA_TABLIBNAME, luaopen_table}, - {LUA_IOLIBNAME, luaopen_io}, - {LUA_OSLIBNAME, luaopen_os}, - {LUA_STRLIBNAME, luaopen_string}, - {LUA_MATHLIBNAME, luaopen_math}, - {LUA_UTF8LIBNAME, luaopen_utf8}, - {LUA_DBLIBNAME, luaopen_debug}, - {NULL, NULL} -}; - - -LUALIB_API void luaL_openlibs (lua_State *L) { - const luaL_Reg *lib; - /* "require" functions from 'loadedlibs' and set results to global table */ - for (lib = loadedlibs; lib->func; lib++) { - luaL_requiref(L, lib->name, lib->func, 1); - lua_pop(L, 1); /* remove lib */ - } -} - diff --git a/lua-5.4.7/src/ltable.c b/lua-5.4.7/src/ltable.c deleted file mode 100644 index 3353c04..0000000 --- a/lua-5.4.7/src/ltable.c +++ /dev/null @@ -1,995 +0,0 @@ -/* -** $Id: ltable.c $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - -#define ltable_c -#define LUA_CORE - -#include "lprefix.h" - - -/* -** Implementation of tables (aka arrays, objects, or hash tables). -** Tables keep its elements in two parts: an array part and a hash part. -** Non-negative integer keys are all candidates to be kept in the array -** part. The actual size of the array is the largest 'n' such that -** more than half the slots between 1 and n are in use. -** Hash uses a mix of chained scatter table with Brent's variation. -** A main invariant of these tables is that, if an element is not -** in its main position (i.e. the 'original' position that its hash gives -** to it), then the colliding element is in its own main position. -** Hence even when the load factor reaches 100%, performance remains good. -*/ - -#include -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "lvm.h" - - -/* -** MAXABITS is the largest integer such that MAXASIZE fits in an -** unsigned int. -*/ -#define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) - - -/* -** MAXASIZE is the maximum size of the array part. It is the minimum -** between 2^MAXABITS and the maximum size that, measured in bytes, -** fits in a 'size_t'. -*/ -#define MAXASIZE luaM_limitN(1u << MAXABITS, TValue) - -/* -** MAXHBITS is the largest integer such that 2^MAXHBITS fits in a -** signed int. -*/ -#define MAXHBITS (MAXABITS - 1) - - -/* -** MAXHSIZE is the maximum size of the hash part. It is the minimum -** between 2^MAXHBITS and the maximum size such that, measured in bytes, -** it fits in a 'size_t'. -*/ -#define MAXHSIZE luaM_limitN(1u << MAXHBITS, Node) - - -/* -** When the original hash value is good, hashing by a power of 2 -** avoids the cost of '%'. -*/ -#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) - -/* -** for other types, it is better to avoid modulo by power of 2, as -** they can have many 2 factors. -*/ -#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) - - -#define hashstr(t,str) hashpow2(t, (str)->hash) -#define hashboolean(t,p) hashpow2(t, p) - - -#define hashpointer(t,p) hashmod(t, point2uint(p)) - - -#define dummynode (&dummynode_) - -static const Node dummynode_ = { - {{NULL}, LUA_VEMPTY, /* value's value and type */ - LUA_VNIL, 0, {NULL}} /* key type, next, and key value */ -}; - - -static const TValue absentkey = {ABSTKEYCONSTANT}; - - -/* -** Hash for integers. To allow a good hash, use the remainder operator -** ('%'). If integer fits as a non-negative int, compute an int -** remainder, which is faster. Otherwise, use an unsigned-integer -** remainder, which uses all bits and ensures a non-negative result. -*/ -static Node *hashint (const Table *t, lua_Integer i) { - lua_Unsigned ui = l_castS2U(i); - if (ui <= cast_uint(INT_MAX)) - return hashmod(t, cast_int(ui)); - else - return hashmod(t, ui); -} - - -/* -** Hash for floating-point numbers. -** The main computation should be just -** n = frexp(n, &i); return (n * INT_MAX) + i -** but there are some numerical subtleties. -** In a two-complement representation, INT_MAX does not has an exact -** representation as a float, but INT_MIN does; because the absolute -** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the -** absolute value of the product 'frexp * -INT_MIN' is smaller or equal -** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when -** adding 'i'; the use of '~u' (instead of '-u') avoids problems with -** INT_MIN. -*/ -#if !defined(l_hashfloat) -static int l_hashfloat (lua_Number n) { - int i; - lua_Integer ni; - n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); - if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */ - lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL)); - return 0; - } - else { /* normal case */ - unsigned int u = cast_uint(i) + cast_uint(ni); - return cast_int(u <= cast_uint(INT_MAX) ? u : ~u); - } -} -#endif - - -/* -** returns the 'main' position of an element in a table (that is, -** the index of its hash value). -*/ -static Node *mainpositionTV (const Table *t, const TValue *key) { - switch (ttypetag(key)) { - case LUA_VNUMINT: { - lua_Integer i = ivalue(key); - return hashint(t, i); - } - case LUA_VNUMFLT: { - lua_Number n = fltvalue(key); - return hashmod(t, l_hashfloat(n)); - } - case LUA_VSHRSTR: { - TString *ts = tsvalue(key); - return hashstr(t, ts); - } - case LUA_VLNGSTR: { - TString *ts = tsvalue(key); - return hashpow2(t, luaS_hashlongstr(ts)); - } - case LUA_VFALSE: - return hashboolean(t, 0); - case LUA_VTRUE: - return hashboolean(t, 1); - case LUA_VLIGHTUSERDATA: { - void *p = pvalue(key); - return hashpointer(t, p); - } - case LUA_VLCF: { - lua_CFunction f = fvalue(key); - return hashpointer(t, f); - } - default: { - GCObject *o = gcvalue(key); - return hashpointer(t, o); - } - } -} - - -l_sinline Node *mainpositionfromnode (const Table *t, Node *nd) { - TValue key; - getnodekey(cast(lua_State *, NULL), &key, nd); - return mainpositionTV(t, &key); -} - - -/* -** Check whether key 'k1' is equal to the key in node 'n2'. This -** equality is raw, so there are no metamethods. Floats with integer -** values have been normalized, so integers cannot be equal to -** floats. It is assumed that 'eqshrstr' is simply pointer equality, so -** that short strings are handled in the default case. -** A true 'deadok' means to accept dead keys as equal to their original -** values. All dead keys are compared in the default case, by pointer -** identity. (Only collectable objects can produce dead keys.) Note that -** dead long strings are also compared by identity. -** Once a key is dead, its corresponding value may be collected, and -** then another value can be created with the same address. If this -** other value is given to 'next', 'equalkey' will signal a false -** positive. In a regular traversal, this situation should never happen, -** as all keys given to 'next' came from the table itself, and therefore -** could not have been collected. Outside a regular traversal, we -** have garbage in, garbage out. What is relevant is that this false -** positive does not break anything. (In particular, 'next' will return -** some other valid item on the table or nil.) -*/ -static int equalkey (const TValue *k1, const Node *n2, int deadok) { - if ((rawtt(k1) != keytt(n2)) && /* not the same variants? */ - !(deadok && keyisdead(n2) && iscollectable(k1))) - return 0; /* cannot be same key */ - switch (keytt(n2)) { - case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: - return 1; - case LUA_VNUMINT: - return (ivalue(k1) == keyival(n2)); - case LUA_VNUMFLT: - return luai_numeq(fltvalue(k1), fltvalueraw(keyval(n2))); - case LUA_VLIGHTUSERDATA: - return pvalue(k1) == pvalueraw(keyval(n2)); - case LUA_VLCF: - return fvalue(k1) == fvalueraw(keyval(n2)); - case ctb(LUA_VLNGSTR): - return luaS_eqlngstr(tsvalue(k1), keystrval(n2)); - default: - return gcvalue(k1) == gcvalueraw(keyval(n2)); - } -} - - -/* -** True if value of 'alimit' is equal to the real size of the array -** part of table 't'. (Otherwise, the array part must be larger than -** 'alimit'.) -*/ -#define limitequalsasize(t) (isrealasize(t) || ispow2((t)->alimit)) - - -/* -** Returns the real size of the 'array' array -*/ -LUAI_FUNC unsigned int luaH_realasize (const Table *t) { - if (limitequalsasize(t)) - return t->alimit; /* this is the size */ - else { - unsigned int size = t->alimit; - /* compute the smallest power of 2 not smaller than 'size' */ - size |= (size >> 1); - size |= (size >> 2); - size |= (size >> 4); - size |= (size >> 8); -#if (UINT_MAX >> 14) > 3 /* unsigned int has more than 16 bits */ - size |= (size >> 16); -#if (UINT_MAX >> 30) > 3 - size |= (size >> 32); /* unsigned int has more than 32 bits */ -#endif -#endif - size++; - lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size); - return size; - } -} - - -/* -** Check whether real size of the array is a power of 2. -** (If it is not, 'alimit' cannot be changed to any other value -** without changing the real size.) -*/ -static int ispow2realasize (const Table *t) { - return (!isrealasize(t) || ispow2(t->alimit)); -} - - -static unsigned int setlimittosize (Table *t) { - t->alimit = luaH_realasize(t); - setrealasize(t); - return t->alimit; -} - - -#define limitasasize(t) check_exp(isrealasize(t), t->alimit) - - - -/* -** "Generic" get version. (Not that generic: not valid for integers, -** which may be in array part, nor for floats with integral values.) -** See explanation about 'deadok' in function 'equalkey'. -*/ -static const TValue *getgeneric (Table *t, const TValue *key, int deadok) { - Node *n = mainpositionTV(t, key); - for (;;) { /* check whether 'key' is somewhere in the chain */ - if (equalkey(key, n, deadok)) - return gval(n); /* that's it */ - else { - int nx = gnext(n); - if (nx == 0) - return &absentkey; /* not found */ - n += nx; - } - } -} - - -/* -** returns the index for 'k' if 'k' is an appropriate key to live in -** the array part of a table, 0 otherwise. -*/ -static unsigned int arrayindex (lua_Integer k) { - if (l_castS2U(k) - 1u < MAXASIZE) /* 'k' in [1, MAXASIZE]? */ - return cast_uint(k); /* 'key' is an appropriate array index */ - else - return 0; -} - - -/* -** returns the index of a 'key' for table traversals. First goes all -** elements in the array part, then elements in the hash part. The -** beginning of a traversal is signaled by 0. -*/ -static unsigned int findindex (lua_State *L, Table *t, TValue *key, - unsigned int asize) { - unsigned int i; - if (ttisnil(key)) return 0; /* first iteration */ - i = ttisinteger(key) ? arrayindex(ivalue(key)) : 0; - if (i - 1u < asize) /* is 'key' inside array part? */ - return i; /* yes; that's the index */ - else { - const TValue *n = getgeneric(t, key, 1); - if (l_unlikely(isabstkey(n))) - luaG_runerror(L, "invalid key to 'next'"); /* key not found */ - i = cast_int(nodefromval(n) - gnode(t, 0)); /* key index in hash table */ - /* hash elements are numbered after array ones */ - return (i + 1) + asize; - } -} - - -int luaH_next (lua_State *L, Table *t, StkId key) { - unsigned int asize = luaH_realasize(t); - unsigned int i = findindex(L, t, s2v(key), asize); /* find original key */ - for (; i < asize; i++) { /* try first array part */ - if (!isempty(&t->array[i])) { /* a non-empty entry? */ - setivalue(s2v(key), i + 1); - setobj2s(L, key + 1, &t->array[i]); - return 1; - } - } - for (i -= asize; cast_int(i) < sizenode(t); i++) { /* hash part */ - if (!isempty(gval(gnode(t, i)))) { /* a non-empty entry? */ - Node *n = gnode(t, i); - getnodekey(L, s2v(key), n); - setobj2s(L, key + 1, gval(n)); - return 1; - } - } - return 0; /* no more elements */ -} - - -static void freehash (lua_State *L, Table *t) { - if (!isdummy(t)) - luaM_freearray(L, t->node, cast_sizet(sizenode(t))); -} - - -/* -** {============================================================= -** Rehash -** ============================================================== -*/ - -/* -** Compute the optimal size for the array part of table 't'. 'nums' is a -** "count array" where 'nums[i]' is the number of integers in the table -** between 2^(i - 1) + 1 and 2^i. 'pna' enters with the total number of -** integer keys in the table and leaves with the number of keys that -** will go to the array part; return the optimal size. (The condition -** 'twotoi > 0' in the for loop stops the loop if 'twotoi' overflows.) -*/ -static unsigned int computesizes (unsigned int nums[], unsigned int *pna) { - int i; - unsigned int twotoi; /* 2^i (candidate for optimal size) */ - unsigned int a = 0; /* number of elements smaller than 2^i */ - unsigned int na = 0; /* number of elements to go to array part */ - unsigned int optimal = 0; /* optimal size for array part */ - /* loop while keys can fill more than half of total size */ - for (i = 0, twotoi = 1; - twotoi > 0 && *pna > twotoi / 2; - i++, twotoi *= 2) { - a += nums[i]; - if (a > twotoi/2) { /* more than half elements present? */ - optimal = twotoi; /* optimal size (till now) */ - na = a; /* all elements up to 'optimal' will go to array part */ - } - } - lua_assert((optimal == 0 || optimal / 2 < na) && na <= optimal); - *pna = na; - return optimal; -} - - -static int countint (lua_Integer key, unsigned int *nums) { - unsigned int k = arrayindex(key); - if (k != 0) { /* is 'key' an appropriate array index? */ - nums[luaO_ceillog2(k)]++; /* count as such */ - return 1; - } - else - return 0; -} - - -/* -** Count keys in array part of table 't': Fill 'nums[i]' with -** number of keys that will go into corresponding slice and return -** total number of non-nil keys. -*/ -static unsigned int numusearray (const Table *t, unsigned int *nums) { - int lg; - unsigned int ttlg; /* 2^lg */ - unsigned int ause = 0; /* summation of 'nums' */ - unsigned int i = 1; /* count to traverse all array keys */ - unsigned int asize = limitasasize(t); /* real array size */ - /* traverse each slice */ - for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) { - unsigned int lc = 0; /* counter */ - unsigned int lim = ttlg; - if (lim > asize) { - lim = asize; /* adjust upper limit */ - if (i > lim) - break; /* no more elements to count */ - } - /* count elements in range (2^(lg - 1), 2^lg] */ - for (; i <= lim; i++) { - if (!isempty(&t->array[i-1])) - lc++; - } - nums[lg] += lc; - ause += lc; - } - return ause; -} - - -static int numusehash (const Table *t, unsigned int *nums, unsigned int *pna) { - int totaluse = 0; /* total number of elements */ - int ause = 0; /* elements added to 'nums' (can go to array part) */ - int i = sizenode(t); - while (i--) { - Node *n = &t->node[i]; - if (!isempty(gval(n))) { - if (keyisinteger(n)) - ause += countint(keyival(n), nums); - totaluse++; - } - } - *pna += ause; - return totaluse; -} - - -/* -** Creates an array for the hash part of a table with the given -** size, or reuses the dummy node if size is zero. -** The computation for size overflow is in two steps: the first -** comparison ensures that the shift in the second one does not -** overflow. -*/ -static void setnodevector (lua_State *L, Table *t, unsigned int size) { - if (size == 0) { /* no elements to hash part? */ - t->node = cast(Node *, dummynode); /* use common 'dummynode' */ - t->lsizenode = 0; - t->lastfree = NULL; /* signal that it is using dummy node */ - } - else { - int i; - int lsize = luaO_ceillog2(size); - if (lsize > MAXHBITS || (1u << lsize) > MAXHSIZE) - luaG_runerror(L, "table overflow"); - size = twoto(lsize); - t->node = luaM_newvector(L, size, Node); - for (i = 0; i < cast_int(size); i++) { - Node *n = gnode(t, i); - gnext(n) = 0; - setnilkey(n); - setempty(gval(n)); - } - t->lsizenode = cast_byte(lsize); - t->lastfree = gnode(t, size); /* all positions are free */ - } -} - - -/* -** (Re)insert all elements from the hash part of 'ot' into table 't'. -*/ -static void reinsert (lua_State *L, Table *ot, Table *t) { - int j; - int size = sizenode(ot); - for (j = 0; j < size; j++) { - Node *old = gnode(ot, j); - if (!isempty(gval(old))) { - /* doesn't need barrier/invalidate cache, as entry was - already present in the table */ - TValue k; - getnodekey(L, &k, old); - luaH_set(L, t, &k, gval(old)); - } - } -} - - -/* -** Exchange the hash part of 't1' and 't2'. -*/ -static void exchangehashpart (Table *t1, Table *t2) { - lu_byte lsizenode = t1->lsizenode; - Node *node = t1->node; - Node *lastfree = t1->lastfree; - t1->lsizenode = t2->lsizenode; - t1->node = t2->node; - t1->lastfree = t2->lastfree; - t2->lsizenode = lsizenode; - t2->node = node; - t2->lastfree = lastfree; -} - - -/* -** Resize table 't' for the new given sizes. Both allocations (for -** the hash part and for the array part) can fail, which creates some -** subtleties. If the first allocation, for the hash part, fails, an -** error is raised and that is it. Otherwise, it copies the elements from -** the shrinking part of the array (if it is shrinking) into the new -** hash. Then it reallocates the array part. If that fails, the table -** is in its original state; the function frees the new hash part and then -** raises the allocation error. Otherwise, it sets the new hash part -** into the table, initializes the new part of the array (if any) with -** nils and reinserts the elements of the old hash back into the new -** parts of the table. -*/ -void luaH_resize (lua_State *L, Table *t, unsigned int newasize, - unsigned int nhsize) { - unsigned int i; - Table newt; /* to keep the new hash part */ - unsigned int oldasize = setlimittosize(t); - TValue *newarray; - /* create new hash part with appropriate size into 'newt' */ - setnodevector(L, &newt, nhsize); - if (newasize < oldasize) { /* will array shrink? */ - t->alimit = newasize; /* pretend array has new size... */ - exchangehashpart(t, &newt); /* and new hash */ - /* re-insert into the new hash the elements from vanishing slice */ - for (i = newasize; i < oldasize; i++) { - if (!isempty(&t->array[i])) - luaH_setint(L, t, i + 1, &t->array[i]); - } - t->alimit = oldasize; /* restore current size... */ - exchangehashpart(t, &newt); /* and hash (in case of errors) */ - } - /* allocate new array */ - newarray = luaM_reallocvector(L, t->array, oldasize, newasize, TValue); - if (l_unlikely(newarray == NULL && newasize > 0)) { /* allocation failed? */ - freehash(L, &newt); /* release new hash part */ - luaM_error(L); /* raise error (with array unchanged) */ - } - /* allocation ok; initialize new part of the array */ - exchangehashpart(t, &newt); /* 't' has the new hash ('newt' has the old) */ - t->array = newarray; /* set new array part */ - t->alimit = newasize; - for (i = oldasize; i < newasize; i++) /* clear new slice of the array */ - setempty(&t->array[i]); - /* re-insert elements from old hash part into new parts */ - reinsert(L, &newt, t); /* 'newt' now has the old hash */ - freehash(L, &newt); /* free old hash part */ -} - - -void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { - int nsize = allocsizenode(t); - luaH_resize(L, t, nasize, nsize); -} - -/* -** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i -*/ -static void rehash (lua_State *L, Table *t, const TValue *ek) { - unsigned int asize; /* optimal size for array part */ - unsigned int na; /* number of keys in the array part */ - unsigned int nums[MAXABITS + 1]; - int i; - int totaluse; - for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ - setlimittosize(t); - na = numusearray(t, nums); /* count keys in array part */ - totaluse = na; /* all those keys are integer keys */ - totaluse += numusehash(t, nums, &na); /* count keys in hash part */ - /* count extra key */ - if (ttisinteger(ek)) - na += countint(ivalue(ek), nums); - totaluse++; - /* compute new size for array part */ - asize = computesizes(nums, &na); - /* resize the table to new computed sizes */ - luaH_resize(L, t, asize, totaluse - na); -} - - - -/* -** }============================================================= -*/ - - -Table *luaH_new (lua_State *L) { - GCObject *o = luaC_newobj(L, LUA_VTABLE, sizeof(Table)); - Table *t = gco2t(o); - t->metatable = NULL; - t->flags = cast_byte(maskflags); /* table has no metamethod fields */ - t->array = NULL; - t->alimit = 0; - setnodevector(L, t, 0); - return t; -} - - -void luaH_free (lua_State *L, Table *t) { - freehash(L, t); - luaM_freearray(L, t->array, luaH_realasize(t)); - luaM_free(L, t); -} - - -static Node *getfreepos (Table *t) { - if (!isdummy(t)) { - while (t->lastfree > t->node) { - t->lastfree--; - if (keyisnil(t->lastfree)) - return t->lastfree; - } - } - return NULL; /* could not find a free place */ -} - - - -/* -** inserts a new key into a hash table; first, check whether key's main -** position is free. If not, check whether colliding node is in its main -** position or not: if it is not, move colliding node to an empty place and -** put new key in its main position; otherwise (colliding node is in its main -** position), new key goes to an empty position. -*/ -static void luaH_newkey (lua_State *L, Table *t, const TValue *key, - TValue *value) { - Node *mp; - TValue aux; - if (l_unlikely(ttisnil(key))) - luaG_runerror(L, "table index is nil"); - else if (ttisfloat(key)) { - lua_Number f = fltvalue(key); - lua_Integer k; - if (luaV_flttointeger(f, &k, F2Ieq)) { /* does key fit in an integer? */ - setivalue(&aux, k); - key = &aux; /* insert it as an integer */ - } - else if (l_unlikely(luai_numisnan(f))) - luaG_runerror(L, "table index is NaN"); - } - if (ttisnil(value)) - return; /* do not insert nil values */ - mp = mainpositionTV(t, key); - if (!isempty(gval(mp)) || isdummy(t)) { /* main position is taken? */ - Node *othern; - Node *f = getfreepos(t); /* get a free place */ - if (f == NULL) { /* cannot find a free place? */ - rehash(L, t, key); /* grow table */ - /* whatever called 'newkey' takes care of TM cache */ - luaH_set(L, t, key, value); /* insert key into grown table */ - return; - } - lua_assert(!isdummy(t)); - othern = mainpositionfromnode(t, mp); - if (othern != mp) { /* is colliding node out of its main position? */ - /* yes; move colliding node into free position */ - while (othern + gnext(othern) != mp) /* find previous */ - othern += gnext(othern); - gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */ - *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */ - if (gnext(mp) != 0) { - gnext(f) += cast_int(mp - f); /* correct 'next' */ - gnext(mp) = 0; /* now 'mp' is free */ - } - setempty(gval(mp)); - } - else { /* colliding node is in its own main position */ - /* new node will go into free position */ - if (gnext(mp) != 0) - gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */ - else lua_assert(gnext(f) == 0); - gnext(mp) = cast_int(f - mp); - mp = f; - } - } - setnodekey(L, mp, key); - luaC_barrierback(L, obj2gco(t), key); - lua_assert(isempty(gval(mp))); - setobj2t(L, gval(mp), value); -} - - -/* -** Search function for integers. If integer is inside 'alimit', get it -** directly from the array part. Otherwise, if 'alimit' is not -** the real size of the array, the key still can be in the array part. -** In this case, do the "Xmilia trick" to check whether 'key-1' is -** smaller than the real size. -** The trick works as follow: let 'p' be an integer such that -** '2^(p+1) >= alimit > 2^p', or '2^(p+1) > alimit-1 >= 2^p'. -** That is, 2^(p+1) is the real size of the array, and 'p' is the highest -** bit on in 'alimit-1'. What we have to check becomes 'key-1 < 2^(p+1)'. -** We compute '(key-1) & ~(alimit-1)', which we call 'res'; it will -** have the 'p' bit cleared. If the key is outside the array, that is, -** 'key-1 >= 2^(p+1)', then 'res' will have some bit on higher than 'p', -** therefore it will be larger or equal to 'alimit', and the check -** will fail. If 'key-1 < 2^(p+1)', then 'res' has no bit on higher than -** 'p', and as the bit 'p' itself was cleared, 'res' will be smaller -** than 2^p, therefore smaller than 'alimit', and the check succeeds. -** As special cases, when 'alimit' is 0 the condition is trivially false, -** and when 'alimit' is 1 the condition simplifies to 'key-1 < alimit'. -** If key is 0 or negative, 'res' will have its higher bit on, so that -** if cannot be smaller than alimit. -*/ -const TValue *luaH_getint (Table *t, lua_Integer key) { - lua_Unsigned alimit = t->alimit; - if (l_castS2U(key) - 1u < alimit) /* 'key' in [1, t->alimit]? */ - return &t->array[key - 1]; - else if (!isrealasize(t) && /* key still may be in the array part? */ - (((l_castS2U(key) - 1u) & ~(alimit - 1u)) < alimit)) { - t->alimit = cast_uint(key); /* probably '#t' is here now */ - return &t->array[key - 1]; - } - else { /* key is not in the array part; check the hash */ - Node *n = hashint(t, key); - for (;;) { /* check whether 'key' is somewhere in the chain */ - if (keyisinteger(n) && keyival(n) == key) - return gval(n); /* that's it */ - else { - int nx = gnext(n); - if (nx == 0) break; - n += nx; - } - } - return &absentkey; - } -} - - -/* -** search function for short strings -*/ -const TValue *luaH_getshortstr (Table *t, TString *key) { - Node *n = hashstr(t, key); - lua_assert(key->tt == LUA_VSHRSTR); - for (;;) { /* check whether 'key' is somewhere in the chain */ - if (keyisshrstr(n) && eqshrstr(keystrval(n), key)) - return gval(n); /* that's it */ - else { - int nx = gnext(n); - if (nx == 0) - return &absentkey; /* not found */ - n += nx; - } - } -} - - -const TValue *luaH_getstr (Table *t, TString *key) { - if (key->tt == LUA_VSHRSTR) - return luaH_getshortstr(t, key); - else { /* for long strings, use generic case */ - TValue ko; - setsvalue(cast(lua_State *, NULL), &ko, key); - return getgeneric(t, &ko, 0); - } -} - - -/* -** main search function -*/ -const TValue *luaH_get (Table *t, const TValue *key) { - switch (ttypetag(key)) { - case LUA_VSHRSTR: return luaH_getshortstr(t, tsvalue(key)); - case LUA_VNUMINT: return luaH_getint(t, ivalue(key)); - case LUA_VNIL: return &absentkey; - case LUA_VNUMFLT: { - lua_Integer k; - if (luaV_flttointeger(fltvalue(key), &k, F2Ieq)) /* integral index? */ - return luaH_getint(t, k); /* use specialized version */ - /* else... */ - } /* FALLTHROUGH */ - default: - return getgeneric(t, key, 0); - } -} - - -/* -** Finish a raw "set table" operation, where 'slot' is where the value -** should have been (the result of a previous "get table"). -** Beware: when using this function you probably need to check a GC -** barrier and invalidate the TM cache. -*/ -void luaH_finishset (lua_State *L, Table *t, const TValue *key, - const TValue *slot, TValue *value) { - if (isabstkey(slot)) - luaH_newkey(L, t, key, value); - else - setobj2t(L, cast(TValue *, slot), value); -} - - -/* -** beware: when using this function you probably need to check a GC -** barrier and invalidate the TM cache. -*/ -void luaH_set (lua_State *L, Table *t, const TValue *key, TValue *value) { - const TValue *slot = luaH_get(t, key); - luaH_finishset(L, t, key, slot, value); -} - - -void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) { - const TValue *p = luaH_getint(t, key); - if (isabstkey(p)) { - TValue k; - setivalue(&k, key); - luaH_newkey(L, t, &k, value); - } - else - setobj2t(L, cast(TValue *, p), value); -} - - -/* -** Try to find a boundary in the hash part of table 't'. From the -** caller, we know that 'j' is zero or present and that 'j + 1' is -** present. We want to find a larger key that is absent from the -** table, so that we can do a binary search between the two keys to -** find a boundary. We keep doubling 'j' until we get an absent index. -** If the doubling would overflow, we try LUA_MAXINTEGER. If it is -** absent, we are ready for the binary search. ('j', being max integer, -** is larger or equal to 'i', but it cannot be equal because it is -** absent while 'i' is present; so 'j > i'.) Otherwise, 'j' is a -** boundary. ('j + 1' cannot be a present integer key because it is -** not a valid integer in Lua.) -*/ -static lua_Unsigned hash_search (Table *t, lua_Unsigned j) { - lua_Unsigned i; - if (j == 0) j++; /* the caller ensures 'j + 1' is present */ - do { - i = j; /* 'i' is a present index */ - if (j <= l_castS2U(LUA_MAXINTEGER) / 2) - j *= 2; - else { - j = LUA_MAXINTEGER; - if (isempty(luaH_getint(t, j))) /* t[j] not present? */ - break; /* 'j' now is an absent index */ - else /* weird case */ - return j; /* well, max integer is a boundary... */ - } - } while (!isempty(luaH_getint(t, j))); /* repeat until an absent t[j] */ - /* i < j && t[i] present && t[j] absent */ - while (j - i > 1u) { /* do a binary search between them */ - lua_Unsigned m = (i + j) / 2; - if (isempty(luaH_getint(t, m))) j = m; - else i = m; - } - return i; -} - - -static unsigned int binsearch (const TValue *array, unsigned int i, - unsigned int j) { - while (j - i > 1u) { /* binary search */ - unsigned int m = (i + j) / 2; - if (isempty(&array[m - 1])) j = m; - else i = m; - } - return i; -} - - -/* -** Try to find a boundary in table 't'. (A 'boundary' is an integer index -** such that t[i] is present and t[i+1] is absent, or 0 if t[1] is absent -** and 'maxinteger' if t[maxinteger] is present.) -** (In the next explanation, we use Lua indices, that is, with base 1. -** The code itself uses base 0 when indexing the array part of the table.) -** The code starts with 'limit = t->alimit', a position in the array -** part that may be a boundary. -** -** (1) If 't[limit]' is empty, there must be a boundary before it. -** As a common case (e.g., after 't[#t]=nil'), check whether 'limit-1' -** is present. If so, it is a boundary. Otherwise, do a binary search -** between 0 and limit to find a boundary. In both cases, try to -** use this boundary as the new 'alimit', as a hint for the next call. -** -** (2) If 't[limit]' is not empty and the array has more elements -** after 'limit', try to find a boundary there. Again, try first -** the special case (which should be quite frequent) where 'limit+1' -** is empty, so that 'limit' is a boundary. Otherwise, check the -** last element of the array part. If it is empty, there must be a -** boundary between the old limit (present) and the last element -** (absent), which is found with a binary search. (This boundary always -** can be a new limit.) -** -** (3) The last case is when there are no elements in the array part -** (limit == 0) or its last element (the new limit) is present. -** In this case, must check the hash part. If there is no hash part -** or 'limit+1' is absent, 'limit' is a boundary. Otherwise, call -** 'hash_search' to find a boundary in the hash part of the table. -** (In those cases, the boundary is not inside the array part, and -** therefore cannot be used as a new limit.) -*/ -lua_Unsigned luaH_getn (Table *t) { - unsigned int limit = t->alimit; - if (limit > 0 && isempty(&t->array[limit - 1])) { /* (1)? */ - /* there must be a boundary before 'limit' */ - if (limit >= 2 && !isempty(&t->array[limit - 2])) { - /* 'limit - 1' is a boundary; can it be a new limit? */ - if (ispow2realasize(t) && !ispow2(limit - 1)) { - t->alimit = limit - 1; - setnorealasize(t); /* now 'alimit' is not the real size */ - } - return limit - 1; - } - else { /* must search for a boundary in [0, limit] */ - unsigned int boundary = binsearch(t->array, 0, limit); - /* can this boundary represent the real size of the array? */ - if (ispow2realasize(t) && boundary > luaH_realasize(t) / 2) { - t->alimit = boundary; /* use it as the new limit */ - setnorealasize(t); - } - return boundary; - } - } - /* 'limit' is zero or present in table */ - if (!limitequalsasize(t)) { /* (2)? */ - /* 'limit' > 0 and array has more elements after 'limit' */ - if (isempty(&t->array[limit])) /* 'limit + 1' is empty? */ - return limit; /* this is the boundary */ - /* else, try last element in the array */ - limit = luaH_realasize(t); - if (isempty(&t->array[limit - 1])) { /* empty? */ - /* there must be a boundary in the array after old limit, - and it must be a valid new limit */ - unsigned int boundary = binsearch(t->array, t->alimit, limit); - t->alimit = boundary; - return boundary; - } - /* else, new limit is present in the table; check the hash part */ - } - /* (3) 'limit' is the last element and either is zero or present in table */ - lua_assert(limit == luaH_realasize(t) && - (limit == 0 || !isempty(&t->array[limit - 1]))); - if (isdummy(t) || isempty(luaH_getint(t, cast(lua_Integer, limit + 1)))) - return limit; /* 'limit + 1' is absent */ - else /* 'limit + 1' is also present */ - return hash_search(t, limit); -} - - - -#if defined(LUA_DEBUG) - -/* export these functions for the test library */ - -Node *luaH_mainposition (const Table *t, const TValue *key) { - return mainpositionTV(t, key); -} - -#endif diff --git a/lua-5.4.7/src/ltable.h b/lua-5.4.7/src/ltable.h deleted file mode 100644 index 8e68903..0000000 --- a/lua-5.4.7/src/ltable.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -** $Id: ltable.h $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - -#ifndef ltable_h -#define ltable_h - -#include "lobject.h" - - -#define gnode(t,i) (&(t)->node[i]) -#define gval(n) (&(n)->i_val) -#define gnext(n) ((n)->u.next) - - -/* -** Clear all bits of fast-access metamethods, which means that the table -** may have any of these metamethods. (First access that fails after the -** clearing will set the bit again.) -*/ -#define invalidateTMcache(t) ((t)->flags &= ~maskflags) - - -/* true when 't' is using 'dummynode' as its hash part */ -#define isdummy(t) ((t)->lastfree == NULL) - - -/* allocated size for hash nodes */ -#define allocsizenode(t) (isdummy(t) ? 0 : sizenode(t)) - - -/* returns the Node, given the value of a table entry */ -#define nodefromval(v) cast(Node *, (v)) - - -LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key); -LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key, - TValue *value); -LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key); -LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); -LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); -LUAI_FUNC void luaH_set (lua_State *L, Table *t, const TValue *key, - TValue *value); -LUAI_FUNC void luaH_finishset (lua_State *L, Table *t, const TValue *key, - const TValue *slot, TValue *value); -LUAI_FUNC Table *luaH_new (lua_State *L); -LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize, - unsigned int nhsize); -LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize); -LUAI_FUNC void luaH_free (lua_State *L, Table *t); -LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); -LUAI_FUNC lua_Unsigned luaH_getn (Table *t); -LUAI_FUNC unsigned int luaH_realasize (const Table *t); - - -#if defined(LUA_DEBUG) -LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); -#endif - - -#endif diff --git a/lua-5.4.7/src/lundump.c b/lua-5.4.7/src/lundump.c deleted file mode 100644 index e8d92a8..0000000 --- a/lua-5.4.7/src/lundump.c +++ /dev/null @@ -1,335 +0,0 @@ -/* -** $Id: lundump.c $ -** load precompiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#define lundump_c -#define LUA_CORE - -#include "lprefix.h" - - -#include -#include - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstring.h" -#include "lundump.h" -#include "lzio.h" - - -#if !defined(luai_verifycode) -#define luai_verifycode(L,f) /* empty */ -#endif - - -typedef struct { - lua_State *L; - ZIO *Z; - const char *name; -} LoadState; - - -static l_noret error (LoadState *S, const char *why) { - luaO_pushfstring(S->L, "%s: bad binary format (%s)", S->name, why); - luaD_throw(S->L, LUA_ERRSYNTAX); -} - - -/* -** All high-level loads go through loadVector; you can change it to -** adapt to the endianness of the input -*/ -#define loadVector(S,b,n) loadBlock(S,b,(n)*sizeof((b)[0])) - -static void loadBlock (LoadState *S, void *b, size_t size) { - if (luaZ_read(S->Z, b, size) != 0) - error(S, "truncated chunk"); -} - - -#define loadVar(S,x) loadVector(S,&x,1) - - -static lu_byte loadByte (LoadState *S) { - int b = zgetc(S->Z); - if (b == EOZ) - error(S, "truncated chunk"); - return cast_byte(b); -} - - -static size_t loadUnsigned (LoadState *S, size_t limit) { - size_t x = 0; - int b; - limit >>= 7; - do { - b = loadByte(S); - if (x >= limit) - error(S, "integer overflow"); - x = (x << 7) | (b & 0x7f); - } while ((b & 0x80) == 0); - return x; -} - - -static size_t loadSize (LoadState *S) { - return loadUnsigned(S, MAX_SIZET); -} - - -static int loadInt (LoadState *S) { - return cast_int(loadUnsigned(S, INT_MAX)); -} - - -static lua_Number loadNumber (LoadState *S) { - lua_Number x; - loadVar(S, x); - return x; -} - - -static lua_Integer loadInteger (LoadState *S) { - lua_Integer x; - loadVar(S, x); - return x; -} - - -/* -** Load a nullable string into prototype 'p'. -*/ -static TString *loadStringN (LoadState *S, Proto *p) { - lua_State *L = S->L; - TString *ts; - size_t size = loadSize(S); - if (size == 0) /* no string? */ - return NULL; - else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ - char buff[LUAI_MAXSHORTLEN]; - loadVector(S, buff, size); /* load string into buffer */ - ts = luaS_newlstr(L, buff, size); /* create string */ - } - else { /* long string */ - ts = luaS_createlngstrobj(L, size); /* create string */ - setsvalue2s(L, L->top.p, ts); /* anchor it ('loadVector' can GC) */ - luaD_inctop(L); - loadVector(S, getlngstr(ts), size); /* load directly in final place */ - L->top.p--; /* pop string */ - } - luaC_objbarrier(L, p, ts); - return ts; -} - - -/* -** Load a non-nullable string into prototype 'p'. -*/ -static TString *loadString (LoadState *S, Proto *p) { - TString *st = loadStringN(S, p); - if (st == NULL) - error(S, "bad format for constant string"); - return st; -} - - -static void loadCode (LoadState *S, Proto *f) { - int n = loadInt(S); - f->code = luaM_newvectorchecked(S->L, n, Instruction); - f->sizecode = n; - loadVector(S, f->code, n); -} - - -static void loadFunction(LoadState *S, Proto *f, TString *psource); - - -static void loadConstants (LoadState *S, Proto *f) { - int i; - int n = loadInt(S); - f->k = luaM_newvectorchecked(S->L, n, TValue); - f->sizek = n; - for (i = 0; i < n; i++) - setnilvalue(&f->k[i]); - for (i = 0; i < n; i++) { - TValue *o = &f->k[i]; - int t = loadByte(S); - switch (t) { - case LUA_VNIL: - setnilvalue(o); - break; - case LUA_VFALSE: - setbfvalue(o); - break; - case LUA_VTRUE: - setbtvalue(o); - break; - case LUA_VNUMFLT: - setfltvalue(o, loadNumber(S)); - break; - case LUA_VNUMINT: - setivalue(o, loadInteger(S)); - break; - case LUA_VSHRSTR: - case LUA_VLNGSTR: - setsvalue2n(S->L, o, loadString(S, f)); - break; - default: lua_assert(0); - } - } -} - - -static void loadProtos (LoadState *S, Proto *f) { - int i; - int n = loadInt(S); - f->p = luaM_newvectorchecked(S->L, n, Proto *); - f->sizep = n; - for (i = 0; i < n; i++) - f->p[i] = NULL; - for (i = 0; i < n; i++) { - f->p[i] = luaF_newproto(S->L); - luaC_objbarrier(S->L, f, f->p[i]); - loadFunction(S, f->p[i], f->source); - } -} - - -/* -** Load the upvalues for a function. The names must be filled first, -** because the filling of the other fields can raise read errors and -** the creation of the error message can call an emergency collection; -** in that case all prototypes must be consistent for the GC. -*/ -static void loadUpvalues (LoadState *S, Proto *f) { - int i, n; - n = loadInt(S); - f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); - f->sizeupvalues = n; - for (i = 0; i < n; i++) /* make array valid for GC */ - f->upvalues[i].name = NULL; - for (i = 0; i < n; i++) { /* following calls can raise errors */ - f->upvalues[i].instack = loadByte(S); - f->upvalues[i].idx = loadByte(S); - f->upvalues[i].kind = loadByte(S); - } -} - - -static void loadDebug (LoadState *S, Proto *f) { - int i, n; - n = loadInt(S); - f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); - f->sizelineinfo = n; - loadVector(S, f->lineinfo, n); - n = loadInt(S); - f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); - f->sizeabslineinfo = n; - for (i = 0; i < n; i++) { - f->abslineinfo[i].pc = loadInt(S); - f->abslineinfo[i].line = loadInt(S); - } - n = loadInt(S); - f->locvars = luaM_newvectorchecked(S->L, n, LocVar); - f->sizelocvars = n; - for (i = 0; i < n; i++) - f->locvars[i].varname = NULL; - for (i = 0; i < n; i++) { - f->locvars[i].varname = loadStringN(S, f); - f->locvars[i].startpc = loadInt(S); - f->locvars[i].endpc = loadInt(S); - } - n = loadInt(S); - if (n != 0) /* does it have debug information? */ - n = f->sizeupvalues; /* must be this many */ - for (i = 0; i < n; i++) - f->upvalues[i].name = loadStringN(S, f); -} - - -static void loadFunction (LoadState *S, Proto *f, TString *psource) { - f->source = loadStringN(S, f); - if (f->source == NULL) /* no source in dump? */ - f->source = psource; /* reuse parent's source */ - f->linedefined = loadInt(S); - f->lastlinedefined = loadInt(S); - f->numparams = loadByte(S); - f->is_vararg = loadByte(S); - f->maxstacksize = loadByte(S); - loadCode(S, f); - loadConstants(S, f); - loadUpvalues(S, f); - loadProtos(S, f); - loadDebug(S, f); -} - - -static void checkliteral (LoadState *S, const char *s, const char *msg) { - char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ - size_t len = strlen(s); - loadVector(S, buff, len); - if (memcmp(s, buff, len) != 0) - error(S, msg); -} - - -static void fchecksize (LoadState *S, size_t size, const char *tname) { - if (loadByte(S) != size) - error(S, luaO_pushfstring(S->L, "%s size mismatch", tname)); -} - - -#define checksize(S,t) fchecksize(S,sizeof(t),#t) - -static void checkHeader (LoadState *S) { - /* skip 1st char (already read and checked) */ - checkliteral(S, &LUA_SIGNATURE[1], "not a binary chunk"); - if (loadByte(S) != LUAC_VERSION) - error(S, "version mismatch"); - if (loadByte(S) != LUAC_FORMAT) - error(S, "format mismatch"); - checkliteral(S, LUAC_DATA, "corrupted chunk"); - checksize(S, Instruction); - checksize(S, lua_Integer); - checksize(S, lua_Number); - if (loadInteger(S) != LUAC_INT) - error(S, "integer format mismatch"); - if (loadNumber(S) != LUAC_NUM) - error(S, "float format mismatch"); -} - - -/* -** Load precompiled chunk. -*/ -LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { - LoadState S; - LClosure *cl; - if (*name == '@' || *name == '=') - S.name = name + 1; - else if (*name == LUA_SIGNATURE[0]) - S.name = "binary string"; - else - S.name = name; - S.L = L; - S.Z = Z; - checkHeader(&S); - cl = luaF_newLclosure(L, loadByte(&S)); - setclLvalue2s(L, L->top.p, cl); - luaD_inctop(L); - cl->p = luaF_newproto(L); - luaC_objbarrier(L, cl, cl->p); - loadFunction(&S, cl->p, NULL); - lua_assert(cl->nupvalues == cl->p->sizeupvalues); - luai_verifycode(L, cl->p); - return cl; -} - diff --git a/lua-config-package-tests/CMakeLists.txt b/lua-config-package-tests/CMakeLists.txt deleted file mode 100644 index e810d8b..0000000 --- a/lua-config-package-tests/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -cmake_minimum_required(VERSION 3.1) -project(lua-config-package-test C) - -find_package(Lua REQUIRED CONFIG) - -add_executable(lua-config-package-build-test-using-static-target "./lua-config-package-build-test.c") -target_link_libraries(lua-config-package-build-test-using-static-target Lua::lua_static) - -add_executable(lua-config-package-build-test-using-shared-target "./lua-config-package-build-test.c") -target_link_libraries(lua-config-package-build-test-using-shared-target Lua::lua_shared) - -add_executable(lua-config-package-build-test-using-variables "./lua-config-package-build-test.c") -target_link_libraries(lua-config-package-build-test-using-variables "${LUA_LIBRARIES}") - -add_library(lua-lib-module-compatible-mode UNKNOWN IMPORTED "${LUA_LIBRARY}") -set_target_properties(lua-lib-module-compatible-mode PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${LUA_INCLUDE_DIR}" - IMPORTED_LOCATION "${LUA_LIBRARY}") -target_link_libraries(lua-lib-module-compatible-mode INTERFACE "${LUA_LIBRARIES}") - -add_executable(lua-config-package-build-test-using-module-compatible-mode "./lua-config-package-build-test.c") -target_link_libraries(lua-config-package-build-test-using-module-compatible-mode lua-lib-module-compatible-mode) diff --git a/lua-config-package-tests/lua-config-package-build-test.c b/lua-config-package-tests/lua-config-package-build-test.c deleted file mode 100644 index c4109a2..0000000 --- a/lua-config-package-tests/lua-config-package-build-test.c +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include - -int main() -{ - lua_State *l = luaL_newstate(); - double lversion = lua_version(l); - printf("Lua version is %f\n", lversion); -} \ No newline at end of file diff --git a/orig_sources/lua-5.4.6-tests.tar.gz b/orig_sources/lua-5.4.6-tests.tar.gz deleted file mode 100644 index 8ab62648408326cd91b0d37b74484f3dfd1923fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136212 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

jWRX4u$_nO&KAuSy_-(WE=&PcmDDkqaMro=#l znNi6m<-~0E9`7@|Nrfq%vRvQszO`0cZhxQlj z97zeCb<@2`^MSL5$dnRZJs?I!uZ0r~J}N8<7ySghKQ zPa)W#oLR@m<)mQ^QbUA=bh%+D_jwB~kMEO@lmPI#3D#a<4gPdQvxC2L z`rT8Iq8=rc*{1~Q_pXSb9cdyZ(A#Ya*lT=z>oGfMArMs&%V|PKIW(o~MZYg7WYih> zXH{b@tmWv-z^xLp(HhtQuhZgDzbBd9`zo)yG?1$%h%4JGlwd%2?Fosjjnpt6 zEYP~ugxztK>0YB$x(JznJ-=4#Eh*}Xai~buGV zoA?*Nx&KNZ`2`l+Z=ef7gLVIJTI@kz(tu+a4#xsuxgKC!?_YQpSilovi~w#<;QSVZ z6A_HguOR?B#&g9KjI4Mt3H9-dUtb}=129x!n%iZI2N^y67_L-nY(Ki`_89x-MOaXr<*ORLaSvl9Y z=_@@{-t$OYBpmICx-^bA9-vg+%_Eg83W_WWJsffz`@`V7Y_V}lvA_`dj&Bw`M&Bxx zi4ap*U#b`A9Tj|mzAe=kX6xl$Rq|jvgSjuz=h_Nan* z2)|HI7{4AJUH7iXkNkmYI=EtYrz)v#DC6?7T4#ntcU4|Cq;v;NshC{x@9vda$(6SB z=Ep0(d&{}K)V#8L+hM{ngUgO0n(t>Qow(9EJxc+D*#azS8~gMk>c=O`SCZ7K>LTJM zy+YGZCy%sWaH$KnGo1#G#U!XVJ0GJOkYpnPCWSn)S~M>r-)=>e8Y1jdqHL|uilK5x z;~ZV^jeb9}!qQ4IcH|e$3^LiOn>p7+-b=?K?<@m5Ow{3=uCrDYNK}Z3mCl8U6B0HVnbgWl zr~>UeoOWQ85G3UZ!3=?E8Y;UCmZk6;a%IA2%EpwivxvpUQ_p)abKV@1z(9B8`byAd zZ8b7C-S4SrVgdxSgQ4?RPg{l%LEviu{uc2ze$0_bAqh=wC#kE3HD^su(Sail)Qm1? zC@8ArfJSf?|0|E9pwygbg0>vbSodXgOEuG{R7krRY(=iYjDG`nul@))cI@!Uw_t2o zFt(%jGkwE~0218nv{N9&wPrs8tfktiHzW(Ib11{8!%<_0F*Fx3YlU2wvr1KKX>0%d zeZC0l+S-ecrh`L*ofgaJ9p0hO#+TaT^Tak+)x)_MpOnzo%Vyen^B+I{_}zD3{R*Ej zrvQtL&L|EAuOyW!_L(#*vaaczr3L(TJ{`#u{L}EpLT|BgimEp=y%)nXcb@_o{Ltv4nX+YYyGjS-&0vE8bXx_QDv4C)o9Bn?wE=Xml;mJo?h zlxmXz^N|r-6a>RGE~XTY(K3aSD2M)>=y3;DX%i&ynN#L6SSGh-hr}|4@ogPg@2X@I zqsU+^NY1PjA05S=4*uR+X&=*F6#wV{kxEaf^rkwLHdb1^ctWUc0wTzb5vJOH&G-Ya z))z~T59(ViZ#sOhMj`e8=-e3%Zlis`ADNU`OJgtd`?M{IIvS(xWtCyLwn{F#uZnf- zCu71gJA@_yNLJA^Qlf3_J{gz4 z6?6Ud2!2{#D=}(Pt*r~rM|iCz0!jD;+XiAS5`C?jzV}|%*u=P zv{Y&5@i#OZQLhab`;)kIlc`c!#vni4eAmZ zv1=gZE~I=5q)b!W1&CqyY*ZCrLNR@i!gCmd))-9U;x^2C}b(<3b!@3uI|9Wkval7a&pexE3A#pMZ5By+gk;t1Euc{wZ3 z#qMY+A)i)js6=5>?w(j*DrPVyR;en|Ea#o&YE;hTg6k!v)+p3eFyIT@WP@xEgt%IA zHwsWH9wOt_J2Y87Ur$%%#Z>2G-VlegWXvlz%67isUQ4A6-oi!~T2bOSL{<3w3a@Hu z_bU7?%TD6hIqxYGn|D>XGQ)Fg#j(w3$O2_a#L%nO=;`v4W~c_tS+!2)*>teX6GP&m z@vMm(s$-#4{KlE{Q3Qu1ELK;GL10*k@}I6x#=BgG2_k1CEVUUKt{S)$`#i%8nT6w` z{rge-e|Ost-n`mFe!+1OV?~+R`O|T_Ak%+XD}VxAFiUb?b>ySai{lyP2h#Tylef^x z^YcRXtGY(&@q0LNL~xZ8Qr#1VbQ-apOWifV+DaA|%qN>N*?57NV8C>9_tf?^!bR}z zairbs9^@COh`mT&7Z?5Hw|Oy7_At3_x@BJg3pY)p`kQGU<~*j3`&a9{6~4WAV?lQm z=Q-bNDz_RRUlwz#OJTWGHsG{4=Ck40k;lMTys)CUniR@Z>IKmNYhy6e%)|hvO70UB z{`BFbsWfyZe&!3nYdSGJ|BDXC!$B12>%bhRFFHeQL#L`!4s)j1S<7@j5C zYS^eG9N%qsm%z|s;$F11WjQHLN_U&R?F$w8-9I|Ue_M|K7ByEW7_~2zw=icxKf1*a zo!qmT8W=SwnPewh<(43{Hb?^ywhIaG2saoloL}DM1*P&p+YXXY)c8vCqjGl9LWA1C z%HvHz*3r&cHJ>>q6Ylyh7C~{vV*RrtpIfPu)Qm~7=uB3NVz!)&7cJ)-Ch=NyX8LP8 z$}D}N5<3Kr+uVx$zB<0OVmnk!jprPRD1lKn;7V9xZzZ%hhFRe{Ja|-Xc3~dZuQL2a z@)pj^PIG`8^U&BNV4z}WZfG?%X>Q*4uJA@l4*(H(U{$;FL7M9UQy65G&{l0*1C_#l zgZ7&(G|=W!eHPU&oFR8f*zju7L7G{J&DeC6!3|buZbiR>FV$yM{f*4K$vz$=K&%`S z{HA{vWrCaR+pX-sdS6?qjS43sS{jwkf^$A?d6}?t79xAx^eju^{w3R zezHQt=Q+XbQG!7f2~O>RVkkpxFdYJgo~NOu(zDCvs5zm#hlz?l+#C2hscQG3nfhC? zTdEr>wXDEuDdSUhsmBSkCX>o(NUM%>ja%6a$%+{gxR3-uEfJeoQVz% zj1-~yJ~S9PU7S)0OsQ;bVP)$DOJTXx1TBGvl4sJp;&RDs_IMPd)npTe*(`cvrn;*0 zRLv@T7S^W3l+R-mr%GQMBa7}wN5|VEbKkP!`rR$p0k-#Yu9{HcFjBTp64ryQ0|iZb z_DGn^BEr;8$Sv;P$o>wEQGcTH^7Zk)Ln;OA$I|0TwU_R3WphcBMnSTVLYB9$|*GkkWUU-;Y}5pQ|eKQUQ>45-s4BX4E> zg)?x=QfA2wFskGq)QZMpufxpHX_Jm~e>13E#o4LeD~7DaE0&dRN(4!f4W%NE5latn zM%7ZHjAYe^SXKkppDYO68pVmFnZvx8x*j4n z)w{V(Mr0{*=rLpa(Cf1C1ODv>tzk5^>G!+W5S%=`S=IGwGQY-u03QWLpAe;Y+UY^U z;@JWCfn(mZvx;p91sb!nXxT@y*I&yQm_yd1M2yUFMPn6J-B>&?1}((EWF5AZ1K!Jz z5-a?|+j3c=g#zp*8j}+xvE*nU7`TH26|TnYGfXZJTdW9JvIa9n11FvYWL3eb&BE4O zx#n1!j@m|Rcl~wPbO^sV4w7Ay{ibRux@ba zv*9jVBVe7etBBBsFP^!bF^FMvB5Xkni?)?R#;IDg>aJy~VQglsg`(}#5^ZjFt`@4} z`={2`OS~7!4cf&k$0vXwv^hG6e)y0(K|&pvou_TR9@yy=W8LYQss>F9<<#IL1!O~( z`Z(Cy!<9o`s7pqiQ*5tU3bR=x0~j zm;!m)fYG@f`@c0*d_`?rbc9qJ>wQFHwwPmeT)euj>2No5ujMS*vf|V6T=|qi%xqJY z%B^liM~o(7Xj&Er(NU5o!OC1NKmP=KH_c)&L`JR9F$bPftirVkzJKGUA4g6$L>(^U zM8W}@7VcIWLvE(5;%lPT#=}@ zQAr)-1tql%lr4R~=J@@Y2%1KvH!5wbGj&ZBh^C00fC;{b9?#j;~7-V2T7fnb+NGl6uztG(hV}c z8!2>*w|t7W@y)f+5=xJTMC;KvTB2hWNFGJ04k|C_=o9wBR_7rAaNv6_`HMf(*=12C zAJme#0O_>3uCu}3_PWmW8CJ;Trv%c~1S&^KV9C#z>~T_ut+GtqO5rbrlc9rw1K*bQ zEC$90C_VAV4hu$$G`II%R6g(H#A`UgO_)rQz+M#hbyI<}Evc;%>%obcum`pV2dk>Z ziwxtO6O+jv;-eyK!7+t-sjRF9bUnl@c$0*NX+A8q*?C$=B%n93#$_04#~%^p;K~MpBfG~5b(N5MXn1I8r$Q& zDo)N3^N}N;bF4e7-CkMuiLl`Du;I!b9WN?$58_7Ix1uvg0|#BsP)YL$2giwn4-5A_ z6tt3G9Kx4kG*TZ&E5xsyWzbiSUd=cQG7Jv&z)r{kIWxLglR z&E=`CxjbE{kAu1SxRK9PeEc^9P=8u&Z*PDkQ9~FYv88WUj+Ug7DZuf?DlDH+owl8Z zPvXR$Gav4lcD)G;~Y}I=EL75s9Pd=xh$UE2uJ9Mos7r4O@Z`66RK|NJ@Mh z2oPyRF@I{tu>Wx=|3yVLz!9_Kkf9e@3rK8`rK1QkW@moH6AEw;v%Dc};7aL(n$x#a z41}PJpx~=v1RIXLp(>@96l)ww!MD;gwZ<3N3VLqqV%5Apu8fayTg_J(5P`yDJ5I*5 zZUAgu0SrtZc`nE}D6a+Mm$Ry7pxL>T{?XAP4q3RN#vV1y(h9OxD`54Y6`%}LNy;QT z@{0nqXl5A+6UP`%tQB2MVR(k+W}xGmVc;-F04}W*&O?QvBx~VUo(H}+W-Q(o z66(F<09-($zbFn_R#`q~h)}AG^Bk$nEPGKNSVlAdvz{%nINdDgh3=W} zZ}q04w5A)+||)cJbC7L~Qlg59WTUDyZxJnyvGF2v=KS74`mg=1C&=BUqm*l23@AmbuJs4>>~4Zg|)}{VI^=m zi#6+s*(B7u4zT5C!r>7T9R2}tzl%%S9_Buvj~jbj1NyMan@e%lvtDlCX`4SQ%>r{!^BI~5IK z|B}Fp?!iMeN2WMFN|}TAgH@?~gY3~oSY}Oo_z$h6hr?}0ggr&;_h!$+;*kBv z2oxA%nVP0$qoU(7VVq7aj)NIQK~v9{N8C<=(CSK``lV$?D0@yTL}hA6zNO6}&GkTZevugP^uVRWO!OEZa0MwWqTidMasvx)1fb&4t$oL zs<*ZvQ2}e-zDQA=c>DJ4%yMhKu!L+9a`pK5_3hgxdB+{7^6KGj*vcI^6vsf*ZZH4% z>XjF%+Wp~>f7EnZGXpsM7prvJ>(CTwC7-iJd4KD$#Ke-Q^B(6TW_5USS|(_d%x;4C zExit49Vmf8T)u%ZoS&c1Mft919!CwJOx)uU=i(km7jR>A!8(yzQ0|Vh)_(rFhv=qm zSu18%>X~#4FctqJOJ$9D&wZHihV{}-OBg{f95FkZ@mJpCK0iG49;^E!xu1mJ;n>Aq z&rIkB3L+MnNX3;wu#0XfCUTTMhF~OD^y6ErS170@GjeN-H!Z&nQVZ-iD4=|tTqUrs zE;u_e`Z7_z?I?Mlpahw7tkKqbG@ef$$7K9a)!XQhD$&V&HNUF@=wDBAXcrjcLH|@R zw|Dy%TR92nMjOQ#1dd>BFYWC-H^8?&Tv7D!;nBl~);*rS(|r&dEe7K$xv>;e=*L&0(97($|puQ6q8iZByPq%p_4Z^zn9$&8(rr%gU89s zS@ihvW16d{9BhqbPY0El%Ze3gj^7KX8&;|YEl&4P?S>f|YO#+q4fJ_7U!R=P3XTQu z*gF(hATk)QRuvvjwz_-;63U9dJ&GzG7YiWwz}A(h=nEG7I~N?3t9K=A{y7E}6ob@Y z`9}hHg(B@0C!odbx#QXj{Vg^8Dn-!;Qapg4ehwtLunvS?x`)rsTt=Nc#?P+= zqyiS~%MSJVmQL zyi+HnerF4y-abXP*B*6zI2n~W03VG$2KOb<9jiY|BeR!vGVzl`P%8RM;_q$R z&ptZPU?257K3c*BI>9#vV-C^;mu9l!=fq@lq=`m{TZ?)K_u&wYHUqd1hg*lC0*f+d z1xKL>EJ5+H`09th;uhP;q^KS2tcgJFCr^-oSpx}`H+}fD_vDF9Q$owhl<#$Vcj4Q$ z3lM9-VFHa}+CFOM4!5JKJ$bUNop!hpoLJI$MZ)jBRLK{a3Jpj-&!oK32{L19~xIHn{R?Vv=4#FRwxFB4}upQ znIl(7(X~e_%~2D(%pFbl=u5$8Js+(+WxD~hK{eg#Uf)=caR-Q1(#%bL1L)=f;KBGb6O$qeJwBzZ5fSO%`fAY@%n;PSO=URRLFsC^svks9P6AbKrs^wXp`OBuGBNZNoL4vPrDMT&V@8 z3q%~7{d7QfyAM9T2Uz>#mZ}*8*n)gNaBl}8 z<}u%o?%s{4zoYUkhS7!F_3z`wyrz5>-R9EC>~=TN{tTBFW4X!V)wY;L^TBU$ndXJ6IUsWd?mOUM#0v~nyd3gvQk zs_K)cwoawBX?b3*w%52xX^aiYhp~;-_~NE@EN5QMji$V#P!)(#<43S8$n*sr;Napl zS;IP2FYwa!rLx`%Ty~AYy8xt0I;R8F{IVn4q#T9ffv`G>Y<|(uYrbPIgveuO-x`pD=2$$a- z4!@(KIEQwYnB>IYUq;V?q{LS>dKWFLd+~yzuc-2A6;F*G6eau!6%ReB&j<#o>WdfZ zDnz1ush~GVO|1`VH|mPq`Zd*{u}APr@sLhq%lc|0&y#9I_=y$NW3#n28&TCBRVRd< zi4%{Fav~CIUOueSvh2O4>*Cp))qKh`#r7z!SsvVN{8Ga7j!z0Qs)V^NhZ5c1Y>c{< z(~qAYJpnRzD7ihr3&@U_MdwO@N)#_+s4I5PoC-!f>){67mo9NgYNXg-PzdQ z&BoK68h1P^(aVN!+u9t=qr^x=-Yv?NrSf0~Mm?|4?xw3#@aws6g@PO1mN82U7>U^l zIvh*vA~hD+k}Lx?BU@}%C&pA&kKLrncGdfOLjqpS`1S2SKfK+}9>!!_@m~862?sMH ziX%Lu9X7?9`{}!gxCP5f-A$HgJc3uO1QITHL;4#|0dDMhS@+Ezndp-pA4V}dkRwTS z*5|U*i7m;EFGkxUqCqKKAAcRjoz6#q;VO2A6@XR803fat?;zHDMtXg7U3Qy0gY$9kz%jatC(#3{+xJ^B5n4@@WZ89|`GYG86uH-X)Q4aAs<)RthJREFbs8Hbe>&b^(aTp?SIk)X zLPVdui6?aVy+pR^ib?H!@7mT zg;-XM13My=eP5bTkjkg5l8S(fSWKq#cL5=ICH@LsT-GZ}uw=yn!TwL8YNQN{-3ZN# z2VNqym^1%UPVvQjx#XkX3Eqc(%bvHxWPYe057raR9YS%&NhX90Ou0k|&we?2^X->E zfBV0`LQ~D*v_MHwv5f9@agN{;0-Jc!iM|=HD74DOd|8So5Zq*5c9V|GT{)u0`dG28 z6XJSyQCOnMC~EeHOr>a5=m~w}ShAAuiK)bI9JgW)-}$tm!RRo_!^Gk|0l>rQ80o{KzVt+;2^E%zd(~~>hdmL}SP7#B^9AM~8y3W3EhxRv zy{Ux~@lQv9#D1R9^&Rz_lqTy^SF){237eAv7_+QV54xL-|?%OJg$jz>pd zv;nX}OiL})!hKs8>@C^y2(8J9-mJF7SnTPX2zw)b*I2ZDUd*%6A$Y zs?*>~`Hd=J&LpXLPx~66zZ%IGt=LMbPT(2Ykw7p&7TX)+8T{e}7datDq4DBHzjtVG zX|pOeJ;ZZr+{=ZstVs zsg-%T4v7Cf^u%jQWGhC>fejzXab2IO!kC8m5E+-qOS~Mto`3V~$0tY6 zQdX2mbctfHoKM#)2I@I5A|Nu(9HG8wHJ@X8U&-s7`Ym@m#y+!R#vk8aD)!~go1+e$ zf)**K;3B=QByiPZxx|M$8K_JbNB@^8qukWM=oBiSEU^S|7-0H1)DB@VG8JYaV4%wO zSeo;287JMJr!tXp4qKVx-5RXJIxQ|P#>W4%nr2Yu9o$zfk-IyC^Nzvl+!0(t&)m=!_d!UKA?lBq0-o zi*Y!BJ+T7{1vw~$sJ(2?8J0L%HMNbqH^RKGi5Gav*0*H)mx^Bs&6FOTFFz)OW#&t6Xzr#APh$sGzfC6MSNu_|0NG#Fv-Wd0*))I|C%Y{@P3vM`-vNOR^*% z=3Wt8=8}kH==d^~MI$RVuoQLdzG+rj&zsr_d?3rYkM0F}r*=k5-YNKWNO)QpL zX6zbgU=SNBhaFWyvFC?A&Yc@>T)*t=%(gYr#Y=Qlr=!nWNTqle0m++e|<1-W>{TfuR-2R}LMbL|5cZOLb*VbkqPl&5LGw$SHyjauW+kj_38p zlbxGHN$pIHtF2WTnC?)@QTXNQWT1@4HNc`lXZtGNXbk|UV`^F5G6rqJ=eVUVThZ@= z#Fk;j(k-hK=e52xbu`YF#=El#XEK6!AZi&Od$V_)=waDGL;F*h+bF4y4(uU_ssY^8 z-Sh$cbi2xN13%y;Bjk@(x+~vwLh~soJDIMOh`|b(M*0u6gN;{4O-@K_&|P;Eia<)s zY?XT5wwJXG!HPy;2VfMI<63a+>=z3C$6($=xqh-qu5@A_f9Xu@b+gcGkSZ=Z@VnDV zF1fxtp&daX*<2<{ftB!U(M_?M*yLvq^qb4ey#kgdDzsPIy9{Mg+6$FxazMySh%V z8_jD5vSukNAe7d^4H>g#0s1K8!M(%G*8s0(vSAA_#SiL~Hqb1uV^N#x7JU`Ctab~q zoI>bXGo6!z&D0KhW%S)f-JNrU>3WDxSZZUbL54f1BlTJ#w?1>|4eaQ_rd4t1^&>o@ zC-c%AzG_`4nYTDF#SxT)cXv3aKxCp#+s=Qbs=e zMVK*p^vJTpB9GNafwFimJbvtzeEe9XM#|M$X^e2U&}fk^89mm?6p;hzs@gyIs5}n@h5JK?i}7AL3KaFiNN)T;h|=*ZnYQvsizvw((^5HU@QV*e%$wpIUdy!QL=d z$p;YpUcRlVJ=LE*Y80q}irqA6P$HFNDRwMm6!B9MBe=lRdFC-$1A9ug#M1@HtWsW_ra2%fCatHAaeX?E@Z@2lrJ_Zp;0LGlBIwxt_ptEn7eLP&!{Z^7qQ% zoYPfX(w${pr2!|6`*M6TDc~}S2@jTY*iGlf@RW=(jo5mnXU~m6Ib?+DCd9*X=&YWh z8b~+Cq$wvq1oc%! zLe)df-h?KRUhAv{8yy<#qpbMQY{TBdHiQ!12Z|*{mh4>8EgCMC zWjmC4)hEs()T-u4(>^Jy@K1sD~B|B=c)hayNb? zIsKZHwT>T^`dMinO18kJB(uXul9R7VIpO$`qz-ISwmg0$>H3>Bs28EBwV46tTO0q_~ig{8dnSw;`&5M=FA#eL^{*31(+s>h} z)M!3a2|p$HVlkV~F3%~Qnf9mDsf{=YLqSoM;fe{jDhZ9HzDwvjym3)TeYzlFEWvV0 zR)#Hv@QzGfPRD+&av7m56(iD7XW3xy0Q)sa5B0ddr^QMNx&zIx9dvRSUDD*i$3SU# z3RSKQ+~gqH0vX;K*n12&1l5KKb+{ya2$Y4VRC>@Kw0oN7IlS~hIB~l&ZbL$;XAt6~ ziU)ymfKXv0#3g-%xGW)LN*8wuX4LJHxZ~*}W0kwxt(LzXj#;%s!cXr2q!X@EDpe#JK zOWz7~3XdkQQy&7w=qT|!k1FwAwJe@aRMhPDtaE@`ah`>ax9Lx5_&dDq8ysI(!nc-7 zOeAx`2|t%DO5P$?QbheJKanP%U5vfy_D+yKu;(FqOiRHXg~|#j&>g9r!49vM1c>y; zE{sotZMSjt8y!7%4%lTF_eS;Js65i%Yv!S9?Z>w;BOJQ5vTk7vS<->^bQyje7lUE! zzCd1q#Xel5r9*C{TgvqI>)(o&g}+D`Au?4*$ZPjw!NCViD+9)t{bc%?q3zcRIRU8LGNIt)LOzXpPSI!IhB@PRJwLBp#Y zHB^O#aTlSc56LQS!IB~9S4X8E9F~5iZ@LTpaL@X+UF+BMjhc9DVdOl_tp;*cEIiha z9gO@J0|(WCRlG7jkNZJv`c-rS`k?ydlqK+e4M~-!&s>B0VCpdUA&J#L;O)kN$6;!QmIV-F z)Z)hJ5612=C+>fu?=i-WBR}D!LO9?o`gy!!qkMjKX-m)Ew9fD*cu|y#B~qr*Ji0tS zBPpsjRVG?>8O(#DL5C=sZkmK9=JcqXbn3Egp;Bmv4doYzSlMAaNJgdI0tSq<5@R{2 zlel$26N1)yTaK|$M#O2C_%~`zCKyITm>?ip`b%s7%H}tk_6xt9F6fo&?^Nt@T`}yJ z6zyqfz1D$Sg;}OSYAnA@CK^}2aoeaWG~nW(^hkBmR;$RlUO+gL z7C9vv8mTB+CM$tc$Fc`+T^ePy=y)zA0K7+~71(q1Ud3$UR?36f{N2upWOm6RW1^V6 z{Jo*$TzXk#c$n7c^7p(m8^2TKnq6_2lLGm51$wmwr2o(cj4J@bb4tEYj#87hdZ~h5 zt|=+_Va>}NjYsQV_9`{aj`2HWpu#;9#BEt?3p1&?h?uT8^UnS^rgi(YDZE}fU;#2^epXpDM}9+JzqB3F4#53f8CI_v1xJ*9CKcRas<>U2-3 zPg6@dNO~g*{q*^+d2cbe$Zi)sr|6M$C>5O!<)c<^jlmlp)bC@#EAa`^9V4|jzKw?! z^P3?R9_bRJN{JDbXdDUA)i$P`4&@t9h9l$D(2c~dlMHCF2z(sl_X+%J9_;l}_TO36a8p2aU4`h0 zvVE2{ViD|(#DiW&O=F7DLH`zB?4o{b_(T7`Zo%0uW@de<974uzX^01b?N(%$D1_VB z>t)z*q+iha0|tVn56JIAswi11KZ9RZ!F~P?zwY6$`*uAiBcT#P(#KUfD5vGB)Ry5Z zO!Edb5r$#ZSY;81C=(lvz$(pTnO;HR>dBkh^pmx~S@kwhS85zCWq85Lj>s%yYdjCc zk?WCsLT+`0j4Y;(Ugd&!uJD!~@DsvOu&p+f-=HB+RH~w7h@;7TBDs^qaa_#e6^j$nU;0j?5yy;smqdYgz}6-B{Va|L1RpgU?;glE# zN(`h#15xfWwP;dYNIjM%iE^1n2%o0DvH1wOze{1;*pkBBP<)#wkqWn9LhVT$0yGPK z^Ud{^pSBgunO=2oPVmyfJC&`+VC{&N2&#A}r9Ch{ElU}N`PPqqARI@L zFtuDbjB%@qI#Uk$^lvDZyK2UQG)kXNdjoQQY$zK|U;b`nlBA%XOy~0j1uKF+HUew_ zY7@>^VSB@N&YEuX8j7bfYgx~I8uw!V`K?}O|3C!!fu{3btKP6x+GeY&KxKCRtixRV zkOg_i_n>B6k+=_R(=KWuJ?5~Mbj(qXd-axEuwIMZX#iDm9w0p8kK@*J+~t1=qZ zJrzrnU_YDG(F{{XHV61IckJ0RwB*9TrZ|y?9O9F`C?}3K-}fF%@$eiQpXY6;Z|^vT zb7q&A`NfjW9i|k;X+CR&<88J`!B$w)Uhr3oxh<-yp_;XEJb1+($D|_;>6Cm9mh0dt zZtCewt4@@wtns`Rebz^G)f9=0z)q@Qu z1cINr2O&ReMOM4y)>ckOAp)yPP=O9QC22EKxZ^yIp8j<7^M6E5--1++;d7jS!4nDU zcf?u&9OkS3s%%RYLH+SNpr}g4n8UjGXZt|>fBDDv|3Sx&&+PtljsMTRUUskR`~T$d z=U@Im|9~IQ|3^>%P27Ki9zIb_4`TKDyx5dP$cU-oZd=}ZF=K0VOupn-J3wMjVgS*4KBaAry?$hDRmMBR&0c2!#eu15Bs_~qt$Px+x zEQ%ow;#BDkCR_9dabjR5+>8{@7br&NY&?eU zFwn+C?TLy%WqEgQ94RS;K&YG6PEbK#&gUc935a1Uk}faa#pw-75B6?Ud~a}elkzty zdm}^!u|wCbDF+mR=99{e6=n7Uvjm&OS85uT zA?B$FN4~R^uK9hyVcg=zy)_xB9|us=$2aJtbFa zVzjFWBVO6%o_&X)FW4)Qx>z1`#QzsCVlJkD^RFWkjYg4i2)E;cPILfI9 z2igomA;f#eax!r#L$XLDf+Rerpt8D##ANi_rgdxjtBHzcx*YlfcWos4+?YNQT(QQs zV(v5%;`%j4!x@C;nqu9*T)kXH7&xc5f6#4VI1?y(=%A@1N#YZI9>T;fhtQHH5npTj z0Vf*lBzi=U9!LG~*v2|K=hx)2=7nR`uHj!BUMp(y>Pm$`*aK-utc^OY7VI`ay1N(` zBkYH0tr|B*b@Gr$kZ(P(JS6n0dhSI8@4mRbq5a3@9T0JMbM)ltMH_R{`Cz)$N9|pk z+}wUaO}0aAwgZhyhbM-U-+fpXPS%IXLmc2{Jd4FEixBwe_X^i7B?7PR$UD`4+Y?u< zhxwF@cwoSyCWTf^?j-fCv}+O7ZD~|@Z*BYXwe=J_1euEeNC|o89mK)S@prRTjENrT zNN5x@70(L3WO;ADf!cz`9KNmI%^R!J#dwUl6ioE&Ry57wUl0E6x1t$*pNUQr?Xy46 zs#2{e=p5$&D20qZx{Son@YjrgSu->x!;zT#$Bf1_=SNmwVWZd=Te#Y0EN$=YvzC#n zkmdxx3IcsEaOmgkpWC{FaTHAB!V5sj_3{Ip3HyMX1DIemw9@%~R z4of9AApVO6jItpRa|0{*oPyIzQ10xSm7>RO%Xr1woM)C@w?#ECLb;xBr;gSX#5Q5h zJ!wp~Z$z^Vm78|-d(`(+OQAxqVQh^3x2T-eaRT?C$erkS+^W@~4rIAvL^Xpj;m#>B zzkZr=v}!it&h0mOx2s%lP$>n!?@+-l!*v<~q&<>-v&5i(K@=Q{Pb^>{WMFQXrt&-BB)wD4*kE zoTd=9F{YoL@!lW0o$=ux+HGi|yLoX~KebzSP0g`}gP0zAXBtm(+>UFj@t{{KvW__3 zi)w3j>zn&~ZKZ>8ySCPg+FG~*t21xsGwcMOOT!76Edg zSN6Zf3JBT73J-N!8W_6IUXRX|+G-#XO zA15=BA~T|%wR8=d$7<6-X+U_WY`CeB%J6_qEFFRwbu})vD#}BLfv!+OtQco zR^>z97*w{uBi)g>P1-`G*Fi(X;AV}?EZWhHF&;8z9g~UWVro9DXk@6NvKXEGfcP9q zCa%2J$b3Z)ghfT19U1`{Q^F8KuU0yBLI&!a07 z!HTt) z5cFa`@k<@FqGZa>oFb*J2jstyP8dmctWKnjJ18va4_CM3-cAcnUD04{(h88|SyF*x zGk&U^a0vgW`o_rmV@tp;_7KjKTI@t0Q3t7}=XJ2HA~AD$$bDXlAjs?fjJuB_;+j6Q z6wy6<4Eq!2e(Yk|ZpC_C4)ah`wE5n^yGkXjpm^E^pzQ)^7dSXRJAlGsHPCbsad}RX z3cRTK<9D3Cxv1`*o$FQ3Axo=b+k+?*1B)<3^ej@$mS(a92Tz~j@USM>Wzxm#^ufLR zUpz<}ZiGSd1L$;Chc>HW>Bv?hVz`sPChJ3=@o}_&aq8T|t;5dh5LXZOh$^QpyK7&l z3sgDVC& zY>tH8Ks;*C_OP%O1JTjgL?Jx5o{fQQrFW;r3OPBS=lEn~rV_!nc2E!*V{xZ=b35IQ zw)b~%3AbsBFRH}K_91#EY>-cE4mFJ+B`V9g~1jGwU=V1SF*;g!hr>s~V= zq0NNSppaI&{vIl$V&qD3T)jP#kO@dQ<*-2NHg#yYbjKYhn|}FY<+r2n8svQNajk`V zUE7WYMOvtem-`j(0K6vMB=FHSFQ?3Msx#F>&2LAx!W^82e(GEW+thD8u1 z4Mzd7zbLmvEY^y!VeJu5PXQ^++9?Im&WdKWNp6YQTpHV%*dvW5|5aU(%JQ-w?K>`q zZ>_Yg>XY#?G=nB~FJbu>cM)1PL)y%ILzsZn2@4E>qMZ5W8e1hVLgLvZ1XH}x_250F52+T z8x?K1tR_&A=yF?40CPoegufAgsP;7qD%0QQf4nXcEp31>Gh3}?5i8-sq~YU zaUevAJDQrk8|Y6GNh&NS!oa{ppcDiyV<6DhNXBR`1lzKK;%==J_xl#bQ&(71xxSOlUckAa@V4<9j)T1M_A4GES1=yj&K`==d0OIV`8hFHi_2bVdGo$czRS~~u*=$~H$lL=aHax;etaPO%t|x@Gsna{IMQQy1yn!-Sp~>Mk(PT4C$}jBf#HAw?sv1gRLS zR!IMa!WMk_%dDik^phXISN>*858TVmS6{!}Jb42DzP`n-sRHulOjsVY#AxB~bW2@b z_5qcBu&t~h8(9KSGa?0I>-B>;SrzR>btE`|e)n#XIKl0Yn>@>;&2}+_3dAm&F#HmBWUI>)5GD2zHS6AFFp?QfkT`nsJi@w2V7 zT!XidbPUkF^-ivpUwJ2Ena(vmXCtxyAA5h(<4Be*2x8g}e}$Dr`ZF?|WSALA5BG>* zWJN_~=F6_E%<8JFep%)25pATKyIVM&WYWlRdPI2v0t5llLJRd`v=|6IBaNhyG>g_i z5->BHMlXckw0^@ILEU--H1L4lHF}}*b-(O`q-REDz3xuW40qD(+;hLqJ@?#m&qwk$ zH49s1P}f;HZE=G6JSIj8B(W)X)=p_MtkWSwQ zt|e_z9Yv09w&koG(Kxq=4ty02bk>oPg!rM;gcTPCqoY_y46>><3K2U$)O!pAgK4^O zU?e-7hmQZWRo*$RttP=>8PHi?gG!@Nx7W03O^*1{z{(6Cn;~6xIRp|#zG6Q*OTX4s zn&C~WftrF-Q!XjSp><^|O1%DT>pCgS^O~H?a>GB|sa1+j%?$lkX-aZdMHc%tvMtBS z>#5}adyQui5H8kB&a3V#Hd51yllZas9a^&7wI#Bgt+s3)%5B1zstXDPY`|jlbz7 z3>Ud$R;WVJ6=*-u3Q^sZx-xcK7bEM+$13#4VG)n(kZe6CR;OK(E0FPJfx2w>i{osx zpmjA?Tv%J9DHqnxldX-YobiSQE|c(d*Iw`33C`5%D;g-@dG%WM=CRSbfqsCSU}kB# zAF8l)5DNg3ZfdW+e7mlitF97d*|rX?M&WhQueI)6RDC8Y-&~fDIcCR;;$FA^pL7NX zX(#sNo=mRDEGvzMF_maE=tk%=)z+ul(vP;ix*HP-C)Os#PW!B#wlCYSU-O>KgAI#n z8mM0r_ZKIH*m8BKPTg{MsZ~3#U%N|C0$g%887vtNX(V{791eLvbg{GHFtCP$%cSto zjEgzqUJi#avYUpferC&)XPt0ID~xBF7loQi#-`kY1Z=Uhw^yDn-$F%AkYy+6ViA*# zM#Hj&Uptq73$d6@CKKPWK*93T zuF=u*bm>YR&dry;fh_lSI`gY~dEX{+Y~@0)fx(a|Yq7hvbCT4}i82n_+)g(_am@^= zn_AsiXt%UiDGUDL$uzL5A|c>D^{lCcjLMC7lX{nUf=j%c%NcM%FHWiol#vBKgHm;93f)?T&}1rVb-S8rhT*{a8p3Di7-x1e zr%V{y4ww{f@z$0r(Kv)-&*E@AjC$Ta+O=+Ot=&$Z^vl&nT5wL_y1HF7F*8kS6@*;p zd8H-OCe_+n+3DVTRyg}ofCN3j^Tq6ff_$K}v%bxwU@XA57pv)%RB`Kcyy86BII?2S zxxmXK{0-#u;@6*9uQ*^QerIcX07AoCBrO~$)XeLfKGg!Wsq)FJh@jat7VV4tK;K*y zhs&75)nBSXxN6eUieVu~2nr zY{DdkMea~zJ)t{S!#rFZ{+1p5XV=#WMn^;n#6VYM07Y-#`;#07a)h=DnK^9CYhXQX~oQKAHOIL-Q1%#%(z&}cM*0LLUSNWzxZtGQ*6ZCmBA29-2^wphRr*+FRnr1hYoPk0K1E-avZS1_1U z3~df4oykpdn_FoD$V??H*dD-8a6n#+!^(|)4nWB8)th%MOZiv2X{D?c*K?BnMF}Zi z9rZ|sfrH^oWa4@5$f6EI0e)iHf@1y9_d7eBb79+n!*}{sEHj-V&(mKR3!+ zx|LQXj*kWK=iS>hSqz7Jzat9%dG~rYUBWqa?^?c}CAaYHOa~13c^6IqSl};Jfouxj zektGJEDYa%V}ai=hMWCJKyLZLo7U;6GCk8h(lVLbZQY+%t5RA+zuG)sVcus<-Hf2G zF)krqz2WsKW%__aVCv}$p+W^=tNbjgdM0tNipAHD&-thF>{9Pwv7o4$nu zJWhBHtUWu=QuG3m>4IHiuQG(%_F_lhvD|ko_SJVR_sMrHhk8P*B&n$|FE_;~Wmu$! zw)dXs9H+1CF^$9ChLi|@h@yjaaM$`UsG{!R&S}mb5Mz>3}b6IMt7H8RX0(%}dm0Z{0P}`ZEcSb0+S?zGngdTSd z?MgA7+6CsDTJYg9XEc}i>v{mv;D%GtdiFP z^D))Ws~irh;O7?G3+%X_2|ruV#6+?g)X8@gziqZrxg|5WBM9e6sd=2ML%! z?2DiR=vTKTP^)HEgCJ<`HHCo!`<$c+ytD|5P5p_fT6dPA*<#hmL`RRSMk6%0m&<7P zQf-X=;*2+(jPIp48>MA%Di_*UC3>bOs&CJqmFX? zZ>QP1rKp{vFFzjwl^?`HM1%#z#Dm{eN?f!Faz|CF-m$S98X_0l<@<6fDX2mmS2RQM_}`(>^r|1WTw7`!PTuD)lN>5SjBZZIf)yFvTt$au=S; zuET9D^&ny08I~*e;qd$P!5!~|kcieaRE$ONvH~gMdUZ`L)G$SpVHp*Ri}LW)>?}hx zeZaBmsa+J4l%Q}qIHCmyfA3l~Z9@O=)%dcaztuDK;Tm-inyF=-i?j{*p2ZY6UV!H; zkMdUf#hyEr#cp`>GQB$76?noFbc+la<`m17!6(FmQT=gDfa zw3FSI$D}Y8e2|7`{Gk&)ZB(}j$!r4qFuT5_$($xw$N3@o78*r_lbxSav1J?D{-_!E zANCF~23yDL9Sk_RJSmeT951=0CRf0qar1+tFd8z-?eub{^#4j^xS5HGzpE>8+Us;# z=~l2=G90>rQQK%#Ld?`gKpgiBK0G61$Et#DE6H3Zsw^2A*Ycv2HjM4fHgu0+idVxC zOO=nmQ+bv|htbiUt=zHu&Vi{8!iRAuI+8ibrsI@?xB!|!Dh*(cfb=IIBju7*n0E%r z4Jb4Otr}EIp6b*{EwhE>4p0X4Q%#&Ts>`TL#fQKoSw4!of?C`C!6UAk>h9a&A>kEQ zigDI-`HWoM21n`vH3A+S7K+}gst*o|;fqz2X@|8CwFP@;-rlvh_d9RzFTK5AdV9YK zGyqFLw7>0BHnjTXE^PA-MliUhr;QC`w0s)Zir>QradV6sc|pF7{pk3a5DG5^!W_yZ?@`k!pe z|J3jG!eaiX-XIEp%>VR5{1oy(@$}y(`BO1h$#lF((FXu{tk{^T$XFnz8Gp1wwkVw} zO7@z9m71UBVkAKc56U)dVqQBryXIUIrShg(zT_MNspf(LWut|+l6=H|TD$t;%epp6 zY(?l+qRf%pYIZN@KB^rA8~gVvR~U}sUD0$lM=uOZY&EX*W0bl*x@%E+lAY@OF&w#; zK1KA6`vs5Cn-q;1=g9(7L8D6)NRxqEKF~4v$ron^)R*D$*A&uHdQvgbdAgh@AcV^W znT8!z!vfLIuUC^IH2G14z}Y|AFMYr zLfn@MXSR%7V?SI^s<`uKFXL*8t?cvr@7n3RhRs$hi1Gd14^EEXt25OE`M#ba|D@gf zfIV`E@_ijue#qWblO>w#0y{+uY@kskTkuvd3O>!FDFUl-Wex%(=|i&X3^!)ngd6UT z%debGSLIJkv}(_>WyHsR;%~x}5H-NO`y>CUej;bw3k+nOw7me%`Fm#%TWEo|7kPV; zGPD%@QZ3dax#_V+H89B&5{sH9hD}vN#O9_DY{3dYa6Lzl6PeKmuq8x8u+~JT});p`j9Ti zU5o`~3|?&lMQ+Ksg+N@461-1ac%hjjU^qTzqT*0jPwl}zpUs-<_N|$pJexL?{jl2~ z9CX5N+)F!A+~S#*u{7;@r^gpd?XCCUwH%Sin3?!5 zuRN8S80NQ!@_n;tBJ${w2MF*_tW0I6yj-tzfVOUTt#+q3L%m^4TZOP!R=aXqh*uA} zZI&7m=Ok~dKw@^w+r%bpPLwN7g#RHk3T$JJY)Do{AvV2F99228+2Zt&BW2+FwuNka zjq8IP%DFz?(EGU7*_s~YZX~lD2wws}BG|2WohDPtM-1hGJY+Q!D6@C_iPwx1-zNp;o5M(h;G^{0&p3ps^G+HsR3ZD4{&HWtcndDPahc&$FQ+QF`*FDsJ_L8V5Nc@1Jx@ugZo|uTe z7}la@Yz#0N!rvR-6rc!Qo3u`);lm?vvRL}{mAYE1?G{|Ps^-Z!RnDAxP%93^6*&TG zXt#3K6#-W*8m2}~X3xEz_t0B^?*X_+mCuIIiHBa?a0CEYI|-%AB8k{+{U9tM8y+~B zvm2aZ6u%PH{X=OR7KPLL^eh{vxeh6fD2O|}zdI$d4=ZNIKrmNr@`zxEh=k&Cj*hQR zha6Oq^daatgKANQo8w?`r8t|{4c;&`nvsfPcRa;9DZ+Qdy}ah6;(;`pyp7ZKQXWeH zj7m+(NEmlzj?-zeDJl3{UZ$gjyjGfN43>TX2I>^LXL{zV)ii zZvOhUXmEq8;0}bb!Yq;_%XgScyevoOLoALls4NVa4x*xTeMe;z9$I$y!B0tShSSDz ze#&A%@PJ3KGz0cVQbSrYlvhKbFN7d$@C76O4Pno)1HfjqaX*B%p_|3_VSP)(n$XG4 zb{&8-9I(fz!a-b5Y^0oGM2;gDqK9mF^iZK>GTuIIT+C}i*GDq|nFA-u72_kAR?Vcy zUR{0(!?X@8i2F{u=zb}wNpieA9WHAs+J}#)L$2?GO>zg2GDh@3`Vdon#dBTs*dk2= z{lgKuO5tQMn@(e0)Rmh>t`W0K`viNB~4 zQK`uBk`nRUl{kGPp)=&t*kf9@NO&EGI{N?(Akl+vl%g2Gd+r%MGQ*0&>h)gZ1up|k zJxxp{1M0&(L4f=m?=0Z>0vlAt0xBrkR>lCf{3GN2vP+|(cjYbMyu0HZy^LD+CcmjH zE1WUxnX*?a&HhGmc&Wq&BT2lBj41K4%`-;lcqET>4pK|Hm`!t;&}$+KXX2P_-UFGm z-=pj4`yT%4hj$gM>3Rv2D;2n5vdzk!DzzO8MenbO5D^=dq{WQtL@UeO+F7;i3O`k8 zRP>nBEhFq!^ZEthMs%VX-Eh*DpXq(i#%!%X4sgk>`~@$wm7{I@#!8+KNwoXf zOFV>qtqx!1lOmjtw4gJaTjy7Ev7*i`MwL|Bi}Ny%^IV8k6|+6P9<GNVzrNfuLR&5V)?$``tD_A8G(m6=Ij|J93M ze~FIq)Oy(EaIBrUH;%oZ0{>~V+iCq&3?xa^HjTPppr8;6UlEH@? zo{9l*7;0T>3h28+eXOaKVP?Zp6=$AKZyxz~+bc>%SEH3Q99jn3&0k7V9E_?#F&{C0 zjraWdb1M9jBY@%keEP)8ud?~v#)nEozR7>~>=|YFX^>TSSsyq}Z-Btpw`zA59T+E8 zaK`oPF2Je^n&^tHvo93Kx_WqbW(m4YA_P=4##-~Zkndc5bm-hqy+2;zyoXy3bi!JS z`-n9_Mp|aDtD3WjGa^^C0*Zs=Tz4dqFuuAYP6Uh|K;GJQJ75vR9lu4eD+>%rS$Df&+QG^?D1Mm>19s)hM57e%vuWt9M{Sn1VYb0FHtY=^@r+6+?ImN{&jlD*;VdCN)! zH85yFb2DQ#d2VhNXJB8NH$jEeR-M8G5V02i#qGZT{>&b$O=trT+{jL{qg&d4$sk3?>Hm@ zFDi-Z0P1w{3j6pJFjOxOd#a1nxVANwq@@jMT2~y4cGC&=8ZWI{Zn7XY@ZxQosRt;= zCX0LN$*~1RR?pUpI)Eq56312t0=k|pZXFI?H66~Vkw{$(JQBZ(W8%s2z>|dO`f?O| z<#nE`I~-Dvl#q;UB=7HPkwE8^zRMtDUH~Sq@Ke#?n85;UQ00G zXI6bYq-NqI{o-dE`9v-9p~4>94k5ME_N>$x^nSqMaLiWBtuLozQf$i7ZgL?C0B=o& zM?P|kw|4U0t6~rqJ;z416AwyE5zbXEU$l}QlYb#yci0ux6M@bTiW7Wgj-zH)(?x>5 zTBul=pno_JG|}>v-T-!H;(TFsjs9Vj+xP}GeB?5=xTUNqv+H@Xkl^xXu<^NcRPF_y z>k6INOcl?VDwG=@44jOcnP9zlxMx30aI?>Vr4z=^CV_moFy|(I;A`W+)ehrZb!aIf zY*idUiURxAu$9CjCRuK~V(Ke6bAX^rQhk^s03-pFvF?oYP~S0?aeyqkQoih6UZMyj zraO5$Iqxh|vcy$4Wf()uBwA1=0S@4q!lG~f`1|YZjAUo~86U|@mT2dgjPsK7&l-Vn zt;WDprH?h{Q)|Mt9aYT_7a~PSEsQcV7|#~76`ZBg?kzg*sbOQKiRsrfCySijL)yF) z4j$^}`LtC)4(w`$ZhV)VliTjQJ$U9b>Vfp)dC4=FP$nc?>n2M>HqA5G=z{a0r4yma z^m)yItigj8g;7F8^BKkez;?`57nm!BuXvDO&`r1C&z3ml>MUJycsT3KxK&D#GiUMWVhGu5QhyaiKDF~_XzH`I%^dhGP+)<{yUK`I2~DGI zX`$&IE)V+9_RjD0D~CVI>nav$kBnnDt+sM^Aw;3}O2CvKP1_9340a{;I|rlE8W_*o zP)48gX?nh#-Ka&u_w_dKR3z{HV*Cwm!2!`vbWJ*$LC1TlTSSC|+0LR=TUEU{*PH;N24SQsJwK8Frj7Z|G zMkKl(V{)c9X|HewU{9iP!tVCm4%8#54Wz6vqJ)tpBQYF>IJ~Q5$ra|(cuR#;$=6KC z6M(rmgKOlR?wZ}8mF+a&JO#6>!0fA7eJ>OVeyq6dG`$f6XdB_z-HS2QG*ej=(MAuW z@N!|`fFK?%@{~MLa>UV)L2DmMulnB+J4P$`y+%5|5YN0zbG}By-HPX*uE0?ZSAblKV-G#)f+4C1Vgp za)F0|fwDN_lz$au`sM688>_)ir_3dwIbx_z9AmjiFwUGUvl|o=jaTp(2x*qwZ+ObP zYISW5NZWWYA#I4mKP&@oXNf=%XMslOT9x>mSn4~iwR*~qS~~oxvR`8Pfuf8shr!_| z0us#$ZS_vC?Au03!P5)f5mb>fWbn})5PGzcbvBH>+$dQrvXpfD`3>4J%rEhj(;Ow7 zeNAhX0q?~kxwSlFfF25Z;kG_c=yj;I-1p(qwpdNO7+zAnoq=eD-V+JlJumP8HX#R0 zO4JH;bTM`aPSJ_;jQU8hrXDT2mS|wb1TdPwV5sTT0|E=&pH0qu7^{hRtCbL}E4U0( z9+rl&^U=~5UOK97tb%wjs=C)kkwT>x*##O>%e-x9HO^M4(d4p=s=5R>HJ;K98;Uyj z`1^iwH_^jaa6|T#A9CFtfHUsJiv|7iw)$nob-=9=nWnS3ir|QEMoc8q*8-nY&q6S>jtAuGEo=)5e&*rO`vHZ&W!fFs+jB_rf@S9cYU zzV0q(%VYwLXj&gJGLyLJDiI~NZ3m2q;-Uy^YB5`y1?d0RV_1hU1?dKc3aV^YKAIP(|M`E zYKCza5-vNHEfiO@qmjR1R~Q5WhQm3q9rqcF{@Yx68_zRsBEq(<(_Db5`+{y4#I^litJ@9U%#vBqR*H((uU~&QnW3HU zOoviD`|5o`nnt=&D$fO*EHVX;v{6GX2xDn76P9xYJGF6 z+HhIH17TYJesyQ>k3t7*+*P`nLH8s)i|R;YW;k;c2@@lW0VOSxEKim4kA1)`!a^O3 z)0c{^fyydX0p@JSLi>kLPdj4EHK*@j>g3eZVs5mHGMqZir7Ct?rS;ix&p=I6 zIjV~ngA&}Or9BG1`UQ0Q&mBMK-}j$V{HJvK!9zf8j{g+J5xjHbKlS6V|6}~8AL6GN z|4B{%_Xq)H2POKu6a%UdEQxOiSq))b1Sp+C`gS&XYhrm$Zf()?w@M!DbV@#s$g*=U z_-%kq*~;&}Mmsq?j^VrCO1jj^nbvds)}!k$l4%li*iag=Q97PoV|B~f3b_7Rgj$5( zvL_BH7vIOd{@q$v$|6QZ&Td8DWj>|#tvr@v@U-zl5o{5-mCefXsK>FyoyY#>7cLF zb4Ylr`O;P+7vd)suaL1iR*4Klc_SSs3Q`lMN+m^?#dWH5 zN8U#j0~!;ND!oYZB9@Ra69A-I8g=Uc-r6gnAbr3?JOwGNMj@&e!&hJYJVYfRE#yt> z?V^CTrE3kVloiDbm&%&iA4m`Wcd9)qce(^@Nno?tT}un%86^h5>j0WUHG|vkj?Ar5 zo?di4D{iqiz(QtCzC!(Oh`jT!D1E)Ar36)TGyt}LO`9R(F zJ{+YN88P{X$`=qp6+N;7n&=z-1qB2V5tLdwe1d$N{EXc8pQUx>G^7T%66#x>K zB0NIGN_B-#9FMc58C(iL*5I3;jk8WZ`nR){YZznB{0`A!SID4`*Rocv6b-9tOw=tF z@Iscqa1QE{(Un)Ie}xRbAp1u!FuhmO11 z)KQ4;LbJ+b#vxo7UJ>E^%XBiC`FFB5c=Ru3>h>eKNbst(ApccbKD>|O9`BhHxgO}2 zD;C2RTy0de&aA80`pb-!3#Gdpx#^1}$T#;zWESbp4tpzJtGl|38HPbexw28PKa|lj za+Bdj_i0kqX183-&Q@bKOvenR(C4G^c`rUXI!_w+x)YZrIGJ=DyZ`EyRya~@;44d4 zPFf1t@G`EIOP6&bzuX?%cW^t*)ivzli_Pt=sXDHyS}rX=Ox;yu#f6uaCjeE+@9X9HuRt0bF<2_`Mw)rEb9=O*5`mmk;3y9$17{b)ZgiU8m!2wZP3kvu$9?llz4 zw~TqM1CG8H-uc8{apC`ckMJM(Fkgu=WSzI(}?RP;aU=>HD?l=T0zNBv)?iPxvObg{t8-6keTmzeY_04jW?>tu>WIws!X z1~%Y(R@*}c3Lp~8&4j%ub7<@&8Ko2Dnn1?S4X(U-eC%Q0yh-#F)gDitOrj@G$hHQv zNBdkbm_z}d1auJ>QX?oA;Sg|WK@E}`y|J(e3i-3CJ^^v6t*8uZBVQ>v&!E zRIlo7Y_1o8P+%&~UgcD5983kXZMrQQ8qcP1Zl>cn&t`{j^+{w_W06}U;MmQB6uo9+ zb*dVX6{Cu-)+=^`#b-~RAjp#^4P`A)ub+8qXN1TM$XB_*Fsvw{S1!+!ot-rcI_9CH!g^q69LuMtF+Bw4gaJt0AMC&Qu4?M9eL%mwEa zipfmhxvIT9;rQH%vT}j?;33who`w$m$iT-Meq_PNDmW`!>o=5g=k&B;jBs%7U5`yG zc5vJ4hkOp9Ubq3WIYcsHsQhDbFJ;++jE#aYx5NV4wt<_G9V=2kFE@2BI_^@QJ=9g4 z%Sxb;G}CHEG{%|4DNOW?K6QM_(B;M|-8XnxpS^n<+=ADu$udK7q@0HsZ5D0Em>b!e zzW%_F+S8{`6@B%q$O@Ja9{}YPs_VOVOC_LePNX_l66a{Pdnin#Sl*PfcSZv(^%U?2cJ z;y?HyDS-A2KWB)30idq{4g_FO02nBMz5pDUIZsq>0ovd()S!u`#~}wLc3wfVkR12v z-9R7*rxFuShcQl$4^Ej4(c{ z+Qd%t{YD`I`Pu|0yfyKV747OS_iWD2c6_=uhA@?d9VX&NcB9+IE&ACPvfrU^7>yKL z9P3b4FoHk(LS6t4uE#P{R23UbKD7?m*{l%QL@2DKGSbR4%s{}HNa9!&X4qFPS8FQG z$H_d^q(RnbqJ=IMc=7~S3l(FwJ5pcA^mVMhj)dJYa_C~`1OM1jnUqN@uq)#TSMBH! z(1W1tAnkG;ZTM_afy%lf)8F<`_-lJ-Mps(pIH$p6l9+jEG^3)hFs9GT;|EK{O}1i{ z<+h}-rAy!w`1{~gQB_7xh(r2yB3ReZp5B3=fXbQ$?2+RM`JjNVns#5Hbv2Tnj!)-ws^WM@r| z0?QF1%kMIJXIKU%fkAE(j03XIrCNbQU(b}@mv8H@D;j{CFovL|O@YLTbgj~!kAg?= zZ(A#43RzU$%Gi$iR$aWep?FVqQnkC+_6C4eH$9t9G0t9Lys6~ZbZ?uNQ-F0P{bKKtrC4X#H1%> z<6QSQ5Om+F71MsG3fbfwmz5UZs>#7h?{}ahXh^)^x+<%i^G2G(i~>M72UsPp0BZsu-HFy8?vLH2lQ;vTjUHQfd98E-Qi2IA!NEb>+M!hR`jD5ky{0bV~ zGl#8jw1n>&2a#M1MH7|NO|DIqs~v~X|G?};u7>D-_s^;K{_%%@iuXU4Y4Y~=hxPvm z2ZMu>|3^Rm@&4zB_)+&idfwY_y{P-xi(!f$Me(Ef$cqL~`tg%!;4Nk&U?wx~llA;Q z_d^xZf`r&>YJ(3e{bQm6@GWOEQZbjKAW?F~wQoH!H%Xk^u53wIRECN+iMHZy*Gsnj zGioUO_G6L%Ac`>U6%uO-`O%4J5ACjiV*R%FAko6OQX8OCyuFW`8%qIfmM$(8_DMRu z0Q{(LKA+5Pd^%d;hbc>&{hm)vu?gT0}1%a%_76-HBG-Qr7%t7t2l(w^M2X#-6&!zm8Twz z%KPYZC_5Zw%z$K|Po_KpPduu~F^!>m0~+U;6w-{#i89ag`Re%9$@FyJS3WH0xIu?p zR&-9-ez=l4DY(KDFI?}fy}jIP277tXQk~|hqE1M{HSQ-rl6xmT{CNAgm`$L9)p+SL zV}9fDD>AvWnXz1?QQEa;GxDB2^Pt0C2lWCl?7cd|@b%g0Wa?9rTQa=&H~@)Z&rGs8 zg%^M}TM6bkXKBl7>g>v*a%>V7q7mePBiu^-y-yAMa80VDnS4hB2Hy;*=?qR=ags24 zCiTXdAgqftzL%@13;-geP@7iYD_TgMroQ?HaMuRg_*)e`#5DVIb&+Og+uDp!9vsG} z%j`T$7n>W6VRilSWwNMibEAgkPSSNo5gjDtk{No<5u;}wLi|!b;zDZHNT6;BYI&#@`kv9wT z;rf{Un%f(fxl?x9u*}}?&ERcM5S7EZN#OPduz}}8cLCwmpO@wPZt!2KxQaIj$pN>n zp*aodk{uODrb|V0nmVkk;^N~egZMsd`)wIlBU?|6n-1NtP2XZv)nFR1&9ew48Q-Dt z2Id_f``vEWZ=asF?ZO^k^JIM0^gqXv0;-vT#d))LsJ456XN05_LqL{$1#1ATiNyt~ zm$6#KMrw!Jo^Xcev~KLPv-Q8nW1m%w^mk#aTlivWL?6iIzvr2}MUsoX#W9>M(U%`- zL5sh#0K=cHt=)M*eAIaY2;sY#x~8&)_x!JZ;r|`fcoy}46PV*gGRZ%r3UIUjFFrU3 z2SxqgP5%dEQzX^1)g<-Yh!0&o&DA=U^#wE zqE9pwc++2dCvQ*CZTDn(f^l(A!X%(aC+FrSiHx4)ops8Yq*IA@+G{mlf7Vt0$>egz zRzVzy4D(D2s^DaL;-3U3CzP-E__)#VgOk(KmcIS6j}-n%ax#LZOivcjytgRCzuFty z|9wPJKsuDq5JUgI_|41DKWC>LiFuQOHXbB|vmH}ZAp^b$Nc6@v?g&CD!a9BAdgw_-IKBz3R_>M&u>ibFXNN-Az=DBtht|6VC!wfM(95MRN?aw<0pXaMaWn`A*|Jy`x`JvJb>`wQ-d9F ze+oE{1ULTs^s&NUUB_TU9dW2C>3v$L84*LJX>wtlFqd;FsIa{&}%#RXx`KiOO|a+P2CZQi5{=r-DzlPFW6n%!$i2=;Q!}(1I&?md?(f z2Re(aN6}G9PZ}sQkzLe_Qw(|1?U0%k+hcem+qWDa(^_5o=oJg{BZ;DgT{z-09E~9-+v(taP%dVd@pmlqzEBr_uPAy~U9?cLs?wU0Zoys4 zxlL6Kl~@;N*#&SlaXUmy`1~?eYuK78|9E(;cU)o%eyjX;xbbcE%YZlTnm3*nf;Pic zzCAwX*GGrsbf?~9U*9H^> zEA&)05O^B7H)ufuvTrmX^${KlqQHR0n?Yj*TIp;@4upF+jsx`pe(|+~((RXx@&TlS zzpyhnqu5~j9b2E}iAp1fM*@A4BxgOfS-<}57{M)%BYwi(N(XjolTL(ZM+R?OV04nS zZfMM*5?b0ZQUQqPzB)?&C&(Y=4Sx4NqQl22M=XM~0e|-`An(|N*MG$F-l>P>J5Eke zs!V(>@OCpaK98F}?FjZGz8~@Zi0_BP=NI%$sKXi&BRV<=TMgxeJv?@Jk6a=|uD3Dv2E3*Uu}JU6@xqVe4)TO=DNj6%U8U%k+9qZAhkG zvKVE{MY6c%h;*l?PrcLO@U&qoX_5&2r;X`1md4|FsdPXJJVB3~_eU=HBfcN;{fCNg zD;F%WKH@qbx*3fh5&nqqM}$8j{1M@g2>;_jczRl~{c>{R=;Bwfbyo zWIZ3L=dA|EGdYD5fW3cP*Yee>nzeg%&v8E}EZZt4|4927AdxrG2oo*;lCv|+pGR2} z1f*;U3%~&9HS<=%Fi@H1?_s3Syya$0&Li&`*$F+T^Tv)tYd%?)=J5x^)cd{|Y%@`# zdxO5(rnNRuWI^?6p<UbmHWhYvz$1pDRKNRBxPs16Y4{D9x1B5|kb98+{B_&IEOg#H$rky0@l7~c z(C?}I1^oV!|?F%<(dR?G5$JbBJ=O$J?vi?*Q|J1 z4i$OLu}~C785<7SO16|xVyt3VXzSb8Xc?@i8?DT=^(|m+j=Nph5vQG~=$@bh&g4#3 z2}x~lU3(xFwB>=OOO{?c0t%TN@wJbvO`bF8bGMs!yFO2`FGh70d_x&)&1Y!EN&`dL zQfE2FDd+D^f4+SEvtN@xP3gr59*ae>Qs2$ksK4p=+I_z6>UH~UhA*#tc;L&6R#i#h zR8Yj@(w(ptYCl|e`;h_+zX8aoaET_jV(7~T?P)oeY_<+kjUYBnM{{&4u7d9N+dU1w z6}sQmu>I~<*!}Ln0w2&eqwbSD=y>G$-oA$)+Yx>0gx_={xn~O3VK=gi;8^JK2Zqgj z(0Tghi!XhJFlo)zHY=5R>-EE08EabZr+eTe%E!q9644x`VxL zAc@li%B8!PbfL)$u_BcLt~Qm#|33}~2fd>Ge?R=u{{IL0Dcb+*>Hi+q|JwY6!)4PlOs8+N#cWD)@%9X`5_}Q_ z<&-k8srT~4Z@589qbKD!mMCh8GT^CB9Y&&+P6`#V7J>pVmCLtOgxBv@+^$~Y!Wu+v z5O`~FG1E%X8>$(%0Z|;bta^%ZI5Db%4#Un*!l#N0X2T(dd@w=39Izss22@W~WG!(N z`y+lc&S3@@MS{>muX*0%VB9vko(@34n`Yx&9iU_YEkQlv(*(X{OH|tfF0ihH6Ei$! z0wf+Cmw6q*X$?m6br1ga;orc#I)JZ_;ol+rJA!|a2~>ftFu@E^PBB@(#%(;wgY?3~ z)1>40s8t*vL=k)&&=dSTvWJ9Y@H$5ZwSRFiuyVxSp6kc}jkSVzj9?nosq(1`J}s}F zVq1q%JJz$F>_@}lsP$BW&nNq%;jq`xSNa^38^^R6o16FBdD=WDdJNQ9lPP>zR|YHI zYg$g`Ea;hBHXMcxgKRiz8AAQ~lP~{4U7b0rW9VFUF`12!N05mcY4?(|^o+gi zwTQ#bXtKyL?C~Ms^=BJ#*Tu7uAoCWrBu# z`BTUFWz$bGO!n^uZ{|0CwU@WhHt$W_n|I!zLoR#Im}pIZg4TAvOKXS2j&5z|do>pp zU)a81lShBLCM!o>q@~z<=*^$Hk&2lm%)MtAw};jqhwa-BI9uEzxq*eyeEk_nw_lqB zz7vZY#ApddeU>I?D*8q)d1^V6MpeSC*<9u4!_VGlFJ0&7+ zadyWl*;RQ=eDuy7NioL7*WGVdm>nz`;XcyfHFec~ZB#i)i}L3lUtuFC8;gu;bxy|x zj0@&Y`|Ks{@B+j`bB?+rQuJ^PN3tpga#?mFH}KgNRAt(wJ=taIuapRZ4ui<3ub5Hu zp(DV@S8O&#etSArq%~_G(m_QkYY&>{pRG6;8}V6SP*4%Ery7TJ6F21SEL*16xuUp) zu4XtCf6~3RKELy#F1q7P&swz9shH67`-VyXBPiZ;okRX}rv(iTJZe$` zT~k!~*PnUVETwuqpUv9q24>~fnYf`AI1!8|2}u6li&AyhxY@b!O4dB$h=n806w5$` zPw6$vyTx!|W(17y@eB3}b%(zo3e0A-&aRhycZoMf0eT4P0k~dvU(mvXr?mQCuxO3p z*p#%@3?2r8rc0IL_iba`_FjO`qHX+A~Y+zz<3?pR^vE< zq1jN1gi33|1eUc^P+7}J{?hQKf9vanP;_|I1N+Vy&Zm5Eik?a)D9*I3kgP2v2E#2P zshS&w%ti9GFU1G9j;&-#na*~Gsa!pwK$6PmBovFAukgvnZ-NPsS!7W z8NZ8*5-&-odht`8Wy-~mz91DH6KZwTlf5aH#^Uww=&Wl+Fm(#fR!hq|LS>gid`^NX=#Gdiuy*;j5#F$ZBi#V{(8+syw(AVJXuH)Y`Jz1Y2&e?zpE(m4Lz`S z?%}lv4lqf~okQUDyk)NSmI(smSqEdwiEyvd0+|dYlHN#i4ais?Dd|@V_J>oU9<55e8jwok0 z+TsA)ri;VUWy?#9v(JYiSW?sCU|K2UIrlr~M8|-3Q-en_3YZ~0e55)|mYAm~tr*$K z#H}vM3`CB&#TB#+MT*f;h`En;CkqoJdT6AZfjv{VW{Q+XnzkUEi@`m|+iuEwJB`%W zY%Q*03ra^IXO~+`rmwWK%&t>QEX8<%ONujigTE*z5sZ6IsWR|H_r)sl2Hk#VG4A1E zC*?4PfZ%+UW9C!5b4ZsrDH(oH6>#`^3mcQja+sAt9?Z_oZrgHls7;a!YxsqF65h}q296?Y!IVRMU8*u}LcJ=&S>3Ja&mYwH9&6Q`@-!j~XGNEYJPJ?Rk zQO;hP!C?+qqzP+nD}4vCT2D)62@f)k{7)T{G*tURAVJOH?>CrYb2|4T^@%b`a4kX38^S z2fDG0&mj}DjYqtXGmkZIRC}G2qgC_Wf8qtC`~-fH+!|}on+00Y281WD@643Ug)YBo z@|Kf{5L===UpvgzEZTHd9a>v(Y1HppRRf;pOM4JSbBuZR0PUSH`B_xlb{#VW8SE>Q z28wAB_a&3e3V&#{td(0BbBi#fVQTDE_*BSlb)slR* zNZ8mw)_j1qWbsO4K#m;s(_6n~z$E6&PuF%(TDJ+&pSBIf`Yy)XS$FBqsEFkDPtfLf z&}QDnRn)NHT~Hdx+uDJA_kG(`JjvMAzN@HKRze(xMHUCLcQF$3Y}PLEo{B+OlND(t zadQ~)ABMWo@8TT9ORl<&d(4dUvYlo5I9Z&fuqEU(K0RX7ZtS9J2Meh0L2;bxkCz1R z??No=sGh>V|BCt$Ev#k(Q7!rY-B_0&qUZ0bdS1V73u(MR*mB;zD<~Yl3)E>(=|sHQ zbetBEa$`|M6mHQsXsXhJZ{{HUuCJtCcfs$-R9I};zE&C*Z#D9WN;z7^OYq{=mDFq3 z*Y17X-u%MwsdxakPt*XO7xl_0AYA=}F+a(gu zu7RU_7S>!{&)%li^n8z@s2GOoY2TsCNwkg5U5-&pdy*DL54X)fqPS8qp2Xi_w590Q z=jz*OllI_bK3VL$vmki@Z9%dW>p%8gXOMQRDMW~Y;FVBWtJ&&lB*iC zuZ=6Wnz6Z?%U1Z}ma<_(p@tqm;P$GE!u48RXzJ0ggY?}=sszFd8uxI5W)B$3pfEX( z=8QBc4Oep(TP7_%%cP}W)Q}lRM{1DVbYer;hmxMg&h;igQ&*mAeVk7&l5E;$CA@ft zeYaT-zs~}R!+6`Ig?`nN{(*@r3ZtEgORaUQZ#&YP<`QAl`j7-z$`w?>8*I)XE&txM zX5~ZGeUQucb?DcmtRov5HacxCBM`dnwmeu;kc9{Q&@uxmd$)nq*<{(m2RbsM?5M;l3ZDqE*i!+l~qYwY^+4&*F+$b zi>W0Fg_8wqr3LTU*^4YjpjxJHX|P@TNvM`?oj*WBA7l#`IqF$3StYMQ5`*5bjvpiS zB%GkQ*S_M1)P4dEy<0jMT;6?K*V}J1e&LtPSvuc{FaC7hSk7O zvP|V$mwThxnPs2DMq~qZ-c6@DW@m;}3IcbUP@n{C z$WEld#~t0>I&u+FfIVBOmwa?t!{(;vO)f<%^hy=uvi(d@(y4BzYvr|9TJJK1P~=kG z^;Di~{&bDnz!AR-U3^HgAfKGw=z#oPjPOo*O=R;zlK}6finB6Wou8+RN?E|(0=$mBZBXun*3b$pqS_(_~k9G%`;x^{nP|80=hCptpH$Fvtnh^hR|8 zDCiennv5^Cj4FIzfa#i0OA5}-zuh_ym^pfMM(lZ1)mHRU1nJPX&Lc`KG=;+pF)t2& zgU6-wMVgvHra)B*$6D071T|7XKrG?H6q_F;GvbGsc9+H&Gc_k#;$CKBdj=U5FLpei z+PD-dek-)t#8x83;f)js#LIEl6@A=!rxf$hQX>M6XVWoq8Vr=rr_pJep26pvnd&tR z8MHnJfqzO#u4$sYAP*b`BCeOb?d5lk9p%!-cO)}SA^LIx#R5bT0q0QDG?~~8#X^M5N2l!X(GhpRK2%TOc(#C37-}*JvH82LJN<`s zoq1sQL4wD|56vR95QRD?mA>96Y)2s|G;~jca@lRIh$SOyrF3C z32R}}k(za+RYyWB?KN>3EN#VK$|}56sqhGZ;(&4>tD1{+AR_-`-`s_29#vKijQBG#`$06ml#zn3hgHt&@B#&rF*LMt$L&MtMnbCE0CkxT}5lniedU$z>YRb z&(ZzgqAL!BKv9!k@=7#HPg1w0+Whmq3Unqlpw}b0gv#TO@$3UNV5|Qj%h)m$VkhpDJv}VY?R+VHU}XAYFlh4)+u_aDzjjUu8N{&L3w2KWqG5D&~{b*){-0?KW@J9^?FwN4{11?>;<>M z{YYvjwQx1DMe2^I7A{asM(Hi=1!H1|dE1$0Y0;744uTcGpc6DuU8%F|eL`$+w)X=6G zZOa6;X-wMGw>B-7HWB`v_8GhfKk;rZ(ZNsq#&W@?eUD-3FG;Y4omJ?A_gLQH`9w-J zdd=+IOQyF~wldUHz&|^?ZF8BnSJDYSMbs+JhjlPs z%;QYWTN-y&-IXET45=Qirn!WL;!{$SWqIzH7D`RUjKOLyB5Re9@wmt|XtBaRApoN8 z)c6y@SGjQ3D@0cq?@}YWQQ!&8mWWMNG1s;1%1w@QyKD?IVc?c>vyAuN*6=yV1O(e0 z=}f$&okTsyl1^sKL)75gmaJt&OS#0hhr7Z{>)z%#1@>W=VEWiW9a*&5f=Ae7MNaB< zkyAxV7iA1R4FS?ed$;1*T}^R*NqSimt7te8Q;eN1^AnOzdbS_EsX}ftKk(3TYpYr% zE(w2u0>KyxIirvj_0T zp2!WIbzQZKJXtlO6qCb|61E6V+oc3l49GW(;<2yea8$|#wv41Vd)jl=5x8veeP2O_ zLieGB1V^)+6nF*C8odoxcM7|KP*xu)hA_t{iCP=FXNx@<>7n`hoo{0F_!NEVa;$HB znM^NIZm_wUsWgHAUUT+6y0^a9?8yKOb>Lnz3@zGeTyd{#mr$(VGAhT-x1|!qo6*`( zB5LVdYo!r2u2se32o*32KXHd5lL)y&voD&Qd;%1=NhBAo(}nU+?3UVwm&$N$RPf)v zRbd%fHdzNxy|2*v!m6T(>2@bfw>w~Zw-cs!3X@}FT7gpIiY&|0*j!GN*eDvQ!Yl_H z23PdVG`bbD`XA;f8$(JZAL}2!oSrR~78fDM%3CWKLWQYiR7=5h#d(=6ii51T6|oQb zk7cMk9o|*W9lx#Gkp*(+4Y6J?GM_dvns(LHwone73K zmbiPFxP+;NI$6zHeRh>T1;k1W zuKLrXSlg@ka22{Ij+%OC zsPH|O@9L_LzADpevHB)+{~dUFb=+}Jx4o3T5aHVVx_I@tVc)U&z!=JF-7&d9&@ZFa zhkwEv#lXGlzJdH5vt_2onN+52QOBrVGG-TrhQ-CkOS6PUy%(B`@72^%Iy+l#1S?k| zb2_0}k5ff#S7C7{EQB{2xDnlH5;rv$0`st9*gBUP?RIP)urF25Jm|anZ{_R6(@MgP zW5D+v$nm?8pCUY2BI)(~K57$FzRW`qS6TIeA=G4u+2AF+n9dePnQl4ULHP=b_bpp* ztyEG3fc6-m;{O4P7T zr&!r1A=umt9X>}*X3O9^5TPzCPk;_Lkl_YRbYXH>=jTq3ebQ8Lc#C(9h>44pZ18IL zdMh|Qk47?H%<^1(XX{V^bHIC*y0KA9vG?9L?_qxeE7oxXh&0- z#2$a{iH_9C_NEz$vc;l^ZAxxgrlqIj*>t&>P296?ZScNw|DavOTRiO*R&bJX1AfRD z@-1b?qeo6BN=HB@&M<0OqY%B7xI&-9`|4)Uc6kr%lo;-rH{g-8QUBHv3_-e{ReF+3QE}tdRdR?Du}m|M^4wJkb6#DhZurulJC3(qR`9 z86&f|^Moogxlfi*^d+33;RrnWxFv2R6nYz07wogJ4+8(lXH)XC@P9ka)}2XqmHKd2 zO(zpP%)Lg{y2GVY$qR^{!z4HPXR{TS|8_Nl8hj;)5DM{5&AsL*UD8Q{Zv0>yYlx5z zo&GD>4`(-+IazEKO;}8fBYxINCg|xwF3NLg1*h{B20>?I@}Sg~C)dgN63_CNNsg!d zTNuA<8sx;J(!h{WL;4L|?ZvM@Q_ts%8To4bs;&BZFs#}7GGE>$xOD8 zUl5rsTRcHC(Awl|=4HdI6A3?5<+z>4*?x3NJWmeN>h%-P?{?J}tI~8%#NZ^#XnQ2m zqg+1c+}ty?vdU&%X#RY)Y|?A^db5E2yqQ~?8hFT?sfspL5F+5n&p7x@0pQsbF~UQm z3&J6SH<&H~U4IR>V(l`zXQU8FO0(`zFv%Hakd@WTR8z>Qg!z&{{=q-c!ZzmmUbb2lqQkO0_{C=Z`nO+t z&AGOqLmE>ffnzzxv_UI$_X_;L5Nx*#UnL=F$wN$oi=TUYIS(lkuQ_t&DO(=QDBMB-FAEoyh2B*Xj5XDC0I?{CrC2g;>rkkQ{ofoBqm%(xE7~e1*Se_ z)_sQeFvxk~G1^FShMms~6~S9ticNnt z)torLy&labxaw-FsA%s8LS^;xL$&OCqttnpXLI6SK_@7aCkg@4X-ko1$Ln0y&}QdS zPYYqS@>E(n1Ldmr1t*kOo#M*Slnrpm(srJTYB>Om!E$< z)bECCZwK00yNy(ZU%yQkl>22v1+NFM`@`FN)^}U3?j`I?rz+(y}=VUy#>)xr~P^MflVuynP>_vFP1t73X(1rwL7O+KUt28p-RF8)L&2Ty6 zI4FinrDeTtyqSY^CnsoC zu$@l=m9I8EPe5A670^~+Ug9?~=-I?Cpi9LSD|ixJgWI%g;h!rSb2S|=Qa!R~Htfs-Yc_(;cfRALXEDs=uLi}TuJ z(8=nF(&|j9Cpzr6)uF9DDi?gYxuouzh}O_MEP#RW-2rGwXO3OotUU3`e%vSSuV zp6J=H-~pABuce0~1z0bvgQ|K;$AC_(RN1SgGTLJY969Jx`fD>%cnEs>)Lhh8ACmwA zfBW68HEG>0JZaUIc|~P>ZSqPX1Ogan3hrRy=xepY>t`gvJo7jGH36QlLng0 z3}YSX?frTf4eoqv!&Q(;OKmZ)KRd>A`e}C!)b&K2Lh;L|jp!(+5?6hGQ zw%Qk8eC5HvlVw~G1T1k#X%4+1=NDGtG)R@G5^k~hgWrQBaO1GzE56mmWZMduEe(Qk zV4Ls4^NwKYbPQ}q!oET`ee+N-?BzuiY_qVM!h$u>)KpSCU*%2eGl~oBX2B}C<~uolSiT6TD3ygovP$*l1-9P zHpwu3;Iv{9`euk)zD0}n<9jSATuh{RC@&t1j!+51kFscuO?;GUo_mkZ z(zlPMtI32lV5*(lbXY75O5~^uRjJ>ymmM#b zuzDf0$1b^9n)DHK2& z2JBlax=PbInkm|_(+W^=7AF%(HA7OsX^&GtqPD}N>h@uvScPC~g{pBr)tjFAQsVbm zrTl6+B_vL%s=(26{*|W`%+=>vAO{QxBW0g>IA}1j_^0?{>OT1W?|+X~)e~033V(Dn zlYpHn_z?-4*}Jr0=*MOoOiI=vmcyiR33x*HGA8AqnweEyg20QhbGN0lwS4ot-}@@& z?kc`#;otx68(nz!A(uNRDh`YXTF^3j(G?6pHXWzlpc_9i9ab5b3SI~_R%kvtIm6N* z2h)*5ib*iD1#k^}ii~kFn&&d!Ns=!Wi{db7XmSaS+G#kHn5tqI7ZJrfBGUSLKlZIJ z8c)xcTRLJBW^gQ9Y2BqZUM5I{Sg}QJSPrE+CJ6Fr36+F5z#~c?tx|yBqxU`4d)4fs zxwB$hVupuxDC1}hCXXq0P12lDrLn3bu8qst%%J%gH)8Xp*Fa0~h!(FAI+E!vN_{Il z<>nT}aDSTbLDINu9rwc1mfap`OtC$7$VM+=-~Q5;l$d*!<71KP6d{3hkS4>P5g9=I z^QjJu>s3Bj^jtAqS(jl5y4hK36MysIVca=r;Y19FLzF%nQP@y*G!p34h#s*VIPJ($n_uXffjRixwwGuP z^7P~#o)y)E6d4upspU)%x!j7&d4%O9yZMM(;UzP$9Vh{pCF-U=Faf~wjIhR-tL!xp zr?GJ`>zksu(g{E$3VVf<(CuMN7ZTt-pC0%P4AT03Jq+*Mt>~JVdc|O|iL0_=koSeq zkNsA6yjm=PUy?b;zPIkK70+fF;hLB?pR%-x4o?3Q?|_Ubcti~uIvj#dH|~@@!RNBN^-x1bT0@AO{3Y3x}*8o18a{#lrEB=G(->@S5J*vyT0&%D|hc2AMS* zmrwtsAs1E+vDQV8iO8`8i;&o2ukFR;@yih&IvpS~-hGrFO!>M~724L9&5ApnlM~X> z@$;s4-X!1BmZxco^$sI=VDexiROCreiPPa}BQGcqb2#dHcn^XcGEfRpHa^3Bnj*n- zOyy~M!vm*hDgV$6I|^Y-i+U%^I4*7)$Hxzp{U1zYB-Vd)jes`*CsRw+>2A`2CI}UC zp+iL#I=YD%fk?HubuBQOzN!+99DsCX;LcXp^X6oRwpr#zyS1}1K+waHX6ht+c{*9h zbqLw*x~*_^M90U*3T^LOI0|bkG*k)(EhQ$jDu=){f`GN;O>x6wkO7y8gwOI$LJ<_@ zev!u8neewBPC9EK(1>vs6eN}1n4kZv-@e@I{5qSRObLr~|3EG!EE-z#qJ%{{hO(fw1WsB>E!nzKvAd^ZZx z{X5FCe5Y@{Uw-n-FFya}=U)$T&!;Gz-i%E9#e7r&~;1b`mBti$xvDejLGm9O>cvnYq@BSu+o`vjLfI_8M12-3?kZDLK>4Pya_@!|JQ$)Qp=*XI z?9Qq%S=ClF85;JRzx?XAU;Nzr@~f}C7r*+|Cog^tqx=5uzJ0M>hxUyfY@n#_<#GY1 zvY@4hn|u!zt2th!uuDUu@dgl#bUOap0!Q%RI=+5ix?8TR6Z&yHd}bg_6zDNcLu6JtX>lq<$Q6W zJ-ThL4%L)^VFI@)9AOP_I!q;+9udo&?wtyQg12dM7X1q@{n1YXbA8zM?DiP9O%N96 z?C2GiqXYm!ZH9o)20xsUnu zcs(RmL2VfXqoa=M@?*~%*2wAu_<+aBmhaHfd0WQNkc3qSg*K)8Q5dNuTZm+|D1jl9 z3m)YO)s6tU7xd%6OnX~KLZ)3@UrT|iwS0kBRph!t5suEt(~q1em9;`YZqacMt=6|R~*yO>hA0(X|Q^*fD;Q~ z_$aj=r@Z-+S1vaSFLtu&3LQmO$|$9(QTe7SXccrpes=r-4@OsjZQOm)N>b#(Xz4E>+mgYn0o@AFgk|6N}Gu>QY~ zqsIqj|KEebkN&?u#81hum#6RK#9xF2xiAsHUo~Lt%Oq5H}Wp1RUS;b&KZQR7%VYt`lJRaPGk8i3e?^OVbXe zJ(eQM*cabXQDE17+hrHcQ{!&vWM+MEI{9FwB|Fb!0Y@x zv;52COV7EqXs*$tb1erL<(Z3c&G1p^DpUAzM2{PGN7fY`(c##hbD)lHC}9?d;?vOO zP!W}z*WOtN(0D>9dE1i*O*QN-?sM)NJzL>NX1Q$!r{#8%C~J8;PcbJM3L#RPuc=<% zcI7=G(%Cvx;7J4MM z6&{?&DAV{%gx!Z^vM`;g!9+84%ws!UlIe%fx_<1MmwvlS(8#gaf%IFinY2f3%F!l{ zz;sflw7c5I8=e|M1leSuvSt$)tiDe=5yxwxu+`S%K}qhRXnJ%`Z zUxs`I2z^p<9+FYsOgf_$=Dp*LaymGl>Kxx6;DqJnetu0IZI$r56u}AZ%=b~tR5MC) zjF>~?31h?=4rLz0G>VBg5k6QD`g7Q|p2uly#SV+RFl_X;3&Nhg>TpWX&cvrgDPAuP zNil@Rl%8+d?e3FdEyp|Q(B}?Y7LWF!sCkF<+ZpR{Ybqd_>2aX!qv_-JTS84oyy_uRul$98Nn{)LtP&BJyV{y!KB6NF8VTRRrbB5 zHGRl(CsFMNj(MGe;8>8To+(*rA7v$1kirmH&qM^&??SKR8EH&)$VK|lf(VOPA9}?P z#E7{P=O&b-NAE0qo8?L?!=5%d-T5?dnZ0gvSgLuFE%NuB=m3Lr4B%G}U7qkun^Xg^ z!eNr&!{CmkF)93JTj6p^U3O{J9MX*4Njhv|1&doR$O1G^)U$w$F6W&^WDtewO${oA z=*>1nHXp>GTg$BQ0s{`e!542VaZ4?SM~~j<{g8$B?9m$&bhwn^$fnEa(W8(zLR_qx zCL{0BBTrs*>^Df@!2a-c)P>QGyOxY-LcIy=~B793u~bMPNy}4JSV+A zP~`&SJD}y89zr@=ouj8#G9IrM$=FJ2Qrxdei(~iG5*!RraWKr9wNy3xMIbKw$08Oa z2p42uv2q*`M=_+z6zdiE>LssVcS`tVRWpfgAVa+|0?kF;$OOU1b-rmJVz*WIEr0*C{gP(0j+p5EWe`W3+`unGcGR_9ND-?i5jT* z${tJNo|~CqL21mi-84*s@)9U*lfx-mR_HtI1&xobJrvEbyrVyVu#ffhBO&;?z=<*&yfHs-fG&~RCeeTmb|9hrhVg_mzI`d#FZ@knY~#IDmM#W zxgt50-}4Zc-t+ReH-TqWi^u^OZbtLW-PrDf#^NN^d!yUj$U(EASA*?f&kCF54q!MF z4i%QQ0abgp!-)r#tZFlWp6sF`#C<<318ijWwNQhtP^HbKET@DuO{&}BYFgv=Y;&Wx zftfnhlo$1(cuQn%qQ0*$2->R-&(DNv8@jSIVx_${U|C`DF2p4{8>$8gmuI&!t-OkRTYT)F5d3sKYu- z(c>R=(5T^8`IAV`;J0jOzW%Xbx;^jt^E#-e0SjO4oq2zOhBhh?j4LzPEjp*X0s-m_ z1FJojBJmmd1#hY`g8iIp-J!;+Ui}f*OEFd^M$3VX=*CUR#u0W%D~P!e_=vPLH)72N zTJK;akz%&rIK$gg<6-m%$td8?Bejiw=^@ZbPw~#G7QExaD^+(Lxagy;V>jxhw+Lx; z09J}m(SXsg@Gxu?(<-(wIkncE;cQMkEc3SdajQfJ@0x{^RNQJ+-Q>ruLb2irOv-hd z6(y~rT%B{=ZpntG^+AHd1!^fNl%j>Nv+LD$#f>Xk;&J?1(Z0%s)46BuuNC-}2-cDd zeygKUmWPeT`<$;FzWN1)g_$XrajxKeQ|UiSY2_a?TcmEomH4-vpzcRa&nx7iEgL?y z+$I@YA?Z+=?_PZSMS6=$bXixz-Z8amDd5L}6)d4{vT0BgidfIy$my7_CK`61?B(L9 z9&IK!U0qXJ7QS80wO$ghRYftgS!vei5z{>(!A|{ssBV>&f)K5>A_Y zO$>NGN-vYQ8He{7bbH;NF?5H1E4FNr0IH&Ogiq}`t9JQz#eQE?LWGUB5j(irZ5v({oBNCmD+#E=YZTsN%sFH9 ztP@&Us?9T8fWc8=+h9zXKCT{}ob$T1=SXM}f@b@lt5`hp!P z$*s6dfzo*nCHoa7{6dE&RGrqL57+hhtsbW9bfIj;$Py(lu{T&=>>4ZcMYj4fa?N7@ zl=)jl37(&(t7E`2Y^GiM>4wUJyYy46wX*?5-8)-u);?F7_?T@LXi-su)T{@)*X_61 zx}on}@)>{@-kw*#lX20kL|>2_2p;QpN%5y4$bvv!~bO7)nh^t&bk{TO!U@mF?_UIBM0bQStLn z^0eG>&kJEp&_XL9TU^8wRt%5>7x60MCzZgR0?tk)ToeL8?|^y2K^-DOBT$_hu>I)w zHdyZfb~Q9qs>JxNfDvFjmB5|zPtVCe=0F`b!u@7+@UR&ToWIea#Xlt!wx>-Lv+I62gb(jqpc67#n=!?Sv;(%mu4oideDI(?YHiUg=eOSW)R&I zkIYN~PcOVLo6MwD-Z6cELQe(pbf_|R{Z zjnR-foZAdkxcQ*vN>(;Zcyt6HhZ`WGlaRKxdWbCuX!kk#J^&zv@GjhH)pj1mF~H#IWW4Nw~4~Ah>RN>vW=;lDs-O+?3B)e>@y%4^Dn>v#iF zZ^KJ(L&>;T--`}#r6j3;jc7Gny+6=F*m0@=f%{TO7FyHS`Tb((yCrgVQ+FW`a zu^H(ByD#8bfWM>oTzEH>hp+W4- zR`*kpqInFJGkO-WLJK~{Ev5Eo#?K;$17Wy^XCyZhEPWdV1|Gi9 zYhywkJsTR#LkIQH!cC}#F6Lng^)M)~*k<%RG9b}&!QYIZm)reZW7iKxy1Eg+w%YxC z=wKci)Wvo`AC@o=UDR&7qi&CkG5Z8S--h}tn_CKmIPz$ao;#n{vok%Lw#u^8_x8|B z#5!c-V|>cqB<^!`3y=au?*}eI+S%%N1Ij;J@tiffRb`+^zv3wt=ojHTx{`k73#z5M z)S&G}RgXzqU20c19>B{!db`8}_Z==Jco!=-C|8}m^Q{57_oC#qH9aQk{q(-nn*DzEiHX;8TqDSXmBZKfcul}d-6b9F=qT0Pn zVRQX7iq`pcP$e*NZ!ec;iM3>KuU>RifR5R;qa2JxnLA3y$tq91zsja(Xru5_g`U)z z6=v7-)iU+yQ~-p6acJ2NYdl*35iKXT4aY}GNVK4oN~Xz_EX1UR>Ejee?zc zuK*YPQnNlN*yIg|b!_+@ zqVU|oMTO#uLTcF+ZSDp*kDD>@jR_YC3bMu-z*-s_KdS zmX6#^3Ki3Y@ss$K)IkqgkMw6&4Of?ntBD8S9-;L`;oQP+K|G{+uc12A68^T=j2}wp zTP=G5SZWmDjwvvHb!hITl^64Lh_QbnrJ*T4ch6?p=T(e#;8px8hAr7U>>VB+gomms z{(6LW!0My3NeQ@le^~YYv3dVk-Zxx7brZzkFT8P@O^W6~+SwkBW7rC&41om&pkE2V zC^`(%sfHmW3Z%Lo6|1XA>NUuA0Th&_rMMYV#MF)O+=LwvTYwwzT5X8Zf!GV-hXM#; z+Xx|(pQsOggZZ(TT_gP2JYpMcT`LK!W^K7xE2UIxmF)ms zI|!AnFhG8@)4-VSiLE$KG z9@QM=Rj5cE&Jkr8RB*LifO8js3D^SDheGjhC_L6d*sj^yCy>?$g_v#V+kmf0J)*6w zq2*BJb9ICChCa413#_h>{cb#DIUZXn*obwnl4X4kHS{NQq5>3c(Q&3^%poe<)$hz zaB*tl+V65)8~j!UA0cSeeN4Z^lC%4`3bI2THj&2IKC^BN z=ul~sClO46dN!3qdqxFbha(pKs6|-WwWNo4;(XZ=^w@qhh{He;ee#gh&9Rt3OQ^)2 ze3M{_k$iomg6r9l6k{XVb24+hWHi~#p)MUOwct13VYI-DtzZb(?<~jLPDrs{`HlU8 zpQ~wlhc&&kH8PJ7jk*=bo2f_dOceVN(Ds&-hgXkUIG8CX= z7dkfeWK+%BNssf8^_n$ZjUI7~zH(>PoA20N*OwU^RR{-&0DojpV0Qx*&*Lf=Vewe5 zd-c5jO?9DA>M>V}wu`myNL1&QZTb)uQ1C++ab&mMB8oe=RUD0Wk=*1dtiz;@MGDL( zIfiF6@fd9AoJoZf%YO)5n45teEX3Oa6C+CgIX8?gx^|&73+xxeTua`d`C>Mjq}P%t z24xq0%)d^i*?cug#LY|jO%lb|^lWw=nDE^EfS4umY_$r_bKa`V-dQrX z#2TiUMyCn;EoOi@Z+pubB_UI`m0H6E5FY050s-q8{(*%~pjyD3%x*f9^ldu%$xpmb zXYBqc88L}zr`LKGXXny-oRTkANn7RkreuVi51CW#!q|STt7}8hy5@a zB)zydJ~}(lj)4wm_1ri8*f#J_;+Scal37uG1de08$Gm~sxW|4!!JoTE` z=3oya)y08w$d_eV7<5FV;$r1m$=|ZO)+of925ttO)FQcz9ZomBCZ~UFfIC&58KvjX zy=D(h>a1{T9=En(-IohufUL!7oJS_-WeallWmZ`i<tXDDWb&H`9rk_4lEG5i=!Ri^?{RI(1 z5IZJ6OLuK+`lHA|OXfT%{qjp13p|jn=CF6S1P_e^%=`osj4d5B6jT{!SInD2wG7Dk z8S~uAv}lVT3g3^~4u=-dU?rpYDkHv*PtTN=i0X)6!Rr>)@|=%Tl0}J}yK*WFQsT#= zKattSr*L|}IWImzhd2qe4RRmnJ;q362v$(Nc!g=RzwOJQH*|DTLI$e z!>F$2+VZKEv8~*oBG%du3rpU7zbC&@u9X|vO@V!=GJof}M|fWjQC#n)r}fLddOad( zW)zPWmUv^=_1y%<0df%WjlW<9caPO91d&~vAUn^WvvHPM=vuF|!pu7eiYpxlLkFy< z$3M_gSL0h=>4q+U$c4`3RDzsM3tlTa_qyTve12`I?Bt1I2F~I)F@IpxTb>Ty{m_fj zgG%;cPZ||anE{|ct3pEc&NA%PXvOY?n64BajZ>FJAcx??z4`ynl29pUQy3N&ayl=s z;sT3KF?rL0yCxTAO&+w&YB*l#Wq==z^`B=~r$6o^a<{gFjRZpUp^DQkHrSOuije}1 zCERN5HP=w}I@Ynzij14hf02q7Z&gY~l`0I5;K-Yw7Um-Klx%5b;6yBR50Fc?Utu{; z{!r;liTOzz<+aE@>&TIzh8Bd3Ahz&$c`C9B#b>|aMrhhpAVX?`eyqB}f0Yropq7_d zArLY&V_*DOJqZ^$Tk`&|J-~^pjLuSGgBYK$){EB1$n(g$YB&ew&r}@CC`n z`W#!Iqn`Dp7ujEIu$~4JOJDmdMs)BbRVGV#^0IL2RSo0bckO@&2J)!ol*UuF#;}o) zn{(*QJXW#xDkz!liK{7j?I{ad`?09u*6w4Iiu67!fu3B#=5(D*Z>>}oOeuuS+EWUOm7Enm=Uqo|~-pls^CzTe_15WgI3IbZByxQ99l zwXPPa8A6+9GOxrl$`m+v*gf2ZN2-iba{IiNXfreK95#QBK1s>fZ5V6zu^}i9%#j<+ zF-rAwukSPp%RPfv&{qOh^*r~e3_ja^uSZ%B&6>~)*?pi_4f=HGC9alRCvu;VH;P>% zE|zeyI~UXyZ=4%I)8=9r$ALaJRNOkS-dnQqXe$Vu7Ft0nF;mWo;;!e*TfMgH(N)~6 zw>ChRuQPXn)-mmLLiw+L5ft(7X9=0%X#Y`@a^2W0e+6;(EilCdp!v+)`{>05MaeE}*SbjOpAdDIP3CQA~Un#fNNUWD22;%)lxGbF-mT z(xud0O2`8wFck?jz9UW3h58twrQx=&PxYv~>+F;VLaHk_$OS~ADS#dwm>$<)RnNO? zvCJqL@nvNC+c4?eLYl~{_FJSee)}Gz@i=Vv!l&zD6pLvv!mi!;z*lrGp_TcTKR)zy zEG-r&4NgSW_HKtU*&5qx!?OebaC*ygkeSl}5K`d=rTD-{Dj{@DyOH$T1lTqorTw;} z9O6Spur__60ekDD03u7iK6?RBaN8y67Ims*;EXrPt@ywu*CrMoniEQk?!>52O0ngS zdPh^I;H<@=Bd<2EVdJ8pqaBVpYM3TUfvT*2c-6*<@Xnj>kCmJ(DjCj1dS~wT<$0?x zn}uR#ZuzXXLj_kwl*In*@M>Qx&e{BBn&%0elVDu65jH#yPNpE&J|}v3Nkx(|W;%P~ zuK=NkbRp2|1nf zKE!qoyjjq;sCNnyCf=(UxbOYKt^su*16nMO@sLE@fFHGe@yH~7^(vd3xu{k9E;qLC zveZ7aYpYZC8)?O*&cVsmxsaZ2AT)R1dxNcXb*{nH-g>xq)(+aCjPei4VvgHfQI%bl!)vh}ob zDA6_qF!_!c`GC}bc_O1v3wnvvEX(<_px0<6^rH zMGP32V~Lo5stlzt6`>k~KVbuAQy{>D+E(bX>2IyrKp%d>8t9XH_TvJccN+zM2FXGsxWV&YP12vZP^HpZxax$E*iY5 zdxKIq(b>#HfzDA?KmlwWJTrU-p25N2KQ!ND%VX2>JWUqkOE$njWfZPUXvu7vB9eigUa$O9jpRDZ@f-;KWl5@&UF!+}wJ%>V)okcCH+K zlItrcnL;cmkq`iY?$O}*#M(bz?m1>Vb7lXQJ7yR=u|b5=>71H9-d13dG5J(&`KTbul=Vq0 zy1xFbWt&M1hZ}3qM|tE@Y!->ytd$nX)g35K;BZJvY@fdPY&S@su_M$j{Z11F^j)5v z7K$4WGy21C0Rw+^(th9@Rhrvd$OQQp0UjS|@(%J-(35dE9*~e=SXZH=;lxsj#kLQkubHvHitb-~D)@vnLXEwp&jraTM zFch>laVA2W(=GzR?|n-o&qQ&@u6L{?c9ok{Z0H?fM0RRA@d%}n7*Eg^?P4+;;dxC2 z&I<9YV!1$l)6?NwOYEFhHCwNG6hYw7+eP(4dWNf;i~~@I`j*DYSL@X;CTX#+gFpcD zUmfqQUZ48T^)@pMMX>hKym06)9-gZ&l!$>g6T{|4YB-?hN(rlZTmnZt=73lDesp|= zO?ms&fq_FS2{mTGuIvFDwH$^2mCR)wcw&Q(TyW}|?gnfzYmgFehjIJeuy^OYh&R3J zZGPF`_Ils~Y}j&-J0wcQ>V;Zc{jm1H@CHz4Oonexhi}|_5%)3*HFhA$P6Jjq-FRo{ zF*r`hCK3e^wnI&mJc9!ckWYre#MtkwVLahTltw%rUl!VCK1xMe z7`6{ z^T!{N7a}DJEVYhef|oPt+ibSVsV&}3idKl+I$hqrWxa|lYgFYtjncH7ve`enphDyy z8R990kh5Fn_#c>E%BSKajd@qd;${n*911^nK}VAFu9~gQMTPn>OX`(qyIaN1n>Gr; z@Q<0ATg*k?d~08irS?VoQb`X>y#~}QoSk_&Y8KIXXqrsNz)n##5E>*!nK1sPUNrQ@ zUN#9O$)aTgp9QtcW!(ZJtH8)-z8TnX@DI+d&DlWim&C-M7aZYi9%`4P`(4~6yrQ#wr zScR+w7q`m6dRbynCS7!hyiS)1{JWf4eyD|AY`&PSZ?&gO@pvHuk3%$40-Zq%MnN(+ z1i&QEO80Hp?d>sjf>+LEtV@Qe1;ZlwW$|24e#ub=BW1O`@6O%Dqg>yq<9XikQAX8P*YpL zGN1^$lU5I=>5cP@LhsThVhFck%mhq@n>n(%*|IGHpJU=I$ApG^2(GnWj>A8_39@4BvneGUk(=d`NwP^>go*_W1@!GI zTciPfH?feQxa^eBcuWdx*79{>ZLd7^SOMZwTCAqA#gh9gZlM(v)fMwsZ4sGwD5Eyq z6~a@ayAA;WuIuFwRsZ#}Yw@IH^g~u_bG{$8<_)|Ws7B%d*lS2vr*^6pNj|bmB_s1~ zMfy9Gij;(|AJiRoR@RZLSgStY?p$%tRLm!e0lVT9hn%%l)^P9xy?Eln8i}hHNfiOZ zVfTH_Zu6SVP+>d48ss*wz_xfysOx?Dy|RzI54dTn*Mx@qDLvLt`}%4BRIFKmS)XpW zb0$|T*B2`z<33co7$vH$8RZK|QnbhojZwlRZBEy1M0cx@IJP*FIX`cE3LTfCI2!Gd z$vQypKSc6A@>SSWQ{Qn}3pGHX00Ijj)CPf7Fmjds)R;%w-bTpB(d>3e8|+gpZM7=O zDXYV+MJv_H5}`1gYHvC~Y{l_S8us;%jzxvd2u&kMJf>C*ll?-)!y#*1oDyhs07cS1 zo_6n35Tkq?;m@WD!%{gZv8BFpIlI2i4Q-fvuj)|>H7Z7jdGc!URkWlV-g}rkQJ3;$ z;_rKna*FOT`0IX?(+$7J^w9ipbHn@0kW=aA_NI22!SQ7>y&wVUlJYb!7c-1evdCOB zl0tpG3g9#S`S%%_lf63`JL^Qnc!579B;$ zY6!{*Iy8)-p_?7iRCN$9=C^fEIAMJUCpxWZ;oMMeI|fL=O)pfGpjuJW@~CP6h#b2| zI~1=Rzet7u+p!JRNZ<$ujX3nbD*{-$ey`j2cWcB!6$*@3jX8t+p0^{Ke)V`DqN9Uu z53$7CvBWh4Vgkkk3XB%#VXQVb%N#AzYaeH+x@Q#ee?xs%iJF=l zM)g!Uv(lnVT{mxXV=j7w7Zw4fpP(^z#1^Y)-Laq58cPn=HcoPhNT|e?0HZq8Eo=mA zqSHQx3u^-bp**N8U{m$( z6+})ht>UP3(0e8aONRjMB=AAYpWqD;?P-~Q@UZ( z9zxrz#%jM!em1d<-7N^g+-(+%J1fzelAVxtibxBC?+{&iq--EFmz5J`b@#mtTpf^L zVj$)fwswN}0FPOgdy>z`(m^x|I{miC=Qy@IZG9hPoezkO)7bOgT)%K#h@0hy}Q4gItck9ZtK-+oQ6ZiTxsU4`;>(^|#Z{52o6^dm~yl&sN-@#L5n`i00 zP+nbEh4i3npM*ZXbMO7D+zQinW?`ia##9Z97eg)1$UJ0dCz9>Q^^PpFS){Srflg{` zNV~4LP1Yujk*>heh$W;Dyn{nrX7(ko6;^;u&`r@5<^?+TWEVA zNoIEmkg_g~+sGvO<0(gCu)V4ZV@ym3DtNFoCq-K_;B*m|7I?GOrgbIUo)>I35!dkp zL@1Fo=C&;%?y0k;4r@!n8%#a?Hqs$6W>a{IezSDRNTX-w9qWl~O*lS?Pc1%(4|=Ee z^*!}-$dMO$v9Mp*SHJK%5MVL>-~9T6hW?|U&GG+wanyTUi2v6c^rIi+|NRg@h4_Cw z{of<>-#l3Y>Cy%6_!1uc-HG}Kf>`bdVp%)&h7Jn#p4gDhf-G}mfB|7RZ54N1P7`Qj z3(%e`P-~k*gUax*odCd&uWp?bfRT}H&@!|FX)>8H-uiNt#ZE#v`Kw<6S(K5@ibP95 zbB6gW&us7BBIamU%=|ZQSv*h2sJPC~CaF`yz|`>gel;BJSc7dXQ`-ssKl~bDCGuCr z20AB?9!cY4`v;Y4sGhirDn^<-CQ0oCM1|H{i(o7MlQ3v0BW#L#2@OZv?>Z#h@4%SL z6=^SudqROx9JEBGSKA~T{uLH5cZC8-e4^%u?t{u^9%MffEB<2U|cp z^0zi&|2|FFuWW)f5>7J^_15}7*7a|#{bN)6=Kg)*S;|MsN~_^!~5gz43wPm%za zkqtpa)P4BT7Lbv`QTa9*JxnwLx0|C9z^DMBTDfmGp{kMlA5}q+54~yUe$c9Um5lZi z>!sbe{o2NTL=atFbLHDT{raQo(p~+&qTvkm(MJ^x|Ac5 z=b%%CQ%^vrasmiql-U2M5?~Jk?!4TgV8si`_0~O)TrRQ9SWEwLC>}oI8Hk6PB)ZUU3=pMBYwaU1-;O?>Xb5=b^uVivDohPcdXjt$|5Y#U)6>(x9&s;DPpjJE zhd5vGkJ#1vp|GmZ;;R5;!@N}NOg(J5F2Y6eGcxk$+{gwOC{xZ6-(K@L>>Qo890g@= z4#*;k`g;^^qq&^1M>v4&M;c1}*QzRb)qM4Fi&`Ev@o!WI*!<|@)<+1~Z0$t~(9&Hx z`wMmH&gd&$NqGqeR{Z^7dCD>PZEy7Rh!;sRS$iNRcq5eXMk3)gyWNK^Z!ZdD+fwhW z>A>RacTf^!5VV@=^||1FYuJRs!@XFS4>U~RlppdBkxz4oWg@jM)T{bEU4du>$HP;F zqI~M%OEiqI^~Tn=y)lYct#4!4Ch7LxIKe06s4*IwX&YZAizXMqYyJ2!$a_E^<+l{P zIvxzrSF0c@Owwr+kh1^6;Go=ifWweZP3!a|8kBq(1UUUR5dkWo3Y(0_s1D4#IT^L$ zUufZ25v%l@USKyXo5w9^2FE9H7q9n*t1F7!^oSc_Wr7b?xqsa>E52=O!%Q( z(Vk(xo#b5w#NMmDXZX~^T#SN6uFfcJi1Xw^vsqdFK=HLY6>y2k@zm|kh( zl(dRF;qAL$5Kq~=*>C+q34(<=u*$@Pz9$9F9_j+M@-WmO*dGG#Dgu|qajU>S7N|V$ z_|3nb%$Q|1|C*5ktvT)*ZSSn@S!x79|38?0;#ITR?6%;)haR;KYje(bfdB{QmNSI@@`*Ew;Y8CVcHk{QCs}*t#HP1Vw*-L_bZ4{Gh!TL+U?qI?3nVHSEBH;=@_lNki<7pqpk+l- z050^eyfdGss<7oQX)@4>MXFZhd&KC zf~-C9$xlZ=1u*MQt$t$UB;RZuCzDfWFr#?p4GwB16Atr8~x=3n!-%0fhl_-i5Hiw%Gu6#>hUXC#qUbI|Q|do3?duahaJ^5le}q-mt} zPZoxieTTUoqa%UuJ;dJ~U+rO?QD@va>-eS165lrp+SQ0?8W+Q8e6l=Qo|%_)moE3} zb7YR0mI^OKW?YR}x`dV4@^ugat_FV_`Gw?21P7^TP9h}5n(J_^a;z$C6ilh)%ERf3 z6J^gC2srFC&t_TPf~5}yo8PXI<${@ha}Q~BuZ3Tv%xXSQ7bP+!BtQS^^WP{WfB&~H zzW()BEx%QrCJuH{iJ#V-q63<^qfywywh7?nPS|iU18ILbYs=qZqW7;M{KjR4?Nq2O zb@}Vhy2)_pOF4F-hGz=T&`-#+62X+EyLm0{6EuM4EYnQdqgFxWXVI?>(gMD-6r@f+ zU~u7Z=`B}iU~%pJf$kmtF!}==Q2#JWC+WN756R>Y*tI`2k6--(1Zw>k4@Tv&FCZM@ z51w`>=0CqI(4Nh>Rd~Wu{h%oJaA*O+fx?f#huUr+H~c6W!lw3-H=Vsr(5@o&J`zmH zN7Y%2{g0q8A37g)Xj(Rx_q)}(m|3Z(lHs{y>XNrur;6W!#s z(;}y#rd5tPMNmYAIzo)>*oD0aek)fTJC@L$${FF|&O=+}n^~TE@H?3W4U^f_?o3Ww z4pDj&H!^dqNZL0*Ywkdnj}A99nxjr4A@%jo@)+H-@s0C>jwK2W7G-b2rCh#7@{KQA zd-9E=C-fC0zwB4&0kRxcXEGh9XL7pNK}}udd0_ zuh~3owVEek%X{4N@It^tmJh=?M&eEikv%I4V>v1UMaOQ5(n<(sS)lbIqac94fp3XK zJ_}k6hZg)~KA)smWJU*6{4~j~Q~#+)VJ)jF zkrN~Jg>d*f-{&fPhthnikRNf_gr3vVs`096@V>p)cWbu_Z%~2qyLU+i@Tdyrx=81f zWXvhRIhgn!NUUU*veznbPpi*uVw-g50l(g}3D;e#vWjssUt(erHuc%ti_Jz~M&-ln z-Oz+}XqtN=E#YKGL{UAWXd|LkPDy5hy}e*_muO2-p3krI+4)kbqr_)zl&N4;x$U85 zI5fozMEz@zj5%5*d6Sq~Li*W<-H%B%=3eAifsI_aGE7HMHQYFCQ5U0ZRW*;?-)zko zy&35@Zll=nz!^A+w_@ik7_Sz2_7=0V!-|0MM!>wJ_e<% z3+|K(>lVJr=rojVuVX~FB+I!fd&0aZLz9q(A}O1zRiE6jWh3u0Q=1PSUzajbD1^bw zzx>>9*?E5OEXIc~D-%N~xfDw0vw$dyPx^r!G?>i__bENiFmsF`hQkAAH$v1mWz_XM zk`?~2auc%68^7b;sT$a8qsPI~T}}VJCf-o5z17N_gJA0|me(8I40EWXx5i3HA&jC-02RF*p3kt=l(Vs-^meX+OJ)~X^ej=WxEs_OLbT~{ww8xA@~Q4)$| zD(V(FP8#zdmE{c%u}l zEoMjmaPK_un*Z>8fi|z{BCk;+qp6FB|9kX-sz1jol!V29;ll844gY)ep=N(LK0ZD5 zj!%!_7yJmOXeS)66cQVSg6WpGOTH>mGn1U^i;_)XulC;U z3OEtKl3rQ>N4jc_v$qXYL)IIw+0YY$-v#uQhE;wJ&h-$3^92P97;B z{{H6F%opu5vAOmcsJn%$($!NP@@5fx%b>r~Cv{`4%hC8KjVFc)=u`5}yG9*a97+oeyu_3_aiYvt3I;#T(Ub$PRN*^bwuqT+`GCk8)w543F4B?>}!!^akK_5I) z<>|skQO)MU+RWIRB05@$t%fz{i;~STnJ-_fLxI%M1Q`~)zM29|mS3j&WCtUzVMtQe zCpKj^T>*HUINwg4Z?D|1$zJih{dI5Tesd7JkmuMqOg#l%^*MveNyu`841M)I?C2ys ziB4j=SUEnyi~3V#Cc|%PZ*WT`L#t$|6fdOFN3`xfItf4C!Xw5fVS0W+tKlRpF8yLl z7#Q1=oBA*|?5O{qQIF<*-DI=INj7)xUzoBByu-)qDL zg}XI<){tv98XnUxC}Mp#WnC9>IJ=0VVYbLFvMD*-k`#oZAZ#s;AZQ)CX>moN6}qiL z<;#YvV--RgP4=U(%<&)*DOih;Nh+D=wgH5wZVE0dl=?-pv9@!k;5(Q246 z?71ZLO)xO{Q(aZpjJOqpu}Z&muZj5gYzo#g0ru#3yWQ;*P&0Hqm%MJtTLK0j<2qQk zr!;`hMpqc%Kh_VhaWHEJU;P4Qi9fe{(~mz}ev1Bo7>xHrdjM|s|BJ);;Gp3D*N>w9 zkN$r@#81KhPfh>5Jper&-mW<(XRO(I%Z+~OmmoQIfUiy*{MB;v-8Um3gy;?-*&3<4IQCLcj*&qo;BwU8d`dci{i3RRa zzI|&A6xVO%65s&~O_T_-t5h*23dN%OVq%(UqDv%gGePeo-Cm5y$73`cmf)J0gzrvg zj;|?U+cQZZrDo(kd*=1v{NCaGIQ&Bg6+0I+Mf;pmCbs4(U%~piH49IoE_Dnt`v-9W zz*byN$lMv87^b&qP_~-Ta^sHjLJK+e%{@y+->DSW_4#+I>%OH-Sf6_q?3ma=_pkDE z(^f@IcPhA0Sot(6KmD9hky{F}--?l^#1G~knvGr+nq!2ZR7>HV9V*FU;GBWMiXfv> zwQR$L#9fU|B|4FSGzDjwW7@bR%5H>-)9?YI?%kCtUh+Wb%06!uLQ=+7RlRb~saXXe^7;&#VsO~3IjewT=+3ndq#YB=DacnGK z+gqu;5=FVUPAJn!I=xt4>ci{QE5?zl4)ebuLO0&J2F0lTe0fN(imP%)S2wi{DTxsj2tFXSfWKQ8Xzl;No1^b?6fUm%PWR;gq;^LYu4&MCx5`i1Z| zs7l5Ss>r^ogQs)o^vIUEN|w6mw_l@`p*J!CU@FoxR_E09YKm;g+Uqq6u?o!)k(yj* z$6LyuGWa_?WqT0J?l4K_D4a%OJyWRDgaG1N ziSt;M(0dEcstf03IWx)Rc``_l9;Nsa=4FzNGa%j3j1udr;JsGG7^9x@@R?>MDvUbJ zUQ%pMp(HhD!%#8-s8|>@KqH{Y!eDY*qMn8B{hd_;I*BIvDu1GL%TY6V5jLGnDheHl zi}mb+FeID`p%rt4n%6`HDtxeO+Bz^2tSuZL+tw z_(Qd+Kag25@|MEZA6UZ#a5a4rfG7;_?Csu&Ub=O<`xrUaDY#|07`5(yxv9ILuE~&t zKijk9sHkggtBjSjf%b(vBdCqst|Xf9d&Mc!UqY8)+Iwes*~re=l%%4emBq#M6zaIyqu!4! zQAB0k@S8pCSF71?M{t;J4%!h&z0HGm)C*gdk!TKGb#GYheRot_58tjQtkiZsFc%R=xk1yU4EN9RIL$F^G2%kOXt7w$m)1te`MRe(=;i&N zurdEUZ+j^TQR}vMYsb8s&vGCa_#Imhw~+8wQbwfk^vb2;Ei|D@VnUOvr`)Gzi>?Y?MCMF@RSgK<+JF~(mK;R>mru=Kv&Y_s(bKOH8A2tNiBiM`-r{OsKCdUoE4egUp zR5}JZu*_933UFt@e+BxW49D_4MemMvoMnXV)!_^k+tTqjHfx)e~(C8)l0a^>`y<~B`bHBC+r3dYUyN2b)DD6)O9~{+i zKv9csT>!Ul^}w#5-BLLJ1|RBh_#a3*=BN2)NT~P!UP2~! zpQdE#@XLhkj9<(b{0&!}|Myl?{xhL>D>6p;O*&WpFaB3!vasU<3uoC3c%X*^}q;5s?>{v=QJ zNjPJ1cWP|C^WzK#DL*D7@0>;qAIV#6BDIjC$80a6Bd?001IokciT*_DZ#y=h+CBR- z(hz-%oo^OFS>Jnw??PWz`JPZ*F?nlto#J2-0(=G;lCd>lR7CAsRUVM%?BXDLb?_lxI&#PDHfG6Zg)%yST=87@b*jk7C1%Ew-5s zsztQ&Az3Vv+eT?j)rgWq4o!c>G*#Cr(Vk)2(r;Jn+|3>pb!s^Zl5J-@dGUhy?_aZd z>`BNzDNj1=Q^!wK}hTz)#8k zhuuX!s0q+!`=5UA;PIen|8oF;ezgDj0e*`1KW6&BM-XuBbEFMrlo62eFQ7}+XJgoT zmd`gC_LPDC4jA}Ymrl|@YbVtKoG4V+Gjgnmthi46%z6OtPeKd$Bpg+|MT6|Xd+u2e zTqsk#SXvdcp5sFRKZ%@Y>S^dck2tP$fB_55H^(1FLyd}1E`C!3f3cA?&0_;oiD0-3 zhT(1~g7VAf6)&ZeA@`8qCycvH4j8wnU};aTRyxR<4+n%kTlT}Fl0QHZ_%Vax=dGaa zgPK@*Wk`i~D`?mbcSPEuJ4XgKkGGYI+DG>-f)#b*-J8XLJK&XR*{u-=>`00Q;MrDq zl?tqH_jcD(WPEbZQL-|4Z5pW)+>%WxIJj2OW)ZCQ1j`=Uq*<{Nkbzb@o!G7P;iGol ztIMZQQDR%~SqX*hs{$`z4NLgRA-Ue4aAQfH;;82^kll(OQ1N@!*`+!=M_VhEXsCSf z@yWd}s;SDSlg9=hO#)D!d-a(K6kJ^ILCNu>6HZBC2oCqGX17H<*AoWhScZ|RwO?{a z#fVSR?6BBudZ%2lDkqj8%ot1eLsQEG-*-_zPzYUo4{R(NNqKpUZkMS@T@nn^ z{!-MAqsPVO^6Qgz3d+{OlxrSsJ{_ z>;?f(!WTb#Io|t7JDS24L0=2t6flX7iGd=EpcKWFf&L~3Nn!av25QamljZ-&FYrxe zxj?T9M2z}kd5gCVdG-#bHxpk}buB@0n9wL$*+JgWRoW=^;#a-MYoeVaUca70XRFMb zC&|Jd;RPls=6nKTi5|9gFJ_m5@9n@27Bx?ol-ox#5#}jIPFc>14Bs7P44b@KuS!V| zs(>RGm>*Y`z_S?~@QA(ep^uC3bK1@#_Xt>;C5kO+b98#urJPL8F7No((>VE*yGG^Y zjq$cT+*+nog7K7-=`2#1?L6gOy38=tYj!q2=`q+z4?af~+|7Wq;LG6sUd+Iv1x4c@ zOW$mX687LAd1TCrB=5KmXN0*!ml9+X?O+)y;0Iv^)w&`Mb~rUI4eial1lweB8m z^DVCfCwfw_HxE3%F=_}MEWPX1_>$~%Q#9~Oa_=Q@rIZ~5@_9PW&TqY&%Vf!=@l}@# zH~p_KQ*o`5$WU`4zyw*En~syYBKTAwh%wGd@+o{FPtioyNYcX-FjcF5;KBTzUWMs zglaROW>h=Cl8fJNpcpstk2^s!v)vKcq^Di1rccOIjvw_K2;JE%>n2zL~!S-}&f9Ymr8+BvXc4>kpyhzQbbW!7fzdlccs>v#`n zuyOrw8Fg6ih%SH*%bWm$7ml*t`g$+QD7M+Hi^L@{GmW zVri~|PjZ z(~feZ1z_7?=kLBer-j2}-=HFSlwLLi0$RC3*Fu|i_aCM+yvhhf}18K4Axur?xDe07=>rP_+5$64(!nj zSjasIim{zBKTrRNST6>nFNH0XdOLgFILz^%bDqb5Xl;t8(5j#qMK~Q_&z@BVrqm~d zwH@f}sXBulDlLxGw|={>>d>mZCi@8KGXB2TeCsgb3fB>=#sQkX1t?m&zDh<&gRZQT zq_bpi1+e75L5CSUx4xx`GT*0fHMbM}%HJ2=d_;Q6)q6N^-}x=`wxlsDys=bb?wfgL zJqf#!^^F8T^Hn^B243p_v*^yH(%W{Ue}n{tDaTc z*!!0$#@4KM&ar=9zn-F>BvgEv`K5r~PJeljuQ8k?wUnyxxT03$!fxYrtLwCo1GT}# z++-j$Vr;K~D~2QDVs;Ho{Khj$#Y@9QBdu!9o_ILR8|$kWk@t7Bl5M&QOql?VrW7xb zjS7XrP`(rZ3fEaj(0h1)qUc5EDH9+ zkiKm#)9Hmru~Pg%A^hg+n2Jh3MNbR~7PQ2p`WQ~pBkTOD`8k==>u+z^f09hTZ!Xa` zi$Z01&)|&;Suo0`$>J8sJz0z|NsFKYv|yalWy(4ii{InoXd<3BEmFMFtLz*qdUXw$ zHRoeh4mRkT%>Ah~*Oo25W{glWb4rqeBz*No?+uER)@@6{Uiawe9CpnPA*(n$lHRq2 zHas*0VdSV=bkbb%%TYL3f5FDdI50F4xzq06q22J^o7g+t*hWCROCt$O$@Yw{A%t95 zFC;1yZQ~OO%tk@jw7%9D;`G>&NH(0}T(?ha$QOY5IKQL3J1;W$TL~ z?H|hBFZ>ci5vk_e^-H=T;Z^`7wJ!*gnyoFCx( zr~G|mahe5afRs84!^hFlQ9OXj2;uMMvUI0!3U}^Tx{^wF>a!+Nhdx7_PIsi#qd4yM z9>-zt;1C-9cyJg#-l4cA+H&Bc*^|Jdx%E$2aBF4m*Ne*fTczaKvCJr0isgXka{ zxM-{^8_RsDB?@utQQ&AmkdH|sBE|9o5kB`4Z|_B5X^^cT;LGvlWx7th=5*T;2emc= zWNwnLIdi7>`ES1RUc$p~SJ^@Wx>bw}$I$l2ySoT!k;;P2>B57|Bbj#7-i(xE@qGIFOscog>^x0U;J z%znDPw1cr*I`sEWDLD14Hg#jlywb{>=Zp`Egg6l4Hz9OCeE6%q{f|TG^A0GGN;(S1 z9&l5}GS^s`n^F#~IVwiY)fRcyW>aLs^c&85ZJJ@kS37AH^+%7mdcabct8Ja{sG@tF z&%gZi9)%M*wF(JMlj%JRyJO~C=Y2C^ZtQ)1RN^W=j382Ls3ZM(eZ z&!2nOv$O0xb44I8*h>NqiS;(gCKPq(*|TRSQ{Qn)-JvJ@-S`D5-nlFL;WvBhz3$#R zL@L@lD=wW)sJeZgkXVh1LKV8m3NP_qF%;k zT%kTT$xpQDa2Iz6XT@?G3v^e$wshNYj(ZSB{cd<}_h#R2Q8`JAb-Qzbn%W~d|0M-h zxS`T+?=$OK$ls5;6^6{ZBdn>RY-HY+?sO|ak=}@K4v)M%xy|_uO1H!5dOn+CGR92K7mENAAeNNXj+4yOGzN& zSCK-HB7z>XerzFWJjlsb&R;c=63(wV@Jhj?j69VJERaB>(D5=(R%`dxDG1?|d4RW0 z>?Db*y0F_LpJts@l5X#FPXD99{B9Spp{kgn$*65cxjr;Z7m)3M3O0U?Ee!j0=$2bC zX)JXp&O8!dQAJ9&3f3!Fe&ekbbaw%Q@gs%UW~c|*R*+sdn(t8C_PU~w6#nC6ip%CQ zd7GLY&jS0j4iQTtD-7wJ=Q@H95G$;5qjYoh`q9a>(;3gMDf=qgE22RvP$KR_pM3R& zFSm0T#nFv2QXOg$S~EtX?zx(0T=*2kh^`ShUaMOGwXt;VZ3lCO&IEgbm*(SSp5mTA znapmmWpJ)pgryFC=|sMF zSJrPV7q^TD6L!~$j*2y(jFGl~E-Ggae)SDKSavP^O7 z)BTg#qm|)3^CH44VQfOrt`s?-IRM$jaAz0`=a>l!V_5Yc%E&D(Hr~mx@H^2Sn zw|D=qfA*E#dxvKHm$qiwdBr-smqFco4z)8~U8jpo+))VHoNpz0_ZO?g8+3c!nD%#0 zD;Rim6TSrc*2jjM+2YDe#*0~=8-vK)v2-v(vd&)W#a_?rdlbV3^S@fnJr^gc$WkVb zXWq~wu;68&)fRZLf5|EeSlMsWCtiM)QItS0 zn6L87b9H&jX1_{%LAr~EtRABmwM+PNp~Y(|_x66<_V&)<-{)|8TcpX^EysH}BSpv! zCXF>rYQ&-CVtx0cY~*03&d<|@jyOK`g2^iR>a|^SMGS4+Jm%-Q*PPAeSmUT=DaXdw zT^fw0Z{Z?QZ8pc>z7COuiDw1Jol@K8OH3PsD%0`oEJeqK>m>?S(|}cNqSmFW@Yx*c zN$FFS5h!KU=u0T=a{Bu z2yM#@CZn;pH}=lb^Xl=;Z5z)QtUj$6^+DatIctJDJKvFJex|p=`?CW?rE8uKN<76cfKGSyeK>Rir6-q;tku`K1Usu|Br{RDo*0{24OQ1JytT zW58(^vdCfRaHrJEGG)z4yIAFRbFRCG&|>|*L5`N{g5EIP1s0ue?}GNVb+ zvh+83g#)Qx;AeSEBbW%k$8AS4>nvYPK7IoIBhl87q_9Ls8YXSS~Y$;c5%Go>$;{B7qQ^tqQEBfDLExo6H@u6+zF*QZed9aTG;i zcoZInkHdp-5cb0!$cT|MdD8Ybc+7#KRsF(u+@(4Qo)y`INq?UcBUR3B->+Q59KCE% zMZGn>>8MIKb;ttZGzA&DFB17T$Fs#E9WPtB0v3sfhoHO?ouNtEUuc#1ttUuUNKoA7 zR^A!JSFE}%p_ zz-IR)rO*y#ezK{|UNd^U*YcdA-rjN4jt=%t4UTW@id_tDpS{_f^AS{GFQL;PJ~*x&|jb48wHLa&gdQEk^ai#>ZBd`&o}_eCmK-XL(MRg|J)?7evSL!C}8QzzDFY z7d8p0Dgup}KIC%FnoTiTQJ$lh_E*1Xcw5n%y-vRw_!SavUJ~XNm$K&w!J(>(jZJf1 z;n3)0qOydmodm^@Z(5X!d^61qb2a4ZUx=J1sMOS$B ztB&-f7A#_XqmPgDvFHeHJj-qG@G6no`dIWCw~$zl6w~2D~Q0vuI9{J&|Gxo_8q7lR8rS9*e0(?+)xG z`F3=V$PIx#3edqLW(N=aL*5@4exUpKu14mX>Y>9=Q!V6GiDw4(*;e4^2Kad`ur;XD z;;>Cyu7p|?yv_=Ro}HBnDN4rio6e@4X@VE}#(O7kvnL3dHq+V7=Y(}?@aso@P#E-x z2mJ`gd>~^U4`k4b<9Key@w_lJ#Zfe%&$ob5|DBIyP!LescfLWE$QYW8*hU!I|#j|;PjOCvoeBf zsnD47JB`L?rAlfJ5_x2gmub91h2zlIVbp!UK%^{cj!hWt(&%k04(snH-nb|279jdm zRSm-uP_KMw|4H8)AE*&X&kZvAQtA~|N>;?;jNGdL+T8Z>q2Qnt2nr2+IZ>zC0{Edp zS5k`}I$ritBH|*+NcW~%rwVXnxZ$3l+uqn>3ot(K%vfUx{mbkmT;IMc9i+{B-<+s@ zgru)yI&AlgG)A!>DCWb|P?#QO9Zu7B2)l;UNH#}-;&v`6j#X^N>Q(e?`;>W|5SGncrOEbS>?Rw9=Eb_7#-2!55 z3QRh>P`Oo1X9fql-NDQ!FfSFO|NJM1(5-JSy{zwLhu%2yzR3s2|dPN{>l0i z$K0|w1J!tJ@?Ud1*XMm-?PHXnpxZSAL_azxP`K%>`fvU6knokju)$VE>Oa4lGUl_~ zA_?pbc0qM#guU^;`P}>FFRQ2n70-QZT|vtYk;L+a$fOhVmnPPy%=;g#X=Ae|1^8ai z8^iAy7C5wFJiw3NplYkoQR*xU9K27U-7Rgp9Hoa=kbg5GfVAju+$v#pG6yK;3bVqG8`sQqOU*?ih1`brV5QC-wH*oLmRM?KU-!zTA5f@7q`Bw&;L0BM@vo^Jj$qG0O_M(?TShy zYYLd7(Q0MiQJXjZTSbZHhQMhvVLhk{oL~9gFbk3l3#pa|@PAxBoxbopw6{k9o(>Q`6 zW}E#FIo)i@{&$g#(~I#BnEw@6D10v1{|@58kM_Sm#1As^1uEPmsWd7pmBH*UIea*t zIkRhWXPjjDQdyi@5hC$!@{El4+|<;b6*t#~=kW0rMH-FQpM3cb+(gyv9_2|AZwa}O zV6KAWi`0oRNx;n)~EtkuB4p8+c0J50%Upvx^1Z+LP0uv{pL`I^jiUZ9pqWM`_}0^ak2o zYNo9dGi~~17s++$QN&&GG%Z%BhYQ1=mYaZX$=n9Y*|10xx^(7EoEuYL_iV1KuB}$N zW|k9`OOPubExut`-+DnV&DxDp(?lH>*;4^rf|J$z<#BX+ zho;5&ae8_e7z@HB#URkY{#`-b#xP9)bWEWxPRmgTPXOoM`VNL-iLU=5ZbJbm2|_f5 zo1p5bA}3zIWmURP$167Wxg@h1v9UqlVi*OZoUvlm00Id=le=-yaqem0XXodz z<25A+#=uQ3R{_!KOA_yZ#yKD#;2d_%w-|<9+^^C8f+mfQ$=UMOoF=fX-Cd`)TN4`! zXSI!&$B1*hG$fCnpu8+GXt0i!=s+q}@sdoEiT)+TFn+i1l@wu07z;T=En706yhCF@ z5C=4u;>zKog>K_%xqwOrGFQ<&EYlb!SD{vyT&L-c2yJo}pHwUXH>nLbTme;%!(DM8 z9xS6)6=ADD9uzJI$TLzjYx0s2GPE zO0X$Jwh0nVU?*DZUV!CF=cE95U5_#4K6ka zt;45zhb+T4EeDTXt3Z^SFDqmdc*Jpe?op;w0>_chw63YLSZVR-a&={*s?KDVYRZJA zSJv2byg~(5u4gt!L>2}aV=P1MwW)+O@3cg^pSA;<+kLPHh7UJZ94pYgG-2T6b+WtuS5)CZIAi4i>UVg~+F3HBXb& zXmBg`sCmm`Ps-3-lZi7SbT%~?D)WL~j*NFs)}Qpy!a(%F@&YgUPS!`CqP&GV5BWMoMNQ>zx*fvi~sL`{hy*V2PGei`i@BZKaa~#5d@lSj$ZNR?F7Zghg`eHgua)%lg;|*(v5VHF2Sg)KnDV7}@vSpLf zn@&{ws%T!S;oKP~8^FS?3e5>GbjRA=2mq|#9^o|w8Yx+vp{=g1Bg(7yeTw5v!gnYy z7eC*lY%#TZX^of4{q6tZ|M=fl*83+dDx4*16{nN#YB;nDaM+5Q3Ag(Iq{lrhwPS0M zi1>((eBkMXLVrbf_41rFo^}KkC02thZS6!Bf3Faq3*|AzwN3@3q<@D?KKhsc{eOYX zvF*K&A3u(9lzY8Hyb^p29}oM3P(8VGQ2^6D$oH7P_tg8Ie1BYbS?VxU&usx2pVCHLV^8SLo?GsLzALQm8`^92 z${h>8LsgxoRMxI=I@n%3vKx!L@Cu4vB)sWXi)Oe3{QU8!pWcbx zBAH&8B?3s>)=-q4=(d$5r}}~nq}F7!wBB}Htpzor#r2Ft#>&k_I$xx@N^4C_9Y!-k zZz-?ow4E!a9<&{KDGn47dM7Z-9K*(g&o5)_GJNqm!IfyHUK#OM+87X z9uuiGBMr;>LMz5S-|`m4C-1{H&O0S^;*atfzu;uHiSvZ?ojH)+=8>2e*#%w=%1YxQ za3ugB|2|(G-8szG+6>tOD>f%AYS>ze*}UgYco_w76YQ}@-mAqO7IDWKb*~JW(OKxA zkH*HmLI3c8HC6td-=1+*#0ZHjr@-wT2 zY?YR)7lI-7o2_R3)eq)-B?`B-L=}1+ZN)S%N*K5ip%IzU`p}b>t?DbnkB#zBX*p3^ z8&?HJa2pY#5!XJH&?;QVM~80wg4tE@AGB%Ie-uB(`~SDF%oi6Q)&gLQ{nx>uSGxc2 zhddflB` z3W!7$5NqoSS_Nb7PVF7i=&_^NYq}N#&{9P5`m-*4QdUuzgqunR*b%p}*sQ126m$mA z?-mr-zX{KWL-rk5i+&-JZ=zig^C^U;w-l_e1Ajt{+0r!a=52 zb^_<~Hfld}jpy9G7shvV-op>wsi<}uTB)i07WISoQ9Ew;?u;Xc7~UHIxpSwu@F;zp z)91UkSN)=;Y=Z>@cfQ%e;kT=n=TsVt@%z{mgsE>r<66TZ#sXIN7kGW40MMXhjPen7 z;?7tNkY~tX@c(D;+Pm6Dmi*uNQ)mbYHjy2*{NOd@UP4I12ACWIJG0AVePmk(Pi)D@ zvJ<#DeD|$iRkzfV4Vmn4$h~``8DhKDRsE>y>gww5D(h-Ug@aw>0k)$Z|K{6a)J^Vm zLQpBx*Oe~Rq3E;lFS@;q4;#OTTK?LlmPIkUs{3p8hTAT+B_R|}mc_HfIt2ZMuW9m||<^)>J7-oOAh z!&0*`jfDO=rF?k$2(Rr>I9q+{R&kx6&3u$1)_kRmJ58!qT8ZHR&bEBd=z=cyzrxb3 zWI}EKyu;bD7(9cgUah|E40Z-jm5iB82$t=8T{&UMkfAA3ESfHGGMD93c0AUMN2WWqxu)-1>YCU*p=(<%exgdUp=%DdF=l@8Y0$exA;a zJPUsKU@ezv#Jkz7WF~4qH&NI1FWCf`MZK`k&Ph}J^J;<7R(6zIoQo~J<;rZFNS1+Q zsN@d?T%8v&JXLl@QeyHUZ)#jN#b%M2cs9g&Z+Ta-=HWDAlP;!i0;0*x|Aolzdv4ux z8{SPN4dwJGn3wW(FDK<2UL}WEWzakg1=+5roek_;=Nq)^8GtEbJy(M6fgH4d2XuZG zGPrVN)lp~}nYa`2iiuTa+|y<;YnnB`=I2EF7{_FAK#OWKZqOf9Y22c}b^6<&zfJn1 zzAcRva$+hSE96zktdJYm;KmC16#x_Hwk+h&mwZfT#na4v0D+8h~g3q5+5ow*U}O#>NdmG?2N0%-EyLNytFCf$s)&H)yy) z(+yf~u%5l#aDz=Zpmqn;?0{MwP@@CYNbTxEGVa5G#ym%)Atu$PQE^k3ZqsuN7Gwi~ z7M_Rb>xs+^k}eLa$oMMGd1XuYg?^aJrVqGWl#5ehD!H^`1EBj3&F~=4-1|mAfP6nYC5;$Ybr?4X;vpJl5 zi`Ns^*%arh5Y6nA17Ykb3&b)>Wetmf^^_NKSpr(>D3xqIN2nRt+3AlDGaxJ_0%_78 zCOBUsfjEXVhA@UKhA4(4h9D+6>_7}d3PT7(215ix0^@`P31LA3K@2(ERAR%2RlSK8 z!KP1{o0PdpNSm7o5=?)T54QCd>MlyAe+NH!?*24%(}jt$C;y$0+sY@k~y^9E(!#P&7i+oXJ(ly8&rZBo8X z)3Ld|Z4OZ6@zRgIqks~gsk8Dx5U+)QKn)M%@Bk*%1DG;ht(b~TMy4aCSH(nRDuRs4 zHw{rflO9Eao(cq2pr`^#6=l{i6V0C60fPu6Mv{m(#Z9rlL8Y>W4fyxSG zRt=8w#H^M!5cF0cxB|r$=3NDHE6`hk;HsH65Oh~f=2L)y^a`|BAie_iRV!^^i!a)v zNU(uw0j$OR4KQ$lYNZVXGbnI_0y`-1g91Y+aD)O&sP$}I02ZvFz#D1@%Z;m z1AP_)EC*N+up|J#_;ucD<3mrTfwJ=krt!fvJ|uz z;1?hK;`14*R7Ch-8lMkTfoXh*2_O98H(68xtjP_u>hBDvYw{YL8R6?4&-I18d+k7 zt(hfe2wPcVhI8G?90{k1xCU6AOWowGvMrvb`kv(FS=Ec%E20I_Jx@lv(CAB-AcV>nJ!)Ei2aYva@w{b;UNil!b$*9ouNeIm$c>ib>P= z%|)SEa)~i1Iv9ME8l6Z&qnD@(h*JB((TigH?5MYGq6zHCHaHCD>;#&$u5yQs8_7=c zw6je)B5lVro>uC9wS#N;a5{_Yn^!@1>gYpKeACP6g<}Fpa4|n2?M~m)pY+0sY1f95 z_%Jok`Ptm>q;HhmLb8}Rd3BGqg*I)#7|zQ#jA7Zbe!4opCxuP)&d!zI*??gCvQl5U zLBJ*Dl`LzO@+^9ZX@Qu))6TTCc|jBV{86WBvM|}%R+$!h#e~cxX6O9sLvCvY8Oqw> z92hOvB-p}Aj6%z&R3eqw5(J%Cmy|%(u!5}PmaarAb6t>-^eJCiHl^~F^VsoagGDX^ zuA)0utE;x%_!Vp6wp?XS6WOHgV4f>XZ!XEiHFls-UJX`Vn9^4X$0}ThUz7(GQdOUp z%Y!O)^fRA+t-8NQtCoe*EiEX`&q~AaY28*}XJLUD_jN9mfxn^L`k!g#vT5eB`z_79 zNl7%|m~C-Vn~ug&FbZj2BJA;OI-X6-cw6D|n9QF^!Svxe%PZyc|5^F)G(CWlMFpA0 z;(J)mOKM*dkxX%E3zCY2zkPKceJEE_Q!%~o4rBN}E~UGlxVO7Qg`iftYMPm;`jc=J zf6~c%lLdy7QnuR(r-}bER+IlfPtpD}9CVUrxc>}N-BTG~^Z(PBJO9!28bAC$JjnA1 zH-@7N_;DE|jtSWz?#-ar(icn{y#WGE#S`tl93J~G!=Q)bfR8YZ^Tl}j#cE0jJy-&a zmk!T%+b<7Jc*E-%{a-5W?ZKkj?Uo3#8;{0=VPJazxCkTM)(V}M*Cg-;-Rj{W`sf_8 zJBdM}A+5ADjb~lHy-wm<05yiLlhxuGjWANR z`nAhKV(qfDv{K&Nt5CW$ifSC^s!;0+<_z^;$8EJwu=@tN|5tIRJ!LSb_4faAy|dm= z>n&usFZ_ayzoP!%dt5%$vrzuOQ_t?R3^wwwH*b^wcnb2r-l7kud7qWI?fEyC{|o6a zvgh8)_}ctWi{#?@&w73R$Nc{g&!a)q9nN~8v&`agxnv~-vn%2RB$g1cchKeN%D7@h zdE4)&n5EYaE4&q>6?we42&dC{Tt2L9VEgno&R=M`5-mT!{Rz%@-H6R>a*Qg(kXxaI1IQstDUe zkgV+D{e{H`v{<_gC#b@=7LTI(R-+&H9zTBE`yJkX%Y?duJkwZTQJ3m0@`PS^7K8eg zVoy5rZ6T<597b)XS2F9|Ml9;Li(%XehFtAyxLkIKBm9VO@NelLsA5^-m8OFga|N8S z2*H&>polLS!6@#{G*k+7*p9-_R5O4uv(B@|_a4H3>A6+@-{S=E75VS^bv1YXU;Q}$ z{~*tt{Lcy5{v;lmB@K;;yQS*(og-V_HEU!z(`n;-cg(-ZbKCg$A5Q=CTHf6Fuh)N^ z|9Oz-UrPVGUA*{rC=GMU)-8&}wL>*eSf3aN6H)>YVD@Xu!<7I*hnNTY6UxK)mUFj` z|A(Ca=f{6T{jmQ&$TL6xm%cKz?wscRJEwUo-;a6zpX0f8{NJMj@YVUh*_s>wb^pis ze~9P4=6_>Z=*00b45G}8ffs{__koM1jUURw_g5C?#=rehyS$e&zIOk=-dMNBe+&D+ zKgRz9JH5LManOKPS`PAg*0L&nK~Hdd~I=K01lI@a8l& zm8mYB!4O{Baq|FU%#?ubz`b9N-tC^Yk9JSr93H$_^y-lQ-$x~^S1^$R z%C0RXg(42xyYJucpPcIKu@iiXNpOA+CJ|y53*`xR=tJmhue1tm8J41 z9EopY?`ro2C0AT0iHg|>2VZIZW=v@=gC*(>`qB?1X`O%%H+1829Nl9FsF9kgGa9q$7%$vEhSl+}_dvtZCBx=f%NhEUbMb+b_;uz1lx{fAHTq*3-#qMthzn;FK7fVa^Oev$xd%JsY_S?rcmNfNfscBc|0JHi@d-w3*_3_dE z@oD=sudo&0I+)rZ$G>n;6{mBq1s!;2jg%y3;{&?O$o*3sphOfX`oK|YqlTI&H^Q*& z#+|Rja**ATj`o+hKoKMeSSa(i^lvUtu0M`n?*Df3mUI(zI_nm!*-eA)$0|I+_J{Fj zUFKwlYxRj?!C?Tgh{0yz`1tMnpQ@rIEj};eARGq4h!uCsQ31E4-enZ z;g;kjwV@GHmvm(*L97KO3z4DX&k=%7S}TjhR!gzQo=&cOIl^uyONx)T(BCyLfA3}1 zKkak(`u~1RfOoF{Ril+Z|0U~xzwu-J{}9jo`oCLP{~yVznEPG-=a>84!V>&szhv7X z$25}-u4Ho}GXY4P=z>`woc=Ky&zTBtw;tGOe0v5Kh50=Z+bB97+-fGZ5+UJ>Nm$nv z(pU{Brp1K>SOW`5q%0Itw2y_kRGelirm_k$mnQAcC5lU+eA+B9M&WGcGu8xsf+~)N z*J%*FDA5yOYD00rCeL!ZQ~C}HUv3@8*AFdA3@wG)0c^=1D@%$0seD*{-W^n*b05KH zZTTZxLM($dO@DjE)sy{8x!T^$)BM`F%L^%ufa^kRg>L*rqoIJu21FK@OQei>tGIO} z4(}}6a(@sGdq{^1BR;Q|GlX;Tz@Qh93yVMfPqrP=3XlsWtd!eNfR%b@8jovZ*NM4Q z;@&oqa?)O4bmy`p8;??@?47$-OKQ zVl;KN=4hgME?XM_Wlfm!^1I#RgS{=pub;$Ij&_}enPLB)q(wn4V--|>oK(=6iuNEN|>2S*-@sA?|gL7@^tstjNU$3)x4{V$@l?DQ8UXOzq zCEE;@79!yKP7``Ez1Kw9lF$MKnpqTHjhU9i>x!bjtjdi43X_xonVTIswV;S1`FlVhV3 zF9~nR+afB&8J7kbd>ETQS;G0jtu!i${GY%oEe~R>DF2rnHtFb6#LI5%MtQMuyNq01sD9Ouzj}d1rjR1rv z*JI)`auHl~3z)hSO!~I~n$qGfNapFqfOi+kY`z%K&j5?PeW2rTbPK(X+wf*RyRgp- z5;GH)QkKZYZS6QE$5Qeoo$;m;?lL-Ww=?Lar9subeXHWw|I@ch%40|b$TXsCt z8QEIG~ZCoU0;f9au!{Z+#Xul`93{N9DkNW7R>v(F?*A?J=b>$O;+7Y(haDXN?I|J zs-fd;XprczF8e zpH#mA#h&`MIhziGNHhY1ha%H4@TW zFblZ;|G@bv_vWr0SxjOwBnyX!bXJ1xHhW0tr}$#6=jyzm`SPz}D4DoSCx&CF99j-x zj^;4axo*9&w8Aet_woRho+&XZ&DC<0uWjZvWVxThc5*g}qurCYOH1BWv&lW+Df!PS z2TlY-MjH4RKxV5}EXDe$1V*tjcCtZPi)d_n$q3im2>8%K4_X%C;u*#1VZT(6@zU4c zdf)%;bpPb|X#Z&M&HmooioUOrZDGournLu+_OL-+wS>2+P}pxq!Gu;uK_6ye4lmU) z8-)fEeq#tLcHUjy@L1A&@JMi~KrA~Vm6G1TM`dI)Hpo|Kixw2oDo0-@m45np&^C^~I@z0kpp<)2e*QncC3XhGOVMl0z&X|a^BiDAX9vPTfhe=!eqivro zGWrRm-^xhV&5|d!%go#6CNX^)dOfaoNF6`mGq;TvNbVOHsECllC_>=54Y1kdI7Cnj z^NyS0*1kR6x3~h)zT4Vj9C^&>Tup=>>Inr}P-l*2wnc{bdZ^;LC3O{Zz2RbsW-*ZB z=LNj%PTycc>)&hy+Yv;z&^c-AzxCA4Jz`$#9T(d3zkD+C&I6G^aZr6SkPVXlYIjH; zg-A~MXqE-i8z{zrIt0@OvCLoxO|)c@1Jp%!k2!>{r~Wf7Z2nBP-9aS2;`R2vB>{uA zozR=`WlK`_J)&*bc3&+%inL^2n(Y)0Yl%NICm7~8H~ExlR1r4ys-|ei<+&)3Di>VE zIo(dl7LqDT4eigf#nnv;YnE&yA4+#iYs%c`27APUZwntr&e+FYrN@N<7YB`}c@-_N zi6h5Ir6KT@D0-DlAjfca>)>yKl&yZcPG>ZS`Ro?D8u$IFS^_Gjs9J|w)-bHi5N5Yh zn&f1kXF^YaPE(G=2rX1W!U_K33bi|FHXqr=jaNyv0PB{)aJvT45|eCsZH%B%x$4); z4csXkb;u}z088(Aq$7+md8#N{Co;QrT-Ghao4SlJ6iVVbjJAnZ-DAHPcs8p8YNde9 z&4|c?l8U4-N$RFLVZik4mv6JNKvDJEZjH2wAsXYb)W^a$kVs)jet3%;q*r+%lnF{_ z+^M1tc?6a!i>o=RUTMuM46Wtl2Mp~~MtO?LX^b6&#wG47k4qTPm)pq;(A-{;>2i^i z)*fv{nv|^xP{@PWbZlcTN4r!38;j%461(i>A%^LlXW$r~ zS^-C6be2uZV~DLYn7}@sPiThysp$@YVcnzklMh$f0uDV>0>YYpGd>oIFg(Lg2oQEG z0dtUU4V{i9!*=p4Hyv$?blF&ZX@+mKTL%Dm5hsIw2+?(^#d7{WdvEx88@sx7j&_IS zO%+VTjL=Nsc00)^EoRUra^(iR#caYGt`&_AAAUfrWK=>7(&T+sWDAPT42Kaz*t!#$ zvbj4%^|%DZibe}5%;Aj(Keto>kC7MjYDz)xL8Hd={_S>Kon#=Ow187jQ-Rs3lSV|2 zB*qf0z}fv!Qx_1>bR;ItHnmeEysSpU+R<9{zare79Y$ zM(Osr(1Ht{9Q{|kW_KG(c(r#U=o5`Iefj{On&YMi zsWB~fy7~E{@eB7+-hS6fa##pqQrfd+L*VSnva`<~_um zGkF)bPae*@B11}JAB|{?jX(uWhKY&BF!-C#MsQ46$g*t!*!mlET(Y%q1}Ktq5#;=J z+OYdZ@p#)U+g{-E{FNQzoaWmOvHigVNo(KFtV;a=+&F12n#hd}`v&oRJ2?gq!2Jd4 z!*L;3N7((@j2JS&x#>E)7;6UA?0lP(;SBf|2 zZeL_zBLKdzX;~u|{G;s$N)f4s;KcObrCARC^a+W{^s`FDG;TYw>F8jZ^>mHF^sRV! zKzTR~E9Qk1OtAn9GpSo>S+`igt6{69As-LPmzY6J2ET+F#l|UPc8=dSt_TZzxySBw zy)S*1{0&3+5%p&Hp>>7Seu8U{86>BInwn3oE85f0Z*maky5njLN;BzM0u&5NV)B@O zV25w8#v5ypE8OTHDr%Rb2E+n+Y@qb#MxKBW!WPI>qY4HwQv;6fJ0(+4wtlk9pcx+2 zNw>xZa%*b3+iqHUJnd17;jaMmI=uyf00I}%#Seo8oL<@!8X0(#F)OASLY1^=8?I}U z1u=IDSzb7?+;U_(GeQt=@%zToG2X0h$d=VZwp=x2OW4C9>8=_#lXLmr4BGbceHDR& zc~l;0&ujd?aaq}(ORqhb(e_*d7MEN5MZTO5bz`1FQ=UMIp}uQY&O3VXXS2z6jXUeM z9zZpfaR7NTyUenbL~0ZfKJ32;>XH?Dkqr-{AZKg9ntAibFK_nOMrv9IBhCp3nZFgr zkXZN-ZfU_K*7EQk9&*ygkc}|i$POpo&<-b7#h%5;aX0~btmsikkpR_@B;@AI)EiOE zd)1itz8>?iM+qgsXjU4QNUNAY-_CvpGlS)OPzOqDU^txEZ>F0wQixWH6OyH1V35n1 z*-XH#J(J*$^Mfw5%;S9+^UACE9#tg|4dN|{H@up@dj|G?PTY+Ov2dV7%>D6B!tKv0(3lkLI?JR^gd zx5X)?ngUXG6Mn&5fw%bH#u*tzD95vArY@ki`Vv3r>?1EgE4RvkF`W31wm6k&2`=h%1mV%q%?Jn;vIFI`p9I8QOqT3eqHF zIuOfp8**&p8H&chBR$$ki-d{#4#Zbsi$*Hq#SKv>Ih?Hp@XS|_qfN5+=@jBjgGD@0 zdoI0ZHbt4e?S);4GCi5r5hD@X;1bQ68D6ZjAs0g^+F5hApj8g;T;X=!^Mmt)?|t@z zLJLqWY+ILzF()fCmoFi#*FPWh0zirvF|ZkQfaXNCFws*$0FxGZMsBeta_2w3IXZYA zKqBiRfpoPdsNP}NN?Cmb)MPkW6V_n~)?ol^xHhcUZ%)ro1869%38>kcfJn{peb{VN zaya;o#ewF~Q8ig$kve<|+f&pmx|5<(#b%G#UrrX^3&fqaJ~MENWu=4%CAZyxvg!JB zRDQFX7B=6g=e#nzYlyrla#)ub^swV7tR^oH&u{=i8Q_$N z%7C_{a(;Pq(ymevE7MTt9e{L=V6!ZZ2sfxoduh;Mow1s@)L#B*XQM5z^r4?W+eBBh zRv&k3vYhsw@91P-<4NpPrw6K1Tns=gvC@L${%zM7Z76BiH5$i~z&2TeAsS@^mV%Rb zjU|u{MC59cGQgla&A>}ix@uVnpFq$!dU${fwA>Qw??DQNif}k{ZP*6r^2~^QNLh_m zc20s|NN3i{1Ht5>?Y4apvedQMRIj$kl1c{s zcrB~EI>bl!%L7lh&SnAOvMkUH3=6?q3Bq|>mRrASp28YStDw7VQKI<(ccxgdknq?D zN=T+p&1-wDT>WuBo376K!Hmi3T&5-KWlU#Rrv3ALs(lz%49kbB6bHMRH`S#uf1tOM z}M4ZR*rk7S_OOgrEI!I~PAmI?JH?tC@K1D^5g-o~^Od*ge zJ*h`ddbF5Z5{_Xlk1mCKC6p~(Cqa92%NZa3d4rn(Iq{Ha3Z7(ubBk0LDM5o1*obNS&VkL*qo2t!rYp16ZBCee?4%OsGEs zHO9qYWe4ppxPhs~AA*;Mja6FR39)a9S9#r7?S>B#45pmH|0Q363TA~j6~k$gF`J_~ zW9JC-E#L+bo}~fMJgNiY&9oT%E6WMKST1`o??f>a!)+!$NqTH@PcG)^*wi(@ZMzOH zD}!r`xUDHFCg6mEwY<13^=+oC%#gwHs*|x`yYk?Hy1&xA%s!?gtNieJj;V{2SCOdL z@yG09&=g7574qO0>?pZQJiN3@2C=e~1E$_)OWt4PH)aWVqU=f#x_f(qTleC_3}LxG zVLEu~)(z-<#U^(|{u&Qg_^X4_u#1Ix0Ruw(;ns&ze@_ij>V|2YHUp$~@QNdj0~A{o z8q8)iNU35LD|($r&|2h!^m6*oDl*{YujEv#7aeN8Kar}SD!mXuui6kx> z+8TMrJWWEZoMqgX-(#};EliZ5=<}=qoNoq`bpAUmdC8rfb{?@YSZ0$^K1*71Dn~NY z3{E&X!zG{Q(|Zmd;D(R+13h&-B@;C;F@ggaK6d+MHpG+7)7c@qjXLK36(Ym;3Sao7;#z(v0N?+>0 zG8I{qt>n>v7!lL_LpF3!$hK27E2bAtXRpA5#;N{Lv5*}+I~09F0Qu2Yceenr{Qsk( zK^~Dp7GnnK;LXd612aS&d3mN^4&fzU=-MQij&6XPsD|m^hP#@r^b&&V$2CwDB;#m( zY-Q1t46dR0{Z$mJ>R44n33@%e;xBiESNtUkPYHNAP1G-Z)p^I7oF0?SDV~wr*}tIa z@2*@DGq8uRvmw|y%!W_M{%baL1`f^{O?PL9ts1Ols5lTnX48UdfWwe$4nbHlZ_z_` zo!Us2F@`G+C5+7+aZJj?Voe;BYgTOwVU|bgp|T+Cx<+szA-CVV=+DQvHn!LsT2_c7 zCvvQTcHopS^iv{BewW=bSYJ@$Q-Y?~jIN*38J~6Fmaw4#`^BZxQWDdh!!>k(aMS;Y zC!nTpW_Se%-|SteAh+4nVswpyvfI~onMAbN#Y#$vICC>aWG5E$>%hYpQj!ZcLQU=@ zTi=D7o^HtrnVJg!O9xuWTn6y_gyYV}230cK;nTUl*_c+%yx8RT1g>xfUdKj7kA=0> z`ZpUC+)kq&;A2`n>j)TIA zJ^y=q*GI>6j&2qUf8;jC)&MT=ra6Z>fP9Urq1sJ0WVjUA$iSIhX*r)ah%xr&Aq#ey zEayeX6>!P$(r7imECGbyt3mFrM=)@QdlEW@kJ8FaTr*slx0Z9`lk;(A4&CLwO_O{)CR4ilGHki9U+v${u2?`B>b|?3(%cQafelrhO+g zWG{^}=6FEk)ybwf`uUL#^ISv0p?(9E?S z(`0VB!;G@GBjpeVxv`nV`(&WMwdG7Vl)Ff?XL1)d!T4MIXIW=>tiu4l(m;q*oKCyP^sSD! z2EXYhR&G-HsE4oU4t_)J7<_6Z&hE#5tlb~y#<#lcZ0E<>@eOrvpmQ%>j4d;H)9c{r z@ZYu1MOUpD-8h|+ju>N=Hm2zZGxr;EECav6NR|I~fkRlj!|U-rI| z04%O@2xf-q-CBbZzYqS0jf_F*jENbu4_km0iEeZS|1?^%&Uk3 zD{L6~ebyhF6c|f7K7?NorfKe8@gNn?{_Gnan=$3kCq59fS<)#|3s{7k-0%}khT#WM zi-#pLT)ekvK8Ln$ox$2_IM0hBX<}zLmGQR$c6c#2qCrLx zLQsjBEpGb7bxQ_EE>FPyddx{T349M(b$|#ty^rFfPOs;ot2n327&zedrOse_UiFKs zyKD`1_12)gmj@w^ckz6ZdwzEQ=J@0#Q6G^~ut$%Inu{VLbZqSdy6p&gSw0%!m5JQd zU+g)=>EaP%yW1gD-Jx@mfZTNz;;`GU#u)GRgK^0$FVIZ`h}b#kMiyK9aHD{BJ$t*&=`n-sR-xSLRpv2ZriZ|Sin<)btSZ&tak)it5SNRl(FynksUSzV{&Joxxv#EghFABT5%tG4zSLd2pUq zvN(rTIQEt2x>z!7D6ChAMGZL`fpvLva|^C7en@tV7-^^w?lYoeSf3{26A;X3&@ZIN zMgF6-0dMKPY+H{KHEk4~x33O=ya;?uxU#T&>9xx>XW*cgYkQLDZt>XyAIvJx5Q#bl61Pco1pNbU0k}($-q27o-(3j9;}7^;#r|6@8wH-M6Qe znR;!i6z3P{rzfs@rj;wAb*|XhNPiPIEq(UaRtVOLaau7}_|eN_BUk(#qk9s8x_e!S zMqA8DgNX8CeQL!i4_TlXEWRlbGd8>IOutx8*t*VJzJ0y*S9T5@=ZyI{r_{W9_2jp2 zc1;VH)2|+VELzdN`tzl3`;Ta8y#kAGY*aOMy3V0ky+8rM%g>KbPpoL*i`m~fbFi{y z9k+;)WT;cc^(mj&%lWPWYYwg|_**R=MHL?F)Km6Ph`pPBfWX}3W+}2-c)63RdykqxFrt2W@+hoL00yY)m<{VUz>d^-$}K3;@rxhbr~;LyT)LV#{J? z=_DJhR4rq*Z&Ek}9%#MoCz!o2PYzxkA^J361(l4Zr{nQxd^L%Mm3eW~i2K&wC zLi;0?1K(|GmaC*Jx8L(Zea{Q~{ieUTQYr9i(>UI#OQjDsolag{GQQi?b4q!30cjXQ zQj%x@;9tBV9wS+y2qqxkkZhj*W0|3V*G2ug5%k9z5B{RLppwo=HtM2w#;OgS#>Gf^ zO{t)%{jAPYAOH!b433HVqgy13bYz2L*5b#6Cys8?@pgju>|rKmQUQyUCW8SAjQ@LD zkn7dk-uauObE#Q@d1%1|q~I2Wn7~eKT;97*d%8-FsW8|1WVIlf(}J+%{7~8k-v)u1P`5^N5wKD8_*NBDU9}kpBa}-m`&-H2LKCw!rP{%^ z?Gv@H_LwE#8yjpx3~V$os+51}PAgh=VxS9JKI{!|DCc|D#N%Ku-fqa!!t>}*qPE0t z1%L&*MxidZCdHOsBLX*UA_r~7{@tp%21Qf+)H3lQ?@kv;LEFC#tZ|;jl4djo8|4l_ zf<=*9))GsmI6})QSV2<++n~?%QNuK+jxC&RhYFfOLBB8vu!BqY*jC{fn(N&&b zmli#7yHZ@!FEoMdl-P$EhX>vkOOjCEkh1yq)1;C7y7+b4*=y_t)n8|`q@{~)$hAL| zW%u^9H*iRlK=BxbZ!sTU&0A7Whf23iM)OBbH|*IAmVS!SpIyAZ8*q-KY&uvBaWze` zCS9|G&!MBisw16_w(`p@yxQ#9c3}1D7H8?KV7k01%N&7^V!z{U7XgHMT8I#ZVrVuN zLs974mRzXT?cZ)nr&3|9!q)1MvZTiXm55VbKTDvFwD9Ez*x)JM;AriW31xT6|Ii_s^Se zn%`T^Sty9?seCV8zF;s$safHMeF{}(aE81x22}Q~SN4Jrf-rN-aX1l5phKy&^=62e zLm*m)5-n8PvXxgHNPuNYEQwEl0`twk!-X37arEZRo3|%o1!~^T{(f?P@He=_bM(r* zzB+qJxn3T=dc_6Ie+{>rI>1$ne6vAixI7ohB)3nBF2y%w$=2l~3i#8XBJ}eZXQawVECRDS z7Kt{L$Pi2UkuWj4or6B?Qq--(p!@f9hC`4PuVdm9sX}N*|8xkURlyV90&agXJ?UVx zGd5W@vV`eCpa|SCW0ofN5<6vqf}}M(et!HjhSmDjeLMTHm*BT2`r8}&w(q{ZJ$Xgn zF5I_gC#UE5?V+MWHO=xF&8)`e*2bg%{`0TDKK}f#C;Jx)T~EEFEeGEUUj*faMkjv<6(J%gMxBJp$oUV}rgZo;teP6Yq*)G>zwz%#T?R|_c6B_WAL_tf`{<*IrA!z3l$?!vB^ zoIrPmA*JJ8L5@@n)ECs8&jcJULyzqx=fotT={YW#Re;#QH>sQSEK?UVSyGxx#_03v|GqI+}rbYw| zI2(NwCT51HrughO7}?9JSz@vx$V8 z3?7VCA|fj6HJG%o@g^p0iLI^zx;qmz)qa;Yt%hTR$~F8g8H2OQelM|vCRFR`S*zEN zF?;PPV;!lY4oE(WEUQ{o;p-BrVHL|kFi3sJV)QJs@52}i>RkXNTeGLN?8iJ*FxpIyht+o-2;EWEbbvV=eG^hHmI@Ex<&lYrO}jRTHM=Nh zLu`qv7`@(w&L6CTb#=txJHL9>OPVz}jg)0W)at_MIzL)Gww|fnw5XvdsuXhNqXvg$ z#RO0(>#PrO-J}HJ0&W=4H8SNcCh!nA2|PnVV|>?8A%b1|{R{s^{2XF+ z(+hJ|Fsq8~aDZ^#MwKlz4)0b0G>%JR15LJ0jmCwueuFx8s=JBV=nC$-idMjgkfRz# zAW0JKaX^c@7DRslV_ahmAaSX1#a@N?e)Z}*+$EjhdwUH;Xhugs>Xp!{%qjP~6%Z?g zJ%9OKu?@r;522N0K&td{9nL&YXOsT0Tpqu!#}MEG z?oAprIwneq>=hNQ2nyS~Sos>vhtbNDn$bxf*B%zoLC{)a5?ycUX*tQB+0ql9-1=@e zRgn?c9&Z`JYs>mi;0Cf805(c)Qkd**ABc)rc>e74w0CrH5_%$w8~{^KY1sfF?*%2j zScUY+8Gl6`b++7V)$rv(_)Grk3+>VI%i%b34N^ji$?4WW7p3nNbY85l3=VhGQOT|d zw8hmlc?WKD2Ub%=bkFM|u9VZYXoD4EfH_znMz>Dn`LXWkD~ge`btD-XjT_mpu@<+e z!rV^Aiq7>_5PBA8^ADIE;%1OR$f$L3F`P}71^nL@D+V^g{#){i?tAPd zUlQAX1Ou=C*Y|~DEfC;x+2Q6Um>O^d3d&Q8knSOuudyR5^WoJx6Lszt+ok!p!0OJ) zYHDENdW~I#Z(q6&>`J|PU{oPF*9Odja|Ci(4F>bRp;T2{|` zWv#!+mJUI^5^_f)+_1Xb))`09t@p$s?S&gLd?S)P^I!lxFy>YlJ3fC-#6Zl{*5$Lu zs&@CRekoLe`-&%NYp0$Qf$&tny(ZY=G)B>JrAWb;(yjet?TK z-zOzW_Ocx*il+Fj#fqZNTBuI%M=%2C@|T5IEw~G z##FowL^EZ%dTXVu70V@NEU8HEqUsH6Wkv6rCP9Wr!%di=xA^N?1{ruWcaoP(I^=sT zkV$B+O|H9@jbeh~$S@!bl&*CR8?&%1U)}{UzSSUnaV~QLHv`V-ylLB}Ey#X2@DU)C>`6n^BpC04=ROkeH5 zmR-u0b)dl>f*nIF3m4xdbU(BBSW(cVcy1(W+73X_Nr0*Y7~KgUo&8~r(37HgqqI9r6ggnp;*)2V4M-yOh{MngDeOyJLiyni%s zzlg5H``HBZST`Bt71x-l89wcn{kF6fI2Z72SKWQK-I27U&-(98mkn;!7Pn1e7qqq{ z_t8aYifEoMlK0?`ah@7fG9z;0C2Fuf|By{4a367&&t~bUt**b))#+XT>NH`M^rs^k zN$&2%U}T+ZhyL}r+#t6``K51pc}#d0pZ z#NqmuZecUYf}2I~J`xfnSUVeFO=>n~LYg!m;7Ta`3~Bav+_*%%={^_O@Y2}I6{=4> zp4=SoLNwRe>WQlpazsV)I);?Iyrda!ZxJIWlJ(|J)E&@i!VW#%-O=0nvw8X+NtV3ysr))VVtApvj8^Gr%6bY|>&i>ebfS`U4xVEW{Fn9Sd$1rP zjk=}Gi+zao_(bSW7B%2VkDj)xytZ-n)vmwuIi8`ah$>$}T@~I09jmI0c;jVf^DK5i8+x`u2ojYqe*n^%NqjmCuJcotIR(!4z3fj$2f&VO}XBPeLDH z!<>A7S;ty||F75y4wNB+b7wU%hc|RvTz|t$fi+j&cGUbAYg%RTWIbf^l*hNrK2Y{% z;Qzq#07dta3IiWC&O^<&3LGa_BvG?D5m#s^<6VG2>O7)-qAMqKRk5LNSI`&q7WS#( zoI9B;?uAoFyRZQ?|H`{^?Fb3#)#e~KPMAtRIb}S=FhV9lA`00A^4~=vZ|p}wN@9+1 z!VE)z=uj+D0zLLNI_$cazk(-b^UXy@;P2qG2RenF1<6;uFibEwY@JP^fWsL4n|=yH z5~3EOw90Q)>Y9sOt8XeEB&Vt`Dj&sm}ap8l1?rfA&q`X>y^_}=m7P~Ik49a!D6ry=Q~`dn$|;{Fc&6(6KOovX!5~v z$8t0NUSKG9^RK+~QB+6xrhKA!%QLeHk|ZV{ zC!v2G*=49mXF6G8g4rDMLBK=EE@}e)aXx?|nCO3IWv4FAeE+Wx~=`bFQhk3hH> z?FqL?HkaV)#WX8v!8f<#7e{!}V1Q1=Ta^|2OtQfeg)X~1KZf7XO{et_1Q7|G$4!=Z zK(|dr@K-3tmDZ86KH}oP4&I!I$cQfnBU(V%yEt9^W}TI3(MRwwq5C)NEz}94(@6|E z0nIea-V)>JsPl`*x>ws8J=YW37gPE%oewjE*WxNG%HELB{@QR6D5e&ZvOYtCvHzd@ z=l;2W?w|YT{<(kdpZn+jxqt4T`{(|-f9{|A=l;2W?w|YT{<(kdpZn+jxqt4T`{(|- Wf9{|A=l=Qs_52S7qH**9NC*J9LA-+i diff --git a/orig_sources/lua-5.4.6.tar.gz b/orig_sources/lua-5.4.6.tar.gz deleted file mode 100644 index 5677b16bc0a4df093b6b57d51538108df2329ff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 363329 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�S&bbH{s_-{dy`sG);A0bM-T9tjbMv7n>4H5njX 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

5!seKp z=^CRAA64P-MY1nUlyo#9%@bqZ7B7m2og@N?)6SO13;U0VoN@?>Lcx$> zfmeLUR0ZZn;Vl{oDEo`6Wf&syEFS2g2V{)TMsnOV#t7y*P=V+G8X6L8BDQpaBRMBt zxfmR83p1UE&~n*^~?Bseen7DC&GxLmf^{L7T;?Vm`L;N@NWX zalraS?8uo+cO*76YDaScq>E z1>*^}z7s5K588TcHNSuz^MBklChcP+B4O#uGPZkA?1_U{*+EG_lVVt!cas+Tll?hv zw)0Hb&4b(Zi0mPbR4&bl5ql<>QK=h-`3-4g1s*Q5P|uo0tjO{TVq~!{c@YKNd_=aZ zpjAi|LO@p;=a{pAC38BP3sdtlIb%MTo0rqmn30*msZ;aeyIRW?8qHZb1!fLPxHPDjonz)qMi4{* z)SSa%gA9~0GarF<&&*5Dg0HD*Mw8LpTdV49G-o5s&N+EpDwms@XEvr6m{RkA>GN`P z@-w0N3;>&L%u9dEHjst zW6H>chiRFB8t%NJZ9%WVxixmzav7=JQ@do6S~&nEPld%OdR$>vCO*RUQsG}Z?#;t~ z;Iha(_^O3&=9$H+g~t3$Eti^S%twlJ&dcepRUtj0Mh*c2^|CW56r?q$7!oLg-wX0H zMSxsJCg`N>E-*gXit)q1nIvhbW|XC_?QXXZBOWS~1w=Gm(3Ge$`!P;c&2a|K5Sif$DdN$XHEF%jnO0EeI~1dBFa6&Z=mMbTxBpqt4$)&K3~w*S}t zNbA4RW%q<}2mFZZzheyK{D)}V{}K0}K}Y%X|M~iF<@gIhroXq1+SmW% zp&zm0`0EXE^!_*fKkNVh8$VGIs)z`70*DY{Y=e)C7<92?(w(f}M7he2VxYcjYOWEB z;VM4KOw6V>0T@{%o2QD1QmIBx)DOD-$E>KTq!|f4J2IWvy_x` zxCgI!?H^7g- z0e)D_2ONiQFeQRG7zm04bM()uJm5XptoQ~>CKDo=vyCQh@L<^kGg_@s7e)p!Cd+8C zO|<|EG4Z)Q3it}_B;ttuA$=CU@zVJ&*!7S@fe|{o9lnOHx}d9J@FAS^4kKeUXhzVI z500E3`f$Rb*h?^b^D44Hw$UF>!{ zZ5EeA4Ury(q?;S>zeI!>p;?J>MKWjuXpj_&zYR4GxXAN-NUGFKQe}UsG)(nZIh+o% z?plZy3W;4F6OZ6%3b8#gl$pp@Phvs>Kv-N-Xp~BDl3HY?HSp2ll`|b(#OvcU@I*u6 z0tiJlixMkkAMX-uRt99)S>JMI+2U zQivq1*hxn;70Y$ARg;vxv(i$HsYz-%Bq0DgcbI+^-k@$pI9il!7LLu*AazL5g~1FM z7P+!7SAHF!)J3#8r2GK+OtL#{PBI>mAg0QxvJ26$;|2{QdjvEnoBaQi7K?AaMVW}Z zVT*$CBg+ZM$DgI}FxrIK48^Ep6d9Yt`iwt>RSm>;NaCCpas-i&C3t!HiC8{iAqTJ* zLhzC0V>I>8>$uJ$Ha@IN08(k9!5RusWM>F~P@+dRmUyJ&J7ld2LIW|g&{NLD`U0Ia zLA)1;$PElK`8e5eIjAHuOhl{eMTuPGbz?nYX!Oh)u~pId3!@6PJ|)ux<%I~L3e!Kt zo-;`R$fgpvB08zYT&0>>r36eU=AigeAUORQ44Rl0Fp#(>ot#~xBtP9%MUsU)NeK%q zLXJ7ZBodVrSRag2Ozta;WtNzbR0us(DNJC~aL(iO6M^KbbW5e^;eWhTjuRJpk@mu= z{1V;KL~a0CE@~8{aa+_NSW3<$!m&unoM1Od zvI@$#L(|Xhbme<}erol}4SDogz`9UamgGIYVvzep_e0Z2lcFI2xpu^wbhtnu1A8;3 zhPP^kmFD0DVlhOZ9?@}xI|yZ{w__2h+KF-&$0@o*%?_zg>XgTLwTK+!HjCAYC=hAG z-e?49LGFZrjEvjGVMhQay++RIikU(Q7N~s*AXu|o8VvRpAK=impxJ8vm1 zD158Ehpr&3D3wsnum*|330*>>rSPrx*1R>)!0yA-HS9Jo1txwCNeyLLm!fQqE&BpS zQlJ>-lhMi$XeNBGc^pjwq(G}fkX&kZ3@sk{sjeB0{f2N*VybJ73n)7ejwIrkd?sk( z_v``_{Kig(%K=duk^@Q^sE`9eH$GsgFdBFydrPP{6)pv<0`(Z%Nh}ZT2-wOk7o{nJ z&CsVfEEK|x$3=*z1jHYM^(Fzx)KoY@Rj&Iw1u4If>I-={SaAvpBG@((up=Z)4j3Fg z!G;Zv)CzGlW3*dAR}6j+jz>cRH)5=X*!#_nNI3HL|96Lw6FM&61hT=FzSO@lcwsF&?UR_EQiW8$K~gRx#{Jz6SB-fkoa6>k@&};Z)};>*eix(VV)30a=O~Uu zD{3W|$jxMoTA-%F1qq^&D`Y9vHxDN!oHTy}IP#7Qf=o{;GMpvxr3^SKGyiPq0NBM= zTu2~WRv;|jm#rBPQaj?I)p&jhc-4Wk7NOWfg?XuM5&}r6hxV z4ltkF{??&F_|;YBJSO-W#fXUZ%N*;?7XTO~&j@p*+EsO93(lW06yk zZI(@Xe4iAOngXd9DN6%MDWkT0O%S1+-z8C0pqExoRf&`iIUPxjwhEGkbEHBaN4s_~ z!;!W%6b5<)mi5+D7Ks&D*hvbrXXHuWXpM|gyhN%Xn~AV!&90hOAOMbwAV9JNw!Vc3 zju>>o6RO=_GS`^nBgS07`$TjUf<)=t2!1*?&QaByB(XHbl71v{X%ZT-+X+-YFbonD z*x(r;$^Hq*u}CvM*gk3(Y{9bzC`vW0`JirQ47ECCT_fs6?3=)o!bGBzS{`m}MPQ>- z>Ms_T^wgpZ1p7-2-;)!>XfD>8#5w5w7I>L4o1es5w&;_!ZpmcerbYoZz5%oSMJx*s#h@zoHK*;m5_<-Pta1~QEgmo0; zcimv>-$J4ir%$opZtoMBA@jhKb9fI@GTnI}_5@e&u*EVk-LtJz}iK3NWhtEd4 zNrQN5lCH*e%oKVGC&)!)Iy=hcFbWCJ2_0y2+u2v}gK&MdD_r1nZt!4c-lFf|EvfK` z70K4{zAiN>D_X(w5RRy5O+|Rz0-$wmLbCQiC0P6Ar*-2#~Q5tlMb% zFI;YZhayB@bX*7yKDR8X8>wgRvr?!t?H;XUFX9Z~F)BjzL}olI2h-=Zl-P=c)UB_IWo(LTdcZ0Lkl)WKE`%Pmm>=89w%s0J!)ZZ@$b#58<(cc0r| zf*TFRwLXkvL&w5HSsb99#id4ECr-~LiWUeRI)SW$^Z`^^oLjUzZm<@%gh(&4ceAFk zp)YF-R!I?iJg7m8P|IKw0f8SBx?BbVD%Kofp#x5u&a;(rWS0aw@^=mB0iWzyqrY5f<(N64!n{Md{8I(;7;-Zo#X>M zDe^ddFMgHk%h*hWA$vv((pV+_2Kj`0MnJcB&&eplLuUw+`z^Rfzh<>VxDSjxU_Inl z!h^va`@g+c>7Sp!|HrA^|0f?;W`~JV!*!Ho8fc<~5@b91ffB%gi`TjrYJTbBZ zFkiSZ6rbBF=s`&0p)I$z_m6@8AMO6LgCXft?(`$Fk5@h;=kDBak074%|JQd2w#L&@ z>|Cx<>`tz+L71}$aR6&FMyHR}$0Zoz<6`1EB(zV6F~oF;jW@){#>8}pF|<#Ji#BxV z5DR9kN*PG?l@(cv`H-fH7`;+hCh`@GMs@&@OEejSj2M=G zELbI5_bwGP1jg?|bpo(3gojmYxvCI22QvcB+M1jdl7bf6t8u(Y*t23m{;-ld%oipR9|y1OQ!S#<8dQ@gwh)U~2_wKu zj0N4iDhLtM5FB>_MF(92f(LI>@PXdDoV3VRqV&enHBLp!4bp(I-rmSZr-Ihz2)$76 zZ|Nn0ezTp#!vB#z+VT4No9`nAae^KjLh5>JC|z%m>3XF$w_-5I&vi_O-$FE-T?0nX z#7yKO^|*vBTCwI+xtM}1IfUxv{kSpZZ%f7AHGIt5R7!)2o2TC zC;Q_Dwx~$>6<#x?0H@?+geu1>S{IEN!MjL&6)30-p#>HHv^S*fQJa|!Rc^sX3u+Qo zVGS(`Le8QX&>*KqUbMKTq6USTCfkCn6p$7eUgeVzVX(k1INdeH)Pk(X8=0A48`QE^ z!60s%7#1}r;iSRS5rYO7NvZEZHdeu%*G)D^MT`QtMc69q<|WK z!EdqJYUHPY_CmJ6MQ~CiLf?T%f+#N6coQvq15cE=^_Fvu&{#n8HzNlsYFSt+rRRxq zQEC>qU3OM7T?C9PqYz%Qut$k5Eyg29*$O;(>!|Qo$oIpLT1l!929FDu{ORecQ(8f} zOqAqoaVeG|iF2TF<$}NM+6j75n9M{^dr4Z&p(O~?9DGi$$t-d|!`l(avSLOK3)~Dj zEmeOnIW1MSk<(K3ze-MMpAa5i)x?lfhY;*H>5hkVPM9e=DETk{Aeda<=C`^d^T=`M9Md;l=o#&9 zs(Hv|BAO~U81P=VAuc{5LPL&K`0EHHlNhstciC;MR!6Brx;Tp*mCo}P!rYSAErf16 z8@uE;a2Ap07N0Myduq11D8tw#Tt!qPzUET6_*iU7I#i8pc#Mzb=t=Lm;*(DzmORGF z$&nJ+1dS6T2xW5sjcG+;K*(~O)a;BH1I~aFb{q);1gv8Wk;NoRL6}4AnDX>_gu>1f z$<50aPRhsGgr{oYRm`~791Kk0!Ej>v2Wfta0P#S@=Qy_UvEhW!VaM{%I@on2~;E2-#>$^lq~-w-VY zZed|`32m=}?0jRF?97as2_dsUZ=N9XS}KvfL^i`w2pCf$%?ELG7AaCbO3u=O+u2NP;2IErZnJ$n$igP}?f=>gBzYoVxH-NbKokOL-dUUI-7VIC|8mDtKpR@qjC zXYeRXDsgwPM@rH%Rfy_y8>jX;_-d(;8zWWZJ{R57OsuxH%WvEfZ@M*R@ zCy=HzB3P*k^b>q99>em8o@~PwNnd_t3p4v&L%(Ze-tFjjJMV%&3oO6Tb6x1UF4V9J zu^5jiC`*G+g0HH+?T&f7qu=hpTh$C8wDC>FlzRTo z=?A(dePxRVbT(sM4)X+)Uva?{O@s;1mZK3)xU~|V2kAHwZs<7+5J`v=pX?=Ck;%>i zykRlR$C|Wo&{gl(?J9ahp&+Ny4P3zrfts+#Sb(LTK-UaPHN&xxSWi!2LW;*E4ePbS zW4@XvH{>5|Rut19ZflhcZz7a@{h|+V3syPiy-5IzlP?BfDCF5C*;ei-k{`ark$@=p z=W>l3uwl!4>*960{uLf}%8J3!ESG5quhHR4uMz8b+}<%u=Aat`8AF>OJ;j7kc$kWA6n*j?}7#QwKX;fex zo302VquLP2Y1Z21-3=b(6g}Cnv%uEY?zhjL@3fD5Tey9q++&j(V7w21p2NDNhO>ou z!?a2{^3gepRyRpT6r$LED&S(Mwy3`@QRZ9R5%sE;IP;xiJbbd{)`Basd*|hI6^=*B z6j%z3RZx!`>-`6T<%H=isXG3CC>VR#eh8H|+7D$Fo;1ij$OV_6?kPU8(7+pv;AnNS7s}Zovj>~t2p#c(Z39(QdB2DcN|G+Amwrl z-Eww(z-wF|^PUf5qCFqLLvN{=>Rt@{ADnl0te(*nwr}wqpyYrU&fcnzJ93h3)Lve3 z-8x|dAB^R}*dKi(cR(FsDY#;53 zabjTDPx0BaY?I%vX!6@lntbjx`K@X4d47|nxFka9P^8k$#L?fKhW(p1Q}W6!iBL4X zYl6o!Z893A5sYL^5ls}cttug$x#R_%)@xEYf7Ff5h7CQEal>Yc<3^Pl3*uQUc*B|6 z<5+_QL7p>u4~GT|Bo(@u=rDq=qjL$u@ntfHZDq28;XeHEz@j@-ZJ8uzUNmJTlvhxW zuUNu9u6d$iRidh7aAZ*BFO|Gr)lz@v<#YYAk$u_FFL$ypxAn{C*_YVnBJVWND4TXy z9tbRfKDEU#TY@*6>eR?Q4c_T7N0`#1SR3kj_qbIcfsnVdN~5x6DW$&K2T~-EYvp4_ zQW+^3!Dj_z6W)e%;3+|mjuMuDRAs>fMFU=89L_rLgrH@Ljf8LO?Uk}ow1sdKF&ySV zBe!Sf$`{GCs0-!4)5t@re)civx#tb*Jm;W)KWNmq0k=DUelCCLU&3(h`STU?^V^m? zK@GmM(G&EXe(KkM@?NX?1NdeFQFExC+cRh+*ecHzPN14D3O`OJ2837*7_CqCGY7pb z|Df0D{^XzXC;B zlt_gQ`qQAjD8Jyil5+yS=bY+Eka${k!F#$e*;h4BEaRT66{)C1Fz-Y#X8e(~^ugA_ z95Az|#N;4JEa(2dn0I`%wP(M+c(=!=K)M$)=fD$Aht9#hU9C?*yRWg@zE5Pv|Qp42@DoMAGJoN?YnblJf=k13~Rpcbo)+XbehjpSZH+jKH)yF322 zr-@n(!zFcSq3V{K-eZfVXwMPQ=(b@BCvf=XXdqTb7Uyp#X?geQXpEgN&Ji8)aAIuiN!H zEriHH{E~3Rv1RQvq2&Q4p zZ6+?OG}}P1h`{3x{sD&{U8&x)MQF2E# znJw=-ky*t;9$YaWTRXx)nPbJWB;ruZQlI*a_vT*lm$3alMp zA0n_^Gp%hh(}I1J&9rD-E}xTz)m?+S&tNeYCCXwt!#EhlfY7!o2FtXuYLcj@MiX;J z0&0;diGkLG9t*CRa$RU_8l`Dfne3SCRPiL@{9t@55)OxR%+G}iwN44+MDY4%!=k|z zo<_-%Ulrv1Fyrtp;nYFgSo}BA%T+RYd+_xNYRSrV4mDt{hB{=Lvl#Thtb>GRD(qw` zl<{29UsNc-o{%mgRc%pKZixRVMCb3f*>Pxn;iGJ&u3fb20;}+-yY4uHE3?lShwP!#AN0{kwU*nS% zAtQL{oJyQh``~Jl*O8oP;<9ndIvQ(UDm2ySkE4ibbfZXOc}+Owphc=!MIk=$ zvC5}8dq1>Atnvvh!r}3;TvS%MOuHU7IYWRxRLZy2;BJHdj^-x^`ck-QmhHKnGHo_$hVSRk`dvQsh7$ zUMR6dter5tz}R92hQCxytntD;had77X45=| zAM$t--kQhoLp^5vXwMw=I2n$t=kQC58&+rFhYDY1gE44EmqCqA{Gl)rTEz|aQLUzN z1K;8CeY=X9%pFzFo=n&+oLRdvy}fd}du94{<#bHF0FGv!!w)q#bDnC$$3^I7cvzFJ;J?h|z3(R64(2Qez= z`3mu|JBy|?3KJ&i*{Wb>Y8iL^_k%K1Qjs&8l0@?|IjoQWG!*UmTa zpBMk@`B&SGf5rd$BR+QgFPVHV`d61NHK&)s*&Q4WCm$IBjDUYs{I6&}pC(@XFO0+( z-5>3X9qxXQ2w;zTI_qGV=48b2edOvKuU7S$V#YkP-j*$D{h>W&Fy{dZ({@?W0!r1OwBbRSMeg z$luD*XX~f-@nQF;vx-A29*7_)h6fj~2E(`Qzf6v1XXiIR-Tr*{%isR%i=vp*6#wy$ zVo>~i@cHfM!_VJ--v0bApHDtN`uyzk^UrTS|LOC)&wnX$@cEmhM&Wi92I;bHoYODz zCBrHQ$7k)J8T{$npiCDV4F`Z@1=*_w&*R-e_Vl`)}YmF-L`&i-L(K4#qO{hb>DW|-AVVTd)8fc&$~Z%Z@NEq@7AHp z_A@KsN10jtkJW}Wlj$hFT(SW=uPj(lwRtoq4GCF%J+6x?S;pc0u;Z?Pt@g>5zq1T; z7tZnd5l*tbU=%~`W9>zO{r*HvX}zWR?5GRwR2LO4 zRD7c>>txc`^^nD_`#Y$mG}m@&v+fxYPxVd_r7`_+a15{}2&z)h80N`(b*HY+s+9SF zOoX`XGunOdoA$;a8=I5vS^Ha#o96GH>$WTl=gF%#EPLW|`+VT`r@xw^E*0YA+WPkW~lOKozL0 z=}TTct4Jk(?s6XeFXAz!#bh=OC#Bt$^u-14BPymSGG`K^n!HEBZ1%ft;dDboeYCV8luO)7FCxZNHHf=sCZL-3g#c-pAeZVc596oh!DLto%KS%V zQ20LB4loQ}Mcfo~D-~=2bhpiG*_ts+Hqz$1mR>eV`_XMQK>N5H9f*^wZ!)y59!&_5 zhMfy?x}du+{7%Oul^6^kQj{dC!|Em#0Xx|v9WxQ=99uQ2d$qg(Q(iDFF2)c163o=ooTm|bC!tSP>8?>Mk>Sv87Qy7qX4OtNEPZje71olz;nZFGhupfshV zQhWs}RPnhLbyg>>#>Y8?rtOiI(@?_1O6Zb^&5ZwwS#D)YT;-X;5M}jQX_X_x1+g)j zUaz|cF#x%2Ie+q$!59pXcm}6RSD{ANbpiH-{5&x^N=jP*rh4T{<(d7k+37ZaIP0IZ zPWxxA=E|s(A1Tma)gFqwhuBZ!uS+0)+!s`Vpr^1bYOH{+p&8boq<~q83-0rgQ^F?+vFx9m+zR4u;h_P zN+EklA$px-1W>l=a0h_>tFo=VM2?`Aw{IKusPU(-o?mPa8-IE+`g->CtFMBaWC>l6 z4q4bGgoZ;3W!m_5dt1h1+k_(t<=Kt!s62Bhn^(S%?y4#t_A=tH!)Uw+c`1=Gcitfy z?VnwJJ(?!MSB?jy1UQRju@UY7T0o`0OTSi4nzQmy*^G<_Q2HVz(`}%|S~99#V3g5f z6|?uzO4ZjpIX3~$(VYA6RGM6ME5KlLED>>gejrAT4*|FRopK$ZXjX_;&skv41k@%A z^hoI2HRZDe1#ag4u~_zeux@0{kQ*C2<6z=%I98RESt_T41L13t%#^E3ipg?v$P6F~ zKo2qE=d+lganeL`C|g}DBHo>S`1?b{voEoTTfZn+z`oF+pmOAOyCOuw@t z%H`(dYs^C=hAKNJE1P*kUk#=&6Q{4;!N7Yp%sd1!H`%Mw;W#3_DS&e(EUM< zY7gnbBu*&=3UHYr&Zo-yWqQH59p;#v5;`$-1tks#O2e1p3$_DwZE+FdY|=24At)!_)bKy!6xJv)FtqRXRsZ$` zOz?D{-`SB#b^oCLKS~wj+;f2fyhU?V^XXIW;Y|#?8$0r-F4Dam)s*g+pEh(5a82`* zXoBfE3DZ)wsyb!6$4tV-;L2(p>!GTPj%%tm){@lm$?Q%pBV|0OYoUyt1_m7tsg|Aa z+oDv23&c!C9D8RPR*YB4PfW=F56bj|f_MmdH>!@RVPpglbLnnJp&)$__l-jwRJ-gsKlOXaN0Gd%q>(F zI8}=(Cp#}vL-slrcO11iRV5RPPJ-`}doPkPF-r8_9b)=Y>%Lf_T&cA1FptaU^--^| z^VN3duu8lx=d8*O13`-O>MhUIQdNx|T~+Z56gIw0iOQgspm$+aVEaRjZZfVn?hF}~ z2?aGzfx=QvU?pIKAXh7g7A40mCLkuEFsJr6>?hFdXC<{j&U;P0JfIxUA>U(s2~+bW zKu}ixYSE_e;~9c*^AR`@%#DTv1baY5R9q9YWNg+B zPV#&*Xfg)_bfqVd!e==9fhOa8qX^|LjQDxQ^)7gt03f+VmA)wLnKB3)^|RQWFE3<9 z#kVyDp&^abur-~0Mle+3Ts(*8b;b8Jgq1!V;>gNhULff`eX8B`tf3Q@crn3D$#UY4 z*#p%AfytcVZ>&I2t>s%W6+Qa=qGb0Bm#4LR)2yI=1_ToLI~Z8WerXRd92K}_X)thr zahEByCUY3sPpp0+Of&H=cJw$HjxOpxFOkl% z(9qGu#$#AFxDBH+33zj==XfDekHpPN3*oj4S;ke~;zp@Ok<9H>_;9&;>K(l5v@9p2 zY+4meY96F`{N*EWOd*2l2n;7*)z7pp$5YNWojJjxB1$MFpR{1{Iif`3+c>zSW*vaum`1rd@ zzMpi*s&YT)OGEYn2`dc31^Xs+n*9SblZL;|ZU?WC`Frn|6aIG8J#O_5PJdZ-N`fNC z=SQv6c9V)DQ~j{#H>nR>DK(9^B;qAlgc*i)P#h#U(-D0YYkFMLK+>4Ro7*k|rlWa` z>xRfkS$q3J*Lb75$i#J5H@gkmFLSR{S65uwJ+C{KOs=XS4ucHV5Z&d%V_PCs8Cv^(dgEqz1k0n&axuInfu%?9Rp zxH|3bSZVLrsGy?@!vJy6Wo}J)QYjvla?Up>QZ1(-%fVFQrcq*4mYi#=?RClN)4SC5 zyrFw3a)Jo-^_FsjVUkm?@TYns%NO5ToJ9M{(6u;KHMivYWxTL};!l%MKAK+hJAK!u z+#=|nSHI(*`W@XXns@lq%K(qBZ8o4BL*j`<e0iv8u)(Kl5EDK9yCi@~>E#Zq@d# z;0b-G)4;zz|Id6p|Bvg*V>^HR+dcjtjjx|KzTUR{KfXr)5BTq2{vUtD$M*lg$!F&e zv`D;;=LfW?!zlHhav%l&8TZ$DNJl>Z*~EKrJ+U2CY;#k*s{hM!GUKD8l_e?W z87{wAUDlp#iZgdX7OyU}<~^h4Pw z*hmIRA0bEt5`05C(&sz%iX#4US*LeWRw5Xm7=b zW3=_R%3*xlJ|KK?wsQ_IY0k?#Fk-7rMY$&M1uk1m@o2q)Vo;MfjmCGLdxYJ5W6Mt^ z(&H>H-DE;vSGm84-V+B3B#2-W=k-JV&MM^2*WUp?;UqSNTGf+uosEbp%s@)iq|7LxJD`r{|4 z55NC+4f=-PHmG*&B6xnw)Ppatb>v7PRHi<$yyed8d7(z9+!oYSHv^1FQ8Xr$ z^2SV2$==X%t-Z5zylq3Kn-$Dq$#?T+A{YKdavRv3X6#kHcLw2Lkj#g&nlZn6?Dm9EI81%}6mbDHr5GhN!SR-ISEBtNUS&h(`q2W$1jfe0J zWrOlOnnXC--9QaYE47V!y3h2Zv05HggPF4!GjnJbM7Uyf3N+Omcx*xzf%wE%63!tzP|V<@#Mq6>0?&W%Ba$H25yrmEniY(PmW!wr8*4 zl`H|ZtQIF&%?Lau`>^To8Ju1*AA=yD-Q{p6ZA)5$XQg14kQtn8$f%cJ`Z!g8MBQyAr^Acd+fngz-X>=Lt5^xS!q6EQz0h=jH>mndA z5^xta#~}Nc8S> zIk@5h?ZGijvbagm2cg)MS23?y6zpMfAlBfN^_n6^#F!Upfgt&qGfi9?5et6K89?h} z0IfxMk`1LqGV)^6NF5lM8E`TkM2c2uQmr7bLG)MDBq@w)ILv)5SrqDXlb)rOOT!?@uqXRB(zRjYpShd>!=@7-C}S}+FAcs|`)aU@-)Ot6Xx=Paz9U@4 zW;GbY6)i+S3(9rQ;VhVM*_NfKcS_9Uetn6Rp=q*Pm~y*rWoxg8HsACC(b~w4Kokk@ z>JA(L(e6`1z!HF-JAs=n(1RKWTc|mPz{@a3F<`tXqbnVE?C;85irIqVHdPgMUadaU zOEyblR9DQNW=HlE+9KX~fw^|ml$VViUYzzwcO7d7#pyr?KUM}OY_P$tP}dC9Np||I zZob^Ko6Z8y@2OrNt9xpRUAldsNNf_m0;pa7{vCX`LhGYP(Q^8|D^{PtF%?gj_WsHm z5Lnh_)>Q`Glm6@O>B(v9q*CWVv1X@2&V$BAW*;*gn%Dtl`6;RgW*7Z26nc1-^N(aju7-@Msu_uq&wH;Is5kL zSKK-EP7bx!dzy9Y^-d-41W7HBK~h zQoNaMIZKDE4Q=KGBx(%YS*)UhupBXHdC}P9NNXAiloyfur;aktT-kg|Z8haiRkjpH zIdD_?%Se)rxl7w2cjw&ocL`?COUj`@C)Usr(;~OQLnJ=daIK(w7Rz!G}???MmCFHI*NhIL8)vjv!nccKC<0dzPg%ici_u%;I z3~Bv{n1E}UF`5yP-7f%tiWzNiD5(f!0Ka5{<(0DSIQ_3NS~v>}{JZqWLStana-=5} zRnZunQOohnQ*N$e5Z!K)X$hIWL7XJb1t}1f)D_buL(GZ{xo77)XJu+j>3J0Qw=jzW z!z6r9=jE}Et50k#&5<+^qkHxPkua?%bP6zAy78x?;bPlp zC{C+yHB>HE#6S1Lzu2(7Hp*3P)9eAliL7wfo0*>_t3XMs+@ktL;`4&7{nl$8bQSiT@Ao=>Ij0;UW53ly5O?k1k97*;@fw`EsQrN*LRgsT%0s+sY(a?>-%>B%pYt~vMH*A5T*a&d?+M; zux^z4hsN}|j)hA4U6`9G@}*^BhcT?u0=U(&pT;m0v7{IVZ|W;d1Q_*RPvp=(i58(4 z8W?{N+=b_M+C=~LTz5W8iZf_QJwqTD^otDCsbP`+mm9W5#Z0sA2>!yY-L zO)l<|i@%V0H{kE6-#$KU{amqSPiyyt7ANJ!#B7(c+o1um-tKs}1e!1ELuLjOvboS^ zLkB+6Z{S5*reNj_E~A%`=MEew4+)8o=M8)W@)HaK`gz5xa8aqf#8wv^N6nys#VCAQ zN^=K5=cIgUh zOd1fYP!~0fQ%kzKw@Ai%KqGz2^SvV%0FCdY5@mubs{~Y5Lc_d1tFFS~ErJcdya-`} zXsjidIhCx-uN)Du-={TEVv{4*ZY9&pJ(Ix|*M8BtP7ubdC>@9!j)xq=jF~dv6UI|g zb_n;g=6YZ&${pS;!B{9kH?d}Eqf`y}%1_+`N%~XeL=R7joGT5Zbn)Q-smMN_&O&9j@FUbW9JN`bAK5(DN-yBp4B9}+pC?2{6!OsiXY`npVn%Dt73GY8NXJSWGh42PtvfSps`_l$XTQg- zpKK0{`~G8aUt$%SM5twll^9Nj6a?sXFVLw;cE<&>>KzTj!Btega(x(^{flrukE1yX zW!MC=oy$Q2<)nefWbD?S=ty6D|CNWc^;^F|{3GrDE*o7voE1A%b_2@YeKy~2goj&v z6hl*Su%M6Ha!d~u_rYqZu4Yk|+sn+><8C%3$27pES!?97jg^?6+_(D}e(`_}s7VH< z5ytq|7HFk$S_*EVi)qO^>)N-vcs)|1+r1hBsX4bBlwlH&5o3-{Vik7EA$;1`dZbtz zO1#K1oQm<{3=ZAz@AL&~OtGMno0J1|h_X_8tZdy>U|bA-fZlH6d3C!VxI z92&i$fDK$y=2PoJULfXL%MIWxrmP>%*aGFrIMthndNfb7@k_?+e+od#WA=R$2k&;C)dBd?x_OzVjjZ)J;+C>1vW)E&eQyB!?d}q%f zD8L2h+<&AqBrRTLk-KMTYeT6su1F|YWfn!8mPlFGGB$Rm5;ZiwzoDAIwHJq34nbLU zmW{0$j-@ZgKneD^aeeFc1l=j^1(yk0?~CC$F58hx?C7GL1JS4-XbDE~G=Ly$@^x+= z&ecOplV&jy#~ed32{9%%BV>hIX;i9{C=0JKZF)FG5YcTouq#=e zDN|V}icnZlXp66(+fSzA^@C)l*-Ck*H)!#oa;72?SwfyF;{utnod=o4|y zF(%R?ttN7tP7lY#)9BnVI+n2`V};>Za{HEaO8;k!Vu2h+TK6m4*;O>5`(;aWZC~=| z&41n{=qTRvga*fo4{b2wsZ{$2?a4_?K%tth)5v!a!s7+xJxl6hFZu$HgmWSMH6Lmq9k9-lU%Po<50 zLmc~T5c{d*A!b5`K76P)f$ab9pb$OzE`3;p^YK*CBjEVeHqah6~X-7i#$TDrOr5EwxT@`&#q^Z!s^H2Q{iXLk~a9EzMyDez4eKp}nJ%W=*1Sng;Xm#y}`L*K?`sXUSc= z_{%-Fw~fq`9b2PrU6pF|-p!!R%krX8LB+NCy;G@J_h+Qw$IM4$bTwUk@9sSqj?;#K z)hRrq{e~mlpC7$yoq9Wz$it+vQ))?ZNMrIL4IhR*izr^Gbi&=O#kBWE2LZUR7M1T# zl_m1T^}nkt-!%@xuXAQ{pFXY9R<^?v4b^sR@aD$kmDWCs2VUR7O#XCA`wcafO3LO zFg%_VretvClAXTIM|CXH$dAYE&aUG#U>ABk{Z z3xFyHrdRQG$5d2eQ}kEka|}Q%0V)qjr~T$_@BFNFdU((~(6DAsA7;9GrgrnSt}}A# zj8@h;dwY7;JJr>qzou7ny!BH10rgq`$m{a)8yf(O`waNa81|iqKrv%hH^0almd+rS zrn)zM*40qQm@U{*F7V@7M;PF~nMCV9oqKxA6hf2r3RpYqU|qmz|Gkxg0B`MkNA5MX zMWz^b$wkMNgO01mMaR`6qT}kZ&>=yzc3qZrIdBl6f9~jL)xHIb*st`CvLR4-@1S5Q z67op1d`sV?&RBW&dK4758gyze7s;$XvyJx5c%;40#(g+x;e8F+De5}T2}dF)EK`o7 zz$RO;2M@vpMf-@R9EuvfwIj*Ai5kG99K~mvld?xab*e7u%0ZHsbprXK~BFF$Kz&p9Q-IgFo6!cuKR6#moH$}P; z!?@bDU@F(v{Hx*S#jq1hA*3A&-!7K;3-lL20VpTIiClUw#%w7@_vM()K?R`!V6jS6 zGE7uJak(iERPY;|Kk21Dq3hHqG6j=o)fbc{MXAs`DbF)wzi5;^ z^Kxk+Cyxigu;g_7N#Ve3JuxGd0vK!07(GR5D4B`U^N;?$(mB!cAUVL(9WkEP@!Vt) zr8;_virYPd^I1?vchv~3Uw10D;QE=phRoz4KZfO`R+IAr-)N@!nZ3A7v4-O^)$0Ra zBXM}!uY`O2=Xy5vV6QC7z(n;i=j^`(*NlOAc^-CTTsEIrM13V_4E-MT)Tq0wZB zf%&F)_*a{F`6e}sJWkOtCiB{CN#!Syi-hqQtqFKR2tPq&7-G$s-jMx~Bw(5b-$`BM zy}8pim3{k^c zeucs?({eIjWU184>g#}cXF8*|t}^XeQ_d zF*1#cwa%@19TKBdqWjuDldIgR!#TP%E!ij(2xvElrpN-qY-3J+pvD>O2Q~;?jTk&1 z9&6h>y%TdEURqp;>|&SGMLcE=MML#{9E}#Px0ttOm*yeh`1ARNzpVn6QI1*>^B|)R zyI8Hn$(*R6aP~y)9YwMx?emMus#Ar30Kg^Wo+c{xNx-%+r^l*`IB~ukj31GpVoZpq zO0WbCqsOg;Oxf(@F5`Suic> zs8&_6^O!uFa!i$`iNT;^zN8ekOcrQ)&e3)j$xS#PvUfSxEHR|N((#k(!uJv^FW^SkSei(c zn1%|IfC0g#yO^sL#-~I`M*w^dzXV0Kpt1d#-@c)Xrg#w@gVdiYhX-~X0rt&2CGa?Lw zO@Z(<3BKUai(-vk0=g;b=v^j08w!fCm!UO)mTOjoN45|ZvO;mq=ooYaHdjyZSO3OS zPjE6^j+d!T=FrblJt!YgbUCK>CS@W+lsU2F^eu;k{|TDkehY)S3a{g2UMH&{Z3!gi zL1b1-3EnmRv2$34G%@ht|0>E<nQ}P~@B_5@yWU z9n6WyNaZru6qrwQhSc<&+P(oO%1%F?=H@=ly{0>Rp*S_?%E&;be3UomQfA`(nr1>H zP=iWQ4zO^7CL|%w?G!06L+|8EaY`%tiA z5}#vGbC%1r6b1{6A9E6hzffdI#67yZ+?7_W1qzQob}egf-34%G7Qh|PxRAJM&ABGK z!=+H8k@>n@`zDe(>dTi^Y_E3bWq`C=P~xY758Kv;;J^Ehz~5DTiV@j5B*_|YG%_w8Yct48%Ih@^ff7QU{q)jfQAnb}4 zDPeywu6oro1TE1$I4c&m%V`ZHTnq&wnJ;GxR@8^V9i}DBbDi#bA?ldWnjqx1rz4=- zLCo690nv`3S+qcnYcDDF2?fi-*X=21x8&$ylwR=p^k3F!`Z;ngxS4}t*V5= z?yQL;A#LfKRpL|2R5v&fnPPXZwmy-ZPy@#$1f5y)d!+Gb6OX zJ2{Fev{8l+tfjSP_qch`Gqjv{#bR`3_?%C^{{2M>6}c+cuR}Fqu1GhW18q#VLA z$EiM!tXKQ)yGyIuOYfCc?Il%HByyl9)aVApMl_yGqG3#TN}^w@2c;Nq4dO>gK zcsiMw-8OAnFFh}q>qbR4nTOgzH2P1MD4(E}Vsb<@Tbn_nOk}R`w<9cz;&KkLF+ox$DX`i0& zN7KC|DtLNCG&xl3{6DSI4tpQlol@BJp*I)v zi;VQ>@n;ov+-K5kMU=~=LqpV7%<`Oq7p5SZ7pXF2%DE3Cjmt3{2;z%8*6g|d`Q20w zfY?hP?9>o|X_jv$xFlXQMT13I)j<3z14~s+)f*;Q3Kec;hb84xPv#s^56W%-nZ&RU z$2Z|!8l)4Xp=g>cFUdqo+{^BZ>Lq!UJ*sJIvKdw5>2(!NvmQb>e73NT78_7bb^_wE zM;>@ya3;b%CKyP0XN6I?B1(SVfx$g5a64{Ja&UgD2cu>k<&sFBR!@b zgoiPvv#F*E&;o3l$8(_}=JFu>>aN0@$unl|Z3tM1$kR z46tj>$^)nb>l41p-6bj{@n^*^jzF5MsF9=CG3uU13ks7>nF3pp4Dr3Sf%^t4+_^qj6JIFtNa7&^KUC&~DhoO-0qv`AwYuQME?$$z zJ-boC%j)KG@j|Gen-?1&l)Ol+mN~ty>5xjM%N9Sd&>1BT|F{arqmA&wcqk3DB3h@Q z9izc$j!&SC2MW^rril<0PbNDXTsibOSV1x60m^m1*>^ea$3x$qTb67F7gyv8i1$+D z7pGWXg!U@o)L|&(vmr?WGlnaAFP%``GBP+Nv*v9t9A6nxp^26(gJdS~B3`;HyC7S{ z!;vn+b}9AQK(21t;gBnudj1AxTXd>P5HXNCN(Mm4nFvuIwyYry<8&6{s1lG8$d(7b zS?}>~vplX8=#F!|YrUZxvqFLX0BVgzliEc*3q0GHiOrjg3EY4@taNS&*TxBdv2%*O zt>BI#hYCa^TZo`#$oW~T{~zZ^Cv+hQPp5bK(0~rJzAJtcP)0eKVzvUh@gxI2Ws^sz2qUVnIm>%0P&mdly59)BZJVlJiT;RiCjSe$PyJ z#Qkq!fGE+2{= zJ3b^635h6|+!*WXm8Nmz8w>1;b7YU4gM~4Uq+spT1;><5nai0+?7uApudlx~qu{|H zVQ!mibdaBFW7xLG0mZz-bx)RyXo4MGEH5wd7uv>ZOwHyP`K?^U^1Hzo!{4UGDl?7C zh^QA|@RTC!IE}_YCsn4BiZZ9Ntd1=GDI+Q)TJPnS`_8iF`SMHiou3oq>7$*BHcumL zX)k2lByp6s%*jFQNn*oc8}BWvZ8VxdftF$rXrE(ix4_PE?14SOzv60vZB!LoUZ%p> z(AKc~W6SnF&8RZ;8^`JgZEpFfW(o*T^nDghTb=H~VSBU2Y+cudtuwjx`{e5-FCN;X z*PHbSIqmwMWUm3Wy5!=)c=}u{Rwoz6prQ#XGwmVWs8p&c^M{LUTRmY>iT zPp5@P>?8#<+L)RzMxNU10gX{hXFs%09-%eQ05Nmiv$l+luz(SqHt&|N`+Hbh$L-EX zEuUA;OC6j-cgsmvHxEH{v;EVRJMl%W_K*%k+vg`g9y~^meOk55_Ht94-Rs#u-diy`Ofbs2VtUqY4z!f1X5fyuhb^^CEK*khLO!}mgOQewAI6;0p;+X zfxb*M?^HYq%o?|E{D;*^10O3zfE^-8Q$tRAChAdciY5wq06@IJ4nEazHb6ty`kM|d z$scuA9XomdtS-z47Qly3S!Y9jvB{L#*JAlIBlnliUau3-Pxl;@JJ)6d2|RAD09l^m zt3JoV8$aLM^3v40FQe17J(;m`!=5S>I)HWqf9A>4dax!j*Y7jis@ad7>J5djkDg|_ z@$xQqR<0n8^nn`8$79c_DP4qRx#z-@`Tvp@?4Yu@G0wS09@alR2>)zz`v)$yKY$4$ ze*T#p@RQcWSxVVdb-LkvUHp-omW6UF$Dn{=2=l>5&Y=s;=Bght zjlb6}rcqtyRHQNAh|WXXl_7s7O$=90@w3^6ckxIY-bL<)r;n+d?s}FD$30tLKF#R* zk3%(1cRrSG9$`!LcD)Cz@7yiXXb*Dt#ZN`;@3B?-osj)9XG$KhU!MIw`{h5I|7s+C zDhK`_x0;SyKRtj8=N+#_L43JWz6#ST3b{vdP8^)($e64cpU=ZPj#O%MWsb(Ra2MSL z#RIkQf<0*j-+hO#jB7Xn19rdjXL;;%aZ%BhKXdIw_V-EiYU#Q-?25Pa-Ae3JJgrfl z+UOSeJq+n`i5`z0r?-tA6#OR?V307vDs1uQqwKTf$>-w5Q#!fr*#&(cJuhkxd1{Ie zAchK^MDxpNI=BnoG@W>Oe9!k5Lp+!;ozWzj-v!nsp;ZIO^2!VHu&DU6NTFdcnkYvi za@Wk;{yf5AOZMUc>4sS=Ka3`BAVPIfD`R}vCeqnZh5R@&{iaN6Q=#4!$#L|a>h&Q~ z|NnG>|KQNQfv}y*irWA4DO2g3d#5B3j_0Q>Cx)jHVdooHaguZO@sI`6E5jZTdQ zHvD=J?5>Lw+sq=+m-iL}(V@pK?o8yWY_BA|lKD1zNUu)1Kjn^iq=3^4pb}d-Y_oCB&pzg{U#~_s)lwy9TMI;tP-CuJqWjLT{C0s9K8$A1j)_?fgH2h5`9V zd>j^l-{-CO$Km#?A%7~bUk&+FIsN1EsmI~-xg7b^xV*MGBByjcj?!I{ga$Mt8MqcaY>T!wFz+?ylmABPj7KF<7o zLJs20mC+*0GJJxOK)}ey}GhM_}&*O*=AJh@?H+mr2H{3QK2k+Tv z77s=}f*6hCS>V|DZ#*?Q2+jI%O{&zyry+Jjd#T4IXhyEDQT%6M73e=1JUV92kB=Tf z%yVLscw$_}E7p?W*7>_y#qy#PSaGvgiFd|V(!}^669B&(xt4uuM_f)P91mr6BNnKY z{KZ6Xr#SP7_Xq7{$KBo|P1MH=+$-nd&(+|+P2}qB%KAC^2z1f#AEc>%6m+q%x{Bk7 z8rGu!0Ysxz~LP ze5WQ3JwCcWRNeGL_cq;o)!eLMlTilaDKC=RMO35qhdKhWHDueZO2uM)H5lngf|m)2x~`5=Q*A10u*7u>Kv zC_Zx1K>PQI*2F&U+W(&0VSN>al^k$Ial z|MVWVkk&R4*-b>ciPnRxIoFQj(jLVnjH2-oqj;ICm&ROda6J#9h)$<3aura*sW@9$)tFWna7=AM` zE8QeW@Z-a0>e_5jtY-&l7gjc*QG6TONgb78f^YNYi-Z>@e6)&0kpskrVKSgeVjtV{ zCXF&;op#vHC{@`t-8cU!6S|mX9`>OX-BThuZ`EirPBCr=C8`?35`~>V8^6O}NUpJzrzetAk&{A21qPrv z;X08EB}^GC=alJ*QYJd1v2@8emW#nSMu%REpKL%*F*z2eh=LM%0oOfHYu$|9mBT#4 z;uniB9vcU7<{KAPCXI@f3=7w|q9l(?dh3;$o)zncG7hZb9nDoxt-;jxxj!nce z4*nF>1Q4I0kPj<48VBY7XnlyueUN2M4`e``=S>p^iqf>7dh<73vv75up&Jgf5`@=) zjnGNt?5yf_OI4@jUeH3npkRGdy(DwUN^$@MI$s;Ml+8ZiR>YQ#Pre;>C$K(wae4M~ znTg^f)qpfLKlHjMRcFy=NHOz9N90k->YF57_6OUepLz2v@1ndF3Hs zC7SnTHX(fEDoLj_NHIE^&^ zcpC9%?vqJ|*c1Ww#K?SVk{C7b;rPa3Y4UcloU`uw`N+!;RwF}YwONIjvXT6xu1xNE z&p*oRuiF4ezR4l<#tK5;gw%C9nn|2ea-Ljde8|o|Q2nk5Q~XqhDrzvXqk}QE{j!HT3Bso?=qOj!WH}|z1$}$zs8LCXuQ-Itff2FRODkvT z0s}}*5{j;-f*NPM_w3u(bP>%0FA_8lVQ*!fczEkqsc0<)G>cXZ@pKs7`V9}RF0;d` z%HWMN3~%=Q*k=-fYF(wzfuB_xh2@Asg91X?s1p@};WoW~822h4VvA7xTnq z=JbJ}G046fM2G59IM557L)53)T*Cs=q61q&Dr2R)u^OZRTn?xQwVWq-Nd(qVCGA43 z5Gr9L%<2PgCt=NDe6tPX$lPaen17@P++fr}bv5WBN*^_*UUpEMTz%$V zd*Z2f8b!ls=$vZrzXBz)wA#rI)#7D=6}ga(WSB~AZG<38>)^!x@{^E#`6Z27hHbS; zynNh8!X;JXT5NhMJX39V)9Yn)qXw)=CMe>Lm>EX)xGKKKsW)Ya&YWDuTx7=-@fSHq zN#$bCbuk-+GsUVJM>(cr5=8)9a+*5{F-eL72L`2v6E#zr)Gee+Tu93=N`}H+1vDjp zHbdqS-pj5g(PS{YV@CIa^+L}B_E}6u0>-(X}nMO{df>-)ZS9zK1X1O z2JHJrR~1FzUMj!Y5PqWT?3Hp%hOI7T5jLHLgD5LCD{otJ!$v~As!|tKPFO2~b-X~X zm|(gV3yK`TrYJeXA2@F1g(`T$fmiernmPlN8&k6B`tqvwk~;G%4Gm`ZT@~50duoSQ zCJ(3#MaM$JWr3g&=H(y(Z1@l!a@X4Fo}HgQz~UpYz~aZCUYsxM7Je>)-t62gKI*X+>$LC|l)_bwJsRk=($*`~jYmj5!{@x--Cy zlGCQLta1VCG>RmtO%a69B8S_}qW<->bUt`C9wzmxM{i>rK3~6hfq!@4Km6PH z=BsUbj<0sU`TE})FJA1t*!lYF#?Dv&w%vHXz5V>(g6&7|NzP}9=Y}BoxAE0zZ8=~e zm-BFang4|!&I0j&+QZ#|CO`N;`1_0xTyP#jE2Myr0~k0T#Hr3Qq#{uiG?UrgoRZBP zCyRK1`Xb~n^()Tz9FL~MXoPV4S0<-1{o1nQZHk zDxn4Cye8E;MS|y(5XEA_;atv>8+oSH33b?tRN@xOWmbZ{qx1}Q|B_{gq|%83OgYTv znAa?rk&gxi2uqwaAps?JN}YrZAP)=^GGPE{n0JrUY>*j@^aSg-K~@{5iPA1nT6IzA z0`}452*g;@>`_f~KITMhM(Sg5l(%M*T=Nl;(rPSIlK6wGD7?O-v^?YlfQkeTSmLLW zpagG=08L2l7_Uyk6F$M>W2(wIFsD_(Qx$N?i8!*CM0WUgkW1{~?&T>S)1X!Wn>m2l z<0f$O_@LXN5NfC=g$DK{>jZz~62}=elvkZmNy*w)@)u{mfykrDY;i~F49MaOO*!DS zR|!@R8OK{GtiVGVqr+9U)n6x1mFV%fiwn$XLuVy8u+L{@cmRm89w@9~k_Qb!j6bY? zV2v`#h1C_cLF_~vbApn|sufdJq>fl9%}SX}D^zsGlU>o-F|#-X_gVU0h)G&TBc&F!gbs6}zdi2&rN#4|Sw=Zjrq3d7x9KR{v$ZM`*ySi7kTNoQNJq3EjSD;FsrWxiZm!}K_;C8i~~{m(Eh944W9h1Dxs-x zWd={Cu=zL&)(t;4j0pf-K%>9rX4%Uf8>KTS^>5OT}HY)bJV|9Q*o{F(?K1v=5 z#5AFlQy&G13lXTr{0iU?o>2dfmt#9SWj`v1SEeXB0(`f%~^hM#^+rYe~=+AaiDx)TK36>v=)ZNfZ|2qHwfgk()kCV^mf3$k41qZ>|U>?utQneFKFP9-FdxW?3 zWPS;2^SoI*jgxBdY99VA24;D+Sj={xJ-fNNsgJo(Wu>klT-ZM3Y@rm7Bgu5EbO*o- zuIy76>JIeb|GRWCgl)Ti_0oL?#qpV=WLSnEEsa=Hpx~h|_m8d9vv&8me{}F4-P1zx zt787!_A$PFk^lCz)oC4^wFY?HWv^cFBxr1J!-4JVN-pd| z5htsd9ZOKG7qeqhSlgY(|o?&(>fcv=tI(R`VP<9Lz|uI{QqryjhmgFqI%jxU!HURVIN{ZtQ{(Kt$r z>ijb2FzqOoC6gHt(U9|*mP_A7>EI=_UUE+F*yvgN&GA9+{1j&Gx7)@AlqnLlWJXGO zgf{_sDV~iZZT&83xmiZx^tSX{n{nF>9G!Q1r>$P0Tx(cqXwzspOlmP~UxSGBHRT%Z ziAM)NpY;x!Kd7{)lXx0WmXm;z*|GT*Ia$Atq8aB7AI&3CRgl&R?+CRoMMx2ducGlR zNUo##2z6M)2sc>t(Ax5PdfIx^KI@(S(mp@ z^^#9_lo?gTJ|9or9}0zS=gBV^guKvjp0!R-PtT7FJO0D7UygeRKNp_+&yQM1g%|!q z_^duF7+CKal$h3Vd-ECywzUg#d9dyn-tkSE_!C9|R@JqVd2=;%Wj&wLbrlK4{ z2h5EXY-!J`ZKaJcstg|jbiMUPK!{Q49)Ym!G6)30^lG0UBM)mGIu^8hZWqMJg|xUe zJr(#gx?N=Y^Fy->J^Hyv5PxWLDYF!M3To3D63w(*eu&S8 zOW0{7aq8e|3CAkCf3{{uI(iE5qWMb2RFzb2a3p<_{tbJV9qCWlmn;Boiowh@l=N@z ziOC-Tt3-QAkj`j12+;=?7+anICoc?B- zd2J|%RF!0S@3wi#hWM1=eFPf{>E2e2`fZZD&&;#w!IN-qjghV~5F#ZMPy(+Kr7;(< zu+_38t3K_&tr*GJJk+OZ0esp#!?^vliZFydf`dk)`P9Zfc8f~=`p)!;?&&}ynaIpL@vExzh(A=8luucPvZf`LMOIfqI?A+=Td8V;M|Y7m zQ1E_Xv7%{G(jP{oR9r;E&qy(Ek3e%yt{E<7fY_{x+bv3EMnoqzEC~xpRY5XL^ZBtO z`zT}5{K@2za>p)Gk_dA-F?j{#)w%@4B(v2M!c$If)4Za2;H^4nphfb;!>Y{_iy||1 zMD3PebpVH;+=@sey7D4fi4k*)k_%=kDmcI0TfFadYha5GnJy9whRkv}fTKuiZGUB+ z@!HFvNoR#Tsy3t@rz|FIJnNbI%w9ge{$R9D1lS0K$XOo`05+NVFkFNm3jue54eDBq z7e7yQUA#idt-qMr}0F3srOq| zUo2kM08nhDnM`KkJWgT!s3@WEzLRJX4_u+o)did!93B?73$P(}PY>Z_)H|xmx9&+s zad2{W{>nS`bx)4YJKk{*o^=ns6Lk0Fr2CV1eD0ncwtw^v&)pLY0Ph`~yC)cC-8(eH z!|o}Zn7wB|!^3a=Zolmm8rzwNr-g<;nDgVKLc<>o245{Sp6BiXgyr1Hq3dc7QtLkp zem6S33`RRGKxp1Rr2_b^B8G-MjU)z!wRMPJG8 z<=maWs<8U1Q;s<_F6^~~N{rmqL)r(C(l5u!Mb2XP4OzTSX&E1tf*VRls?G=v8&+@J zcFXTqfQVODU$yRZb>MH9X!QYo<{F>g=E^gUr|wyC5@0vl)fk_Kb7i&zhfbde^-)=o z-|{*G#nLhnm?a;vRvqwQ-w#)JC%O0wpBugEdJeH8YtL}mLrv-uxIWPUrRQu9>U8;V z68BE08xpx&>m$kB1@aL@XCHUNn{*>m&(wL0b{|0QIrNo&EPWZ=eFTA(P!TM5fPDXF zksH3FR~Y>fnJbyUte`urz2c;gu29Cz2+gS1432hsn&{Y97{iWejw`jow2?GBZP|j>r;Q`sNO%Ji2d0ICHt1KCAEP zRsd}tnIea4MH+kI(iH*OdFEMdX7>TSUdZhS-vR`5F=6@v)UPf)=CLg$50ZJZTp*g9 zQ&*PHk`W~`#i5nF+$8X znYS&+Dd8uF#n`7RjYqb_FBrUPGBm^|6Z8|`gw*EIICSiuGu%RPE4(`y<+hh;rt@JjB0X;V&5PU=VLpH>=FM>^Q_lB@o&f9G*8Lxy60byziBqR zoldI>FLp97&X0Tk)wn!<<=>5Cv#k^VZXBMrdM5|xXD$D7oZes+)F*u7y=tGGo*y66 z4g9y>t2ZsY;r9pEK5iE9be|)lX7%{^4x>P-BZ|WKBu)p>cpOe6bZd2$C^?*r4MDTS zno|^=S=VWFa+TbelVhcRI;RFH&hnXy*Nh04dY$5VPU$G`J*YYgFuqDsawJ`LW>*fc zl2!LiYSpc%Y+4y*oD94L2TLgDwrZu2#c0MFlymuhh1=gh%{!N*W;84UVQ91*vs(z6 zD1D;aufqalD(JG3Y?jKMN}((lyOna8C$a)h(I*V>K|ai9CkM?|rQ(87BmulN<}F_< zvf&YWjWefp>xdS{uA~&!PAylwNM;sG=W8fr={4Z#j`fe6oJbbMkrlk-7*^WGP?l~L zWkf*|j3P49L#SoW&NLPFq%lVo*;jnj_*IoiWN9`8V74!DYE^_GGwt5ZBGnd#_#iVO zWmr`4>Z_5itxUE`eoaT~aUTT7aLR{-QD1n*Rs%S0cl>Iit+}shvE|APoU|_Yj-1Su zG96B)(fvK{9%pcd6_YuSH^^=HyZy{0vx*6WKT);R&vFQ;-f>7dc8S~DA zH)m`VscbzTjaDCpRMiJT9V%0 zr=9k3%R9di3_8I)&pcPTI)WEoZ!oBGrZ-0iXWW}|Blzw+r-PMDL9$49%E6OtG3u~e z4j*L;@({e1@mXan@3a#wR@=3RgCM@J?c8#;`qNRe_9VdPr&XXb7e@dR?I2faejPa3 zLrw-<`ncebAIw&(CsAA@{pMypdmyO1y8&hXpRcqY-De;r)&BzAcO?M1`<*r(d}pX2 z$erMVRmh(ZRtI~UQV>KU)qpACfW|kAwpdUQH z99u8(sfaMyni#=kWdV(A>ezHSOZok>VkOtmsdDnFaDs`wOr@C)StH}e(s9c1)ArP2 zkZN`bGSf`S##KA+4`PYf4CmVG$ni<} zu=iNu&G4hd@<;t_J=xf?uD*q(Pog=6zsHPYob2i1F1Q3-FQQ?U9mgq zGeqq|kVS3ZTqP5CJm|@af%(%b3^tfxjXYjjN4Ss6(-geJ>0hBmBIPU!tbYBMt z$G-$Wz;Pcj-un6Ev~_kCbWel!(MhM>I;;lm<7Vgluzma{cm*|&yS<>(K5F*>Y_CgA z3b1wy>b(XaN3GN5TX=Brs@-Y#eyIkp+r49i`WnC<1Sbcly>|1wb8rf4;Pj+>)`Bh^ z0^sBJ@oV&wYaO+YdoUts8J-5MAK_m~ zbQiYb7&mwLGq?f)Ae@p86L&VQk2^Ca=fj8rAgQBBbmtWJ%5u4C05SstiWlha3gT)s z9Yoxhi^u_poAbpOPF_A#4t9Y+1UiXOurYfuQG8%v^?;-RJm~K*(KFJs5-(*Kvwb9XXICyKEB@5x@1|D49nXKcGqiB4SHb zp1`uf!J~MAP>S>tjdY7anbC^>hL_NN=vWj2Mqs%7C7NAfOm_5wNE7Z`ObEu*bpZ4_ zPGgiSsWvxy8&j7D0gQO4M?A+SW*q5+d;%J9VkX8=Bipkg$m&} zji}Qp6V)`K2_vENi3zW1&@c3J5m6@KDMid22IZ)JSqJ&<24geKt}tzB-PR5(s9x+~30=Gat(nR@_LWbcdj^dnP}5DTtx9ItQrgBsZh0A! z6t@QGlvZf(gm-x2MPGTuI%dMb=rg=Glmb$o)q~fhiQ!EUq2c@!4@@N+ps?#A@R=e4 z;Fz~a(IMtX8v^6(V6FyiLm~rX{R;^T?1cIK=`9@7wqLb-h3BM9G5aJ_T$!RyY&(&5 zs7?dxyjWAG;naE6IcWZXRlf47@ItXlzHT4G8Rx%RhgkY+yEMkozlew}%vEMYs1lCj zzlBQkqrqUt4}<{B%wk>Cb$EPM(8Q!MP&EUqINXj#g~Uo9J<0H-_EJd`8gRv`NMrLW zy7d%Z>}t5lQY}hJ5M#by!R!<%M-awr_p^JtV=W8alzrj7NCbm8z(Q^p?Fq4JCfF}V zjpjO{aOKYaIUgy*C>&18$qn*=GAw>%0m)6pFH*j&URMgbxZN1WnbrNXdc+x#)NB>( zQ3QY9&+EfKrhnY}slYy!Y=}fkA)SyNr6;%i+4<>@?H><1g@#v0r_{)))a@K@7YaKCiN_UD zj9la+qxnreknApjN=2CupiwA1FHkCS%8=aRI=a5); zxzS)gs7s^C;$>7$kUkSbpI<64&W=hYt09{6+J)_H*n?93Zv_W;#L!t*FfwXacOiIb zQATDVapR-v!e1Mv{{B9jo7sJUl~#s_e=aX7Dpc5EGzu}1?2jzNBj0}0^e#KBJLq=* zP3xG#-5s5G^c7%ZdplbQqu<$uFzysIcoV|bCjqrdSGz<>T@D?o$|;BWSTf|mpqper z%n-L7sR_hetK%WTBSCH$U&liZ5c7f#U6f=Xgq3rvg1#+zAE%sH4b=4GNeiRR(Nvb4 zjTwFO2Gmk{hO{!noK!Cy>d^0zQ&Ne2A$#)>*aE~N2NhPPof0*FW8Oa$b z4ezgv4uBdNMi+R98^F>_F)u`ncYSp`yMvsTFs%kHP?J_kMQ$3BUdd0(!RO5_l}&?r z9`Fp4O@pc+v$At)V7k=-pCoZJBgI-%*a&o*(`f)ollfvfjTd)LU`7%Tur&&_uXAYt zcl|r%y?Rsb0HWSBY1ESXSf$En_7O+rj^xMqu*bPHoWAGe#Gqtz$!I}pkC3jFRwc*C zbW}(7CzEHZ=Q-IgoSLwIigbWIs-jsBi>pc|243~$ms+$=V6*yO@(t*$aeb(&GRDm+ z`YV>*<^2yEFK=hWFT3Sy)pDE;jOG!UJTq^tCtQxExT_+POyxAYcx4xmtn`W1VqbEsjfN`h<2UlE>qP@tmgvnHqedhjx zz*H77E0yz%j93>(7C0;Vwj>2rp4&yLQ%X8@&3Fj_$P6p8Nh}tY2lf3RhKqZFd_-gg z6|iqKLeJlP9H{lRW@hal*XzL$2|t`jh_|StXC|M9(-lcmI$1Ry;eHewIEzuhw(`gP z|ILl2cmKDT{PFqUzWVA#BNP9<@#0_ie}BZszW>9?=lj22cp0!+Ui!eBzs1D9`J-PC zx%nem4^2SOyK)x=ox5ZyhfKbln-9fw3`Oy1x}1p2k2V#TbJ!b-DsohjF4>AId{og6 zwuu$V!m)SMXWtb5e%$)W{`saUUyizmE&1AM9m}`Ye{y;z%67ZZDC0P|BYY^K^~fv@ zDjXahO4YOTR|@iZ$Fw2ePP#wIx5M_2@~v&YV)QBXwR@_*{j9&9z3u34>e>16kt%rH z?Wv*YFKTej?s4-#Jw*$0^|jMIQ)P||sQWNRe9<^!5nAlJ2)Afi2Zhg!d*TsnwTzmE zvPwc6)dWXEZuQ_m-cQBw4DaYrK|(jM+`?!aQZl?SC}ZS@3f~c%8(bX@0_6FKuk7f4 zPp(cWPjos%o2w~JS|}4ITJ`cPIJ|tLuIZ>TCFhU$D!de@I%9LG?#S&ZQDBv{Q2y`o ze{V0*FuqL0Lb-k|6@L#73HEW9Eytz_k`i}_68M#0MFYH7Gmoh+!92VX`ij!31jG0hW%r9|bpu}Z0T2#?eyo|9y;5de^E+972 zpIu5mMz3lwX~d{gYAnC|t{hcJe3fEjNh1sZ0bBsbaysKJCTJ%7YxK^RV5Q+PH(XF1 zc~c%&peEL~71Ap3VVS*LdO8wf+W!^xw1Dt;BCQ@Cwwh%pAcHc+cWRNBUAK48A?KHO zd*a0)f`nb4Y63S?mGe#gRSxaMO`GGsGzbDpVF`xA16OecsWe@^GxCFjcP0eQJ>V|x zas*JXV;>un%XBSQ*6Q_RIMU`Ct7l5$U2-<>l-tjd|6q2HXMk6FCsY6Vihgr%=23cI zhaS>=Bh&nj%B;1rBa8XnMLfL^F}a}cnN!Ib9@zx8x)bc`@AqSEr^z^YgPyB?W^qI3 ztm$?2fqjLx<4rJTc@GBhz4&@SZ^$D+kr4?i4?x2Mh?ztzgQGCme4jZu}Hwzn&2eZ5Y>d>0P>r zCSt-FiU>a(j|S6f4g{?BQ#>6eHz~Vo;7!Al!I4P-UCS{@*DOjJ?hhR2)=vACb8wx_ z;oYs|53`evVft||{}^J?dxoMLqI59LWwyX=+smaH6ex58J`-{<%N(4iQ(G#GL6FdfNVZ-7BQO; z6JcGo)A@bc!D}krl8chEH9Qw3@{rx<58J2k-NXd&A$0N}bk;zS3`wYECyIvIvjPsn z*qX9X<0zA1>!kY{W=hRDr#VX_+;8z#^uge|ud$QGz9Go>5nq1sncGj>M00_*hiGLx z9gZ3CglV8u!t>B>4^fU9A>cjP16vc;jV)G>R_A7o{qfCDjhj zD6K8IlSe{OAlL_(*6yh!)U#gikyR3!)uKuXW0zHR-aS$z%*IRHIj}mtmaH_2+{od% z?ho_{jgGE3Ii7*->$Pc2=4s> zEt(PV^*TezJSU(!4ISogi>J$5IJ+&U-81-;j4>@iHE5rFVj?bI@zS&*r{u;-C*X(7d zDPArnIUSUMdeJzIR@BZfFT3<+OqOmQhGPouS7xsJ!K?g{jEf-ahG3r@j&U|-PUcc zjNa+A`mZ|&Z_Yd!TRldnDz$1qCnjczi6#dgA0gBhjLRq}%XTDuTyM=4zOx#zY4w1; z{YDbRveiV1o`od3B)g3UOOlsMDS^$1E~Yo0;*}_$7Q)4HH2U@E;OG9yLGLZycI>HF zPsSJc{qU#m=^>|KgvEh>l2I9}Ri4QYEM2jRLa{f|;)sq(uYvU*gQ#;*#zj)4_NpqW zBVB!B9tj*uokSuDiUNylO2&I=(n#O91MsUnMy3So3(i~fGQ%tV_FJin>~I8I zibS}as+6+Wpxe13^&S~EAtu0~LmQ>vwoBYcz%%zw=8djvu~7w2&n$Ic8oz|YVp-w= zSz!q|CZIj1j27xd;6@edmJnX&0IE<^+$0n6%K!j3)( zIfM;&abvqk#%x=zVl1I~?oh1g^?J1TZ9`pXA^OK}(Y^r1XI-G=lX)^Y7!L9H?92vl z;EIq(_YUN7_Ggj-3x&cX?Z#O3H5`x82+k-aZ6)W&!Ik}!cQB;_$YsaT%b3 zFIrI02BfYuUp=haawSjQ1NaoxgW_rxaWfxG(}Gjf4=gRbpg{;iX<_RW)V13>{*e?D zfdsm?gigALO#lc4Q?EFGqwg zLy_G{6txisw7^NolbcCQU(GhC_mqrfllxw~CZOk|>J3K=k=xyecy*JBt%w0R_H!kl zFVZhk6n3N+g#8~|r)TG{U$=j*_<#rv`zYc5LRMjG zrRZhyy%L<=2Bnu)o6G4YtvUzN( z58p95pAyz;!A{O7Q^e105RUK`am66l_A(zAss~SlovPs4>P1bXJu_0IFShF}%XHyO z=R!;I(bQtgwdd79b2&lI3?xrD`~9k)zXQslu2{S_hatmHivg&`#|yYz!X;g*hzR#M zfi!J-!{5f}*6&yB^}Ebn5AD$d5Dg2>vQDz8~&#jO1ylW!YH4o=rCJA3Bkki_%b?_UmVmjj$h zt1x=(jmK$Fa*t#sbL$>oAQ-ui=Q~VwyY9(^mxIM5Pb9QWD5p&CdgzQ+Y^=NoFJJBl z4ftEDDTa%0qHu5}9l#?TP#-cG<>6uN>{d#V24*-hnn$iJsGYvkm7GDBa~Gneugk%^ z02ck6US-?7#E{Lg@` zClg#l3-|N9T)hA@LSV>vrKPqtPr~Hs&Dzfxsha95QJz;GMLM$$M6`UvjcK)uYOG4V zLNGAnYVDDxQEML+S?upa5nJwZ+85OFdJx%MtMwg|6@j4l4bv3>sAV8*!0wt15Ft_c zL%b|j5X*3aP;^kq92=}-sX2sFXN8V5hJ*{~LkUrhVH4IRL{{yoR7BVejKe53eYK{D zkp^GLEqsKLMT#BA+#ZmVHEbk9qRw$N9|~vUSH5R-mg?xGC2O?Q> zTxw*FtmHJ3UwDT#z~Z`%h0H256oLS(t6sV2o^7fW=e4>4VrwFl`0R&-~y;&iEp!D|Rzth9nR*bRy}_M+655j=Os zgUwdmuCi$hS+G0TQJ<{qF3r(=ZXTJu$e*g?w#g6oE?Np@SFbZ>=P171X?I%i3@Bwp zHW2D8bHh*f5%6bC{M#@@B;%ucoy1B#)PSP&$k`9BvMf0S#z^L$3 zir6Ja$Feh$eG_U|$R3fTJq#jQUtw(t;uUsR;Vh8EjB3vkW!TWVjDC_vGjsh+mG*h{ ztL4bg_5%v#X%Q(Yt<}1uASA4ub=5UbRCOG<79{7%#01xF_DNl>35v#K zS;9&ktn&0J7fRp9Gp(uMllP4EEqH&;)Z}RaxL?SgX}&%1I1++kYuHQ~)cB8*<#eb= zzzqV*1VcEUOY~}`@D_?Lxbzb)Y_7gJXf9K>QMf6Vj1xx1ZsPHnV_m5}qdhbu*Kh`z zElT}jQ+IqFO+^mx|;xXWFJH#EF=f>S`FQ zr(iu67#UMmeFq4rBg}1f_|NFaR%yp_^i4(Gt)f$eOa_eR%O(q`RQhfD+hRpc8@T<- z*Zx?Wup>6oeBGz@-dJ&MJ{f8C!N@oS(xwyqD zrmZ=cTL;ywdO787E!dc|V##HDTH~-tbW)hjU^?hbO`Kh65LsS@1^OAUPz?9u@(~*0 zXSNh5+{-aY;lhZ{K(M0tnV2dqC@LAhD{1wDPu$98MYN`bEDDevX-f`nf7=K0ewbz01owwK2?l?fVq6ooZKm-a`q9rgH zUc16TN*z#F0?OI=W#98`0pzH$ios=18zb7+RB7p7&cWk;UX*_Z*|1(RTbNqUfveYx zA64}QuO4;=GB&IuLuf|e%pOa;^N4S-_)*6aX>TWUuz*FCGt(bd?O7-x5%oXjj^*rE zpH$o4aQs~`?*?FOrA5R%X=OAMoM~2P4#ECf$uUcIu3&TRAxmEQLDh*U+p zVVNLzNigSP<_wf+HWGj75&7pC;izM{f3I$zzcMHAidI6g6P_HcL1x4#CKzw+Zq1dh z$LvUEg;DR|mOH)A24A-*h!E6F5PPDPgl?s|5RSxJ5si9O?3;{~U^zIK8n{upUi|g4%G_FYkHPdQJ z;V(&X=-b1ys=#@=cDmy))%k4B9xS@@9x`1~plg6vp-xYO5oUv*YrkOHJamu2tSubG z9;5h(UoQ$_m`0DBc`d~@ou3f9+Qsu{4t=Gy?D3*b2EcBbZ|V-VNA8%w!MRns-&>F( zSp)o~Sg)YVpB<&h>Q$8;2K6O|cZH$B$k2;feK}0wJ<4*kAnd0CF-zpw9)k3VTp8R* zMPIm<$HEr1w<}Syu@ym?U6*`f`A92*7ZVDW0fkla_Nn@18TeQU?ln*`nNY)9S=TZS z5>MYESqQ13QZrv;YEbGGCnW_|`D|b5pY@V8Lop~6(}sqnXueE>@Crm(&R006@a(m8 zahKt<4;Yk<4aJo=7||+L*}RWY-pdg4=rf-=4lM52{G+&|tST2Vnmul3Ib$xC=1Jnm zaeBNh#SyK1#TqbEN9V5)He02d#p4t9)-{(kZHn9j3ro|{ifPOB`uL<-q>eeq9IjW^ zYjfpnRX7s3b*A(er+ZLz$Y47oIbq~F5!FRXvd#^zY~=OV7R+q3#A)J4K-yOveiRkf zEmCtj+b||iAGRJz?$c7=N~)gCqpVo_5gcFx0~KOnr>#!+;IQArT%tzg&#@wMq?g`t zTVLE}HNz`rg1{+bueuEMSDcG?MN9eOPC(A>rDtkh+!au}MgJt|AM;2ri>paO#@utl zGZx0N)(VMwZ<1chJxwBFPtFlj=`Zx5NX>Fu;`siUw)(kqVQ)FcSiY^B9O;T0cu}o7 z>+_k+8_)Clqnp)BbAlsnmZbo8basFZrLvQ&jwrzNe3rMn2I|SS%A$r$a^isOarT1v z>C=jtaYqvkZ9!-8@S?8DXb3fhd9enyF8e)9T2?#HL9TRZ+7LD0_vmha?=hNO)9`6L z_KY$SO{8|DZhKyLZdY>@VT9LvG*&q?X|p`NI(JD@S$A?%+%AvTS*sIYqN$IVJ*hDb zIBBGVcvRG+_LYBaN9h=2va@vvA){E_%bdyQF4NanaNLqLpdCGvY6b;n2v}aEi#U+fUD`)J3zqzSv|JmQ{4xjM~Y%oF3BHd zA4;Re!o@4@IjuvnA5t{@_83t%+`9+jpr_GgFndo? zLegJxq{wdnUKD#a*uIT%+lMN>GU{`FYkpG!GU*4TUnS#Vq)g`iUKD}3$ll!oN}VCC zN7*Mv$aEevzjL0k-#Go=`mnchxX@>RxU%)|faJ$|m?YP;h@?BndrQvt<@dv~hSZgH zZ-UIptm;1PEJN=})BlYJY<`A4N2*o2gII)Sk?uYz63s_3OK5aY4x>@wk&I|=N#gt4dlow4cj{ixm(4xCuNFJ<6Lp{{A(N2v zinjCj8nsMB(P(Ws=V4kMPy$7+cSHQNq0Mi7R)X*C!;!jJreIH`5x`@qjeEzTLFR_% zLp&M8%>;x(%#S?EF?A-zGs-=ZWlJZC!E0=^%5yza++<{&b;7qN;*Ox%@oL&;m2tEH z;ZM`bYS$E-_B@ABCf>)kU>tWZpuXQllkuvrc=Imm@5W3aBJa!~NWq{gDmNY|9OvG{v6jc|X9HWp?1@)ESIitb+qD^CxZc4dFd zX;*fIhc}$nyydp6wra;sjNKeOI{g?WRFcn-KfO?VDo88maW}(%g()}^hhtb9I z(hHeBOuPq|1MdNj)qQebW-<{}4=$4BLIPYiS`iq-uEyn7Ej zK*=%`<-cN=;Ogv^q^G0(!apHqKcxJlLcJD7Gt@)NR`Da zwwR7V!+LNqP7@jzH=AiQB8#gM=BNfajlH2!S60R3)10a8D&osVik}SZ4G|LS1bLHq zh~DMwd2ElEQd@hoI0eKKUMV{^8gPvxOfQX!xJ$|z{MjWZ%*M`CG7-I7N3GL0t>fk| zZ<@WJ-CATaLq(oW>zvqXMJTiR#85L_H1f;*kfZAf-IC0 zUt-XJk{TK3<(3HRP(UZi4i}On+jKJ<;eCVy!Pd$w{;Ct_rDC~4)0*j89M>4C!b*J^ zY$G~dl&^49qtO`uG*(K(*=}rO)V;>=7Nob-@IdWGomS(@S-k5(S)srlIcl5I;L+`} zVq(vRhM$G=d3eVG5s=VfH%XaHKD~WA#M=?9*U56i+?G^b-0pBmVO3|)EN)CDRyf|0 zlQkNzIn9A3Koh}fRC(R*uuCj`e}UX!EJ-N25!&tKD$Q{6A%cl+!@+`pr5Jhuj`XQ8 z4Amv$a;awdsC|6a{;$@->FL2Qg%>bk5;1TY9`!Hh$xXPt&7@3r$eI%ukE2P--=EA# zQpnc{kPQqHzg1xzPh!uG`{pWK*l`G8OQP1aF&2jt=BBiFC&5HBz~DO$HEj90BvW<0 zE7?MU)e*mm7yfl0x8%pry1-nXQ_DY>`tWj}yB|C=!JLHu43i~=|2ObGBLxS5Tr5dl zL_B3QqYyWX#n`*QeuK%yjUm7yL1AQi7kq)q#i&2P@V*#Uiq!y7S(P@#7L$=jk3@Gs zsG#&lDuDnY3|Xxm^vg5SAwW;|*#O5v%6AS?DJvCe)_x@y|Mp^Xu6x3iyg#xNORj6w z)V?(|fK{SjB_MOuElc>s$#T4iXXDu3XAsM{C`V(!G&QPdjIX(m`e`_dWPM@Ud&T1@ zzB{(PC^Pw0f+sdf=hJ=O$AXlFLj&RlByP4`$jydib%VhrXkpX-#8k>=5^2!=!S$Eb zi^piY+fz&?u}CoMizIKQro=mkI1OKPrwREa>TJ6dtVAW;rGzs`HWNCbff#(2R9#^+ zy#ki_oG2}rY4VnZ^PDpl1y)0=ce zTHjkiLys9`4Vp=y4el%Ov5WX}#f68*^O)jnX@}nJ>az^6Y*rx~s>f*CLaLg8s9|Ju z>*>ZmF>{wZVGm=WTS{7)q;kS2CG%PMw=8p`e5=R=d6h6l^TXGAAYs304x@`jP}}D> z-fC89eZ2EgRb*cixd?dQFj;drQm5u1O(qIiMjqjGTF&8*1l6omtVGy#SY5RQ*Qh7% zK|St4p8Ra?Fq?gp?k@+n)>`6k_#>{@>zhi?yo#)p1m+;>Zkibx-ad9(^I=bhb4B?k z0{RC8Tgaa$OOPQWpC76PzcESYVL8j?9*yKJCS{#6@^QMA5u8kIiPs9!04I2ONdb0v z!mTzmIdoRHp=3xGbj6a7P~$_yk@bu=a|&yVf@bqJUE)Ps$`xzMQx8#@#=WHvMa++< zYN~3AAFSB$?QPQ93pOW>%_W-b5?)D8YJ1Atnm%#*DWZVO1|!F4{Ycr+RyIM}Bp+Wg zK<+Eb2#fI2oaW8U<{#ftE-j^G9AL$BqOz+OSq={E)x#Q0=mvMrqUtrs)5~S$g2@NF zV!3Eq$)H(T!&($9a;=Rao7OcE-;$NTN`{UjJ$$iJ;wz2;H@A+5XG#b|Z-`9Bm z_tn4hKmRcw`~FWRpKk!)uq^@c!40qc;t?ewVL1IOa|fs%0-VdEKDMI^<{5s>)s2#g?|nBw>YtLEmPk>q`>Pa zy7{{d=NI8+R1+x?vr`h>beB|x@`KV&E<>_LryHIqc#k@DlyR?;8_bm$rD=>BDvslI zL0Wc{gNMNANxQ0Hh2tAhJYGcOg!N&lA1dRyfRF1_*yUMyka92_ILveEHZh<<6O@wZ z5AXz0Y9^COGJQ)}FKLbK7|!v#ayeECQCctUI(gP$IM?r}WHKH?AqVqZfReRF))9(pL-_{RB!TlTr#{}DP57!CxeDq)eJG|b zfA$Kf&( zePD@>=j2(W?LpZ>ptM9|{2leQRF$iKbe*B4BzU`s7B`XHddf{0_eyjZL2(6UixfKo zi`Ii9m^{=9!&xMp&to)O#zCPi>0PqKpuUE?@&jpum}9qdxUITJ+7cisT$S*=Q4iiG zHxYrBsP%M%snc&bYE=Tg0&5EGy_LLxmA1>23>YMZE>0{gY9a*bA_B=<_t;w*r@i*; zL7Q$BC><0{U&eFaUK0Yb`R) z-kXdTk;Q^ACJCIx9nj1g?~wTt7|xwRgRNIkRNy=MVT?Y#m>E+y9<$pAm)(^Wpb)j2 zX-IO9aPR}f-JV1wQG*+g5k^2WCH;^9<|PACL35^=+Tj`oeBHit)U>ICpoCM&;TBQs zIi^KoW=K}Bh=WT2dO(H0)Z#!nmJd^V&*T}Vm@g<{(B#tS(FF*mE;yLp*<(Nm;;U@S zA->>2SNX0iWWBe5Fzhl%6ue2q@PICuqubdyB)!zZG60A}}o_NW7pM~M7Xo_ya zcww#$uj4cZ5umPXv(16G{iq&cC|N3xS8=3jT_l(tZw9#GjN@pPLOzrvF{b>e7F>+U zOF>{>CJT<)j}ZzZ#m@FrVZ_e+csis6WH(Xxo-J|B4fZ^lK{sg!r%-=4vWf9zD|4R^B>BrJ?;Xs`C)`j7!pn7N z=AUlt2n;%&Qn?Eb5w6DA;8Y2VH>GRwrp zsVyWK%lGxqP8g!gl{=L}pq6Key zH;4;msT%wvXjH^olynKGY{o6_FB1uot-Sc~Y%)yhgTOM*Jm4(?)e#u(b1P5Kqp&TE@Z)z)`h>R{Gsn2WRajzv-h%j#Ay1cPOG98tUM?im5?^L7jbhaaAdhxdI5OW&Blp zX)s>L09V$-`b-wKmN?$94l8InH=U}PAKoY$aF9x@-!l7yGY_iHg{NiA~7f)(0Ero^>N{JndL* z7ZOF+&7QWL;>*&qBtnLAa4WgAipNz{W-4~oO!TX^ zDF{2HdW}9&sVu5^&3G&Jfht4yfSsAA(h^gY*a9*jiQ$$@xaQWJO+DL2mI?*PD4A z$NlmL&9UF>FhFqHTZSsfmomk<;{&y>JX_3B1HooucsHuTgKEf4fP_RoSlk-W_y9?- zz8dz2fZ%)xmV4f`kR=;0a1*{M8rD22QUS!c75!Pw3C#>DhDnL^g zP-aXyFg^q}hmeUNn^*zK@kInn(d~@+rhOWr_knP}%p&!=NRrVaTr6QL_+Yl2S25GO zUdvp@mIa#avtGY@@U~EHeD~dU1$WJ49$%s|R8R!H!6SBZLn2||*M&V9t2U@Ai?%7+ zFHPA)qv>?qsrmY}b;j-PIF)gK#9OEIimv2->_@k7He0~)o8+MkoVVTX53NH2^n67x z$RCdgCR6*DljcFEL$zN}ZQ0SxnaA7MG7x$PZLa^7Y5fL|q3Dkx9y)n_{-xdOaJRpv zigdp~eUwVp(sB{kKBj8lP&JL;B3COqK_@buJw4#cf1=8zL0sZ9v(T#_5Wt=5&e>_J zN7cWrcw0}pVrK;y&x8^i+qK3H9d>EEB$kR`Pg~8i9;P6QM6s4>m`W5H+m06z`)wYb z9Q67f_^(xQ>vUTG$&~rLB5{kbbN&99?yT?&lahM`c}*L<)h&vaz-Rm7JQ`4JLtaM3 zs@8mSOpq&y`9{YOD&or=N$n!4Q4o-!g(76)iJ0xBRiywxD7abj6$)^d0iG~e*fIWW zED?#Y((iMC5lO(x^uU4#A70QJRIFm_0V*HR#*tJQI4jXKSzcaoB2)@V$Ae(4f^}ve zU`F0(kS@xDxWeayGJdVSG<+y{`O?B-1(*Joao6;?9%T#sl6m5^mT6^6uFDjDclVoeKWZUP2n zvD%8X7^Xyvq&HCe2r(1cYq#a14b=+QBqrm*h{$;RS;OuMlup7cKwI@1bt#Cx{Xmhx ze=FD(#O-yZV$&j5QDb&Z_PSZ>LJ;dWDGeR6Ff0L z?;o(QwHPdV!ZAArCMIQ3rK zEwUmOJq)x_fp&%)!nsB4>nu3@gkf+^Q(ifuqGx9`P3hUio$Irzf_@0FC|$&`YseuP znT$M8+G|v$iJgi<1}t496I&lP0a|rvh0+rT1aMTu9>;l zUwA!<@eX}CHpdXWO(gpUe3N_goDV4c%PK(lW>Y{gkeLfYWtE1pTYS)~r3b4l^DR9& z-JhXGeRNgeZd_n(&F3%+lqNE^0PA7w*m7p%IyqZr^==)4n78(s^AiNL`Fx~+c z(5czI>TD?Dww%{0-Ck%BHPZ{cAaa4&7pi%s#i!e@qAyZO5em{RC2}9i)hU@Gc!2PJ z(1o$;{?e6+viY5jpoOBdV+s7FjQq zi^i0xn3))D`Jr-`t}%xR$}x)9cR4`BM9amxLeQq`!WeFOvu7h?BN%gy9Ro87Z@ z_!C@#a~-i?h1jOOhGdYM?<}Y!0|j9*LA#S*dq@4_cOnXqBP`p8gqJlrYgzdnrFT7! zV>Vg*iU-x>^P}D`C#|!0swWb=kXO`2n960H-##WE3E^1u>sjx#dC+{@f_|9qNAHvh zZ*b+xH-J41fvEBQQ#hY$l;6OQk)*B&McwVFmz0Fs$Jh6XsRWHfXF6iC(L>(jMvoEJH}|BaJH zjy~P>#~JtEU>A(STs1Biz3_-sm$IF@nAXjkyE0JE%Ta_$aLt%H@krJk?R@b_r0`B?lTdmj#)FfQKzP&eZW z*Q~}+Y8$ejV-R|>5KnzIVfrZ>gd!P?qiYy@nT;3ZSY1(zL|sTgN8X~|PEn&#>noLh zPOs=*+gW;LMmy=>E9$Jagg!st3BHB^ApdL=OC3apg}-ab?NK2p`88`;AXHi$5&V!sw7<@ko)AyozR%i1!WERn>y@cgaF=z4GOLed+iGP88 zv>J`WOA!rB1SQm^su)9TD^F=x+?YgO45Gqf!6Dkev|2Pef%B=zv#SK-vcB|z!v%_t zcmS!;H7*7W`}W&v@OAyG`cD0MFspw>x2Hwi{pF@bnef6P@EW723dx%I6QqQoI7`Ux zRIDdb97ca#l0E9L^?Lms8!pCtgl5*`jwHIOayIarZ>`e=mJ`~0jBFkoIZZ~rg^UK zr!>>hrx5O$xZ*e)tn87C)Z#4Xv@KbeUQLcE9Sp{M{@#3LJvqV97r`u-M=h?DhbGy< z*nME;3hc?bcd=;X8=#Q}&`9G26Ul)#zebA_XG+oEgHlJ|3DGUk@5b0;N9dcu-ZH4_ z1Oes(|CF2eb!xaZmp!{BQ=$l?P>Z50sPBZm*kxGV}X#bzf)Rp0*ASvxMMx2bLPq z@oGvq`SBo&cc^AX4xH%7g__DyTb?*{uIOHwX^MXwiM)$NNz#$xy0p#bSkD~-+oc1Q z4cNU$foD4~pz^gdm}?%)%gpkS!QlJLfpwX%bZjh1Ih;}Fy0Fw3{;$y7TOAuYB?L}j`hq`buYInirB(aJx_Z3SHr1oq-+8a z-7Y{-ZnnJuF{|6#uqa0l+OROq-#|&~_m_{SgXZR?)d_7)#yZONL;(j96b9A+V$pLA zDB9m001`#N)kiPHMgDxLY?w<7QnjV;R6o-H*Y*EC3g1Vl?0-xT<9p*jf3v;))xR}f zJpcNe#@9Pv;rqt(ueM+O%m4e2_;18kBp*{di;&qHN#M0JfX&tB(_l)M-gX1@?p!c>FoV9vA;I?PMt5&D`Q_$-M zXXou+@JsjnG-w_F*gowZAGMBqtKvo?z+aN(9HZkc(1xN;T|Ma>^v$2pvU=O zxpjJQ3=jA5o@*RmY@Hs#*GW(tZJi$<9JTgAo<*mwE!~;@Ez>H0$F{b%R0sFBbU)}T zy*>J+`|3Z=2%%>vY{Hht2g8x13kS+j$E|)+fVYkp-9EeBZWVi>elgL z(0v`CsA%T8Rtt{1!Evi~h!ZZBF7IfOjtw2vT&8o~@5XQH`MGDmR zr*BDZgx@bEFjEZTG@SC6xBPDnNp_4oF~}fEdW&~wmp639avP)xUg)H>&-M@Y3xHt^ zNf2&fbn<=|9)z>Fo&;kYCH=)i7JlJ);|aL|;J?es4F95L0smgozvJi@|6r7HOozrY z34WU)ycECAC^#y9Fvv#168D_i}bk2 zfhmHt*$d~GI7F^Da09MyfxH$j$BSJkh_nXfVEykF{!f{jfS-x_(ZzS_2Le=}cTHcn z@bxKlre2A#s+1)DC zpJ}YtuD7LG(|$XHe7pKJ0W)TF1pe?O?^)csS;t zhYG;Od;vT31)Spmh0tf%2D0s%ow4|k)_xjSYb}5YTg-+qn}7PYNTbw31=Q6uP%7zf zPvCqDg^dHz`n`oAJ71k02FK9?|DabY{*|3~L-fFQer}^2wGXt# z*V@mP>HL{^jy;Qp@gg%3AS>~6#P48$^vT=(uC%$e1^fPnJ!yB(06@pc2)hLq6)*}a z3kzFY{*#A{GOznXBv4l(`9#F!w*vnt_|V{CIKPRfEc%E5v|+192hHx;ea+fUkz8c~ zFS1MpoB3BS>O)wc{G^9Z>d|dfLP9sc-QY zj-sUYjR1F}0Jnd3W(-6)3KF`5!0kOi?!dd9dpv-q?#Rk8wNDcDEtZCNl^|k-0{C{M z1%v@h%^)FY(RhO@QWR^kq`pBNDmcIq9Kvy=+Y1g`omQ^}AV}ul4d^cdm&8OI{?uU8gcaBv27E_&1n z=}OP7jWdO2#w@~NEPB{8sAGib!_cld7(IC0d;r{4M?t4PKgt25hPkCqVY}))_R#j_ z+_|f;@q5vyKWRDhL3qz6V>1OjCEi5fnR!<{=>G}J%M1nq8T!g09DmL60en{u{A+t} zI+#Czyl$)JwnUMzD_vjPP6n|8J0>7jjAy0l&0hX>A&!@M3eKOS#GK+GGoR&Up^7^hbj6E(PUySk&5NcChNsT)|OVv?rQz) zL+L|w%DZYAQFN*tucdPogbr z0VgxEqo!uG@S!dmcJ;&Go6c7-2LxnwOWi)~nwyA+qWYSt<@)!hmQ^z6iqqXSRs9PL z6&_(v>2_zAVXy70>5R00FDt}DZ&}Qp)x~e+Ut#|L|NC+6KbS}!yN&hsAKN=$JNdsU z{(s|}Z~kTf@ke~@`2WnyDEj}aCB^E+5N-1)oTQs&05B;40F<2ofPb#f<1HDvja7TA z`(K4}tx+iy3bv01_J^X2d0ylH6(_-ewYz%;z~3-_LiukMika{?j2T#~RbFlf-%Ikp zC7NNCpU|t>)2EeyHsb&415+Hs!%8-Q+0g~zg{-I9hKnEA`Q)tc_)^6wJ5nVLRj4;_NZvaks273(17;ObCAZ>=8}CR$1@MHB>f17!&qE# z$@M`)RFfm+@D7&!X(*5u11B#da$LyRdos%*Y{Sf=S*KWa{{H;m+y9kp`KWEI-~YdA zeDif?|A#OC+W-HEkG=ovg9V8IP52&PF2&_YTZp1z=mUiThHJ|M`iT|DRvl(u+QDrX zL#Tq!lsmzvCqCWRxg22`yMuh~4pQg;F=>a=z|J?o@uG*?_+osA*#YJh*-1HQ;RPwV zHAMBxdX;T3O0~n1q}WX>yMc~Njs91_ywFDDp`()cE5+QM7qL3)=%z_RTxIS0<0JD+MnVFn7t) z@zbC*JIQEqBQexr>Zj~yzDN+F$-UDwmMc{q#8;3w6gO}ynZdxGyvm*x3RuT%2aLd> ze4<9I!q1;Y;e5c+w~GJ%??p;M8cWs!4HeCYEfm%tjr>gH=)XS#Jfi2byL1svTyoyE zT+G5@IOCuRY)Mg}sl*V~3FFdAC!~zjs>aS6?b$$bp@>pA=`qEwX#VNj$3lvr1+en( z|L&M5NxT^j3MXOJ&;hr7)~(_DQ52HbC3WObf^99(ixbK4CWH-EM#>?lEifTezCqtX z4TO9s=fO`v3dv1c)82RLJ%&q^m*f$PVNZpn*?qPq_|=^ahFMnRvewsb40^FqRkzD!Yd2 zj~%w2&@mGl~`pEx;SwSIQa}34C+B9RhBuIuNIUV0LXk$Y3fv zTC%apJY`E864-E2a6BS1`DZS4x65W#_chA)QXkRkQ8?(HdBMatYO&otdsuT$XAKKZJjtv7ZH1oFPvRprvgC_ZrVl3JHp@U zbUr{8-5$3xcOQGyZN~6ZoF5E|BDBQ(lrk2mK+($bw63bW?sO0Ct27!Xp`eKKUpTx!-*F9WsVw!sM8`A^NzQv5Oqe#+uCTv%3BzBMo*C#IrCRlsmM{w?li3*E ziFxegnl35R!aI`@#O8$rIw1HJm2wJ1zewerQ0OA0+jHqLP<)QdvCzmo?sSje6bd`J z&*|Os`x>>V!E2V^(7%4u{OYiK{;JdRTIW~Tw!D76CFw!f-q4xwplspDnPnDIgcLdw zFT@|^Ve9q5c?Wvu4?C~3Qr7Rj%{%+gcV4x7XR@!QMEW$_c{C=^^h$BN$B+u!4tUt= zFo@Bs*6Eo@(qia|4N+z}ii3qFpy@(F8HLwjJXWC>x5Unz(dJ?d1ZB0WT4}#Zeat2C z^^207H^#D#%N&>H`Kp#1Z3>? zn$@oQ?QDV^wK$Ru5Z+$Imnuka4n^TQC|GNb`^`bnkp17pDa)BM0r!DmV&tJ^X;K%p zmKy4a#)1MHMY!c!cvwRut0}}M(iPpkub*n+5N--~&j>ZbnptPKwmDgo8?-0|1(gL> z$9+%|`Trha%il>GC37#ET_IpX2Z<2#j*|2zU*%^>eG)KWv|J zbBak}vlL@Ag3<#M9hW23BQckVQL!>3ncro2tRArSDee`sWoSHBneW{)x_@?=&x#J~ zCOATd3N^}vo<`#FarC=P-YcHnv7L9cAlCdepiLVj{$|HpiZaCKWQ+zoxWZxLRuIww zo5FQWm9|^q7VBTd(Hzw$cX(E|5852(2))7?sBRV>^H#C~EceXg0zU$#X=(omY^~ir zhS~X#?rBi07X#;M`?!1R>_c)E_BMpJK6zJ3AdPMZ<4|JnQxfKK>9bNr1)y6&bgU`C zNNFQUX)1V84-8SV##BXWQnwQG1ml`yD71rPEq?afZ{ub7+ixz_HPt)!@!8u`^`c(? z?KkqFQS~+cf+AMSst{~~s$|!JA~m`XQ~fJ`UkB)W#ULJEt{$wru)O{c$76p`h-e_{Tr}raKqFU7JH@ZK|L729 zddpj**&Chyop!suLXmvrFuu(ASusmBs$5Vc62L2*XLiq?6OQ8a3n^;Hp}2Rf{B&|3FP z2nJO$3Y1dGjS>uYiz70ZKS7y0tt3_3?6c$)vqQ2nrMz;HCQIIm5K@BTNUA$#6{K>a&+!BO$TMu zuE_cJEw$Sf?0^+N)ZJt9mMGzgU*xRHpfw&nyBrMYT3ZEd4W8F`s98MH%_|lN*r1A6 z@o*ST>7o@CiI(n&;I!-dz>(a?ZVIUeZ%8=^|(C63d)fTQTe z5)PKZIVRXzET5_6033nU`LXBn)8RtbkYIOOlyX{^!sm)&zt=|soTo> z=aa_vcJMTipL9UNGI%Gm&3A;HYsr9VbzVb>LLRH(2uj!_7GUFs2|8u1X^qPld$k=0s zr?P$qYBBvj5`-1QOkb<>WtA8TsIV|z_i$x?Rew%Q;}_r(0}cxySM9R>;i{B7gDNTp zgr4=)w!EWNnou?|5^ME)x`NH!Kux!;?K3l~Bar4{gK!N7W@uN6#tUdUEVePj2%b`~ zPV9>#e_$2#rHn)x)_h0BC3OUr8?*!pDG&yp|6vd@3D9i%N=X#}YkNASG{7BGP*ZK2 zLI#aSCri<&GRjwXd^sbB{jPo7YaX2S&Q_1!%rFOKoyHiEh>SUy1VmFViefT3#SGah z*gu<_E)xBll*`Mo!x1^5cGdccI^}8*Ee7?9g*xej;4Mv7BMt3h7apSMG_x75ER1aB zAdE5?x~PgK%drz%yM#FlOO!i;vrh1>E#eDbElL?3jtyM5+H(X-K>+R(mZD4p9SepsE zi!_2cTdJ}v*%P(l9C04T`{)^I2)!4hX}N=D;b;@xpNBX6fbGJa!pX&7HZL6gbs3Ja z?C`dM|LjN|Lhw9-H)VWPp+7s7D$ZK>r1hVUEqWi`Ap!?yVej#r&``>i!z%~%L z{F9p+r(;0FFp(EULLm~dg-x_7OYFO2b0PC2c&4v(sOu>-mX74AU-A6kVY6%Z&kve> zC#IAyoadJLA7QuyO>ZTo^da7nnT?O`59QE0@1dZW1by0#I24O1Jt&Vsq9R)Hd6v}G&WqMYDhaPt_ zxGbmD^l#NE2cjSM(;47!F)EkQ)C695vsIO&o~GwYdCDmS+*w*AY75Uym7qwBad@kr ztEAH+k*VisMobofnD;vkwsCbc6j3806xopG#1J@5LP%X{GYC$2s|qmRj8lbNG_iSq zXC=xd(;E;iF!C_(a2S9}FfN%-!(eff)HrA%E!cU)^38%srz%G`r~n5ZU^lHdu<|Vf z2Quyp2Yx+1X3_vjQad{MSyguIbzo(xBOkOeLVX4%hAc;g^qC~wB+lNxW5HPpu51B)lPAZ0blHY{<-aM z=B|ta8!+U77QR_17IR-7K`)D6)W5kb+O5lqPG-<}GW-1V(UvdC2={>%4P`J9Y9i~n zJR>9;8;w;cvMiwZtW1VZJdjmrvWl!m7H%Hvv6TxZ2W6eLIBR^{S&y~x23Q*pZM5Bw zH3wtsk#!%Q?nTq55>?~HI{a*a93M9s{VqJDTmwbg@z7vhiyFkig#8q4`P9@h4Nw z+76`FB)p9$%ZW;&m8|N!wF{}5z&baodGND84XYYe<+MN~1MnoasX5)-Lfa#XLLQ2d z?u&U-SR59!>x^txt-|h-u!gjW;AHi}lAPeF5u3#R+NN91w51NnK%lVVC#llT3Atig zS=7$c=^BuV5)$VX6Y)l8Bv#8N)rp*V6`7(L)rFeMLP4)NtAh{RkF|xcFimY4Ogph; z=F6MBLIGap&#Gp1&TF$k3I*{2aNp}?An)79831PJ%8kI@0`kT}Cd<}#xpFl4cI|M+ zYsQ1EtQ`;+SU(~SWP>63!_s3Di^+^aFX$-nD8~Y!-m(G-otl&(`hfF>*-BMasbX8r zQVWtz4Oql-G+K|=;C|e$MehCB-3YxtepeYC2e$cXY#D>$O4dPZZ6_?9A~qifVlcfH z1MRP0tU*B^Ua!Rf7g&pc{<#8@dsQoPfsWLxZ@-lPfn`@;56-o32D+$XTWnliqC*3o z+$9-`u{SOSDD96t70R~)1Sp$u? zKynnu?A22(Kw-Au6~;o!9l(-))uv5bImHH1{V zyxl~wzRgh;T}8LydUX+5j*=HoiG}eJFCw}OHpl;Z&{cN-Y+3?rg|0{dAowkPR&S8gKbgw~*Wrgji`jLgx*c=$x5k^|1KGtcX3#s=Bc5?Fx-#&Ww7qs0h8x zS=X6}RiEc+Q2HV)Ju7{2P^y@jCJ@;fwx`$X+N$X#^I>;}KYn_x_R5{=1+NT|jb(LU zc0YqwE|I59bg2M3$)r9Kw~%B8-y}&UUlNnr*4%_Dn;Bp(@lcGtk%!nATc~@hp!D|q zO{@RoLFYB+Z{!n(5nfRDCl^%Kogd$hX%|A(oqA9%VQ+BHL11znD-k4AXHeD5Vex6% zim8{r=`!3a59?@@RaP%l-(3$UJt9QqlA~TIbvOzh8hI3yUtf@6qe~Sd!&;dulm&Dt z%U3iN0X$6-gc9RCl^E(jt&>+>@0!aDUZtl`@QAb+s9g@q#7 zn_=FTM90q6dOZl*3vzu$qoy#B?HySyfZQ|OPdQ-C7V|!NVL5lcRm-)CE=*JnodR5Z zKBrMQC!eP)A|tvDwZYN`mpOo`;TANw9DCwi-~0Yq@35&I68e^w)qjP$+{U-xe!Jc1 zxKU1^cO3b|kRV8bC%sb=)7ee`I-+PsC_9jy6U_%E1Dc6Dg&`+jD$V5kzvw;_}kW>oP4jdW73dxl(&6Bjf$+*X?&1rfH&W z08a-l9|aiGlkP=hS_oAf=#ca%lJMNkPOt2>DFkUS3J1vZV!{Z8p^*mU@`YltoV2sd z%!-6T+Q=?ip!V9wdB`vI`R4AkA4g zx)%=O6&Suk^ZQaR;|=R)82*hfC7hbesj0iZ>UJd~QTk2at^AMoDgEF}g;7yGFEOGYE(J)tWFqj@qR zVOY#5FwPE%$vNP#JGtQOZV*HT1B(mfyeKrflPg|fgPxNL?rOkFnr~ap9|FGjg*KJJ zoRu4ltz_vfyE~vsk{fv^ynAuQNr&@VR;SJTSx6}_pAQp;KI0H}$hy0I@X8hwlWC=n6|?{mGK*bY4m zPz;O6agxBGX+WIvcM|sJ7x4n^GwJ4@4pgX`m@VfsG|P@<;en`3p-ONGAuTU4Us-@G z6W~yY+mJ24(^)tGw9_qrf_GTa93yq$)~i-BC38%p0{3D>p|DVBaG=Dj7nM`!D=v}|<3ZXxJvci#Xu4rs z)NH^}KD-Gg(F9$`KyD7v;365sl+7Mb$ZXtULR!+P88`z-Fd+<>t@t;bM$Q)O3ErlI zun}X4WK`zRo0W<)lJ??tGW6l)hnE@>wwjokcK4ale z@P*X?D*jGpBqS`|I}+|-;cF+FN2mYl{Pk-*0YKm7C`Fexz*;3TDfORZL-B2w`1NEb zCPgT~TgD^ChK=STNM7Z}*TIv(LgbT*`E4BnUF;Gq9dz1njy0K#;%Gc%c2#AzLVYCf z{NV_(l5_NIF2u;bj_V|*0Cox&m zJ=@wSi1*~amfJ2TSj~}@jt!zuR43pW5yU=AO97&n-l;2tAE>Wyx4Ah^{@D^ zf5gX*|7ubfQ2^L3|J1R*uH*RvLve{GG8VZ%3al2~1bE+Z+@WKW69rx+yP!bu=CMwq z!O=E??&)FcH0Ykt%F-S{5)gX4>|?}e?8QkxnN6_fugB*{{q9M#d)PXA7wiXrM=1O` zItseIpxq04L2wY@f{F?Sc+PDG9Oaq8l(*qDss3wJgZSW8lP^)bC;g-Dj}#j#sIDrU zzPi<=JKclB_QQ(5USHfR{lmjb|9nsJrrVW+&e=VKwQErEvme?g4{D@$dj5bmpu%yx zvvK)1t={>`j|ZzOYEGnA-C}BcB^yvkO8mne}08E z{m-eey8k(a*Z1Ea@Nw&>hoSSV)wyqpnZgH$_bp$y@O{hC>c;u2%?lr$cOFo<`+#no zbbs2s@L~JM%?r05RQlDy@dJAOs(bo?!aqNx^x50f&1d}VZRbJc@et~G2yr}wHXcG6 z521_)5ype);vr=5AgXxCJU@hhoU)BI-0tY;Rr~m1rP~iG{llicK0iL%9CesYdt?6m zfU;;ix@p;F_qchm8nlm%W~aMGl<`aVUNzU2P5(m|{g0y+TW2E+w)LMI7wxPVT3*o= z4Fx$vnFpN=w^&)Y zchK(SRnYzRyM77+>gnobl3#rLf#n+;pDJE=PdnZ2ebTQ}{^YcEpR{Sp_cp80bSkVs zXnv1+tA~(313(L%_A2_xX#iQz`Dtd6Hr(|gr7Kj7o$e^RPHx$T(_YvC9zeaT{T zHjfsZ%jf}WKMb32zk-iUpps1PC(7LGKH~(sFP*ya(}j{w=jJk z86a4x=q|^}ML6zA?#Mk|#7UVqPcG3UCD?Zcwzned2qhS)1Z0e+gYW<~pw~bNCLyFt zwG!VHX{$ZDe2~WJ@+OTIJYxagR-tENe({RE^KPPKWi` zUB1&NlQ%5Ral_`z*&-T#R%C?A7++fh!VF;Hm;%D#4Qx{eT@PNVlq>of-l0hrj=wCK z%F*!9zPv7TwA6XT(F{~*j`VIixSA)^_-~v`tg3^_Y21=&0Zu2Hx8RVhYf~Hg-m%d0#D&>>-B>y&r=1kYHJu)7KAYtLl1lPXTucPbWRU_-3w z#&KCIOI|%lR2eIz@Q~$B0PcR2((hAh&poDj}_

E1sk7Kq9IB+^MG!+ZJy&|RA|1XXopgh_fStO=GMy|3J}X7z$yRg6{$ z!nFt7M1wvZdy~j^nU++{neGpWL5lvHCRJuG61WYalKqJcNK6xP7L@f5*_ojW0*8_j z13Xo4G3rCj>6roq9r4`8NeS&jCn~(LluG_hel{{%fHcN8M%4)2YwUylfjv+`-_Boi5qFHLFf+5tdJ_}9Z5+gc#%MWwsOlUN29)4PT!{<4h(u+Jn#tbA74YWe|pan zEmWo9Xt>v z!^T1pBPzvvQ-c$Fa70KpjCDf$2PL;HV4sLCU?t(p4iT0iBoZNpL1?0b>*72Hcc}7< z)~Q|25E@!`%|~JcMecPooV$|BrN)BT48=FJAU7CO@|yCcXx2nF6cQvS=Ny{#7w!=4 zw8nW0cM2P`d;{)kTW!(WHhZ^G!60PUL`tOo=FTyUJG9 zoGuP4i>UfeuS%5)iX~X&Bpl66cSmB)S%u2zWN^oxdMtb@k+Z^q;e%O{#w4JM!8I9s z^9jZbvwXoZ*}UczjA?Wk+A!E7c;p-ft!h;jbj~`zl~NY8VDJ~5{SK|ZT@X3NS#+rC zQDMni1C#6#F4%<{&JgTG`?qMG)HBi=Cpmz@ieG@slX&ZVf)m1Q3BCP4{uX&d*@cplN`ok~p*smNmVCyZQRnCQFDOSly)5Am^ z8FSZw0+qKXi-5_Hp)Kh9;A&o0RbYYcmyDdLiYZxBT&<(q**G4=%p|lRXMiebyo5MY zgB;H&`UVG=kTWhlClI7XOaK+H1Xx2)EmKFv0YHybD>jTVy50LEy9 zd=X8oB_sGR>TSqfmugz}?ETv;g@zFaNpvb@rjy&wU0ZsoJBwIPsKLVuQgQa`6^l?# z)+jy6A(6Lv?az)I37#2=%klY&faW zV5>>FBXST9xpzE8Q;gn;s&ZbQ92Q$ngC-U`4U$*|Fy-d}aFL*Q()7;SJ{M~HE4oa( zK}>reT`-Vk+YI?qF=QBJtSQDwTeaAgwInItY6)waVPY(n^_8Tsa@)&Y?-pkp3DMBT zvi)vP6XAR?nUzPp{)@FD9pkp~94N1-Lap%*-`0xaPfSQqAn9_2WnI+jWQALoTaO%V zW_E{RCO~HksIKU%+_5G9oLN)6AZJxhIV#@Kd8c>U>goORzLi1=-*GXZ)(kUK=-`bc z1z>hDa^^weOr7+$ARRLC78+<&a1muNk;P5D_6LkzpgW(hr%~TaOp;0_fSxDqN92C4ojRlybL#?iE zM^~{b)*9Hlcgdj@g(Spp`z0LNSKPLo#%+<_2HB|>oCwC!wODtZiVg6xMJ-RfFxw(;#%jlRbgTl5 zhXjCX4Hi*lF>R~GWwTEaX4SBi=u7aKzgbl2HxTc+V~pPkhDx=P87fd7uP|%4x>Ja6 z#h~&O(~5Hd$-@CoH`92hI!XATjl^2V+yoIXbY+(cmTI+<-2uDTJKSrKXe5@&?P4C9 zxFJeLK@iR$^e{A6;jyT-xs8Zuas#@otE%I*5X$C%&i>#b3On+K)}D2rwO;ChlGhA zS(7a{)>-_2$Va(^oZh`>_A>q0QZVs<%}Ta)|Ez7$kzJXs*w=S-fgYuLzVN1+f~grD zHuNhQUmJ-+NfT9-uo70QDog2-IAnxMx2`g$pW2xkC|ChWAoDOLu}8#`%*E7lnmxMY zD3hkvaVF%ch? zNEI3&a{=8&*eZ7R9=^sD7`46}s8659?@Y7S*twJvb4(E}yq6UQ$-co|IrRBnt9MXx zCwOo|*)QAr-AXa1;;zx4=$cj!@~ zVy95+P~RP`I3Hq6m}$JY?{ZP3zv6x|$GpxzG7`Xj40skzugg^RsdW*_ueGE~-OYiI zwt6DMt$?RFY&fPQilk^Y?Bzpldx8+2AZ4ne%c({6??O6So2L$;SmNDX8vme#=d8KSIGt!^?R`_i zZ0igkt73KAA)$2>zJ2hGq%$YG-_?!wrPV%?|1>GnYbTM0X$-zm0CYR^^AkU;rUSjf z+ZNvzu?mQ0X(3ribK_pG%96|qv~WoGb1Dc6C-h_6CprVe!B!e=m_TFybNK>ikir zJhTZ!mX>FzMjR%~MFpOW#>@1otbfx98fir+_{lR1&GI--VfM~%) z=C4a1kAIiT_|Beu!N+^Bqprqbrpg7Df7lv6HKr|c1IK0*Y&xBqB`lGiYzyI_gVChT z66Om$5V)uDm~7v4;!d3$n$3Hh`;02K_&$nea$O%z2Up2F8rmlSThsxJ_N7lbx1w|g zB8=*b(acqbE(4NjQ8vvY2%GBrPSF@h9k)Antn>`n5TN|**NfPN)58k>wQ&vdh zJJ=vah$(SuAx@Zrd2>X}bSxf~mVS|pZHv09EuDK88$0gBMlz2tjM?Fwz{v64o-gnQRKTQ8ND=e3Ic_V&4f;ql9gxj z8wZM}M~%vT#+GbCL#AqX(?xhI9hJ={YicP*l)kAY-%*MVJ;L1Q*W68&eK>cp{sGl0 z^x(_-*6HclFULKMoXoO02jUCHlk{>gLj$(ep+^K?j*a~!kv^7vxv!9JT@~Srr_=zT zT3%PxtntN?Ik&o|nDWpZb8-$pqJltTuh;9Yt=tJOUP{-MqOFM~6mZT$x;IjR3H|Vk znJY~;54x8X5c1d_;8&Y(zcbhE7l2nT!Cp8#3I17YHlN7ZNcfP$Q!47F07vDRjaeI0 zaDhg_lZ8H@*@g9`or_Dd*FmwmEZmR0H-J^c%*@!vm;5^B70Wm;*M3%SX;_MF3-B`b zLic7IyySbui(khzaZ&hfDjG>bw^=gN=mwu?ZQRALwc7ZdV-FzBs#^LyET=BI#V|JKfv>||_I93`AU#AEmNZp&k_ zs#ow+B_`zSUk@j&pv~#@N^^KrVgwTa7|(<-(_lGW#AC?{N4uAHKErL!H;u=-S$@mt zB~|O*p3>XTqgh0eGZFqJJECRxQLQo+W*bej8=gap*4m^EFH*+4C~4o2O*)%=s`WqewZ1libFm!YM*mAL4lxHci004V4!e{e;+n`GRZ}#LGxAmZIlgR3X?Y zrbduMji$f4oPg9RW<*R)2nH%+Po9x|m=+LuO;Yx8WtmF76z^hi0 zdl4XJW((#H+nUKaG>7R1Eb^%}JfT7FyqY(fy#Nl=6&uL z72eBVq#L;ZxSt#;MR^062|whc1gh+JWpj##<2ycmlyNy$^dTg|`6mBs>>e^8eaXp_ zY~eTKC_PNDjr-TNy~QQtp=I%-zG5lsu`%9*WnEG)N=TK2OR{jwxX4^ilJC%M z=Ul!^OnF;{`k8|oxy|P`{6&DOV7P1V0U2^QmtY{6y8O6IvZ%1qm z#{P;H_OED*n$OYwP&q{DZIZjcZ)`0TheiWYc&Qn(6*!=5I~hsa+K&cX(_`_gIaP5Z2O`b+!xu=O+We9r39I{vZfdTS=LXbP=KMT7mcD~0LiB3ea>QZsS3CP2bcji4wi`QKQ*<*&e34o6r$iYy)lCcJ z@T~=asR>v#a0r!~`-=P^3OGDtt;LR)S{B+DY+K{Tk+x(j@N*9R>R zKFWi-g&p&+cdh8n^IgLZcqYab(s9>riHM2aa~2zP7ojJ(;LBzdzR;n}^Xr*Ug20oB z_#3U>V4WMPCGf0szJzmpExOFMiC`s%qbLWAD2%dU+ovCd#$y-qUT93?cwV;FHnfh# zc3r{~vh~jL+36X_uo1SKd$sf9?s4zs*6!ZB!yV1?XyS8peDKy1Dl-+YwwaNGm~tox ztLE1FXx~TnK%}*t9iZ@KtICJ?1u0emMw<&+E6Tv`%&8qt&q~cP;I!a@zMc(&O!a=& z>x3BTRwTMWL7RC&pui*=BDIjLx)PK_oQ$*7u$QR480Cd<$D%3ajCgqxGOyp#j2*q( z-rhMnGTe$kfgk_Cr2M>pqX7Rg8_dR&m9x)U$9(+9)wQo4eG}q8ezW>V{FmS5&%=M@ z$tMg*)EQ0yGX4Mnf@DsJH;1k>E^%m%o557)OEu zDo7+3OoUxPc6G!lqrC0ji>>3Wg~gw)*8cL-)n6X{H2o zfA-(+zk9P_7@ZR0Z@0}lUHPgbGU`r-me=F>=X|<6P7PbH(5is*iXbda7k_2x3Hn1q z5ZJhXrXyj!G2H!eyXY*m3v=)-x8#C^t;|gB>jBHa;f))uOh~I4e z_296xwD$Fbns2-N=36Hih?fV4Z??=>fT;^Y;<0mDJ{+d~lq4F6pw0$#xNM+@xKuVs z%_vK&52-L*&&zlF+tJ>(IUQ!x1Wn7{^(c`NvX=m8=I^@)OVQu8ulkZ$rQ-ZUmP&nf zwIQno_0-iurN1@jbZ!J=Qn391`i^OIIY)bj;ni>rid}+XN1` z%H3CL?{uD+e2_H)Gr{F7YCZhlgSWkhKYcOSh>C~!^Zrlw_j>Rvf>+&@rH5Vm`O`!5 z8-7k&kqhDmaXYQi`F+X?5z4yqfC0$7r>bw!i=S#;uN> z|8ZsMVpW3g)Ni$Q)FRs3Q47*robES74e=h#%5!bq+H(UYAwcX4iop>)t_II*_L<{X z=x2xq;mWUj;kO_xff=90oi7{~xB24_JkH7!l{{{RXK$`&|{_hz7 z_0iXBU+eg>1m>LJX;_^3{yBE#L6*roKb-f-HtWu^RfQ{qxBmzB80Kx=_mz25)Y6!puXyw9aCU)xd zVscLAq2*HA5d(}H5@sE3{8FjNUrs{Pj^1uIdQsr>0;u{PSu zNzc@_j)WvYVHCVzYLx`FUz(^83GcFka9J}Ao|Gl0HpEHv038pCNd_CrwM;Iy&eI9H zbc4nY!^;=$`faHY7zRUo3IP6~lFc-H)JR3phT#5{vpz6cA){P@r$syh1!;RG4M#Vm zrJ`fO6j6t1=?M=o1*?HeQ-vr&+D@>qDez})sow(mTaH?*tvYSp6R-`MO(w~-CNpH) zG97pjt*tu4DysF_CgBEq4fJ3|SPLs1feA8$L;%nasO?lJkIzT35}Pwdx1P~*8mDOP zr>E4c92hONm^$sYnNb*|_Ua5^s5@pvGS8s1g06t{r_7n0)X^ZmGf#`m5R2UG7P?%t z*XGvT#A)R#7w!V0t}xX1-@SRhb7(C%84@IB!WMc5SkpD3VAqME(cG(4VRlsgt32e* z@La7uS!?X&?L9wQBZ#vqTyBy*0VI}D#QRa~=m=eD>`L|F(TiCh&|`+Pk-pCW7-O0X z+a>l0V`Rwit0T#AcCAOKeKITAB4iA4a!wM$jhVz#fV#IHPtFTXjnf?N!`ZtE4a*#Q z4%pVC9?b%OC<-p=9cntaTwRW@J9}FGXxC2H1K)ROLO37=7)f}?4D78NrV}fH>v*UK zYlj05n+Fb7@UMA(^flh4FXD4PL+kh{_(d%$15Hc!VHcx`Akq5!8Lor^+y(>JK;J4L zYjP2sw*cmT#NMI#a149aj#!wk5qSk^1F=30%*iOZNJbt$DOlX7+0^HIjSRqRm9;-K^@a8=K;Wv4Mov28GwbdH`)35�xwQ0=$O|B+rcLS+P?Su|a zM(zdad2uhB5k&+{HxjrSd$Vkmo+qR0_U(qy0{eo)yXQ(W^5K2Os!3v%DN`YTLi~-g zuHOZVr0Pf+4*oR0Bsl8ZFUrbm*Mh*>Y(xOTSOJgCdgpeH0-x$zu7$N*%rj1_Khs1% zpivE%x{I_T!8wcr!{}}*3dY@J*yXib_7DuG<_`J|Yr1|0>edBS*03UKT2}l!TIRog zRMX%`y1_+bgF`2Ew4mcbBn^o2 zMs9hAlbd$58V$vFJvg4u`3JkBzFUz7(S2f+pTv;JL(xe3FHRn=t*$@r%t6oadI5v# zcLLVQeExLR>lkhV-R&+GQQIrnJ7K@n0jWRV)NWoMPij8!Lh-wGr#=~m?E=x=gO1hr zN>W$4rmCoDu!BUR!A2&$C`sW9P3I zD?QC;9NINU>}`Z;V6Hxm^|dOB(#aeL`#VJK36n~=S_=Uyyry)YitGUnKdJL(SRNT^s`0LSKB=UlAIibJF4?qcU(uzUeI ziMzo(7DTg{qhAsIFqlIJ$uhOIz%5QLEfl=k$NH(QRAARot4KyeL@KI=^F%F=*}CUE zN{`SH(ayedczGnS1!!X&mh>^4NiOre>M7*`NrUC`ZM0_OlXcxk>5T2-iiIU_*&emJe9cNCHef+h z6g>zL=zYQaRFGF7AR(z@yr_6~ccgdS9<|HawonLq$x?!wG0y|5ejzt{b*x|`S}j!Zrl5CMP$Ea~LYU)B)Dh_;>ZrxH?dGLni ze^WkPLz^vcw#!P?f*~VVg<(EJ(|%GM#M)$|jb1hozH~P2Cy^U`0-99RfYHWTvvjy~ zv~&3V&WoeHgX4v-Jh&=|yPI=xbu*;g4jI%Zq|2h0vw{#hsDpq_LfEMYoewBev*EBy zp=$|+8dYLizwTu=n;L>}895_{*zzSJh(YY{LSa(zK!UGzWp+fLRtrkyW9(w*dfcXf zsFQoa%(Q_oSC>%iQOsm}Hc*#zj&*dWoJB8M*N{b7Qk04s7rp>cImdv>sUCR>g2oH* zsPQLxo0A2=a&S*I-+(Kk?usEx#T3Mn=inZONlSoI zDDLC9=v6C6J;V!hYrjaUkbiQEwH?Yrzr-y(|BC1gIxu!o+fNUItq;J(v56c>f8vJ z0BI9)`f(JlpigPw;wFJ&DO|7yIT^eak9QCD6*J+4<(f6ga&ygE3;+P2ekj8yM|5&G z56f+i)K3R|B9JGw2MG3}N$?)51w!{=T@%Uy+*k8YW~1_KgcyipbP&eV5N#d7{sF3X=~CCmpm&((0E3Zo^wXjb+KfuQT-iQ%&wc+E+2+fo3LS`L$@Fn-+7J$H-2 zo#8Ef*P16x6bbN)cZOl~6_z#jJ4>U$1ea2^{?rPMT(m9J@>;F#uA&dRQB9(O7{S)q zNWv+aZa$E(n=YzS^b9N}@w1}cTKBpJ=3psl+4umgF$a@K$A+Sy#yoY3N48McXr8{h z2*F!8hTIiBtVGWtT$$zW5V@7jC1Knk;zZPfozxPsbC3%*CzOD^vI1^m!$Z{QkXbs{ zifax;gEE&+Bp1o_nqa9?4aPk-?WYpZ;Ho7$vo>00*|!i7{VML4BMO7zjMmMr85acB ziRiD0j#dTUR?WM$ewN~$DUxI<$==1&unVvh?*ZRzWo6~VvkkL%yX2rFbYcR> z4DP*kGy?IqFu41m#kk3_&I8U{^O7P-Nf7KB99Fvmu5P&m8jpr5*SlWfdKJhd4PLz( z_NH|-UuRn_lV*eEAK8i&yB8tiMRn}O z1wxX@v;E9!n6AI7<+Gs`_LKR|udloTy>cT8rvsb`pd?M?6d}v4{jE1UZ0kjZ2>j8a zeoGQDK7*V3J%AB$ab9w4gr(DJ`#=LzEKC_SO5JA@7%DRXS0O!S4#cisL3 z={U zUeAC0$=}HL|EIgw&+7eulmGuWUw!k{;}HMv@i&kD@c;ik{Xdu?sC|59nt(D!pbC`mc}`s}XOydBDhr;mp#3~s&XQ9K%FL<*Q|vW)E(0Ij zH`&qwI+YXj{CPr9$QbwzO2-ffP+$aB4o2VwuM52I;7dDd17qrqz?H!;TCJ=F!uVMv zVSdLTyqgCIRzKo<=uvL^B;jM$um>5o%+xe=K8*@PNV0&Ag@x0LNSSDvQh7%x8Qx3U`~JI&vEG?)wtn1t zzI%KWu2tC>cD-WCqusyn7*U3HU5t0**3H@E@Ggg?WWv=%Pe}@035tqnDFUzOo=M;b zv9z^td&coqI-ZSdHW%%`-O{Es5|&8`g~;|<|6kiZ33ut0N9%i>!~kP}p(Oyyv*6vc4(jWh2GtSCTa4-J<}tOMXc|}yQ+3nWzHT1d*EF{KaG7O$_=D_u8*vZ&L$*dK zZSF3<1EO*Qj^~s7l5~^ns9}ZMrGkl1fz+_|rQa;bZ8EL5%Wl?LSZJSSVDD`DIU47K zb{nuJpf~ik1Gm=PIMDQx4j-hP0*w+ z1+dPft*A5-nuBe0O@!t}UqTEU*Fqyk{Bw=k>18*R#AGr5HJwy_hM+Xl&hj&28*~Oy z*_03~Tj!XBMNcq<%G9N#rbhUFeFj8g;ygmLKg{;P9fhQs?4_wCfu8qejzAk!FlXARmuRv;#c z07UT#c+f&x)3B}QN5|jo{B8RHVo~iMVS4BNIgO1kUwNrbOHAAo)JezRc?d~5#uv`DKRV`6_ip^58qYoAGD(x)wl*o2o zhlV2o^P^>4?}B7N?Clwc_n`S8KA8g<8V>YlBhVm{Xhc{f!)bCgX=mN&KEUyai7z0O zNI&4l3+c8+g+O2)K!iYSle7;k>+GZ)C1sjWBX)r#8)kZ$;x{7WHBHz79GldY@}ohX zASZ|yNEmL=P$Qaroq=OnK*zh-7RmVN(m_s*yV!KHQJ@J67#3#ksPelF8Ii*?!68n( zuSEN}@i`_lHczuZEjdLXLb>VkB`M)m=*3pr+VHafYt};N5-?W77t6C&M~X3RHOqWV zA%t;$sHsHo%_9DSsN|qM>cQ&6QSNxUWcOY>-bI+RI945A zZZKvRDxF*8102x0cHy!hUzXZywv^}0OxQBdns@2uLKUV^R9a-_Y{@WysB4j#-AFzk9XQ`+jS$<6q3$cu~rD0DQ3G5nYjT)p{nQS)^%03cJZYW~pC+BMtQ=CHmHs z_ayq)tRpwWg5Yb7L&>Th#U=_b;$e&_=_?b{`KV386fsqh)5guR0v4|PPL-NM6;i?R z_f?|m9bQZ3++tT>b|@|36fEP@Hhif#mwvzh&a4RKTpC{7r=-Y)%zYj3YSF4gh_WjcR^JsIWMDb`ptbq2AVpHz!-yqopubD03@d48U?N}j#lSFexX9qk-KNCwwG zvW5je*2xWB6Asb(t5$|?`=vks+b^w61uTKvmOq^Df%t0s0A=rJ2^_Fb`?oDNSH+SQ z$f#GO8AfNVZa*+Z%nsN9sr)Tb-qTH9f&Pbk{vdDFvJL(-pbZnpb1M+RKa8rjoxIL#+PEb z%?ya=k7gL$m#_!vgo_jh$#>W&?VNzvNd(&nF9SAjAr4s#!3~Qf%|nR`OBG3$LTn63 zv~DH;D9)y4v(SN`8b;?j;_0((hdPL?njD4;o0b-93OYf+c>_@iinSIjQP!=&)qd0( zm{UDJZ-F43p)N7*_d%5i?^)&O4{PcI*1J(yiM9;qtny3=g)*MjH=#=+B=!ge?twWu zOs7_&_5oP@NU%u+L?M+cik8G0C9bBG4k&{YtFFWkKx(|fh(~5VY&pbn$$`kdnm&tno~F#G-+J*h%7i8EiCJ)CGR8rLFK(QRWQF+TX>vLn#Zv(5 zBTv9CVgH*%Gmm}Gz^KZsnaL!{@UV_a7Q)F4+F|-NRzaL;lFWD|qhVL{EmJi5LYNR6 z=iF@+J9~$zJbdzxw&Tp!%;6+YX4s))Qs@obgkSi?Yulu*yh?F~b?^%rdW8&c zD5PJWv=#f-sdo3Mm;7TS%$VvhZ1!^M7bz@%MYT1%AAl?=|l@#){@TX08yS?XJ+Vi&sG~UUCN5I+F(yHR7wNI z%G^cJ!h)5tdR4e&$0%0@CSf$>8ON3(RfK7rQwAdy^0XizM=SjB=${ZD8h$)`W?A#f zhxMipkDEUH*?a(fL;Ia*f1v!wo#u3fjM-BCdfkOSl`vun-dKz`tgz+xR!iHW$azjBCD|8LkGax#3; zxP42vc|B`Ge-9)jrYUo(%CE$Y@n*1P+vLV#vWKrKJJSR8##gbUK4?GL10|~8kFF~K zNDt58BD)4JqBA99_ZsrJk8FWqh}idvBG(e{q80hb_K_-_ncP&{DRe=+aT;PR4owAG zpjffC8m85wIAitd2~4n+G*abY;5gc<1FP^yraR)I+n%HUsWMH>PMP_s%9J7_Bk=pi zhUoo#P`ehg+Q2UxrjNV`Se8Lk28}2!{b-X!+m(g{!K+X4aI}6uG1xpf2ObX;8ny3N zAl4(!jKkuE>fi%lCKzn9s6-V*@il_s*_D1wd8HN4h$60Xav61N;XS z=|)bN<`Xd0ASTdk?GfG9h@wxO!We-75A1HV>S7q^3HP=gW~ItCl6Z8k9Vq0o)9u1ZVhAc4*3%SNI2e=wL3AWxc(rjV3|She znQ)#iZXfC$XjfyypFhpc)!ciZik`kK$*-Fk67cH4kWG;8iBy@9u{ZRq9aRW* zFU^!0oD_#~8_Y|)L{Y1T8gTFoLpKx}&OA$sU^LBS07AX_PwX=)mN%~Af9VBzRG#l* z-)q)Z%xrD#dF`)4(9+84M`W^YRIFd%(&_Rtk)>$H(VBEvk(dq^3?@ST&=GdZ=`}B5 zMJLs1Vi=cXJSnf+_u-_6B=6G?_Hv5uqcK5bhIe|cgnYwv@FI7ur2*Y=De{w_*U`Ki zTKfQf^mRRf?l^#=<4`Hfo6;}4aMBL5n{2${b=i`q+J54>XxCW^79Y3htUKUUR%yM` zKkw4o!?8Kh6*? z#^q-jLZ9H+!;qKSYNpfq3}`bJAO^%*X!&nInXzR(bpEDJj0Ciou?QRz@YQD^l)T?E zgruND8rfci<)!3{5xaUq60?$9BJV0EPf^OJN@M5Sj?rm=L0M3px&FVYsdbXYEm(k% z*J^Uhyfp2$rIW>}vewm=U|Hx$tqO1r!}OxXMxEnnF8UBR7S@g;95>Kk9;0Cx`;Mcc zqrA+^9Gr+(ThbPS%E~7Z03NfAA3OqoN6A~xHoz0VJo?CL0I0f%+TJG|{106}{gN5K z;6mT~PF2%(G6QbpIx%o2(=^ppc4PGky9@W>hSY9HPagrLR}0AImjHe=I2|Fq_6m_! z+L9_OJIs!NA7=Ck5ee4-+!_pF{sYTv*af)Uobtv-ty=B!0AlDQVZ+?)qu0Bc0rQ(* zJ|vh*5-1)#u=$rZqjgc<#waP!R&xA^E9Bw25b2<)cG%d;Mv-hcM0&=(acY;)`z*ig zD4_+WhrNd3Uc%Nen;?tB1+?_esUEEgO;z+MZQCF-il88n=Z6q@C4xn3#?Dm#bW=Xz z(SW0AMkiKcJ%6uwOCp6z1yy9%5r}Y)z*yICEr5Ehm{<{AVKUA=C_T%vHj6KIDsWy+ zdk%X2#Ee;fx^ASP4-kQiw0uZZ3o@1U88i?0piv0g#u9`IHc;~?M(_bF2urWUil~Mz z+NnjaHvev}7=b$o5LkCn6VPU|;Y;aCt5M)F$!7(fv(?+~rpZFa^t4LSO7oHl+UT^7 zXc1EKs>EIzkFDzoA9B?^9HY+75gZXD*a=n}v>ivSrbgj^eNB^i6C(!$(j)Ws04AYA>^rU)*eqHeF|Q>8-tw{xvJ)ci zGh6K)cfN>{bvpj!;617}B2;rC<1NI$Z7(K41_9b3=dTQqp2LrF#F!Fjf}HZ0lh?)< z6-p~yw3E7=7S3^>c(G4D8^0vz(l$*5>5xp-$#}+e6e)r^Uw%oZxitpXcEC_0-54Rbg-5ViH~pxVQf7Y=Jt+O(v)&e~t@f(jh7F(|(6x0Who zB&*e762eWmR!<|qA-ukbzh+3G$TwJ7tfum z6VTN8S_4+Ly9q!&fngj-?WW%OWI@y4U?#CO;9L}TP))3Diqb5>aW1zOq(j5R3Nedz zfBP`$5J-*B8(R|{j|#MMxN!#_$_drs9-1axUj6ogi@rc_Vb;>m8~lUk)KcEObXP4u z(bni&ECQ2ki~nr%Z0(`5RP)uGUbJ~&u* z(V`7hNf4yS>8ve)6$vfA@NRhpF>p{^{8h_KTb+PL~vFm=Zev#|8Nc~C`=ZgBM3^vHgQg(tpI1RmFyEjyEFyI;ZIrU@O zkL@A3GWpX4(^FMpbx5j@(~)=^_4&kxn?*cqRW1+gjs|( zttlY&k})3H$EBs`8I^)qI!XDg_eh3xsyLgb**TmkR&KMMf}o3Z>ey5rCMq;|WVlzH z;bjzt!v*mIyTWy94_WH6X()Hc)66NiYSFTzbMc0cK?PG=*tzp(q+}Nt92c(Mjw=mY zI64r}t6Cas_;S}mxOPT#ebj_WhWZhUv+Ir%aZOKIWF=x7OaY#pI{Uk$OZ;O(0EkwuB=!?fq>Sdl{~agMK7^^c9(L~WSP%( zy^i<-FC+ueMGSCYPQ9W9*3@fvs``FQ0oD^=`H)OAIVaP`Td9wg;d2#J7mE@^_5N%M zkP@FVa3u9Aa7qFM>^Od!cr&DBIDj-)_*vGU@U2Ys+#-@Lb#24DZr_PFzN{^E_v;FF zalY-+gIL5aY`G(gom@fLwQLnXqXfEIvj_R|$;WR+Dk{+`Xft8U3?(L0uiBwP z&DQybB9{%6l5Wgzm?$`_5f)Uh;Wlqy`2buN6(^(4%N8kw#h!9g=sI4zLAAsX;2ZHAg;unVF~ zLU+;kG&%?E+xq{eRXJ$hm2GH*mYg@49Nh9YC>WXWHcDS9&d&*Sv`~KhQw*qVGon$OX*5$ZU|@tI<;Y@E`G|hyhxmn zk$2nb=XUoJ3gLV7m1|pdMu-K&#fUV+RDp91NRF|%dcj8GePjo3Il_`ZI`h(xzy0R_9&a2r z;<>DYFZ4Yc&G&6cnV&NUU$blTF# zs+|Zk8x@NuKZg{et^r8OKTS|(p5#Sn{~VgCFw4gZcCFodCdxd=7OKz7%i6FN_32>s zr&4q(X0D~L7^v9gI5nwrKSMjMn2s?E+pHG22w^d98?tbNiv?xhwm~v^H!u^1D_6o8 zbDm}tO8_cEc^+-!gNWG{Ka6zjR?4ju1pZ`s`6Nm`OMAoz4hlgN`-qICsE_QO2#D3L zTUAW74QH1N7e2RaS*L3YMblNUdWU?b)raj>wcwApT*zzOmc@lF(lRC%k|yl zAC{5F+YT74Az_UZ`VFM7wfDPkMxYzHu+{|S18*e=AW43Bt?$b6uQ2Pv9r+*^!+Dmc z!AS1M48i(Qot!WoG?m(0iGxz)5eJKhrowGKJ6U5R$CJ6H{8a_OG~qiUvx zX%E!Vpk+8S+voxVj*Y;gyG47fg?$2hqA3a=$8Sje?eYf7Y20iyGv11^q!8-Q!Upj4 zsWqgmYxMa*NoY)ic@%&Fn9cD->H9hL7n|_f8My=miUVF$h}yT_Frj&N9nr+T(LBh4 zu=)5j<90mY>mhpVNV}{Runqg@d~T(~4>tY0{(X}asI0Juh6j_h%;1sJiD@iBGa=A^ z%hiRe6Nn-oe3R?BJza^+{xIh<7*nHvJdki@as}g0t%E+YnUU=leHnI;>6JE{4Y~}F z72JU76c{;nqgF%WN_8f8W@Wd=grVdvx!jrxFWg{fZ-jJ<_gB;DRRQJnmIoYUn87nM zYFHLEV^bX&H83zT4_v=HdYEuhQGTyfgS}GQ$rZh+qMPgC^p=m^N=!P3KCe`GH&^3{ zqol}o^Yz&YNB09uX~R~d`SQ?|QVU7&T+CTH-&NzTMg%XFe ziS8KUXxK&Sn-cg#3M+1O?QTBxC4<)Q`_9Kek2N$$vkx*EiWg|1$nXvofgG?Gs1zVo z2zCK?jTS>OrVt&leSNOHMX<1pLm_Z#VEEwdE74vTMT<6KmeB3LZAyQNiXujvFoY3J zEoxmWy?zk@lh1r%<4zN@T&zd4vtAZ~Qx?2tj~eHys6DL6Gs}LfxMn$Z7>vd;YcMQ# z@js5X$`6Qqc>@`G43>Cp`zW-z30XfG9()WU7 zTRr>Db8(a-!VABw{3P%B*Y8CQDe};Dnl}n2GpY1$v6xwQtN0Vd7+f_J)x27MR+bXK zjG?|htJ5k@At4R%3<~g2TVX*k!T&$w$=WbEH_ZzVNZpw0l@m_3o;}5dkeh{rAtEeN z@nhDQeqvCPvq4lMm>hFZvvR$qWkNhRLQJz-!QeptCs^Xm3wo}<^_}qc1gCD!AZk3h zI^-6_>kIM=5Z}Cu-YW3nceO*$vMdT*7r3FN=UV`6)Yx6pRURV z;?VE$tgznH!p^?vVVq$Y{Q3 zmcmX~5EcLl4?P3Lu_zA=Gvy$l+Qf@sxGXeHwXze$RN_h~s={-)uuGm0b3{gtgzY3G z`Z}MvGZam~z&;y^VjR8NM(-|SX7PSk*@HnNL@o{#RTK;hI(!FRmB%JD{Q0>k)OwAI z3vJS^zb_B9xUe#e0KVP$+f+JSV zt{y^~3q2-Y3#|uFT_Y==JvTOSqS_a*Y5v?#EIsvY50&cgT%QNk1p?pQ`uKRuHBv9C z9g`@->Z=ntk>lxg1%x1Q+I-0Z8Hyw5j0fm$(K#@=1bO&#OU%nb-z_$n)`G3|GjQUN z1{Kisc_sS6$m=obLbyeY^@P6fZ2Cr2-wK5&n~~|3h)|aV);9ok|4Eubhxm{bw@|!S zyUf`gi2xk^A;89no-14mE+DhV@b3?2srXiZ|6&2)*BQtYI0m_U5Q zFn(J3Yh*BpY zQ$I`G?DGB3A8@d%ex9EH6wGf%9wEUF2qZsLXD8`&;Bm-`XW_BAOdy1?TD~+=cI_yh z2ne32ale?;AyKkU5UOKymMx13^N6DJXUj`%CovKO`B1$PT(4VwuOIyu|mwZ z^Sq1csQdHE;9b@@aQ>Lpc?sS)O!rBRGDaoJ-G=DKQ&1rjZbdEmB&b4;9GTTmhTjrU z2N#o~40!gvPamv(aEBN=X{|zE%J=#`l3wr(fH*f)MT=6o7rJl)>H@@5GN8j4)fTY} zPZFT05Q+^zQ2GfPWfPV=+0SD9$u;E)HV_b4ill+xSBa0r&WZvua0Rw@%N?&Mh>a&8 zV=YmhSw)&TkYaUxR}=M&TFV+hMH$R@?D<*;PS95Qp7f7|K?!REjnB;?D%g=~b~%!H zN-^5DfZ_mNK%u{|Hy2W?cCvE1(q(uXQ}Un651Uy!YIVY!f9lWjT8qzI%gvY;L1<;V zW26j>a^f5% zu1Y-S?9i^)3@vKd(Jnv&GCBKZ&$Sj8GRLXrI?MXKhSRhXZJow|32YH{toH)R&O9~b zbm3x^{9~4u=uY*ISpuQHScJtYAJ~cE1tDBw%iS0>Ob*R6^O#_vVuK>og#{CHj{0?{ znIVr21shDh0^pU?v7@T%#K|D?(9vOXP>DunyA|f}*k1yp%lNt=o;{<@0LuX@$Nh>` zJnG=K#j0_%)56BLbBOBAcxG4#Z*k7`bwg+}7&*!w1s>k!FT_9s?!f$U)KKJv zzpXgu8Ttbi;S4^!=kXW9K4hV>SLlTAlVfXmgC7`gq-yj}pZUn8v)s^O%QQY*x{>tC zR468x>on{wR9fR|AhoW4@O=eawmHGnZs2N9%V5EO>tBBaK%{&D^#$XL+Oj+P(%gd# zl@#vU0xx7eR5Eur9^6*?H+hxIa#1b%byTj(aiB#T43?+fLVds5r4l~43VhB`5^p*t zvF%I_CA(GklkrP%%-B#&b8aVZHT1T`XVt4Xl!Y25!cDuVUCBhsBREZ2$6#30qxFhyiae!HqWCuUOQ;a?9r>l9Mp1_ssPeE)GVF5Y#zHp z!%bAXbZ=UCYPemyl&GOyoj2-EPS2qSPJFe7L%xGz=cUN%-nhhdFfCyLs@wPeeP66p z>;l;L&7t}*_e!TK)@WoESSvHzYd2Qs@&q7;V#h~VS4%zE8(ITkH5*|XFuL;8Kwh|> zo~#MC0?=9+aL6U58mMkw>^y(>3gdW!2$!Si10j+{V_#TSy#%QCQF=1vZFr9zxuO5s z9Pie_wi+Y$oJ+tS1~jjW{~g4CH#0N&+~MDEi2uH}_IT|Z761J!i2wfR(fS|p-+zxk z9sivspTfTva7Spi1vsvN`ywhK`e(E3yby5lTLyxMQtuK6zAl2cdsmbLQ_#&(wQn5_ z+Yo8!HdYO{=caV97J$f)qGgtwCNT~9VG5AP(Ix%^FDYc%ATDEZ>;ij(iF=64Sz&f! z^uknyrMXb95V7gZjN~4*?!TzfbhTY=J_b^pW};m)>&f5p7urO{VI3~dztqT@_A$u zM}?oc=yJvaEVB5wY2FmWb7-eNn=5MDQHhpb2$iEDJs}UHUWg6!V)+>jDjhx?fdL(G zm0Q3pqgE|H+v9^<<%`-&=85L8gK4_aiGbReN0?3JK;W13(Tf;>;~B$XUUe20ywSaX z)m^LYIpBT-9fzfI?IVMLxlWrOI><@5x}q!ZMi8KkCP!$$crqIf6T*RdLU3_d7_1y} z%O<$SZ!qq~3L%y*KKObOu^E7CAwWmC4ofdm3}E2JXnC>w{0Pr~iPKJV%_4YHS*_-r5fyWF7F3yo&Bet5@F)1sfXT z3Dcke7F6DpQDp_|sHQQfB(Et;KHa`B zHuS39>(&aaa67!P4jW`Uqq@GTti0&<+>r>3h*^x1tS!iHR0WVAQ+_!m*AXywk_5VF zEW*Kb`?F{=2{4o;0bw_{F+gKoC*MwUv*(tEZp6$WLa{?blT4v~!O`+7HDCLPG3_U- zt6O4Q&aGbA+)avnHtj=cHQg|IAaL1j`r>&sV`x=s>iLG>(ac#*Dv+?ugR1aZTyQ?U zZ%R9NSb&J=iQtoL>6WXx0;&o%l_ID)yEvzJXbMCYsr`c^FBWCFgCUQ68`q|oXp!DO zP*!^TlGsMC@}9%MdNt5YVvmcPY6z^)Jeg0~TJG=efmEj6V2rrn9fXOi0B41Z2v^B( zT0xV$tRTAz+&;ivGck*YwvR0Ly2ienu#ekqo7>e5opJ6@Sn+z@n$n~s)94k5_8s@n zYZiEzaBy{VqVtp^yw=awi{xb1K%eV-4@JQc5Hn`jU5N6r8a|^&8MvL`p)Qe$z7RuqRn5HHAk8+D43oA{jwwggFtf1n)V^r zVIhYHxG!MlL4Ae+H@TF!zzZ^nW~-G<^*y%4r!o_uLLx;{-B-g_)}>H;JevW8Ys}yl z!N;`dnR$+KJ8!nTI>!M7?9l5)>qZ$|s z5A?u$yU%Z-2JVBX=WBtJ=`_pzSAcFeN-E0YG_SmZP6qGbpuSnB9M7&WudhFj`JKbC z*%ozd3Q!3BDM91+`^lu_xT|Ax$kL5aYnV@xtQDOkU`tY1yD1rc2+f9W8gSwCh1@ue zdU!hs#n7D-m7W0paG7KUUO0i#_!yzh&5TGrVM%+vHwQ0vc78nWxS5ex3yUX~U-)Y%r>RKfR1UeEHzp_cs5BC9F>cG*Io9>n+mEj4dva#Gk`gpnz-rwAw-q zZ#nIsP1}p6n#FFk)Q0bd!9>S@hGKN5lgj>}g-GdbIK?{c2M@5SF4}~!uX1soV&o-k z3Pf*t-~lB>ZBunI$*{(*8y$u#eS*58b3W&|tp2twm`!r&AqcDYv|Y~v9uwP|9w$Ccj@Sd4bMzd*5xorMK6 z9=}HNUEi3#JKE{JJviF^v7^!mwV>?ny>7odHifi@!_llbYqRSmeS}XPouxm@3&7BV zZgm#g{ESaTVN2nr zuy0N{7eAJiYy5uQW`J9FS;Bt;L1$rML5-UEwR?0BZPN%dTE5p}J(`he&_X1;vfqv9 z$GA)H4OQLiIY6VmAUa7cageL+|g?0(|ebA3TVRRPz<= zaJa{(E5)YapvUy<$MZ&neqy59LFoau(ASSYkqp<&&yCa5&=6RjwVUaCiUhyW<6y9HKW*X62%n=-}OP zm@1!@l+4+V;L&x2JXN$u|8A((m-&bouJ#_B+MFU<>R>)R0%o8Sfpc$-6kc$=z24e? zvA3h`Fwz2#xIudY$qT-+o;PA}6RBp@nK<5}(b(BGCG0dbdq|B?>A#$GjQBHIel~3G0Zc-)ROXc9 z6WZ@ZJ9k}C6X=+;xI{=e5I4YVJB})op>7((cEht)XZ`>lD;O>Uh928*gz3QuTrkKF z#>Q-kqZZZF(&@+z3*8ieXSD8a{St^ZB-|kHF6Dv}N8@CiPp=6~zbl?YR3Jmw#i%1q zi!xz@u0)6au>)!(F;rsQV%+`R1W*BH_@=O(W)~7(%MdJ1)e*agiQDK3U>9vr)Gz>} zX@^HleD?r9!J;q=lyk6SWn#R*cJXLL7RFR&OUHZ3$Fgy$YK%1#wJ!3J8Jdwvi+F3~ zQWnu&3W6dDmWnl0+aAScwpejJ6-T~4zJ0W^8gZnbN9$;})Y0Ql(F(76*t$Efcxfsw z)NOm|)Q2Iq!+pcpQ-Lt-y!<%=04p>4!;U3&)X3BV_j_cgu?Mu9Z6V|M+=%Wo^z1sF zk;Oi`wvuLmd#l=DhX*_Tv2r>zR?K)iy|l>kETI#jBe!Exxi#j8lz`0&(A=`Z4tHMd z9vvV4&9G}bKX%SWqwxA(503B>b zR6vF7A~AqE$v6}ys*M@I-pyW-sL|F0?pD;z5khVg4zUAg*IVhn?P-+&>8nB*V$!YE zUSE+WaR~Rx{wt?k44YVOAF4^)T*z2#vVt>_((-btJrvpH&n}9n^(90~{jz|=n@fi& z!wjg+?$qu|ETCqry&jwLp+s`bVdl;84aC2N;~|OjN$HZVcR^Qy>F11;R}@4Egz{`G zDT!13kY;LZLttWchF;)%s7+}++T%fos%NAk%(qxGG2B-*H$r2*Nr}F#TjQ(UNDAmg zPlRb|+MA+vYS^2TPurU~*>a_+w_|dZ^j%Yx3X7P%+T}6%uUQ}dW}i3LlQwJM=T5g% z7e+O69#W4*YQp8405b*_YQoNotS-|I32tV=9c(qEsI}P!fH;%%JA#w0Da!X*w3j!_)FO`4rIc znb9G0tmge>1x2@)7;;|L7GEUU)2m@k2be$szbD>+h&0?Ptb?QG`8A|GN{?g{s@mnC z;fotqfHeq1I365#3FdY|#<>q~xt8V&+GdZTs-8xo>&eZ!7&Jd&^)zUWlpj! z*0E_1mmJIDpGMH!C>1c11d!O-Mq-nMQ4XNFordduR%J>y~0( zo-9O2-DhW>6l9fDADv(BJk9q6hF+qC4?)sv>%O?dkL4 zhQid!HpQCp%BlonSU0n^0{g8AxLq#D3e-?fiJ44deb%_0ExAF!6@L?;*C6hLE_pyx z6@@bkU=%3?D=89l{tW~uwjGopFb${`i(-P1NUlo!!@vTYvPe1>8&|Fv#j^|_bPK2W1mW@RfP@p6zSde9j+wq?uS2XfHB1p^~8LYZ) zY@~;4fl95hYu>K%Ne!%@x=mzPj7OuR+BHXOUrlwGzzkeD%|~I9dh*I}4rRW4k}UHk zvxiapae2mD(Z-2k0`Yj`UH~jxM>&4ORrTS{){EbI3w`gQaHC~{LViNSS(f}zI)!jv;K zG@#k=x*xR<_oF2UmSk1LPWYQ<%g-{nPuDYNaU-d2LDqF4M@%N{DwwxmUnKmMg|6oF z$6xbIAbb{ur(H3;OZHw$a zy((-7K`_iTl9&+)VEn=PbiES{H(au=%W(SwtjX!dpWBOp*Ac{0fLI;aj!|JDtE6aF zC`T}@qCqwzPl4bnqs?<6kGO^gNq_Qw9i3~Z*$V1eH{h4^vxfw@C7Bl@J8O6iu@~AN z+tbIu$`lt3F9s)RDR_EgKgT;=E3Y}*Ndv>aiewBE2b#gH5&Ts41}9gmQAw3kMw) zG#jRb@AACK`_{30H`X$Q6OV?@uZQw7456x&cl+Yx?V{P@i^Yduv8d9{)i5y=C_9d`Ojc6A8}WL=OUVqWJRIZ8c#NyV!7~)J>(l(;b7m#; zk1�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 z%0A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%0Dy>ER$%$8n zkepELy;L<)R^idw1dd^q=#CM3`ybjj1%pNDL)4`6)2SE@%o`VtMndP{rCTd{3DZlo z+2j;{HgF*78t2{w(L4w)Y(b|5w_^bLi9N$vpckN~>-3I)KKu&LGHD}0Am=KhlcY$tqdjR$;Cnl5H+l>fW5Ol2lFOtRWu3f- z5o|x;PBWwsbB|_lbim%6_Pc;*oos|8p+TO4m@*k@S_~Q%^B$Od1D8Mz+Ji#IC`Me# z2Q*>CAgd$V+PpG8cAh2_G$D(9PiWDb60J&;2C|XOz&f}R(THf+u?8l=4(T6QelbZe zQv)DsoH0XvhLW>sjydvF=&})kD3zxbtyTa5pC+pe4l(s~4LPq2i7`yR8by*~0iT*h zg1%tf3W|*8yqC43WGWK%JuIpI=3l$qolW$I{g4n`D*r_Cl zU5m$s3;8bLk8J!}JQFKsk`LI?WY~iS{J~M+`S%6+19O>#7EElC7@fW&OtzX8E6Fk0 zB%w7bfbTIyNkSN|F0Vhv=#5u!lF7s5;p3ncq_^%~ZA%M1dhAnb5H`}zYLqb5rQjiS zZEE$e!#;rQ17_?kKc({sdpx_bUfky7`5*@yWmA;azA25^wAQ1fAJMS5neDKdZy%R7 z*&uoSI;==)nzmV1a#p;%ce1s6`uzFMHb+EE`qR_18}uWbw%?o%M+o2ItzjeIZ8QU; zC$WyYQgbh3dfW;dxk8=Wx5i8YA;0Bnm&>vt;=`!M@vSu;MKyMBukv+N<>2-z-$Yej zzrMA~w_?G!Fq{%Au#hyADX3cP;4+z92gT~5(J*6-?9%SvxAseNNdFd^i3L?8K9`bO z86grd8X#dfjc`1?szmK*n7cU4J9ioe^0h;J=7#8Tis9C{x@rw4t$fm&wA!sJnm60F z!J8%nGx-gE4kt}s4f>Vyudn$R|9Hed+D*nL{BhM3yG>7u$s0JIpzkt@9-Yqgij5s5 z@MWb7d|;s*J8|Fn8qLS~zW;yQN9jMGf88hY|3fxmrSpaRnC<_!zWVUdw~_zf!-wnZ z|MCC(cYLh>A1^*T|7}gL^L~zj?v%AGB0K64dY_{q3#kv;3~U{o(#`^ z2HrDzh!GSr9_-!iZH7v+2m^a@I>^4@1 z9vgd{L;lC@ZTN0Jjsy!C=dQg$KZl0EsbByE3_Cmb%s{xpm@4vUdAW(z_{Up$_|CK$0)lr; zFDHgnLEs`ANjN|qf(`2M;uM2iaPu+D%nbWcl!rK?L#J=17zB2>9nNeIM35f#8e|-! zp&RH&vN(M&5QZKE!bviHzx?$53WE7Qex0sR=O#61?&2UyECApP2YH|Kv`cM`gVJ}P z&JoDd_b%kb_9=|@tUVs**%*i1>9^o@Ibap5|Jwv_y#!#9IyukZgM`t~-e*u3$x=Tb zT;lL19N&Q$C6Ev~jqt$Vasm^T?xkY0mklsSLW=w%MaOkvQ3OcP@sxA9hO2lqx!mn) z?^1RVTbXws)UHqc>bN0YV;BYM4Ild@E7spPXh<6HRpNLt-1-18XSZm=Z}U1Mj8>#+ z{G)L%9ZUtD5isKx9OKRLcYVO0>q%4M?p#l*O5cx$L7|}Vy+a%c%?!H*mZWI-OjVN$ z49Kd<4t1RTRCE$LUKh9*g;#6_WA{Q+@~bpyhe%S*l!cmmQ5+c@XAn=eONcqnrl?&( zO&a4f%mkY64l@pmn_WW>h{HNetX;-(vL_WBAQ}V5X!kbcWOQ^0N*f#Ij$o#$2CpbL zhz$p0K#h`_tws@2G5oiou?@;@I2uuO9(;)c)O19{XpG3=QHR7qMzZ#}bHPd#2Vm1b ztaTSwuz@gdB_pL?hz6$BP1mXmaqK;q8JyqwuqCokl4?=I|G3^6KBE#M;u=fFmELeV z01m2CNtuYGq@$4p6qNRrhTz^8iZL36X~igO7?4%D2|?o&@_%I_lEUAV5jh)=;rUfo z6zy|NAu%4OqCH__SG(h3lq!mJD|wOJkDXNB-jnulU zi;jy$*5`B`2*)+!U0l}&M&KTgr41wlvUJ7y3O0kWqr)Z?0&=IclsuHW-L6?2Q?2mX zZ~&sZeV(7Cj+kh95+B&%4()%PmiP85gRP zFFz$gLi5o(<0zBEM+b~?x|7BCXs^#Beo3UeKkP6~p!QnWTgwww9iFPI%hMP+IwO*%dH+V!;v(ysQx5T6Zo`N%32v%{)4+f#uC8Vp=!p*r z)=X)AQf)|y@>zx>V4k&wI}b{YZzdO%Z?C7mEEHH^I7msC&dD?|j%f*D(d5O`zL_}7 zw2t8v(mlms;_+gptvqVRCPPI5(G{O%8304vGB73JVtAY}&!Rj!cfy-e_BGz!=Y5-z zn!^APttjxq2MWs(1PiFDVB`sDM*yvJ8Kt#XH!BlWEa>!n==^5V>3f?BA?TAfw16;f z4+j#oxv2REqSFZ*nZ9qy=vufAme{?PKq%hEsGIdCZQ_;F$yo;(z_bMqfhFi7xz@YR zn-K^5>v4q@IZ4SO-5sNJF^8w}9vK3l=|TsX3kk`R6XuCs10S=-E$jKt-tm^G($~NK zX4*&9aHAnY1JDiLEx@qIFjr_G91I~@O#a-IxClDc-9ftK!5YGo`#|0^?OPOoeX#62y_25FE~|^-w+ka2-qqHS!dj}Q$tdl>&kVa7h!qIwfPDA?r&|xaNMk<%v_hGlXzi?k zqAf+stC3U@(`jJk_jJYO0{D=vjP9T1GW>&43qKvkQGRhc9iUhwYwl#!(i%@kd4a5R z1Kx2s-)iBoLfRw7K78DCItlaemge+nz|NFyo!KJAi&!iWdqK<3oY3Qw#1iwnMi z1dlgGSq3xRBu^ZN>VxD4c!8xLH zB-_#;O-$+=^#?rFpr9Wrl^;ZMmBC|m0ziF|F&Kp%l;q^}g0hmM6l!G1!H4y;KCGpm zZlnoBRs}^xpi1XxVB>0%9>{3D@Jzx%YsmPB7dvDqhUt0;mUQ~?j%Ax5G&S%u!H5zq}+^AB48OhA>?GE2-M|% z`7RcLCXI%KR`Ab2#EV#l(82dxs05n~Rvn4e1cc&O5eH;JT3?? zQ$WVyhXKQ=)8NTwopiUCi;i5mQGKCHSLm|7kgi!PUibPcW~Eydt3RVJUWZn+F7*|> zU1fwcVHGMJNP&C9;U$|lEo0DqRL*#+(B{k}K*ZtS6on?Ikz;$y6+W0fDDERu6jej&-$*eoWClU6-;pt)cHh;H*77&wB2OUnL zQ1KKqyn|ung9;$=QkR+y(L!5(>i{J;VW*p`N5e)7C--6RzSfs9)0kT zVj0EH;x2%Yq1!?D@coro8JRN#d4(L+k#FB6=*qV6Cs@fJfdz*{>2b0kYx3s54|iXF ze+<9>w4jByrjv`|xX?mdC&%9(93D}Tjl1qVJVtwSJYC37ic+^AH{QT(pzLhGx7Vb4 zSM74zQ8j+aXPIUew5SqF}FO2w> z`3;*9qlNGj&VF>b^K$p-`0&3es8%yrM zs%*8jW-D2k4q~7!nESRN%C%0-r7(%FQ243?712@vRn|i%61udNUwIUP$$JIUIb}@^ z#oN+UH2>DJ%xiDPv>ZR>J_{PLEtsMiu4|6KSspvxeOBVLX-ELmKV|=w@r~X!%Tz-( zLLwKcr8Z$oGne%B)=y+E#W(W{x`!0y(XDcPp4oN8UG8ipak}Qh)-A-g+VmMN)|*md zX+*sKHgC?j73FXR6b%_GzBX2SnEUTOKa)pqq2Th`yYiA%ejZmN-$##vzlzNg9@*Po zERjqe?ssEyF&<9OF|geQNIK2$OrFmG<_Nler&pRU03H=8Kvy`Gx9@8qhDGI-<6u}q z2e0sqNt+xw;;AYp5BJMEYMGujmBzKZUG)DYveZ8<@&QR}Og@+{vHJaggDwq?=Dam~ zV-ACD_$$64$PJcRTmQd8G=fe-l6K2u4T$S_v&$kbEC{t;yFddk@xmH!L@T8_ zY7iVR8*DleE?+SG0n+zX7`7wA=^$NjmyoJ=K1H<-LCsC!DUQS6;}FG3vH@->M?S`+ znvzt0H)yiUAv1urIe2C6*ZCCStIPB8@PoC+)K=&s9A7%s<3NphaHLoW)4IFE?umu= zfT^^9yBWMyyCRD7&_kzAy3nWo5th?|f#%rhu{VOnQw7%PH7Q~3!l5>noa*$!WLR2C zx3x%hyNNbWdfo<0I^lEGts*B|Y;YHY@SQw;Nq@;S@FmuV<>u72NgH^^b3#?U$|vT% zSg34gGGs#^-9h+UkYN*7V}X|qIn!Q$_<#cPln3JazWBR2LtbpJ+r(O>WFUOlmqFJckseukTqTs?xxp?4KO%JP(^A z#rw|T(eAHf*<4SPIs{uze1bC1E8tHx8fQ^}p%%U{6$A-z5;hW+V8NIJF=(?uvD zN8gNN%km#jHGQLHJ3XEM4r}?JkG*M|IVVEvHYMFvWE;)yC{9EPu_v-<07W-Zl6w8)t(~CO)knLK;|mo+w}F<`D1*o1RIy zRXCxRL@d$%OWZ7ulhP`<(!#Nu!--20mD%75Pm$E%x8-GBf9t1V1ppvK?j|g2GbHd* zy6~jJ4wGFIy<4XOl6oehbR@p(z$C2;|gm z`mqHA3T`L^uFKKF5t|yKvHd{qbaA#kDn^;`v?P>~C8jYyVHPXC4duGJ_~zRD0(QZW zy4ps#5Fa++7%+v35w2r@QAdqoUCi2y=GMA`*z1j|VaH`-M29atj6o(e!$GYCfAs`LgFHw?Ou581Gr zIJ>4TP_WUxvTVUSwa1qxO4iPM*(5=Y#MU!Sk+;RcHduE}{`MS$6T}4avlvh=F_{%UOfeVo99zmJ=LAFtSB-EAkSUcHwBPMHCTo(!$zs$x@3l0e22 zG77vc4n4#+wkYPV#msS3vmKSK9Fs|?Hb7N^ZQ5XQ3iyfvFcZrIJ_sf-5T|Za;_t*P zG}`y|uq@Uc(cfinD$FyGWe{f?LObji;BnY5K(wsEiEnBJf6|0dZ6)hCgUQK^h zr2#1UI1Ax37d3_bTDACy!VUo@Lq}It!P*PKoP9m-H zaR3yu--k01=n%321*NT+Xv7T8zfR`%Tufty%(t58kZ`-wJ6bSHo;;Tltq?&_7bqWe z#-~tDPt)?qgr=d?Q543Pzrl21`DwDvp>#@&Jmor^HTux;rUIE1m7FkQZ(VSoV;6Ym z@|YIyc>iF3Cjw|>9zla*%ZT#8CKd8q$OvjDNRcLFL@1XkAk!WH_nVy~gW1^Af*t-u z`)*8{)uK;cbi8KuO9D={uY5ff>amB-SXA=Ek%;bJbTHVtwA+X^1iojn>$na1MItAC z$R`hE$elFsARp9@gfCsc{CaS^vLv1NlXbLJ8P>1G6xjZ5d(!^$Bk4{1eQjOFLkNS) zfAhR%WaIXS>>tyz89R*&J6|*3*DHs)RxwVh*{oRC^_s%#wWMN=ID7kKy@})l#`~ii zJ{~>8HF^i+WVMDYQ(V)knW~HyQDnOP8=(Rnn>u)Nvi};#Vjp3|_hu*si#8IPURO^~ zkYI=GHK`F(F@MmAM6wS<4RcqN+^y(#cz|5Luh?SePmH^O{-PQpFV_D1QLI(5#{Ph@ ztfJBGM`w$8I|rc@$y1Laovs5To>2%}_XyZdmduj#AsPL0L3f58@M_S43LkGqvfeB` zLe?=Tv0>!h<>kQoR|XTnX2!Yg?i?s=VfC?B+6y7(#CxI&^*2<_trnpc-6WdEjrdBo z&jaV9TQ=D(+ltw++qRTwo`F^FTp-@-lY|2+GQRKp*JBz#?LN2ls8MQWBRLyq?aPgF z&Anq&vk&YDh?Rr+YVJfeso(ml-K^IJ#Cseb|EuP7ACBxDrJ51eX_NC1ThN&Dlo5tc z0X>Rhys_Mi#KMuf#Vh=9EGZo%C#5%Pxe_0&S z(Oo{E6=CN-pr~1FiyYUZlUfW*xi6ZRbd2rcUo)>kd0M-|*6_T98TrJCX&Ym2IR2S) zbIcG-ZY&nX^G~mIgXY-pp+;`_k_^LF-lH;R-b$?Yus@S`YAG%+f><5Oq*c=BEO??- zOu$oF`{S<+bLE`#CwirlpY^S!23Zzo1NDt-(%^J~RRtStadR`RHu-8vLHlzulu?n? zvf)KkqAM@AT{CqPq!Bw!Gl!c1DvyDs(FS^Am4Hrx9nXWYi0AUYfWHlA9$!hZ3LZn% z72b(DfC~4AjeZdn(}RNqB{;v#IyzeZ-koX=iu?CF`t)+Jpda6jtRj)X#zapIszpzZG zhD_?Ga(GR>L7-yJdAsb9M4+P($iAi*LGqJUQvZV+59*SxobR}tQv9T}% z1A~`KN0^BMZ%WYZ2%~l9?6hom!t;+&2 z2Ni39CdG^uin-l7wo_d8sI6JD1p;Rd*wpIe3K#uK6z0 zJUY%~$HdvTjbrFxv@Yw32)GxU#inWNNaRXmF$)UH$&-u+&-Cb$xd$IlFV^*s;_XjHimMxQYx)$rknszkiH5vYV# zUhcg)N8!alwx_;o!&rC(=+zaP3}Da|!%FW>+c7ikH2^rJ_Vk*M!)p5L0(6E1`Las- zp_omU6T()*bNbR@7F`OUpC|NA)+ZRwWvqdtRGkBlnue-X*jbpEOScoXTJ`|@nZ5OX zJZ0MwGu)Z?Tx(`%vo0xEtx{?$;Hh6`5sww!_px*(jC>B*L&Sen3pbGSQ>2s=Q#DY>%iQlQWqj=?9H?#|rcD3}LH zcw&DRjM%#N0$5+NfVn66hVIM0DfuPB4{G-(Dsg~|)O7L*N8)Tu2#-1*!?^tc&&Zjl-TStt z^C10Kb~T#ZH1HuCLAE*GH3*A%%+Xt)#w)rOnn%o?0etNA6S;)hAW=tu4v;n%339kt zk6|URW2TG~G&?X(`U~v$;;q|Sb{HGBO1B?plP&K`pVd;F);R^}H3^Oz+Rp-~$ z3Y6-j@*ricENYwF_?+KYoC2|L@?lp3`#mP2&VR|2u**1UjPofhY7Q-ore6yVpjYC$U*=RK zuDQVGilYLv+jo^275wC2;}L;zT@dKPtH`sTD=s7XT396VD}=w^kU?>fope4b?;8uG ziW^Pa&UD^(^cKZd7Rhb$){p&Nsj8X~Kn-UJ;ZEjiq`8_Q{CFq!TV#-0YZjycD0t7Z zi4Rm$fhh@DcULX+C!8aZl`I@5_#|=KfbdvhRoIhF*(I<=j19qnzZ;OwIF`j7M@`SG zWyy;3`o8IK`u;8X!Mt0MbXeSI`Fw7E7UyFn#3GdXotFTJ|19-$vB}#@Oy0%IS(C4U z(*1&Dh}o~ne~Oi&rK~Z)z!m>)#X;@q{dpP%!hsnVbQPAmUUy=Zs_XHzQ0RAzOqq~y&>HxWbTOdV z8Qa1FTOuYWRnFjFP#)*#L<2tnO!eTfQ+&p%Bz9M(UQ`eK*XL)H=N8(kjnBV?5Wik8 z#D5mr*NOGDI9Fo|?r^RK=28II@%@W605fHq->Dk- zT{!dk3WFk27|cQ_>qlQhnk(=qI?_<0DQaa-pZ^TVVaWK@%K)|aW_2PCZCF2Z>Z%&R zViymiJbvA2LnjTVH*?OIXW|Wv%*uIZNHY0s5!PL-&9m)h!i!fQ>(PPuqa-aRc@w6w-t(=^^|dbY1Z9oSBtXH8N&}hEI;~da6yAGMX$5i zgNBR@8QwAj1qR~s%PloNmgV1%b<(sORJADm>GPQW>!(pNiL8?3gONu~M90z$iEgcS zfBjA&Tte;5y}kaW^7&UL71w}LnoTi1wtH3~u{#TRRvmFhyFsd1g5R#SD&+ik)+^IU z>|_s8Bc<2Nd{wm6+r8G;i!?CvA%fG#u+*ORhwZM|Frs9YT2X&I9iWt-P{Ihl;MY4< zS||y#1LGaETZ3^k`5U8Y6#Qe{)CjS!Pxg)vcaF83|DX^1UKmBsM^xP8HkMISiInkg zcke7n*BmUy2Q!rrdoHPygf@XKy3nlD$-=Y>sQM zEFw;BX|3EZ$F-D1k>qIks^vQC4oUVV`&$e(IzYSlzU0s5z9OtpD7tt|SVrQa*)U*s zJh+W7Z6Y(5gSfG0LL+lf%#mavwJ@-$yAhwJE1eZgZF4E%YA~0dEniU_mJlPiO|GLV zxV$$1q$bdnIC5^5V(I16oQAp^iEhwym>u{hL`eI-~Q!g1~eG+k?U)gv}&Hr9X5zNRzkGCfN z@_`Ef|DBp3xe%zElrchMRwM4)hhvVSSxF1#x+7vlczGHeza2Rd&L?{T=O!v6$wGcvhl4(LzGIR-laXeeQId+Apy71_M3hLp3RKN-Y6tJzNPgQ)ws((?PyhSP z_Lh2!It)f18$hLMCMbmw9^xWxO2P;GsM zOg<6H|JglAekmV1(GkOr_}W%8abFXccOGi|4n3v-(Dk{OD}OXFEVpRIvXHSE>uPh4_Ij6!Suo3R-RLvE5bplGtDy^>{r zuF0ayLF`=1fu$|UFV1Y%6%BRr=aY&XCM7g+i|ry=gSzS&f!ns1CJhWQaK=iLo&6t8 zQU@=&YF51B?dm(ql?!61*JAXeAbhs8DR^7plv(JG8I7vY{jcMkQuffF0Nn*e$N9)d zjQ1EjEBM4r4Mhnt6y<<j#F51?GD)yI(EOQuHwTW}FUr_*`FF!r+ z6q8YMKY6)*bo}P!b~ALND_~JfA_bb-@|uaMHDcDaO$O+6g~68RSaFn@z)$r)TsWb? zD2N`!3RE25!5goY6$#1b1KZzFWGoV=UH>UQEVUV?d@!bqu4%0Ror<8G2IVhb}J|Q zrVSV%3{A)=u2pu8K?5+%c0Nd6o!v~b;&Jjv`ukx0?`x}mtc**JNuucTlXjnqHqM*L z)2GSWCyeQtAJlCv-%nPrANG24wS9EFV{ila013%xAae>>CYT1#J%K&F%B~VzTAv(b za}D`^jLt%`5oS}v;PhQi8$d~Kib*!IeqyIMT+DXB*r13}k0=~;0agQgLXBSuajFo8 zqMWxi!*-}ik5Sai5Skdlj#%&sADWX*b>>DCzz}yS_L*|*I9M5mmT5|$M`{6rr|=rd zBH+aOqhtx^|8g6PZPX4K|5mE|O=urKLIY3+y4vVcLTDf6r(l8?01!v}l*7bJGgxMm z2*?OM0-H9KS+aQD1E+4~Y>L&Un8_G?Ec?>}LDyGMs7`}@25FJsDa-huryKri3(xf*)8vmegz zDn~WQv_ET>RIdH=t>t(~dC|=}FSn6zKFSh*DoDbM;K~MO zjQTaGt3wOxMo@=lq+H8QCge0hC>fk*IBq;+UcKBtg#pjEJp0=rR0;oX1F4|FJjEn8 z_`d@3Jk*(>)9n=QIhKcb3bU&_e2+JVHbK)XuYAW$UBBM4VlcV-6*JM75M0W`h2a>z za9!ahKl^@5INYne=w$tVdypX!c9&b#0j^m!QNcs2B!LCkxFF&n`9+=RP%CU8ai=~x zJQ8XeD0L}-5yU}$bp>n@@aW%pr5^>xyBJGE0q&Z@cV_?K#|@2%ChuB$vz%SQldIyq z>8$%-^Q4`X+PIx#3XE_F?zU5Fz2sWZQmG;cv(tWiY->`skuGq)13&^m6Etn-94=xL zM+`bD(Z<8R@HPFLq@SVwivV&7%zxGoyj_HQ!3aI1^6YgGVr_hk%s z574393KP1nz#y0d!!Oqwy7!~FMhgola#-7UcA=CwF!jdnqO>0zE-bd?6|^M5{f%7q$%a^>$%@O32Hj) z$nMo!HCK<)3@g4Oj)tg%LKmy9f1snnTag;T*-_xpQaOmf!V4csXU?&lVsp`exQ97L zBd6Rf=LR^GH8l(#sg+|PkyqM6 z$wC8IUAkmk0J&L$WQapmr94>~t~gk+FvM>hISx0i?#1%CP8aofWCv_f>|VBE4t@ry zA5f*tQlf(bGD8^}aq2D|Ns}z~?;~wss5u7AIlA2z1Y#CbR7u%*lC!{A{O^F#6F29s=^FFFtt z0+7J*p<7{`l^7rnd*bZFTZRNKj(TdyW==Y3lYb1*xO-&0Bn$!F2$rM*`n4wGdm7^p z=q~UDNU5Ft6`G4zQEAe^!N_6w%8TKnHR3^t`@nBVrz6UH*O0IKF%9%K1(;7xcZ3Fj z4pl2k0tr-$i_QBCrV0j`c9=AlS2`y4>TLICf^A@p}ds(jFX z3I3zJVuNt4s@4m+23{~Jg337*P^I&a^yJ0X-rn)|hX*GwzjroBL5%GX0-p3xq(Kuj zzhFxdINF>!iL_U83n}HSsln;EUkBfci1r43eg;&mLm)|SG+3KAJgh8&RF{lM1IZF* z_Ba_jD3zIx)>wHKBMWp7UBenN0Bb;$zdiNk*Q?7ze}i>{UIFB&8)I2c&B$*fL|A+s>ADG?p*DH@!zIjlLI}iG7i?wp`Mf+HV&o_@A;oo)m zAO2nY_Ul!84qqQWdi3od)*d}tf3*J1H*4$P`~e<)^X;QQB&%O^6g8hI+JYp>ANm)) zndK%~=X~6rUFQGbhwn}PwA+20xW!NYL}`$L)W4x8`0FUklI`K>hNC;~58707r5 zDI$CKOG@uVsXfhmA;)!j%ggDOzk~WWQab{g+BmZe2(NPBF^~B z2C@$e7@&1QOmav4DHOwY$lwZ11cn2bsr%>Y)u_-&_5hfEfetgn?i7~^ni9@j;KAcL zyTODOR-A9tp?r1hJinQIF0Ngt%caoSvwurJAFju{G}UkAkp7J^U;xd=po40B!K z5%A-W2fNQ(bRyENj|ZFw7vA{vLCiJF!C63Xn$baoDLH5y$yL@yyRU(0dk zP}h*yu>82cyVsJNDPTw2cu3`P!Sv(t;mJ<)5*Ae$fggbbIEr6W{w#U_Dtd>p9xl@j zvIbYiOV-L3(AqEdj=6zee+URh>4v%BMlxU#2w<6w^A2WX$1*kw!H=(Y_ocpOZ1C0d zxVjbz8aO&WY>D04IP4xCa0{x+kYM&3;gU3@A}mZVzxIZ2{p^~Q1`Pj${llHTgKh50 zEHt9NM^AuFTUuc&*=)Q~=0pUvl3Y>?N>9+qmaH{q*XlcD-N0`vV>Y^Xm1uq9KCs|> zE!d}QFtU&o$)hvD0>BNViF7If$|>%L@Dsk<7!y3lk)+BDDn4u<>>nK~MqQ2aezpv> zCrh5tvOM*z-mL^l`>YuD(UoiFXel}N&U3{ZD4BI@TgJA#D->;th;043U^xcbWrn#A z4rLUk(~~!0r!xK9`kYzJcKNE@`B@gUvBPpi_tJ>o7E1aj|RhJ-G^K0 z%MBxh#}BXHl=dIR<(g#0EX&5Pk6Y*$cg)L|+%hMFThcVNronS)+qbOt*6jUTIb zI-W|S=|s0JZuP-U?OfcZ@r}a>WRq;|?Nv|2IG^MUuuLUit&)I5=NOUKyiRHIAK#GLWN+ zILeQSl}GP`sAwM(TG+~Ag@;K|?q=-9<+`{S_GzEsap*R@t2os>j6ALPuD($Iu}&}| z>DRKDx6`gi>){>Be3datoyO=4+PZeb*>+ zFKZzIgulrsB@o?U3%+<|Mj4+o=Xh&I*3xYHgtA+|eU|m@L$g}4HhWmaEm*}IxQ)Dv zvRW@!7LtreI~w(?AOQ>EL`H3{1jYhaRUhCVN4msNi=$E29(&IdUb_MBU%8=T`iiK> zc;|PJCL?qG2CWd2L7vB!hTF-O%+Pi$N6L<=+L6D^x+HBVr(Sg z2xWAaUhPmJnd~!susx75NahaG(uit@co=Gioeway25UQ1F~De! zCth3f>si0Z2;OK7!&+p7xZG~bk)lCaT=fffVMx?_#D@4kAf6-8LXS+v&+J;0 zqzbJCNt5JT<8u+gBUwBXCZ%)H&WX0@@H`B|olgd&ZX1%F8o;HI{bP#!Q$_|iNjku% z>U&OPpzdL^ro8uHiBn>l<)QCY{6-8_!NNpZXqRK=6m-v~)lBg@a#p5= z!DVS1s->vaI8f2i%%US(6eLRRY-S}>&T<#|xR}sJi_Rc=;kO|1IJ$X>I5gu%WUEv( zLPVUHr0z|3`6>OT#4frnd=f&fv*|e=ZZjv+gBJ7*`~(tSNljeU>8R9ccnzc_d*ckw zk#pggX@2-9QgUeN`~%>|S)pKYvI@+kD5l6+QX(HhC8rvYBo-JTAs8c20&~82J63p3 z*(lf`*bSSwL%x0zQ_GKjJ8$s))9&eull^VA$^P%t0fLnyLz|u7Lyvi1+TR*c9ijEn zg%vujFaFX>UY|{SJp>E>o#WCd|F3=h&BKRZm+ybS z`Op6UcYN&quP#2{|H5ethvgVV?fh)q9^VixkjoyvDCE!!AdHXN6Wq_sSExpU_j6tt z>-8}Ad)jeN&~{~S_gQdV3@malzvg>j_xMQ%C6bkkr{)pel7)}-syTRu99vWs#(xn$ zDJESQQ|TFANJo!|B!$lqRQRk+;i}1572R{5jqU6FYI^dM{y4+YR8}p;Hk4fS2)F|jZX7UqY;dy z3D24iL`TD`jKp(}F>#jRw0W8=O$!Ni4{DE3v?^r{$6- zi9A5>^QZ+{_38gA3Ze#hzAUo$meAADiayfnyAW-u$ zh$Hz(?~-6?-;(KCuSu34$8`NXIGn)iE1_6h)3&Qf&llVZkZg^{2~FAYCyDabzvvF#%~e053jv zt~M}1pIH!Ic;`DcD;1o8ch37x%lhDneyyS+Pm<+uX|X@?*)B~ujL;)~sI)||Hf!GO zRZAcyF4+;nuK-wo5=h*}*;NUCFDPbgG1b^s#hJYF`YP9O?-n4g$;P6|I`ha%5IWwU_ zY1!=B!0*yhKaH_r7V1>tg{|wuaNfSw5q&DAXSdNOE3!MN)YB_|q@g#M$0^{UbKm}4Sb$Xie-#!q^e+jEaWiq>pzSrdx3~V`x&8E+qGxj@$!lKz%y~m7FdxLYKn50{iAdDD6yq zAwFE>Xx=ecUWO^UFrBPIA1tq7j%B=)Z1jd`*2{N^1x6c2dskyMa+O_mMmG)2st34{ zEGpAY;zn~L86``bNe}}`z`Ck^vO#Lf4N>Mp6cgAo_abWt!O%=^*@$tm)TJxTT|2O; zGY$WH+qm7G5+<7lIKhx+gQ9NF1#tg(+xDZog)e)i2dq(E%^9t$PoC$e^Wgj+<Nk)R=;Y!Y z_}Z%sA*>Qb93C^;#j@`QMQs_(ZqQQqfuZgd zQlnCM>~SeyUV9hhTpm>75@ARMF44*`9-LAX$B_$DWbWxiMle^sHAmm=q-S7fyN0vf zl<69CyA!9VKrq`U&C0VvecI?HjMh0ab;uqtXy9b~`>jKch5-1vAhCa^WI!;+xLoQX z2Ind-P7cR)iNQku45}B0^bM}MGTB61UTKHd(wo`q>J zD3mVuP#N8W-9FEv$QqRyGR$BXC8lK3sCd`p7$g*JfXXdD#SuG?asNm|6DQ#wApDnN z&q73Mce_fgT?vqLENO4bWGsHIR&MliWazs27JS>R(fY=@?Az1H@N78jgLv=RFu&_4 z-4>rIlvWJyosV}9_TBMP2o<4IM2u1hC(Ec<#zQecfq|_EELS(mR1j*$WU0&2<*4IA>X$m1h;3Tz2`do1gW;s;_sBx8VQZA3Q(8pP$#z zraF@)R=>P|u>Irl(fWS#4lKs6YRO62F0ygQX@VF9$zFj;Kau+|1Pg)WFjKY`lg7dS zFNWRXEz(Iuv|kraPuU@qy-Po`x%sHy?qq0lsfHN8vNI_aq22vQWQyZC))bh$I;nvFx9Be?typf{nzGv2*n#nro(#E4I1gSGV77Ky^>yXxj=ET`n zC*zx|QV_EsNYcayTL|~}y6kV#0ZusM#BiLSW2(Or&rsgMx>DQhQLTuD$$|8r;q_2S>Ze^un9<3b(S?Xe{7uyMrTs+&T5q z5b?Oc02jmQxRV8(LR<-8uiP}yjP!4-X>*R6qq=%(@Ze4!-99Q1kikPY8%-{pD+-y; z_c$ZfbX?#iAQixaM1nlv7SV_Wh6liqyjOc<&P`BZm(k$N^B9A64Au3QS|wWt zB0FCKElck%@t?3-AGPtfk!i&{AOvQ~#8tr0(OS}1#3Lj?B@MIYi&sT>?nXaH%?-8T zV7nCQ3%X!~Pio(jmy(<8fNVG1#Pa=MmQ32MocWR+FuPdAgRV)-ep zeI2wQ}k*(S$tVHVSf=UUEDr*Z_7mOR~~ed->i=@k&!OU z!roCB6LWFob#)xi3GvJ15r|Z?I4K+=ks=d#v0?^S?LMXf%={eivbSJ{J-v4?ZI+@p zjg~~&VuE9(Z_{u%i!_Mz??C!s@Y+Ims18oU;iY)(r0-ID#W3$&=AF$|UXXJRbYrF> zgKQ9BQ4~UeB14WhP`*3U8_t3QPh93B=f&2@R?b%dPVZ84C-YHncK`?=Fk;WML0F2Z zrNw-qkMXu4T6Ie3L|XBr!xW;^_ZvpipS!4Oa&-$u0&Gg#X`-19@}k`zU9?g0YO^A6 zxsEN@fy1d^U9M}(bwN6vRF^xq<<7_L(M5H+zAYzns46$IJsP5`?X$kkLc4VmzZDybL$KfxKSwloDclone2;KDOpocDRl$F$>`kLk-fT9#I>qbWNz}AqHQ&UP* z;sUL%zsdFooULVd1lENOkd2ntTrIZ~-Ij}%tcJFi_}sI0zm0Bjx2#j`!qlvhS)$;$ zeQJ(dPCFVa`Q|umy_yZL%kJGf)3cX0DXCF$08u!|2ocUOsG%Hz_#5wucy0VM6p{Sx zkE0BQoZ^aeA!|bRq?v!nkC&IZF-jSy+ey#qDCe7R=B!C$P!jVo+4A=kqG`k+PZ(|qdS^ZhWT5!S3Z(;_=Lg*CNQROBX4n;nhWLLbq1n!2aG;oM$ zMVQOZ5H!jeP#BLR%P;`k_(t+-Ffk&wladTMIc=0p@`*-lbA9E&R zSUVt!UvTBB4mn&JjL00R8ep;|i$___D%A)OwB`7PS1hvfBAB~^Hr`_M1GhAUP*?Fg zfG(`hd|qFz-skYG)J*~qY;;<;jm7PEX`59421b9U!dN)zP1?1U! z5S#* zyla+B09}k8(_tJb9lQ=h%{)0xtMulOte&-Qq#Eg*Jplp)JK;dzZ&Wt!nsbg;)>^Sz&$na5ZO_;7q?>Ni2(OAMW2c5*1zpb9 z#h;9(O!k35FkCjetl)67P{)UzCDa3sBVI}V5SDa%{fTB5*?>o6awE<~(OepZD%c#a z{9S^|0MELzv4!AIXjw6Ps;Z@Ac#_7fn-tkUrWvrkg=TyqlR1zh(B2q@ske(u-z~oj zrsa@SAZ1y11?!nxIpM3jGS&z{JZ&pk1;}UCP?yK^KS8(nArt3E8w_=S6j(XYw*IKO z5fA30=Qxr4%X)BcQPBX<7T6vLJqLu|7^ITi7}~gk0fV@~-!z_2IC+}gdKn;w)`^Dm zZ5n81@lz!*sw(zvDpr*s8un6y%nK3t$@@T6<^)N#h@cD=Bwl`?#N!1=K#C^o@>|D< z&W42FC3rap$iCPpT&Bx#u3wdfeU{_3>89|w>?h#PEcdCazZll6!Y!aQqq%SkT`)?B zRl<3{qbjpfQ8w6LJMGse_wJSIY)xH_ z%>w4R4^TzV`VBpk=Bmy&l>1oGslsS|Zp}VOw>=Dk9XKBpYd&zo?b(fjn(Myix{*)U zBhB`j_5D&ibPOSZp4m4XAJ)e~kS3nOXqsi^wu>L(f?%ZmwbWFvu^JM4B#;T(wx~cYMIuw88wI{5rsVi$&vA5>}z3er2g7+e_e7-V(UH@N^dv? z*sG6E+i{ShW`^2N0n71*Pjqdej|g|xz~v&y_bq+%w+>L1HhwU8v{{$kuj6; z_7FYC`VzYFuUkzAeq=4M(6YO$u$J-|0lzch1wn-~LA0#8<_}DFd6OF}*8J8h))IbN zM*NDa4))bVu!>ULyJS(GxdBUiln>_&??O-l%$G620kdl>$!;%lk3?#rI8swi zn`6({{QMWdG5d3(XM+#vcb8mU&q{NJZ2YfaWP28#4{Y z@=w&D2E1Qb7iZ=PN*i0ihvwys$N?eOsD07D|vaT42$lo z$oh@44#whg0oV#-EKCp@N|7Qwvqzpk3NAFJqsdThkkC%i?SB~G=xlsRS_3T9a<;t9 z=tgvPBapT^Pg-f9df-xrOQ^#h13hxhvqQT`dN-VhlUQtKQvS9o$Eva@)XbC3IJk&o zkxlo7KbK>lv=K1y?2KE&%)rU1ZW~AFs}L^P54ksTln@dE*!T3(&2!N3)R|f9TcvLH z(o+=IbU%ktL-hGbo+4oTqm9y($64*9{n+%vbX9iHDQZH-lSVvLGuE;R9eMyGkAK>p zURUQbRT~upxBe%Fc`09Ij_S&KrQ3zZEZsRrt$)Np}uvVcMD!a;XMCb-K=v)jj zceye1_A}zQq5UNcN`*Hv>Xa5rG?7ILw=Wy_kpS)SHE$6D&(Y{wrIgv=*iev!*;qVK zA1J|%s$@5hI-v%#at+qZTA9rdXca0dB13=`MMBI5kyc*K!7T^D!)AZ6RqWDS)P!oo zxf;Uxv-z)W!W}Zj+R_r))U7DBg?;puth8>+>Wv+VgEPbLup*?^wb0U0&0}BDid^K+ z-OOrJ!-hys4sr%M_ufE}ui4Al&SqggkuWt*K%PTxq4XYad&T_BT;S6kFwc-`gge+= z?-ZI|??jZZ1m^*z>u^Tu9nJL+1;!xsr=Hhb% z82!RC^gPNSLT{?at7t4sh+BRBdE9fyGovqpf1`wuYCoxmPe(w9)Alp~7N12T7)u?3_5j5#qTGGxaIJj!H zX3S59L&uy6jlg&oHV;<2)0tjP`{XMnVKm&>1Ma8-Hl*{xK^PJp)QUo%s4^3iiC~Da zdmS=vfgO#G{uJ_=8($Di(im!}b*Gz2!4-Zi2t3jVcU94=9Gdl;Hul*TK!M|(`K~$a zngopzJ1z+cmY#8>=|kT55-}`{E+aKi*9EIRIHy2mFKh-|O0Gb$&LmeOoc~zGN9F`z zU?Ouk=s71j@bGxRaeF+j>DkXfyEVF*k30c{M=~=0ONdXT_oe_yV;_O1iq<%{N+;{E z)te2`M-fom3bENBh-4 zID;q~_OVq}jZ*VyJv8h8W0%7!uwuR>=J*OvP6v zUBvR5qqKIfgb}mCXm8`}YDjrGT^8?KNWJH#-1eRr^SPJ>l?fEy%cUxYFHI#c{6UK| znH3LC$z_>HHQLF&qPZ|*^VWugGRlqm1Hy;PcgMqU9L;|ADwh1QQK&qh9T6V*wSFZ- zPJCP~OODl4oxs$wLYBOZN1s#F46KoABu=J{%2`Q7v4;*7{aWHXAMHeA;G*$KO@e?& zBog(F{sao!CQUTdIvtelYT(`2?6}CK&9|iM>RsOWIO_G==T$Pcp29W?t42Z1u16$! z;A{{^K`=bjF`9=nBCjR3oSr37b)vV(&DLxZiG2G&4~z#yElrrkAWY_&6LUiK-TcbC zk9R8-cPQdA;(OsmgI}XY39(^bN&ZSn7jTA6e2(S;US$J}kj2xouq-?XUKl)YZo6-55sr1&uUHs8rgt>jZtpy^F9n8nOm8#l7DN-}Qt(fGKsj;{7YWI)7J7U)t zh}k8C=EcF`>#gH25$V)LMj|x|L1G3U9-wrTRV518Jb8R*G4vH+H3M6@)Py~Zj{Mk+o`{(Ctx9c?&?sfw*6)aO(0Sn8G zcu(5%7!JiRRe(UzsE0Y%dSn)!?zi{TmbyRXm_hq8OVWGiI$@x-*LXNx7PWEG7B4}_G8Vnv>n;sTcuNR!xF*7x+ z{Nq)CDsa9gz;>-APo4WIswj;35O1~*RVogxf>Ia3`?{NwtwP&@F%7d4}GL&!DsCoe}Ae>F3-a9 zcmv9d5@0$|r~zU-s{ha>_}&tlKU%#*jDf}!1=;B0m(bL2;O+bjy^4AidH^a1?4m9mQ~x^$!5nRSE2Xq+@e1H76LuX0$w zmIx@w?6`O2!BW8AqFcUP3+l?RA{94R{rvr9vn8yAaW7E&}@t3~F)8)>lb$#Yjmy$tj|xUYpbU_ zKfN(L;a0yd0DxIulLr_=Ocl?#y_xZ%L{Xf4btR!hnIvmr8$1`nr`wzQ z37Y!jYIQ?h-jBC8vWw%X8_x9h`X_ggA*-y-k<4%$#qI5ELpuw1ZI0v;;Q~sLwb{3) zyoilriY{L6V_rogt#S~WnmgKM3*ke z|1ljRd2YLAmASAl4x{v_mQKcjX^{`&;m9kOsDeVe?Sd8We^X z%SGwNQ!a%$>ZfyIH*UE!F*<42R^QoM+^?dm(^-?N=7J6uG@M1D3Vny*xZj($SCSK0uM4Yt;oXNDe4#VEx*84^G~o<+CBeR; zvwI9Ogxg8LeS(|{3u61xqqE}Q#e6?g}Y4_>K z{E%@Hp(JgrK3Hw0!rzo`eQ7HRD^bs@8n$y#b`lYzIP8ISK-XE<^D1qlw&N6*H8Qp) zlkWM@IlyNwtYv?J&q5#|59&p6YGk?8%5rrxz=BE=Yk+K6gW%@N|EhDuWfsfuTo;fQ$c9N>D71$|6jxL}~ zyD-vVNvo|Mkr!jx+r)JY&P*h&UsW3otr;PaBb?Blx;Gq%`jMCoP8V~U_?^%b`r0c@HZtJ zJo6y*3ygI7EI91=5n1j@NC0)H5; z!1x7+%${Kp3%x(BE9Qb@G}fI8ZUPK^F=_fcxiF#vb5YxYqhPy&%NKzoFIeDNN&br2 zH#y%XNeg0i2kLN(>ZIa1Kb5 ziSV^SGPUEqQj)#VcTs1>wkoK=XnPi|T*B$&ez(GwiR+?KlJ&+7QZGRpXuuj#Sm5Q+QV=)>u@TUlRO;emDKgXPL!(WMktLSY-8Wg^ht+H7)=51eP zKpuUmL)#NKVoh{y0%7E3Hkq|~5cw$^H#01}Jp!{)#A*qJFzj)#gkZB+bdAW$?KlgV z(i>k*KFylkqr1C*D@JYLlo;Q6*;%+T8U)0g9JNoK{^*gutltr5b2y;4>0ZtYUzrE(pRv@ z66#8f0;640fw+x?BY(PS6d80+TA9vK(McCbQ)o*-_r(Ujpe!ml0DL5=-I>NXuwa)J zsp7dlYH}%xD~;bM$)!5KXMYiouc#r7r$~4Gq6v+OBXYOdfD!=KkwJbR`Wqz9MO$`^ ze|6>GNlmit!=?-keA}m_)>LsaR@mU2@Hv4-t4i@DY+4dwV?)uacMechK6Dj3$zR4` z&d50RxV!=eK||@Q!D6qR@Lm?A#@vvZbEsE#`r?Y}sm;HZDteIPu+GS?!fH)@6lG{n z64O_xF_RKssgFgKCWq~%WPE|m6t%ImHPxBpbXpvHTV`%ml?K$Xo92mp_&Ah=5V6lXBAUu2__`%|#*7K1QSMx*(c)5MqV@2VqE9 zcYw&@Ru*hOeX*-0&p8&i?ZCDb#!sD%k}u|&RA_Hko>QIXFr3^RoSI*t8eK;PAY7

0AmUWkqWZ*Kx7sh5V@hWRL*sqmmSC?k(7a|^TMzMZ>oFViy0s`5I(*bpGMBJ3Al z;W@EZY_C2EaYr!?rNf^%H1%UR1*%UPtIwH#iRf}r{76mAuDGZHppeu&TTN6h4pM9& z9_gk=q<$Yv`~BvE8VeRtWOe+|@ogDLW$4l(-AIC?p9PF^X!S7U=sXKE`jmzEN3;-R ziG!nFXX}^0sT--Yb17;3s_kN&$b!Z&|8U_JC6tl0wNS!Q)LC+q?wsK{Ib8v2<>Rb!!7F0jDz`&uPcas77=l?CMVz@G zX$`YcwR4bgf62zfA`Ym2`_`!nf{s$l#aO6Eij3x_cb=fMHfyV^&1l#PA}?2yRRNC@ z-TFk3Bx_t{Whdo;6jSv-64wZnGTqgkZ37bBKhc-apn* zgWBy7IXsdz&;+eWC>IQrLi>RO34tho!V)X4-4^H;+&+pEO&UQIdy4>JgYa=m^E15l=Z0((5 zpKrFFKl|_F9iO2(eskx}>a|H#ZR9{_U`U2#`Jg?%i7pmVSo3jAtt}96Tfn%Y+2ozI zZ>ZHl=!HQRT)}0oR^5MgXZ!oD!_#NG$14qG}sn-{~3Ea zaPS^6IBExSfT?%%KQLIRiUO8sqD)CK8%(;>tE-!2I*b+vYGt4_Hn}@sf~7vGIzUk z`CvN0KS0cYG$9T}5sSXh+FbyJm>HE4&*y~<@vhSxkWUL{Y3HiGcMc6-2v)kTZKoOF zK=SH<6Vqa!ukd1=EL>=^#m9r>+H5iU)g$Bdr;fQYcdinWuEc<`V zA{1}KkGi-XD-HomEQt_fA3oybh)sJ}6Y_cy!ku<8_e+ngS}E9bPM4BWHL?T}ZzJ;8 zMHXJ$SWUxBy6Inlx&9c2Ny;XOkimr|+pANB3%Om|#z4yuOJ4i9JC#u+m?144{c80!6{ z`Cv`u9~oSm4M;xTx?JS`)y~N#XOIvhfPmph)?}v4&TSX%L6D`>+o;RFU5S>D*MKde z8$yj1FQWL;>bFv0jch=90RT z-lpt$U>96TKdhQ$C%=8k7qJm{N5@AnA6^pR%N)a=bYbvMVE;{M06FkF&w)lzADs<7 zn-fx6z#?t!?Y`UxDv?a#A3gJ6qzUF1c3Y5crwAvU>N?1wrs`s-7}z;cCNiyP@4Ge> zBk(xfFcqHNT45U1xG2{sE{5YteIMW7UL)?LU#>zIf34$mi z#T_13fPs@x*4OEk>#+ZfuR_0Vok8^g#T?XE-r?3QaX7h-Dh16wOMwG6Foz<#4G zCN1GfQ4iJK&uSzFS215J0(R37vkA7Tj??jm4e~)?lC8&C>A3VJ1%+{ByG;5uA)PzE zL@yvz3;Or^6CEY)OgqM3d|r5B*X+A%1Bx|2QDMVu$)8Lsj%Tw45-4Cqet!4_9)_eJ zdMTB9S}L_#QEIbPs_Gai*Za!o-I%mn2?ClK_Id>z1igkM&8=kWz#1M(RrsQ>=dgXN zI@|;61zp&C9aLN(<=(g(n3W+L93PA=cPgriUvBLaITZela3nRLpx<)H^(^z*ped}0LWIXrZdT*E;h~Xci|R)l4Uh5pj72ehXl6PcnxQ#%4+0=%R|2}onW5? z5hx`SFbRgjn|9t*Yi3^=bZ6a-Y_Ok%a;kM3w+!s~8up`eB`$}>Ec7_EXyL>yw<0P& zS+UBs{L~VXrZ^qIfI3z9=`^3(uBp4>8aC&NbaG#NTh=sot4>NJv&`WK)_kp-+kiR< z3PoxcmqjFxV`IK4J%KD7+%V`YZaCzRM%WC0N2CrG!BV<6s6SG9FjYDvWQ8p?IP;Pm z5UJ6I5kWd8uLN?U%R#VbAE83BDixTHDH|9`f~83kC6$tR{T(W6WGpRBVTG7ZrjLB1 z3$t2=ui2mwS|-*cJ;0?7j0v@vjk6oavy*e{2Q{pt%aLX|wN3l~*WT5(ws8bufA+7q z3Yyr7rO1ksfa^Hqtq_Ql63C}QjclDPQTb#fD84@1dMM+t%BM>=pLd`Ax>XQ_G7L;)kem1 zp!XnSi0D9%4f+i2@hs*Sv}@uZ=r;qtrK&%Hqf;KZ%LsH} zMv$5B2w#s#weySBxJKBDB~zB}FZ0FhgptM(W`xq`$s?S!aih)QGE&01hNvM5xz8oG z+oW@4O@J>1qgYtCdk<$>*Ng~{XE>1w$&lw3V?^&m2NwZ7!}w_254Q8|R-~m>22lZ& zVZZ=>z$^CpT#*Ow#h9+DuC&|(4;|qi`dIxT!robBLNZ(p=D$*aUaf_UPRYbZhOW@C6|ip$)Hb)4B@OJvgFqzlD$>lL^UEE3-*l z$dHS*uxE$a{pz3?cl>xt?Et;qbS*zD8wH!HU}@^0W^3sdYoT!+gd&UzT|gBCNmMPq zR`yqFY?8f}HYfZIMc!>DY{bAs+OOGbiYYp~QGrHB@L4U@O1-=O z7Sk6*^FZ^_M3t0h{cxOd{}c|aOa&2h;CmzUaVtubk%aD`L*ZHplbF<#^>UC3*{}&m z#R@jzR>XM`6SC@CG5xl=;}mSi49sq&yrGogDW zLZE2UcJO4qeifD->}&Aql_%`*bSopCz)>yRrhC_ZNr}C;7Yw*%^R~}EyoUj)IWxGd zoYyp|AIg@_UMx?6=?Q_K!@I93T1c|v&u{~w#(y@ysHE|f@7-i14M>$->LEBTq$q{x zT`OPn^~0-sP0awyRqGZ4mjAK7CFxDUd^o6u74;1J6;jK2hRJuVV&SvGN)iRtkk;Br zJW0pEg^KTp@YaGEp;7p~Sh5n0Wvz61o9C$UY9nh^;NOMokRzE3%&xutgOijvXkS)C zFuA#)tpZz)XxpSIu`;)iCZNck!bYcx|! zHhkLNdd~??`a`@R7Q;Lg5)K#0C_Vog?HMHb^HM)XlN#n0QR!+k$F-;!*^E%$R&LEM z3-ua5>%qcQAIvmQ0^U9o|ItvIHifU>jnskW;tKpi%stI13rv%|M`i*MrM}LfLqoEc)RMz|np^sDOY`Aw>L0obc z0b)L-_bCCGxWr%@fF~6K<7Ls#wr_TLqZI);tcH%34+Y9b8HA zW{^VUa62d4+BDk|Ct|^H2KKUg%59$*%>emH)yoRahYWJ2Prk|CI+ek@^*sm$!VK}fc?0_ zYqmhrjla#R78E#&BTG5~KEjW~Hg3s?4vA)zu75(0=EAgsHB}TJG%j^^ux48LZ4K3a zRGtpw2O*4R-2@PW5Do3~*E5W4*CbBp(1#ljy{>yp0~&A^2C24V8GOt2;pq_H*_yCx zQ4JEvY)_8N$2)J|Ve;TIu<5ix7BUgwO~rF!!dLe4YPW?o#1jq}o00z~V>1XTnK)3i zpBVneB_UcHs8uc6-aaHYKp6122-?zsis9Nr3vz(Y0R{v4{MNbhBqLQrXgvq?X7OCo zS~_IG_fZlLNm|KrY|WUZhcY&Z4;Oqpjqkk~h8lyWcEJ_EHWsk4rD_1)(5{dIR+gVQ zYL;8YBeU@1cgSVNbv@#y8Wd-}Hi?PRD zY(RlO?>81qy+k5MZ2TE?6y;rCHMkv&g0Vk@Bp$X0Qnl&PcSRjPV;3E!H39`8b zE78E@53BrBd5P^}a{eo@NucHY)q*Kr3n8sDIQ@2jsnD%C6;3&IxV*aNR5;~SS0zJE zg;PnT#r}cu^TbyuhIdPXc}wbIdCqskDW|%|z=`fm(tvL!sc_Ee@>)o@Z=RQuX?Lb+ zU?f~>I{xBoJ|jLK7@>nx@to5^`EW9vnp8wu4+0oU-c^~W=m%W^D|Paz`E3_%C#n4Z7FvNw_=UC7DRPaHq?FmL|B_UEq5m9?r@F$M)^+ z=SKO0y)l83FpAzMJymaz0pn&;Rh)#ZX7?4{#D}2(Y}GmIJ`G-MHWF6{mx*MX%d? z+}Yjz8BJ21#HLer09=t33fMEaxzgmKtk8cnuFBE8V|TQiBRFc!?8&~veewYD)8Xvm i5dc(IWoLYIHSKJB?)KOo+hcp&`SB0U%KcIR@DuD2pZy>@ ze<>FmKC2{kVvV8jVH}P250y_Tt2kLa{H5BOrp3 z84Z6XE`J#e&kj#d#DDE)Lx3l22;oQVB%OM3{Ng(HQ_nO;gp?Q($qF5UNJOzPEDdP^ zs`|m(FiQ16P0kX=$8d1tr+zqRl!?&l^2EY(!vuWF z*_lZs+)%8-sW{%0DO?`jBrF)|u7WfHcOG+h_kKIq6B%6ZH=g6OmAc7bGweS{Ed`qk+t3@W7#$^)CQV1e;ujgKBUcQC+xX)-3 z)XWVMZv*Bq3R}x4PMLj$joMXg)OSC&g_k7m95Qgn(JGbrSRP9+#;h0Kv~d|mi)3C! z&z(j5S}j+J7fUo1h!0Q*QqX*WQcGGhZj+c3KS_M>v)2@&&nzzE2vc1o7^%fZbD*Z0 zw{B`ixy>qQ4<+-an5FF57oi_C>e(F0w?b+zRLk(g z)QdwmFbez=m|7N(#3JE}f*3(+guyM%PF(xxmDoc{j9 zW|=qZNNv`}G?I&vcqteTr_lnB5RDLWWo6&xjisM%F|&o6UbSVL2Aj0$B^8%3WEIDlp;&^@i;v-Bd<@ZUqdoZq&23XZwGDdnF{Fto zP4q)Qo#62k*o=}kKY~B`GH{dZWj0W~yM}R2eb^L+qbGo=cataxyh%ED<1wgXM7e{c zC>6w%+82Y(e3y}i)a@~e8`?{|=F8W{Y!yz}x*bbMVJ=9pP)mYSimvoh%bQ0CMsog$ zem}7e4_GF^kzvNYPD96zk4>c*cQ|&39xmc1td!#g4<0FjjiI z^sH4#D`Cxo2y@$4{z5~QbijiDS%+ss)>c?pn-~>K51UE+%tEsf$iRe8#c|f89+Sl3 z{L}7`#GQXS9lgAn0N*IlRl4H{&Ol@`BSjWZM5o>9?e6Y!pY&WptM69ZoIuK{3Bzx7{{=Hh5%) zLsZ5*C14tOtOhbW*?LPs93U#2d=>DT-KAiK6}`0RUx>#b;dRep)HtP# zYKT%th#G+gB7pRg3FB4BDF%f+FedXWFA51urp}AtJxi6ta zMmoT#FFnMG53NK8{EB+5}L71#>61sFuhD)!dIss&Q+pGRp_5_d*7j-$A`I2)vZXBA%qngy<1&@Ji z=HW&;H!`VW;_2je3?qIWF)rF=z;oRMfW-ZeD9oN8aoq?1fY)$CaveaqP2LGyW8eWe>+=#nfJ4)%90*k4AA8QgF6f@_lk4bnzo=>f~o;? zFHR`2L~XxwNc^L<{w9=fnq-TKHYI0QQS`~o{i55{27&S@ zYLZcqn6}y3LOPRJ$pr2ld+@XW*%R1xi9hvZd`HGQ4_$Q*kfnt>hNuJ)G$$ihJ5{Po zT;$9LtwL}tAckuIz{)2iTeHsYasMu%t7$R1yX^Exk2)a|`L#Y{pMY zzAC8{(b7Z6K#G#3qjfmTsc9BNSUTnBhfOq)$>wBOz8to24TmcS2+Syg$oDbNSbN~m z<>JDKeI^GdExF3+O=?gM#C_ZfU0p|clc>R}-FRFa$JPRVL=#jNcSk`=Jgj!Ce?;0C5#7$p*v+t2(M z{PJWgud8oyvQYU`IegdvaVbTz}FnczoTO>kA`(| ziZoaWOGU)RIJZ$KY-!ClWqHfWie61^<+8jj{20oVQAN>hXNH`S#_OJW(xenIr(ZzV z+^n*NrOh6(Hu)^1`Y^cEVu{hvN!D$IapEcsr>-e*5r$uk_R!;`i>+uEwjUL`3izjO)(5MBGr zc0WAEH8NOrK9o(qsrPj$`hYvd#7}<~*j8M2r9$<2m#`HG~ms(CGJGyr3flcu1HR3XjIOVh-8D^T3hB9-G9;6{1wn;&YJj zmW*RUM@i!pnHKgs@VE&2mbcl-8^!t8bQDAu8)AzlzDvGr8ckMIfOpv^%jB7&GGH*y z6pYbiLQ{`x((L~9D>l?rP>MZS`KL2C44MS1spLZs2>gYws1O1cNJ40_t1RZ#qIk!j z(O-`zw_J?_Ke@7iW$F|9@hU}kLfsQDBsk3GDIL0a0hN}PbnwD6&N<{UpaUdJ5^bu4 z#k8-lpoFFQ&M8s2HmVS5vM|kUwBg83_ zY~e$7B1)XlYAo|bRsT*~%eY@Fy^ z?Vj`hpnCs9X4QY`9fLdXf7p)mtlL??|6%|C{g3~NPxab|T>d+*efTPbR~JM$dK&HT z)5)_64NQF~2$ROHxM^;G48>1B{lrubIM{OGOFknuqk9cYva|j7hwA9@<;#~J!|m$r zjC(R)`Fbe}%CeS04S7+6tm@Q_r-Dl~`nZ#$d36Co)@~G*W7wtP@c4|bf*8cC7jm^( zj?IW=sctGGJ2Rzl+$mJTQo9{eZfd3u9zg98UW+Hf<{B&7J}5Wqzw?T4QTcT}Y(UG-v(j=d3m8Asj9%*Qea=M7AknW#0P z7GFeaR%sbUlsQ?|fL-1DSd%Z&CyjV$3&N>?%oxo0+uvsio|1(fL-iDd8KhRVZ^?K`#sCCx?h25 zBMyj7@4Uk9?ihTv1oqkK<{KiF*4dW)rswvBDzxf$=OVAXu2YQR4v+@4oHe!~lPc#9 zIPcYS?uW!p(Tr`HzO#Ay3Q4z)7fbBa33A8kZel6+mH{2&)lRJjUH2i#>IGGc4b!xC zHeq9_KXjsmtG5Xkr_f!|`v#$PH*?0=THU&ZybE7XE~&nkrCq^x9Kk1h+j#|tu3nY* z9dP33S?6mZoM=5mk1QBwF+hIOo85L}|9(~Q~YVAd~P|FElbOsYFybD#>WdU_NH zsU8l+q;}G@ZFR4rE!WXZi}w*~R$KDfazt6E75hUt3Zm6-dpzQ6^B&Z#KZRReN~Al! zlPC_UwC5&Xawko@;65HsQog-sI`(%->LI9izE4mYYJFKWQ*nI~*wB>D&(&EYdJlv; zMoX?Db&6w@-UC$emF7Yy|{#r zD2-RAM}4Dt7m2_NcJojKPq5VbP?PT3}s*A1^E~f}&XFzyT1MD1J zd+`!XE2q>dc`OB#`v$q2$f)dgs(#|R@)J82#$d>9XOjb>!~04YWw=3+OJ;KwUf$tz2>l-U$Z3O z+~K&{?#V>xyvt4IL-q7Zk+$Mm4Qa|R;`FU-2K=3eVwN1kJgz0&SpwN9WRR47(`fOu znzDD=JL^gN-8foR9Id)SLmiG*j^yzg5~uS(EM1M`pX&vWhu~0Z_&q{Vpnp~_6*PKZ ze3x|Uaeb?d)&;?~vZFxSou>p;TM$u%{V>g`e*Czx+SP5#Jdd=JN{p+cCy znMyqkb@@k8sT1c$Vo!>+%EavNrnXUl-$5;tU!`sVbDY(bYHV#qha~ySdq(EIwM(&L ziM_n)(NZM^uKE}|hW^&af^#^1>F3g&PD?k5i*6EzcHtpzBX?kaaj7=(M2zw0s|7Uj z`c#H!5q%S)t&NCQVfhOJ?j2|z3nxeMHIsgMU{4My+%YS?{_*bDt*(5p#CK!eT7MKb zNmXTZWy-b0I9r^XLXGEE)p%@KDf}ZV@6?-xt&&*))=5(#=xx#0ljw$(V|Ia{=kS#kU=$?k|K9qY0IYSAB(W75Z_N!ZH-jA-;t#DL= zuV8QLo2p?8nT$`D6{h~gOX&Nc(-qzC;V;$RL((ou@IDp?VwcK84;?@F4~*X}k8k8b z`IpPfAl+yc*$%#BJ1EVUijQr}?OJYc&5qe$$)wbT?B!wIhYjm}EgGnY>>M{!KKHx! z&bPsn_EH_Oh#=Enx1hjQG5y&HPdeq=Rrt!Ofm1j&$PY?t(GUJN(cAZ;mzVlW3F>C^ zDN8-18wu%uv{lflP`v&W&FmFoV4=Znh8|B%v z+OIx-6q{7a(KQ?$sTS7f)U=!Q+bMoIrF;T6)(6A)k{aAYs=I+y;biThv|z&?LaY0L zX%+u}0#e<=IkM#Z?4Tllx_QvSB9Ml8VQHn)Y@O5g4KHt9a7}AVkPe5;NBLtk{++%g zpjtXyZd_dOp}?kH;}k+>iadxkf@i1OGxpTk9LD^6_+TmpR=T~M7dzvHZ$FfIxr>up z@=hIjMqH*?T*=EzS=eiEHdR^1ePdvNEE5FSI3&<&>bJjfX9{{Q;;e(}8?e0@LbOY0rDr&MmPJe8%AxB*?Pa@uJfym?0M@ zHyp13B!bwD#?vtxLM#KP6cy|G_xm`mg2@z^Iw+aLna7*;W-ZY8W5Z*C*TtK1S+T)+ zg0xNn+R(rqw{If zJkY?+qha6~M`bbJm8Y=v2!(RixAoL~l>vUinuJJo(^W0vLl{}`f14n}Hg1htp$fLkKJ+VC8?T?C=Nt^FoYhr=JKBMgYxx&7Sf#6Z zr_-rgs?8(R;RctUU|XwtJtwlItt!UNvP2*>Q`RD<^@5X$6hW=7rVe{?iajw)<^(_w zPn$7ry_obuX!{k#r{m)7W%N|{JC2&Po!1vcWR}J`QdyA6nLoCX#&0E9vEt^;8X1-I@5$*w|-T^Rx9u=?Yg zb#J}*u$u)bgjL?gY&YEnp;l#s&u&_SMwjNZDuMB#IUDplM{U4pd}26iIq%gA{HpCS zO=;~VrVh=EVpa~#iIeJZW3aN{mXItPs1`M$$XQy~Z|m%XZ390%mD(>Lb(`*5M1>;P zELUiSa0*+2n^QJoG*7DUDoTePqQkPBAuh^vO6~&A9O`&LXb4UJfULw)&cZ#~9gtx{ zH|ok;qt~B!?})RvEOCrG0Gac|Jc#+*@nQm4b;1duo?^q+7QCBaXHCiLcZuEYf|a;iDs`Co<}czSy^FRR9PL zwbafkoq;_~&(vJLk^qOE1=z0*Yj5Rxjoea?=8N)#oK)Fni>BCMmF4PKBt~FoNq$TVNZ)` zn%l^0w{QP(U4uzt8JaCU4n!Hw+x4J}hr|cbkK4G$h}GyagdN=4#exHw5pI*c#J>K( zZilY$6yTwA(Cy;&DnlaDaPIc+?Lkq%$R<|41IuKOu5=VL5@VRc_|-~|uNunCH)~;W zI-?Nc@hyT2RZ%vjRqO<~+@%cpUMu(MN?DE%T1G!bdCZdxU)56OO;cjLEq3DxK@jse zYOLMN?_lru@WQ;~h|s8?+R+dQUu~$0{#5K#Roi_fQsuXPv>O&V#D`i>58qavNJ8@$ zWQO?Wo3zqz&FqTvR(XeF^YB-W!4O%@Ee1YnuFUO_J0UIm7Ej`y=9q{OwXw(=8XhW| z7Ij^zT<_4aPt>NTTujk_{;IC{B)Wsm-_H)Z4)(fm_0O` z-eFi=XN7pv$D>YFyWR0?kx!&or(;*yz|Ss~s9b9KEE(1R43GlLWJN5J3NKja4>+4c z(Wr^R!PtpUBXEV{HWS@y2w+y@s;r7aR?s^(7Cy8hD{S$bHzz|rPw8r;EIu9N7)zv{;eqHvzFLjXFEAPaJvP+7 z<{-tnSR59JlXGje98V_zA!3iy%J7Th!n666Glcx&m|?W7 zpLH=F!FyM*U8FYEQk_&i7PTrhpdN`aZ8vRHI-n0l$F=I34$ur;*%MM&6X5kM3-nA~ z2VqLKqKBvKUxplBqW>Dy_=~Kdm_mG;rBG+%Rc(KFM;Ch56mEZe?6O$gq`!4*YWI%p zS39!*$sJ*Ql(gf!-H%&C#W7U<3>cwa>J^$`>m^E>Mj^^A?9H9tlc89Ep0HLQb zsHosEj%;y7`isVi{brDM-n?PQf5*B4y)2D^#Rc9EOyuFSRuslh&oM~aCo@uVuR93L zT*iLa6d17w_&@VNPRj9g1eEpCvGFn{X=iHAZ#Du=eR&$Ch98WGWzogQE1#a{?Y*g0G^4|Wzz58E0xcMgl(912p zuwnueSqtowTC$A}GM2KjTe0Ktkf+=FqFMZ&lJg0t{i!`e^MBowPedq;f-bI~Ixl!B z@MVN3XJ`mBTXo;Vx6b{uV6A1vJFvK74b1zZ-}?kWy;jjmiiBL=>wt*c+>N^CUU8J2 zK*M&|Ju-{q_&D;NP?Sd#ejZ9dX!}eevG|I%B^odsiFXN~xW9Dm^Y@p``IfsbBd$N6 z?IlhClh$CwD=pId_4-X(jPWF6Ri39f4EKswSvzkp^zNfo0*hIZ7ngJ%8W7+a+e#SE)dW;m4? zsYk#k$+F20?zv8Mj?9eh!nQU%tprq z*ENZ^LKfMpQBG@$lZjik0^1i@8BRiVD-tG#Bm|)+>o9zg#;qO zW(Q*>!X0bHP|fUg)2810HQma3`*n>Ali)U8sO)}3mZai*v8^NA1#HJCCwa zGb#~A2zfccDSG9Bz9^uWq&Y-ajOlo#CjxDjbc;b02>;L(%cV6_Y%9ryC_22c3KEQ` z23^jEr$tFgLbdglLuI-Sof(8lQyl^ZbmfeQpbZAB_o}WA34u@PLTlG%uv3GYo#z9HbxA0J$8f&^_Fx8|;FvTF1HB=A ztY(9bNNx3AIsH8&r9E_}p-$&#tk4y!NKBB3QMg$ygjZ<*z|sl=k9Oe>LE)#$__NKN z=5r2oIcc^thuxXUv%|>x(g=2CJ)_Q0{KC`mIjw1~!X0ufu?<&>L|G8(ru=c@FKU^E z8?RH9Cl4XY`_a&5C1`&)Gh9u#HB&qd7bt;JBFoaSQxAM9j;;Ew+(*r6F`Y=n>{|5L z%4t0*SR#Lwy0+=jrDQ9)C0 zR3S;3HoX(|vC2IfQDN3x`qaV53O6V#JfXYc*B0@oJY=!coA)er1=h9cHb_B$Osm#8 z@6VAE2Y>T48m;M44WFQ7G`HBM(fa)Sk`Nu$He;$c$h7Z>EObp!WMd1Bi{XgRFU`iL zb_r_+xZD$d9l+I*>i=)+nZq@R zbjdj6d71`vL38WWe@A69w8WN4@no9nQDVtvKS*e~CODL?D=9J7f@-alKVmB=H zYth8=d5k=0ZIbzHddUefqvzkZEHmoyn8OX??)mg)XY+T?e!R()ZMP|@9CKMV4;j7{#`mfb0X;e2Wn#cuaq-ep}2CszqDBOdoV7755NCOwrz=Z_7>Tp*`Ll@G} zg*0?fpv}kC3?mpmOGW=_HwYBvGSG{LCHugPrMK^R2J)5|q@2U4c(GoQLCnWg+ZcW& zcqrQffk1)F)E736G3ca!V@)BNgdv~9IQ)(h6fUy+H~Ku85K&z3U4S&gGeKYIspHO zS=O!e$QA(tn6Hc;Os&R|iQP)*e+-Z>K(W+&x>(d)Ld7F^wkZ7I}E#2b7RBwbM0 zMnDA6ReeLj^nHYx_NzvrIQDCh(^G;-IMRAu%kCJ4Tgq?|IGtZJ#ipoxQy#uIA+N?^ zaPbCJcXJ95t}IL{H#P!x15!AC{*1BlzQd914H>`K_c6wW`&Ws^vn41FR1s4l{4}Twj5ASjapc||CM-eHveseMv4u6R$&GC! zvG%n>lcqQ`(}&c5@qu1sY3R1J1)o$|{`l&p8`aOHK3+5lv5suO?qfH#bNiv!jVmx5 zo))tc@{yd+&z9;kPG8W+;Q4c&%;!2!Et!YhBIm#&nquNzd>j>%6%fIm#OUDqWHmx> z_oHr61p3@oj5W2#41wtr^JNP5tb)Rg@qtXG_pGQEtK)-e z*?V?b%jf_2zENzexm6P6&-7EVuM#H=Tgc<2pWbpkt%)+7ceMgI#9fq*L~994@GWMb z=i9X2<_4H`rk@uJR}zXA$BUv|jzhz!=V3(AUA^y*?E9*l5qo?tKo4lm^P zG7t39$#_e5+W=?38AXZlrH9P`Gu{@yb-!TJ~VIqwl)pQ0bH8a0I zO3K0JX+no{{IXcj+LY*+{l2Z{mzT3uv61K3He2j%YqDp|00-_8R0S4}NZvJ-F=R-k?o#4%xz*I7 zVhgh6deBVfXXUIoFA|PCls5dJ;qe^p7u@|0Q+NoQvbxXRS@zc!)A88Ylk6@>7`1{DcSq$3@Oa~q6VeuMaCm{UX3z0-m0iX{b0#u$t<4L5SrD$J7&9EBjcJoG|$-jjxYG5q_Z*TP8k`v$T|-x}ULYXAHnP z*@6PT0rAf*4FFjZoHTyR`hxANhQu`{l<+4a1tYlQ1ES?@!@DC|RL~I{Een<_ zHN~=w@1cdHDHFSg0mh?)nzYwMZadzLhwByLw(8EH@k90P@BwId3cbAT4Voe}o6c9rNxk{%hre|;8>HT7C)>EjLrKEwl0*v4(;r4Z zx1t|@YDG`~6aQYjOb-Lqe!9Wh_4*KkwzVHBiQd-!d~BC`VYK{2|3CdtT^iY#oO(qT zn6^dcyE&atX3oq=G8jwkkY&VbX6dBBQB(hyW1z32>Tz`QUT48x&u3$|*OgB1)aU(% z@N355e%v04EgmHl8i(+w^5(A+mfY8RBJJI|8C;uRr=Sl`>#iv~2i%$pNhrVLYSFzXT z7TSO?z#uU|tPhACOQQi>1k7Q_mnVKGXbHG_UTh@CTR;tO%z98<5zBP-QO0cB;+Z6y z{gMM$KJQT1IK+8oXR6YXH(Svpb<6p&H!0bwMBUT^a64@15@VquVO&Z%>J^UYe0{D; z!X09{8ec41WK_T=KkvpA_0EAsH!j#o2B%9h+UDfF)PAu%YelHDo66RN8^L%sU!R;R zP^9({FBFa$vpiFVV|sul`r~&o z*9xc%wD#*l5Z~`Mz^8o zxH33Q|MwBuo_wELLdwDk6tKevF}f~it>3;4_ zVUexRu`OIG_`Fom@BA8}`z%Hi-3Dwn<=r1eXvD&a5E4sPq#R+DDORd7;Az zjOG-VgFWuZ;8HIj;$?F7AZrXZ#PLEq`@&mO;0fP;$@prbMG+$UEpLOyf0L1+N3LG^fQ0d=XNl zlm?He^5e))FY2li!iof3YX~(mxz9z$FHbr5qurd?w(w?DieBtkVDJ*Qv>`!+&kN%F z@gd)VR21Q;S*$oFWAyBoqc=Z&`{j!_-yePZ!}I_A>8qnJY1KPA+VHG-e0zBelh;&1xjppi{#j1s=-_w#PxL_FkRtz772Sk5N%CV8P0 z=!No)QWu&%A#=j9WLaaT0suhB|A;tsF|ApN( z6E(Q5D{O+qOil8`C~@w9GR5V*gHi|# z+7wgPfXTym3%L9@)hO`^Q6i{qpNH6B&1qD~6%&gzSN7q}Dy60nU!@OSc9=nevihM6 zg)y~Jab#FFb26Td7v+%9u(T)qWVs&H^@$lemEa1E0MMoyvuR*7-)50I6|J;!olY`H z_-NMyQ3f&tgfPH_WtD?!v_8MMyPn~nYtUq&S_c$}`mXQ;!88kH1Hpb2RCiF1US~O2 z%g|X6ro$BU`WikXyl|3tiDhmak?2NV$FuqQcvj5E8#p`0v(-3es}yEPnv>LuY>w5` zvPt}U$(AK!pU~U66TKGLoDL7#%$U?=o=IJKh@W8oi{urRb`MgeHib%D#`Yf<oFdn~uCk@uMNn?g!DE zwNo9^o*k(ESk}$jU!55ba$7RJm0(J>$TjLas?SSPa~*-LHGr$cMsVt4mRCofHuqKP zG#_^y$yc)m+wf=jhj)wOqUjd1e@wwk43pTjxq?D+b$L|`yX&0hOe|!v3YaNumZE6~ zic;HFZ&+o6TdX(bv@B5GwVq7IMq@tJAu)U_QR^si7jYblNvJp=gHON73O>!`+;WmM zVEEQnETP0CeFSHK$V5LYT#QAg7xQ;IT6-O(aSl|`1S2=cEP~C?VKUL>*nHc=I?WmN zAhf#hErmE?qyxUMK7&NJQL#;*6eU@K03V&8Ym13;W)xd)H1*?S;F0arQ6!GFBfUAc zc}uNwH+Xwiy$Cu233bO;<}>RVQB1T%AIr^q?5I239zH|UwQ48*F1j)hdSIKL)sBJ| zio&DP4Dt&N`h_;1k*+EQ9JlcXyLUz|i`YSWJsrOt zPyH@(8R+B}(nsT45Lzce>0@9`Te-swrzQcchjzFov$G_dJJv&q?D#S|8()x+rd*K1 zZprDG&@-KdMD9?=*sW&X@`g*)SH|guEHTr@WlRxeF+L}91pBtSEAd@u=Xf4p7R_4% z+lI#%EPA~LDydMA`$iW%vWBKsJ!vZy$fKSLnLfX8Q%hJiEn(Y1RZOVvv5MXA;J@|h z`n1D&VBpu?yC$jZ-MjP)3*h5xs>{_u1Gsy)1OM}DuWqQgU#8QsI@M7yJNRE+QT}74 z+4j6CpJ8loEmzV)nKu}klQMaiAd#K)Vxc1Zl^gqCfrVPs}~?yPRMB zi5@d9<%xq3RLIP2Z0_?I-Yw=N-cbF#Q4g~QwOs9=eqnlO5kjwvvZOM5eTBM; zrV#3uO3ooS>ug@v+5Eqwv)bA0v{-V=zmLLjU7xS-^5u=YOa^eKqmGLlh6~iOH;CPZ^aH!MebCwO+;5YV>u#|E zQZeYjQ)B{e$kmaVo}Mp7r+sE!)4>%kSO0e{gW`-@4iUe!l;2 zQTOw8q5fx$KABPUZ`0Gs)^e-y@MKYJFY|xk53KzE_;&P=w%FL7{^&n&SNuF4M^EP$ zmmJ9Lhxw`;QmRK1;sLjbC1u@4+9^ie9vX%W^8;n@-&X?C)GvY7MKOm^Se;hh%CX;< z{Ee0OTpm2##!(KodFJl#C88r(Z2 zzosoi`wIrPx($u)nJeGw_|{7213ir8c0{UX-F4j>jm=9Ex{?f`lHY60hAvc+yl$4` zVlg~5nsS{TQLxJIv3!$5*0-p#0OYqM%2^)Tai%0$E*+%BEP{LCdO`7T0gGHU`HTKZ z7~y}3Bzpo{0Y&;a0%+55v0TZ7VPFL-|1#xcv_tf}eif9K(MGb2fzre~wQkvKimJuO zuV2ny$ra);?(K~X+bklqtbIF1qbKCZ>Sn~BWr1{al>39;I#y29!>y%Se52c)Pe;-{ zn@XTniuE;eg2^o1+?hg)$aST?Tn|s%r1jdZqp{r#hx_*$mJV8Z5M3w6MESa^)fQhr zHvM|&y{GSuYA52q;8}6_m%D$7t(Qadb~%Ta<*dY*Tt+<9l3eH>qLLRcUL=-FkB&ou zy3+IcXbr~`l_8dIGGEU|4;z01PLvZ9d35!dioTKpQWd+KxR35)F|X8e?ia!_B&b2v zvqwYd>rSQt^r$(iqDJA^ViDPYme|(kr(?>L!%9jbk7hcd`Stmjg(XX9yPTB6XjCpJ z%zMfAONvBZ4i*JI=$L$~7wD5k;$(ust;@$|PF6qI1532N37{$QifosBl7w0lE|2Ifopj)rdI1&kGj z&_S{8c(x>KGS%Zshn_k;!ujn-O@;k_l)QYI5ZQ$@d^DZLcwWY^6l1G%%?)-As-|I6 zHa^J-&ry^9VDPXp37zrde90eEIdx~Pp^1w|SDcWe%YLf?h2lVq!E# zbFI0a2ECr^^} zP-sGw93`gy(5Zgpe0%16d+}oP!g=u2wB<6h$IvD|&M6fR6QZZs=2fHN8IACCvU$r7 zN8e*ukL30;Y5ern|NQ0KpT7DMz5_62m~wQ4G}T(QYSE(9Q!P~|Y5L}3S`JINn83z~ z&Gsinnc)o*#YczO1|DWB`jXg<*oZ;Dlvn8uYKz=;_xkPjrfsU@$M}V+PBU^%?KTuK z)!PhUcL-nV0T2YCe>?ZS^YW#KfR`^-+nu`#Kw~ST(eRE*$FAnfyUbJ2-y#0Ne}CEF zpJ&+Kmq@mO80%Kh?#ecFyZ~C#iWV&CP8Fi$!s5!fxOfQ5GqZU6 zkzE$qJ%D08A*zniA#HMEg&tvI5}Oo|5_pXtYp;1ms3AOhu(iw+lAhQRkS(iu*r6sW z6Mzt(p2N)zqk3VHCuCM|kT&X}Gs)Vq0rrbW(m{r1#0$`cbKABeM&7%SSC*v0;#0cV z=LcI}Xu5=AJs_9BUlJ{a51i$Qc#peJ!fT%CUgt@rfhR1guv4~qb&j@l$}j47k>YN0 z_lz^FmA{2qTZJgDcZ5Sb3JmQ?hE~(4bqY##K^i8Nv;hy{@6nM3br_q7HX1>^o|Xcse|8P2cIQ6VHJ1qS*$bQjK-4!ql8GGKBkfh za=@s!0?e{aa`VkM7|KeK2qYh|6*rqLHa9Uf9=~8}O(fi)RETz?VevAGl|gu|NI~aX zD*uObGAd?ZK8b*kwgtgUML6D|`R$u;b|$`b<54GtMRQ%&=&zY6M|=YfH|q*R0k83z z?Y+*s%sGUPeX(MAf5mdDmos4$@Ht&PjyRm3(nq$0kM?%lUoG2kA<2wtyTiH!8;f%O z%5yOtMJuZ+P?BP9d9iKT|26AqfkkEU+n7ol=N;Cv){L#=CQx*{Phj{_-mOJ~)mRO9 z8c~N;gCA3b-&SxMT;#^m)E6+s_JQLcN?7~NXg*%Pfwyl+k%q@iMM&|Nm)*bI6cEKE z_Ccu&y$NM*?&W;wiLgc8Bk1PZ4>pj;)*24Uji@pQuO>fgwNu^uIrgX1i4WsW#}P7+ zgzoUwUM#nsmABVd!T?GuzQLgpMR5dbI`AwjCyVeT?qVM=mWddzuxFAo4-y7O6{^Ve z#^je)c?RWrJIIcT#FwnqaVIKLxAe@FuG!6+ZiVihB}z5uHs+c*)1|Nxuw6Y*jhPi1 z;NF^`sQdhQB9SiNd?O!?*`bm_NaS-0h>X5FZ_5BTK*+zve1;kJ*xB-_Zl$`&nfpTF z+AlADK~wA6Q{$--8EL`71?@pT7k`{Z-xtH^$DgAYsO;rIL`TOY~mSKTpA|L?4U)Q zsT0XgbxsmLWp!Z?{L|`+folTe3fT$Z<{)^E)K!dsBYZR}5&)RSExaJVrtQ4QD z3fd=0|iX=LcO)xDnvQk$qpyw+-eUt+c1tn4p6SZlA6t zC3=PN6@dCEX8F;moKTv}6|AyRjOWLcv!oK?c90AQwBXrnfn@+~83rVc>-x=agB{P} zx+CAgcIKg4t&t@Ta{qv{dl2#9mRq_ZWB(!?JzhQRgGaP9j?(SIY&5fwl#=a2DRw#+ zQ%Bw-C$P5cl^cW{! z%Gl8BI`5S52WygQK_$P5AIexC@(abio5!}g39)9tUT4}+(KwM&ce`yu%BU#o@CiYzC|CJT;|`&tafXATC<-Ro%ySidi!H2ZxN=k#^v zODnmCIrzQ&ixR8$eGuifKma_b|5s zRwparWRqA@x-JK7?3!b-P|!Fd0u)c3#XNBq=`3~ps!h}!Os^Vkbif=hVz2$9d^yR0 zVLhX`-kVfa(lISsLtG0K+oDTpIsCKT8Uw$(S=rW*N*}Z)&3(H#dP=K#vuGZ;Z zSBJzVw(yh=7)e-3;3S|fP0!XQp zVzwbz4(2!boYP@fpLaV4;TOQ7STEEY0P_LqQ|g=$;v`fYW5-^}o;jwfM0UFtp?t(A zSl(6S@p1l2%YH19UTB(LM4qa|%GcKIw%YtV6Mv*=5609L4_i6|fH;qPUDlAoIz_)* z)z1u_T}?-GyQ5OcPE}AG6NTk#Xa2-BjpyiYiL{65wS2h)|+?oocWK>I4?mLf+ zHlI$ChWI*t^6=LZueecLW@=eL+eY%vx1)t;LjkrLPAYPenBiIe#2U} zGEEa(deiS09d%9vP=+dw%)l8Wl7f-;cL&YO0YZxwCop0<;llf4S|YFd+z$DDGtWVc z1N^?nkMbT@hED_vU4ELV&U21{t~y5~mJDz)#oxw@%V+c1$q#T93HjXa`iXaAFsy_T zNqxrl=%7|4dOmNahD-Xq!|FF!c&toTiOVPEvzVD!=+z-Rw}MAh;V~kKBi+A1qH$Wr z4dpx-mNEjgU4@GrQ7ulb&`@-zn@^%?u>f9u0{r{xt^``dP&g%qt(AQ7=ND^CjU-_U zRiSqjHVtEl4N4RTl`FPRB~VI;Ou-wYz8}hwd$1_aqb5qu#$z%~Ud??d8~{zAz!A`t zk3?-#JmAz5a=Elhz;`S`6Jzy)KHR+vJHevv{P=5AfWY$wnfig|qD#6CD=RxyLsub% z0uGWr$oRb^?m!T+ZMmwdKL&!{>AudyFN6xRb(-L5$r2V0O++rtD7hzt+a>H}fn&}T z1(-%pkF!H4*R~5{S~&d#?SG_X@6a%T0?58ysAmY<$~B;dq(SmKb*X7Prq z=v+wPP&mYE)M4~nAJ9GMV;Z%x6>;V;I3Rw*&%Y6&F86-Jal@06{vXiW(roOKM&U;2 z=OLMozv0J$lo3|PHI*Jnio8q(TzMbL7s-)+A{8*HJSk@!MJ!rhP)uBo(Kk>B9v^os zKy8>DZ1ZMCaw`W7i-EFks+9;T+XNz>q<6ZdkHT_2#l129gQNLxm<`YEz~XU$8(jg< z#fWAsbNGp7Mp0&zY(;g%LhE2nQ5p_9c{CWWirT|h@Eg($*$35tK8vUX_=#*^R*BSy zp~}2*f@-2uM7C@(7S^wtH7cP$BHFs3l4Q!d=p&I7_W#H4kpCB;3semKt9_gP___Ya z_x~G|C!g2(@87QT|Lg8&`}aKmzutW)_J{x9KjFvo|C8yziSr-uitM{3N>-C&(2^e; z=Rjs{S1M1I_!XdYttB+4?{TDFb2y^>b@m1F3FsFl(squH_db%?et6S+-;JZIMm0=sDg2F2nDd%H;aR@$C^2{@bH8P9KW#xqmXV4P^Ir~Avo0eTk=SF(s^OW z7Q->HmO;JIOe94fL$se6Q+kAmxQD;TXKn^{TwfIZN@t^GRUBM!XoW1${cRR~2X~QK z^wW1~!--r909#~M_T~+<;kNvIg$@FhAX~{vlIpk%Z@$5d?$D1G!I+KTg~7CnX3sHgHLRr@b%S#l z!<|0RrH%BdC652A1zhhiOZ=8jCaNLsB-B+aqT#I}V3Ub(=C6A>>rNzsHVmw}JjeUH zx@@LE-lC{NMrG4a$Fmdko`kzFTvXr1MyqzgCD1r2dypH|kdwApm67x=L}gya$2P*{%1T>euSg~3 zpj0F3OqlcFY?siNU5w;Sp@$;dTN#~8$*)xP$h%Y`cgwu=@ITa6Ca33&-?o34g~ zMsz1uf$>cMa9KJ{NsIVSr{RI?2Vvb=;^EvVdcmbiD~uhwaza>GjKIH|%lYG{?x)KC zuill*@n^jQZ0G;;-o4&^KmNzP?BEan|DW+w;s5pY-#7q>u?7(+VgN!J7DzO}_M`FO z-Ecl$4AIO`5js4QkhW@ijwTC8$eYP;Nebu17y20aKx)mlr5(pYfwH4}tGJ(!ll(QU#~${%7F)L+TAT@hXDW`Lcd4U?B?rz5#1t`js*ulBcvEXb-FP_ zixC`r+ZAG0!jvkg^1Y$@sNSod^7pOKxroNc2gVR%Oks=AiVxaU?Zb%Tig33ITzS2m zvUm*SGj?YvpRp?=`FwppxZub2#)LEV*QgQ~QsjKS!Bn0BIi&$GEQQ;nIFR8ha=04= zlj;k|#{swY*D{Y6(3zehGko4GdkvhoO%FxJ`8#F;JGiI3TR| z&>!o))6aH~bp|*WDjZQ4UmUPBpLc2dK;mzxlZ-8}t^1U^zbW8A>?Yn%43wbjQRHf| zaSVhaZnKkA+fau%dbw&>OTV1GT-i133Q_bDE}8B91NZ=UNgNeC#B}Kl9A4bPczCJ; zD%F8L{6Jd7-aeGF$dq&$-+y2Ve{>Y{Dn5W8L(bqGoC@9U#eQ5l!sGjNH|o*c zWvpAcr>mM_(k93#Z_fkCJea zvcZY$iUsA#o6n|~Q64qXOJ}@4^VMo!}&F_RGwyost0OK2|dkO!3Hx6qo zcE5$SDE`Tk1p7-U1dmj<8LLzL&h3CwM!JJV(~_HxwVNV6xa5zYHqw8w&z>26~> zQ3h#XYdg>uyF!Bl=z3^{4~{Pj9!4mw;v;0XaJu=mX8ep?*qQ1g)B$UDt$uUCe?%Xe zrYJwGRu9h2bTOx#2mq@^qu^@}+*7lqSjAt?WcbhinFzKzXVhK1M8hi==Q5UXGK zsy#@9F1O_7#lhZCi2n{Dyo0{IBb#x{KMC!(`JuPfTF*3qVT=LoC27@ zsvNCOwV&O^d|CP>CvYo!hf~|jq5NubDHc28Z{`GZMxHvhMhM;g&}5eTT^hg)#X1`D z+EPQ)zK`da3$fQX zynQ*C3D=HCSB+X(lduLxJF55#<#o?2gyuNuD-#*oYVsXszu7gW%JLK&YgTRcna&ryC-KE@qHw|N+@FgW`3m71zl6MACnPf8vF2C=VANn(_XcW*3H3MmFiTm3N zY?O5~<<8|hk389-N-w{89W^?6;LpJ#P^EoMolrCFFQg6>r-wVVb4?Y~Od&rlJ-6z~ z4prLKI*Jc!A5d;IHe;><^u>c>FdU76FqYOX55B(*^WzGPq%d(1+h(P*UaB<|vZTTe zHS{zpllmR1s8+h&@RU@m^z!hE4*;(zx~NA_P0s^0uIYH7#_qkT>v$0;d(Ey6Rmr?6 zWI(?|y>_MIo!WZstaTl6w~OZcyO-_dyO)(NJ7*g9x)nJmrV$qDp&_+)M{8!oE%t?1 ztgc*pzh;ej#lEOnSZ*<~{;-<$q`n?hDIa>R6gk_w2BmiB8I;=IQoFw6ia*-}PK@$T zso29PYA=>Ls4sa-buB+wG^IAzpH^g3W0oZ1kCWioOg|R6FP~A+1El&5+D>Rwv|$>c z*R+-fytvZvOT2ts^Pc~&D@ClMF3=p%Z8qHsZKno542&Y9rp4VGHN5X2tpf|ZY_O=u zIESj$4M;#<^Lm#OU4sydqWHx(+d8wcdlMM{=KAhfMXm?bt%Jh2#VMTs@IcQ9>fb@eQ4fC~)};k9=IsBBFsG#bU9 z8l!+7_4}AzVGdXLe4m}=;F3C9mCI$pk+M*zJQXLrw6T?38DeEfl{uUYZMxb*m^62} zPuX`>{Am*j!pCZ9yMkOQ8$IYQEHD0eJ_n@WLD}iPE?dgf&Pm*73T|L!T1x4H zMIT@=-$F0&fM2kg4U8lk*B9YIwJ<)+4rN*rJFB+nB2d&mmb@s@Bu%+1QV)*_m$xpn zrWUi$riBXctHM4vY6=%<50zo4lH6iq{Yy%yd{6Ud{$b{Pl+s)ibcUCPl~+@Ty6?d=E>k(l~dahY0YUJhJrAA}k2P)*qM_wOC-_wvj| zl6qPPf@udUBwza+w^a%`-hC;yUsJ3tZD%%t&sY|-wTAA3eJI@bw#0Bg6W>~-gzNz8 z%dddQ^g0r$C?F4O?{~WHaXe%#qvhGmPPO!)J)X_iC#PCz{ueTi22upq>__SYxrlOz z6ZJ;fR-{T!Ug?OKE4QNqze8bmqOB|3^D7j=3Rr&siyJmT6+#XC)6>9J>_4?_-sdv` zy~h8m*SqiAe;)L@-9PL<{~15x=Q?NkG3I2{#x>SccA{6WR51O^i*YNm9WGiC$GL7v zaK`@iWprfE1?J+_W?1k=#}!?0oB)o4qGH66R|V$3SzLa%(A!&7ziy&C`~wTC=Y~kRmI@q@_eNf*yk%1HyFTEB!)}6-RSU^ z;`>7W?PN`{7$ab8dA>k*cMJ!iyI^s>=eRB$kDp7MDLzL>o^uWZApzLWS9X7>M^H-7 zl}7yeIdz^3nIOCDrZS=BLwak$J{x(IlsB_Fyp zPcLN>p&;TE-uSD01NV%}GN6y972&qqk~|ywilJyhby_LuG(7LTc|#U2w$+fDCmBPF z?m~L3(qzmPZ8hs9je+e~V7*HgCuxL;*GIH5Uxb?YN2rO-$F{KvH}WCS$ntdhQEfoI zP!qs0hT8bJaX`IL8^F#5kcCvqX=Hl~8^#pWsy6XqV}buyAHVf7uQUul!Ud_El)Gvg>tuXTh({oX{{=8%S4DyvY934Fke zwWeyjCohO`bKWJJgkCX!~fXISrrn#^g#&;z~ z(25{K%onoF@@#eot2Jlstjd@v!z(Pn(WbLp95Jj{_*~*xN|)6|LJe^=9!?AKTC)R9 zk_BW}#Zp*~rx;El?;6u7g=!r!8q0JjQm<90b6G7E*#cGo)6CL64&DjHn;FToI%LCK z_S;#vi{UlnRs5>sdbA@b45T#B;JF8T#ooYeqO*cV@)ob)_Jaf0Jf4QT>31pJvKd`5 z8d28?s1B^i-}W{b2INl6!x=!N3id_NGvvnk;!krv<6kOwJMvBAp&aPT4bF zVyPP-TUHcbW)faYNVc4CrWoW{Mao28HYt+BXw`pDFIuB3o~%hzJM7b44D&Usv>rOd ze=#i)%V-*=_qP)PYh}l}f^Qt+N=J`9-j}$h(D?~kn6<1H(QO_Gu3SQTt^FId(W|!L zqGvRoj?vS8mDtf<3%PvYH3JPOGlwc<4VNNp?vV3UtS{N<=7Kp{+w1|7a>mAHNR>gk zHe&jnXcDn%-b?%a`>+HPbV#78xB#h{#A@aM?k~M0)gGWIyePa#Sy^rc#qJ@=Q545s zGahAx`{A4U?9EK5qeC0{?uZd%H|0v=jS)JmNCj;`akVeR zm2*KgWzw)l3?@XE8|s}7gZAc|&S*>_6ZAreEt(rgQFFcI%;kx27>OMYm?|68JQmF0 zW9on&FFnC#`NJ1vHt8n5USWI$W>5kxIPhiWt!AuMn01Nh*aU?N_Ou~4lt@)SbmGzDb$POc*S)17=OetZ2<)1$|^yNKsFF>d>)OsE|yQX>wQSi-jieV7E z9y;NppfuvYv?6XM05NGeUQjR&WuAfk-HEQ4en`}wF0oEzid9 zO!P3W*<4{LwdESF&AdKH;Jm{8I8belv5Rb%Qa|>Xj3`WDcs=L6K++dKi60@5q9G+b z%tX)Q4}2$5U)Pa}VTaD2E)suGC|p+%SUMP7Usaa#PjstXbNHlqfWL;E=0=7N1v<2N zet^@am)5jw3LlrRWV4p4G3WIUI*1y2?&9`PPbCS@z(&_q)FOemciBvShobax)&aFG!=MJY$99{NK*)aXMDaoVO*5 zs5w!uv?vv(Db%+K6curUs-pY?jjIp)+{%=)r|+ySqJ+0&k_^ljWuemneC_m8_oWgV zcV>DiKQ$!8FXo9D3>)c|k_Wc88S(S~yZN<|)Zo=X7%-Yb{4UlU`}6=y!{wphKe$65 z_tWYX;3R7P9%4qKrd$zIN3&>&-Y<>hXK%1K+#A8=f3tVF_q!u2(X;h?>-W73{^jtm z=Q`4%3Z`jiRcSr|%6Cr)#a@=}W%*v#+k?*!_Og3>S=YM?TPsqB>*j`+l>x73Q=||S zbdh!-Zq-t`>cKQNOS}u-TBQ|@(~81J3jnIWmpQjR|9bWJbuk4(18rftGMm-BwW7cS zxA>v$_PWYEnz70xea9+?4}tb*IDYCe?Sp5CB0W!|P*3e#R&X)zbzA#ZoI*JYVEf;88)y*l6bMVT{sT&4e1T;PQ)^m=sLPRtGz&}ZdsUszGQqCk5 zVxj{eE*qj%N0ukvU;@AtA1$3nEz7-x>`0d7O#3pL2Y@Bs6-!K&tJ1#gx3UMVyw~cs zx&Y7$!fr43N3`6LLq$_S?4CUk+Q=v48JcR47^h)uYGcZ_h!GZGI4`^O-;9kuGBh}Q zIm>&8(aVN)E*4(M3M`wPmI)hbe$FKOV(z|Z4ZMp$Fz_Rk)y`^>8}*XL1;fI$ z$@39v_;FEU%F{RBSX)4HhGLu$g#YFnmH_t*2gCtaVO^E8$sC9StcdkuIHqa}a%!bI z#)e_0H zAaM8;L{>zhSuR$W4BWB6t%E?B(>2FM1M*l;;R8JY_i+Yb(?tqCe9*}|Kuad7BeDud>+_3H zr$`!>N*HT3VF7(ttkWAaZ`M?{)8;a(`eS;6maGj)t5A$MPr0lzE2b>jnk^RVixtZ* zzj+!BFNaQ6R%6}fkHg-_$<0$9CA`szX;B#CwLA%=>;0Gp)HP<~je$10HxzArdgy4Hv{ zoZhTw^)a&6Cyw*@IK+!=YVMq3BUyd%yS|QV)hygY8}?n=+(}=(+Qv`d z$5`!0Lp7Rt+JtqcGJqbWPVOQ&Y-rRKs?CRwPs)mIL`(NzaBUA9wi6-WUC)RTxOtSE z_}(mDHj6BLOc=E&9%Zna#B!GN5bX^(FzNsm;B0)U_+!Hdrh4_Zob0F@b8Ne-+Fi52 z%X7GVzCHNW>D{*au;w#1IkC4b|8h@K6VZiSK?w`6>`{^~4bB=T` zl<8`=zMxq`;Wc(f#iKWY^tqgl7_4im3?(Wad=_6>q6NSQf(~XUff*`Dm0ij<2^7JJ zk9UXXfD=2G^|{#R1Zo@xZX|k9?cOkakdYipd-!{A>%ibmEU%(K9+cGKs_Z>WZyk-9 zuszTwNr=NdrCMg^s2d;x0jJYDGN5-?g?$aojHLV2yA?Y5Y8_b;ba_`c2J(CU ziEU^mUCWF0h$Wwzj+q!0quQG|?v33jG{_GKpY9J6p#)j8i4lSZ{ zsIvdTm)@cEc2Y-!_Mq$@aowFEC7YH$Iq4(iJjjsz7CMM{Y`@Ftom`OJ5>8upqMo{u z8Y*BD>0zohj>>+6%=cy4n@W~YYe?+JEiOTo<)dBy*)K;=-+cSSbGk~>mmhxl-XIxh z>u_c;y`J&5`VH6KPy^?H>PC%Pii6Ci+yPX5w`?k-)M1A*(f^jo-Yc+0BZ0}n`=b;ufEp593 zOB@1wi}L1-T!QA|U`Wv?TokMvX;T#&X{95z$&_^`;?$9Q+Q}&`8?HYbKjf$4|G~=R ze`5ZZtd~{&Kkj9JCGta7=x(X8C%-jSowcayraRc!b) zJw8&gjstp`BR-(j6__kv>8wJ1T*_v4T`Ng2KIQ@&+s5y>XFm8EZ4q-J1Y6&ZUMb+FKj2kl2Ip^#d$=TcF zDwWjm8-$_+>LQL=&sM;70}Okfk2)Rs-_F)10~K^0?PazThrw9h-8)LFk9+Rp{FUM~ z@Nor|m2!Ewx(BrvF8zhmm^^kISvQ!Eka5OH)5X+WKJeqypvt^lT`KEgJGJQnVY#yQ zjXe$?^M&w!%=kH|?7c!iY|{T~MKC=$cvW=?ao}q|X{Eo#7LGTsQg~3FXAHcCb*+g~&U?nif;4S5uq)DP+*r z6{IDlC?{OXW>uBf90*4>qPuBbGIG5j!kMprP31dSI82&1O zza(kZ5xE=TBcF9ZEQaJ0L|+t?xSK6kjKava=TqmnAyvs{y;+lcB`2}hctD%y%hX!S zC5F=Ny8(UXz=828@Q(F#Qmto@448qOK3k5iV5@Mb7n?suRh&k^}>1UC6VWIV`H$=LJPae!9p=x!W%#j!w6TW%L+32)ha^HYuddMy(1u`!Z#H zr+Cv$+uzCIPT#5Qe%-QRrg(%bdxG=D-s=exgajquE4IWhC&|*`fg*8L;HjkJ_;%DY z*3iNGREU){%*7?&qs%R8rIroTF5Nbh zea^1r{$N+8Tho2|{P5v)zj*jiwYWM|ZwIE=%~%YXW@o)3z2YVv7*G#fa_=qz%}By>Eu%Y;sI3`SyfRB!ney6>M@LD#Z0(EKgHA7LvEriD zTO03}#w!Tcr=K^g5-`fP>o8V|Z0BjLXGy{kD-+uI$M51aeBXGB=MR}&4_V&=T=9hW zC~v~}>!WXIi}jS_bO91P<-ZpS zBcbn!Hr1TZVd~JWkbd{v>zH;?>rp7n`y?-!XEibl_WwWRLVnIQMZ)(ARmdU!g*k4p z8`rj=7ocMYAVV)lO&*sOA~amUiwzns)VmG}$Hxr3%bgbLx=>$vd;fbo3^1d`_>q-s zyVi5#pZX<4ZhiuM#_+UB_Sx_&RlO1WbGdMk2PYp>d(i<~Orn=7M@V4Ds(=ccJE)ef zvHf=8^}_H>*`8(r_Anenu%VvSQ1&U6^Sa8GIhHZ{tAK0CZta=Q1OlqmR@3`D80EIM zTKA@{5goUh+qE9r^53|U9-3;^q=UrBrvGZW_a8s}Q_=s-N1s>u^KaMbe|p(L_nxo+ z=^p$M|LdRfa!9H$s! z&b)`w@~phLpirL|l!=>`Vf5(HqnES9T;hqP@U=`>oNQW|!zw89>8d<0f9LQ`992w3 z5Yu_lFBbEQ;)IF_uXWZf)|==Nm3T~-A@$sPNQKmk%zBZjhdt||vRpp9XM@0#uZiUz z0XQZ0Jp1}U=2v95F-j=hUd2XU-;w6e@@gpu#j-`xFDfrfS!OFKt|TcXdJd_CUQd&2$e zsdlwk+bc`#B1*8TQEd)h;dEVj757yw-4(Ee{!yB;K7x{c7lSI9W=zbF=olYkSZv04z2h1*V z(jgn8Jf;B%l_L)*DY{C9Y~7UQ0Mlk&e90P;e|mg-ef!;>NNb?qY?j2SlUq{LF?N!y z%0L{p z&lZ_S=oTK8TVzDw2)dq$VCM@FcMcM=#l~Y}S)7mc8VL25H0EyRWos4-rLVA_*{-j* zC;-Q;flu1C6kf!H>MD)qY6Z<=a(mEBQN5UmF*$ola^OB4-yIsS0vOx~fF;Mnz7G5d z1Um29pjehe+x&Ie5S&{g95&6>!O!MncFYoE49iB;^&FdxQql`HNQa(0efHzezx?zS z_Wp;j{@3%PC(r2fS1+FbbaeF7H~9IRub#v6U;c`ppB_DXmWWb0`T48o&%XWnxp^KX zKYjK5m!E#_E`Y?hTo|2 zP$sC>pf%LrM#}zod}uhP)=BG>BzIi(FdFsg&w&3FeFT3P4e6_lUOIIRwo|to6!Rc! z(SO(;0c5b;R?!zdptSI9a{Y&DFKk)o4Vv8^CCx-%(;*kMZNAwzob^j?9qO>K;|^f# zPTRy^_dHWmU(P1wtc1;j;k80rj`e!XZ;$4dptY^z`n4JcNB_U?|9aglS$gx&0#2;9 zENQq{a4FYv8=wV==r{T4I9IVs3o4F{#$=~6=yZmi&PZ9CB;Wt|H`3H>q(Rxefg#HohdI<NrQYwp@n-LRQ?s@H$I@}gtlapRI%fB&ikwfV09V; zrk;#fchP2xuC|f}M6%HU^%<2gmg<(X4x9Yoz&dQ;8+DRwKjBZe%eG-yj34C(_xKTh zfF}of954~zN@u@K^vJ%g%wYAkHN4$VAX$Ri#bd_z z`uvmHrz7_KqF9tm4k=OFAB>r{tuv}8-+c9vvzp~!z|whK-$<4}FbIG4{9_krmf!DS zzP~Ml$?uznzWLaOvaO9|daHeW1NnokE%fx97!LXQ$L@v4=nvni-3s}^C(plXqn0>X zn;OB=f@doDQH?=cB-PukwXb(VpRlYfE1t}!=+hRK7Ar|HTr(~41wAsOGms-o$SlR) zL)9zWHyxg`wwYjtq`d^=+v}SC_WGtjrrocvYxnCR~GGT4jOMWMQMcRQA#R&+Z$kWOxE0N8s>Qu+ln(QaZkU#Ry* zdN+^mMElTbxpA})ws#YuRA5wq+~3~m?&fP;1^<8#PoKhv5AfmWDEc$L_);cw^Y#8V z5FeT!NW=CIQnaNzER_!*;B3tI6<+Dfw(?EVK%h?VUW$J(HTmPmOqf~{>Ky}6&ljWd zVi^^S`5GwJ_eU>|e){Ik^2r7OG&vt{cAsW?2C_Xso9i)~mYj$4=fR+QiUr5cu zsu)?R6kUSGU9ebx0>5QwQh^2n?QLCOcG>ndg{ACXlxf)Pc3r=1bd}t$l5eZhZkl$~ zPHU>Bv_3S9lumcc+V;?L{hqBL=lUu>id4s;)=khP)$(hqZ9^4RWy#k0`FK>KTv$?! z2JS3Yq-v;qrf6xG`6s;Rf2*%w-m$e67A)`lz5&+Gvilzo4j5PH+(sWSEoNmcH>Z#9 z=pEul742Zy_g&cE|MKiR4g0&DVdto!luqZZXusR~Xi%HzHD=OKpt>F822qsqalr0E zXBZfEiUy7M?2iO?H`1$y(ARab_w7eRz8w*%ZjLOMdd?=!cJ* z$P77!jTROV&3f|VPagvcZ{Qyktae6SOP;*g0t{*Fcbc}6xyzzlot}?Z<l370$Ipk=R>BaoWW2?n)H5_tB<{pF$A39bu36#Q@<`2x6`# zK?D0Ff@qK@LZs|-lEhAxD0(N>7P81%7sYBW;l7SuO%+yQi#DUJSFE{JiWq+fUC3GQ zu3h`vWEWfqZyUEOaIQTLg2UOrTkX;HQ&dkT^D26PP&!iV-C)tl@`c|uIH*1X)}KS& zLb6)}i|#;Vk-#3)b=py7bwL8k4EH2k{P}7}BT!OLzW(v2zy9>qU*+SoAAj@|o%L;X zHxvHRJV&)r-PYGPYLte}f$DrQ6E%O($+oN{S5YaNh04~rR&S3QlH(yJZG*uMTcnj5 z92f2biADw(RsfG%kOr}(b9`1&#B0`jIlp?>yPSL3USH?r6 zQn8RRAo(FWkWpZAj+)vhe&LWLiyyT4vU<+*j>nGqvFAtNJqSa4P=S>i)25~er|8?Q zqsf!qzGH&&)&I1FnLk@EjO~fe%0+h6WNS;|2t>gNtFRKwa@D9Ft|91@No|jK&BOlh;kb?4G%$;*dzx({2(zxuWySCDR0~u z)(W+z_phWCFxCiKd2c%l#N8YJ#Eq(eOnrk+QL6mVNb{!tolB8 z-jB6cbVSZ<{|9@sRsFxjT6FpOyuh~mf91ViFZcYv4to3d{_y|$XZ%$BzwGJ1i5J-6 zq352pyqv9yO?-IR2>ZKZ+GltWH^Qn%&P}xBltX4m+L1q(V+`ij%v(A>sgt0{av4~T z&r6K`W+D$1NN5iaDI9L&5Se}BsbblX_UQ0DY#b`fPR@p5L@_GC4J9HfN>0T+Uo1J( z1tnD7jEC#hc!Yj(WGiH%_V@5+ue^2OCf;SLX!jhDI$yALkn-osU-w?;6x-r;6F#LT z$_~7_vyX4^Q+mgWzk~X`HdV^*avs8V{<A86^y3j zm-G&beBcWIAT4F6WS2^Izb1}|-jf@i6zIL)zk3%Z>h4`NOoNBL{W}Nr@^yaq?t{Jk z+gX>#4e!#uX0r+J)4O+@Y6-yS2lyNdrgwW*2moRZn~Fi91<1(2lT3G(PiCi7q)X9) zgc~bmkWxXxQ19ph#M-I#tj{ilsZ~X-D!-_C))#}i)XH8+w%=sAuJFTca}oUNe8xqmE~K zd|Vlx(+6&G->qw0HZR$mB-cY}ZXRFq_%{gll2-yW*ShTIt?b%z>b(h^PyL#+*;q3% z&l9e09>_S=_sqLIva1zmjFm`t6sZYl{8@?8>G{OrPH~MW!L^vtmZS0FA-{_5zPDPl2vU%@qVMOkOSNTW8S%US?L1$a#8+}ZYw$vpE@>K(DGB3 zM_;)$VXRm+-owZkZTxiyf8C{D^!qmcdL6f1_E&!5KjYhfNRcRh^ay`Heq2|)-^ceK z=rt&5KGaT`-uNa$j?U%7s`wMWg{%M|dMQ$1CrU8ITeH3+l|7W$ z!hAHbZ1zwj6L_k~6DL`@Io*eQ{k)VK&z3k{E21+a2 z$o)_;YLyn-q}faHw0X})P%#L^Hu3}*)nkz>Kq zNy(E)$=9jurk|?CjbZpw>qO=gb@RBN<=lDZ^$2^1)-uWL z0IaYmBm%2^?MYC4`MRINK=Y4V=+~|D>z28^S5LlZR6`Jc%A)_mx`?VU$8gT}6iLK# zck(?FjTER&MV-=Ke&th=?14j;@&iRt`gY~MTemZ@sA#896&pqW{UtCS458>;R$EJJ z4~lAl?eei86?R!Wv(^=(R38^=lO0xIpX>(Ohioy4G+lhC05tp~PT+R`jZIQ3Z}kqP zx|to0h&kbVi3u8-sd%AG2!==qMBB|ZFt&PK9ql*Hx??A~21zD*DwVXREnan-f}Ehq z0Tgvns}e<6x#FA}O3epdL6M1s{O0CQtRxndc2(fk!|Khx%3o5hMWgpQK2~(@(Tf)^ zIJnfSSBhQHxfbD~x}KfQ=I>@vv4ZQyU=1v80yUC2Z8)Vhz>OV$3P~M4VesBHIewTu zjI5l^FwpX3rk!+6to;N)1RAu6@@8}BeDnHXy}P`;bh4`H1*pO z;;@ zEtp1SfE=kd!fn=yM(}SOxhE)TtVtL*#9vJ)gew?|i8|Ffqp&Fe@t)lvB1xT#0PxEd zR(KB|fy01xYGqre2rCm5-7HD0^Kur$4pbQlDJ2d?^Z4N_xDu}3je%UL@G_HDp{@~= z)ZXHq!iwkJ88~}fM>lAV<>X^?gU5X{P&G^*Wa=Dhup?|Dnc0lEwy`7XJVw8grD`=kAH~RMmE#1t2uwKBIs1oS7M$ z;Jq1F3g>K(KYJ$-Zq|a;F4+rgIPN=w7L@dPKc}I}foAcadaq8Rli=I#u1(vGI{<>C zru7nR+`QYl>C;eUqp1)9{-d6=+>~G)X6F&|Yg(&-2w+-bo}Pok54d2 z8QqCc)I2|Lb}3f0F-9G4E*9hEl9ah5mV-$z7bpZp*;M&$4Vo5U6_b?;x zW55yTQ@?7_cUpWHa3254GsG%9!awpP>!NI@E8m*ke&2K%#Xh9SF^{0!m0Cf_cv0L{ zdyrOQ2h&HmZg5zS`0F^5RHe!Wl|y*yB-;+N@O35DC%%IgZ!dXMe2d~-6~3lnF+8`I zc>GG19IGSysv~DGaIY&_x2_*&S=R|~dXsJ-JL4n))z$!~^Tnz?EEmId>BcEqM$H7} zh!$SqTaqfHQ%@gu%}Oa}^NXd`eO@iBiEc%1qz1~7$_!D)(qt?2m#s^ zh+a^5Rx74N;xN4{V+k{kG3T_~tEhsnE!AWL z5#X8$YiY#_gc|3bHD^}TLEd?u=T+SyewosN? z=R{6G@8}Kg5E6>)HyS)4)LBDKbaoT8{h_MRoL*^td+ne^e5`^;H)D*!X(a>d5~LZg zAqA;nmIkMnw-&}LPvweh@hx=EdUO%F35`Yl#<%4q{GT$LiZzIS83HTk@P()+P*{Yx zz*2o3^6RZ$0VQd5_9SDDq`kSP!qAB5MTp;Cl6vx%ZWGnj5a#m|4?tyRrnf(#}|DW?yvH!HD|5GwRD>x@)Q9r|vxk&R z{7af$)uF|DHUrQ`-bvavEJnmK24XTUM$BGubth4Y1!%lnpG(b}BIWY398X7-vX@&> zx6E*vP)-z6lFF$N3UDU8Eirs6r^eh;jr)nQO146W^}AXxxtJ!re9Tgk#0!`v>cL$G zh@r0G4~l+$mTUa?RWXQ~D>w^Rxg8UEMfZza{Lo1(o4Lm!WgyKsxvZ|f$|X|qTPI90 z96K96a`-wh8V{!h<`Km=lhB(YQ*j%RQy|ED z>5|@O_)BFQZlPlFYWEQ?#TCqsTfD>Iw)YV5kK4P6bIM`4s;y<7;OE*7UxyS<1=jQ0 zmZ!lkC^_xGR?rS@<*bR?d|m4?W}1z?#`)oO!_Q5-J+IYkw&IA^5A=;)YqxaEBI?`; zdszZi6Hr^{Us|(BCY=E^OI{wvAn`1>`ny()!C^^CLDP?&Oe~9`9;@`qxSx);q=z@bkkI7JExa+o@74R z${9<|TM({K5tUT2IUr8Z{(6^^;SU)(ftQ$W5a}kR;ZFvtmf^(xJ~NXkyf}a zIfQ^_tOGV4@FAyK5oaqA%r3{P^D&SOBHMI4y?MjMpvPCzQNjYsIL}DeORtLv>5FN! zVeBqL$2ceZ+QQTf=Ph$bNUZwUS`w$*IGy3#p?F#Vvm&Q2w>t<9D>N*>G0sVXCAF6) zGHlc3+!->mZzsU=Q7#N1n-&5^Yh@G|iKxfFRa)50mbMRw`IJ{w-0ce+YbT%t_W zxwZ_I&2(s0D`~Ne&9Z{88djJc*bJ2CHY!VrFFC8lWpEW5IjjNX)4<%$F%?FAU@tl- zcUQ3jc-Cu^yJCJ?LzPL(tV+3Tc*>V=wgDWmP$2u4Y{H++bM}fw=&M|RUNOO zOy2KEG-~T3O`<`_@K7etz5yaJ_$0bix5mR8_nMU*p$9JTv(PcM{G@4kqV>&@E8^A* zRB7%Sp#`n>w!@7%3s+it5j-+9Hav{K2=mh3(ZaL9$qECDtYI54b+1LKgVD>KFj|Yy zEX&jjGHvK~)wZV`@wrMs=TU*rGmqSc?t*UPqvviT1|T;-%9Uhfhv{^wTGwwr|0nD^ zhrLoW@pim`yE~tVb%f5^IQ-<-%9D_J;>S)pLU)Z&v{M*%1xmUT&kJI|XD)TysBOR! zlGyHSGc;Ry26sh1R^#0e*JM>h-Rq|Btc(@$S zVOl6K*J6IIv{f)Uid{x78vdQmM^^NtMKL@Roq1(ePNU}Bo|MzK)~qnop-l12f%u6t z+kDfKm7iq?Gcb5{kVo|eN=-w+@{blugTy4+s2srWAy2l(6`g( zwe9ZQvc|8?rltOj*IcS_lUSTP(jm5i2(l@(n<8O{fwUy>AVJ%j73oMTgi2gEGvPuB z1+*BQ)-w8?*X+eene)JNI?#8%!?}H-AR5q^>R2wUD8ru?P>fGyS*S`NOq0N#59V0l zr{Zp5J+Yn9413M*_T`cEw|1@mNs86q4AhS63D3asrZm`Qs`!5IQLkI)*t0}=*)`%rRWZ9xfN1?F zgKx$X{kE-~P}!r(z~@T9E&Qp4Z79rAxHrEhX}3_n$;m`G5~Q3|))7WhJJ|9iA<~a= zWpDcT%d1K!oZFn942pndsn=K*s>FtwD*_d3DBPKOixh8A!WK|3%(1xO4e(Yr3B|g= zK<{_5?p@n&%W}4%5OAIdn`gE_>valj(S0s!*_(m5D3o_d)%!@Y zY$DMea~zStEq`ZrGJJ{);nN|a56!j2Fm7XIO6bk)XwGk&ZE1M_G35bR{UrpH=k1s;kmfvZL0hA#L{eUXQJ0Rv#cYlhg*YvR2!NZ5Jz++8G$8_no0E) z=1!oujbOyy5=Q03#-=N0YgA4^f`~ergBAvp8td>l6kByKtGKxzyxx~{%g^x2lyy4g z5F5B{)pq1QJtg9I=&FaFl6L5v18Br&Z&6cj#9eN`qgo!$3_9xuUbtSpGP14?Xj@d+ zDHhUPrh{ z1@|Y#Vo;on4VXQr4Il`E9wRHG=)-{5Cp6qpFU zafBuT#ShW;Ys$(AWlA|lO4T#C6*)JxkA{@@EOjOWV_(JdbgBu990B{wK9<>70IzitcX4oCPHG@qw0ws zllVsv)9Z5f17u@}Z;Qp+?X9Rb>X zXIe0AlxT}$7FFb(D(oHyK;`o}8m&oMS}6G`oFpBKcWqR3BlQ@(R*UMQYiMM~k*k@g zEDU@*_|4Kjhw-V3X)VhQ>e_R`RfMr|Ri1hRszf|tt#)FmnG_Z?+_O2HCfT;#64~1& zZwhwc<8FeNdWjudDyjZeYSdg|GV8t>WU9@vTT2tOIv)1Az9Qx&^9FGG<*ZzdmE{+V z+P!ZUmPiW|7kIcTQhaFfTt<9{5nIq^QycHpuwb|#X5%?*7pvJ2OCe{{K#BxS z!*NOmW7f8!X+z4*Pho5u>(*lFjNFJin>z@Pz*Vm!=2&jg$&0z*%){Un(_f0uwR9t9 zO#wPF$8jqX&BhU(ozR2$2p-v_Ml_&7!#E&iSe~ML>9Ra8r^SNqd&!fem0Tto?*xmm&T|sM(6q(rb8BPhJqDGY zR4P3QRJxQ(4e1~UI;0qiBwZPxR_Wb*akf-Km+7VGsROHxps=rS1nhOQhyxGw-1>jmXDK{jW2ri)w4 zQfftbX?2&Vt4M>H92djWXnxW0`-`Xfd(TDUitCbB$=P^(0sXnKg3>Gv5N%dUo;kC$ ze&BL~iVIHZswxEW+78Fo?n^N|)s)AOiuP$4TrI{G%)vFm!kl$W!&z@)h%XcNk2*jm z%FSNa^vx8{>Wb$S$~jb}S63wnzgyd(G(*d}|8HFZ$Hebk~AP7`$s?7TZXdv`z4? zwR>)DPt0MoP&UNc85z#kKulyxZa5h}`Pm))GWVhf6~zQeNf4EX7Gb3UvC4uSWx8gt z779dA^0*%zglr9OHj@1RGb3>qh1E2lhKfq6X=O*(X*pOFi^~W_&=$Sa*K>7r7i!uG zMpIwS^ScKfVRu}?RfT6V{*U$e1meUEP>39U0d>jMarJIai(0AmBzj52dH1Zd7{lu5 zBf@4@t9Li!`6cb5m$h{VuxQ<^_131R^bi4bu;)iKvk3QnpkG&Zx0pxw7LL+J ziX2@F^xit=K5xa;rzhX`ZK1n|)ew5jDZ0ZRC*vf&Coyrewbk9;*KKn{#I_1~o_FZl zsuS&U~Wb9mG3~v4?{=nMn%$xiNG`I7}@?}!V^qSfHBOh=24_& zwbFxjx~3HbHU)Y}S43#b@Y@!1#;tHs@7=Hb&T7WPiH($~iH<4KS@KIsD|i~f0vIGd zTCN$m@o}jibHh4;GDR6~S&@f$a2UFDtBsgMe5P)u*1h)yJB#u(lWj0P`0+a~^`b>~ z(JW$8V(#@hjydGb^>i2chBYE@?K(e*6Sy+qCA0oz9(t)T-iz{@sur%DAK1Ha=L~{m z>p{fxQ%8X7gFXX3YrauI7FlH^lYZaC+;-=H=5H)zs_vZUDsj#}PgAS&Pi_`OY2o_9ub zgbHYry0Qoj=1m|R{Vd^i^THA3Z)}x>7(-&7^(TqB7$r}iCMuAx@vNVpC9w1?*(-9Y zEN~)mlQ+8XHrcXI6y<;MB2jDKJ$SI9CF58G57?ulNZNs;)!t*7qV~6l%spoS)fZ3r#d18HV+^C(2y|2@J^%5|&%gZiw{QRU)h>F|fJV*;@Emm<+bCJG*O1qox>`H^K*FnZTO1xy z^jo6HZ}Lh&mE2@He`jd;v^=Md(GLRWYdDmJH|2^1Te#+Wd3#XenjM~&mUkn?uS6Ja zx?k|81N9-J5BzOUzQKnBFD&P+mFsAYs`Ql#54DSVud4zL1r|bEIcVuOtDtueT3qV` ztz_;P$%(qpuyKh@VW+}Aq{Lhn_UtRoZ_y(fKBrxe7LG-1z!t|gxMJ6Lj{6Yr#VQ0u zjaJdJ$A~KiUqF;t-J^0riS;C5D|Qrzo6g2n8~Wyo=PG*Xn>XXXI~sBfG3&2gj=Vnp zdu)y*>`bAOY&8d|^3r(oX1dxD-gH%k_oxbPyeqh|1+IW4Jcu6kIpr=x!klKifr658 z8sL%LRVrQHt8{s}9_-iQT>*H$p6&<`N>%~hsQ?_6Z+8R;C944MRsfc}Lo69& zEq493s*PRD-|g5Il&tptbrrw!T~`K_tOC4U0l1!>?+6e|S^(PuQ3Dzv!PyNG7PUZq z@Ift4cU?qKa`)x`sJdmBr;D9iTI}A^ayzx%&YBQ61lA_m(!>oATQF;Iu`JaT>_&=&VC1*A2Aqwu+IkD`>S43m43BMwSD676=cBva%J754k~P9|X6A3PY}L|Um?$(c zMfMu&HMMojVl0vP)#XC$3|P#ru}`&En*G)Gxa@}mBB3f5iC>WC?2`?v{>c&l< zlRWMx4s(+{N>t2y?I-#k*#S9Vub54GWFqnf8+ue}=#k&hRm8JjI@{f$=3P@085FL0ZC48n$gaCOSLoT_p}o6NPgN{U zi@hDDb&r!gxHFRHyUfTSFd;isykjbw`N(#gkU?ldUS~VBde_u72+F#5cd2{Z>am`d zY?pOlwQ9{vHN;pN=(_>-@*3>zguJ{CdAp50uN(Wd)iW$r1gaC}b|7e&T)b}P zc4!?+6@ltB@7EI!Ku{6D96qPbb6xK{9X;uC#SjK4>t=Zk3uF%-E*t}jz<|FBkDU^T z=K5kjS*;KQo^`Kn3~iJ!!OtM(w(#>X){Rp);!S+xJ`{tjJLFE}n>e+iEfmoN?jaP# z%;W?Z&d)E3MY%*z4VBGGUkc7wS){TSd7`z*zU|coThRBNrn>zr`JWbVw-oTzM+5g{ zfi~nTYbfaX^j@_DBkSPDmKv8l7)PP7U3`0T%yL4ejH!D+619s?2OepkM7b}q-61~w zpfv_o1|?;4UF{E>%R9C`I8olMvY*jiGIPr1fpR&ObM0~fAnfGov%dc@P%cy~kAN&? z{v%UNUCY_>Tn`-g4vsc$IN_7M{qKqgip~@C2qD3FP-cS#d_fK6?Sl)w2nu*JiJMS^ zjkebpgfTckmih~BE^+z%>W9BYoS_eO9-hMI=m=e5oIfhtWyr ztn-A%g7yd6EOC87`bLSTf8r8V=2mDN)$v%@FoaE=;-{9zVVlAs0g{nK`WcgvoT`I0aYFGO%>8 z`!WjoV{v?578b{z4K;bsIjwlDo7$)Pr)i72AHR#$(hDX+bbut)c;dxH33RXNW><+! zR*~I&bUaHZM|ro=QJno?8Skm_W`oQUEPDZRT*O-wK1MsTGgu;BHpfxk$#BMxY`t4WGzKo^h7sd$L6nqdUm~~&d zvLQR$Q>ue3sx4bCIXM4p{;t8vD4uuDi?i`l+<)w$hST0NE8svm>tu(RO7B|d3@_|S zFFg!Ba)NR=lhJEs_dGG#E{`)6hpn1Sj72IKf^mf57yUt7MwDjN=Z!znsL%eCMZdro z2@*eGTJY~e3%J&;NP<{WuFA%r%)0)iN3Yqx8#^V3^3wQmI92U_2!#E{pR`R5T2aD? zqxf`4dN=Tu7TrY$BsF%NkOib0(^M&3VrZ{hLe_^ zp0mY`g)i|oY(^4=EKv;>)ZVsCdk-VKvR$eUkg};fWP4vj4>)%a?I$~bP+{c{f>9eQ zNwM#Bmf0y~BF1edO|v4j0SnKBOgS3=Hj`Tk5%GQ*JM~ zL#rejl`Y2@O{kPSAF|5GlDb<3tt_mgCR<38=inqkCL^JlXFkC!5V}FC+7h2nb&PYi zjwO(k)jHOfjljyZ{E+JN7Yejs_5>w(UKHojYdjO$S=2fF)1Rcfp%&=$q+eJ}o#%k; zg?*ySCT{pU*lJSK!~H+qvM!Qz`%v3bPYd4~rc-5RPw;K_UXJ7Nl*k(4zirZGl@s;Y z_u=;rorderKe6;+>9x@_buEem8hP}X#RaS{l+#2{FmM#IEbKFrQrs`ba1H3~C(Edb zuCW{$8-1FU5gl)l)IDK)>QJLItx%b4)lo~#6F(3qoqcaN$~}Y#zCERSD_&lQ4$B8X zkrPANXpxqy(qeZln!^VM@=4Z1|KO0vxHRM=9wWD+Y`F@b1qv+E&Bl$v<`f`rE7<*y z0NeBMYYo^CqkFV3G-}_SmN5V5lZ;+Zu!uUefC#qDL%zlgFw{Yev7u6NFNtnlEhr`NEeey7i%*Ew4CUfb#4*5?MoQvUUx);<;$k2Y&vtKTxS4@M?3u zJc(0BW{F;+Df5E%bq*c;Tl=khh80)D;hsYoR8Txkg*4My*kSXO_qBD2vY2W6^7Pq2 z^$e){tuFu?MZ#H>C*`b|T3J<+-GVzI)&KBGpl2)izae zt55MDK>4+`WU^Ne$v?&{J}fNPx{P44hl}R*)`7e1Q|UG^ zOwZORFu6pL!R&-$q*72MHt~s)XTKbM`{w(j7f+uaJ$v?Z(m_B+m>6_cpcsF8$*m8O zL!2$w3zQy-oe(!caiUMh>iXKLTA0!qC&^GK$=<}vg1%JAlXT_;d2L6p3h=v^9EL;CI5%hS{PosQWnsW=~TPTTQ;ujDkKRfu)!8Jn>q~@fI$nHl0t%I z{fH9&;2=cMI3aG4M))v_Tl~q3&AKdSu+8$$LDZBL?cm#lvJ~0l1;!Hv6rC3<^x-;5 zL-TfREo<70*Cxis`+aO{l&ypji}3~Li}1@_cx5_&aSAEL8keBMzy21B2jt29CJ?J0?k>7Zjrz%VED&aVv_nG0%Wc zI-^#_jha^sx_ZOxB*S5%<dK6G1~vh^ zkRBybGuC+|RX1aQDewUWhqE&s#f;<9*`boEhkRwd-{_b}%PK`)f_E0_@}-5(9}t&J zNhk$7=EpKhU6$6Vvd_N#K0^Pb$OKY^Rl2~Vgd*S$#uNPJ4nc+dB*^><`QSsDY`1U= zm#vmAN=-Om&WlZXzCOnb_x#;>WWniJ6bGIe_rB5k{QNSoe*x1?oxxPQ;rWCoM0Rwl zix#&vBQNXc9r{A*@1_S;73xdpFrH!8M1G^;{VzON0ki!+h6lsJCgmhi(S61n*u${e zT6`qKQ$3LRjJ7oiX4fd?WfD3UheSJ8!!lZv?!|}%qUX?T3)^K716Ubwi^XG_B;^#i zTlIw!oRqXpnGZ1F%Vk4!D${94fZ{r*@_!5E`wU`- z3TCSk2D{IJPT(O5@0ONQf-U^rm{k$A~L?VGcUvk!&D&q zVH~Ci8Q%cs_--**J^c57kBuzPO^rKg#T17~rWUV*ZUI~3I~D(G>tC{6Y*|t^?79>W_D-?xli2xwF)Qs}9||i`mIoA9}Sl+nEVB9;|5;^KM0* z+(;?vJMT_8utxk;jLSQ4UM^N|mJ1FVdi?Yi%}os~82Yo=0m%L*6eS)3NUj7Eo5Tfz zYaU?yJaM25IfP>7Z{aN(UT?BLzW5`V}+>tDbZmO@NQ;g!foS%DR<1oBkQJd+Tu)vmTk*$HLWZk z1jkFz9;8JPxK^K|>~q+A&W-}L&6sJ9`LNQ`wFsBs5_^Fzv^Wg2sbZUw5|NAR4k;q& zCc!-q9G}P;r4O@0o5gxVOx+#n^4!U>G!x%m#;+32GiP9SIv$ID7~NjJob@we%C*)l zxqzA&|G=bFvsZe3hgwnc`nKxA@#~kfS9flA@W1%>tN%!@@5;ZRBk{{w-0AF!ZG+!V zrvnJKM})~oZVaXh<9}?{oAs`MVkzuGh&6IG66tX1bdptaV@$@c8Fd$TR{s&FUR(W7 z?X9;8`mk=@C9r|sAAHmjh+l8+1bV!4Z(~XmC|MdQeal2X!}DWXOMMaZGJT~@_p~#& zan^nBg?6=Asp@I!xl`){5Ir&YT*fEr5KK6?h}5Y7%j$q_g1{!)%fp0(-jtg%VV=x* z%KNU%%HCp+6RFVQl%eCuNoUj4Y3^K4Foukcom9!Wb6-U*PZ4MUW;*5^gQ8}56G0zJc z35`lVUWvi(J>F*)n+j79ZxLDG%SZAOZY`_`u9V_%ZCRw<(l>oHw6ByitXk$ZEM13v zd)ir+Gt>}R^$<V6kfF zQPsf)<%v5!E+-8ONevN@(uI;$vqe8A?gL%Z-sdeecfU`Lc>=)aCRk&GHTcsJ%?|#~ z>32^-ih7hxX}^W>m+xH>K|9h!N}#vf6eZd?me=>}poKtGMJ%TY9p#Ocp%?wWbRna` zz(1=RYo0Cdat3adkd4;B26&wokNQ2X$L;89Su0mf$iD*%5LdQWD8Yc?+7l948>wO3 zrl57J347qAO7FwiRF_J(L*`%4uhn`>%E_W!EZ^f|N(RZ5g0fQQRLKD?LqID4p&R>@ zuCY%652QH#cf}FGO`c(8&tfcBg!jG6Y9&0+vr;lqw{MBfDSBPF@Gb=B}}}2{NmSF$nO9QRhZ^>*8X!bzC8~9 z+dBPxN75RmzJR4@7_LooQmTig`-?<6pDH9#xp z$~t|eQRO|4#4pFu2&s$mc;f*|l{`XU1)<2I(CCok*hho!C&&gl?hUvh!WeYuQ`t8$ zZTqEqfi8K$7wAw`ePOm<-c=5)2TZA$T=DPjm0HP_w)EyV zvJG|1xxLi9vU}TM!ZCx(jv|`xXDE@m(t1ow>4YgNED0k!l4IA8PnNGFlUmg;$<4He z=B`febid$I7i?!bw;_v3P*-?9M%5?DMgmLPzL4w<}45B73W3FRcSKoRcBR4o&KkJ2k6IW7Av8iBL5olm`unHE-(G z%y7blOSRx5zi4KV$yVLWxo!bo4j_4F85Lr780U1IwW2@^a|Bm$`tvvnN=J)kcgyjN^?gS4TQhx1ZMKV%TI3oD`8RO)>W_e9$M=BzDaM8c zW8VQkyFIK3Ai>Q}I|V{qYw9GxTB@CT*ZZt5mg?whjuh z&lf>mTf2_ZbZ{KH(_$ID!#niZ_)@zWpV%h48l8*rNeN@UY^I$z|M}yO-+lMhukZ;I zS+L0HjDnx=N>b^OpGmVK>zdA4TEJiD(~&&EKMfBTdW(%)q!&G z7hwQWPUjUL9mSmv{@z+?A9Jk09H?4PsQ9LeOS@ZIzIZ}?+XQ5g8zW7%z3K4>Uac>d z9F^8L)82IWVvSPj|IxWK8r(*si2q<(Vy%t6%pa5{c}zz9JkZbfvI-uqt&)qvuVNDX z$vt7A9YT|^H>>EG@wBI+M9FYhi$EgLQ9*n5lT9nQ zB@bLygEnRIBr)4E>p4uvNz;n6OazC+Gn}Xo{7QXu+k2&j^TjdoEU&CEJ{WYQaP_$-U6^Rb3vxqDz{IBCrE2Kin0#a z?@@{qj_{&xA;lhfpiPv?l@^b8TO3`H7*`Za!J!SmPZY=E@&zcCIoxh(g=^)!oR#Nd zZ?%+IW2-e(qWC;_PpmH$^B)r=R~2cN^UiWLDra)Z^|GPsF4R;o;0xPSg={W_zFM+3 zii|6sG2_)cG}S&|Pgmu|R3`%85SO#`?ImRX?L^hRmdaJVg_SO}vcz!&tMK|2e$~?O zRd`&MpTx0q=2Hql@49eh&~t0WLG=h_fwClK=v8a|gyAGCnVk|~9 z8a4rIbr7D4zdUn4ir|ox#Tsfc2%wdS|LOW zzaO>#cenlE&8t0R864L*R+fo>1D&V~a(RHY0$qShW=T%Fj*JvWaXh2MRQk?h5@tFH zre4T?RaZ%kzlRe?3|BcM)m>porxDw_)LjLvtz>b+e6lICjThJxjMQ)LpW4Po7zy4z zj>MbYqWl6C(HEN^75(J5c`;A+FspOAWnTanH%+7Z+i4zVKBkV_TkE_PzQK67pnHn* zobNW3n~mRJ7ImwOVYyVc@3c7Pv*Fm0$p9{1SmA?B?rtjef@pxXF_>>=Vt`X6cM6KT z`*6}!S~?TB^#$~6Ix&3ziw*~3!YAd(Jg-H zBt6a)ViZy`NsG72En#SFa0(!77ZO(#E-_j_zr4!}N+lq-9Ydk0@e$`o`e#Q*w^Apm!AY^`Oje6xww#O?E$16%k6UzR`fEGN zES;hfJp_*1+)6pHI=;1H`&-P(=p2bCg;BQeN?>AdB{Xe?S>Za2JgPRkFpuk38U7-f zOH6tvngiUJhsG`eBV;>sL#wGtbMwA;g_lZt03Cq`R<$c1q`4k2g+W#c?bWt5P$}#; zXusJ)18pwVXHo6K8FH7@8(vL1Iyeimxi?*9bb}R|Tf1NBFV*L+`Wu;dlYKl$WMVlc z{B3=r6KgCb*NeA)WfzJ3tu8MnQt1}&N9T57a(1}vAW?PK;>$m=SI1aL^yBg+>g#C5 z)hwBY&vUXUpbK}eurk@kVfpd)$lSNAxPEubb%1TYoU0~OIEqp9qEy!;zk-#>LArGl5**H>z)Ew}icT_52)HU> z0}id=r;Y)yXmB>>WUiI|0PhX5tT+x|Jh!oeyKh7)XI^Lc>_ortxjiD@^00qm(oq>ur%mp> zm2Mi&z%5IeB{#sRl3!FS8jH;iGef6MI?nygpmr6fMSHIpvKFscR=g<@Bt>+TiijhY z9^j0sr9`Rlst>WO2CP3>5V$o8P)sw230ZYRj$Zv1b`%9`Je}}OvGKOU@&z z)om4txIbD=Xhz_NNK!utd*FxlaxY(1?tI(&w|^|=_aouTj8_2rS+&$U*|toSza0@B zA!w_2bDNCFQsR(n#{Qw#WdjKO+YMU8Xlm2%cdsEhd3dv`>(yj_jSm4n3Sgf)O7FDe zgMwylH0@`w$ASW~Xnnk7RGWw!0n~X`w`nOmanO6;)kXJWmEK#K0^uwxt8! z%a0N(?8Mu0S)!E!>?Xp=iIP}yloJeC!T}mrWA>FU*^O|UG>&JA5GURQWLd#E^}-fh zx#n1!j@m|R2qHX1najF)rx@?(h7!(|9p=kTGM7x`vtA**!<9o`sxh4|So|JPq|8Xdv}{FW=zs>iY{X{Wufk5^mdoI(qiQ+bSak%r(a)~5 zJq7Z#0mE}U=|pR&_=?)L=m@Dc*87OYY%#~`xOjD4)8S#}UdvgqWyPoCx$-GU%xr6w z%B^nIVP|R~VrX6#2fL#rPtq%Mx%~VS?ABo_ihEsEa z5~rT%xa85HQrz0o7)%5u$*GYC?HOs1RJ{;xRZ^-1h1(MeN$Uoroit~{dbrVNRg6u| zk!&>p#{;qwQ4>WQ4HwJw^nFagaVc;Rnrl8?)j-*;GD#n9TK|gdM7GtsB7sAw#1)BZ z8W)&(iSsX*p zz9p^}^cFoat9oN?N*_;IoUVocQwLwxIznR&(Z*G1482ESlV?90>blVJ3SvU)Ni0~?^yX20)ZND#2E2De`w++MyrK7*?HAgL3xE;crR!gtkNy1~_V zBZZFfmQT?(zPT1!LTPMBlp=kjB|27t^#{@VBgI zF)&6z>4`sfSTI_oxqa-S@_8R8Uc(7)!eo*J_M*73n+lxfOKp`{BPV9U9@rWjq^q`H zWEkh1m`wJtKPsXa98;JO&C2FL*F#LdI7tXiD*xh_m-Y~y=X zoSb9NM~-~XvF@x6du81x!h*-chAVe;JgLw{h#O`9iq0Gj9CSHDCCwv5juZbM7Vdi} zXeIqPgfGQtq&|+yx9a2hTt6MoG1Qj&c0qxHCx-;+d_7gqORMsFcCJ27$20YDxgMCB z%Trx*dAd*^2XpgrBcG}G`0oaw{4OW&>>ElDLqg5!@>Sbm`@(``)X zlem1Zd+Y=-f2RWVv9dX4tQlHg+~tyhCN9~#%>~bCN>!;nE(Mb!rP_rMr-3wZhf4tJ zW1BOQa)651N~jnEKBV5CxgKK0Y7bajlC-<67EwFub-G^5(H;Hp#;r$xj)Lv~L!QnT zGTskd6Q^IQK6=DuV9Cgn$B#34ve2NSX3_5tWDan1U^b_}+piz{uW4JW*KjUB?iX7M z6p#JtE9Wi8Dh$4EszJdTjMHiW2p}SDGDKg^*@-(~o3n%4rPvxSA_YrJytR279*Lr! z_HygE;aG`8VHFD4U;YjUO2amoQO2B3DuU>u91khen)s;cc+Lt4ln-Sjp_FsskX-e0 zH+1(4DoQLgt+o z2oPyRF@I{taQty7??**7z>&h^kf9e@3rKvBrK1QkW@moX6AE$=v%Dc};7Vzen$x#a z42GbLpx~=v1RIXLp(>@9)N&k6!MD;gwZ<3N3VLtrV%2;`u8fcSwwkXnC<28AcN~pr z-2m9S0vM1#^4yRSDX*o+FK1QFK(liv{SQZnIAr05!aZu3r4?kYR>0~(D?k}^j84{( zUlf?WHOoktIL44-t>|J3%PZ-0I*Gl4p@Bzu2|*D=M$Yn9>x0Fa83KtF7aX{iBL%)( z-EJ<=%8OV}9abRro%%PLL!V6UKTIr!&Htrgi?0x3W?I3u!;QdP0l2hMI1d$ulB|ti zdEWRQ?pVw%q||%I5goFuvWyI>P`Zrs9jVMTdr=-(PDt2BY$0$!-ZzT5WC<_57#TBG zwA-?;IApLc+C8li#q`^Y`4p+2P6E;J#dyS(>eZVzM=j-jVD*m)fky+FEE@n{K%l>a zG1>*|*;ydIt9F*dIv0{A>+M-i01&h&es&StgLM&->I1_-=Ph@GHFW02i#2A z^(nsJJE@|L18_VF7qJqPVfGzP%@aY!8 z##mGOIxjMTGi^kU3`AK6FoN=m1B}Q>71Cu2T_>}l$*wYAS6F$E&BZ0DjO>|YXG(S3M` zX2}%OM=5pip0FyFkC2UBgk{#W*Z-ll^bp;4bl6k0f^YV$UYs@$Xx)5K8;k|#TwL3D8|yM6}m3|@w>S3|60PN|I2>-{7>v! z{dsdhZO{L-e=ob&_3}UM?;qU%BmdJshQuY*d%X-~}qp&oCpW zGHsHs5eody`S!+AHGci*HpUtYr3%tThNs2ic2oFpwtK=?q=bz-9s1Jgz-Jk$dTR?* z6|m;*ixkDGw{PFhEcfmUOV}vkXOE9x-@a`UncRUYuO8lpt=s{oU<@?v_VPboz4D@V zyFVQMkeW_wW&qKDu}ZhS4o#6(b~;;>_qPtwOe~q=cW^#pHVa5j%LHw+*4 z>Y26+Fck+SOJ$9D&wZHihV}DJOBh2h9CZV_GgRK=K0iG49;^E^x#5K0A?{*tWF~|K z#Z!w+)aD8j?4nzWi5#hq;V8)^|M=GG6$-4$oZi~vP0N3U)Fb;13a%d~R|%}E3(iiB zK3$Y=JxbmuC`soWd$hG4jpvicF&TkW^;bHyOms3|&F`vY0@srq+6Bgl(mxf9^uoTy zS55-D(MK`H!y{PROM5%d4R&s$D~cXIJbL)hl4HoxHpGz3gt-=sLF@JWgKDqQ{RP z(_B5}pmQX9dl;db;(~NtChVMW1vr&YqeqV(y`16Yg~k2^HPQ^r`S^Semv)D=#O^Aq zM%;2@Zjn*?Sl!7kFh~36L3 zqLN1V0uxn`zGPiIdt({gTVlI=W=!lc3cbLomj!q$x>zqyqwJnGY?b&Wmi7co0L4U# zc!Q7spQtKhw6wSEYWHrw5XsU$patDWD8v19zT#+LrUJ$dP=HjRdL;r2kQBhN#3|^s z5iAR_Djq|;y$0jes=|Q_p_Z?30J8dekK*IU#R57FOnHgw>R`ctaKS;jdRGGJo?~oG zF{=)iezb2v~7>p1VFd-xpwA~cMv3TrgM zM@hA5sEDVU2`*Ylk{A5+(1IgYVKs16hy{dIbgXKW=*!fqbD*Om9s82?bQm`pTtLQpsx1=flJ!9j~1b6Co;w3l@wqjz@oHrK`a!3B`D5ELTffMDQX8h zYa&ql$rGfB79yeYrVpR?o;N@zKm^1V*)E_}Oo0b&g}pP*69X-Vze;dWHDCr`Gu z(+)R+6H6-KXjm?W>v9!79`z_&d{DM}v`kRAW~FN*?*c^tlte<|p`NU4g-`G@670bP z2l6iPt;N!s5IYS2q1SbS*etAmZ5Ur-Kp@(Vv-=eFiY&Pwx>j z|Kt5ngM!_NK77omEQ>?R4JuY*VRr>ndXJ6IUsWd^Me8@C4v~nzw8YMb+s_K)cwoawBX?b3*w%52xX$+dm zhq2wO@x@K+SYGa&I8eC_qHY+|DU4uQkS!Q`hQh^bvW9i4Uf`wcOJ&X&xa=BF5CKS) zbg~nu`DI78NjVAy%3=K?8NZQ{_m^&3hz+|Yv%uTwa-6EZaSjVn37|#MNcJs;h~+!n zn>X53!$qFvcVWSmvy1hrnG)e|%34>ti5AMsBV2xWI4+e6ZywrNVxty+e;GXok`iCl zDB`r>_QeYdOQg!D)qd*kK~d@-b;awR)aMQcsp^Xt>MBIK9jTx%cP~U9-x#tlw zM_|6OXngeKsgA9Am3m|00Qff;PA@#1jqUbtLO@XCj>|E+pYd&5+edno7>UTcMY*zc zV9da%=M~!BbQMf~J@>6paHH%rcA5dJNjr0mloV#GZ$w%ZzalO{VF z?CT8){c6UqZ~x`t?RNGsCS#lT+ObYJAo2{v_?yhQXwQ+Tnf&lyiXq&FEjidHVq2lFX#JLAoG zxTYS7eurdcWAp%Au7U{Z+_AY>z)ny>!^aheK1as{3c~o)cM)+5mfMD#Nz}N?uUI1} zT<(UHd1b>y2Svcn)!6(JjDz8|qJp-YGg>YY z>V-EgQDyot?j56UN%3WU0G`=EJcEl7^WaoTWerykEA1KP$3T#_BOR+n5md7%uRbTZ{4V;fMLp z>*47S$TnMs4_Kw&Wn%`MR4MLEqN#}!X>zkOt-w9+M#Dg@qILIWVt*A75pa9W_Gs8~k#x;RI0 z34u*K=|ta*R}^#TV!kZJH4bhvFS|)c=B^x3V|}dH*4d&xLpdzb;ik(=pPA zM|~NIN}($(5s#|d!Vh~Qq_Hxo4dx3>%r`8E#ad9_t$STU)`$D%vSo z(o=9?r&^^v^&{n6Ze&J9ml7VQTQ%-)Z*jaShAUmO5)GIv5P4$!*~C|3f3_5dL@t5W zh_=a@*rr##9F_TMU>+YfZ;$qH76bl>Q{*y8ucZSu(id$Jt~#bAl`m&Hrv@_WFl{fD z*?F1bXO?N@sa^NwOq*Ot{j(OOKkMOl8^)OhqvyeJtG>LZ_P$fwSj%=colBq^FK3iA z_fxTzwF|$T z^hBk%EvoBPEqGfR>p_pYF3r?K&BH@N!2?$x0ZCK!{7 z_q0O_I(3rF(F#PC>TI`>9X1D}$+1y7p35&@aFG*Y9vUxR^m~V`du{hsKvHGlw$jzvkd#GY2Cy5}vM;08|=?^>Cw>wx&*Lr=V> zMBZW~A8PtML$9ve6Wi{|n;xv}952GMP?cj~F+H~{x+F_+aMGbC&0C{`x3MWEC~ zLpsq{)YWokJ1>({Hvnn!b@^{cKOOz_&0l}|>aVTno3EaK^X$hbN6%7Lo=7N`Vz8V~ z*DD6oBeHcryj+&rNq@O#$Uu=8so35}lipYEZNB7AMC+p^ec&qr%o zEpA6_67cJXjC!S!T~HH>A!4;bO2FU|H$~m2dE5|Jw}pWe{H6TBS`#=C0V);bFT<4b52AubTFpM zqLCFFSc*E(KNF}+G;U(MvzOS;2-pY9fkNn{ z7X)85(vnd4cT607A^2-@qjC5~c3(4$qdJwSY&HHkwb3#>C>BdCKL_1sU>X}L;UiT- zQRs(0&Yc^ZU%%|@G|)An_)CoDKu4dokVvUTsaw zzzm1-^TIDrPXlEzIdGw~P_a@HuX&%U1NebYcryv2@EC#Cfg5 zRUM79CG_rW!kLWV9f(@)#~~lOPN==?prIXZ%ng;)Ne4CxqH455bzgk|Ki#hK?75DHP?b;kI+z@Oa}8F%Jq{?a;39i`AcVFubYKlgH&@1G3GGN1lFenJ zlv)YD7JU_~j*G>~n&b5c#?9sBUI9xJmE5cCLxwUbZH7vFv$>kZ>rm|Yi>jeHSNy=u z{`R}Q+ZZT72(Rah0|#K)=g)aPKhlHNdNBpV%r)@q^l%3!3G1EUHx9qOTU0)ouZnQwSY+rgQS+ znc9)zj1JtWz;h1AUJucU;cl!q$e0K9rd})L`)LlnfgNhwv?^ZTemGQgcVC*rSFH;r z2Ny5b*cMSzpi}s#zGPn6tkY!!Sp28H_=S#-i&w8yA@#*Cl%V2F%E)KG2s0*+9$A)I zWdA&rh3f4dL`#mingeTvU80FiRqnxlg zB1OH<$$+uj#f!4JB%2p>5Ga`ZINvoM9M#;?#EPmKN= zjVSn2t!1%+GRrb|wi_X?e#@@E_xoReaf*M+}BK>ifBtQ zJvuUJLJvK@bYLowZJ@mfjn~1)U75I}>vWj1Y9d>N>t$}W*Icxv5|;;DQ{mcE(Yv%z zQkUQ34H&ZzjA5_Y)Os0vNe!!An1tH2Ws2IM7w??dk{^% zNYV%>DdJA&H%1NTeURsa*6`&l)?ce_JlVaCL0ubm3pVVh)}3;&H;h%L4g|lKZ)<8# zjc1P<#p?~KW=X1IH%(fVNM$689jh5d{FKB9F7R}oc}&*8o>DbY9L%K=ARU92g!nih zT{DG`6vH(NdAy{)LC3t69>#G`8EaiTkBH+fqYHL1mzXrQ!}YpOBXZ(sQJgKsfF(bE z2gl*RI^NkIKkiQ@{@+`?1^hGP|MlSEekJ~2?~nL@|CAp;{-2)yo5%l4OgJ5}3R)We zx+VsE1MTPY?qT#K!qj7phWK39dKvZKe1n$26DJdIuhIqj@0H8P4@cjB z6<4gz2ow4{mcxK8zRQ*T1PtbF-jCylvqgNUXN6>(!v;*$ab>43Z>gIp2h^BR6v5MC zc0%b~7V{M=p)^PZL?i%KV=WXpyuV7V$tXGs6(@7JcFzYzT-OO*K(9B9{)ckNtlP@F za8RNbb(|pwec6xmE@oAJr}hdf^L=YrtjSEvm>y)&ztfm!<9BA*JeUZV3`dQCu4ZU-etbZ~ z?solQyCZv`hJC;|d2n9^rMJ9&I3r%Klj{jQ*JAT?uS@4EN3>o+&Nu$`23Z;1!BJR-oBr~WG_AS%%6ZiubkhJ#1%Z`x3_G=fQ&I<8yO7YxiF5?GwMgna51Y@jvYJahGu}YS*&gZJ9(h z1}%4b3YU9Pd1v2oQ=(Oi${v|zqb`}321T}Vx1?-~)@0I@liPv%D$<_np=NJFlTfmC z)`E==4fatCd}y{jJy+gb@LnD3*kJamj}03_3GV~Nk|IlXF6kBx7t698%Dn0mXAx>u z_6&0#p_&-s#R1Rri3=h>izx*6-JVD)PyWdtE( zSm2@go;M1rfe9sA?$cDUN*fAGlIpTai4K_nN>a)ur8(qBlGL(ENe=mu5_C|hG z>Sv{SC|NU`lGG6&Np8v}o? z(uNbY^47{DV^H{*?4ya4tt5N8t8*tkkts;@-n^hXzKiD1cwVwu9NIyR<};P}RswGp zv-#}uoYMMf_eq`Fi(@Vn6jd9pm>8XsBVnoU68sKtT$ECRE=U-Su$+!$C=E}c%9Vke93)#H z!&?J;kKu-(+AyIGmxK?2vhb8j5Bh_4Pt!bymmUZwZdb-_NL}ig4smkPgFrdxP+@n7 zOZpw+veY3{y0}v?qi&bP9Zwe-tK8jgwH)qvD%Z8kb+(r5SY>bLfwt!(E}5Hh7|EoW z-R-8;;-!WR@2?t%AuT^HW<3=2vM6eM@($1!%ARyUf;{CtLoPbl!3@VrBXYvj*!;- z>*)1_3=8{PqvhWx4P{9>wDJ6HM>3Q9H7FRXQAV5`cp!Ghqrx$V=GGl*m8-9lrA{&?XpG5 zi^Kqms6XZB(&V#?p*G#oNv99&d59j1#a@ky}lHm-i7 ze#gN9y9{`5RPT+-0qwnJ9;$|Xd1I zlBYV4NRz%wF%LopJG@dK)4!S8xh_&|9sPqJ$zKCOKOH1)FYtjb?m@$=95qyhg<%$< zrVq&~Zov{1^s89u2hq~6j7<-rA0Ao1c4+;Yu~8F`tsXfKbE|<|6$|6~vC|{}#lY$6 zz$#wB&*OfuH~ngN0{F@BsPXEnXKrmelR~(C+^-!;KRlEWZfVhQyFpm^POlujY^(|v zEMED285q^zPao8{oU#PIuOX@O^qFhW7)%}JK3Ir|B?c}$j!HAMjC;68EpD9tV5kmr z;{F%98e^C^atlr>gagi^pT{ekMy#7e%>PB4rxQqs!wnlA>xWWTI7< z!8}MBbcmwqrb%dGPLIk-r!L!8R|@Tmp?ip`b%s7%H}tk_6xt9F6fo&?^Nt@T`?S&6zyqfz1D$S z znIr^G9m~|ab!n8*qT{)gc<&ySR$$N3F%__B0f(mE?VL#HW;ujj{@&1GEximvjHWeu z^F8m(#_v?QW>!gb&Znz23SEAIo?W^$^>EnBoXP4WjU=V5~6aQnS_Gwi(YCu zC7qY#pCAlE2uD3f56R_Qk*hqWhgY5mopp5Up3=CAr=4Fw4Z5e)r>UhJB)t(udis3V zytf!jWVef+Q}oC=l!{J=^06zA#o!GO>i4nWmAL!pfsxu9-^Rm=`OT0Dk93JqrNoFz zG>(MmYV*-fXG8-Tj*P!THxiRgvW>+e@NtaaC-AFzu-8lB^9c!3;%+e*!V&NV#jro} zjhLET8-J&S8g7ePBYix)2pXhFq)%Fp8>^<&+ulX!n*yrqs*av0vu0T%7Qx;~_~)gS z?JMh`>k2P+Q9m|()W5G=aJKiDSzjs(k?}|x;z3}04A~_L;r8`<88#g07YzP@fneza za;cCiN|wsc;Fnc!pTEPed-&_VUC+r#sf3X9aa9h=X}K!3(f10|`~gh_G>jUnEaHe{ zVxtjQrI{?#D=1t&c~hHyvKBb2-UjMQjl-o3FId?TnPo?f=YjZWJ(5qzt&Wh9#nkDm zT>71>e#;2>3H4EWTWu)6K|`LXR0YBiACmb*QYDE`xS9uIs~Tuqr=Uaj-}=$TgTp3LPc82ZW8A6&%9KMs z{Tqtqu9~qRjnb#n-hliX8_Gu0m%kgCBq^vT)A@Wsafo1yjQ|^f+Jy5}*xs<6v!>g; zhT^HrTGn%)#=Y2oeyi8nKM+BFpy|BVsyA$vw%MvGP?`NY>v}FO#?pDmt)K?4NZbdu zX&1GS9&;2+I_B`Ze#Y2OCZZ1V3{RLVnhYtaiy` zt(=ZR1Xh)x0v+@>(q^P^$9Wt*{pslE|BRZx1*yj2bDV$aClb`}h_wPZ%vb$Q*_JAT z`r~&%QI(1@hjsC<_JR0+`N#MFLC22I?EZ6&|IfW%cCYLE|Kw2o5C5Nk!jI?wqo@BS z?ms~fpD3mWv3h-8Y)T?z#MJONOyZ>ZM!J{HmnbG0&)&v=J$nA1G2hZm?l#4bsuU*L zgn*PwZls|plede$Cq(DQb-YU4Pp#CcF`zFrx?@Wq0R->L?Tgt)~bVz2Otz5?j* zS2_i}4jUsS)OpV7`ifP>*)o*l-8PAJjVME%P^jfTI&ZDW1j=!T0tBFy;iy=QXpWaQ zDgg^r#KOAez`Aj(WfC;@zp-|@lQ>m1mzk}+?M z4jyjIOSse41%(!xm86H(n9c=6vjA^ZDOnIwj2Da#$*jS8I6UqU6hRCX{31;owq1R| z{p%`Nu}H(dY4$)nDxXlF(_h`O-K98#B@XyvJZmQC^aZ8oZ+NdHPNUV(E3!q+^PwYP z!M^z|+%4`7?hfycFu?e`PlqpCq9o}Akdf8-1rD~U@HtUIBUA^lC`K!YQ>8bUY|$IU ziGi7LGe+2p@D7avf!@+_iXEfdJup)5qv(8&VKqs;K;bWE<1q|}fi@;;PgMLV%e!;q zNJ-HFLc_Fnf{N#IJ|D?Wz#g_D8S>&?oZg`HVDCo7_XcM-DSwl)H|oeBcIdh_<k`AQ(WIb*wFHzQ9Za0qtKyq*k}Nh#TfJ3P-D*aK<9mY z$Zu?v02)Sf?p&po-FHkdqMLO}S`-g89rnqm0?1xqQeczkN=?IZJU(;Iz4cN~FUr_s z&gX|%vKa%8VzI+>3~QurHKbvH2moM@4%jMwYb@NRin(XrQ!b?@2C|AUn3Y{lPGU43 zH19)rlJN}JXkFUw)mLu!0!{xmFSf&_&?X_6s%CvvM6nukrR9XecO@8HrnsUA!ccxV z2i#)x2Y#?REf@Sff(L1}`^k&Re7#tmzQHnyv#hM8 z=kRw*YR7srYt$`kxu#BxCne|o=BeaHLe{2Y&8a=ua&eSX4-T{$gz6CQ8OzDUr3}d; zk>HT~aV#X%g|ZwjXc;y-uP>1nF_q592o0 zfj7S?60n**YxESF$L~GT!aaSh~8H0T5 zf#o4lRn>DZ*mw8E?G5ceF7JSdyPKmYPcPb-g3britv+h++T`Z;3u>|*YO@_^R0cdT zoc!)+SvW}^CJzz8&3G1zR~B{Pqu;B(ZYdFXbw}Q*@!OubYCX)SWW)mqi<%TQF}ah} zx6-cdsBTMlb@$e`FJD_vp`(kb(2kUUcizE1xGDW^wu&*Y104yCVx~e>!Iv!W?KePtj7%U`dw1Po}jamjQ;xZiUxGN^lcAOiB3=&oyTE={qcy*ns$NLKr1FAm#>E z@Hxeum3Z6PH7iBqZ416)ZO${xuG^xT7opTnxKl@Kicgy`=bkhs+c%=whRRJl`aSCV znWRvm*DyB5{##Ve>JWf?P~=YZJ8sn~ssl-_xTBgunDF3~m|s85I1n|PaOd`$yxUc- zH>i|?-*>3s7PMW16opjDwY(ZH&dV9AmkhqzS>EZj{{&=r0zZ3E)am`>pz~F`_ach+ zV9}2Evffv4eth}W(U(uY`s!=-chl%@vQE}Jy4dRxL4(%F`(!i*E z_Ih-#)K*J!`2qrH7}=#o^q#5o5(ITYoXCWa_+VW8C8l8OcJI8L{f7cRov+A#rkgCI z>3FhoF6DlAY7jNva|NW^st9@xcdsFhv~N(Qx_CZgx2zXkou&=;Iv^2uWMJ=J%LDSQ z{bW27m)4+Cgs!I7C`HUY(z+s6gh=LgDW}eitcgs<0`DTsL1Ho7J}hV~J5w2?4|Puw zefN|-ITLnSiey57VG#&BM*c;Yy>c00c;RAnDME#qG8pVuiVPMnE~Cj}elCLCxw$$w zcvR$TN(r2tLE%vJZFwq}<3o3J_D$Ixr`xm<^J0D#>;$!M@aYlmfDk~b1}2Wup+@ef zB!o(UL~9XXc>|t2MP@`JYv~#^kJYAw z(tt3kY`CeB$}qwvmJY#SUE!s6g`}22HCfwCXqYa-B*EKZRX*h5ptAiP>5jy0(iSSc z4jLi`H)~{O(GFaUp^h=3m`p4eQ}ba(BSQ_9#pvV*#OFxvaOJf|<|`Tz78P;wlC09S znO-rkj;5HGt5b@Gd`7wwbNH|qI<`b|V6jJ3VTV@7w^r%_hed<(dlAPXlj}7Ga#2BS z8^P2k`p(SDO337vo(DvFii%?}m?+V8$tQ>xm>E-e9$lFr&zDRsQFzW@z-+uZ%q>Nm z5+(|ZDS;dv&fp_dZP=}<7KTL?j4vb}WKL;sFge`_R;;~*U=;I-U+SP0B~y0h6e)E* zApeC7!bq}Xbs}wCq_CtvT-}m;J1sbMMT4`+=?E=tt0kjJo#Lo_(uviT=T|``-lcWMKYX0~gXKOC1yJzQmm2=3_ zs@V1*%EZ7T3=utx6tkt7Ea`)%&v1BH6YMhS;&uAq-u*8gBn>yhAo&4wI;%sQ)v$DA zD-ki=$zPN8q0jg@+P^q;?%~#9XAOv}2S-GeQqITJuJ=|6(3YbjS%hM*aQS#X`FtAl)-uV*T@r0n7jT}{1moo`oxZLY&cLVfP zE!RVDs5KPCs$W^5_7%w_rN^3g38#)|Tp3uEOSBzP+2M2oKb3t`ynGARbn6SaG4WzO zcJ+M4S~}m=xsE{B&=+t^(iyZ|(MeHS(K%;Vl53=&ABxS9a2VK++Os_@Y{fuygqtYT z53XnTK(^Am(_)33oX>N7a%ZLz!L}AD*coGSr+9Nala03bclr`;(-vP;iIwd`^i0?w zpV%B~8bL}_ma!A77u%ZN`i&SrV=uq}7qP=Dk?GgH=8l9m6H0?ZTIu?Gs9?p&mEyR1 zdn6$fkZ?**fz)m4&~O=!izl0Y`MC1i(RU4UKKQuSLZhy2M;6~lHFPc1>Ge>tyoOi5 z_6oM_-viF<8Fl;AgX>Sz@Ctmf^(xGh(7m3)MSCI$JIRLM6~UCr6Bv^jmt zM0|?jSK$|Djy85n05Reu$k;)ei5G4&q0kOX*w?r(~im+kr5l>H{ zQ<#ub3Zk7A&1#d}60x~7wv((!x|{r04M8f)%YL-)xE#KdbgP3&I6@+}@B zv}{n?%zQ(bfYb>K41l7X`Q{p1B`-qa*-E6Ed?;$7STfaU_x3)%Gw2U@dWUXHQhR*E zNB^c=arRlxoG5t&J$#x43MHF3vQA$a>fsx8MX&DDXl(^W`?A<_rl1NfvIS~d1 zCIY2s;KgG6w#3-N79HF&liioI4F2WtuLuA3yVV(uLQ|@ZAl$+3cdwsR4$OiR*mY*m zXdvLoh&IBl`F+>-FRjSFZ1kfSn8yYF-D%{}UgO0fe{Hm*>whj$%c+OVUdSe(j#I-eog6Ku=E#t#N=dM&2PEEkO6Y{AUnR7LpU&B z#xLU}8P3aPv5bz7F%4cZJ1v&4UPZ57CGi#`;h+`S3v}JT{r8tMQe~WzyM}V%fTe*) z{8vBzj50F{Uso0JdzQ`S#fHo+aELjNG>Mh#$OTBfi%=mt z-dtd+Oh@Lf#qDrF^WHL8RH?WFGImT`shR95dIAz;>A0PC6LF{dq@tT6EF2Vz@n~4~ zI4rkcyEF}v&OOZ4iJ|TS^Q;xd4#4;pkQP!j@=B13v1*0%Unp$Bm%q$Px=TO#@q6WO zw)DWg+kd@4;lLHtq4A>8TupX`-E({&n*RpKuK^CqJ=;}q72SYFNZx9U2)&(wb zfcxerudn?TA0)H8rq7XXXLn_i5o@pgwf5R;uf0CrreRD!Ds}K!oHtdpih4#+T<{h#R1)HSDa3!Uyv!&KuqIfNNfW!KQM7hkB1;U@%P=4vb`n^U(31w#qxFwbdjTECV{r zYfxzv>h_v8t;rET8dyo+V>6`7E{8y($XDz~XX)3PN;AA^HBeJou$hPLH6c|Dcff3NW@0>Z_5$tlx)#YSpc zaT-7NzDG-zyS7A@v(=W(L%B_O^wEFkyH$!I_(1@zb};g<6W}Z^q+cmJn(FFIV{o{J z5@MKs)W|`(MIx;TPovWwa|iejcAeAEHwBE_vhg>)gyAB0%nDT~x&rM7S|O^NQdh=q z>tbkK`B;Via9qUWIwV`qiPdSBvC|&6)AnWi^=safd9YzoO#}67;{M{K5L>Pe)u~(VF12ds z^=o$tN`Oo5CW9r%$21bWRURMnfaqf54Qsbp-*El9u?J9~TO>GCa9)C5^}f-V*@*=RH@Tllqe`L_^@*<>>D9SamJ zFHL@`F6VJJ5X%xotJ`#0kdgqGKZA zs+ad|63139^colpnX(qUTRSI7-JB@npv~=cBNW%nkh-bWjfHkgdzG@_AD&JFyDAa_ z?o-d2O30|(csHqci6^+kySbbJ7ZkH~Jtj}F8)kgA$S>mWp3lyg>iUJ%O}^F$C5wwx z4)x9F-Y>rS^mm{CWlPyh7FeS8CJw{MF`u=JT;M}sX@lhb=@bDD0$Zlbimu3xk(=H> zY)Bbd;4>&yho;c2RR~R{qE@%7nPwOctgj(_c8+moCv(b#q3wW4;TCUgxe|>-IQA?K z$HS=S?W0}m=GNNnvzObW&Ve0#B)PDvHFPDd-wlZ_)Q=9~+>Ji^~VJ}-Xzne~bTcH(!o zrUxK2yhYN&fkMr^zUfmfK$|L`%!&w_O=Ho%$Pe_*Re{Lo$T%L&Ss6~-619`>$1IN} zJSq{9Q-OwUSX&O&G3Qtv{)lWweZqAQc#O_*&l1d+m1#7G?bMOpRg?90mX!mnSZ^J^ zN@bf^4~+P8&&T0(w@91ADVtR5?$I%C*`bbSP8|zXhsGvMQdr~;HP#clb2ZGv#o=$+ z!GCsronUlCq(BUGMFvpx_PsyJVK5$z)3=YNywCfyD_@cwzlYs$+2Pyu^Vw=T?g%Ob z!wXgeNY|}B{Ty?>Ij^Gl$a)Fi^y@23fZfTxKmX=8-bWu%e2Wa$05&Bm0sZRpFTN;3 z8C3bD*BN<%i!mrQRxdI#*z2S)PZVIo>UbFhMjeqfRdmVSOTk z9d~TjIICT{o`WoyQVs>)wm1)s_m-{-ISU9)d&`Z|ux@*|?02e(^X*A=W^Yg$6vXaZ z`1da21tr{r;cfCG#=Vw|!NkP*GbNLMCl~g>W8aENEDn-w7NOB-1ObjoV333@tygo) zAltUeVGSy2{A{s+A+m$g1W4;aL!a;z2whk}`>tRxrx@BCPCApDAV``y7Cf;j1_AT9)#!bkj;%E3W4x`->7%zB=lW3Ihkjm&nBP+>u2ch64P= zvIWKZq3?HgIOoE)0f+DO(K5SEeaF-nA2)q1CYIj(to{`ry7dXXs&E;^h($&J7Lrm* zI9MoI+eT2h3uLqf{F1+MWe;(=ElUXOYWBt|#1SQvJ3dyTlLe&l5%995auaUE%g3gc z9T!Nyh^TaBjKE(4qOZwpiPJ5={;XTsC3{PtuK&^~Yw1>6l{h&Oz+ZN6(`0dcy!U&e z;9qvHXVWE|Q}?dr`#8CUZ(|)W;Fn!E0bqeYR|T>ueEYS0gR?Mv`<(@T!x(P%BLTVP z2X9(uXUg6GBs>jopZ#W(QNt_4)8ePIk5KZJWJ6FM5YUNiM`4Y zYTJt)ea~{=v)EVPv)m`&w;bvTt&*gs!o1uRqm*Hh8rt4_qH~>|gF|g+cHSAH)MmBAITL!^HMA?mbe7M&9)&B94v&tcr)(ez zeZ>!VWa;f$ZCjOY?trL zsidF^aa_?1#p8dELer~$*m7;DaX5LOzf5wd2$2h=qT?|Pqz?6JgaGPOA2_#0Bhs&@ zn#VZJ)uA;~CUC4qn3jj^xL>g`+-aL+bA~B);gGxVRCXP1YpDkb>&~!Txetdwqz~?R zAB04-rlDdif|nIY5!b70YN3WHnheXRSX`8cr)Fn4M$-oztDf3LF-ZvumxCi(aPar8 zRnsQ)|6YwQEBaeKQy;ET2cel-*11UAaPL`6f#U^u&hlu_(TV0RF-TlNAg$b^pzeEZ zQD&2>;#{y(#&>!MOO+A)53deAN379o754DTs_(rQ-+MRK8U&f2!xA^L4iTkAi6qw8 zX|Yu-1KEr9x-wKu_HL-8Km}FZQnyywy?GJVSHp`6ItlCQuz0j|?Uc;XlDDW|cC&oU zt`MjP(L7ql3HBeTbwY^<^5iYW#h$X^F`C0E<8)i0L^6z^W#MHwo5A+T0W7)Qx>m=_ z#NNfZfeIxZgCmi&q19X(jo*ee)~g)TK#E3aoSrAE$)a&DuXixu2fjD7VwgnbQ9&k>O@0CjPFj#A&b7Wu;reX322q21ae8Q3)|q8v$|L zGx+d~j2){Awyh*{ov5;8Xk5#SQrdBBZ?>U(3{$)sj##RE{JqMvBzhbj-Py_=yYC#B z>L7d=ccLSilWaOlDToW838c~h<_JiC0y0uANric5klcVmL(r;0wdAQzjnpz*NbUe- zKtI*QS);m)x>Woam?X@7%mq z4`VuYT?+*ue%stc*Swc2QumlA!D;d(9uBJKXG6o2R`q++=wStfvdMe>*@;iaPME0{ zJ^P5b6n(KR&u1^a1c>!*!aiK6Hw0==_)=Qm#9w98F-57J4c|aTIie}h`e!dA&+?yG zS;QoV?q)Ka0g(o)z{{2@6a;K2qbtiYHk)QSN_CvD-Sbvnb(Z4`3Z7$mLFtkz|2Cbt zk&@r{`ggPd=g==g`2Nm=WtXYy%!zfV5;phc(29+{Npdy9DTslnI|zpS7|wnacfo1( zQ_JEk`r%!WcC(e*z85_uggRDd)}pXi*4IB_*FIQpWQ4dc70zrKxyF9Do>Xz?&tAsW z6kFNn_useEcMY4ZRuJR+yC0n#e^6(t3G#hCMgB><_W^t45as(is{D|>sU}M_*9CTp z7T7?eO19vwUKD(qM^gk=;mRBYM$(65*BNfixCuAh9hYA@o36^Am}u3WW6Ow-{lwpd zCn0KpdH09@Q~gBFxEC16IB9zUob&g_4_jz~w- zCWcK_L&WB$5NyE;KX5%qj}w{EAc508){17ZEwZg`7M03a!nPe!C-#IC16ixM|M_r5sWei?z0!41gxP?Gmj1s(0 zTX>VWQ$tS5NK1KA+8+>-MdgpFEp3ll`#U9~^YTZrn>dQQYF0ma#PLd8fx0 zOYN=q-?bc($e5X#GB+(RIZpO(o@(v**_o{$N0CQ3Saxpt8R!>1L9RRpY~y+CZ>!Cq zDlQX>mdDvPFi%1e*+hlZjG!?2ZSM_JO_h3ok=y`RYQFwV;^dGMF3^J*#LJ529OAs{ zC#eaw+EaDCfCw!OynK@R0yA8+V=T zSq_9Rfgcg<*1JxVDdi)E@<1N4nhBKIyZyv##x0xa>(w-#$$O}kDYJA$C^CP;R4HgI zMU723G&xErPi-0IPJ2oi!sN5AgV?xS$OcQ>B2GRvjxR|2)l@bJP(9Zqm_U(BIORzINbJLknK2N|Rhv8_*dZdJc$~wNtFvPcsz~|}beuu8sKU*0Ft}2j z&Fcnl7#ht`MX@`XVx1J>yWw75b5ij@8cp8D>3S)TB>+aHrer9LyE4b=wAd9Ar2=CL zfOby-C!{EjPiBUv_)bEt5D37u9O*5%!KisWaRJ|YRc1GT{aQ4*!Bubv!dPJz$&uxI zOeJ2Hqw^sa#~4%=222N0QM$gPvI!qscK5;0NoCglOlU{`6Ud~Is zgQ{3S1tr_c7{Hc)WV~N?X*Be%yak+hcbub_QOn-sH-4H|pP4XB zMJizYoc?S{vx8Wd-K(wB^ecOs*wnUiv~Ay5$@3wJc0YTGhp?~J;j4U7g!7RWbY^qw z{Aw;%)Val|l1h7VUgmM03$dzVHnXC-AwQY%eQ?fnfd^Ond`=cAjj3qS*+OAUMU{*PDjC23z$|L;eoT1jUvYnXW)2ztotPgMx=on9}hg}ZG+KGGP*!wB) zpEtXm*3ZRILJbEtg8)2pN29uaC|%cBVV+v5BNihWe7NDM7yyT%*0rX9zAMznnpzoV zHY`T1m&pmce%O*OC+mqiRshM~q+NJ%9e33cutCV0b^DKJoIa zY(BT~p%RgA@}E6>Mj3t@WYt~P2Ts!)An^6A+MPuQ#)%c2as9dru&RP4x?=0>3&pXn z9^RcoWPgXeZ;g$oPu$JOJVhxaymKp4-<}Bij$Q7-C z;vhNK9Z4jNukMHw0iy?yw|3nQSj2EAZxQUu0s~UkT`_yFs=i3aI9f?m@d9TBZ^50F zryka>hY~k7k^X@h^H$W!ORw;um8=b^Wkp1-63yBIt0knmc$_xPDkq^)58kb6VSb#8 zqS?N(N`O_Y^y;rU5N%|($H!5$8Kkf+bJ#W|d&AlDmX!!H`jDE7I_t(=I%~|x3QcNU)A{QC$@`EF&(TxwBqRYZDv9a<>U8l6`}hs(62FRL;>q#AlZ5H|auj>zb)Ks`98!;zkPK}k@9%1n zKK7aNL@n}T zg*~<%LTab&S*bDT{eZ*an5~#wUrxuQ*p#K+5y?c}{z#ULztj*V(3 z9+a3OoU2^EXeB)+|3bR%uq&!30-YZeC-}-7N6oCJiv)eOP_Z&W|8O8^qU9^S0qo4g z`NHZN{lh4?@eOMD$YpGCOIcH9*Yji{!R5!W@ws$V?ggIf3Z2+Y70;L|lp7uloQ#{9 zV7+&^XFp4Dv(JE~6UNRafqb|y=O%vOYvaJx4&z&OXelCWRUANy0{hmmmBb<@S#G;x z>MJ;NfS^lKeV8KvBmtDM?u_(M-!YYOfGoOFzU*CIq6j3WJ9#=e?<`WX#8o$C7(>h? zT2Lkd4&Yc}(Kmnm{dG1b+1Y-^NAi*-+BqiUyyX0|Mj%|PG4NFB6OH-Ins9ALRrAAz zND)#Cqs$COv&C!$XQ{M%i;jD0*jQ;|`t{7oB4_uIHZO&Phq`$_Z55CMyIP?e-zDed zw)<`mp81S=Aia2A@(d=F2?^J_$E19l~ zNWQ+rppd-qB*+uT!*T;Y6nJrqncOh7?A+3E*EZ%dlB7!Irm{$l(U=FI0p3 z7dz1>qsx>i1i2XcLw9!(WYTe!n}af#P^_A!wgOj;#YU|Yhmu>+1j)KKSxtv9TvsJi zl1eKP%QnL@nW6(Y<{s(tK4El%)0u79BipN$3A1EG5^psk(e)UUGrdWBg);zq5{(je zx94`C9!YH=WrYzXj4T<6;V8u6T_sDdFqg(#Dx^xjW;|oDr}^e7 zm|X>CU&ZQsp-Au}#cikQjTk`N2*2)LjG(5O%A$xidKiV53j+rP@o15!cQSY%VjF5{2&;L%{BM=-JBO0wn4{WJ&3`ZYLfX66;*oMw_v0DUv2x77kIa zSX_~KyzCbE!ObF>W2Q~Z35RYMMl+S%Piiza)H5#`fhdv-JPZt!#Sy3ct02=aXV=+C z4R$(ZE&RUm0n~QXh<#dwxQKHTct*m%Py+w65P~yN;hmM>fGb+`^DWv4`0Cz*;9VVb$0;H zxEC)L^vm1omlf9mw?<@|&gLqDBdW4ELKd!e)*ooXOwNX{I%+z(IWqI0dMXRbAs!UDir3R}R#$8Cb>{PZ;T+xn3{)Sy) z5C|9!=fHN{XDs?}bLDM3&$NjM+qNp&(}9=oQ_7IYQgPYkvi6Rs{`zLQWC+t~BjDxE zwYp7n0jBN?x?K?0_Is^vH+VBkWS{n=!OcD^$uGUO}XOd0df8l^)TQZO{e zYDuo7&8g_?a*Q-@kAPm&c!P_Rkdc}hdqG(Ue7dOh&8cd`Wd#p}Y5DuroxMK_9k6j% z>1GDqlkhC6BaNBi%uysvj4TF}v`Df%Rmwm10k;SXbu3O_Dz*kHt5gM;vmFy1pvnyz zUU+9I@EAlRnL3xcsCm84FZ6e1PgPA&SavFQIYt+Y1U1v4^HJHyR)|(i%c7o;BcmzM zxFTkLjp`A*qK)^7I=KUYo9pm&E)z*Bz*n0(du5nk^1SLqO8;W0O~@3bT6G(MhZ8>V;&!Xr zLxkVWrtE6PRNpSFij3{J)bde;{brRDL)2RK>ewEEcCZN4O_{O(VeOWE_E(AM7AdO# z6P7;hh%MKgzJsZgQ%{Sz(Jsnx>NJ?$DER7E(CNSJ z_&NWn|CHiCrPB`{0%~*orzno#og4qDAIH&8@t=N-pJMzcHT^#z1e6_==vMbB@PJlN@!d>oNw=U(tlfKA!T@4iMmIXsTxyKf|2 z>SV0-9N&0!{Y5fOVh$ThBQ{J&vumtwIa>kOA4jM~_=Y`kNV)hv?)C5PD(Y+&Dpd$L zCANM^PCxh_&-*(5IC<=RqwivP#NxnTX}OYcW74XKm{q zp+L<630;VvRJ=mQ>R2T*4CRe6$%|M*!b|{= zYH8H119)q%go5+|5AhVFuo{J^S`1%(@yigEfV7Y|t+$H;+Lo?0tWs7KFI*~XW`7_( z_}{DcsNCriuqA=bW_K+uh-Z`-0IvgR3e^m5yE`(sMtOSC^{lwX+5iigHTeqlyCL$< zzo7K>nwAn&&CvkZ{xxm6j<5_L>5>Rrg%=P22;~EH+xu{sUS!1NA1Yr!1Xc9N3TUEl z^cNHmL_|<(>F^2iZI)+re!TSpR8}M5bv41hP%Qifb4zt+%aaOwNf;!sxeWwSilQe{=zw^OGZ~-eG9gwCxkb{ zQ0Hnd*u-Acz?yxd#AAkU%mRZcZF8iOegDqYf@RCx(U$DC)}elDQ*F4@ipbIOYv;b- zaL{+Yiwbg!INkNDwmfGY@5;Zc*!QNpc%q`RNrF+Hv+a<1c3yFobbsUu7Wco>+f>^I zuASD%MXo|uHo7r|jmGzNn_5$0K;TZkG8Vv$C>}cQW>ZHYx(m%JlNpC_VR%J^^DooM zWai(=+ThW@n5o;3vjIClTlE3I&(*uYnouAHhC1f&h4R1{9@U$y|6T6wU_5L{~{R5fe;Wx~mKO z3eQcvaW6lv({~m8+WOIcUK9bqQ4qM^ULtvTsN8EPmTwvJS_d3`ExhxIz2d_EhaTZS z@X5X67X6#HeUPuO+F8tIHWZY0d9yG(Ldc);V87`&f3K!m0^8r-Ilty~f3J>+NWa^$ zzY6lxH1Ya0mo64~x!c49=@OG(1we(bbe&AGNJqpw+`tBW&uV+fKmkNzxtXvRWe$y< zB*S!~TocInxxtk;Pfk4Sn>UG`qT1uhlS%aC3E9?Q_Gq6A29qejlYlPbLTUu%A{+t^ zEvP|Kqc;{7K_P!O)h8fMwH1|NZR9HjXS{NCx|w22l2{Fh;SclXUQ1dc_O6NQ#+%hO ziE4DJeVZ&Y+Eb~rjP_4mlZo9s9JamD=&7k1=SEfEkm^;vjm`A}5DHAi*{ht2jf1IR zwoSK1L!;Rg&dqcj=h^J=tv-p&YAkYV1RT40kfPUYtWH%UvSL)x)q2HFu=woB69jqk zq@k?k>Gd;j?Tiqa0r@Hy7={%k^vVT#ZA-b7+$)B!()Wg^CLKk{HHS9mcRhX=$-7(i zoMSG+n;uh4?=^zRk|c}vs3#=I?qoQWx!nj8iMimsLNS@?J6E-rCmf$UQC2QcA3VhR z)YH&`9~$^r!w)U^SOsTgYyE~&?wp-9j1dmbz3Z`Q#SU(J{gBTg)C)I2Hit+i43&Q@ z?xieSkg-t^=9XAM+ct1BvSUTc=jEpEMMquAvxmBhb6E*Al4e@Xh{iaRIE9Ix(Wj0t z8M@q9rTYdC>$7)ngIn-=HCbjzj+FBdqs^l27;__A)7KvuQhWOJsiLob6m(&u&uHhYm+LzD@je`UydSil*CIyM{rOUmq zepPZ+RQ@UjKh4teO->%rQW3X)>Dp7X_HBSz0SpA7NBjprBn8l(;pYs|F97rvz<~e^ z3IGEI&=-IMGv|rQEkGMQh8i@{^f=_8#Lg>d7Lt=by&DMR;7nrT=`hC0$-x=3Vfw@- zOq%T_#-Mgg2l3?%NHx4*q=gtLzEySc6{AxMLL|;eh>rmJoBZn?_KJbqnl}VYj0=qJfaMg|u0X+!H4$>~y(T2|!6{xH$GW~52 zg}=5pHoDR($2koqlf=wRqZt;3g%N#To;+A8Zn71tEVm_vEnNbiz~2XFimEblLNxLj zuzw|;71D4io^#*Ysq!9GJ5YC2I-H$TL*fu|IW~_TBjn#wos(N7;fsG0E(N$Qtl|Tf z6Y(<8q|3-J(O#BzXY{U8Ca!VYJ8%M;vYtsOCmT083M@y6EWgX>onaZ61O~ZDFbc>% zmudwLeLYipU%susu4n*m!We>UsPp0BZsu-HFy8?vLH2l zTaJGrUHR4t98E-Qi2IA!NEb>+M!hR`jD5ky{0bV~Gl#8jwS?~(2a#M1MH7|NO|DIq zs~v~X|G?};u7>D-_it10{nHQs6z_j7)8y^#kL&*t;+;>?|6}m@r~98D<44{9=y`9y z^`h=$FNP_46vdC?BQF{}>Bmo^fw!0qftk#_PuBDM+z(Yq3ld_lsSQ4?^pA-Oz_*;u zNX1-^f<(y`*S__{+$3>syRs!=Q5h=QB-)C*T`$@8�mB+fPOQvnax}S4gZW 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≀!!NYg=gz4X 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

=c@+1zFpC1iBz#Z$ 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

}&czQ# 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 ZQ=RHmr#jWCPIaoB{sX0Znilvalue', so it is not needed. -** However, it covers the most common cases in a faster way. */ -#define isvalid(L, o) (!ttisnil(o) || o != &G(L)->nilvalue) +#define isvalid(L, o) ((o) != &G(L)->nilvalue) /* test for pseudo index */ @@ -92,7 +90,7 @@ static TValue *index2value (lua_State *L, int idx) { /* ** Convert a valid actual index (not a pseudo-index) to its address. */ -l_sinline StkId index2stack (lua_State *L, int idx) { +static StkId index2stack (lua_State *L, int idx) { CallInfo *ci = L->ci; if (idx > 0) { StkId o = ci->func.p + idx; @@ -129,7 +127,7 @@ LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { int i; if (from == to) return; lua_lock(to); - api_checknelems(from, n); + api_checkpop(from, n); api_check(from, G(from) == G(to), "moving among independent states"); api_check(from, to->ci->top.p - to->top.p >= n, "stack overflow"); from->top.p -= n; @@ -195,10 +193,9 @@ LUA_API void lua_settop (lua_State *L, int idx) { api_check(L, -(idx+1) <= (L->top.p - (func + 1)), "invalid new top"); diff = idx + 1; /* will "subtract" index (as it is negative) */ } - api_check(L, L->tbclist.p < L->top.p, "previous pop of an unclosed slot"); newtop = L->top.p + diff; if (diff < 0 && L->tbclist.p >= newtop) { - lua_assert(hastocloseCfunc(ci->nresults)); + lua_assert(ci->callstatus & CIST_TBC); newtop = luaF_close(L, newtop, CLOSEKTOP, 0); } L->top.p = newtop; /* correct top only after closing any upvalue */ @@ -210,7 +207,7 @@ LUA_API void lua_closeslot (lua_State *L, int idx) { StkId level; lua_lock(L); level = index2stack(L, idx); - api_check(L, hastocloseCfunc(L->ci->nresults) && L->tbclist.p == level, + api_check(L, (L->ci->callstatus & CIST_TBC) && (L->tbclist.p == level), "no variable to close at given level"); level = luaF_close(L, level, CLOSEKTOP, 0); setnilvalue(s2v(level)); @@ -224,7 +221,7 @@ LUA_API void lua_closeslot (lua_State *L, int idx) { ** Note that we move(copy) only the value inside the stack. ** (We do not move additional fields that may exist.) */ -l_sinline void reverse (lua_State *L, StkId from, StkId to) { +static void reverse (lua_State *L, StkId from, StkId to) { for (; from < to; from++, to--) { TValue temp; setobj(L, &temp, s2v(from)); @@ -243,6 +240,7 @@ LUA_API void lua_rotate (lua_State *L, int idx, int n) { lua_lock(L); t = L->top.p - 1; /* end of stack segment being rotated */ p = index2stack(L, idx); /* start of segment */ + api_check(L, L->tbclist.p < p, "moving a to-be-closed slot"); api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'"); m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */ reverse(L, p, m); /* reverse the prefix with length 'n' */ @@ -335,15 +333,15 @@ LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { LUA_API void lua_arith (lua_State *L, int op) { lua_lock(L); if (op != LUA_OPUNM && op != LUA_OPBNOT) - api_checknelems(L, 2); /* all other operations expect two operands */ + api_checkpop(L, 2); /* all other operations expect two operands */ else { /* for unary operations, add fake 2nd operand */ - api_checknelems(L, 1); + api_checkpop(L, 1); setobjs2s(L, L->top.p, L->top.p - 1); api_incr_top(L); } /* first operand at top - 2, second at top - 1; result go to top - 2 */ luaO_arith(L, op, s2v(L->top.p - 2), s2v(L->top.p - 1), L->top.p - 2); - L->top.p--; /* remove second operand */ + L->top.p--; /* pop second operand */ lua_unlock(L); } @@ -368,6 +366,18 @@ LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) { } +LUA_API unsigned (lua_numbertocstring) (lua_State *L, int idx, char *buff) { + const TValue *o = index2value(L, idx); + if (ttisnumber(o)) { + unsigned len = luaO_tostringbuff(o, buff); + buff[len++] = '\0'; /* add final zero */ + return len; + } + else + return 0; +} + + LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) { size_t sz = luaO_str2num(s, s2v(L->top.p)); if (sz != 0) @@ -416,20 +426,27 @@ LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { luaC_checkGC(L); o = index2value(L, idx); /* previous call may reallocate the stack */ } - if (len != NULL) - *len = tsslen(tsvalue(o)); lua_unlock(L); - return getstr(tsvalue(o)); + if (len != NULL) + return getlstr(tsvalue(o), *len); + else + return getstr(tsvalue(o)); } LUA_API lua_Unsigned lua_rawlen (lua_State *L, int idx) { const TValue *o = index2value(L, idx); switch (ttypetag(o)) { - case LUA_VSHRSTR: return tsvalue(o)->shrlen; - case LUA_VLNGSTR: return tsvalue(o)->u.lnglen; - case LUA_VUSERDATA: return uvalue(o)->len; - case LUA_VTABLE: return luaH_getn(hvalue(o)); + case LUA_VSHRSTR: return cast(lua_Unsigned, tsvalue(o)->shrlen); + case LUA_VLNGSTR: return cast(lua_Unsigned, tsvalue(o)->u.lnglen); + case LUA_VUSERDATA: return cast(lua_Unsigned, uvalue(o)->len); + case LUA_VTABLE: { + lua_Unsigned res; + lua_lock(L); + res = luaH_getn(L, hvalue(o)); + lua_unlock(L); + return res; + } default: return 0; } } @@ -467,7 +484,7 @@ LUA_API lua_State *lua_tothread (lua_State *L, int idx) { /* ** Returns a pointer to the internal representation of an object. -** Note that ANSI C does not allow the conversion of a pointer to +** Note that ISO C does not allow the conversion of a pointer to ** function to a 'void*', so the conversion here goes through ** a 'size_t'. (As the returned pointer is only informative, this ** conversion should not be a problem.) @@ -535,6 +552,21 @@ LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { } +LUA_API const char *lua_pushexternalstring (lua_State *L, + const char *s, size_t len, lua_Alloc falloc, void *ud) { + TString *ts; + lua_lock(L); + api_check(L, len <= MAX_SIZE, "string too large"); + api_check(L, s[len] == '\0', "string not ending with zero"); + ts = luaS_newextlstr (L, s, len, falloc, ud); + setsvalue2s(L, L->top.p, ts); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getstr(ts); +} + + LUA_API const char *lua_pushstring (lua_State *L, const char *s) { lua_lock(L); if (s == NULL) @@ -567,9 +599,7 @@ LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { const char *ret; va_list argp; lua_lock(L); - va_start(argp, fmt); - ret = luaO_pushvfstring(L, fmt, argp); - va_end(argp); + pushvfstring(L, argp, fmt, ret); luaC_checkGC(L); lua_unlock(L); return ret; @@ -583,17 +613,18 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { api_incr_top(L); } else { + int i; CClosure *cl; - api_checknelems(L, n); + api_checkpop(L, n); api_check(L, n <= MAXUPVAL, "upvalue index too large"); cl = luaF_newCclosure(L, n); cl->f = fn; - L->top.p -= n; - while (n--) { - setobj2n(L, &cl->upvalue[n], s2v(L->top.p + n)); + for (i = 0; i < n; i++) { + setobj2n(L, &cl->upvalue[i], s2v(L->top.p - n + i)); /* does not need barrier because closure is white */ lua_assert(iswhite(cl)); } + L->top.p -= n; setclCvalue(L, s2v(L->top.p), cl); api_incr_top(L); luaC_checkGC(L); @@ -626,7 +657,7 @@ LUA_API int lua_pushthread (lua_State *L) { setthvalue(L, s2v(L->top.p), L); api_incr_top(L); lua_unlock(L); - return (G(L)->mainthread == L); + return (mainthread(G(L)) == L); } @@ -636,53 +667,54 @@ LUA_API int lua_pushthread (lua_State *L) { */ -l_sinline int auxgetstr (lua_State *L, const TValue *t, const char *k) { - const TValue *slot; +static int auxgetstr (lua_State *L, const TValue *t, const char *k) { + lu_byte tag; TString *str = luaS_new(L, k); - if (luaV_fastget(L, t, str, slot, luaH_getstr)) { - setobj2s(L, L->top.p, slot); + luaV_fastget(t, str, s2v(L->top.p), luaH_getstr, tag); + if (!tagisempty(tag)) api_incr_top(L); - } else { setsvalue2s(L, L->top.p, str); api_incr_top(L); - luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot); + tag = luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, tag); } lua_unlock(L); - return ttype(s2v(L->top.p - 1)); + return novariant(tag); } /* -** Get the global table in the registry. Since all predefined -** indices in the registry were inserted right when the registry -** was created and never removed, they must always be in the array -** part of the registry. +** The following function assumes that the registry cannot be a weak +** table; so, an emergency collection while using the global table +** cannot collect it. */ -#define getGtable(L) \ - (&hvalue(&G(L)->l_registry)->array[LUA_RIDX_GLOBALS - 1]) +static void getGlobalTable (lua_State *L, TValue *gt) { + Table *registry = hvalue(&G(L)->l_registry); + lu_byte tag = luaH_getint(registry, LUA_RIDX_GLOBALS, gt); + (void)tag; /* avoid not-used warnings when checks are off */ + api_check(L, novariant(tag) == LUA_TTABLE, "global table must exist"); +} LUA_API int lua_getglobal (lua_State *L, const char *name) { - const TValue *G; + TValue gt; lua_lock(L); - G = getGtable(L); - return auxgetstr(L, G, name); + getGlobalTable(L, >); + return auxgetstr(L, >, name); } LUA_API int lua_gettable (lua_State *L, int idx) { - const TValue *slot; + lu_byte tag; TValue *t; lua_lock(L); + api_checkpop(L, 1); t = index2value(L, idx); - if (luaV_fastget(L, t, s2v(L->top.p - 1), slot, luaH_get)) { - setobj2s(L, L->top.p - 1, slot); - } - else - luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, slot); + luaV_fastget(t, s2v(L->top.p - 1), s2v(L->top.p - 1), luaH_get, tag); + if (tagisempty(tag)) + tag = luaV_finishget(L, t, s2v(L->top.p - 1), L->top.p - 1, tag); lua_unlock(L); - return ttype(s2v(L->top.p - 1)); + return novariant(tag); } @@ -694,35 +726,31 @@ LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { TValue *t; - const TValue *slot; + lu_byte tag; lua_lock(L); t = index2value(L, idx); - if (luaV_fastgeti(L, t, n, slot)) { - setobj2s(L, L->top.p, slot); - } - else { - TValue aux; - setivalue(&aux, n); - luaV_finishget(L, t, &aux, L->top.p, slot); + luaV_fastgeti(t, n, s2v(L->top.p), tag); + if (tagisempty(tag)) { + TValue key; + setivalue(&key, n); + tag = luaV_finishget(L, t, &key, L->top.p, tag); } api_incr_top(L); lua_unlock(L); - return ttype(s2v(L->top.p - 1)); + return novariant(tag); } -l_sinline int finishrawget (lua_State *L, const TValue *val) { - if (isempty(val)) /* avoid copying empty items to the stack */ +static int finishrawget (lua_State *L, lu_byte tag) { + if (tagisempty(tag)) /* avoid copying empty items to the stack */ setnilvalue(s2v(L->top.p)); - else - setobj2s(L, L->top.p, val); api_incr_top(L); lua_unlock(L); - return ttype(s2v(L->top.p - 1)); + return novariant(tag); } -static Table *gettable (lua_State *L, int idx) { +l_sinline Table *gettable (lua_State *L, int idx) { TValue *t = index2value(L, idx); api_check(L, ttistable(t), "table expected"); return hvalue(t); @@ -731,21 +759,23 @@ static Table *gettable (lua_State *L, int idx) { LUA_API int lua_rawget (lua_State *L, int idx) { Table *t; - const TValue *val; + lu_byte tag; lua_lock(L); - api_checknelems(L, 1); + api_checkpop(L, 1); t = gettable(L, idx); - val = luaH_get(t, s2v(L->top.p - 1)); - L->top.p--; /* remove key */ - return finishrawget(L, val); + tag = luaH_get(t, s2v(L->top.p - 1), s2v(L->top.p - 1)); + L->top.p--; /* pop key */ + return finishrawget(L, tag); } LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { Table *t; + lu_byte tag; lua_lock(L); t = gettable(L, idx); - return finishrawget(L, luaH_getint(t, n)); + luaH_fastgeti(t, n, s2v(L->top.p), tag); + return finishrawget(L, tag); } @@ -755,7 +785,7 @@ LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { lua_lock(L); t = gettable(L, idx); setpvalue(&k, cast_voidp(p)); - return finishrawget(L, luaH_get(t, &k)); + return finishrawget(L, luaH_get(t, &k, s2v(L->top.p))); } @@ -766,7 +796,7 @@ LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { sethvalue2s(L, L->top.p, t); api_incr_top(L); if (narray > 0 || nrec > 0) - luaH_resize(L, t, narray, nrec); + luaH_resize(L, t, cast_uint(narray), cast_uint(nrec)); luaC_checkGC(L); lua_unlock(L); } @@ -827,17 +857,18 @@ LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) { ** t[k] = value at the top of the stack (where 'k' is a string) */ static void auxsetstr (lua_State *L, const TValue *t, const char *k) { - const TValue *slot; + int hres; TString *str = luaS_new(L, k); - api_checknelems(L, 1); - if (luaV_fastget(L, t, str, slot, luaH_getstr)) { - luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); + api_checkpop(L, 1); + luaV_fastset(t, str, s2v(L->top.p - 1), hres, luaH_psetstr); + if (hres == HOK) { + luaV_finishfastset(L, t, s2v(L->top.p - 1)); L->top.p--; /* pop value */ } else { setsvalue2s(L, L->top.p, str); /* push 'str' (to make it a TValue) */ api_incr_top(L); - luaV_finishset(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), slot); + luaV_finishset(L, t, s2v(L->top.p - 1), s2v(L->top.p - 2), hres); L->top.p -= 2; /* pop value and key */ } lua_unlock(L); /* lock done by caller */ @@ -845,24 +876,24 @@ static void auxsetstr (lua_State *L, const TValue *t, const char *k) { LUA_API void lua_setglobal (lua_State *L, const char *name) { - const TValue *G; + TValue gt; lua_lock(L); /* unlock done in 'auxsetstr' */ - G = getGtable(L); - auxsetstr(L, G, name); + getGlobalTable(L, >); + auxsetstr(L, >, name); } LUA_API void lua_settable (lua_State *L, int idx) { TValue *t; - const TValue *slot; + int hres; lua_lock(L); - api_checknelems(L, 2); + api_checkpop(L, 2); t = index2value(L, idx); - if (luaV_fastget(L, t, s2v(L->top.p - 2), slot, luaH_get)) { - luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); - } + luaV_fastset(t, s2v(L->top.p - 2), s2v(L->top.p - 1), hres, luaH_pset); + if (hres == HOK) + luaV_finishfastset(L, t, s2v(L->top.p - 1)); else - luaV_finishset(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), slot); + luaV_finishset(L, t, s2v(L->top.p - 2), s2v(L->top.p - 1), hres); L->top.p -= 2; /* pop index and value */ lua_unlock(L); } @@ -876,17 +907,17 @@ LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { TValue *t; - const TValue *slot; + int hres; lua_lock(L); - api_checknelems(L, 1); + api_checkpop(L, 1); t = index2value(L, idx); - if (luaV_fastgeti(L, t, n, slot)) { - luaV_finishfastset(L, t, slot, s2v(L->top.p - 1)); - } + luaV_fastseti(t, n, s2v(L->top.p - 1), hres); + if (hres == HOK) + luaV_finishfastset(L, t, s2v(L->top.p - 1)); else { - TValue aux; - setivalue(&aux, n); - luaV_finishset(L, t, &aux, s2v(L->top.p - 1), slot); + TValue temp; + setivalue(&temp, n); + luaV_finishset(L, t, &temp, s2v(L->top.p - 1), hres); } L->top.p--; /* pop value */ lua_unlock(L); @@ -896,7 +927,7 @@ LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { static void aux_rawset (lua_State *L, int idx, TValue *key, int n) { Table *t; lua_lock(L); - api_checknelems(L, n); + api_checkpop(L, n); t = gettable(L, idx); luaH_set(L, t, key, s2v(L->top.p - 1)); invalidateTMcache(t); @@ -921,7 +952,7 @@ LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) { Table *t; lua_lock(L); - api_checknelems(L, 1); + api_checkpop(L, 1); t = gettable(L, idx); luaH_setint(L, t, n, s2v(L->top.p - 1)); luaC_barrierback(L, obj2gco(t), s2v(L->top.p - 1)); @@ -934,7 +965,7 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) { TValue *obj; Table *mt; lua_lock(L); - api_checknelems(L, 1); + api_checkpop(L, 1); obj = index2value(L, objindex); if (ttisnil(s2v(L->top.p - 1))) mt = NULL; @@ -974,7 +1005,7 @@ LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) { TValue *o; int res; lua_lock(L); - api_checknelems(L, 1); + api_checkpop(L, 1); o = index2value(L, idx); api_check(L, ttisfulluserdata(o), "full userdata expected"); if (!(cast_uint(n) - 1u < cast_uint(uvalue(o)->nuvalue))) @@ -996,9 +1027,11 @@ LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) { #define checkresults(L,na,nr) \ - api_check(L, (nr) == LUA_MULTRET \ + (api_check(L, (nr) == LUA_MULTRET \ || (L->ci->top.p - L->top.p >= (nr) - (na)), \ - "results from function overflow current stack size") + "results from function overflow current stack size"), \ + api_check(L, LUA_MULTRET <= (nr) && (nr) <= MAXRESULTS, \ + "invalid number of results")) LUA_API void lua_callk (lua_State *L, int nargs, int nresults, @@ -1007,7 +1040,7 @@ LUA_API void lua_callk (lua_State *L, int nargs, int nresults, lua_lock(L); api_check(L, k == NULL || !isLua(L->ci), "cannot use continuations inside hooks"); - api_checknelems(L, nargs+1); + api_checkpop(L, nargs + 1); api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); checkresults(L, nargs, nresults); func = L->top.p - (nargs+1); @@ -1043,12 +1076,12 @@ static void f_call (lua_State *L, void *ud) { LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, lua_KContext ctx, lua_KFunction k) { struct CallS c; - int status; + TStatus status; ptrdiff_t func; lua_lock(L); api_check(L, k == NULL || !isLua(L->ci), "cannot use continuations inside hooks"); - api_checknelems(L, nargs+1); + api_checkpop(L, nargs + 1); api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); checkresults(L, nargs, nresults); if (errfunc == 0) @@ -1071,7 +1104,7 @@ LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, ci->u2.funcidx = cast_int(savestack(L, c.func)); ci->u.c.old_errfunc = L->errfunc; L->errfunc = func; - setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ + setoah(ci, L->allowhook); /* save value of 'allowhook' */ ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ luaD_call(L, c.func, nresults); /* do the call */ ci->callstatus &= ~CIST_YPCALL; @@ -1080,14 +1113,14 @@ LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, } adjustresults(L, nresults); lua_unlock(L); - return status; + return APIstatus(status); } LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, const char *chunkname, const char *mode) { ZIO z; - int status; + TStatus status; lua_lock(L); if (!chunkname) chunkname = "?"; luaZ_init(L, &z, reader, data); @@ -1096,34 +1129,38 @@ LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, LClosure *f = clLvalue(s2v(L->top.p - 1)); /* get new function */ if (f->nupvalues >= 1) { /* does it have an upvalue? */ /* get global table from registry */ - const TValue *gt = getGtable(L); + TValue gt; + getGlobalTable(L, >); /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ - setobj(L, f->upvals[0]->v.p, gt); - luaC_barrier(L, f->upvals[0], gt); + setobj(L, f->upvals[0]->v.p, >); + luaC_barrier(L, f->upvals[0], >); } } lua_unlock(L); - return status; + return APIstatus(status); } +/* +** Dump a Lua function, calling 'writer' to write its parts. Ensure +** the stack returns with its original size. +*/ LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) { int status; - TValue *o; + ptrdiff_t otop = savestack(L, L->top.p); /* original top */ + TValue *f = s2v(L->top.p - 1); /* function to be dumped */ lua_lock(L); - api_checknelems(L, 1); - o = s2v(L->top.p - 1); - if (isLfunction(o)) - status = luaU_dump(L, getproto(o), writer, data, strip); - else - status = 1; + api_checkpop(L, 1); + api_check(L, isLfunction(f), "Lua function expected"); + status = luaU_dump(L, clLvalue(f)->p, writer, data, strip); + L->top.p = restorestack(L, otop); /* restore top */ lua_unlock(L); return status; } LUA_API int lua_status (lua_State *L) { - return L->status; + return APIstatus(L->status); } @@ -1134,7 +1171,7 @@ LUA_API int lua_gc (lua_State *L, int what, ...) { va_list argp; int res = 0; global_State *g = G(L); - if (g->gcstp & GCSTPGC) /* internal stop? */ + if (g->gcstp & (GCSTPGC | GCSTPCLS)) /* internal stop? */ return -1; /* all options are invalid when stopped */ lua_lock(L); va_start(argp, what); @@ -1145,7 +1182,7 @@ LUA_API int lua_gc (lua_State *L, int what, ...) { } case LUA_GCRESTART: { luaE_setdebt(g, 0); - g->gcstp = 0; /* (GCSTPGC must be already zero here) */ + g->gcstp = 0; /* (other bits must be zero here) */ break; } case LUA_GCCOLLECT: { @@ -1162,34 +1199,17 @@ LUA_API int lua_gc (lua_State *L, int what, ...) { break; } case LUA_GCSTEP: { - int data = va_arg(argp, int); - l_mem debt = 1; /* =1 to signal that it did an actual step */ lu_byte oldstp = g->gcstp; - g->gcstp = 0; /* allow GC to run (GCSTPGC must be zero here) */ - if (data == 0) { - luaE_setdebt(g, 0); /* do a basic step */ - luaC_step(L); - } - else { /* add 'data' to total debt */ - debt = cast(l_mem, data) * 1024 + g->GCdebt; - luaE_setdebt(g, debt); - luaC_checkGC(L); - } - g->gcstp = oldstp; /* restore previous state */ - if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */ + l_mem n = cast(l_mem, va_arg(argp, size_t)); + int work = 0; /* true if GC did some work */ + g->gcstp = 0; /* allow GC to run (other bits must be zero here) */ + if (n <= 0) + n = g->GCdebt; /* force to run one basic step */ + luaE_setdebt(g, g->GCdebt - n); + luaC_condGC(L, (void)0, work = 1); + if (work && g->gcstate == GCSpause) /* end of cycle? */ res = 1; /* signal it */ - break; - } - case LUA_GCSETPAUSE: { - int data = va_arg(argp, int); - res = getgcparam(g->gcpause); - setgcparam(g->gcpause, data); - break; - } - case LUA_GCSETSTEPMUL: { - int data = va_arg(argp, int); - res = getgcparam(g->gcstepmul); - setgcparam(g->gcstepmul, data); + g->gcstp = oldstp; /* restore previous state */ break; } case LUA_GCISRUNNING: { @@ -1197,30 +1217,24 @@ LUA_API int lua_gc (lua_State *L, int what, ...) { break; } case LUA_GCGEN: { - int minormul = va_arg(argp, int); - int majormul = va_arg(argp, int); - res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; - if (minormul != 0) - g->genminormul = minormul; - if (majormul != 0) - setgcparam(g->genmajormul, majormul); - luaC_changemode(L, KGC_GEN); + res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; + luaC_changemode(L, KGC_GENMINOR); break; } case LUA_GCINC: { - int pause = va_arg(argp, int); - int stepmul = va_arg(argp, int); - int stepsize = va_arg(argp, int); - res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; - if (pause != 0) - setgcparam(g->gcpause, pause); - if (stepmul != 0) - setgcparam(g->gcstepmul, stepmul); - if (stepsize != 0) - g->gcstepsize = stepsize; + res = (g->gckind == KGC_INC) ? LUA_GCINC : LUA_GCGEN; luaC_changemode(L, KGC_INC); break; } + case LUA_GCPARAM: { + int param = va_arg(argp, int); + int value = va_arg(argp, int); + api_check(L, 0 <= param && param < LUA_GCPN, "invalid parameter"); + res = cast_int(luaO_applyparam(g->gcparams[param], 100)); + if (value >= 0) + g->gcparams[param] = luaO_codeparam(cast_uint(value)); + break; + } default: res = -1; /* invalid option */ } va_end(argp); @@ -1239,7 +1253,7 @@ LUA_API int lua_error (lua_State *L) { TValue *errobj; lua_lock(L); errobj = s2v(L->top.p - 1); - api_checknelems(L, 1); + api_checkpop(L, 1); /* error object is the memory error message? */ if (ttisshrstring(errobj) && eqshrstr(tsvalue(errobj), G(L)->memerrmsg)) luaM_error(L); /* raise a memory error */ @@ -1254,30 +1268,25 @@ LUA_API int lua_next (lua_State *L, int idx) { Table *t; int more; lua_lock(L); - api_checknelems(L, 1); + api_checkpop(L, 1); t = gettable(L, idx); more = luaH_next(L, t, L->top.p - 1); - if (more) { + if (more) api_incr_top(L); - } else /* no more elements */ - L->top.p -= 1; /* remove key */ + L->top.p--; /* pop key */ lua_unlock(L); return more; } LUA_API void lua_toclose (lua_State *L, int idx) { - int nresults; StkId o; lua_lock(L); o = index2stack(L, idx); - nresults = L->ci->nresults; api_check(L, L->tbclist.p < o, "given index below or equal a marked one"); luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */ - if (!hastocloseCfunc(nresults)) /* function not marked yet? */ - L->ci->nresults = codeNresults(nresults); /* mark it */ - lua_assert(hastocloseCfunc(L->ci->nresults)); + L->ci->callstatus |= CIST_TBC; /* mark that function has TBC slots */ lua_unlock(L); } @@ -1285,13 +1294,14 @@ LUA_API void lua_toclose (lua_State *L, int idx) { LUA_API void lua_concat (lua_State *L, int n) { lua_lock(L); api_checknelems(L, n); - if (n > 0) + if (n > 0) { luaV_concat(L, n); + luaC_checkGC(L); + } else { /* nothing to concatenate */ setsvalue2s(L, L->top.p, luaS_newlstr(L, "", 0)); /* push empty string */ api_incr_top(L); } - luaC_checkGC(L); lua_unlock(L); } @@ -1343,8 +1353,8 @@ void lua_warning (lua_State *L, const char *msg, int tocont) { LUA_API void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue) { Udata *u; lua_lock(L); - api_check(L, 0 <= nuvalue && nuvalue < USHRT_MAX, "invalid value"); - u = luaS_newudata(L, size, nuvalue); + api_check(L, 0 <= nuvalue && nuvalue < SHRT_MAX, "invalid value"); + u = luaS_newudata(L, size, cast(unsigned short, nuvalue)); setuvalue(L, s2v(L->top.p), u); api_incr_top(L); luaC_checkGC(L); diff --git a/lua-5.4.7/src/lauxlib.c b/src/lauxlib.c similarity index 85% rename from lua-5.4.7/src/lauxlib.c rename to src/lauxlib.c index 923105e..7cf90cb 100644 --- a/lua-5.4.7/src/lauxlib.c +++ b/src/lauxlib.c @@ -25,12 +25,7 @@ #include "lua.h" #include "lauxlib.h" - - -#if !defined(MAX_SIZET) -/* maximum value for size_t */ -#define MAX_SIZET ((size_t)(~(size_t)0)) -#endif +#include "llimits.h" /* @@ -99,14 +94,14 @@ static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { static void pushfuncname (lua_State *L, lua_Debug *ar) { - if (pushglobalfuncname(L, ar)) { /* try first a global name */ - lua_pushfstring(L, "function '%s'", lua_tostring(L, -1)); - lua_remove(L, -2); /* remove name */ - } - else if (*ar->namewhat != '\0') /* is there a name from code? */ + if (*ar->namewhat != '\0') /* is there a name from code? */ lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name); /* use it */ else if (*ar->what == 'm') /* main? */ lua_pushliteral(L, "main chunk"); + else if (pushglobalfuncname(L, ar)) { /* try a global name */ + lua_pushfstring(L, "function '%s'", lua_tostring(L, -1)); + lua_remove(L, -2); /* remove name */ + } else if (*ar->what != 'C') /* for Lua functions, use */ lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined); else /* nothing left... */ @@ -175,19 +170,27 @@ LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { lua_Debug ar; + const char *argword; if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); - lua_getinfo(L, "n", &ar); - if (strcmp(ar.namewhat, "method") == 0) { - arg--; /* do not count 'self' */ - if (arg == 0) /* error is in the self argument itself? */ - return luaL_error(L, "calling '%s' on bad self (%s)", - ar.name, extramsg); + lua_getinfo(L, "nt", &ar); + if (arg <= ar.extraargs) /* error in an extra argument? */ + argword = "extra argument"; + else { + arg -= ar.extraargs; /* do not count extra arguments */ + if (strcmp(ar.namewhat, "method") == 0) { /* colon syntax? */ + arg--; /* do not count (extra) self argument */ + if (arg == 0) /* error in self argument? */ + return luaL_error(L, "calling '%s' on bad self (%s)", + ar.name, extramsg); + /* else go through; error in a regular argument */ + } + argword = "argument"; } if (ar.name == NULL) ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; - return luaL_error(L, "bad argument #%d to '%s' (%s)", - arg, ar.name, extramsg); + return luaL_error(L, "bad %s #%d to '%s' (%s)", + argword, arg, ar.name, extramsg); } @@ -230,7 +233,7 @@ LUALIB_API void luaL_where (lua_State *L, int level) { /* ** Again, the use of 'lua_pushvfstring' ensures this function does ** not need reserved stack space when called. (At worst, it generates -** an error with "stack overflow" instead of the given message.) +** a memory error instead of the given message.) */ LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { va_list argp; @@ -473,18 +476,27 @@ typedef struct UBox { } UBox; +/* Resize the buffer used by a box. Optimize for the common case of +** resizing to the old size. (For instance, __gc will resize the box +** to 0 even after it was closed. 'pushresult' may also resize it to a +** final size that is equal to the one set when the buffer was created.) +*/ static void *resizebox (lua_State *L, int idx, size_t newsize) { - void *ud; - lua_Alloc allocf = lua_getallocf(L, &ud); UBox *box = (UBox *)lua_touserdata(L, idx); - void *temp = allocf(ud, box->box, box->bsize, newsize); - if (l_unlikely(temp == NULL && newsize > 0)) { /* allocation error? */ - lua_pushliteral(L, "not enough memory"); - lua_error(L); /* raise a memory error */ + if (box->bsize == newsize) /* not changing size? */ + return box->box; /* keep the buffer */ + else { + void *ud; + lua_Alloc allocf = lua_getallocf(L, &ud); + void *temp = allocf(ud, box->box, box->bsize, newsize); + if (l_unlikely(temp == NULL && newsize > 0)) { /* allocation error? */ + lua_pushliteral(L, "not enough memory"); + lua_error(L); /* raise a memory error */ + } + box->box = temp; + box->bsize = newsize; + return temp; } - box->box = temp; - box->bsize = newsize; - return temp; } @@ -529,15 +541,17 @@ static void newbox (lua_State *L) { /* ** Compute new size for buffer 'B', enough to accommodate extra 'sz' -** bytes. (The test for "not big enough" also gets the case when the -** computation of 'newsize' overflows.) +** bytes plus one for a terminating zero. */ static size_t newbuffsize (luaL_Buffer *B, size_t sz) { - size_t newsize = (B->size / 2) * 3; /* buffer size * 1.5 */ - if (l_unlikely(MAX_SIZET - sz < B->n)) /* overflow in (B->n + sz)? */ - return luaL_error(B->L, "buffer too large"); - if (newsize < B->n + sz) /* not big enough? */ - newsize = B->n + sz; + size_t newsize = B->size; + if (l_unlikely(sz >= MAX_SIZE - B->n)) + return cast_sizet(luaL_error(B->L, "resulting string too large")); + /* else B->n + sz + 1 <= MAX_SIZE */ + if (newsize <= MAX_SIZE/3 * 2) /* no overflow? */ + newsize += (newsize >> 1); /* new size *= 1.5 */ + if (newsize < B->n + sz + 1) /* not big enough? */ + newsize = B->n + sz + 1; return newsize; } @@ -597,9 +611,23 @@ LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { LUALIB_API void luaL_pushresult (luaL_Buffer *B) { lua_State *L = B->L; checkbufferlevel(B, -1); - lua_pushlstring(L, B->b, B->n); - if (buffonstack(B)) + if (!buffonstack(B)) /* using static buffer? */ + lua_pushlstring(L, B->b, B->n); /* save result as regular string */ + else { /* reuse buffer already allocated */ + UBox *box = (UBox *)lua_touserdata(L, -1); + void *ud; + lua_Alloc allocf = lua_getallocf(L, &ud); /* function to free buffer */ + size_t len = B->n; /* final string length */ + char *s; + resizebox(L, -1, len + 1); /* adjust box size to content size */ + s = (char*)box->box; /* final buffer address */ + s[len] = '\0'; /* add ending zero */ + /* clear box, as Lua will take control of the buffer */ + box->bsize = 0; box->box = NULL; + lua_pushexternalstring(L, s, len, allocf, ud); lua_closeslot(L, -2); /* close the box */ + lua_gc(L, LUA_GCSTEP, len); + } lua_remove(L, -2); /* remove box or placeholder from the stack */ } @@ -653,13 +681,10 @@ LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) { ** ======================================================= */ -/* index of free-list header (after the predefined values) */ -#define freelist (LUA_RIDX_LAST + 1) - /* -** The previously freed references form a linked list: -** t[freelist] is the index of a first free index, or zero if list is -** empty; t[t[freelist]] is the index of the second element; etc. +** The previously freed references form a linked list: t[1] is the index +** of a first free index, t[t[1]] is the index of the second element, +** etc. A zero signals the end of the list. */ LUALIB_API int luaL_ref (lua_State *L, int t) { int ref; @@ -668,19 +693,18 @@ LUALIB_API int luaL_ref (lua_State *L, int t) { return LUA_REFNIL; /* 'nil' has a unique fixed reference */ } t = lua_absindex(L, t); - if (lua_rawgeti(L, t, freelist) == LUA_TNIL) { /* first access? */ + if (lua_rawgeti(L, t, 1) == LUA_TNUMBER) /* already initialized? */ + ref = (int)lua_tointeger(L, -1); /* ref = t[1] */ + else { /* first access */ + lua_assert(!lua_toboolean(L, -1)); /* must be nil or false */ ref = 0; /* list is empty */ lua_pushinteger(L, 0); /* initialize as an empty list */ - lua_rawseti(L, t, freelist); /* ref = t[freelist] = 0 */ - } - else { /* already initialized */ - lua_assert(lua_isinteger(L, -1)); - ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */ + lua_rawseti(L, t, 1); /* ref = t[1] = 0 */ } lua_pop(L, 1); /* remove element from stack */ if (ref != 0) { /* any free element? */ lua_rawgeti(L, t, ref); /* remove it from list */ - lua_rawseti(L, t, freelist); /* (t[freelist] = t[ref]) */ + lua_rawseti(L, t, 1); /* (t[1] = t[ref]) */ } else /* no free elements */ ref = (int)lua_rawlen(L, t) + 1; /* get a new reference */ @@ -692,11 +716,11 @@ LUALIB_API int luaL_ref (lua_State *L, int t) { LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { if (ref >= 0) { t = lua_absindex(L, t); - lua_rawgeti(L, t, freelist); + lua_rawgeti(L, t, 1); lua_assert(lua_isinteger(L, -1)); - lua_rawseti(L, t, ref); /* t[ref] = t[freelist] */ + lua_rawseti(L, t, ref); /* t[ref] = t[1] */ lua_pushinteger(L, ref); - lua_rawseti(L, t, freelist); /* t[freelist] = ref */ + lua_rawseti(L, t, 1); /* t[1] = ref */ } } @@ -710,7 +734,7 @@ LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { */ typedef struct LoadF { - int n; /* number of pre-read characters */ + unsigned n; /* number of pre-read characters */ FILE *f; /* file being read */ char buff[BUFSIZ]; /* area for reading file */ } LoadF; @@ -718,7 +742,7 @@ typedef struct LoadF { static const char *getF (lua_State *L, void *ud, size_t *size) { LoadF *lf = (LoadF *)ud; - (void)L; /* not used */ + UNUSED(L); if (lf->n > 0) { /* are there pre-read characters to be read? */ *size = lf->n; /* return them (chars already in buffer) */ lf->n = 0; /* no more pre-read characters */ @@ -810,10 +834,10 @@ LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename, } } if (c != EOF) - lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */ - errno = 0; + lf.buff[lf.n++] = cast_char(c); /* 'c' is the first character */ status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode); readstatus = ferror(lf.f); + errno = 0; /* no useful error number until here */ if (filename) fclose(lf.f); /* close file (even in case of errors) */ if (readstatus) { lua_settop(L, fnameindex); /* ignore results from 'lua_load' */ @@ -832,7 +856,7 @@ typedef struct LoadS { static const char *getS (lua_State *L, void *ud, size_t *size) { LoadS *ls = (LoadS *)ud; - (void)L; /* not used */ + UNUSED(L); if (ls->size == 0) return NULL; *size = ls->size; ls->size = 0; @@ -904,10 +928,9 @@ LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { else { switch (lua_type(L, idx)) { case LUA_TNUMBER: { - if (lua_isinteger(L, idx)) - lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx)); - else - lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx)); + char buff[LUA_N2SBUFFSZ]; + lua_numbertocstring(L, idx, buff); + lua_pushstring(L, buff); break; } case LUA_TSTRING: @@ -1005,7 +1028,7 @@ LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s, const char *wild; size_t l = strlen(p); while ((wild = strstr(s, p)) != NULL) { - luaL_addlstring(b, s, wild - s); /* push prefix */ + luaL_addlstring(b, s, ct_diff2sz(wild - s)); /* push prefix */ luaL_addstring(b, r); /* push replacement in place of pattern */ s = wild + l; /* continue after 'p' */ } @@ -1023,8 +1046,8 @@ LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, } -static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { - (void)ud; (void)osize; /* not used */ +void *luaL_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { + UNUSED(ud); UNUSED(osize); if (nsize == 0) { free(ptr); return NULL; @@ -1035,7 +1058,7 @@ static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { /* -** Standard panic funcion just prints an error message. The test +** Standard panic function just prints an error message. The test ** with 'lua_type' avoids possible memory errors in 'lua_tostring'. */ static int panic (lua_State *L) { @@ -1105,11 +1128,64 @@ static void warnfon (void *ud, const char *message, int tocont) { } -LUALIB_API lua_State *luaL_newstate (void) { - lua_State *L = lua_newstate(l_alloc, NULL); + +/* +** A function to compute an unsigned int with some level of +** randomness. Rely on Address Space Layout Randomization (if present) +** and the current time. +*/ +#if !defined(luai_makeseed) + +#include + + +/* Size for the buffer, in bytes */ +#define BUFSEEDB (sizeof(void*) + sizeof(time_t)) + +/* Size for the buffer in int's, rounded up */ +#define BUFSEED ((BUFSEEDB + sizeof(int) - 1) / sizeof(int)) + +/* +** Copy the contents of variable 'v' into the buffer pointed by 'b'. +** (The '&b[0]' disguises 'b' to fix an absurd warning from clang.) +*/ +#define addbuff(b,v) (memcpy(&b[0], &(v), sizeof(v)), b += sizeof(v)) + + +static unsigned int luai_makeseed (void) { + unsigned int buff[BUFSEED]; + unsigned int res; + unsigned int i; + time_t t = time(NULL); + char *b = (char*)buff; + addbuff(b, b); /* local variable's address */ + addbuff(b, t); /* time */ + /* fill (rare but possible) remain of the buffer with zeros */ + memset(b, 0, sizeof(buff) - BUFSEEDB); + res = buff[0]; + for (i = 1; i < BUFSEED; i++) + res ^= (res >> 3) + (res << 7) + buff[i]; + return res; +} + +#endif + + +LUALIB_API unsigned int luaL_makeseed (lua_State *L) { + UNUSED(L); + return luai_makeseed(); +} + + +/* +** Use the name with parentheses so that headers can redefine it +** as a macro. +*/ +LUALIB_API lua_State *(luaL_newstate) (void) { + lua_State *L = lua_newstate(luaL_alloc, NULL, luaL_makeseed(NULL)); if (l_likely(L)) { lua_atpanic(L, &panic); - lua_setwarnf(L, warnfoff, L); /* default is warnings off */ + lua_setwarnf(L, warnfon, L); } return L; } diff --git a/lua-5.4.7/src/lbaselib.c b/src/lbaselib.c similarity index 87% rename from lua-5.4.7/src/lbaselib.c rename to src/lbaselib.c index 1d60c9d..891bb90 100644 --- a/lua-5.4.7/src/lbaselib.c +++ b/src/lbaselib.c @@ -19,6 +19,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" static int luaB_print (lua_State *L) { @@ -57,21 +58,22 @@ static int luaB_warn (lua_State *L) { #define SPACECHARS " \f\n\r\t\v" -static const char *b_str2int (const char *s, int base, lua_Integer *pn) { +static const char *b_str2int (const char *s, unsigned base, lua_Integer *pn) { lua_Unsigned n = 0; int neg = 0; s += strspn(s, SPACECHARS); /* skip initial spaces */ if (*s == '-') { s++; neg = 1; } /* handle sign */ else if (*s == '+') s++; - if (!isalnum((unsigned char)*s)) /* no digit? */ + if (!isalnum(cast_uchar(*s))) /* no digit? */ return NULL; do { - int digit = (isdigit((unsigned char)*s)) ? *s - '0' - : (toupper((unsigned char)*s) - 'A') + 10; + unsigned digit = cast_uint(isdigit(cast_uchar(*s)) + ? *s - '0' + : (toupper(cast_uchar(*s)) - 'A') + 10); if (digit >= base) return NULL; /* invalid numeral */ n = n * base + digit; s++; - } while (isalnum((unsigned char)*s)); + } while (isalnum(cast_uchar(*s))); s += strspn(s, SPACECHARS); /* skip trailing spaces */ *pn = (lua_Integer)((neg) ? (0u - n) : n); return s; @@ -101,7 +103,7 @@ static int luaB_tonumber (lua_State *L) { luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */ s = lua_tolstring(L, 1, &l); luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); - if (b_str2int(s, (int)base, &n) == s + l) { + if (b_str2int(s, cast_uint(base), &n) == s + l) { lua_pushinteger(L, n); return 1; } /* else not a number */ @@ -158,7 +160,7 @@ static int luaB_rawlen (lua_State *L) { int t = lua_type(L, 1); luaL_argexpected(L, t == LUA_TTABLE || t == LUA_TSTRING, 1, "table or string"); - lua_pushinteger(L, lua_rawlen(L, 1)); + lua_pushinteger(L, l_castU2S(lua_rawlen(L, 1))); return 1; } @@ -198,11 +200,11 @@ static int pushmode (lua_State *L, int oldmode) { static int luaB_collectgarbage (lua_State *L) { static const char *const opts[] = {"stop", "restart", "collect", - "count", "step", "setpause", "setstepmul", - "isrunning", "generational", "incremental", NULL}; - static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, - LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, - LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC}; + "count", "step", "isrunning", "generational", "incremental", + "param", NULL}; + static const char optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, + LUA_GCCOUNT, LUA_GCSTEP, LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC, + LUA_GCPARAM}; int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; switch (o) { case LUA_GCCOUNT: { @@ -213,20 +215,12 @@ static int luaB_collectgarbage (lua_State *L) { return 1; } case LUA_GCSTEP: { - int step = (int)luaL_optinteger(L, 2, 0); - int res = lua_gc(L, o, step); + lua_Integer n = luaL_optinteger(L, 2, 0); + int res = lua_gc(L, o, cast_sizet(n)); checkvalres(res); lua_pushboolean(L, res); return 1; } - case LUA_GCSETPAUSE: - case LUA_GCSETSTEPMUL: { - int p = (int)luaL_optinteger(L, 2, 0); - int previous = lua_gc(L, o, p); - checkvalres(previous); - lua_pushinteger(L, previous); - return 1; - } case LUA_GCISRUNNING: { int res = lua_gc(L, o); checkvalres(res); @@ -234,15 +228,22 @@ static int luaB_collectgarbage (lua_State *L) { return 1; } case LUA_GCGEN: { - int minormul = (int)luaL_optinteger(L, 2, 0); - int majormul = (int)luaL_optinteger(L, 3, 0); - return pushmode(L, lua_gc(L, o, minormul, majormul)); + return pushmode(L, lua_gc(L, o)); } case LUA_GCINC: { - int pause = (int)luaL_optinteger(L, 2, 0); - int stepmul = (int)luaL_optinteger(L, 3, 0); - int stepsize = (int)luaL_optinteger(L, 4, 0); - return pushmode(L, lua_gc(L, o, pause, stepmul, stepsize)); + return pushmode(L, lua_gc(L, o)); + } + case LUA_GCPARAM: { + static const char *const params[] = { + "minormul", "majorminor", "minormajor", + "pause", "stepmul", "stepsize", NULL}; + static const char pnum[] = { + LUA_GCPMINORMUL, LUA_GCPMAJORMINOR, LUA_GCPMINORMAJOR, + LUA_GCPPAUSE, LUA_GCPSTEPMUL, LUA_GCPSTEPSIZE}; + int p = pnum[luaL_checkoption(L, 2, NULL, params)]; + lua_Integer value = luaL_optinteger(L, 3, -1); + lua_pushinteger(L, lua_gc(L, o, p, (int)value)); + return 1; } default: { int res = lua_gc(L, o); @@ -278,21 +279,22 @@ static int luaB_next (lua_State *L) { static int pairscont (lua_State *L, int status, lua_KContext k) { (void)L; (void)status; (void)k; /* unused */ - return 3; + return 4; /* __pairs did all the work, just return its results */ } static int luaB_pairs (lua_State *L) { luaL_checkany(L, 1); if (luaL_getmetafield(L, 1, "__pairs") == LUA_TNIL) { /* no metamethod? */ - lua_pushcfunction(L, luaB_next); /* will return generator, */ - lua_pushvalue(L, 1); /* state, */ - lua_pushnil(L); /* and initial value */ + lua_pushcfunction(L, luaB_next); /* will return generator and */ + lua_pushvalue(L, 1); /* state */ + lua_pushnil(L); /* initial value */ + lua_pushnil(L); /* to-be-closed object */ } else { lua_pushvalue(L, 1); /* argument 'self' to metamethod */ - lua_callk(L, 1, 3, 0, pairscont); /* get 3 values from metamethod */ + lua_callk(L, 1, 4, 0, pairscont); /* get 4 values from metamethod */ } - return 3; + return 4; } @@ -337,9 +339,17 @@ static int load_aux (lua_State *L, int status, int envidx) { } +static const char *getMode (lua_State *L, int idx) { + const char *mode = luaL_optstring(L, idx, "bt"); + if (strchr(mode, 'B') != NULL) /* Lua code cannot use fixed buffers */ + luaL_argerror(L, idx, "invalid mode"); + return mode; +} + + static int luaB_loadfile (lua_State *L) { const char *fname = luaL_optstring(L, 1, NULL); - const char *mode = luaL_optstring(L, 2, NULL); + const char *mode = getMode(L, 2); int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ int status = luaL_loadfilex(L, fname, mode); return load_aux(L, status, env); @@ -388,7 +398,7 @@ static int luaB_load (lua_State *L) { int status; size_t l; const char *s = lua_tolstring(L, 1, &l); - const char *mode = luaL_optstring(L, 3, "bt"); + const char *mode = getMode(L, 3); int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ if (s != NULL) { /* loading a string? */ const char *chunkname = luaL_optstring(L, 2, s); diff --git a/lua-5.4.7/src/lcode.c b/src/lcode.c similarity index 82% rename from lua-5.4.7/src/lcode.c rename to src/lcode.c index 8761614..4caa804 100644 --- a/lua-5.4.7/src/lcode.c +++ b/src/lcode.c @@ -31,10 +31,7 @@ #include "lvm.h" -/* Maximum number of registers in a Lua function (must fit in 8 bits) */ -#define MAXREGS 255 - - +/* (note that expressions VJMP also have jumps.) */ #define hasjumps(e) ((e)->t != (e)->f) @@ -43,8 +40,12 @@ static int codesJ (FuncState *fs, OpCode o, int sj, int k); /* semantic error */ -l_noret luaK_semerror (LexState *ls, const char *msg) { +l_noret luaK_semerror (LexState *ls, const char *fmt, ...) { + const char *msg; + va_list argp; + pushvfstring(ls->L, argp, fmt, msg); ls->t.token = 0; /* remove "near " from final message */ + ls->linenumber = ls->lastline; /* back to line of last used token */ luaX_syntaxerror(ls, msg); } @@ -211,6 +212,7 @@ void luaK_ret (FuncState *fs, int first, int nret) { case 1: op = OP_RETURN1; break; default: op = OP_RETURN; break; } + luaY_checklimit(fs, nret + 1, MAXARG_B, "returns"); luaK_codeABC(fs, op, first, nret + 1, 0); } @@ -331,15 +333,15 @@ static void savelineinfo (FuncState *fs, Proto *f, int line) { int pc = fs->pc - 1; /* last instruction coded */ if (abs(linedif) >= LIMLINEDIFF || fs->iwthabs++ >= MAXIWTHABS) { luaM_growvector(fs->ls->L, f->abslineinfo, fs->nabslineinfo, - f->sizeabslineinfo, AbsLineInfo, MAX_INT, "lines"); + f->sizeabslineinfo, AbsLineInfo, INT_MAX, "lines"); f->abslineinfo[fs->nabslineinfo].pc = pc; f->abslineinfo[fs->nabslineinfo++].line = line; linedif = ABSLINEINFO; /* signal that there is absolute information */ fs->iwthabs = 1; /* restart counter */ } luaM_growvector(fs->ls->L, f->lineinfo, pc, f->sizelineinfo, ls_byte, - MAX_INT, "opcodes"); - f->lineinfo[pc] = linedif; + INT_MAX, "opcodes"); + f->lineinfo[pc] = cast(ls_byte, linedif); fs->previousline = line; /* last line saved */ } @@ -383,7 +385,7 @@ int luaK_code (FuncState *fs, Instruction i) { Proto *f = fs->f; /* put new instruction in code array */ luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction, - MAX_INT, "opcodes"); + INT_MAX, "opcodes"); f->code[fs->pc++] = i; savelineinfo(fs, f, fs->ls->lastline); return fs->pc - 1; /* index of new instruction */ @@ -394,32 +396,40 @@ int luaK_code (FuncState *fs, Instruction i) { ** Format and emit an 'iABC' instruction. (Assertions check consistency ** of parameters versus opcode.) */ -int luaK_codeABCk (FuncState *fs, OpCode o, int a, int b, int c, int k) { +int luaK_codeABCk (FuncState *fs, OpCode o, int A, int B, int C, int k) { lua_assert(getOpMode(o) == iABC); - lua_assert(a <= MAXARG_A && b <= MAXARG_B && - c <= MAXARG_C && (k & ~1) == 0); - return luaK_code(fs, CREATE_ABCk(o, a, b, c, k)); + lua_assert(A <= MAXARG_A && B <= MAXARG_B && + C <= MAXARG_C && (k & ~1) == 0); + return luaK_code(fs, CREATE_ABCk(o, A, B, C, k)); +} + + +int luaK_codevABCk (FuncState *fs, OpCode o, int A, int B, int C, int k) { + lua_assert(getOpMode(o) == ivABC); + lua_assert(A <= MAXARG_A && B <= MAXARG_vB && + C <= MAXARG_vC && (k & ~1) == 0); + return luaK_code(fs, CREATE_vABCk(o, A, B, C, k)); } /* ** Format and emit an 'iABx' instruction. */ -int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { +int luaK_codeABx (FuncState *fs, OpCode o, int A, int Bc) { lua_assert(getOpMode(o) == iABx); - lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); - return luaK_code(fs, CREATE_ABx(o, a, bc)); + lua_assert(A <= MAXARG_A && Bc <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, A, Bc)); } /* ** Format and emit an 'iAsBx' instruction. */ -static int codeAsBx (FuncState *fs, OpCode o, int a, int bc) { - unsigned int b = bc + OFFSET_sBx; +static int codeAsBx (FuncState *fs, OpCode o, int A, int Bc) { + int b = Bc + OFFSET_sBx; lua_assert(getOpMode(o) == iAsBx); - lua_assert(a <= MAXARG_A && b <= MAXARG_Bx); - return luaK_code(fs, CREATE_ABx(o, a, b)); + lua_assert(A <= MAXARG_A && b <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, A, b)); } @@ -427,7 +437,7 @@ static int codeAsBx (FuncState *fs, OpCode o, int a, int bc) { ** Format and emit an 'isJ' instruction. */ static int codesJ (FuncState *fs, OpCode o, int sj, int k) { - unsigned int j = sj + OFFSET_sJ; + int j = sj + OFFSET_sJ; lua_assert(getOpMode(o) == isJ); lua_assert(j <= MAXARG_sJ && (k & ~1) == 0); return luaK_code(fs, CREATE_sJ(o, j, k)); @@ -437,9 +447,9 @@ static int codesJ (FuncState *fs, OpCode o, int sj, int k) { /* ** Emit an "extra argument" instruction (format 'iAx') */ -static int codeextraarg (FuncState *fs, int a) { - lua_assert(a <= MAXARG_Ax); - return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a)); +static int codeextraarg (FuncState *fs, int A) { + lua_assert(A <= MAXARG_Ax); + return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, A)); } @@ -466,9 +476,7 @@ static int luaK_codek (FuncState *fs, int reg, int k) { void luaK_checkstack (FuncState *fs, int n) { int newstack = fs->freereg + n; if (newstack > fs->f->maxstacksize) { - if (newstack >= MAXREGS) - luaX_syntaxerror(fs->ls, - "function or expression needs too many registers"); + luaY_checklimit(fs, newstack, MAX_FSTACK, "registers"); fs->f->maxstacksize = cast_byte(newstack); } } @@ -479,7 +487,7 @@ void luaK_checkstack (FuncState *fs, int n) { */ void luaK_reserveregs (FuncState *fs, int n) { luaK_checkstack(fs, n); - fs->freereg += n; + fs->freereg = cast_byte(fs->freereg + n); } @@ -533,39 +541,45 @@ static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) { /* ** Add constant 'v' to prototype's list of constants (field 'k'). +*/ +static int addk (FuncState *fs, Proto *f, TValue *v) { + lua_State *L = fs->ls->L; + int oldsize = f->sizek; + int k = fs->nk; + luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); + while (oldsize < f->sizek) + setnilvalue(&f->k[oldsize++]); + setobj(L, &f->k[k], v); + fs->nk++; + luaC_barrier(L, f, v); + return k; +} + + +/* ** Use scanner's table to cache position of constants in constant list ** and try to reuse constants. Because some values should not be used ** as keys (nil cannot be a key, integer keys can collapse with float ** keys), the caller must provide a useful 'key' for indexing the cache. -** Note that all functions share the same table, so entering or exiting -** a function can make some indices wrong. */ -static int addk (FuncState *fs, TValue *key, TValue *v) { +static int k2proto (FuncState *fs, TValue *key, TValue *v) { TValue val; - lua_State *L = fs->ls->L; Proto *f = fs->f; - const TValue *idx = luaH_get(fs->ls->h, key); /* query scanner table */ - int k, oldsize; - if (ttisinteger(idx)) { /* is there an index there? */ - k = cast_int(ivalue(idx)); - /* correct value? (warning: must distinguish floats from integers!) */ - if (k < fs->nk && ttypetag(&f->k[k]) == ttypetag(v) && - luaV_rawequalobj(&f->k[k], v)) - return k; /* reuse index */ + int tag = luaH_get(fs->kcache, key, &val); /* query scanner table */ + if (!tagisempty(tag)) { /* is there an index there? */ + int k = cast_int(ivalue(&val)); + /* collisions can happen only for float keys */ + lua_assert(ttisfloat(key) || luaV_rawequalobj(&f->k[k], v)); + return k; /* reuse index */ + } + else { /* constant not found; create a new entry */ + int k = addk(fs, f, v); + /* cache it for reuse; numerical value does not need GC barrier; + table is not a metatable, so it does not need to invalidate cache */ + setivalue(&val, k); + luaH_set(fs->ls->L, fs->kcache, key, &val); + return k; } - /* constant not found; create a new entry */ - oldsize = f->sizek; - k = fs->nk; - /* numerical value does not need GC barrier; - table has no metatable, so it does not need to invalidate cache */ - setivalue(&val, k); - luaH_finishset(L, fs->ls->h, key, idx, &val); - luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); - while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); - setobj(L, &f->k[k], v); - fs->nk++; - luaC_barrier(L, f, v); - return k; } @@ -575,7 +589,7 @@ static int addk (FuncState *fs, TValue *key, TValue *v) { static int stringK (FuncState *fs, TString *s) { TValue o; setsvalue(fs->ls->L, &o, s); - return addk(fs, &o, &o); /* use string itself as key */ + return k2proto(fs, &o, &o); /* use string itself as key */ } @@ -585,36 +599,42 @@ static int stringK (FuncState *fs, TString *s) { static int luaK_intK (FuncState *fs, lua_Integer n) { TValue o; setivalue(&o, n); - return addk(fs, &o, &o); /* use integer itself as key */ + return k2proto(fs, &o, &o); /* use integer itself as key */ } /* ** Add a float to list of constants and return its index. Floats ** with integral values need a different key, to avoid collision -** with actual integers. To that, we add to the number its smaller +** with actual integers. To that end, we add to the number its smaller ** power-of-two fraction that is still significant in its scale. -** For doubles, that would be 1/2^52. -** (This method is not bulletproof: there may be another float -** with that value, and for floats larger than 2^53 the result is -** still an integer. At worst, this only wastes an entry with -** a duplicate.) +** (For doubles, the fraction would be 2^-52). +** This method is not bulletproof: different numbers may generate the +** same key (e.g., very large numbers will overflow to 'inf') and for +** floats larger than 2^53 the result is still an integer. For those +** cases, just generate a new entry. At worst, this only wastes an entry +** with a duplicate. */ static int luaK_numberK (FuncState *fs, lua_Number r) { - TValue o; - lua_Integer ik; - setfltvalue(&o, r); - if (!luaV_flttointeger(r, &ik, F2Ieq)) /* not an integral value? */ - return addk(fs, &o, &o); /* use number itself as key */ - else { /* must build an alternative key */ + TValue o, kv; + setfltvalue(&o, r); /* value as a TValue */ + if (r == 0) { /* handle zero as a special case */ + setpvalue(&kv, fs); /* use FuncState as index */ + return k2proto(fs, &kv, &o); /* cannot collide */ + } + else { const int nbm = l_floatatt(MANT_DIG); const lua_Number q = l_mathop(ldexp)(l_mathop(1.0), -nbm + 1); - const lua_Number k = (ik == 0) ? q : r + r*q; /* new key */ - TValue kv; - setfltvalue(&kv, k); - /* result is not an integral value, unless value is too large */ - lua_assert(!luaV_flttointeger(k, &ik, F2Ieq) || - l_mathop(fabs)(r) >= l_mathop(1e6)); - return addk(fs, &kv, &o); + const lua_Number k = r * (1 + q); /* key */ + lua_Integer ik; + setfltvalue(&kv, k); /* key as a TValue */ + if (!luaV_flttointeger(k, &ik, F2Ieq)) { /* not an integer value? */ + int n = k2proto(fs, &kv, &o); /* use key */ + if (luaV_rawequalobj(&fs->f->k[n], &o)) /* correct value? */ + return n; + } + /* else, either key is still an integer or there was a collision; + anyway, do not try to reuse constant; instead, create a new one */ + return addk(fs, fs->f, &o); } } @@ -625,7 +645,7 @@ static int luaK_numberK (FuncState *fs, lua_Number r) { static int boolF (FuncState *fs) { TValue o; setbfvalue(&o); - return addk(fs, &o, &o); /* use boolean itself as key */ + return k2proto(fs, &o, &o); /* use boolean itself as key */ } @@ -635,7 +655,7 @@ static int boolF (FuncState *fs) { static int boolT (FuncState *fs) { TValue o; setbtvalue(&o); - return addk(fs, &o, &o); /* use boolean itself as key */ + return k2proto(fs, &o, &o); /* use boolean itself as key */ } @@ -645,9 +665,9 @@ static int boolT (FuncState *fs) { static int nilK (FuncState *fs) { TValue k, v; setnilvalue(&v); - /* cannot use nil as key; instead use table itself to represent nil */ - sethvalue(fs->ls->L, &k, fs->ls->h); - return addk(fs, &k, &v); + /* cannot use nil as key; instead use table itself */ + sethvalue(fs->ls->L, &k, fs->kcache); + return k2proto(fs, &k, &v); } @@ -686,6 +706,22 @@ static void luaK_float (FuncState *fs, int reg, lua_Number f) { } +/* +** Get the value of 'var' in a register and generate an opcode to check +** whether that register is nil. 'k' is the index of the variable name +** in the list of constants. If its value cannot be encoded in Bx, a 0 +** will use '?' for the name. +*/ +void luaK_codecheckglobal (FuncState *fs, expdesc *var, int k, int line) { + luaK_exp2anyreg(fs, var); + luaK_fixline(fs, line); + k = (k >= MAXARG_Bx) ? 0 : k + 1; + luaK_codeABx(fs, OP_ERRNNIL, var->u.info, k); + luaK_fixline(fs, line); + freeexp(fs, var); +} + + /* ** Convert a constant in 'v' into an expression description 'e' */ @@ -720,6 +756,7 @@ static void const2exp (TValue *v, expdesc *e) { */ void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { Instruction *pc = &getinstruction(fs, e); + luaY_checklimit(fs, nresults + 1, MAXARG_C, "multiple results"); if (e->k == VCALL) /* expression is an open function call? */ SETARG_C(*pc, nresults + 1); else { @@ -734,10 +771,11 @@ void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { /* ** Convert a VKSTR to a VK */ -static void str2K (FuncState *fs, expdesc *e) { +static int str2K (FuncState *fs, expdesc *e) { lua_assert(e->k == VKSTR); e->u.info = stringK(fs, e->u.strval); e->k = VK; + return e->u.info; } @@ -764,6 +802,15 @@ void luaK_setoneret (FuncState *fs, expdesc *e) { } } +/* +** Change a vararg parameter into a regular local variable +*/ +void luaK_vapar2local (FuncState *fs, expdesc *var) { + needvatab(fs->f); /* function will need a vararg table */ + /* now a vararg parameter is equivalent to a regular local variable */ + var->k = VLOCAL; +} + /* ** Ensure that expression 'e' is not a variable (nor a ). @@ -775,6 +822,9 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { const2exp(const2val(fs, e), e); break; } + case VVARGVAR: { + luaK_vapar2local(fs, e); /* turn it into a local variable */ + } /* FALLTHROUGH */ case VLOCAL: { /* already in a register */ int temp = e->u.var.ridx; e->u.info = temp; /* (can't do a direct assignment; values overlap) */ @@ -809,6 +859,12 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) { e->k = VRELOC; break; } + case VVARGIND: { + freeregs(fs, e->u.ind.t, e->u.ind.idx); + e->u.info = luaK_codeABC(fs, OP_GETVARG, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } case VVARARG: case VCALL: { luaK_setoneret(fs, e); break; @@ -971,11 +1027,11 @@ int luaK_exp2anyreg (FuncState *fs, expdesc *e) { /* -** Ensures final expression result is either in a register -** or in an upvalue. +** Ensures final expression result is either in a register, +** in an upvalue, or it is the vararg parameter. */ void luaK_exp2anyregup (FuncState *fs, expdesc *e) { - if (e->k != VUPVAL || hasjumps(e)) + if ((e->k != VUPVAL && e->k != VVARGVAR) || hasjumps(e)) luaK_exp2anyreg(fs, e); } @@ -985,7 +1041,7 @@ void luaK_exp2anyregup (FuncState *fs, expdesc *e) { ** or it is a constant. */ void luaK_exp2val (FuncState *fs, expdesc *e) { - if (hasjumps(e)) + if (e->k == VJMP || hasjumps(e)) luaK_exp2anyreg(fs, e); else luaK_dischargevars(fs, e); @@ -1036,10 +1092,10 @@ static int exp2RK (FuncState *fs, expdesc *e) { } -static void codeABRK (FuncState *fs, OpCode o, int a, int b, +static void codeABRK (FuncState *fs, OpCode o, int A, int B, expdesc *ec) { int k = exp2RK(fs, ec); - luaK_codeABCk(fs, o, a, b, ec->u.info, k); + luaK_codeABCk(fs, o, A, B, ec->u.info, k); } @@ -1070,6 +1126,10 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { codeABRK(fs, OP_SETFIELD, var->u.ind.t, var->u.ind.idx, ex); break; } + case VVARGIND: { + needvatab(fs->f); /* function will need a vararg table */ + /* now, assignment is to a regular table */ + } /* FALLTHROUGH */ case VINDEXED: { codeABRK(fs, OP_SETTABLE, var->u.ind.t, var->u.ind.idx, ex); break; @@ -1080,22 +1140,6 @@ void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { } -/* -** Emit SELF instruction (convert expression 'e' into 'e:key(e,'). -*/ -void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { - int ereg; - luaK_exp2anyreg(fs, e); - ereg = e->u.info; /* register where 'e' was placed */ - freeexp(fs, e); - e->u.info = fs->freereg; /* base register for op_self */ - e->k = VNONRELOC; /* self expression has a fixed register */ - luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */ - codeABRK(fs, OP_SELF, e->u.info, ereg, key); - freeexp(fs, key); -} - - /* ** Negate condition 'e' (where 'e' is a comparison). */ @@ -1158,7 +1202,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) { /* ** Emit code to go through if 'e' is false, jump otherwise. */ -void luaK_goiffalse (FuncState *fs, expdesc *e) { +static void luaK_goiffalse (FuncState *fs, expdesc *e) { int pc; /* pc of new jump */ luaK_dischargevars(fs, e); switch (e->k) { @@ -1219,7 +1263,7 @@ static void codenot (FuncState *fs, expdesc *e) { ** Check whether expression 'e' is a short literal string */ static int isKstr (FuncState *fs, expdesc *e) { - return (e->k == VK && !hasjumps(e) && e->u.info <= MAXARG_B && + return (e->k == VK && !hasjumps(e) && e->u.info <= MAXINDEXRK && ttisshrstring(&fs->f->k[e->u.info])); } @@ -1270,6 +1314,40 @@ static int isSCnumber (expdesc *e, int *pi, int *isfloat) { } +/* +** Emit SELF instruction or equivalent: the code will convert +** expression 'e' into 'e.key(e,'. +*/ +void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { + int ereg, base; + luaK_exp2anyreg(fs, e); + ereg = e->u.info; /* register where 'e' (the receiver) was placed */ + freeexp(fs, e); + base = e->u.info = fs->freereg; /* base register for op_self */ + e->k = VNONRELOC; /* self expression has a fixed register */ + luaK_reserveregs(fs, 2); /* method and 'self' produced by op_self */ + lua_assert(key->k == VKSTR); + /* is method name a short string in a valid K index? */ + if (strisshr(key->u.strval) && luaK_exp2K(fs, key)) { + /* can use 'self' opcode */ + luaK_codeABCk(fs, OP_SELF, base, ereg, key->u.info, 0); + } + else { /* cannot use 'self' opcode; use move+gettable */ + luaK_exp2anyreg(fs, key); /* put method name in a register */ + luaK_codeABC(fs, OP_MOVE, base + 1, ereg, 0); /* copy self to base+1 */ + luaK_codeABC(fs, OP_GETTABLE, base, ereg, key->u.info); /* get method */ + } + freeexp(fs, key); +} + + +/* auxiliary function to define indexing expressions */ +static void fillidxk (expdesc *t, int idx, expkind k) { + t->u.ind.idx = cast_byte(idx); + t->k = k; +} + + /* ** Create expression 't[k]'. 't' must have its final result already in a ** register or upvalue. Upvalues can only be indexed by literal strings. @@ -1277,35 +1355,39 @@ static int isSCnumber (expdesc *e, int *pi, int *isfloat) { ** values in registers. */ void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + int keystr = -1; if (k->k == VKSTR) - str2K(fs, k); + keystr = str2K(fs, k); lua_assert(!hasjumps(t) && - (t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL)); + (t->k == VLOCAL || t->k == VVARGVAR || + t->k == VNONRELOC || t->k == VUPVAL)); if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non 'Kstr'? */ luaK_exp2anyreg(fs, t); /* put it in a register */ if (t->k == VUPVAL) { - int temp = t->u.info; /* upvalue index */ - lua_assert(isKstr(fs, k)); + lu_byte temp = cast_byte(t->u.info); /* upvalue index */ t->u.ind.t = temp; /* (can't do a direct assignment; values overlap) */ - t->u.ind.idx = k->u.info; /* literal short string */ - t->k = VINDEXUP; + lua_assert(isKstr(fs, k)); + fillidxk(t, k->u.info, VINDEXUP); /* literal short string */ + } + else if (t->k == VVARGVAR) { /* indexing the vararg parameter? */ + int kreg = luaK_exp2anyreg(fs, k); /* put key in some register */ + lu_byte vreg = cast_byte(t->u.var.ridx); /* register with vararg param. */ + lua_assert(vreg == fs->f->numparams); + t->u.ind.t = vreg; /* (avoid a direct assignment; values may overlap) */ + fillidxk(t, kreg, VVARGIND); /* 't' represents 'vararg[k]' */ } else { /* register index of the table */ - t->u.ind.t = (t->k == VLOCAL) ? t->u.var.ridx: t->u.info; - if (isKstr(fs, k)) { - t->u.ind.idx = k->u.info; /* literal short string */ - t->k = VINDEXSTR; - } - else if (isCint(k)) { - t->u.ind.idx = cast_int(k->u.ival); /* int. constant in proper range */ - t->k = VINDEXI; - } - else { - t->u.ind.idx = luaK_exp2anyreg(fs, k); /* register */ - t->k = VINDEXED; - } + t->u.ind.t = cast_byte((t->k == VLOCAL) ? t->u.var.ridx: t->u.info); + if (isKstr(fs, k)) + fillidxk(t, k->u.info, VINDEXSTR); /* literal short string */ + else if (isCint(k)) /* int. constant in proper range? */ + fillidxk(t, cast_int(k->u.ival), VINDEXI); + else + fillidxk(t, luaK_exp2anyreg(fs, k), VINDEXED); /* register */ } + t->u.ind.keystr = keystr; /* string index in 'k' */ + t->u.ind.ro = 0; /* by default, not read-only */ } @@ -1412,7 +1494,7 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, e1->u.info = pc; e1->k = VRELOC; /* all those operations are relocatable */ luaK_fixline(fs, line); - luaK_codeABCk(fs, mmop, v1, v2, event, flip); /* to call metamethod */ + luaK_codeABCk(fs, mmop, v1, v2, cast_int(event), flip); /* metamethod */ luaK_fixline(fs, line); } @@ -1617,7 +1699,7 @@ void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) { luaK_dischargevars(fs, e); switch (opr) { case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */ - if (constfolding(fs, opr + LUA_OPUNM, e, &ef)) + if (constfolding(fs, cast_int(opr + LUA_OPUNM), e, &ef)) break; /* else */ /* FALLTHROUGH */ case OPR_LEN: @@ -1705,7 +1787,7 @@ static void codeconcat (FuncState *fs, expdesc *e1, expdesc *e2, int line) { void luaK_posfix (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2, int line) { luaK_dischargevars(fs, e2); - if (foldbinop(opr) && constfolding(fs, opr + LUA_OPADD, e1, e2)) + if (foldbinop(opr) && constfolding(fs, cast_int(opr + LUA_OPADD), e1, e2)) return; /* done by folding */ switch (opr) { case OPR_AND: { @@ -1791,11 +1873,11 @@ void luaK_fixline (FuncState *fs, int line) { void luaK_settablesize (FuncState *fs, int pc, int ra, int asize, int hsize) { Instruction *inst = &fs->f->code[pc]; - int rb = (hsize != 0) ? luaO_ceillog2(hsize) + 1 : 0; /* hash size */ - int extra = asize / (MAXARG_C + 1); /* higher bits of array size */ - int rc = asize % (MAXARG_C + 1); /* lower bits of array size */ + int extra = asize / (MAXARG_vC + 1); /* higher bits of array size */ + int rc = asize % (MAXARG_vC + 1); /* lower bits of array size */ int k = (extra > 0); /* true iff needs extra argument */ - *inst = CREATE_ABCk(OP_NEWTABLE, ra, rb, rc, k); + hsize = (hsize != 0) ? luaO_ceillog2(cast_uint(hsize)) + 1 : 0; + *inst = CREATE_vABCk(OP_NEWTABLE, ra, hsize, rc, k); *(inst + 1) = CREATE_Ax(OP_EXTRAARG, extra); } @@ -1808,18 +1890,18 @@ void luaK_settablesize (FuncState *fs, int pc, int ra, int asize, int hsize) { ** table (or LUA_MULTRET to add up to stack top). */ void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { - lua_assert(tostore != 0 && tostore <= LFIELDS_PER_FLUSH); + lua_assert(tostore != 0); if (tostore == LUA_MULTRET) tostore = 0; - if (nelems <= MAXARG_C) - luaK_codeABC(fs, OP_SETLIST, base, tostore, nelems); + if (nelems <= MAXARG_vC) + luaK_codevABCk(fs, OP_SETLIST, base, tostore, nelems, 0); else { - int extra = nelems / (MAXARG_C + 1); - nelems %= (MAXARG_C + 1); - luaK_codeABCk(fs, OP_SETLIST, base, tostore, nelems, 1); + int extra = nelems / (MAXARG_vC + 1); + nelems %= (MAXARG_vC + 1); + luaK_codevABCk(fs, OP_SETLIST, base, tostore, nelems, 1); codeextraarg(fs, extra); } - fs->freereg = base + 1; /* free registers with list values */ + fs->freereg = cast_byte(base + 1); /* free registers with list values */ } @@ -1832,8 +1914,8 @@ static int finaltarget (Instruction *code, int i) { Instruction pc = code[i]; if (GET_OPCODE(pc) != OP_JMP) break; - else - i += GETARG_sJ(pc) + 1; + else + i += GETARG_sJ(pc) + 1; } return i; } @@ -1843,15 +1925,20 @@ static int finaltarget (Instruction *code, int i) { ** Do a final pass over the code of a function, doing small peephole ** optimizations and adjustments. */ +#include "lopnames.h" void luaK_finish (FuncState *fs) { int i; Proto *p = fs->f; + if (p->flag & PF_VATAB) /* will it use a vararg table? */ + p->flag &= cast_byte(~PF_VAHID); /* then it will not use hidden args. */ for (i = 0; i < fs->pc; i++) { Instruction *pc = &p->code[i]; - lua_assert(i == 0 || isOT(*(pc - 1)) == isIT(*pc)); + /* avoid "not used" warnings when assert is off (for 'onelua.c') */ + (void)luaP_isOT; (void)luaP_isIT; + lua_assert(i == 0 || luaP_isOT(*(pc - 1)) == luaP_isIT(*pc)); switch (GET_OPCODE(*pc)) { case OP_RETURN0: case OP_RETURN1: { - if (!(fs->needclose || p->is_vararg)) + if (!(fs->needclose || (p->flag & PF_VAHID))) break; /* no extra work */ /* else use OP_RETURN to do the extra work */ SET_OPCODE(*pc, OP_RETURN); @@ -1859,13 +1946,23 @@ void luaK_finish (FuncState *fs) { case OP_RETURN: case OP_TAILCALL: { if (fs->needclose) SETARG_k(*pc, 1); /* signal that it needs to close */ - if (p->is_vararg) - SETARG_C(*pc, p->numparams + 1); /* signal that it is vararg */ + if (p->flag & PF_VAHID) /* does it use hidden arguments? */ + SETARG_C(*pc, p->numparams + 1); /* signal that */ + break; + } + case OP_GETVARG: { + if (p->flag & PF_VATAB) /* function has a vararg table? */ + SET_OPCODE(*pc, OP_GETTABLE); /* must get vararg there */ + break; + } + case OP_VARARG: { + if (p->flag & PF_VATAB) /* function has a vararg table? */ + SETARG_k(*pc, 1); /* must get vararg there */ break; } - case OP_JMP: { + case OP_JMP: { /* to optimize jumps to jumps */ int target = finaltarget(p->code, i); - fixjump(fs, i, target); + fixjump(fs, i, target); /* jump directly to final target */ break; } default: break; diff --git a/lua-5.4.7/src/lcorolib.c b/src/lcorolib.c similarity index 89% rename from lua-5.4.7/src/lcorolib.c rename to src/lcorolib.c index c64adf0..eb30bf4 100644 --- a/lua-5.4.7/src/lcorolib.c +++ b/src/lcorolib.c @@ -16,6 +16,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" static lua_State *getco (lua_State *L) { @@ -153,8 +154,13 @@ static int luaB_costatus (lua_State *L) { } +static lua_State *getoptco (lua_State *L) { + return (lua_isnone(L, 1) ? L : getco(L)); +} + + static int luaB_yieldable (lua_State *L) { - lua_State *co = lua_isnone(L, 1) ? L : getco(L); + lua_State *co = getoptco(L); lua_pushboolean(L, lua_isyieldable(co)); return 1; } @@ -168,7 +174,7 @@ static int luaB_corunning (lua_State *L) { static int luaB_close (lua_State *L) { - lua_State *co = getco(L); + lua_State *co = getoptco(L); int status = auxstatus(L, co); switch (status) { case COS_DEAD: case COS_YIELD: { @@ -183,8 +189,17 @@ static int luaB_close (lua_State *L) { return 2; } } - default: /* normal or running coroutine */ + case COS_NORM: return luaL_error(L, "cannot close a %s coroutine", statname[status]); + case COS_RUN: + lua_geti(L, LUA_REGISTRYINDEX, LUA_RIDX_MAINTHREAD); /* get main */ + if (lua_tothread(L, -1) == co) + return luaL_error(L, "cannot close main thread"); + lua_closethread(co, L); /* close itself */ + /* previous call does not return *//* FALLTHROUGH */ + default: + lua_assert(0); + return 0; } } diff --git a/lua-5.4.7/src/lctype.c b/src/lctype.c similarity index 97% rename from lua-5.4.7/src/lctype.c rename to src/lctype.c index 9542280..b1a43e4 100644 --- a/lua-5.4.7/src/lctype.c +++ b/src/lctype.c @@ -18,7 +18,7 @@ #if defined (LUA_UCID) /* accept UniCode IDentifiers? */ -/* consider all non-ascii codepoints to be alphabetic */ +/* consider all non-ASCII codepoints to be alphabetic */ #define NONA 0x01 #else #define NONA 0x00 /* default */ diff --git a/lua-5.4.7/src/ldblib.c b/src/ldblib.c similarity index 98% rename from lua-5.4.7/src/ldblib.c rename to src/ldblib.c index 6dcbaa9..c7b7481 100644 --- a/lua-5.4.7/src/ldblib.c +++ b/src/ldblib.c @@ -18,6 +18,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" /* @@ -190,8 +191,10 @@ static int db_getinfo (lua_State *L) { settabsi(L, "ftransfer", ar.ftransfer); settabsi(L, "ntransfer", ar.ntransfer); } - if (strchr(options, 't')) + if (strchr(options, 't')) { settabsb(L, "istailcall", ar.istailcall); + settabsi(L, "extraargs", ar.extraargs); + } if (strchr(options, 'L')) treatstackoption(L, L1, "activelines"); if (strchr(options, 'f')) @@ -446,14 +449,6 @@ static int db_traceback (lua_State *L) { } -static int db_setcstacklimit (lua_State *L) { - int limit = (int)luaL_checkinteger(L, 1); - int res = lua_setcstacklimit(L, limit); - lua_pushinteger(L, res); - return 1; -} - - static const luaL_Reg dblib[] = { {"debug", db_debug}, {"getuservalue", db_getuservalue}, @@ -471,7 +466,6 @@ static const luaL_Reg dblib[] = { {"setmetatable", db_setmetatable}, {"setupvalue", db_setupvalue}, {"traceback", db_traceback}, - {"setcstacklimit", db_setcstacklimit}, {NULL, NULL} }; diff --git a/lua-5.4.7/src/ldebug.c b/src/ldebug.c similarity index 92% rename from lua-5.4.7/src/ldebug.c rename to src/ldebug.c index 591b352..8df5f5f 100644 --- a/lua-5.4.7/src/ldebug.c +++ b/src/ldebug.c @@ -33,6 +33,8 @@ #define LuaClosure(f) ((f) != NULL && (f)->c.tt == LUA_VLCL) +static const char strlocal[] = "local"; +static const char strupval[] = "upvalue"; static const char *funcnamefromcall (lua_State *L, CallInfo *ci, const char **name); @@ -63,7 +65,7 @@ static int getbaseline (const Proto *f, int pc, int *basepc) { return f->linedefined; } else { - int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */ + int i = pc / MAXIWTHABS - 1; /* get an estimate */ /* estimate must be a lower bound of the correct base */ lua_assert(i < 0 || (i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc)); @@ -182,7 +184,7 @@ static const char *upvalname (const Proto *p, int uv) { static const char *findvararg (CallInfo *ci, int n, StkId *pos) { - if (clLvalue(s2v(ci->func.p))->p->is_vararg) { + if (clLvalue(s2v(ci->func.p))->p->flag & PF_VAHID) { int nextra = ci->u.l.nextraargs; if (n >= -nextra) { /* 'n' is negative */ *pos = ci->func.p - nextra - (n + 1); @@ -245,6 +247,7 @@ LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { lua_lock(L); name = luaG_findlocal(L, ar->i_ci, n, &pos); if (name) { + api_checkpop(L, 1); setobjs2s(L, pos, L->top.p - 1); L->top.p--; /* pop value */ } @@ -264,8 +267,7 @@ static void funcinfo (lua_Debug *ar, Closure *cl) { else { const Proto *p = cl->l.p; if (p->source) { - ar->source = getstr(p->source); - ar->srclen = tsslen(p->source); + ar->source = getlstr(p->source, ar->srclen); } else { ar->source = "=?"; @@ -302,7 +304,7 @@ static void collectvalidlines (lua_State *L, Closure *f) { int i; TValue v; setbtvalue(&v); /* boolean 'true' to be the value of all indices */ - if (!p->is_vararg) /* regular function? */ + if (!(isvararg(p))) /* regular function? */ i = 0; /* consider all instructions */ else { /* vararg function */ lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP); @@ -346,13 +348,21 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, ar->nparams = 0; } else { - ar->isvararg = f->l.p->is_vararg; + ar->isvararg = (isvararg(f->l.p)) ? 1 : 0; ar->nparams = f->l.p->numparams; } break; } case 't': { - ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0; + if (ci != NULL) { + ar->istailcall = !!(ci->callstatus & CIST_TAIL); + ar->extraargs = + cast_uchar((ci->callstatus & MAX_CCMT) >> CIST_CCMT); + } + else { + ar->istailcall = 0; + ar->extraargs = 0; + } break; } case 'n': { @@ -364,11 +374,11 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, break; } case 'r': { - if (ci == NULL || !(ci->callstatus & CIST_TRAN)) + if (ci == NULL || !(ci->callstatus & CIST_HOOKED)) ar->ftransfer = ar->ntransfer = 0; else { - ar->ftransfer = ci->u2.transferinfo.ftransfer; - ar->ntransfer = ci->u2.transferinfo.ntransfer; + ar->ftransfer = L->transferinfo.ftransfer; + ar->ntransfer = L->transferinfo.ntransfer; } break; } @@ -497,7 +507,7 @@ static const char *basicgetobjname (const Proto *p, int *ppc, int reg, int pc = *ppc; *name = luaF_getlocalname(p, reg + 1, pc); if (*name) /* is a local? */ - return "local"; + return strlocal; /* else try symbolic execution */ *ppc = pc = findsetreg(p, pc, reg); if (pc != -1) { /* could find instruction? */ @@ -512,7 +522,7 @@ static const char *basicgetobjname (const Proto *p, int *ppc, int reg, } case OP_GETUPVAL: { *name = upvalname(p, GETARG_B(i)); - return "upvalue"; + return strupval; } case OP_LOADK: return kname(p, GETARG_Bx(i), name); case OP_LOADKX: return kname(p, GETARG_Ax(p->code[pc + 1]), name); @@ -533,18 +543,6 @@ static void rname (const Proto *p, int pc, int c, const char **name) { } -/* -** Find a "name" for a 'C' value in an RK instruction. -*/ -static void rkname (const Proto *p, int pc, Instruction i, const char **name) { - int c = GETARG_C(i); /* key index */ - if (GETARG_k(i)) /* is 'c' a constant? */ - kname(p, c, name); - else /* 'c' is a register */ - rname(p, pc, c, name); -} - - /* ** Check whether table being indexed by instruction 'i' is the ** environment '_ENV' @@ -554,8 +552,13 @@ static const char *isEnv (const Proto *p, int pc, Instruction i, int isup) { const char *name; /* name of indexed variable */ if (isup) /* is 't' an upvalue? */ name = upvalname(p, t); - else /* 't' is a register */ - basicgetobjname(p, &pc, t, &name); + else { /* 't' is a register */ + const char *what = basicgetobjname(p, &pc, t, &name); + /* 'name' must be the name of a local variable (at the current + level or an upvalue) */ + if (what != strlocal && what != strupval) + name = NULL; /* cannot be the variable _ENV */ + } return (name && strcmp(name, LUA_ENV) == 0) ? "global" : "field"; } @@ -592,7 +595,8 @@ static const char *getobjname (const Proto *p, int lastpc, int reg, return isEnv(p, lastpc, i, 0); } case OP_SELF: { - rkname(p, lastpc, i, name); + int k = GETARG_C(i); /* key index */ + kname(p, k, name); return "method"; } default: break; /* go through to return NULL */ @@ -701,7 +705,7 @@ static const char *getupvalname (CallInfo *ci, const TValue *o, for (i = 0; i < c->nupvalues; i++) { if (c->upvals[i]->v.p == o) { *name = upvalname(c->p, i); - return "upvalue"; + return strupval; } } return NULL; @@ -810,16 +814,26 @@ l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { } +l_noret luaG_errnnil (lua_State *L, LClosure *cl, int k) { + const char *globalname = "?"; /* default name if k == 0 */ + if (k > 0) + kname(cl->p, k - 1, &globalname); + luaG_runerror(L, "global '%s' already defined", globalname); +} + + /* add src:line information to 'msg' */ const char *luaG_addinfo (lua_State *L, const char *msg, TString *src, int line) { - char buff[LUA_IDSIZE]; - if (src) - luaO_chunkid(buff, getstr(src), tsslen(src)); - else { /* no source available; use "?" instead */ - buff[0] = '?'; buff[1] = '\0'; + if (src == NULL) /* no debug information? */ + return luaO_pushfstring(L, "?:?: %s", msg); + else { + char buff[LUA_IDSIZE]; + size_t idlen; + const char *id = getlstr(src, idlen); + luaO_chunkid(buff, id, idlen); + return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); } - return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); } @@ -832,6 +846,10 @@ l_noret luaG_errormsg (lua_State *L) { L->top.p++; /* assume EXTRA_STACK */ luaD_callnoyield(L, L->top.p - 2, 1); /* call it */ } + if (ttisnil(s2v(L->top.p - 1))) { /* error object is nil? */ + /* change it to a proper message */ + setsvalue2s(L, L->top.p - 1, luaS_newliteral(L, "")); + } luaD_throw(L, LUA_ERRRUN); } @@ -841,10 +859,9 @@ l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { const char *msg; va_list argp; luaC_checkGC(L); /* error message uses memory */ - va_start(argp, fmt); - msg = luaO_pushvfstring(L, fmt, argp); /* format message */ - va_end(argp); - if (isLua(ci)) { /* if Lua function, add source:line information */ + pushvfstring(L, argp, fmt, msg); + if (isLua(ci)) { /* Lua function? */ + /* add source:line information */ luaG_addinfo(L, msg, ci_func(ci)->p->source, getcurrentline(ci)); setobjs2s(L, L->top.p - 2, L->top.p - 1); /* remove 'msg' */ L->top.p--; @@ -895,9 +912,9 @@ int luaG_tracecall (lua_State *L) { Proto *p = ci_func(ci)->p; ci->u.l.trap = 1; /* ensure hooks will be checked */ if (ci->u.l.savedpc == p->code) { /* first instruction (not resuming)? */ - if (p->is_vararg) + if (isvararg(p)) return 0; /* hooks will start at VARARGPREP instruction */ - else if (!(ci->callstatus & CIST_HOOKYIELD)) /* not yieded? */ + else if (!(ci->callstatus & CIST_HOOKYIELD)) /* not yielded? */ luaD_hookcall(L, ci); /* check 'call' hook */ } return 1; /* keep 'trap' on */ @@ -918,7 +935,7 @@ int luaG_tracecall (lua_State *L) { */ int luaG_traceexec (lua_State *L, const Instruction *pc) { CallInfo *ci = L->ci; - lu_byte mask = L->hookmask; + lu_byte mask = cast_byte(L->hookmask); const Proto *p = ci_func(ci)->p; int counthook; if (!(mask & (LUA_MASKLINE | LUA_MASKCOUNT))) { /* no hooks? */ @@ -936,7 +953,7 @@ int luaG_traceexec (lua_State *L, const Instruction *pc) { ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */ return 1; /* do not call hook again (VM yielded, so it did not move) */ } - if (!isIT(*(ci->u.l.savedpc - 1))) /* top not being used? */ + if (!luaP_isIT(*(ci->u.l.savedpc - 1))) /* top not being used? */ L->top.p = ci->top.p; /* correct top */ if (counthook) luaD_hook(L, LUA_HOOKCOUNT, -1, 0, 0); /* call count hook */ diff --git a/lua-5.4.7/src/ldo.c b/src/ldo.c similarity index 70% rename from lua-5.4.7/src/ldo.c rename to src/ldo.c index ea05295..6d0184e 100644 --- a/lua-5.4.7/src/ldo.c +++ b/src/ldo.c @@ -38,16 +38,37 @@ #define errorstatus(s) ((s) > LUA_YIELD) +/* +** these macros allow user-specific actions when a thread is +** resumed/yielded. +*/ +#if !defined(luai_userstateresume) +#define luai_userstateresume(L,n) ((void)L) +#endif + +#if !defined(luai_userstateyield) +#define luai_userstateyield(L,n) ((void)L) +#endif + + /* ** {====================================================== ** Error-recovery functions ** ======================================================= */ +/* chained list of long jump buffers */ +typedef struct lua_longjmp { + struct lua_longjmp *previous; + jmp_buf b; + volatile TStatus status; /* error code */ +} lua_longjmp; + + /* ** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By ** default, Lua handles errors with exceptions when compiling as -** C++ code, with _longjmp/_setjmp when asked to use them, and with +** C++ code, with _longjmp/_setjmp when available (POSIX), and with ** longjmp/setjmp otherwise. */ #if !defined(LUAI_THROW) /* { */ @@ -56,73 +77,64 @@ /* C++ exceptions */ #define LUAI_THROW(L,c) throw(c) -#define LUAI_TRY(L,c,a) \ - try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; } -#define luai_jmpbuf int /* dummy variable */ + +static void LUAI_TRY (lua_State *L, lua_longjmp *c, Pfunc f, void *ud) { + try { + f(L, ud); /* call function protected */ + } + catch (lua_longjmp *c1) { /* Lua error */ + if (c1 != c) /* not the correct level? */ + throw; /* rethrow to upper level */ + } + catch (...) { /* non-Lua exception */ + c->status = -1; /* create some error code */ + } +} + #elif defined(LUA_USE_POSIX) /* }{ */ -/* in POSIX, try _longjmp/_setjmp (more efficient) */ +/* in POSIX, use _longjmp/_setjmp (more efficient) */ #define LUAI_THROW(L,c) _longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf +#define LUAI_TRY(L,c,f,ud) if (_setjmp((c)->b) == 0) ((f)(L, ud)) #else /* }{ */ /* ISO C handling with long jumps */ #define LUAI_THROW(L,c) longjmp((c)->b, 1) -#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } -#define luai_jmpbuf jmp_buf +#define LUAI_TRY(L,c,f,ud) if (setjmp((c)->b) == 0) ((f)(L, ud)) #endif /* } */ #endif /* } */ - -/* chain list of long jump buffers */ -struct lua_longjmp { - struct lua_longjmp *previous; - luai_jmpbuf b; - volatile int status; /* error code */ -}; - - -void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { - switch (errcode) { - case LUA_ERRMEM: { /* memory error? */ - setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ - break; - } - case LUA_ERRERR: { - setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); - break; - } - case LUA_OK: { /* special case only for closing upvalues */ - setnilvalue(s2v(oldtop)); /* no error message */ - break; - } - default: { - lua_assert(errorstatus(errcode)); /* real error */ - setobjs2s(L, oldtop, L->top.p - 1); /* error message on current top */ - break; - } +void luaD_seterrorobj (lua_State *L, TStatus errcode, StkId oldtop) { + if (errcode == LUA_ERRMEM) { /* memory error? */ + setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ + } + else { + lua_assert(errorstatus(errcode)); /* must be a real error */ + lua_assert(!ttisnil(s2v(L->top.p - 1))); /* with a non-nil object */ + setobjs2s(L, oldtop, L->top.p - 1); /* move it to 'oldtop' */ } - L->top.p = oldtop + 1; + L->top.p = oldtop + 1; /* top goes back to old top plus error object */ } -l_noret luaD_throw (lua_State *L, int errcode) { +l_noret luaD_throw (lua_State *L, TStatus errcode) { if (L->errorJmp) { /* thread has an error handler? */ L->errorJmp->status = errcode; /* set status */ LUAI_THROW(L, L->errorJmp); /* jump to it */ } else { /* thread has no error handler */ global_State *g = G(L); + lua_State *mainth = mainthread(g); errcode = luaE_resetthread(L, errcode); /* close all upvalues */ - if (g->mainthread->errorJmp) { /* main thread has a handler? */ - setobjs2s(L, g->mainthread->top.p++, L->top.p - 1); /* copy error obj. */ - luaD_throw(g->mainthread, errcode); /* re-throw in main thread */ + L->status = errcode; + if (mainth->errorJmp) { /* main thread has a handler? */ + setobjs2s(L, mainth->top.p++, L->top.p - 1); /* copy error obj. */ + luaD_throw(mainth, errcode); /* re-throw in main thread */ } else { /* no handler at all; abort */ if (g->panic) { /* panic function? */ @@ -135,15 +147,23 @@ l_noret luaD_throw (lua_State *L, int errcode) { } -int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { +l_noret luaD_throwbaselevel (lua_State *L, TStatus errcode) { + if (L->errorJmp) { + /* unroll error entries up to the first level */ + while (L->errorJmp->previous != NULL) + L->errorJmp = L->errorJmp->previous; + } + luaD_throw(L, errcode); +} + + +TStatus luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { l_uint32 oldnCcalls = L->nCcalls; - struct lua_longjmp lj; + lua_longjmp lj; lj.status = LUA_OK; lj.previous = L->errorJmp; /* chain new error handler */ L->errorJmp = &lj; - LUAI_TRY(L, &lj, - (*f)(L, ud); - ); + LUAI_TRY(L, &lj, f, ud); /* call 'f' catching errors */ L->errorJmp = lj.previous; /* restore old error handler */ L->nCcalls = oldnCcalls; return lj.status; @@ -158,7 +178,74 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { ** =================================================================== */ +/* some stack space for error handling */ +#define STACKERRSPACE 200 + + +/* +** LUAI_MAXSTACK limits the size of the Lua stack. +** It must fit into INT_MAX/2. +*/ + +#if !defined(LUAI_MAXSTACK) +#if 1000000 < (INT_MAX / 2) +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK (INT_MAX / 2u) +#endif +#endif + + +/* maximum stack size that respects size_t */ +#define MAXSTACK_BYSIZET ((MAX_SIZET / sizeof(StackValue)) - STACKERRSPACE) + +/* +** Minimum between LUAI_MAXSTACK and MAXSTACK_BYSIZET +** (Maximum size for the stack must respect size_t.) +*/ +#define MAXSTACK cast_int(LUAI_MAXSTACK < MAXSTACK_BYSIZET \ + ? LUAI_MAXSTACK : MAXSTACK_BYSIZET) + + +/* stack size with extra space for error handling */ +#define ERRORSTACKSIZE (MAXSTACK + STACKERRSPACE) + + +/* raise a stack error while running the message handler */ +l_noret luaD_errerr (lua_State *L) { + TString *msg = luaS_newliteral(L, "error in error handling"); + setsvalue2s(L, L->top.p, msg); + L->top.p++; /* assume EXTRA_STACK */ + luaD_throw(L, LUA_ERRERR); +} + +/* +** Check whether stack has enough space to run a simple function (such +** as a finalizer): At least BASIC_STACK_SIZE in the Lua stack and +** 2 slots in the C stack. +*/ +int luaD_checkminstack (lua_State *L) { + return ((stacksize(L) < MAXSTACK - BASIC_STACK_SIZE) && + (getCcalls(L) < LUAI_MAXCCALLS - 2)); +} + + +/* +** In ISO C, any pointer use after the pointer has been deallocated is +** undefined behavior. So, before a stack reallocation, all pointers +** should be changed to offsets, and after the reallocation they should +** be changed back to pointers. As during the reallocation the pointers +** are invalid, the reallocation cannot run emergency collections. +** Alternatively, we can use the old address after the deallocation. +** That is not strict ISO C, but seems to work fine everywhere. +** The following macro chooses how strict is the code. +*/ +#if !defined(LUAI_STRICT_ADDRESS) +#define LUAI_STRICT_ADDRESS 1 +#endif + +#if LUAI_STRICT_ADDRESS /* ** Change all pointers to the stack into offsets. */ @@ -179,9 +266,10 @@ static void relstack (lua_State *L) { /* ** Change back all offsets into pointers. */ -static void correctstack (lua_State *L) { +static void correctstack (lua_State *L, StkId oldstack) { CallInfo *ci; UpVal *up; + UNUSED(oldstack); L->top.p = restorestack(L, L->top.offset); L->tbclist.p = restorestack(L, L->tbclist.offset); for (up = L->openupval; up != NULL; up = up->u.open.next) @@ -194,18 +282,40 @@ static void correctstack (lua_State *L) { } } +#else +/* +** Assume that it is fine to use an address after its deallocation, +** as long as we do not dereference it. +*/ + +static void relstack (lua_State *L) { UNUSED(L); } /* do nothing */ + + +/* +** Correct pointers into 'oldstack' to point into 'L->stack'. +*/ +static void correctstack (lua_State *L, StkId oldstack) { + CallInfo *ci; + UpVal *up; + StkId newstack = L->stack.p; + if (oldstack == newstack) + return; + L->top.p = L->top.p - oldstack + newstack; + L->tbclist.p = L->tbclist.p - oldstack + newstack; + for (up = L->openupval; up != NULL; up = up->u.open.next) + up->v.p = s2v(uplevel(up) - oldstack + newstack); + for (ci = L->ci; ci != NULL; ci = ci->previous) { + ci->top.p = ci->top.p - oldstack + newstack; + ci->func.p = ci->func.p - oldstack + newstack; + if (isLua(ci)) + ci->u.l.trap = 1; /* signal to update 'trap' in 'luaV_execute' */ + } +} +#endif -/* some space for error handling */ -#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200) /* ** Reallocate the stack to a new size, correcting all pointers into it. -** In ISO C, any pointer use after the pointer has been deallocated is -** undefined behavior. So, before the reallocation, all pointers are -** changed to offsets, and after the reallocation they are changed back -** to pointers. As during the reallocation the pointers are invalid, the -** reallocation cannot run emergency collections. -** ** In case of allocation error, raise an error or return false according ** to 'raiseerror'. */ @@ -213,21 +323,22 @@ int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) { int oldsize = stacksize(L); int i; StkId newstack; - int oldgcstop = G(L)->gcstopem; - lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE); + StkId oldstack = L->stack.p; + lu_byte oldgcstop = G(L)->gcstopem; + lua_assert(newsize <= MAXSTACK || newsize == ERRORSTACKSIZE); relstack(L); /* change pointers to offsets */ G(L)->gcstopem = 1; /* stop emergency collection */ - newstack = luaM_reallocvector(L, L->stack.p, oldsize + EXTRA_STACK, + newstack = luaM_reallocvector(L, oldstack, oldsize + EXTRA_STACK, newsize + EXTRA_STACK, StackValue); G(L)->gcstopem = oldgcstop; /* restore emergency collection */ if (l_unlikely(newstack == NULL)) { /* reallocation failed? */ - correctstack(L); /* change offsets back to pointers */ + correctstack(L, oldstack); /* change offsets back to pointers */ if (raiseerror) luaM_error(L); else return 0; /* do not raise an error */ } L->stack.p = newstack; - correctstack(L); /* change offsets back to pointers */ + correctstack(L, oldstack); /* change offsets back to pointers */ L->stack_last.p = L->stack.p + newsize; for (i = oldsize + EXTRA_STACK; i < newsize + EXTRA_STACK; i++) setnilvalue(s2v(newstack + i)); /* erase new segment */ @@ -241,23 +352,23 @@ int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) { */ int luaD_growstack (lua_State *L, int n, int raiseerror) { int size = stacksize(L); - if (l_unlikely(size > LUAI_MAXSTACK)) { + if (l_unlikely(size > MAXSTACK)) { /* if stack is larger than maximum, thread is already using the extra space reserved for errors, that is, thread is handling a stack error; cannot grow further than that. */ lua_assert(stacksize(L) == ERRORSTACKSIZE); if (raiseerror) - luaD_throw(L, LUA_ERRERR); /* error inside message handler */ + luaD_errerr(L); /* stack error inside message handler */ return 0; /* if not 'raiseerror', just signal it */ } - else if (n < LUAI_MAXSTACK) { /* avoids arithmetic overflows */ - int newsize = 2 * size; /* tentative new size */ + else if (n < MAXSTACK) { /* avoids arithmetic overflows */ + int newsize = size + (size >> 1); /* tentative new size (size * 1.5) */ int needed = cast_int(L->top.p - L->stack.p) + n; - if (newsize > LUAI_MAXSTACK) /* cannot cross the limit */ - newsize = LUAI_MAXSTACK; + if (newsize > MAXSTACK) /* cannot cross the limit */ + newsize = MAXSTACK; if (newsize < needed) /* but must respect what was asked for */ newsize = needed; - if (l_likely(newsize <= LUAI_MAXSTACK)) + if (l_likely(newsize <= MAXSTACK)) return luaD_reallocstack(L, newsize, raiseerror); } /* else stack overflow */ @@ -293,28 +404,28 @@ static int stackinuse (lua_State *L) { ** to twice the current use. (So, the final stack size is at most 2/3 the ** previous size, and half of its entries are empty.) ** As a particular case, if stack was handling a stack overflow and now -** it is not, 'max' (limited by LUAI_MAXSTACK) will be smaller than +** it is not, 'max' (limited by MAXSTACK) will be smaller than ** stacksize (equal to ERRORSTACKSIZE in this case), and so the stack ** will be reduced to a "regular" size. */ void luaD_shrinkstack (lua_State *L) { int inuse = stackinuse(L); - int max = (inuse > LUAI_MAXSTACK / 3) ? LUAI_MAXSTACK : inuse * 3; + int max = (inuse > MAXSTACK / 3) ? MAXSTACK : inuse * 3; /* if thread is currently not handling a stack overflow and its size is larger than maximum "reasonable" size, shrink it */ - if (inuse <= LUAI_MAXSTACK && stacksize(L) > max) { - int nsize = (inuse > LUAI_MAXSTACK / 2) ? LUAI_MAXSTACK : inuse * 2; + if (inuse <= MAXSTACK && stacksize(L) > max) { + int nsize = (inuse > MAXSTACK / 2) ? MAXSTACK : inuse * 2; luaD_reallocstack(L, nsize, 0); /* ok if that fails */ } else /* don't change stack */ - condmovestack(L,{},{}); /* (change only for debugging) */ + condmovestack(L,(void)0,(void)0); /* (change only for debugging) */ luaE_shrinkCI(L); /* shrink CI list */ } void luaD_inctop (lua_State *L) { - luaD_checkstack(L, 1); L->top.p++; + luaD_checkstack(L, 1); } /* }================================================================== */ @@ -329,7 +440,6 @@ void luaD_hook (lua_State *L, int event, int line, int ftransfer, int ntransfer) { lua_Hook hook = L->hook; if (hook && L->allowhook) { /* make sure there is a hook */ - int mask = CIST_HOOKED; CallInfo *ci = L->ci; ptrdiff_t top = savestack(L, L->top.p); /* preserve original 'top' */ ptrdiff_t ci_top = savestack(L, ci->top.p); /* idem for 'ci->top' */ @@ -337,18 +447,15 @@ void luaD_hook (lua_State *L, int event, int line, ar.event = event; ar.currentline = line; ar.i_ci = ci; - if (ntransfer != 0) { - mask |= CIST_TRAN; /* 'ci' has transfer information */ - ci->u2.transferinfo.ftransfer = ftransfer; - ci->u2.transferinfo.ntransfer = ntransfer; - } + L->transferinfo.ftransfer = ftransfer; + L->transferinfo.ntransfer = ntransfer; if (isLua(ci) && L->top.p < ci->top.p) L->top.p = ci->top.p; /* protect entire activation register */ luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ if (ci->top.p < L->top.p + LUA_MINSTACK) ci->top.p = L->top.p + LUA_MINSTACK; L->allowhook = 0; /* cannot call hooks inside a hook */ - ci->callstatus |= mask; + ci->callstatus |= CIST_HOOKED; lua_unlock(L); (*hook)(L, &ar); lua_lock(L); @@ -356,7 +463,7 @@ void luaD_hook (lua_State *L, int event, int line, L->allowhook = 1; ci->top.p = restorestack(L, ci_top); L->top.p = restorestack(L, top); - ci->callstatus &= ~mask; + ci->callstatus &= ~CIST_HOOKED; } } @@ -391,11 +498,11 @@ static void rethook (lua_State *L, CallInfo *ci, int nres) { int ftransfer; if (isLua(ci)) { Proto *p = ci_func(ci)->p; - if (p->is_vararg) + if (p->flag & PF_VAHID) delta = ci->u.l.nextraargs + p->numparams + 1; } ci->func.p += delta; /* if vararg, back to virtual 'func' */ - ftransfer = cast(unsigned short, firstres - ci->func.p); + ftransfer = cast_int(firstres - ci->func.p); luaD_hook(L, LUA_HOOKRET, -1, ftransfer, nres); /* call it */ ci->func.p -= delta; } @@ -406,51 +513,72 @@ static void rethook (lua_State *L, CallInfo *ci, int nres) { /* ** Check whether 'func' has a '__call' metafield. If so, put it in the -** stack, below original 'func', so that 'luaD_precall' can call it. Raise -** an error if there is no '__call' metafield. +** stack, below original 'func', so that 'luaD_precall' can call it. +** Raise an error if there is no '__call' metafield. +** Bits CIST_CCMT in status count how many _call metamethods were +** invoked and how many corresponding extra arguments were pushed. +** (This count will be saved in the 'callstatus' of the call). +** Raise an error if this counter overflows. */ -static StkId tryfuncTM (lua_State *L, StkId func) { +static unsigned tryfuncTM (lua_State *L, StkId func, unsigned status) { const TValue *tm; StkId p; - checkstackGCp(L, 1, func); /* space for metamethod */ - tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); /* (after previous GC) */ - if (l_unlikely(ttisnil(tm))) - luaG_callerror(L, s2v(func)); /* nothing to call */ + tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); + if (l_unlikely(ttisnil(tm))) /* no metamethod? */ + luaG_callerror(L, s2v(func)); for (p = L->top.p; p > func; p--) /* open space for metamethod */ setobjs2s(L, p, p-1); L->top.p++; /* stack space pre-allocated by the caller */ setobj2s(L, func, tm); /* metamethod is the new function to be called */ - return func; + if ((status & MAX_CCMT) == MAX_CCMT) /* is counter full? */ + luaG_runerror(L, "'__call' chain too long"); + return status + (1u << CIST_CCMT); /* increment counter */ +} + + +/* Generic case for 'moveresult' */ +l_sinline void genmoveresults (lua_State *L, StkId res, int nres, + int wanted) { + StkId firstresult = L->top.p - nres; /* index of first result */ + int i; + if (nres > wanted) /* extra results? */ + nres = wanted; /* don't need them */ + for (i = 0; i < nres; i++) /* move all results to correct place */ + setobjs2s(L, res + i, firstresult + i); + for (; i < wanted; i++) /* complete wanted number of results */ + setnilvalue(s2v(res + i)); + L->top.p = res + wanted; /* top points after the last result */ } /* -** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'. -** Handle most typical cases (zero results for commands, one result for -** expressions, multiple results for tail calls/single parameters) -** separated. +** Given 'nres' results at 'firstResult', move 'fwanted-1' of them +** to 'res'. Handle most typical cases (zero results for commands, +** one result for expressions, multiple results for tail calls/single +** parameters) separated. The flag CIST_TBC in 'fwanted', if set, +** forces the switch to go to the default case. */ -l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) { - StkId firstresult; - int i; - switch (wanted) { /* handle typical cases separately */ - case 0: /* no values needed */ +l_sinline void moveresults (lua_State *L, StkId res, int nres, + l_uint32 fwanted) { + switch (fwanted) { /* handle typical cases separately */ + case 0 + 1: /* no values needed */ L->top.p = res; return; - case 1: /* one value needed */ + case 1 + 1: /* one value needed */ if (nres == 0) /* no results? */ setnilvalue(s2v(res)); /* adjust with nil */ else /* at least one result */ setobjs2s(L, res, L->top.p - nres); /* move it to proper place */ L->top.p = res + 1; return; - case LUA_MULTRET: - wanted = nres; /* we want all results */ + case LUA_MULTRET + 1: + genmoveresults(L, res, nres, nres); /* we want all results */ break; - default: /* two/more results and/or to-be-closed variables */ - if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ - L->ci->callstatus |= CIST_CLSRET; /* in case of yields */ + default: { /* two/more results and/or to-be-closed variables */ + int wanted = get_nresults(fwanted); + if (fwanted & CIST_TBC) { /* to-be-closed variables? */ L->ci->u2.nres = nres; + L->ci->callstatus |= CIST_CLSRET; /* in case of yields */ res = luaF_close(L, res, CLOSEKTOP, 1); L->ci->callstatus &= ~CIST_CLSRET; if (L->hookmask) { /* if needed, call hook after '__close's */ @@ -458,21 +586,13 @@ l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) { rethook(L, L->ci, nres); res = restorestack(L, savedres); /* hook can move stack */ } - wanted = decodeNresults(wanted); if (wanted == LUA_MULTRET) wanted = nres; /* we want all results */ } + genmoveresults(L, res, nres, wanted); break; + } } - /* generic case */ - firstresult = L->top.p - nres; /* index of first result */ - if (nres > wanted) /* extra results? */ - nres = wanted; /* don't need them */ - for (i = 0; i < nres; i++) /* move all results to correct place */ - setobjs2s(L, res + i, firstresult + i); - for (; i < wanted; i++) /* complete wanted number of results */ - setnilvalue(s2v(res + i)); - L->top.p = res + wanted; /* top points after the last result */ } @@ -483,14 +603,14 @@ l_sinline void moveresults (lua_State *L, StkId res, int nres, int wanted) { ** that. */ void luaD_poscall (lua_State *L, CallInfo *ci, int nres) { - int wanted = ci->nresults; - if (l_unlikely(L->hookmask && !hastocloseCfunc(wanted))) + l_uint32 fwanted = ci->callstatus & (CIST_TBC | CIST_NRESULTS); + if (l_unlikely(L->hookmask) && !(fwanted & CIST_TBC)) rethook(L, ci, nres); /* move results to proper place */ - moveresults(L, ci->func.p, nres, wanted); + moveresults(L, ci->func.p, nres, fwanted); /* function cannot be in any of these cases when returning */ lua_assert(!(ci->callstatus & - (CIST_HOOKED | CIST_YPCALL | CIST_FIN | CIST_TRAN | CIST_CLSRET))); + (CIST_HOOKED | CIST_YPCALL | CIST_FIN | CIST_CLSRET))); L->ci = ci->previous; /* back to caller (after closing variables) */ } @@ -499,12 +619,18 @@ void luaD_poscall (lua_State *L, CallInfo *ci, int nres) { #define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L)) -l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret, - int mask, StkId top) { +/* +** Allocate and initialize CallInfo structure. At this point, the +** only valid fields in the call status are number of results, +** CIST_C (if it's a C function), and number of extra arguments. +** (All these bit-fields fit in 16-bit values.) +*/ +l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, unsigned status, + StkId top) { CallInfo *ci = L->ci = next_ci(L); /* new frame */ ci->func.p = func; - ci->nresults = nret; - ci->callstatus = mask; + lua_assert((status & ~(CIST_NRESULTS | CIST_C | MAX_CCMT)) == 0); + ci->callstatus = status; ci->top.p = top; return ci; } @@ -513,12 +639,12 @@ l_sinline CallInfo *prepCallInfo (lua_State *L, StkId func, int nret, /* ** precall for C functions */ -l_sinline int precallC (lua_State *L, StkId func, int nresults, +l_sinline int precallC (lua_State *L, StkId func, unsigned status, lua_CFunction f) { int n; /* number of returns */ CallInfo *ci; - checkstackGCp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ - L->ci = ci = prepCallInfo(L, func, nresults, CIST_C, + checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ + L->ci = ci = prepCallInfo(L, func, status | CIST_C, L->top.p + LUA_MINSTACK); lua_assert(ci->top.p <= L->stack_last.p); if (l_unlikely(L->hookmask & LUA_MASKCALL)) { @@ -542,18 +668,19 @@ l_sinline int precallC (lua_State *L, StkId func, int nresults, */ int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1, int delta) { + unsigned status = LUA_MULTRET + 1; retry: switch (ttypetag(s2v(func))) { case LUA_VCCL: /* C closure */ - return precallC(L, func, LUA_MULTRET, clCvalue(s2v(func))->f); + return precallC(L, func, status, clCvalue(s2v(func))->f); case LUA_VLCF: /* light C function */ - return precallC(L, func, LUA_MULTRET, fvalue(s2v(func))); + return precallC(L, func, status, fvalue(s2v(func))); case LUA_VLCL: { /* Lua function */ Proto *p = clLvalue(s2v(func))->p; int fsize = p->maxstacksize; /* frame size */ int nfixparams = p->numparams; int i; - checkstackGCp(L, fsize - delta, func); + checkstackp(L, fsize - delta, func); ci->func.p -= delta; /* restore 'func' (if vararg) */ for (i = 0; i < narg1; i++) /* move down function and arguments */ setobjs2s(L, ci->func.p + i, func + i); @@ -568,8 +695,8 @@ int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, return -1; } default: { /* not a function */ - func = tryfuncTM(L, func); /* try to get '__call' metamethod */ - /* return luaD_pretailcall(L, ci, func, narg1 + 1, delta); */ + checkstackp(L, 1, func); /* space for metamethod */ + status = tryfuncTM(L, func, status); /* try '__call' metamethod */ narg1++; goto retry; /* try again */ } @@ -586,13 +713,15 @@ int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, ** original function position. */ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { + unsigned status = cast_uint(nresults + 1); + lua_assert(status <= MAXRESULTS + 1); retry: switch (ttypetag(s2v(func))) { case LUA_VCCL: /* C closure */ - precallC(L, func, nresults, clCvalue(s2v(func))->f); + precallC(L, func, status, clCvalue(s2v(func))->f); return NULL; case LUA_VLCF: /* light C function */ - precallC(L, func, nresults, fvalue(s2v(func))); + precallC(L, func, status, fvalue(s2v(func))); return NULL; case LUA_VLCL: { /* Lua function */ CallInfo *ci; @@ -600,8 +729,8 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { int narg = cast_int(L->top.p - func) - 1; /* number of real arguments */ int nfixparams = p->numparams; int fsize = p->maxstacksize; /* frame size */ - checkstackGCp(L, fsize, func); - L->ci = ci = prepCallInfo(L, func, nresults, 0, func + 1 + fsize); + checkstackp(L, fsize, func); + L->ci = ci = prepCallInfo(L, func, status, func + 1 + fsize); ci->u.l.savedpc = p->code; /* starting point */ for (; narg < nfixparams; narg++) setnilvalue(s2v(L->top.p++)); /* complete missing arguments */ @@ -609,8 +738,8 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) { return ci; } default: { /* not a function */ - func = tryfuncTM(L, func); /* try to get '__call' metamethod */ - /* return luaD_precall(L, func, nresults); */ + checkstackp(L, 1, func); /* space for metamethod */ + status = tryfuncTM(L, func, status); /* try '__call' metamethod */ goto retry; /* try again with metamethod */ } } @@ -633,7 +762,7 @@ l_sinline void ccall (lua_State *L, StkId func, int nResults, l_uint32 inc) { luaE_checkcstack(L); } if ((ci = luaD_precall(L, func, nResults)) != NULL) { /* Lua function? */ - ci->callstatus = CIST_FRESH; /* mark that it is a "fresh" execute */ + ci->callstatus |= CIST_FRESH; /* mark that it is a "fresh" execute */ luaV_execute(L, ci); /* call it */ } L->nCcalls -= inc; @@ -672,13 +801,13 @@ void luaD_callnoyield (lua_State *L, StkId func, int nResults) { ** particular, field CIST_RECST preserves the error status across these ** multiple runs, changing only if there is a new error. */ -static int finishpcallk (lua_State *L, CallInfo *ci) { - int status = getcistrecst(ci); /* get original status */ +static TStatus finishpcallk (lua_State *L, CallInfo *ci) { + TStatus status = getcistrecst(ci); /* get original status */ if (l_likely(status == LUA_OK)) /* no error? */ status = LUA_YIELD; /* was interrupted by an yield */ else { /* error */ StkId func = restorestack(L, ci->u2.funcidx); - L->allowhook = getoah(ci->callstatus); /* restore 'allowhook' */ + L->allowhook = getoah(ci); /* restore 'allowhook' */ func = luaF_close(L, func, status, 1); /* can yield or raise an error */ luaD_seterrorobj(L, status, func); luaD_shrinkstack(L); /* restore stack size in case of overflow */ @@ -707,20 +836,21 @@ static int finishpcallk (lua_State *L, CallInfo *ci) { */ static void finishCcall (lua_State *L, CallInfo *ci) { int n; /* actual number of results from C function */ - if (ci->callstatus & CIST_CLSRET) { /* was returning? */ - lua_assert(hastocloseCfunc(ci->nresults)); + if (ci->callstatus & CIST_CLSRET) { /* was closing TBC variable? */ + lua_assert(ci->callstatus & CIST_TBC); n = ci->u2.nres; /* just redo 'luaD_poscall' */ /* don't need to reset CIST_CLSRET, as it will be set again anyway */ } else { - int status = LUA_YIELD; /* default if there were no errors */ + TStatus status = LUA_YIELD; /* default if there were no errors */ + lua_KFunction kf = ci->u.c.k; /* continuation function */ /* must have a continuation and must be able to call it */ - lua_assert(ci->u.c.k != NULL && yieldable(L)); + lua_assert(kf != NULL && yieldable(L)); if (ci->callstatus & CIST_YPCALL) /* was inside a 'lua_pcallk'? */ status = finishpcallk(L, ci); /* finish it */ adjustresults(L, LUA_MULTRET); /* finish 'lua_callk' */ lua_unlock(L); - n = (*ci->u.c.k)(L, status, ci->u.c.ctx); /* call continuation */ + n = (*kf)(L, APIstatus(status), ci->u.c.ctx); /* call continuation */ lua_lock(L); api_checknelems(L, n); } @@ -767,6 +897,7 @@ static CallInfo *findpcall (lua_State *L) { ** coroutine error handler and should not kill the coroutine.) */ static int resume_error (lua_State *L, const char *msg, int narg) { + api_checkpop(L, narg); L->top.p -= narg; /* remove args from the stack */ setsvalue2s(L, L->top.p, luaS_new(L, msg)); /* push error message */ api_incr_top(L); @@ -821,7 +952,7 @@ static void resume (lua_State *L, void *ud) { ** (status == LUA_YIELD), or an unprotected error ('findpcall' doesn't ** find a recover point). */ -static int precover (lua_State *L, int status) { +static TStatus precover (lua_State *L, TStatus status) { CallInfo *ci; while (errorstatus(status) && (ci = findpcall(L)) != NULL) { L->ci = ci; /* go down to recovery functions */ @@ -834,7 +965,7 @@ static int precover (lua_State *L, int status) { LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, int *nresults) { - int status; + TStatus status; lua_lock(L); if (L->status == LUA_OK) { /* may be starting a coroutine */ if (L->ci != &L->base_ci) /* not in base level? */ @@ -849,21 +980,21 @@ LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, return resume_error(L, "C stack overflow", nargs); L->nCcalls++; luai_userstateresume(L, nargs); - api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); + api_checkpop(L, (L->status == LUA_OK) ? nargs + 1 : nargs); status = luaD_rawrunprotected(L, resume, &nargs); /* continue running after recoverable errors */ status = precover(L, status); if (l_likely(!errorstatus(status))) lua_assert(status == L->status); /* normal end or yield */ else { /* unrecoverable error */ - L->status = cast_byte(status); /* mark thread as 'dead' */ + L->status = status; /* mark thread as 'dead' */ luaD_seterrorobj(L, status, L->top.p); /* push error message */ L->ci->top.p = L->top.p; } *nresults = (status == LUA_YIELD) ? L->ci->u2.nyield : cast_int(L->top.p - (L->ci->func.p + 1)); lua_unlock(L); - return status; + return APIstatus(status); } @@ -878,9 +1009,9 @@ LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, luai_userstateyield(L, nresults); lua_lock(L); ci = L->ci; - api_checknelems(L, nresults); + api_checkpop(L, nresults); if (l_unlikely(!yieldable(L))) { - if (L != G(L)->mainthread) + if (L != mainthread(G(L))) luaG_runerror(L, "attempt to yield across a C-call boundary"); else luaG_runerror(L, "attempt to yield from outside a coroutine"); @@ -908,7 +1039,7 @@ LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, */ struct CloseP { StkId level; - int status; + TStatus status; }; @@ -925,7 +1056,7 @@ static void closepaux (lua_State *L, void *ud) { ** Calls 'luaF_close' in protected mode. Return the original status ** or, in case of errors, the new status. */ -int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status) { +TStatus luaD_closeprotected (lua_State *L, ptrdiff_t level, TStatus status) { CallInfo *old_ci = L->ci; lu_byte old_allowhooks = L->allowhook; for (;;) { /* keep closing upvalues until no more errors */ @@ -947,9 +1078,9 @@ int luaD_closeprotected (lua_State *L, ptrdiff_t level, int status) { ** thread information ('allowhook', etc.) and in particular ** its stack level in case of errors. */ -int luaD_pcall (lua_State *L, Pfunc func, void *u, - ptrdiff_t old_top, ptrdiff_t ef) { - int status; +TStatus luaD_pcall (lua_State *L, Pfunc func, void *u, ptrdiff_t old_top, + ptrdiff_t ef) { + TStatus status; CallInfo *old_ci = L->ci; lu_byte old_allowhooks = L->allowhook; ptrdiff_t old_errfunc = L->errfunc; @@ -981,7 +1112,7 @@ struct SParser { /* data to 'f_parser' */ static void checkmode (lua_State *L, const char *mode, const char *x) { - if (mode && strchr(mode, x[0]) == NULL) { + if (strchr(mode, x[0]) == NULL) { luaO_pushfstring(L, "attempt to load a %s chunk (mode is '%s')", x, mode); luaD_throw(L, LUA_ERRSYNTAX); @@ -992,13 +1123,18 @@ static void checkmode (lua_State *L, const char *mode, const char *x) { static void f_parser (lua_State *L, void *ud) { LClosure *cl; struct SParser *p = cast(struct SParser *, ud); + const char *mode = p->mode ? p->mode : "bt"; int c = zgetc(p->z); /* read first character */ if (c == LUA_SIGNATURE[0]) { - checkmode(L, p->mode, "binary"); - cl = luaU_undump(L, p->z, p->name); + int fixed = 0; + if (strchr(mode, 'B') != NULL) + fixed = 1; + else + checkmode(L, mode, "binary"); + cl = luaU_undump(L, p->z, p->name, fixed); } else { - checkmode(L, p->mode, "text"); + checkmode(L, mode, "text"); cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c); } lua_assert(cl->nupvalues == cl->p->sizeupvalues); @@ -1006,10 +1142,10 @@ static void f_parser (lua_State *L, void *ud) { } -int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, - const char *mode) { +TStatus luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode) { struct SParser p; - int status; + TStatus status; incnny(L); /* cannot yield during parsing */ p.z = z; p.name = name; p.mode = mode; p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0; @@ -1018,9 +1154,9 @@ int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, luaZ_initbuffer(L, &p.buff); status = luaD_pcall(L, f_parser, &p, savestack(L, L->top.p), L->errfunc); luaZ_freebuffer(L, &p.buff); - luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size); - luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size); - luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size); + luaM_freearray(L, p.dyd.actvar.arr, cast_sizet(p.dyd.actvar.size)); + luaM_freearray(L, p.dyd.gt.arr, cast_sizet(p.dyd.gt.size)); + luaM_freearray(L, p.dyd.label.arr, cast_sizet(p.dyd.label.size)); decnny(L); return status; } diff --git a/src/ldump.c b/src/ldump.c new file mode 100644 index 0000000..5795788 --- /dev/null +++ b/src/ldump.c @@ -0,0 +1,307 @@ +/* +** $Id: ldump.c $ +** save precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define ldump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" +#include "ltable.h" +#include "lundump.h" + + +typedef struct { + lua_State *L; + lua_Writer writer; + void *data; + size_t offset; /* current position relative to beginning of dump */ + int strip; + int status; + Table *h; /* table to track saved strings */ + lua_Unsigned nstr; /* counter for counting saved strings */ +} DumpState; + + +/* +** All high-level dumps go through dumpVector; you can change it to +** change the endianness of the result +*/ +#define dumpVector(D,v,n) dumpBlock(D,v,(n)*sizeof((v)[0])) + +#define dumpLiteral(D, s) dumpBlock(D,s,sizeof(s) - sizeof(char)) + + +/* +** Dump the block of memory pointed by 'b' with given 'size'. +** 'b' should not be NULL, except for the last call signaling the end +** of the dump. +*/ +static void dumpBlock (DumpState *D, const void *b, size_t size) { + if (D->status == 0) { /* do not write anything after an error */ + lua_unlock(D->L); + D->status = (*D->writer)(D->L, b, size, D->data); + lua_lock(D->L); + D->offset += size; + } +} + + +/* +** Dump enough zeros to ensure that current position is a multiple of +** 'align'. +*/ +static void dumpAlign (DumpState *D, unsigned align) { + unsigned padding = align - cast_uint(D->offset % align); + if (padding < align) { /* padding == align means no padding */ + static lua_Integer paddingContent = 0; + lua_assert(align <= sizeof(lua_Integer)); + dumpBlock(D, &paddingContent, padding); + } + lua_assert(D->offset % align == 0); +} + + +#define dumpVar(D,x) dumpVector(D,&x,1) + + +static void dumpByte (DumpState *D, int y) { + lu_byte x = (lu_byte)y; + dumpVar(D, x); +} + + +/* +** size for 'dumpVarint' buffer: each byte can store up to 7 bits. +** (The "+6" rounds up the division.) +*/ +#define DIBS ((l_numbits(lua_Unsigned) + 6) / 7) + +/* +** Dumps an unsigned integer using the MSB Varint encoding +*/ +static void dumpVarint (DumpState *D, lua_Unsigned x) { + lu_byte buff[DIBS]; + unsigned n = 1; + buff[DIBS - 1] = x & 0x7f; /* fill least-significant byte */ + while ((x >>= 7) != 0) /* fill other bytes in reverse order */ + buff[DIBS - (++n)] = cast_byte((x & 0x7f) | 0x80); + dumpVector(D, buff + DIBS - n, n); +} + + +static void dumpSize (DumpState *D, size_t sz) { + dumpVarint(D, cast(lua_Unsigned, sz)); +} + + +static void dumpInt (DumpState *D, int x) { + lua_assert(x >= 0); + dumpVarint(D, cast_uint(x)); +} + + +static void dumpNumber (DumpState *D, lua_Number x) { + dumpVar(D, x); +} + + +/* +** Signed integers are coded to keep small values small. (Coding -1 as +** 0xfff...fff would use too many bytes to save a quite common value.) +** A non-negative x is coded as 2x; a negative x is coded as -2x - 1. +** (0 => 0; -1 => 1; 1 => 2; -2 => 3; 2 => 4; ...) +*/ +static void dumpInteger (DumpState *D, lua_Integer x) { + lua_Unsigned cx = (x >= 0) ? 2u * l_castS2U(x) + : (2u * ~l_castS2U(x)) + 1; + dumpVarint(D, cx); +} + + +/* +** Dump a String. First dump its "size": +** size==0 is followed by an index and means "reuse saved string with +** that index"; index==0 means NULL. +** size>=1 is followed by the string contents with real size==size-1 and +** means that string, which will be saved with the next available index. +** The real size does not include the ending '\0' (which is not dumped), +** so adding 1 to it cannot overflow a size_t. +*/ +static void dumpString (DumpState *D, TString *ts) { + if (ts == NULL) { + dumpVarint(D, 0); /* will "reuse" NULL */ + dumpVarint(D, 0); /* special index for NULL */ + } + else { + TValue idx; + int tag = luaH_getstr(D->h, ts, &idx); + if (!tagisempty(tag)) { /* string already saved? */ + dumpVarint(D, 0); /* reuse a saved string */ + dumpVarint(D, l_castS2U(ivalue(&idx))); /* index of saved string */ + } + else { /* must write and save the string */ + TValue key, value; /* to save the string in the hash */ + size_t size; + const char *s = getlstr(ts, size); + dumpSize(D, size + 1); + dumpVector(D, s, size + 1); /* include ending '\0' */ + D->nstr++; /* one more saved string */ + setsvalue(D->L, &key, ts); /* the string is the key */ + setivalue(&value, l_castU2S(D->nstr)); /* its index is the value */ + luaH_set(D->L, D->h, &key, &value); /* h[ts] = nstr */ + /* integer value does not need barrier */ + } + } +} + + +static void dumpCode (DumpState *D, const Proto *f) { + dumpInt(D, f->sizecode); + dumpAlign(D, sizeof(f->code[0])); + lua_assert(f->code != NULL); + dumpVector(D, f->code, cast_uint(f->sizecode)); +} + + +static void dumpFunction (DumpState *D, const Proto *f); + +static void dumpConstants (DumpState *D, const Proto *f) { + int i; + int n = f->sizek; + dumpInt(D, n); + for (i = 0; i < n; i++) { + const TValue *o = &f->k[i]; + int tt = ttypetag(o); + dumpByte(D, tt); + switch (tt) { + case LUA_VNUMFLT: + dumpNumber(D, fltvalue(o)); + break; + case LUA_VNUMINT: + dumpInteger(D, ivalue(o)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + dumpString(D, tsvalue(o)); + break; + default: + lua_assert(tt == LUA_VNIL || tt == LUA_VFALSE || tt == LUA_VTRUE); + } + } +} + + +static void dumpProtos (DumpState *D, const Proto *f) { + int i; + int n = f->sizep; + dumpInt(D, n); + for (i = 0; i < n; i++) + dumpFunction(D, f->p[i]); +} + + +static void dumpUpvalues (DumpState *D, const Proto *f) { + int i, n = f->sizeupvalues; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpByte(D, f->upvalues[i].instack); + dumpByte(D, f->upvalues[i].idx); + dumpByte(D, f->upvalues[i].kind); + } +} + + +static void dumpDebug (DumpState *D, const Proto *f) { + int i, n; + n = (D->strip) ? 0 : f->sizelineinfo; + dumpInt(D, n); + if (f->lineinfo != NULL) + dumpVector(D, f->lineinfo, cast_uint(n)); + n = (D->strip) ? 0 : f->sizeabslineinfo; + dumpInt(D, n); + if (n > 0) { + /* 'abslineinfo' is an array of structures of int's */ + dumpAlign(D, sizeof(int)); + dumpVector(D, f->abslineinfo, cast_uint(n)); + } + n = (D->strip) ? 0 : f->sizelocvars; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpString(D, f->locvars[i].varname); + dumpInt(D, f->locvars[i].startpc); + dumpInt(D, f->locvars[i].endpc); + } + n = (D->strip) ? 0 : f->sizeupvalues; + dumpInt(D, n); + for (i = 0; i < n; i++) + dumpString(D, f->upvalues[i].name); +} + + +static void dumpFunction (DumpState *D, const Proto *f) { + dumpInt(D, f->linedefined); + dumpInt(D, f->lastlinedefined); + dumpByte(D, f->numparams); + dumpByte(D, f->flag); + dumpByte(D, f->maxstacksize); + dumpCode(D, f); + dumpConstants(D, f); + dumpUpvalues(D, f); + dumpProtos(D, f); + dumpString(D, D->strip ? NULL : f->source); + dumpDebug(D, f); +} + + +#define dumpNumInfo(D, tvar, value) \ + { tvar i = value; dumpByte(D, sizeof(tvar)); dumpVar(D, i); } + + +static void dumpHeader (DumpState *D) { + dumpLiteral(D, LUA_SIGNATURE); + dumpByte(D, LUAC_VERSION); + dumpByte(D, LUAC_FORMAT); + dumpLiteral(D, LUAC_DATA); + dumpNumInfo(D, int, LUAC_INT); + dumpNumInfo(D, Instruction, LUAC_INST); + dumpNumInfo(D, lua_Integer, LUAC_INT); + dumpNumInfo(D, lua_Number, LUAC_NUM); +} + + +/* +** dump Lua function as precompiled chunk +*/ +int luaU_dump (lua_State *L, const Proto *f, lua_Writer w, void *data, + int strip) { + DumpState D; + D.h = luaH_new(L); /* aux. table to keep strings already dumped */ + sethvalue2s(L, L->top.p, D.h); /* anchor it */ + L->top.p++; + D.L = L; + D.writer = w; + D.offset = 0; + D.data = data; + D.strip = strip; + D.status = 0; + D.nstr = 0; + dumpHeader(&D); + dumpByte(&D, f->sizeupvalues); + dumpFunction(&D, f); + dumpBlock(&D, NULL, 0); /* signal end of dump */ + return D.status; +} + diff --git a/lua-5.4.7/src/lfunc.c b/src/lfunc.c similarity index 75% rename from lua-5.4.7/src/lfunc.c rename to src/lfunc.c index 0945f24..b6fd9ce 100644 --- a/lua-5.4.7/src/lfunc.c +++ b/src/lfunc.c @@ -100,21 +100,23 @@ UpVal *luaF_findupval (lua_State *L, StkId level) { /* -** Call closing method for object 'obj' with error message 'err'. The +** Call closing method for object 'obj' with error object 'err'. The ** boolean 'yy' controls whether the call is yieldable. ** (This function assumes EXTRA_STACK.) */ static void callclosemethod (lua_State *L, TValue *obj, TValue *err, int yy) { StkId top = L->top.p; + StkId func = top; const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE); - setobj2s(L, top, tm); /* will call metamethod... */ - setobj2s(L, top + 1, obj); /* with 'self' as the 1st argument */ - setobj2s(L, top + 2, err); /* and error msg. as 2nd argument */ - L->top.p = top + 3; /* add function and arguments */ + setobj2s(L, top++, tm); /* will call metamethod... */ + setobj2s(L, top++, obj); /* with 'self' as the 1st argument */ + if (err != NULL) /* if there was an error... */ + setobj2s(L, top++, err); /* then error object will be 2nd argument */ + L->top.p = top; /* add function and arguments */ if (yy) - luaD_call(L, top, 0); + luaD_call(L, func, 0); else - luaD_callnoyield(L, top, 0); + luaD_callnoyield(L, func, 0); } @@ -140,26 +142,28 @@ static void checkclosemth (lua_State *L, StkId level) { ** the 'level' of the upvalue being closed, as everything after that ** won't be used again. */ -static void prepcallclosemth (lua_State *L, StkId level, int status, int yy) { +static void prepcallclosemth (lua_State *L, StkId level, TStatus status, + int yy) { TValue *uv = s2v(level); /* value being closed */ TValue *errobj; - if (status == CLOSEKTOP) - errobj = &G(L)->nilvalue; /* error object is nil */ - else { /* 'luaD_seterrorobj' will set top to level + 2 */ - errobj = s2v(level + 1); /* error object goes after 'uv' */ - luaD_seterrorobj(L, status, level + 1); /* set error object */ + switch (status) { + case LUA_OK: + L->top.p = level + 1; /* call will be at this level */ + /* FALLTHROUGH */ + case CLOSEKTOP: /* don't need to change top */ + errobj = NULL; /* no error object */ + break; + default: /* 'luaD_seterrorobj' will set top to level + 2 */ + errobj = s2v(level + 1); /* error object goes after 'uv' */ + luaD_seterrorobj(L, status, level + 1); /* set error object */ + break; } callclosemethod(L, uv, errobj, yy); } -/* -** Maximum value for deltas in 'tbclist', dependent on the type -** of delta. (This macro assumes that an 'L' is in scope where it -** is used.) -*/ -#define MAXDELTA \ - ((256ul << ((sizeof(L->stack.p->tbclist.delta) - 1) * 8)) - 1) +/* Maximum value for deltas in 'tbclist' */ +#define MAXDELTA USHRT_MAX /* @@ -192,8 +196,7 @@ void luaF_unlinkupval (UpVal *uv) { */ void luaF_closeupval (lua_State *L, StkId level) { UpVal *uv; - StkId upl; /* stack index pointed by 'uv' */ - while ((uv = L->openupval) != NULL && (upl = uplevel(uv)) >= level) { + while ((uv = L->openupval) != NULL && uplevel(uv) >= level) { TValue *slot = &uv->u.value; /* new position for value */ lua_assert(uplevel(uv) < L->top.p); luaF_unlinkupval(uv); /* remove upvalue from 'openupval' list */ @@ -224,7 +227,7 @@ static void poptbclist (lua_State *L) { ** Close all upvalues and to-be-closed variables up to the given stack ** level. Return restored 'level'. */ -StkId luaF_close (lua_State *L, StkId level, int status, int yy) { +StkId luaF_close (lua_State *L, StkId level, TStatus status, int yy) { ptrdiff_t levelrel = savestack(L, level); luaF_closeupval(L, level); /* first, close the upvalues */ while (L->tbclist.p >= level) { /* traverse tbc's down to that level */ @@ -253,7 +256,7 @@ Proto *luaF_newproto (lua_State *L) { f->upvalues = NULL; f->sizeupvalues = 0; f->numparams = 0; - f->is_vararg = 0; + f->flag = 0; f->maxstacksize = 0; f->locvars = NULL; f->sizelocvars = 0; @@ -264,14 +267,31 @@ Proto *luaF_newproto (lua_State *L) { } +lu_mem luaF_protosize (Proto *p) { + lu_mem sz = cast(lu_mem, sizeof(Proto)) + + cast_uint(p->sizep) * sizeof(Proto*) + + cast_uint(p->sizek) * sizeof(TValue) + + cast_uint(p->sizelocvars) * sizeof(LocVar) + + cast_uint(p->sizeupvalues) * sizeof(Upvaldesc); + if (!(p->flag & PF_FIXED)) { + sz += cast_uint(p->sizecode) * sizeof(Instruction); + sz += cast_uint(p->sizelineinfo) * sizeof(lu_byte); + sz += cast_uint(p->sizeabslineinfo) * sizeof(AbsLineInfo); + } + return sz; +} + + void luaF_freeproto (lua_State *L, Proto *f) { - luaM_freearray(L, f->code, f->sizecode); - luaM_freearray(L, f->p, f->sizep); - luaM_freearray(L, f->k, f->sizek); - luaM_freearray(L, f->lineinfo, f->sizelineinfo); - luaM_freearray(L, f->abslineinfo, f->sizeabslineinfo); - luaM_freearray(L, f->locvars, f->sizelocvars); - luaM_freearray(L, f->upvalues, f->sizeupvalues); + if (!(f->flag & PF_FIXED)) { + luaM_freearray(L, f->code, cast_sizet(f->sizecode)); + luaM_freearray(L, f->lineinfo, cast_sizet(f->sizelineinfo)); + luaM_freearray(L, f->abslineinfo, cast_sizet(f->sizeabslineinfo)); + } + luaM_freearray(L, f->p, cast_sizet(f->sizep)); + luaM_freearray(L, f->k, cast_sizet(f->sizek)); + luaM_freearray(L, f->locvars, cast_sizet(f->sizelocvars)); + luaM_freearray(L, f->upvalues, cast_sizet(f->sizeupvalues)); luaM_free(L, f); } diff --git a/lua-5.4.7/src/lgc.c b/src/lgc.c similarity index 72% rename from lua-5.4.7/src/lgc.c rename to src/lgc.c index 5817f9e..c64d74b 100644 --- a/lua-5.4.7/src/lgc.c +++ b/src/lgc.c @@ -9,7 +9,6 @@ #include "lprefix.h" -#include #include @@ -32,32 +31,13 @@ ** (Large enough to dissipate fixed overheads but small enough ** to allow small steps for the collector.) */ -#define GCSWEEPMAX 100 - -/* -** Maximum number of finalizers to call in each single step. -*/ -#define GCFINMAX 10 - - -/* -** Cost of calling one finalizer. -*/ -#define GCFINALIZECOST 50 - - -/* -** The equivalent, in bytes, of one unit of "work" (visiting a slot, -** sweeping an object, etc.) -*/ -#define WORK2MEM sizeof(TValue) +#define GCSWEEPMAX 20 /* -** macro to adjust 'pause': 'pause' is actually used like -** 'pause / PAUSEADJ' (value chosen by tests) +** Cost (in work units) of running one finalizer. */ -#define PAUSEADJ 100 +#define CWUFIN 10 /* mask with all color bits */ @@ -91,7 +71,14 @@ #define gcvalueN(o) (iscollectable(o) ? gcvalue(o) : NULL) -#define markvalue(g,o) { checkliveness(g->mainthread,o); \ +/* +** Access to collectable objects in array part of tables +*/ +#define gcvalarr(t,i) \ + ((*getArrTag(t,i) & BIT_ISCOLLECTABLE) ? getArrVal(t,i)->gc : NULL) + + +#define markvalue(g,o) { checkliveness(mainthread(g),o); \ if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); } #define markkey(g, n) { if keyiswhite(n) reallymarkobject(g,gckey(n)); } @@ -104,8 +91,9 @@ */ #define markobjectN(g,t) { if (t) markobject(g,t); } + static void reallymarkobject (global_State *g, GCObject *o); -static lu_mem atomic (lua_State *L); +static void atomic (lua_State *L); static void entersweep (lua_State *L); @@ -122,6 +110,56 @@ static void entersweep (lua_State *L); #define gnodelast(h) gnode(h, cast_sizet(sizenode(h))) +static l_mem objsize (GCObject *o) { + lu_mem res; + switch (o->tt) { + case LUA_VTABLE: { + res = luaH_size(gco2t(o)); + break; + } + case LUA_VLCL: { + LClosure *cl = gco2lcl(o); + res = sizeLclosure(cl->nupvalues); + break; + } + case LUA_VCCL: { + CClosure *cl = gco2ccl(o); + res = sizeCclosure(cl->nupvalues); + break; + } + case LUA_VUSERDATA: { + Udata *u = gco2u(o); + res = sizeudata(u->nuvalue, u->len); + break; + } + case LUA_VPROTO: { + res = luaF_protosize(gco2p(o)); + break; + } + case LUA_VTHREAD: { + res = luaE_threadsize(gco2th(o)); + break; + } + case LUA_VSHRSTR: { + TString *ts = gco2ts(o); + res = sizestrshr(cast_uint(ts->shrlen)); + break; + } + case LUA_VLNGSTR: { + TString *ts = gco2ts(o); + res = luaS_sizelngstr(ts->u.lnglen, ts->shrlen); + break; + } + case LUA_VUPVAL: { + res = sizeof(UpVal); + break; + } + default: res = 0; lua_assert(0); + } + return cast(l_mem, res); +} + + static GCObject **getgclist (GCObject *o) { switch (o->tt) { case LUA_VTABLE: return &gco2t(o)->gclist; @@ -203,7 +241,7 @@ static int iscleared (global_State *g, const GCObject *o) { ** incremental sweep phase, it clears the black object to white (sweep ** it) to avoid other barrier calls for this same object. (That cannot ** be done is generational mode, as its sweep does not distinguish -** whites from deads.) +** white from dead.) */ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { global_State *g = G(L); @@ -217,7 +255,7 @@ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { } else { /* sweep phase */ lua_assert(issweepphase(g)); - if (g->gckind == KGC_INC) /* incremental mode? */ + if (g->gckind != KGC_GENMINOR) /* incremental mode? */ makewhite(g, o); /* mark 'o' as white to avoid other barriers */ } } @@ -230,7 +268,8 @@ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { void luaC_barrierback_ (lua_State *L, GCObject *o) { global_State *g = G(L); lua_assert(isblack(o) && !isdead(g, o)); - lua_assert((g->gckind == KGC_GEN) == (isold(o) && getage(o) != G_TOUCHED1)); + lua_assert((g->gckind != KGC_GENMINOR) + || (isold(o) && getage(o) != G_TOUCHED1)); if (getage(o) == G_TOUCHED2) /* already in gray list? */ set2gray(o); /* make it gray to become touched1 */ else /* link it in 'grayagain' and paint it gray */ @@ -255,7 +294,7 @@ void luaC_fix (lua_State *L, GCObject *o) { ** create a new collectable object (with given type, size, and offset) ** and link it to 'allgc' list. */ -GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) { +GCObject *luaC_newobjdt (lua_State *L, lu_byte tt, size_t sz, size_t offset) { global_State *g = G(L); char *p = cast_charp(luaM_newobject(L, novariant(tt), sz)); GCObject *o = cast(GCObject *, p + offset); @@ -267,7 +306,10 @@ GCObject *luaC_newobjdt (lua_State *L, int tt, size_t sz, size_t offset) { } -GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { +/* +** create a new collectable object with no offset. +*/ +GCObject *luaC_newobj (lua_State *L, lu_byte tt, size_t sz) { return luaC_newobjdt(L, tt, sz, 0); } @@ -295,6 +337,7 @@ GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { ** (only closures can), and a userdata's metatable must be a table. */ static void reallymarkobject (global_State *g, GCObject *o) { + g->GCmarked += objsize(o); switch (o->tt) { case LUA_VSHRSTR: case LUA_VLNGSTR: { @@ -334,7 +377,7 @@ static void reallymarkobject (global_State *g, GCObject *o) { */ static void markmt (global_State *g) { int i; - for (i=0; i < LUA_NUMTAGS; i++) + for (i=0; i < LUA_NUMTYPES; i++) markobjectN(g, g->mt[i]); } @@ -342,14 +385,10 @@ static void markmt (global_State *g) { /* ** mark all objects in list of being-finalized */ -static lu_mem markbeingfnz (global_State *g) { +static void markbeingfnz (global_State *g) { GCObject *o; - lu_mem count = 0; - for (o = g->tobefnz; o != NULL; o = o->next) { - count++; + for (o = g->tobefnz; o != NULL; o = o->next) markobject(g, o); - } - return count; } @@ -364,12 +403,10 @@ static lu_mem markbeingfnz (global_State *g) { ** upvalues, as they have nothing to be checked. (If the thread gets an ** upvalue later, it will be linked in the list again.) */ -static int remarkupvals (global_State *g) { +static void remarkupvals (global_State *g) { lua_State *thread; lua_State **p = &g->twups; - int work = 0; /* estimate of how much work was done here */ while ((thread = *p) != NULL) { - work++; if (!iswhite(thread) && thread->openupval != NULL) p = &thread->twups; /* keep marked thread with upvalues in the list */ else { /* thread is not marked or without upvalues */ @@ -379,7 +416,6 @@ static int remarkupvals (global_State *g) { thread->twups = thread; /* mark that it is out of list */ for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) { lua_assert(getage(uv) <= getage(thread)); - work++; if (!iswhite(uv)) { /* upvalue already visited? */ lua_assert(upisopen(uv) && isgray(uv)); markvalue(g, uv->v.p); /* mark its value */ @@ -387,7 +423,6 @@ static int remarkupvals (global_State *g) { } } } - return work; } @@ -398,11 +433,14 @@ static void cleargraylists (global_State *g) { /* -** mark root set and reset all gray lists, to start a new collection +** mark root set and reset all gray lists, to start a new collection. +** 'GCmarked' is initialized to count the total number of live bytes +** during a cycle. */ static void restartcollection (global_State *g) { cleargraylists(g); - markobject(g, g->mainthread); + g->GCmarked = 0; + markobject(g, mainthread(g)); markvalue(g, &g->l_registry); markmt(g); markbeingfnz(g); /* mark any finalizing object left from previous cycle */ @@ -426,6 +464,8 @@ static void restartcollection (global_State *g) { ** TOUCHED1 objects need to be in the list. TOUCHED2 doesn't need to go ** back to a gray list, but then it must become OLD. (That is what ** 'correctgraylist' does when it finds a TOUCHED2 object.) +** This function is a no-op in incremental mode, as objects cannot be +** marked as touched in that mode. */ static void genlink (global_State *g, GCObject *o) { lua_assert(isblack(o)); @@ -433,7 +473,7 @@ static void genlink (global_State *g, GCObject *o) { linkobjgclist(o, g->grayagain); /* link it back in 'grayagain' */ } /* everything else do not need to be linked back */ else if (getage(o) == G_TOUCHED2) - changeage(o, G_TOUCHED2, G_OLD); /* advance age */ + setage(o, G_OLD); /* advance age */ } @@ -441,13 +481,14 @@ static void genlink (global_State *g, GCObject *o) { ** Traverse a table with weak values and link it to proper list. During ** propagate phase, keep it in 'grayagain' list, to be revisited in the ** atomic phase. In the atomic phase, if table has any white value, -** put it in 'weak' list, to be cleared. +** put it in 'weak' list, to be cleared; otherwise, call 'genlink' +** to check table age in generational mode. */ static void traverseweakvalue (global_State *g, Table *h) { Node *n, *limit = gnodelast(h); /* if there is array part, assume it may have white values (it is not worth traversing it now just to check) */ - int hasclears = (h->alimit > 0); + int hasclears = (h->asize > 0); for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ if (isempty(gval(n))) /* entry is empty? */ clearkey(n); /* clear its key */ @@ -458,10 +499,30 @@ static void traverseweakvalue (global_State *g, Table *h) { hasclears = 1; /* table will have to be cleared */ } } - if (g->gcstate == GCSatomic && hasclears) - linkgclist(h, g->weak); /* has to be cleared later */ - else + if (g->gcstate == GCSpropagate) linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ + else if (hasclears) + linkgclist(h, g->weak); /* has to be cleared later */ + else + genlink(g, obj2gco(h)); +} + + +/* +** Traverse the array part of a table. +*/ +static int traversearray (global_State *g, Table *h) { + unsigned asize = h->asize; + int marked = 0; /* true if some object is marked in this traversal */ + unsigned i; + for (i = 0; i < asize; i++) { + GCObject *o = gcvalarr(h, i); + if (o != NULL && iswhite(o)) { + marked = 1; + reallymarkobject(g, o); + } + } + return marked; } @@ -478,19 +539,11 @@ static void traverseweakvalue (global_State *g, Table *h) { ** by 'genlink'. */ static int traverseephemeron (global_State *g, Table *h, int inv) { - int marked = 0; /* true if an object is marked in this traversal */ int hasclears = 0; /* true if table has white keys */ int hasww = 0; /* true if table has entry "white-key -> white-value" */ unsigned int i; - unsigned int asize = luaH_realasize(h); unsigned int nsize = sizenode(h); - /* traverse array part */ - for (i = 0; i < asize; i++) { - if (valiswhite(&h->array[i])) { - marked = 1; - reallymarkobject(g, gcvalue(&h->array[i])); - } - } + int marked = traversearray(g, h); /* traverse array part */ /* traverse hash part; if 'inv', traverse descending (see 'convergeephemerons') */ for (i = 0; i < nsize; i++) { @@ -522,10 +575,7 @@ static int traverseephemeron (global_State *g, Table *h, int inv) { static void traversestrongtable (global_State *g, Table *h) { Node *n, *limit = gnodelast(h); - unsigned int i; - unsigned int asize = luaH_realasize(h); - for (i = 0; i < asize; i++) /* traverse array part */ - markvalue(g, &h->array[i]); + traversearray(g, h); for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ if (isempty(gval(n))) /* entry is empty? */ clearkey(n); /* clear its key */ @@ -539,30 +589,46 @@ static void traversestrongtable (global_State *g, Table *h) { } -static lu_mem traversetable (global_State *g, Table *h) { - const char *weakkey, *weakvalue; +/* +** (result & 1) iff weak values; (result & 2) iff weak keys. +*/ +static int getmode (global_State *g, Table *h) { const TValue *mode = gfasttm(g, h->metatable, TM_MODE); - TString *smode; + if (mode == NULL || !ttisstring(mode)) + return 0; /* ignore non-string modes */ + else { + const char *smode = getstr(tsvalue(mode)); + const char *weakkey = strchr(smode, 'k'); + const char *weakvalue = strchr(smode, 'v'); + return ((weakkey != NULL) << 1) | (weakvalue != NULL); + } +} + + +static l_mem traversetable (global_State *g, Table *h) { markobjectN(g, h->metatable); - if (mode && ttisshrstring(mode) && /* is there a weak mode? */ - (cast_void(smode = tsvalue(mode)), - cast_void(weakkey = strchr(getshrstr(smode), 'k')), - cast_void(weakvalue = strchr(getshrstr(smode), 'v')), - (weakkey || weakvalue))) { /* is really weak? */ - if (!weakkey) /* strong keys? */ + switch (getmode(g, h)) { + case 0: /* not weak */ + traversestrongtable(g, h); + break; + case 1: /* weak values */ traverseweakvalue(g, h); - else if (!weakvalue) /* strong values? */ + break; + case 2: /* weak keys */ traverseephemeron(g, h, 0); - else /* all weak */ - linkgclist(h, g->allweak); /* nothing to traverse now */ + break; + case 3: /* all weak; nothing to traverse */ + if (g->gcstate == GCSpropagate) + linkgclist(h, g->grayagain); /* must visit again its metatable */ + else + linkgclist(h, g->allweak); /* must clear collected entries */ + break; } - else /* not weak */ - traversestrongtable(g, h); - return 1 + h->alimit + 2 * allocsizenode(h); + return cast(l_mem, 1 + 2*sizenode(h) + h->asize); } -static int traverseudata (global_State *g, Udata *u) { +static l_mem traverseudata (global_State *g, Udata *u) { int i; markobjectN(g, u->metatable); /* mark its metatable */ for (i = 0; i < u->nuvalue; i++) @@ -577,7 +643,7 @@ static int traverseudata (global_State *g, Udata *u) { ** arrays can be larger than needed; the extra slots are filled with ** NULL, so the use of 'markobjectN') */ -static int traverseproto (global_State *g, Proto *f) { +static l_mem traverseproto (global_State *g, Proto *f) { int i; markobjectN(g, f->source); for (i = 0; i < f->sizek; i++) /* mark literals */ @@ -592,7 +658,7 @@ static int traverseproto (global_State *g, Proto *f) { } -static int traverseCclosure (global_State *g, CClosure *cl) { +static l_mem traverseCclosure (global_State *g, CClosure *cl) { int i; for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ markvalue(g, &cl->upvalue[i]); @@ -603,7 +669,7 @@ static int traverseCclosure (global_State *g, CClosure *cl) { ** Traverse a Lua closure, marking its prototype and its upvalues. ** (Both can be NULL while closure is being created.) */ -static int traverseLclosure (global_State *g, LClosure *cl) { +static l_mem traverseLclosure (global_State *g, LClosure *cl) { int i; markobjectN(g, cl->p); /* mark its prototype */ for (i = 0; i < cl->nupvalues; i++) { /* visit its upvalues */ @@ -626,13 +692,13 @@ static int traverseLclosure (global_State *g, LClosure *cl) { ** (which can only happen in generational mode) or if the traverse is in ** the propagate phase (which can only happen in incremental mode). */ -static int traversethread (global_State *g, lua_State *th) { +static l_mem traversethread (global_State *g, lua_State *th) { UpVal *uv; StkId o = th->stack.p; if (isold(th) || g->gcstate == GCSpropagate) linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ if (o == NULL) - return 1; /* stack not completely built yet */ + return 0; /* stack not completely built yet */ lua_assert(g->gcstate == GCSatomic || th->openupval == NULL || isintwups(th)); for (; o < th->top.p; o++) /* mark live elements in the stack */ @@ -650,14 +716,15 @@ static int traversethread (global_State *g, lua_State *th) { g->twups = th; } } - return 1 + stacksize(th); + return 1 + (th->top.p - th->stack.p); } /* -** traverse one gray object, turning it to black. +** traverse one gray object, turning it to black. Return an estimate +** of the number of slots traversed. */ -static lu_mem propagatemark (global_State *g) { +static l_mem propagatemark (global_State *g) { GCObject *o = g->gray; nw2black(o); g->gray = *getgclist(o); /* remove from 'gray' list */ @@ -673,11 +740,9 @@ static lu_mem propagatemark (global_State *g) { } -static lu_mem propagateall (global_State *g) { - lu_mem tot = 0; +static void propagateall (global_State *g) { while (g->gray) - tot += propagatemark(g); - return tot; + propagatemark(g); } @@ -686,7 +751,6 @@ static lu_mem propagateall (global_State *g) { ** Repeat until it converges, that is, nothing new is marked. 'dir' ** inverts the direction of the traversals, trying to speed up ** convergence on chains in the same table. -** */ static void convergeephemerons (global_State *g) { int changed; @@ -746,11 +810,11 @@ static void clearbyvalues (global_State *g, GCObject *l, GCObject *f) { Table *h = gco2t(l); Node *n, *limit = gnodelast(h); unsigned int i; - unsigned int asize = luaH_realasize(h); + unsigned int asize = h->asize; for (i = 0; i < asize; i++) { - TValue *o = &h->array[i]; - if (iscleared(g, gcvalueN(o))) /* value was collected? */ - setempty(o); /* remove entry */ + GCObject *o = gcvalarr(h, i); + if (iscleared(g, o)) /* value was collected? */ + *getArrTag(h, i) = LUA_VEMPTY; /* remove entry */ } for (n = gnode(h, 0); n < limit; n++) { if (iscleared(g, gcvalueN(gval(n)))) /* unmarked value? */ @@ -770,6 +834,7 @@ static void freeupval (lua_State *L, UpVal *uv) { static void freeobj (lua_State *L, GCObject *o) { + assert_code(l_mem newmem = gettotalbytes(G(L)) - objsize(o)); switch (o->tt) { case LUA_VPROTO: luaF_freeproto(L, gco2p(o)); @@ -801,46 +866,45 @@ static void freeobj (lua_State *L, GCObject *o) { case LUA_VSHRSTR: { TString *ts = gco2ts(o); luaS_remove(L, ts); /* remove it from hash table */ - luaM_freemem(L, ts, sizelstring(ts->shrlen)); + luaM_freemem(L, ts, sizestrshr(cast_uint(ts->shrlen))); break; } case LUA_VLNGSTR: { TString *ts = gco2ts(o); - luaM_freemem(L, ts, sizelstring(ts->u.lnglen)); + if (ts->shrlen == LSTRMEM) /* must free external string? */ + (*ts->falloc)(ts->ud, ts->contents, ts->u.lnglen + 1, 0); + luaM_freemem(L, ts, luaS_sizelngstr(ts->u.lnglen, ts->shrlen)); break; } default: lua_assert(0); } + lua_assert(gettotalbytes(G(L)) == newmem); } /* ** sweep at most 'countin' elements from a list of GCObjects erasing dead ** objects, where a dead object is one marked with the old (non current) -** white; change all non-dead objects back to white, preparing for next -** collection cycle. Return where to continue the traversal or NULL if -** list is finished. ('*countout' gets the number of elements traversed.) +** white; change all non-dead objects back to white (and new), preparing +** for next collection cycle. Return where to continue the traversal or +** NULL if list is finished. */ -static GCObject **sweeplist (lua_State *L, GCObject **p, int countin, - int *countout) { +static GCObject **sweeplist (lua_State *L, GCObject **p, l_mem countin) { global_State *g = G(L); int ow = otherwhite(g); - int i; int white = luaC_white(g); /* current white */ - for (i = 0; *p != NULL && i < countin; i++) { + while (*p != NULL && countin-- > 0) { GCObject *curr = *p; int marked = curr->marked; if (isdeadm(ow, marked)) { /* is 'curr' dead? */ *p = curr->next; /* remove 'curr' from list */ freeobj(L, curr); /* erase 'curr' */ } - else { /* change mark to 'white' */ - curr->marked = cast_byte((marked & ~maskgcbits) | white); + else { /* change mark to 'white' and age to 'new' */ + curr->marked = cast_byte((marked & ~maskgcbits) | white | G_NEW); p = &curr->next; /* go to next element */ } } - if (countout) - *countout = i; /* number of elements traversed */ return (*p == NULL) ? NULL : p; } @@ -851,7 +915,7 @@ static GCObject **sweeplist (lua_State *L, GCObject **p, int countin, static GCObject **sweeptolive (lua_State *L, GCObject **p) { GCObject **old = p; do { - p = sweeplist(L, p, 1, NULL); + p = sweeplist(L, p, 1); } while (p == old); return p; } @@ -870,11 +934,8 @@ static GCObject **sweeptolive (lua_State *L, GCObject **p) { */ static void checkSizes (lua_State *L, global_State *g) { if (!g->gcemergency) { - if (g->strt.nuse < g->strt.size / 4) { /* string table too big? */ - l_mem olddebt = g->GCdebt; + if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ luaS_resize(L, g->strt.size / 2); - g->GCestimate += g->GCdebt - olddebt; /* correct estimate */ - } } } @@ -912,9 +973,9 @@ static void GCTM (lua_State *L) { setgcovalue(L, &v, udata2finalize(g)); tm = luaT_gettmbyobj(L, &v, TM_GC); if (!notm(tm)) { /* is there a finalizer? */ - int status; + TStatus status; lu_byte oldah = L->allowhook; - int oldgcstp = g->gcstp; + lu_byte oldgcstp = g->gcstp; g->gcstp |= GCSTPGC; /* avoid GC steps */ L->allowhook = 0; /* stop debug hooks during GC metamethod */ setobj2s(L, L->top.p++, tm); /* push finalizer... */ @@ -932,18 +993,6 @@ static void GCTM (lua_State *L) { } -/* -** Call a few finalizers -*/ -static int runafewfinalizers (lua_State *L, int n) { - global_State *g = G(L); - int i; - for (i = 0; i < n && g->tobefnz; i++) - GCTM(L); /* call one finalizer */ - return i; -} - - /* ** call all pending finalizers */ @@ -1049,23 +1098,31 @@ void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { ** ======================================================= */ +/* +** Fields 'GCmarked' and 'GCmajorminor' are used to control the pace and +** the mode of the collector. They play several roles, depending on the +** mode of the collector: +** * KGC_INC: +** GCmarked: number of marked bytes during a cycle. +** GCmajorminor: not used. +** * KGC_GENMINOR +** GCmarked: number of bytes that became old since last major collection. +** GCmajorminor: number of bytes marked in last major collection. +** * KGC_GENMAJOR +** GCmarked: number of bytes that became old since last major collection. +** GCmajorminor: number of bytes marked in last major collection. +*/ + /* -** Set the "time" to wait before starting a new GC cycle; cycle will -** start when memory use hits the threshold of ('estimate' * pause / -** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero, -** because Lua cannot even start with less than PAUSEADJ bytes). +** Set the "time" to wait before starting a new incremental cycle; +** cycle will start when number of bytes in use hits the threshold of +** approximately (marked * pause / 100). */ static void setpause (global_State *g) { - l_mem threshold, debt; - int pause = getgcparam(g->gcpause); - l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ - lua_assert(estimate > 0); - threshold = (pause < MAX_LMEM / estimate) /* overflow? */ - ? estimate * pause /* no overflow */ - : MAX_LMEM; /* overflow; truncate to maximum */ - debt = gettotalbytes(g) - threshold; - if (debt > 0) debt = 0; + l_mem threshold = applygcparam(g, PAUSE, g->GCmarked); + l_mem debt = threshold - gettotalbytes(g); + if (debt < 0) debt = 0; luaE_setdebt(g, debt); } @@ -1113,7 +1170,8 @@ static void sweep2old (lua_State *L, GCObject **p) { ** will also remove objects turned white here from any gray list. */ static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p, - GCObject *limit, GCObject **pfirstold1) { + GCObject *limit, GCObject **pfirstold1, + l_mem *paddedold) { static const lu_byte nextage[] = { G_SURVIVAL, /* from G_NEW */ G_OLD1, /* from G_SURVIVAL */ @@ -1123,6 +1181,7 @@ static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p, G_TOUCHED1, /* from G_TOUCHED1 (do not change) */ G_TOUCHED2 /* from G_TOUCHED2 (do not change) */ }; + l_mem addedold = 0; int white = luaC_white(g); GCObject *curr; while ((curr = *p) != limit) { @@ -1132,42 +1191,38 @@ static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p, freeobj(L, curr); /* erase 'curr' */ } else { /* correct mark and age */ - if (getage(curr) == G_NEW) { /* new objects go back to white */ + int age = getage(curr); + if (age == G_NEW) { /* new objects go back to white */ int marked = curr->marked & ~maskgcbits; /* erase GC bits */ curr->marked = cast_byte(marked | G_SURVIVAL | white); } else { /* all other objects will be old, and so keep their color */ - setage(curr, nextage[getage(curr)]); - if (getage(curr) == G_OLD1 && *pfirstold1 == NULL) - *pfirstold1 = curr; /* first OLD1 object in the list */ + lua_assert(age != G_OLD1); /* advanced in 'markold' */ + setage(curr, nextage[age]); + if (getage(curr) == G_OLD1) { + addedold += objsize(curr); /* bytes becoming old */ + if (*pfirstold1 == NULL) + *pfirstold1 = curr; /* first OLD1 object in the list */ + } } p = &curr->next; /* go to next element */ } } + *paddedold += addedold; return p; } /* -** Traverse a list making all its elements white and clearing their -** age. In incremental mode, all objects are 'new' all the time, -** except for fixed strings (which are always old). -*/ -static void whitelist (global_State *g, GCObject *p) { - int white = luaC_white(g); - for (; p != NULL; p = p->next) - p->marked = cast_byte((p->marked & ~maskgcbits) | white); -} - - -/* -** Correct a list of gray objects. Return pointer to where rest of the -** list should be linked. +** Correct a list of gray objects. Return a pointer to the last element +** left on the list, so that we can link another list to the end of +** this one. ** Because this correction is done after sweeping, young objects might ** be turned white and still be in the list. They are only removed. ** 'TOUCHED1' objects are advanced to 'TOUCHED2' and remain on the list; -** Non-white threads also remain on the list; 'TOUCHED2' objects become -** regular old; they and anything else are removed from the list. +** Non-white threads also remain on the list. 'TOUCHED2' objects and +** anything else become regular old, are marked black, and are removed +** from the list. */ static GCObject **correctgraylist (GCObject **p) { GCObject *curr; @@ -1178,7 +1233,7 @@ static GCObject **correctgraylist (GCObject **p) { else if (getage(curr) == G_TOUCHED1) { /* touched in this cycle? */ lua_assert(isgray(curr)); nw2black(curr); /* make it black, for next barrier */ - changeage(curr, G_TOUCHED1, G_TOUCHED2); + setage(curr, G_TOUCHED2); goto remain; /* keep it in the list and go to next element */ } else if (curr->tt == LUA_VTHREAD) { @@ -1188,7 +1243,7 @@ static GCObject **correctgraylist (GCObject **p) { else { /* everything else is removed */ lua_assert(isold(curr)); /* young objects should be white here */ if (getage(curr) == G_TOUCHED2) /* advance from TOUCHED2... */ - changeage(curr, G_TOUCHED2, G_OLD); /* ... to OLD */ + setage(curr, G_OLD); /* ... to OLD */ nw2black(curr); /* make object black (to be removed) */ goto remove; } @@ -1215,15 +1270,15 @@ static void correctgraylists (global_State *g) { /* ** Mark black 'OLD1' objects when starting a new young collection. -** Gray objects are already in some gray list, and so will be visited -** in the atomic step. +** Gray objects are already in some gray list, and so will be visited in +** the atomic step. */ static void markold (global_State *g, GCObject *from, GCObject *to) { GCObject *p; for (p = from; p != to; p = p->next) { if (getage(p) == G_OLD1) { lua_assert(!iswhite(p)); - changeage(p, G_OLD1, G_OLD); /* now they are old */ + setage(p, G_OLD); /* now they are old */ if (isblack(p)) reallymarkobject(g, p); } @@ -1238,17 +1293,48 @@ static void finishgencycle (lua_State *L, global_State *g) { correctgraylists(g); checkSizes(L, g); g->gcstate = GCSpropagate; /* skip restart */ - if (!g->gcemergency) + if (!g->gcemergency && luaD_checkminstack(L)) callallpendingfinalizers(L); } +/* +** Shifts from a minor collection to major collections. It starts in +** the "sweep all" state to clear all objects, which are mostly black +** in generational mode. +*/ +static void minor2inc (lua_State *L, global_State *g, lu_byte kind) { + g->GCmajorminor = g->GCmarked; /* number of live bytes */ + g->gckind = kind; + g->reallyold = g->old1 = g->survival = NULL; + g->finobjrold = g->finobjold1 = g->finobjsur = NULL; + entersweep(L); /* continue as an incremental cycle */ + /* set a debt equal to the step size */ + luaE_setdebt(g, applygcparam(g, STEPSIZE, 100)); +} + + +/* +** Decide whether to shift to major mode. It shifts if the accumulated +** number of added old bytes (counted in 'GCmarked') is larger than +** 'minormajor'% of the number of lived bytes after the last major +** collection. (This number is kept in 'GCmajorminor'.) +*/ +static int checkminormajor (global_State *g) { + l_mem limit = applygcparam(g, MINORMAJOR, g->GCmajorminor); + if (limit == 0) + return 0; /* special case: 'minormajor' 0 stops major collections */ + return (g->GCmarked >= limit); +} + /* ** Does a young collection. First, mark 'OLD1' objects. Then does the -** atomic step. Then, sweep all lists and advance pointers. Finally, -** finish the collection. +** atomic step. Then, check whether to continue in minor mode. If so, +** sweep all lists and advance pointers. Finally, finish the collection. */ static void youngcollection (lua_State *L, global_State *g) { + l_mem addedold1 = 0; + l_mem marked = g->GCmarked; /* preserve 'g->GCmarked' */ GCObject **psurvival; /* to point to first non-dead survival object */ GCObject *dummy; /* dummy out parameter to 'sweepgen' */ lua_assert(g->gcstate == GCSpropagate); @@ -1258,28 +1344,39 @@ static void youngcollection (lua_State *L, global_State *g) { } markold(g, g->finobj, g->finobjrold); markold(g, g->tobefnz, NULL); - atomic(L); + + atomic(L); /* will lose 'g->marked' */ /* sweep nursery and get a pointer to its last live element */ g->gcstate = GCSswpallgc; - psurvival = sweepgen(L, g, &g->allgc, g->survival, &g->firstold1); + psurvival = sweepgen(L, g, &g->allgc, g->survival, &g->firstold1, &addedold1); /* sweep 'survival' */ - sweepgen(L, g, psurvival, g->old1, &g->firstold1); + sweepgen(L, g, psurvival, g->old1, &g->firstold1, &addedold1); g->reallyold = g->old1; g->old1 = *psurvival; /* 'survival' survivals are old now */ g->survival = g->allgc; /* all news are survivals */ /* repeat for 'finobj' lists */ dummy = NULL; /* no 'firstold1' optimization for 'finobj' lists */ - psurvival = sweepgen(L, g, &g->finobj, g->finobjsur, &dummy); + psurvival = sweepgen(L, g, &g->finobj, g->finobjsur, &dummy, &addedold1); /* sweep 'survival' */ - sweepgen(L, g, psurvival, g->finobjold1, &dummy); + sweepgen(L, g, psurvival, g->finobjold1, &dummy, &addedold1); g->finobjrold = g->finobjold1; g->finobjold1 = *psurvival; /* 'survival' survivals are old now */ g->finobjsur = g->finobj; /* all news are survivals */ - sweepgen(L, g, &g->tobefnz, NULL, &dummy); - finishgencycle(L, g); + sweepgen(L, g, &g->tobefnz, NULL, &dummy, &addedold1); + + /* keep total number of added old1 bytes */ + g->GCmarked = marked + addedold1; + + /* decide whether to shift to major mode */ + if (checkminormajor(g)) { + minor2inc(L, g, KGC_GENMAJOR); /* go to major mode */ + g->GCmarked = 0; /* avoid pause in first major cycle (see 'setpause') */ + } + else + finishgencycle(L, g); /* still in minor mode; finish it */ } @@ -1304,19 +1401,21 @@ static void atomic2gen (lua_State *L, global_State *g) { sweep2old(L, &g->tobefnz); - g->gckind = KGC_GEN; - g->lastatomic = 0; - g->GCestimate = gettotalbytes(g); /* base for memory control */ + g->gckind = KGC_GENMINOR; + g->GCmajorminor = g->GCmarked; /* "base" for number of bytes */ + g->GCmarked = 0; /* to count the number of added old1 bytes */ finishgencycle(L, g); } /* ** Set debt for the next minor collection, which will happen when -** memory grows 'genminormul'%. +** total number of bytes grows 'genminormul'% in relation to +** the base, GCmajorminor, which is the number of bytes being used +** after the last major collection. */ static void setminordebt (global_State *g) { - luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul)); + luaE_setdebt(g, applygcparam(g, MINORMUL, g->GCmajorminor)); } @@ -1326,31 +1425,12 @@ static void setminordebt (global_State *g) { ** are cleared. Then, turn all objects into old and finishes the ** collection. */ -static lu_mem entergen (lua_State *L, global_State *g) { - lu_mem numobjs; - luaC_runtilstate(L, bitmask(GCSpause)); /* prepare to start a new cycle */ - luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ - numobjs = atomic(L); /* propagates all and then do the atomic stuff */ +static void entergen (lua_State *L, global_State *g) { + luaC_runtilstate(L, GCSpause, 1); /* prepare to start a new cycle */ + luaC_runtilstate(L, GCSpropagate, 1); /* start new cycle */ + atomic(L); /* propagates all and then do the atomic stuff */ atomic2gen(L, g); setminordebt(g); /* set debt assuming next cycle will be minor */ - return numobjs; -} - - -/* -** Enter incremental mode. Turn all objects white, make all -** intermediate lists point to NULL (to avoid invalid pointers), -** and go to the pause state. -*/ -static void enterinc (global_State *g) { - whitelist(g, g->allgc); - g->reallyold = g->old1 = g->survival = NULL; - whitelist(g, g->finobj); - whitelist(g, g->tobefnz); - g->finobjrold = g->finobjold1 = g->finobjsur = NULL; - g->gcstate = GCSpause; - g->gckind = KGC_INC; - g->lastatomic = 0; } @@ -1359,111 +1439,49 @@ static void enterinc (global_State *g) { */ void luaC_changemode (lua_State *L, int newmode) { global_State *g = G(L); - if (newmode != g->gckind) { - if (newmode == KGC_GEN) /* entering generational mode? */ + if (g->gckind == KGC_GENMAJOR) /* doing major collections? */ + g->gckind = KGC_INC; /* already incremental but in name */ + if (newmode != g->gckind) { /* does it need to change? */ + if (newmode == KGC_INC) /* entering incremental mode? */ + minor2inc(L, g, KGC_INC); /* entering incremental mode */ + else { + lua_assert(newmode == KGC_GENMINOR); entergen(L, g); - else - enterinc(g); /* entering incremental mode */ + } } - g->lastatomic = 0; } /* ** Does a full collection in generational mode. */ -static lu_mem fullgen (lua_State *L, global_State *g) { - enterinc(g); - return entergen(L, g); -} - - -/* -** Does a major collection after last collection was a "bad collection". -** -** When the program is building a big structure, it allocates lots of -** memory but generates very little garbage. In those scenarios, -** the generational mode just wastes time doing small collections, and -** major collections are frequently what we call a "bad collection", a -** collection that frees too few objects. To avoid the cost of switching -** between generational mode and the incremental mode needed for full -** (major) collections, the collector tries to stay in incremental mode -** after a bad collection, and to switch back to generational mode only -** after a "good" collection (one that traverses less than 9/8 objects -** of the previous one). -** The collector must choose whether to stay in incremental mode or to -** switch back to generational mode before sweeping. At this point, it -** does not know the real memory in use, so it cannot use memory to -** decide whether to return to generational mode. Instead, it uses the -** number of objects traversed (returned by 'atomic') as a proxy. The -** field 'g->lastatomic' keeps this count from the last collection. -** ('g->lastatomic != 0' also means that the last collection was bad.) -*/ -static void stepgenfull (lua_State *L, global_State *g) { - lu_mem newatomic; /* count of traversed objects */ - lu_mem lastatomic = g->lastatomic; /* count from last collection */ - if (g->gckind == KGC_GEN) /* still in generational mode? */ - enterinc(g); /* enter incremental mode */ - luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ - newatomic = atomic(L); /* mark everybody */ - if (newatomic < lastatomic + (lastatomic >> 3)) { /* good collection? */ - atomic2gen(L, g); /* return to generational mode */ - setminordebt(g); - } - else { /* another bad collection; stay in incremental mode */ - g->GCestimate = gettotalbytes(g); /* first estimate */ - entersweep(L); - luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ - setpause(g); - g->lastatomic = newatomic; - } +static void fullgen (lua_State *L, global_State *g) { + minor2inc(L, g, KGC_INC); + entergen(L, g); } /* -** Does a generational "step". -** Usually, this means doing a minor collection and setting the debt to -** make another collection when memory grows 'genminormul'% larger. -** -** However, there are exceptions. If memory grows 'genmajormul'% -** larger than it was at the end of the last major collection (kept -** in 'g->GCestimate'), the function does a major collection. At the -** end, it checks whether the major collection was able to free a -** decent amount of memory (at least half the growth in memory since -** previous major collection). If so, the collector keeps its state, -** and the next collection will probably be minor again. Otherwise, -** we have what we call a "bad collection". In that case, set the field -** 'g->lastatomic' to signal that fact, so that the next collection will -** go to 'stepgenfull'. -** -** 'GCdebt <= 0' means an explicit call to GC step with "size" zero; -** in that case, do a minor collection. -*/ -static void genstep (lua_State *L, global_State *g) { - if (g->lastatomic != 0) /* last collection was a bad one? */ - stepgenfull(L, g); /* do a full step */ - else { - lu_mem majorbase = g->GCestimate; /* memory after last major collection */ - lu_mem majorinc = (majorbase / 100) * getgcparam(g->genmajormul); - if (g->GCdebt > 0 && gettotalbytes(g) > majorbase + majorinc) { - lu_mem numobjs = fullgen(L, g); /* do a major collection */ - if (gettotalbytes(g) < majorbase + (majorinc / 2)) { - /* collected at least half of memory growth since last major - collection; keep doing minor collections. */ - lua_assert(g->lastatomic == 0); - } - else { /* bad collection */ - g->lastatomic = numobjs; /* signal that last collection was bad */ - setpause(g); /* do a long wait for next (major) collection */ - } - } - else { /* regular case; do a minor collection */ - youngcollection(L, g); +** After an atomic incremental step from a major collection, +** check whether collector could return to minor collections. +** It checks whether the number of bytes 'tobecollected' +** is greater than 'majorminor'% of the number of bytes added +** since the last collection ('addedbytes'). +*/ +static int checkmajorminor (lua_State *L, global_State *g) { + if (g->gckind == KGC_GENMAJOR) { /* generational mode? */ + l_mem numbytes = gettotalbytes(g); + l_mem addedbytes = numbytes - g->GCmajorminor; + l_mem limit = applygcparam(g, MAJORMINOR, addedbytes); + l_mem tobecollected = numbytes - g->GCmarked; + if (tobecollected > limit) { + atomic2gen(L, g); /* return to generational mode */ setminordebt(g); - g->GCestimate = majorbase; /* preserve base value */ + return 1; /* exit incremental collection */ } } - lua_assert(isdecGCmodegen(g)); + g->GCmajorminor = g->GCmarked; /* prepare for next collection */ + return 0; /* stay doing incremental collections */ } /* }====================================================== */ @@ -1515,32 +1533,31 @@ void luaC_freeallobjects (lua_State *L) { separatetobefnz(g, 1); /* separate all objects with finalizers */ lua_assert(g->finobj == NULL); callallpendingfinalizers(L); - deletelist(L, g->allgc, obj2gco(g->mainthread)); + deletelist(L, g->allgc, obj2gco(mainthread(g))); lua_assert(g->finobj == NULL); /* no new finalizers */ deletelist(L, g->fixedgc, NULL); /* collect fixed objects */ lua_assert(g->strt.nuse == 0); } -static lu_mem atomic (lua_State *L) { +static void atomic (lua_State *L) { global_State *g = G(L); - lu_mem work = 0; GCObject *origweak, *origall; GCObject *grayagain = g->grayagain; /* save original list */ g->grayagain = NULL; lua_assert(g->ephemeron == NULL && g->weak == NULL); - lua_assert(!iswhite(g->mainthread)); + lua_assert(!iswhite(mainthread(g))); g->gcstate = GCSatomic; markobject(g, L); /* mark running thread */ /* registry and global metatables may be changed by API */ markvalue(g, &g->l_registry); markmt(g); /* mark global metatables */ - work += propagateall(g); /* empties 'gray' list */ + propagateall(g); /* empties 'gray' list */ /* remark occasional upvalues of (maybe) dead threads */ - work += remarkupvals(g); - work += propagateall(g); /* propagate changes */ + remarkupvals(g); + propagateall(g); /* propagate changes */ g->gray = grayagain; - work += propagateall(g); /* traverse 'grayagain' list */ + propagateall(g); /* traverse 'grayagain' list */ convergeephemerons(g); /* at this point, all strongly accessible objects are marked. */ /* Clear values from weak tables, before checking finalizers */ @@ -1548,154 +1565,197 @@ static lu_mem atomic (lua_State *L) { clearbyvalues(g, g->allweak, NULL); origweak = g->weak; origall = g->allweak; separatetobefnz(g, 0); /* separate objects to be finalized */ - work += markbeingfnz(g); /* mark objects that will be finalized */ - work += propagateall(g); /* remark, to propagate 'resurrection' */ + markbeingfnz(g); /* mark objects that will be finalized */ + propagateall(g); /* remark, to propagate 'resurrection' */ convergeephemerons(g); /* at this point, all resurrected objects are marked. */ /* remove dead objects from weak tables */ - clearbykeys(g, g->ephemeron); /* clear keys from all ephemeron tables */ - clearbykeys(g, g->allweak); /* clear keys from all 'allweak' tables */ + clearbykeys(g, g->ephemeron); /* clear keys from all ephemeron */ + clearbykeys(g, g->allweak); /* clear keys from all 'allweak' */ /* clear values from resurrected weak tables */ clearbyvalues(g, g->weak, origweak); clearbyvalues(g, g->allweak, origall); luaS_clearcache(g); g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */ lua_assert(g->gray == NULL); - return work; /* estimate of slots marked by 'atomic' */ } -static int sweepstep (lua_State *L, global_State *g, - int nextstate, GCObject **nextlist) { - if (g->sweepgc) { - l_mem olddebt = g->GCdebt; - int count; - g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX, &count); - g->GCestimate += g->GCdebt - olddebt; /* update estimate */ - return count; - } +/* +** Do a sweep step. The normal case (not fast) sweeps at most GCSWEEPMAX +** elements. The fast case sweeps the whole list. +*/ +static void sweepstep (lua_State *L, global_State *g, + lu_byte nextstate, GCObject **nextlist, int fast) { + if (g->sweepgc) + g->sweepgc = sweeplist(L, g->sweepgc, fast ? MAX_LMEM : GCSWEEPMAX); else { /* enter next state */ g->gcstate = nextstate; g->sweepgc = nextlist; - return 0; /* no work done */ } } -static lu_mem singlestep (lua_State *L) { +/* +** Performs one incremental "step" in an incremental garbage collection. +** For indivisible work, a step goes to the next state. When marking +** (propagating), a step traverses one object. When sweeping, a step +** sweeps GCSWEEPMAX objects, to avoid a big overhead for sweeping +** objects one by one. (Sweeping is inexpensive, no matter the +** object.) When 'fast' is true, 'singlestep' tries to finish a state +** "as fast as possible". In particular, it skips the propagation +** phase and leaves all objects to be traversed by the atomic phase: +** That avoids traversing twice some objects, such as threads and +** weak tables. +*/ + +#define step2pause -3 /* finished collection; entered pause state */ +#define atomicstep -2 /* atomic step */ +#define step2minor -1 /* moved to minor collections */ + + +static l_mem singlestep (lua_State *L, int fast) { global_State *g = G(L); - lu_mem work; + l_mem stepresult; lua_assert(!g->gcstopem); /* collector is not reentrant */ g->gcstopem = 1; /* no emergency collections while collecting */ switch (g->gcstate) { case GCSpause: { restartcollection(g); g->gcstate = GCSpropagate; - work = 1; + stepresult = 1; break; } case GCSpropagate: { - if (g->gray == NULL) { /* no more gray objects? */ + if (fast || g->gray == NULL) { g->gcstate = GCSenteratomic; /* finish propagate phase */ - work = 0; + stepresult = 1; } else - work = propagatemark(g); /* traverse one gray object */ + stepresult = propagatemark(g); /* traverse one gray object */ break; } case GCSenteratomic: { - work = atomic(L); /* work is what was traversed by 'atomic' */ - entersweep(L); - g->GCestimate = gettotalbytes(g); /* first estimate */ + atomic(L); + if (checkmajorminor(L, g)) + stepresult = step2minor; + else { + entersweep(L); + stepresult = atomicstep; + } break; } case GCSswpallgc: { /* sweep "regular" objects */ - work = sweepstep(L, g, GCSswpfinobj, &g->finobj); + sweepstep(L, g, GCSswpfinobj, &g->finobj, fast); + stepresult = GCSWEEPMAX; break; } case GCSswpfinobj: { /* sweep objects with finalizers */ - work = sweepstep(L, g, GCSswptobefnz, &g->tobefnz); + sweepstep(L, g, GCSswptobefnz, &g->tobefnz, fast); + stepresult = GCSWEEPMAX; break; } case GCSswptobefnz: { /* sweep objects to be finalized */ - work = sweepstep(L, g, GCSswpend, NULL); + sweepstep(L, g, GCSswpend, NULL, fast); + stepresult = GCSWEEPMAX; break; } case GCSswpend: { /* finish sweeps */ checkSizes(L, g); g->gcstate = GCScallfin; - work = 0; + stepresult = GCSWEEPMAX; break; } - case GCScallfin: { /* call remaining finalizers */ - if (g->tobefnz && !g->gcemergency) { + case GCScallfin: { /* call finalizers */ + if (g->tobefnz && !g->gcemergency && luaD_checkminstack(L)) { g->gcstopem = 0; /* ok collections during finalizers */ - work = runafewfinalizers(L, GCFINMAX) * GCFINALIZECOST; + GCTM(L); /* call one finalizer */ + stepresult = CWUFIN; } - else { /* emergency mode or no more finalizers */ + else { /* no more finalizers or emergency mode or no enough stack + to run finalizers */ g->gcstate = GCSpause; /* finish collection */ - work = 0; + stepresult = step2pause; } break; } default: lua_assert(0); return 0; } g->gcstopem = 0; - return work; + return stepresult; } /* -** advances the garbage collector until it reaches a state allowed -** by 'statemask' +** Advances the garbage collector until it reaches the given state. +** (The option 'fast' is only for testing; in normal code, 'fast' +** here is always true.) */ -void luaC_runtilstate (lua_State *L, int statesmask) { +void luaC_runtilstate (lua_State *L, int state, int fast) { global_State *g = G(L); - while (!testbit(statesmask, g->gcstate)) - singlestep(L); + lua_assert(g->gckind == KGC_INC); + while (state != g->gcstate) + singlestep(L, fast); } /* -** Performs a basic incremental step. The debt and step size are +** Performs a basic incremental step. The step size is ** converted from bytes to "units of work"; then the function loops ** running single steps until adding that many units of work or ** finishing a cycle (pause state). Finally, it sets the debt that ** controls when next step will be performed. */ static void incstep (lua_State *L, global_State *g) { - int stepmul = (getgcparam(g->gcstepmul) | 1); /* avoid division by 0 */ - l_mem debt = (g->GCdebt / WORK2MEM) * stepmul; - l_mem stepsize = (g->gcstepsize <= log2maxs(l_mem)) - ? ((cast(l_mem, 1) << g->gcstepsize) / WORK2MEM) * stepmul - : MAX_LMEM; /* overflow; keep maximum value */ - do { /* repeat until pause or enough "credit" (negative debt) */ - lu_mem work = singlestep(L); /* perform one single step */ - debt -= work; - } while (debt > -stepsize && g->gcstate != GCSpause); + l_mem stepsize = applygcparam(g, STEPSIZE, 100); + l_mem work2do = applygcparam(g, STEPMUL, stepsize / cast_int(sizeof(void*))); + l_mem stres; + int fast = (work2do == 0); /* special case: do a full collection */ + do { /* repeat until enough work */ + stres = singlestep(L, fast); /* perform one single step */ + if (stres == step2minor) /* returned to minor collections? */ + return; /* nothing else to be done here */ + else if (stres == step2pause || (stres == atomicstep && !fast)) + break; /* end of cycle or atomic */ + else + work2do -= stres; + } while (fast || work2do > 0); if (g->gcstate == GCSpause) setpause(g); /* pause until next cycle */ - else { - debt = (debt / stepmul) * WORK2MEM; /* convert 'work units' to bytes */ - luaE_setdebt(g, debt); - } + else + luaE_setdebt(g, stepsize); } + +#if !defined(luai_tracegc) +#define luai_tracegc(L,f) ((void)0) +#endif + /* -** Performs a basic GC step if collector is running. (If collector is -** not running, set a reasonable debt to avoid it being called at -** every single check.) +** Performs a basic GC step if collector is running. (If collector was +** stopped by the user, set a reasonable debt to avoid it being called +** at every single check.) */ void luaC_step (lua_State *L) { global_State *g = G(L); - if (!gcrunning(g)) /* not running? */ - luaE_setdebt(g, -2000); + lua_assert(!g->gcemergency); + if (!gcrunning(g)) { /* not running? */ + if (g->gcstp & GCSTPUSR) /* stopped by the user? */ + luaE_setdebt(g, 20000); + } else { - if(isdecGCmodegen(g)) - genstep(L, g); - else - incstep(L, g); + luai_tracegc(L, 1); /* for internal debugging */ + switch (g->gckind) { + case KGC_INC: case KGC_GENMAJOR: + incstep(L, g); + break; + case KGC_GENMINOR: + youngcollection(L, g); + setminordebt(g); + break; + } + luai_tracegc(L, 0); /* for internal debugging */ } } @@ -1711,13 +1771,9 @@ static void fullinc (lua_State *L, global_State *g) { if (keepinvariant(g)) /* black objects? */ entersweep(L); /* sweep everything to turn them back to white */ /* finish any pending sweep phase to start a new cycle */ - luaC_runtilstate(L, bitmask(GCSpause)); - luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ - g->gcstate = GCSenteratomic; /* go straight to atomic phase */ - luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */ - /* estimate must be correct after a full GC cycle */ - lua_assert(g->GCestimate == gettotalbytes(g)); - luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + luaC_runtilstate(L, GCSpause, 1); + luaC_runtilstate(L, GCScallfin, 1); /* run up to finalizers */ + luaC_runtilstate(L, GCSpause, 1); /* finish collection */ setpause(g); } @@ -1730,11 +1786,16 @@ static void fullinc (lua_State *L, global_State *g) { void luaC_fullgc (lua_State *L, int isemergency) { global_State *g = G(L); lua_assert(!g->gcemergency); - g->gcemergency = isemergency; /* set flag */ - if (g->gckind == KGC_INC) - fullinc(L, g); - else - fullgen(L, g); + g->gcemergency = cast_byte(isemergency); /* set flag */ + switch (g->gckind) { + case KGC_GENMINOR: fullgen(L, g); break; + case KGC_INC: fullinc(L, g); break; + case KGC_GENMAJOR: + g->gckind = KGC_INC; + fullinc(L, g); + g->gckind = KGC_GENMAJOR; + break; + } g->gcemergency = 0; } diff --git a/src/linit.c b/src/linit.c new file mode 100644 index 0000000..00d06f7 --- /dev/null +++ b/src/linit.c @@ -0,0 +1,63 @@ +/* +** $Id: linit.c $ +** Initialization of libraries for lua.c and other clients +** See Copyright Notice in lua.h +*/ + + +#define linit_c +#define LUA_LIB + + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lualib.h" +#include "lauxlib.h" +#include "llimits.h" + + +/* +** Standard Libraries. (Must be listed in the same ORDER of their +** respective constants LUA_K.) +*/ +static const luaL_Reg stdlibs[] = { + {LUA_GNAME, luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_COLIBNAME, luaopen_coroutine}, + {LUA_DBLIBNAME, luaopen_debug}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_UTF8LIBNAME, luaopen_utf8}, + {NULL, NULL} +}; + + +/* +** require and preload selected standard libraries +*/ +LUALIB_API void luaL_openselectedlibs (lua_State *L, int load, int preload) { + int mask; + const luaL_Reg *lib; + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + for (lib = stdlibs, mask = 1; lib->name != NULL; lib++, mask <<= 1) { + if (load & mask) { /* selected? */ + luaL_requiref(L, lib->name, lib->func, 1); /* require library */ + lua_pop(L, 1); /* remove result from the stack */ + } + else if (preload & mask) { /* selected? */ + lua_pushcfunction(L, lib->func); + lua_setfield(L, -2, lib->name); /* add library to PRELOAD table */ + } + } + lua_assert((mask >> 1) == LUA_UTF8LIBK); + lua_pop(L, 1); /* remove PRELOAD table */ +} + diff --git a/lua-5.4.7/src/liolib.c b/src/liolib.c similarity index 94% rename from lua-5.4.7/src/liolib.c rename to src/liolib.c index c5075f3..57615e6 100644 --- a/lua-5.4.7/src/liolib.c +++ b/src/liolib.c @@ -21,8 +21,7 @@ #include "lauxlib.h" #include "lualib.h" - - +#include "llimits.h" /* @@ -115,7 +114,7 @@ static int l_checkmode (const char *mode) { #if !defined(l_fseek) /* { */ -#if defined(LUA_USE_POSIX) /* { */ +#if defined(LUA_USE_POSIX) || defined(LUA_USE_OFF_T) /* { */ #include @@ -444,7 +443,7 @@ static int nextc (RN *rn) { return 0; /* fail */ } else { - rn->buff[rn->n++] = rn->c; /* save current char */ + rn->buff[rn->n++] = cast_char(rn->c); /* save current char */ rn->c = l_getc(rn->f); /* read next one */ return 1; } @@ -525,15 +524,15 @@ static int read_line (lua_State *L, FILE *f, int chop) { luaL_buffinit(L, &b); do { /* may need to read several chunks to get whole line */ char *buff = luaL_prepbuffer(&b); /* preallocate buffer space */ - int i = 0; + unsigned i = 0; l_lockfile(f); /* no memory errors can happen inside the lock */ while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') - buff[i++] = c; /* read up to end of line or buffer limit */ + buff[i++] = cast_char(c); /* read up to end of line or buffer limit */ l_unlockfile(f); luaL_addsize(&b, i); } while (c != EOF && c != '\n'); /* repeat until end of line */ if (!chop && c == '\n') /* want a newline and have one? */ - luaL_addchar(&b, c); /* add ending newline to result */ + luaL_addchar(&b, '\n'); /* add ending newline to result */ luaL_pushresult(&b); /* close buffer */ /* return ok if read something (either a newline or something else) */ return (c == '\n' || lua_rawlen(L, -1) > 0); @@ -663,28 +662,28 @@ static int io_readline (lua_State *L) { static int g_write (lua_State *L, FILE *f, int arg) { int nargs = lua_gettop(L) - arg; - int status = 1; + size_t totalbytes = 0; /* total number of bytes written */ errno = 0; - for (; nargs--; arg++) { - if (lua_type(L, arg) == LUA_TNUMBER) { - /* optimization: could be done exactly as for strings */ - int len = lua_isinteger(L, arg) - ? fprintf(f, LUA_INTEGER_FMT, - (LUAI_UACINT)lua_tointeger(L, arg)) - : fprintf(f, LUA_NUMBER_FMT, - (LUAI_UACNUMBER)lua_tonumber(L, arg)); - status = status && (len > 0); + for (; nargs--; arg++) { /* for each argument */ + char buff[LUA_N2SBUFFSZ]; + const char *s; + size_t numbytes; /* bytes written in one call to 'fwrite' */ + size_t len = lua_numbertocstring(L, arg, buff); /* try as a number */ + if (len > 0) { /* did conversion work (value was a number)? */ + s = buff; + len--; } - else { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - status = status && (fwrite(s, sizeof(char), l, f) == l); + else /* must be a string */ + s = luaL_checklstring(L, arg, &len); + numbytes = fwrite(s, sizeof(char), len, f); + totalbytes += numbytes; + if (numbytes < len) { /* write error? */ + int n = luaL_fileresult(L, 0, NULL); + lua_pushinteger(L, cast_st2S(totalbytes)); + return n + 1; /* return fail, error msg., error code, and counter */ } } - if (l_likely(status)) - return 1; /* file handle already on stack top */ - else - return luaL_fileresult(L, status, NULL); + return 1; /* no errors; file handle already on stack top */ } @@ -733,18 +732,19 @@ static int f_setvbuf (lua_State *L) { } - -static int io_flush (lua_State *L) { - FILE *f = getiofile(L, IO_OUTPUT); +static int aux_flush (lua_State *L, FILE *f) { errno = 0; return luaL_fileresult(L, fflush(f) == 0, NULL); } static int f_flush (lua_State *L) { - FILE *f = tofile(L); - errno = 0; - return luaL_fileresult(L, fflush(f) == 0, NULL); + return aux_flush(L, tofile(L)); +} + + +static int io_flush (lua_State *L) { + return aux_flush(L, getiofile(L, IO_OUTPUT)); } diff --git a/lua-5.4.7/src/llex.c b/src/llex.c similarity index 87% rename from lua-5.4.7/src/llex.c rename to src/llex.c index 5fc39a5..f8bb3ea 100644 --- a/lua-5.4.7/src/llex.c +++ b/src/llex.c @@ -32,6 +32,11 @@ #define next(ls) (ls->current = zgetc(ls->z)) +/* minimum size for string buffer */ +#if !defined(LUA_MINBUFFER) +#define LUA_MINBUFFER 32 +#endif + #define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') @@ -39,7 +44,7 @@ /* ORDER RESERVED */ static const char *const luaX_tokens [] = { "and", "break", "do", "else", "elseif", - "end", "false", "for", "function", "goto", "if", + "end", "false", "for", "function", "global", "goto", "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", "true", "until", "while", "//", "..", "...", "==", ">=", "<=", "~=", @@ -57,10 +62,10 @@ static l_noret lexerror (LexState *ls, const char *msg, int token); static void save (LexState *ls, int c) { Mbuffer *b = ls->buff; if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) { - size_t newsize; - if (luaZ_sizebuffer(b) >= MAX_SIZE/2) + size_t newsize = luaZ_sizebuffer(b); /* get old size */; + if (newsize >= (MAX_SIZE/3 * 2)) /* larger than MAX_SIZE/1.5 ? */ lexerror(ls, "lexical element too long", 0); - newsize = luaZ_sizebuffer(b) * 2; + newsize += (newsize >> 1); /* new size is 1.5 times the old one */ luaZ_resizebuffer(ls->L, b, newsize); } b->buffer[luaZ_bufflen(b)++] = cast_char(c); @@ -122,30 +127,34 @@ l_noret luaX_syntaxerror (LexState *ls, const char *msg) { /* -** Creates a new string and anchors it in scanner's table so that it -** will not be collected until the end of the compilation; by that time -** it should be anchored somewhere. It also internalizes long strings, -** ensuring there is only one copy of each unique string. The table -** here is used as a set: the string enters as the key, while its value -** is irrelevant. We use the string itself as the value only because it -** is a TValue readily available. Later, the code generation can change -** this value. +** Anchors a string in scanner's table so that it will not be collected +** until the end of the compilation; by that time it should be anchored +** somewhere. It also internalizes long strings, ensuring there is only +** one copy of each unique string. */ -TString *luaX_newstring (LexState *ls, const char *str, size_t l) { +static TString *anchorstr (LexState *ls, TString *ts) { lua_State *L = ls->L; - TString *ts = luaS_newlstr(L, str, l); /* create new string */ - const TValue *o = luaH_getstr(ls->h, ts); - if (!ttisnil(o)) /* string already present? */ - ts = keystrval(nodefromval(o)); /* get saved copy */ - else { /* not in use yet */ + TValue oldts; + int tag = luaH_getstr(ls->h, ts, &oldts); + if (!tagisempty(tag)) /* string already present? */ + return tsvalue(&oldts); /* use stored value */ + else { /* create a new entry */ TValue *stv = s2v(L->top.p++); /* reserve stack space for string */ - setsvalue(L, stv, ts); /* temporarily anchor the string */ - luaH_finishset(L, ls->h, stv, o, stv); /* t[string] = string */ + setsvalue(L, stv, ts); /* push (anchor) the string on the stack */ + luaH_set(L, ls->h, stv, stv); /* t[string] = string */ /* table is not a metatable, so it does not need to invalidate cache */ luaC_checkGC(L); L->top.p--; /* remove string from stack */ + return ts; } - return ts; +} + + +/* +** Creates a new string and anchors it in scanner's table. +*/ +TString *luaX_newstring (LexState *ls, const char *str, size_t l) { + return anchorstr(ls, luaS_newlstr(ls->L, str, l)); } @@ -159,7 +168,7 @@ static void inclinenumber (LexState *ls) { next(ls); /* skip '\n' or '\r' */ if (currIsNewline(ls) && ls->current != old) next(ls); /* skip '\n\r' or '\r\n' */ - if (++ls->linenumber >= MAX_INT) + if (++ls->linenumber >= INT_MAX) lexerror(ls, "chunk has too many lines", 0); } @@ -175,7 +184,15 @@ void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, ls->linenumber = 1; ls->lastline = 1; ls->source = source; - ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ + /* all three strings here ("_ENV", "break", "global") were fixed, + so they cannot be collected */ + ls->envn = luaS_newliteral(L, LUA_ENV); /* get env string */ + ls->brkn = luaS_newliteral(L, "break"); /* get "break" string */ +#if defined(LUA_COMPAT_GLOBAL) + /* compatibility mode: "global" is not a reserved word */ + ls->glbn = luaS_newliteral(L, "global"); /* get "global" string */ + ls->glbn->extra = 0; /* mark it as not reserved */ +#endif luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ } @@ -340,12 +357,17 @@ static int readhexaesc (LexState *ls) { } -static unsigned long readutf8esc (LexState *ls) { - unsigned long r; - int i = 4; /* chars to be removed: '\', 'u', '{', and first digit */ +/* +** When reading a UTF-8 escape sequence, save everything to the buffer +** for error reporting in case of errors; 'i' counts the number of +** saved characters, so that they can be removed if case of success. +*/ +static l_uint32 readutf8esc (LexState *ls) { + l_uint32 r; + int i = 4; /* number of chars to be removed: start with #"\u{X" */ save_and_next(ls); /* skip 'u' */ esccheck(ls, ls->current == '{', "missing '{'"); - r = gethexa(ls); /* must have at least one digit */ + r = cast_uint(gethexa(ls)); /* must have at least one digit */ while (cast_void(save_and_next(ls)), lisxdigit(ls->current)) { i++; esccheck(ls, r <= (0x7FFFFFFFu >> 4), "UTF-8 value too large"); @@ -542,12 +564,13 @@ static int llex (LexState *ls, SemInfo *seminfo) { do { save_and_next(ls); } while (lislalnum(ls->current)); - ts = luaX_newstring(ls, luaZ_buffer(ls->buff), - luaZ_bufflen(ls->buff)); - seminfo->ts = ts; - if (isreserved(ts)) /* reserved word? */ + /* find or create string */ + ts = luaS_newlstr(ls->L, luaZ_buffer(ls->buff), + luaZ_bufflen(ls->buff)); + if (isreserved(ts)) /* reserved word? */ return ts->extra - 1 + FIRST_RESERVED; else { + seminfo->ts = anchorstr(ls, ts); return TK_NAME; } } diff --git a/lua-5.4.7/src/lmathlib.c b/src/lmathlib.c similarity index 88% rename from lua-5.4.7/src/lmathlib.c rename to src/lmathlib.c index 4381063..a6b13f9 100644 --- a/lua-5.4.7/src/lmathlib.c +++ b/src/lmathlib.c @@ -20,6 +20,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" #undef PI @@ -37,31 +38,37 @@ static int math_abs (lua_State *L) { return 1; } + static int math_sin (lua_State *L) { lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1))); return 1; } + static int math_cos (lua_State *L) { lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1))); return 1; } + static int math_tan (lua_State *L) { lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1))); return 1; } + static int math_asin (lua_State *L) { lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1))); return 1; } + static int math_acos (lua_State *L) { lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1))); return 1; } + static int math_atan (lua_State *L) { lua_Number y = luaL_checknumber(L, 1); lua_Number x = luaL_optnumber(L, 2, 1); @@ -105,7 +112,7 @@ static int math_floor (lua_State *L) { static int math_ceil (lua_State *L) { if (lua_isinteger(L, 1)) - lua_settop(L, 1); /* integer is its own ceil */ + lua_settop(L, 1); /* integer is its own ceiling */ else { lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1)); pushnumint(L, d); @@ -166,6 +173,7 @@ static int math_ult (lua_State *L) { return 1; } + static int math_log (lua_State *L) { lua_Number x = luaL_checknumber(L, 1); lua_Number res; @@ -187,22 +195,42 @@ static int math_log (lua_State *L) { return 1; } + static int math_exp (lua_State *L) { lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1))); return 1; } + static int math_deg (lua_State *L) { lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI)); return 1; } + static int math_rad (lua_State *L) { lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0))); return 1; } +static int math_frexp (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + int ep; + lua_pushnumber(L, l_mathop(frexp)(x, &ep)); + lua_pushinteger(L, ep); + return 2; +} + + +static int math_ldexp (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + int ep = (int)luaL_checkinteger(L, 2); + lua_pushnumber(L, l_mathop(ldexp)(x, ep)); + return 1; +} + + static int math_min (lua_State *L) { int n = lua_gettop(L); /* number of arguments */ int imin = 1; /* index of current minimum value */ @@ -250,7 +278,7 @@ static int math_type (lua_State *L) { */ /* -** This code uses lots of shifts. ANSI C does not allow shifts greater +** This code uses lots of shifts. ISO C does not allow shifts greater ** than or equal to the width of the type being shifted, so some shifts ** are written in convoluted ways to match that restriction. For ** preprocessor tests, it assumes a width of 32 bits, so the maximum @@ -366,25 +394,17 @@ static lua_Number I2d (Rand64 x) { #else /* no 'Rand64' }{ */ -/* get an integer with at least 32 bits */ -#if LUAI_IS32INT -typedef unsigned int lu_int32; -#else -typedef unsigned long lu_int32; -#endif - - /* ** Use two 32-bit integers to represent a 64-bit quantity. */ typedef struct Rand64 { - lu_int32 h; /* higher half */ - lu_int32 l; /* lower half */ + l_uint32 h; /* higher half */ + l_uint32 l; /* lower half */ } Rand64; /* -** If 'lu_int32' has more than 32 bits, the extra bits do not interfere +** If 'l_uint32' has more than 32 bits, the extra bits do not interfere ** with the 32 initial bits, except in a right shift and comparisons. ** Moreover, the final result has to discard the extra bits. */ @@ -398,7 +418,7 @@ typedef struct Rand64 { */ /* build a new Rand64 value */ -static Rand64 packI (lu_int32 h, lu_int32 l) { +static Rand64 packI (l_uint32 h, l_uint32 l) { Rand64 result; result.h = h; result.l = l; @@ -471,7 +491,7 @@ static Rand64 nextrand (Rand64 *state) { */ /* an unsigned 1 with proper type */ -#define UONE ((lu_int32)1) +#define UONE ((l_uint32)1) #if FIGS <= 32 @@ -522,7 +542,7 @@ static lua_Unsigned I2UInt (Rand64 x) { /* convert a 'lua_Unsigned' to a 'Rand64' */ static Rand64 Int2I (lua_Unsigned n) { - return packI((lu_int32)((n >> 31) >> 1), (lu_int32)n); + return packI((l_uint32)((n >> 31) >> 1), (l_uint32)n); } #endif /* } */ @@ -540,7 +560,7 @@ typedef struct { ** Project the random integer 'ran' into the interval [0, n]. ** Because 'ran' has 2^B possible values, the projection can only be ** uniform when the size of the interval is a power of 2 (exact -** division). Otherwise, to get a uniform projection into [0, n], we +** division). So, to get a uniform projection into [0, n], we ** first compute 'lim', the smallest Mersenne number not smaller than ** 'n'. We then project 'ran' into the interval [0, lim]. If the result ** is inside [0, n], we are done. Otherwise, we try with another 'ran', @@ -548,26 +568,14 @@ typedef struct { */ static lua_Unsigned project (lua_Unsigned ran, lua_Unsigned n, RanState *state) { - if ((n & (n + 1)) == 0) /* is 'n + 1' a power of 2? */ - return ran & n; /* no bias */ - else { - lua_Unsigned lim = n; - /* compute the smallest (2^b - 1) not smaller than 'n' */ - lim |= (lim >> 1); - lim |= (lim >> 2); - lim |= (lim >> 4); - lim |= (lim >> 8); - lim |= (lim >> 16); -#if (LUA_MAXUNSIGNED >> 31) >= 3 - lim |= (lim >> 32); /* integer type has more than 32 bits */ -#endif - lua_assert((lim & (lim + 1)) == 0 /* 'lim + 1' is a power of 2, */ - && lim >= n /* not smaller than 'n', */ - && (lim >> 1) < n); /* and it is the smallest one */ - while ((ran &= lim) > n) /* project 'ran' into [0..lim] */ - ran = I2UInt(nextrand(state->s)); /* not inside [0..n]? try again */ - return ran; - } + lua_Unsigned lim = n; /* to compute the Mersenne number */ + int sh; /* how much to spread bits to the right in 'lim' */ + /* spread '1' bits in 'lim' until it becomes a Mersenne number */ + for (sh = 1; (lim & (lim + 1)) != 0; sh *= 2) + lim |= (lim >> sh); /* spread '1's to the right */ + while ((ran &= lim) > n) /* project 'ran' into [0..lim] and test */ + ran = I2UInt(nextrand(state->s)); /* not inside [0..n]? try again */ + return ran; } @@ -585,7 +593,7 @@ static int math_random (lua_State *L) { low = 1; up = luaL_checkinteger(L, 1); if (up == 0) { /* single 0 as argument? */ - lua_pushinteger(L, I2UInt(rv)); /* full random integer */ + lua_pushinteger(L, l_castU2S(I2UInt(rv))); /* full random integer */ return 1; } break; @@ -600,8 +608,8 @@ static int math_random (lua_State *L) { /* random integer in the interval [low, up] */ luaL_argcheck(L, low <= up, 1, "interval is empty"); /* project random integer into the interval [0, up - low] */ - p = project(I2UInt(rv), (lua_Unsigned)up - (lua_Unsigned)low, state); - lua_pushinteger(L, p + (lua_Unsigned)low); + p = project(I2UInt(rv), l_castS2U(up) - l_castS2U(low), state); + lua_pushinteger(L, l_castU2S(p + l_castS2U(low))); return 1; } @@ -615,33 +623,23 @@ static void setseed (lua_State *L, Rand64 *state, state[3] = Int2I(0); for (i = 0; i < 16; i++) nextrand(state); /* discard initial values to "spread" seed */ - lua_pushinteger(L, n1); - lua_pushinteger(L, n2); -} - - -/* -** Set a "random" seed. To get some randomness, use the current time -** and the address of 'L' (in case the machine does address space layout -** randomization). -*/ -static void randseed (lua_State *L, RanState *state) { - lua_Unsigned seed1 = (lua_Unsigned)time(NULL); - lua_Unsigned seed2 = (lua_Unsigned)(size_t)L; - setseed(L, state->s, seed1, seed2); + lua_pushinteger(L, l_castU2S(n1)); + lua_pushinteger(L, l_castU2S(n2)); } static int math_randomseed (lua_State *L) { RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); + lua_Unsigned n1, n2; if (lua_isnone(L, 1)) { - randseed(L, state); + n1 = luaL_makeseed(L); /* "random" seed */ + n2 = I2UInt(nextrand(state->s)); /* in case seed is not that random... */ } else { - lua_Integer n1 = luaL_checkinteger(L, 1); - lua_Integer n2 = luaL_optinteger(L, 2, 0); - setseed(L, state->s, n1, n2); + n1 = l_castS2U(luaL_checkinteger(L, 1)); + n2 = l_castS2U(luaL_optinteger(L, 2, 0)); } + setseed(L, state->s, n1, n2); return 2; /* return seeds */ } @@ -658,7 +656,7 @@ static const luaL_Reg randfuncs[] = { */ static void setrandfunc (lua_State *L) { RanState *state = (RanState *)lua_newuserdatauv(L, sizeof(RanState), 0); - randseed(L, state); /* initialize with a "random" seed */ + setseed(L, state->s, luaL_makeseed(L), 0); /* initialize with random seed */ lua_pop(L, 2); /* remove pushed seeds */ luaL_setfuncs(L, randfuncs, 1); } @@ -695,20 +693,6 @@ static int math_pow (lua_State *L) { return 1; } -static int math_frexp (lua_State *L) { - int e; - lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e)); - lua_pushinteger(L, e); - return 2; -} - -static int math_ldexp (lua_State *L) { - lua_Number x = luaL_checknumber(L, 1); - int ep = (int)luaL_checkinteger(L, 2); - lua_pushnumber(L, l_mathop(ldexp)(x, ep)); - return 1; -} - static int math_log10 (lua_State *L) { lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1))); return 1; @@ -731,7 +715,9 @@ static const luaL_Reg mathlib[] = { {"tointeger", math_toint}, {"floor", math_floor}, {"fmod", math_fmod}, + {"frexp", math_frexp}, {"ult", math_ult}, + {"ldexp", math_ldexp}, {"log", math_log}, {"max", math_max}, {"min", math_min}, @@ -747,8 +733,6 @@ static const luaL_Reg mathlib[] = { {"sinh", math_sinh}, {"tanh", math_tanh}, {"pow", math_pow}, - {"frexp", math_frexp}, - {"ldexp", math_ldexp}, {"log10", math_log10}, #endif /* placeholders */ diff --git a/lua-5.4.7/src/lmem.c b/src/lmem.c similarity index 92% rename from lua-5.4.7/src/lmem.c rename to src/lmem.c index 9800a86..de8503d 100644 --- a/lua-5.4.7/src/lmem.c +++ b/src/lmem.c @@ -95,7 +95,7 @@ static void *firsttry (global_State *g, void *block, size_t os, size_t ns) { void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize, - int size_elems, int limit, const char *what) { + unsigned size_elems, int limit, const char *what) { void *newblock; int size = *psize; if (nelems + 1 <= size) /* does one extra element still fit? */ @@ -126,10 +126,10 @@ void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize, ** error. */ void *luaM_shrinkvector_ (lua_State *L, void *block, int *size, - int final_n, int size_elem) { + int final_n, unsigned size_elem) { void *newblock; - size_t oldsize = cast_sizet((*size) * size_elem); - size_t newsize = cast_sizet(final_n * size_elem); + size_t oldsize = cast_sizet(*size) * size_elem; + size_t newsize = cast_sizet(final_n) * size_elem; lua_assert(newsize <= oldsize); newblock = luaM_saferealloc_(L, block, oldsize, newsize); *size = final_n; @@ -151,7 +151,7 @@ void luaM_free_ (lua_State *L, void *block, size_t osize) { global_State *g = G(L); lua_assert((osize == 0) == (block == NULL)); callfrealloc(g, block, osize, 0); - g->GCdebt -= osize; + g->GCdebt += cast(l_mem, osize); } @@ -184,7 +184,7 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { return NULL; /* do not update 'GCdebt' */ } lua_assert((nsize == 0) == (newblock == NULL)); - g->GCdebt = (g->GCdebt + nsize) - osize; + g->GCdebt -= cast(l_mem, nsize) - cast(l_mem, osize); return newblock; } @@ -203,13 +203,13 @@ void *luaM_malloc_ (lua_State *L, size_t size, int tag) { return NULL; /* that's all */ else { global_State *g = G(L); - void *newblock = firsttry(g, NULL, tag, size); + void *newblock = firsttry(g, NULL, cast_sizet(tag), size); if (l_unlikely(newblock == NULL)) { - newblock = tryagain(L, NULL, tag, size); + newblock = tryagain(L, NULL, cast_sizet(tag), size); if (newblock == NULL) luaM_error(L); } - g->GCdebt += size; + g->GCdebt -= cast(l_mem, size); return newblock; } } diff --git a/lua-5.4.7/src/loadlib.c b/src/loadlib.c similarity index 89% rename from lua-5.4.7/src/loadlib.c rename to src/loadlib.c index 6d289fc..8d2e68e 100644 --- a/lua-5.4.7/src/loadlib.c +++ b/src/loadlib.c @@ -22,6 +22,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" /* @@ -58,11 +59,8 @@ static const char *const CLIBS = "_CLIBS"; #define setprogdir(L) ((void)0) -/* -** Special type equivalent to '(void*)' for functions in gcc -** (to suppress warnings when converting function pointers) -*/ -typedef void (*voidf)(void); +/* cast void* to a Lua function */ +#define cast_Lfunc(p) cast(lua_CFunction, cast_func(p)) /* @@ -95,26 +93,13 @@ static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym); #if defined(LUA_USE_DLOPEN) /* { */ /* ** {======================================================================== -** This is an implementation of loadlib based on the dlfcn interface. -** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, -** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least -** as an emulation layer on top of native functions. +** This is an implementation of loadlib based on the dlfcn interface, +** which is available in all POSIX systems. ** ========================================================================= */ #include -/* -** Macro to convert pointer-to-void* to pointer-to-function. This cast -** is undefined according to ISO C, but POSIX assumes that it works. -** (The '__extension__' in gnu compilers is only to avoid warnings.) -*/ -#if defined(__GNUC__) -#define cast_func(p) (__extension__ (lua_CFunction)(p)) -#else -#define cast_func(p) ((lua_CFunction)(p)) -#endif - static void lsys_unloadlib (void *lib) { dlclose(lib); @@ -130,7 +115,7 @@ static void *lsys_load (lua_State *L, const char *path, int seeglb) { static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { - lua_CFunction f = cast_func(dlsym(lib, sym)); + lua_CFunction f = cast_Lfunc(dlsym(lib, sym)); if (l_unlikely(f == NULL)) lua_pushstring(L, dlerror()); return f; @@ -206,7 +191,7 @@ static void *lsys_load (lua_State *L, const char *path, int seeglb) { static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { - lua_CFunction f = (lua_CFunction)(voidf)GetProcAddress((HMODULE)lib, sym); + lua_CFunction f = cast_Lfunc(GetProcAddress((HMODULE)lib, sym)); if (f == NULL) pusherror(L); return f; } @@ -283,7 +268,8 @@ static int noenv (lua_State *L) { /* -** Set a path +** Set a path. (If using the default path, assume it is a string +** literal in C and create it as an external string.) */ static void setpath (lua_State *L, const char *fieldname, const char *envname, @@ -294,7 +280,7 @@ static void setpath (lua_State *L, const char *fieldname, if (path == NULL) /* no versioned environment variable? */ path = getenv(envname); /* try unversioned name */ if (path == NULL || noenv(L)) /* no environment variable? */ - lua_pushstring(L, dft); /* use default */ + lua_pushexternalstring(L, dft, strlen(dft), NULL, NULL); /* use default */ else if ((dftmark = strstr(path, LUA_PATH_SEP LUA_PATH_SEP)) == NULL) lua_pushstring(L, path); /* nothing to change */ else { /* path contains a ";;": insert default path in its place */ @@ -302,13 +288,13 @@ static void setpath (lua_State *L, const char *fieldname, luaL_Buffer b; luaL_buffinit(L, &b); if (path < dftmark) { /* is there a prefix before ';;'? */ - luaL_addlstring(&b, path, dftmark - path); /* add it */ + luaL_addlstring(&b, path, ct_diff2sz(dftmark - path)); /* add it */ luaL_addchar(&b, *LUA_PATH_SEP); } luaL_addstring(&b, dft); /* add default */ if (dftmark < path + len - 2) { /* is there a suffix after ';;'? */ luaL_addchar(&b, *LUA_PATH_SEP); - luaL_addlstring(&b, dftmark + 2, (path + len - 2) - dftmark); + luaL_addlstring(&b, dftmark + 2, ct_diff2sz((path + len - 2) - dftmark)); } luaL_pushresult(&b); } @@ -320,6 +306,16 @@ static void setpath (lua_State *L, const char *fieldname, /* }================================================================== */ +/* +** External strings created by DLLs may need the DLL code to be +** deallocated. This implies that a DLL can only be unloaded after all +** its strings were deallocated. To ensure that, we create a 'library +** string' to represent each DLL, and when this string is deallocated +** it closes its corresponding DLL. +** (The string itself is irrelevant; its userdata is the DLL pointer.) +*/ + + /* ** return registry.CLIBS[path] */ @@ -334,34 +330,41 @@ static void *checkclib (lua_State *L, const char *path) { /* -** registry.CLIBS[path] = plib -- for queries -** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries +** Deallocate function for library strings. +** Unload the DLL associated with the string being deallocated. */ -static void addtoclib (lua_State *L, const char *path, void *plib) { - lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); - lua_pushlightuserdata(L, plib); - lua_pushvalue(L, -1); - lua_setfield(L, -3, path); /* CLIBS[path] = plib */ - lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */ - lua_pop(L, 1); /* pop CLIBS table */ +static void *freelib (void *ud, void *ptr, size_t osize, size_t nsize) { + /* string itself is irrelevant and static */ + (void)ptr; (void)osize; (void)nsize; + lsys_unloadlib(ud); /* unload library represented by the string */ + return NULL; } /* -** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib -** handles in list CLIBS +** Create a library string that, when deallocated, will unload 'plib' */ -static int gctm (lua_State *L) { - lua_Integer n = luaL_len(L, 1); - for (; n >= 1; n--) { /* for each handle, in reverse order */ - lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */ - lsys_unloadlib(lua_touserdata(L, -1)); - lua_pop(L, 1); /* pop handle */ - } - return 0; +static void createlibstr (lua_State *L, void *plib) { + /* common content for all library strings */ + static const char dummy[] = "01234567890"; + lua_pushexternalstring(L, dummy, sizeof(dummy) - 1, freelib, plib); } +/* +** registry.CLIBS[path] = plib -- for queries. +** Also create a reference to strlib, so that the library string will +** only be collected when registry.CLIBS is collected. +*/ +static void addtoclib (lua_State *L, const char *path, void *plib) { + lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); + lua_pushlightuserdata(L, plib); + lua_setfield(L, -2, path); /* CLIBS[path] = plib */ + createlibstr(L, plib); + luaL_ref(L, -2); /* keep library string in CLIBS */ + lua_pop(L, 1); /* pop CLIBS table */ +} + /* error codes for 'lookforfunc' */ #define ERRLIB 1 @@ -375,8 +378,8 @@ static int gctm (lua_State *L) { ** Then, if 'sym' is '*', return true (as library has been loaded). ** Otherwise, look for symbol 'sym' in the library and push a ** C function with that symbol. -** Return 0 and 'true' or a function in the stack; in case of -** errors, return an error code and an error message in the stack. +** Return 0 with 'true' or a function in the stack; in case of +** errors, return an error code with an error message in the stack. */ static int lookforfunc (lua_State *L, const char *path, const char *sym) { void *reg = checkclib(L, path); /* check loaded C libraries */ @@ -557,7 +560,7 @@ static int loadfunc (lua_State *L, const char *filename, const char *modname) { mark = strchr(modname, *LUA_IGMARK); if (mark) { int stat; - openfunc = lua_pushlstring(L, modname, mark - modname); + openfunc = lua_pushlstring(L, modname, ct_diff2sz(mark - modname)); openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc); stat = lookforfunc(L, filename, openfunc); if (stat != ERRFUNC) return stat; @@ -582,7 +585,7 @@ static int searcher_Croot (lua_State *L) { const char *p = strchr(name, '.'); int stat; if (p == NULL) return 0; /* is root */ - lua_pushlstring(L, name, p - name); + lua_pushlstring(L, name, ct_diff2sz(p - name)); filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP); if (filename == NULL) return 1; /* root not found */ if ((stat = loadfunc(L, filename, name)) != 0) { @@ -620,12 +623,12 @@ static void findloader (lua_State *L, const char *name) { != LUA_TTABLE)) luaL_error(L, "'package.searchers' must be a table"); luaL_buffinit(L, &msg); + luaL_addstring(&msg, "\n\t"); /* error-message prefix for first message */ /* iterate over available searchers to find a loader */ for (i = 1; ; i++) { - luaL_addstring(&msg, "\n\t"); /* error-message prefix */ if (l_unlikely(lua_rawgeti(L, 3, i) == LUA_TNIL)) { /* no more searchers? */ lua_pop(L, 1); /* remove nil */ - luaL_buffsub(&msg, 2); /* remove prefix */ + luaL_buffsub(&msg, 2); /* remove last prefix */ luaL_pushresult(&msg); /* create error message */ luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1)); } @@ -636,11 +639,10 @@ static void findloader (lua_State *L, const char *name) { else if (lua_isstring(L, -2)) { /* searcher returned error message? */ lua_pop(L, 1); /* remove extra return */ luaL_addvalue(&msg); /* concatenate error message */ + luaL_addstring(&msg, "\n\t"); /* prefix for next message */ } - else { /* no error message */ + else /* no error message */ lua_pop(L, 2); /* remove both returns */ - luaL_buffsub(&msg, 2); /* remove prefix */ - } } } @@ -719,21 +721,9 @@ static void createsearcherstable (lua_State *L) { } -/* -** create table CLIBS to keep track of loaded C libraries, -** setting a finalizer to close all libraries when closing state. -*/ -static void createclibstable (lua_State *L) { - luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); /* create CLIBS table */ - lua_createtable(L, 0, 1); /* create metatable for CLIBS */ - lua_pushcfunction(L, gctm); - lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ - lua_setmetatable(L, -2); -} - - LUAMOD_API int luaopen_package (lua_State *L) { - createclibstable(L); + luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); /* create CLIBS table */ + lua_pop(L, 1); /* will not use it now */ luaL_newlib(L, pk_funcs); /* create 'package' table */ createsearcherstable(L); /* set paths */ diff --git a/lua-5.4.7/src/lobject.c b/src/lobject.c similarity index 61% rename from lua-5.4.7/src/lobject.c rename to src/lobject.c index 9cfa522..763b484 100644 --- a/lua-5.4.7/src/lobject.c +++ b/src/lobject.c @@ -10,6 +10,7 @@ #include "lprefix.h" +#include #include #include #include @@ -30,10 +31,11 @@ /* -** Computes ceil(log2(x)) +** Computes ceil(log2(x)), which is the smallest integer n such that +** x <= (1 << n). */ -int luaO_ceillog2 (unsigned int x) { - static const lu_byte log_2[256] = { /* log_2[i] = ceil(log2(i - 1)) */ +lu_byte luaO_ceillog2 (unsigned int x) { + static const lu_byte log_2[256] = { /* log_2[i - 1] = ceil(log2(i)) */ 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, @@ -46,7 +48,67 @@ int luaO_ceillog2 (unsigned int x) { int l = 0; x--; while (x >= 256) { l += 8; x >>= 8; } - return l + log_2[x]; + return cast_byte(l + log_2[x]); +} + +/* +** Encodes 'p'% as a floating-point byte, represented as (eeeexxxx). +** The exponent is represented using excess-7. Mimicking IEEE 754, the +** representation normalizes the number when possible, assuming an extra +** 1 before the mantissa (xxxx) and adding one to the exponent (eeee) +** to signal that. So, the real value is (1xxxx) * 2^(eeee - 7 - 1) if +** eeee != 0, and (xxxx) * 2^-7 otherwise (subnormal numbers). +*/ +lu_byte luaO_codeparam (unsigned int p) { + if (p >= (cast(lu_mem, 0x1F) << (0xF - 7 - 1)) * 100u) /* overflow? */ + return 0xFF; /* return maximum value */ + else { + p = (cast(l_uint32, p) * 128 + 99) / 100; /* round up the division */ + if (p < 0x10) { /* subnormal number? */ + /* exponent bits are already zero; nothing else to do */ + return cast_byte(p); + } + else { /* p >= 0x10 implies ceil(log2(p + 1)) >= 5 */ + /* preserve 5 bits in 'p' */ + unsigned log = luaO_ceillog2(p + 1) - 5u; + return cast_byte(((p >> log) - 0x10) | ((log + 1) << 4)); + } + } +} + + +/* +** Computes 'p' times 'x', where 'p' is a floating-point byte. Roughly, +** we have to multiply 'x' by the mantissa and then shift accordingly to +** the exponent. If the exponent is positive, both the multiplication +** and the shift increase 'x', so we have to care only about overflows. +** For negative exponents, however, multiplying before the shift keeps +** more significant bits, as long as the multiplication does not +** overflow, so we check which order is best. +*/ +l_mem luaO_applyparam (lu_byte p, l_mem x) { + int m = p & 0xF; /* mantissa */ + int e = (p >> 4); /* exponent */ + if (e > 0) { /* normalized? */ + e--; /* correct exponent */ + m += 0x10; /* correct mantissa; maximum value is 0x1F */ + } + e -= 7; /* correct excess-7 */ + if (e >= 0) { + if (x < (MAX_LMEM / 0x1F) >> e) /* no overflow? */ + return (x * m) << e; /* order doesn't matter here */ + else /* real overflow */ + return MAX_LMEM; + } + else { /* negative exponent */ + e = -e; + if (x < MAX_LMEM / 0x1F) /* multiplication cannot overflow? */ + return (x * m) >> e; /* multiplying first gives more precision */ + else if ((x >> e) < MAX_LMEM / 0x1F) /* cannot overflow after shift? */ + return (x >> e) * m; + else /* real overflow */ + return MAX_LMEM; + } } @@ -132,9 +194,10 @@ void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, } -int luaO_hexavalue (int c) { - if (lisdigit(c)) return c - '0'; - else return (ltolower(c) - 'a') + 10; +lu_byte luaO_hexavalue (int c) { + lua_assert(lisxdigit(c)); + if (lisdigit(c)) return cast_byte(c - '0'); + else return cast_byte((ltolower(c) - 'a') + 10); } @@ -185,7 +248,7 @@ static lua_Number lua_strx2number (const char *s, char **endptr) { nosigdig++; else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */ r = (r * l_mathop(16.0)) + luaO_hexavalue(*s); - else e++; /* too many digits; ignore, but still count for exponent */ + else e++; /* too many digits; ignore, but still count for exponent */ if (hasdot) e--; /* decimal digit? correct exponent */ } else break; /* neither a dot nor a digit */ @@ -292,7 +355,7 @@ static const char *l_str2int (const char *s, lua_Integer *result) { int d = *s - '0'; if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ return NULL; /* do not accept it (as integer) */ - a = a * 10 + d; + a = a * 10 + cast_uint(d); empty = 0; } } @@ -316,14 +379,14 @@ size_t luaO_str2num (const char *s, TValue *o) { } else return 0; /* conversion failed */ - return (e - s) + 1; /* success; return string size */ + return ct_diff2sz(e - s) + 1; /* success; return string size */ } -int luaO_utf8esc (char *buff, unsigned long x) { +int luaO_utf8esc (char *buff, l_uint32 x) { int n = 1; /* number of bytes put in buffer (backwards) */ lua_assert(x <= 0x7FFFFFFFu); - if (x < 0x80) /* ascii? */ + if (x < 0x80) /* ASCII? */ buff[UTF8BUFFSZ - 1] = cast_char(x); else { /* need continuation bytes */ unsigned int mfb = 0x3f; /* maximum that fits in first byte */ @@ -339,32 +402,59 @@ int luaO_utf8esc (char *buff, unsigned long x) { /* -** Maximum length of the conversion of a number to a string. Must be -** enough to accommodate both LUA_INTEGER_FMT and LUA_NUMBER_FMT. -** (For a long long int, this is 19 digits plus a sign and a final '\0', -** adding to 21. For a long double, it can go to a sign, 33 digits, -** the dot, an exponent letter, an exponent sign, 5 exponent digits, -** and a final '\0', adding to 43.) +** The size of the buffer for the conversion of a number to a string +** 'LUA_N2SBUFFSZ' must be enough to accommodate both LUA_INTEGER_FMT +** and LUA_NUMBER_FMT. For a long long int, this is 19 digits plus a +** sign and a final '\0', adding to 21. For a long double, it can go to +** a sign, the dot, an exponent letter, an exponent sign, 4 exponent +** digits, the final '\0', plus the significant digits, which are +** approximately the *_DIG attribute. */ -#define MAXNUMBER2STR 44 +#if LUA_N2SBUFFSZ < (20 + l_floatatt(DIG)) +#error "invalid value for LUA_N2SBUFFSZ" +#endif /* -** Convert a number object to a string, adding it to a buffer +** Convert a float to a string, adding it to a buffer. First try with +** a not too large number of digits, to avoid noise (for instance, +** 1.1 going to "1.1000000000000001"). If that lose precision, so +** that reading the result back gives a different number, then do the +** conversion again with extra precision. Moreover, if the numeral looks +** like an integer (without a decimal point or an exponent), add ".0" to +** its end. */ -static int tostringbuff (TValue *obj, char *buff) { +static int tostringbuffFloat (lua_Number n, char *buff) { + /* first conversion */ + int len = l_sprintf(buff, LUA_N2SBUFFSZ, LUA_NUMBER_FMT, + (LUAI_UACNUMBER)n); + lua_Number check = lua_str2number(buff, NULL); /* read it back */ + if (check != n) { /* not enough precision? */ + /* convert again with more precision */ + len = l_sprintf(buff, LUA_N2SBUFFSZ, LUA_NUMBER_FMT_N, + (LUAI_UACNUMBER)n); + } + /* looks like an integer? */ + if (buff[strspn(buff, "-0123456789")] == '\0') { + buff[len++] = lua_getlocaledecpoint(); + buff[len++] = '0'; /* adds '.0' to result */ + } + return len; +} + + +/* +** Convert a number object to a string, adding it to a buffer. +*/ +unsigned luaO_tostringbuff (const TValue *obj, char *buff) { int len; lua_assert(ttisnumber(obj)); if (ttisinteger(obj)) - len = lua_integer2str(buff, MAXNUMBER2STR, ivalue(obj)); - else { - len = lua_number2str(buff, MAXNUMBER2STR, fltvalue(obj)); - if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */ - buff[len++] = lua_getlocaledecpoint(); - buff[len++] = '0'; /* adds '.0' to result */ - } - } - return len; + len = lua_integer2str(buff, LUA_N2SBUFFSZ, ivalue(obj)); + else + len = tostringbuffFloat(fltvalue(obj), buff); + lua_assert(len < LUA_N2SBUFFSZ); + return cast_uint(len); } @@ -372,8 +462,8 @@ static int tostringbuff (TValue *obj, char *buff) { ** Convert a number object to a Lua string, replacing the value at 'obj' */ void luaO_tostring (lua_State *L, TValue *obj) { - char buff[MAXNUMBER2STR]; - int len = tostringbuff(obj, buff); + char buff[LUA_N2SBUFFSZ]; + unsigned len = luaO_tostringbuff(obj, buff); setsvalue(L, obj, luaS_newlstr(L, buff, len)); } @@ -388,78 +478,104 @@ void luaO_tostring (lua_State *L, TValue *obj) { /* ** Size for buffer space used by 'luaO_pushvfstring'. It should be -** (LUA_IDSIZE + MAXNUMBER2STR) + a minimal space for basic messages, -** so that 'luaG_addinfo' can work directly on the buffer. +** (LUA_IDSIZE + LUA_N2SBUFFSZ) + a minimal space for basic messages, +** so that 'luaG_addinfo' can work directly on the static buffer. */ -#define BUFVFS (LUA_IDSIZE + MAXNUMBER2STR + 95) +#define BUFVFS cast_uint(LUA_IDSIZE + LUA_N2SBUFFSZ + 95) -/* buffer used by 'luaO_pushvfstring' */ +/* +** Buffer used by 'luaO_pushvfstring'. 'err' signals an error while +** building result (memory error [1] or buffer overflow [2]). +*/ typedef struct BuffFS { lua_State *L; - int pushed; /* true if there is a part of the result on the stack */ - int blen; /* length of partial string in 'space' */ - char space[BUFVFS]; /* holds last part of the result */ + char *b; + size_t buffsize; + size_t blen; /* length of string in 'buff' */ + int err; + char space[BUFVFS]; /* initial buffer */ } BuffFS; -/* -** Push given string to the stack, as part of the result, and -** join it to previous partial result if there is one. -** It may call 'luaV_concat' while using one slot from EXTRA_STACK. -** This call cannot invoke metamethods, as both operands must be -** strings. It can, however, raise an error if the result is too -** long. In that case, 'luaV_concat' frees the extra slot before -** raising the error. -*/ -static void pushstr (BuffFS *buff, const char *str, size_t lstr) { - lua_State *L = buff->L; - setsvalue2s(L, L->top.p, luaS_newlstr(L, str, lstr)); - L->top.p++; /* may use one slot from EXTRA_STACK */ - if (!buff->pushed) /* no previous string on the stack? */ - buff->pushed = 1; /* now there is one */ - else /* join previous string with new one */ - luaV_concat(L, 2); +static void initbuff (lua_State *L, BuffFS *buff) { + buff->L = L; + buff->b = buff->space; + buff->buffsize = sizeof(buff->space); + buff->blen = 0; + buff->err = 0; } /* -** empty the buffer space into the stack +** Push final result from 'luaO_pushvfstring'. This function may raise +** errors explicitly or through memory errors, so it must run protected. */ -static void clearbuff (BuffFS *buff) { - pushstr(buff, buff->space, buff->blen); /* push buffer contents */ - buff->blen = 0; /* space now is empty */ +static void pushbuff (lua_State *L, void *ud) { + BuffFS *buff = cast(BuffFS*, ud); + switch (buff->err) { + case 1: /* memory error */ + luaD_throw(L, LUA_ERRMEM); + break; + case 2: /* length overflow: Add "..." at the end of result */ + if (buff->buffsize - buff->blen < 3) + strcpy(buff->b + buff->blen - 3, "..."); /* 'blen' must be > 3 */ + else { /* there is enough space left for the "..." */ + strcpy(buff->b + buff->blen, "..."); + buff->blen += 3; + } + /* FALLTHROUGH */ + default: { /* no errors, but it can raise one creating the new string */ + TString *ts = luaS_newlstr(L, buff->b, buff->blen); + setsvalue2s(L, L->top.p, ts); + L->top.p++; + } + } } -/* -** Get a space of size 'sz' in the buffer. If buffer has not enough -** space, empty it. 'sz' must fit in an empty buffer. -*/ -static char *getbuff (BuffFS *buff, int sz) { - lua_assert(buff->blen <= BUFVFS); lua_assert(sz <= BUFVFS); - if (sz > BUFVFS - buff->blen) /* not enough space? */ - clearbuff(buff); - return buff->space + buff->blen; +static const char *clearbuff (BuffFS *buff) { + lua_State *L = buff->L; + const char *res; + if (luaD_rawrunprotected(L, pushbuff, buff) != LUA_OK) /* errors? */ + res = NULL; /* error message is on the top of the stack */ + else + res = getstr(tsvalue(s2v(L->top.p - 1))); + if (buff->b != buff->space) /* using dynamic buffer? */ + luaM_freearray(L, buff->b, buff->buffsize); /* free it */ + return res; } -#define addsize(b,sz) ((b)->blen += (sz)) - - -/* -** Add 'str' to the buffer. If string is larger than the buffer space, -** push the string directly to the stack. -*/ static void addstr2buff (BuffFS *buff, const char *str, size_t slen) { - if (slen <= BUFVFS) { /* does string fit into buffer? */ - char *bf = getbuff(buff, cast_int(slen)); - memcpy(bf, str, slen); /* add string to buffer */ - addsize(buff, cast_int(slen)); - } - else { /* string larger than buffer */ - clearbuff(buff); /* string comes after buffer's content */ - pushstr(buff, str, slen); /* push string */ + size_t left = buff->buffsize - buff->blen; /* space left in the buffer */ + if (buff->err) /* do nothing else after an error */ + return; + if (slen > left) { /* new string doesn't fit into current buffer? */ + if (slen > ((MAX_SIZE/2) - buff->blen)) { /* overflow? */ + memcpy(buff->b + buff->blen, str, left); /* copy what it can */ + buff->blen = buff->buffsize; + buff->err = 2; /* doesn't add anything else */ + return; + } + else { + size_t newsize = buff->buffsize + slen; /* limited to MAX_SIZE/2 */ + char *newb = + (buff->b == buff->space) /* still using static space? */ + ? luaM_reallocvector(buff->L, NULL, 0, newsize, char) + : luaM_reallocvector(buff->L, buff->b, buff->buffsize, newsize, + char); + if (newb == NULL) { /* allocation error? */ + buff->err = 1; /* signal a memory error */ + return; + } + if (buff->b == buff->space) /* new buffer (not reallocated)? */ + memcpy(newb, buff->b, buff->blen); /* copy previous content */ + buff->b = newb; /* set new (larger) buffer... */ + buff->buffsize = newsize; /* ...and its new size */ + } } + memcpy(buff->b + buff->blen, str, slen); /* copy new content */ + buff->blen += slen; } @@ -467,9 +583,9 @@ static void addstr2buff (BuffFS *buff, const char *str, size_t slen) { ** Add a numeral to the buffer. */ static void addnum2buff (BuffFS *buff, TValue *num) { - char *numbuff = getbuff(buff, MAXNUMBER2STR); - int len = tostringbuff(num, numbuff); /* format number into 'numbuff' */ - addsize(buff, len); + char numbuff[LUA_N2SBUFFSZ]; + unsigned len = luaO_tostringbuff(num, numbuff); + addstr2buff(buff, numbuff, len); } @@ -480,10 +596,9 @@ static void addnum2buff (BuffFS *buff, TValue *num) { const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { BuffFS buff; /* holds last part of the result */ const char *e; /* points to next '%' */ - buff.pushed = buff.blen = 0; - buff.L = L; + initbuff(L, &buff); while ((e = strchr(fmt, '%')) != NULL) { - addstr2buff(&buff, fmt, e - fmt); /* add 'fmt' up to '%' */ + addstr2buff(&buff, fmt, ct_diff2sz(e - fmt)); /* add 'fmt' up to '%' */ switch (*(e + 1)) { /* conversion specifier */ case 's': { /* zero-terminated string */ const char *s = va_arg(argp, char *); @@ -492,7 +607,7 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { break; } case 'c': { /* an 'int' as a character */ - char c = cast_uchar(va_arg(argp, int)); + char c = cast_char(va_arg(argp, int)); addstr2buff(&buff, &c, sizeof(char)); break; } @@ -504,7 +619,7 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { } case 'I': { /* a 'lua_Integer' */ TValue num; - setivalue(&num, cast(lua_Integer, va_arg(argp, l_uacInt))); + setivalue(&num, cast_Integer(va_arg(argp, l_uacInt))); addnum2buff(&buff, &num); break; } @@ -515,17 +630,17 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { break; } case 'p': { /* a pointer */ - const int sz = 3 * sizeof(void*) + 8; /* enough space for '%p' */ - char *bf = getbuff(&buff, sz); + char bf[LUA_N2SBUFFSZ]; /* enough space for '%p' */ void *p = va_arg(argp, void *); - int len = lua_pointer2str(bf, sz, p); - addsize(&buff, len); + int len = lua_pointer2str(bf, LUA_N2SBUFFSZ, p); + addstr2buff(&buff, bf, cast_uint(len)); break; } - case 'U': { /* a 'long' as a UTF-8 sequence */ + case 'U': { /* an 'unsigned long' as a UTF-8 sequence */ char bf[UTF8BUFFSZ]; - int len = luaO_utf8esc(bf, va_arg(argp, long)); - addstr2buff(&buff, bf + UTF8BUFFSZ - len, len); + unsigned long arg = va_arg(argp, unsigned long); + int len = luaO_utf8esc(bf, cast(l_uint32, arg)); + addstr2buff(&buff, bf + UTF8BUFFSZ - len, cast_uint(len)); break; } case '%': { @@ -533,16 +648,14 @@ const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { break; } default: { - luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'", - *(e + 1)); + addstr2buff(&buff, e, 2); /* keep unknown format in the result */ + break; } } fmt = e + 2; /* skip '%' and the specifier */ } addstr2buff(&buff, fmt, strlen(fmt)); /* rest of 'fmt' */ - clearbuff(&buff); /* empty buffer into the stack */ - lua_assert(buff.pushed == 1); - return getstr(tsvalue(s2v(L->top.p - 1))); + return clearbuff(&buff); /* empty buffer into a new string */ } @@ -552,6 +665,8 @@ const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { va_start(argp, fmt); msg = luaO_pushvfstring(L, fmt, argp); va_end(argp); + if (msg == NULL) /* error? */ + luaD_throw(L, LUA_ERRMEM); return msg; } @@ -591,7 +706,8 @@ void luaO_chunkid (char *out, const char *source, size_t srclen) { addstr(out, source, srclen); /* keep it */ } else { - if (nl != NULL) srclen = nl - source; /* stop at first newline */ + if (nl != NULL) + srclen = ct_diff2sz(nl - source); /* stop at first newline */ if (srclen > bufflen) srclen = bufflen; addstr(out, source, srclen); addstr(out, RETS, LL(RETS)); diff --git a/lua-5.4.7/src/lopcodes.c b/src/lopcodes.c similarity index 79% rename from lua-5.4.7/src/lopcodes.c rename to src/lopcodes.c index c67aa22..7e18231 100644 --- a/lua-5.4.7/src/lopcodes.c +++ b/src/lopcodes.c @@ -13,6 +13,10 @@ #include "lopcodes.h" +#define opmode(mm,ot,it,t,a,m) \ + (((mm) << 7) | ((ot) << 6) | ((it) << 5) | ((t) << 4) | ((a) << 3) | (m)) + + /* ORDER OP */ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { @@ -36,7 +40,7 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETTABLE */ ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETI */ ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETFIELD */ - ,opmode(0, 0, 0, 0, 1, iABC) /* OP_NEWTABLE */ + ,opmode(0, 0, 0, 0, 1, ivABC) /* OP_NEWTABLE */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SELF */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDI */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDK */ @@ -49,8 +53,8 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BANDK */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BORK */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BXORK */ - ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHRI */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHLI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHRI */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADD */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUB */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MUL */ @@ -64,8 +68,8 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHL */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHR */ ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBIN */ - ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINI*/ - ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINK*/ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINI */ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINK */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_UNM */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BNOT */ ,opmode(0, 0, 0, 0, 1, iABC) /* OP_NOT */ @@ -95,10 +99,42 @@ LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { ,opmode(0, 0, 0, 0, 0, iABx) /* OP_TFORPREP */ ,opmode(0, 0, 0, 0, 0, iABC) /* OP_TFORCALL */ ,opmode(0, 0, 0, 0, 1, iABx) /* OP_TFORLOOP */ - ,opmode(0, 0, 1, 0, 0, iABC) /* OP_SETLIST */ + ,opmode(0, 0, 1, 0, 0, ivABC) /* OP_SETLIST */ ,opmode(0, 0, 0, 0, 1, iABx) /* OP_CLOSURE */ ,opmode(0, 1, 0, 0, 1, iABC) /* OP_VARARG */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETVARG */ + ,opmode(0, 0, 0, 0, 0, iABx) /* OP_ERRNNIL */ ,opmode(0, 0, 1, 0, 1, iABC) /* OP_VARARGPREP */ ,opmode(0, 0, 0, 0, 0, iAx) /* OP_EXTRAARG */ }; + + +/* +** Check whether instruction sets top for next instruction, that is, +** it results in multiple values. +*/ +int luaP_isOT (Instruction i) { + OpCode op = GET_OPCODE(i); + switch (op) { + case OP_TAILCALL: return 1; + default: + return testOTMode(op) && GETARG_C(i) == 0; + } +} + + +/* +** Check whether instruction uses top from previous instruction, that is, +** it accepts multiple results. +*/ +int luaP_isIT (Instruction i) { + OpCode op = GET_OPCODE(i); + switch (op) { + case OP_SETLIST: + return testITMode(GET_OPCODE(i)) && GETARG_vB(i) == 0; + default: + return testITMode(GET_OPCODE(i)) && GETARG_B(i) == 0; + } +} + diff --git a/lua-5.4.7/src/loslib.c b/src/loslib.c similarity index 97% rename from lua-5.4.7/src/loslib.c rename to src/loslib.c index ba80d72..b7a2b0d 100644 --- a/lua-5.4.7/src/loslib.c +++ b/src/loslib.c @@ -20,6 +20,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" /* @@ -33,7 +34,7 @@ #if defined(LUA_USE_WINDOWS) #define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYzZ%" \ "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */ -#elif defined(LUA_USE_C89) /* ANSI C 89 (only 1-char options) */ +#elif defined(LUA_USE_C89) /* C89 (only 1-char options) */ #define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYZ%" #else /* C99 specification */ #define LUA_STRFTIMEOPTIONS "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \ @@ -272,9 +273,9 @@ static int getfield (lua_State *L, const char *key, int d, int delta) { static const char *checkoption (lua_State *L, const char *conv, - ptrdiff_t convlen, char *buff) { + size_t convlen, char *buff) { const char *option = LUA_STRFTIMEOPTIONS; - int oplen = 1; /* length of options being checked */ + unsigned oplen = 1; /* length of options being checked */ for (; *option != '\0' && oplen <= convlen; option += oplen) { if (*option == '|') /* next block? */ oplen++; /* will check options with next length (+1) */ @@ -332,7 +333,8 @@ static int os_date (lua_State *L) { size_t reslen; char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT); s++; /* skip '%' */ - s = checkoption(L, s, se - s, cc + 1); /* copy specifier to 'cc' */ + /* copy specifier to 'cc' */ + s = checkoption(L, s, ct_diff2sz(se - s), cc + 1); reslen = strftime(buff, SIZETIMEFMT, cc, stm); luaL_addsize(&b, reslen); } diff --git a/lua-5.4.7/src/lparser.c b/src/lparser.c similarity index 69% rename from lua-5.4.7/src/lparser.c rename to src/lparser.c index 2b888c7..b3855d4 100644 --- a/lua-5.4.7/src/lparser.c +++ b/src/lparser.c @@ -30,8 +30,8 @@ -/* maximum number of local variables per function (must be smaller - than 250, due to the bytecode format) */ +/* maximum number of variable declarations per function (must be + smaller than 250, due to the bytecode format) */ #define MAXVARS 200 @@ -50,9 +50,9 @@ typedef struct BlockCnt { struct BlockCnt *previous; /* chain */ int firstlabel; /* index of first label in this block */ int firstgoto; /* index of first pending goto in this block */ - lu_byte nactvar; /* # active locals outside the block */ + short nactvar; /* number of active declarations at block entry */ lu_byte upval; /* true if some variable in the block is an upvalue */ - lu_byte isloop; /* true if 'block' is a loop */ + lu_byte isloop; /* 1 if 'block' is a loop; 2 if it has pending breaks */ lu_byte insidetbc; /* true if inside the scope of a to-be-closed var. */ } BlockCnt; @@ -84,8 +84,8 @@ static l_noret errorlimit (FuncState *fs, int limit, const char *what) { } -static void checklimit (FuncState *fs, int v, int l, const char *what) { - if (v > l) errorlimit(fs, l, what); +void luaY_checklimit (FuncState *fs, int v, int l, const char *what) { + if (l_unlikely(v > l)) errorlimit(fs, l, what); } @@ -172,7 +172,8 @@ static void codename (LexState *ls, expdesc *e) { ** Register a new local variable in the active 'Proto' (for debug ** information). */ -static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) { +static short registerlocalvar (LexState *ls, FuncState *fs, + TString *varname) { Proto *f = fs->f; int oldsize = f->sizelocvars; luaM_growvector(ls->L, f->locvars, fs->ndebugvars, f->sizelocvars, @@ -187,24 +188,30 @@ static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) { /* -** Create a new local variable with the given 'name'. Return its index -** in the function. +** Create a new variable with the given 'name' and given 'kind'. +** Return its index in the function. */ -static int new_localvar (LexState *ls, TString *name) { +static int new_varkind (LexState *ls, TString *name, lu_byte kind) { lua_State *L = ls->L; FuncState *fs = ls->fs; Dyndata *dyd = ls->dyd; Vardesc *var; - checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal, - MAXVARS, "local variables"); luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1, - dyd->actvar.size, Vardesc, USHRT_MAX, "local variables"); + dyd->actvar.size, Vardesc, SHRT_MAX, "variable declarations"); var = &dyd->actvar.arr[dyd->actvar.n++]; - var->vd.kind = VDKREG; /* default */ + var->vd.kind = kind; /* default */ var->vd.name = name; return dyd->actvar.n - 1 - fs->firstlocal; } + +/* +** Create a new local variable with the given 'name' and regular kind. +*/ +static int new_localvar (LexState *ls, TString *name) { + return new_varkind(ls, name, VDKREG); +} + #define new_localvarliteral(ls,v) \ new_localvar(ls, \ luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1)); @@ -226,11 +233,11 @@ static Vardesc *getlocalvardesc (FuncState *fs, int vidx) { ** register. For that, search for the highest variable below that level ** that is in a register and uses its register index ('ridx') plus one. */ -static int reglevel (FuncState *fs, int nvar) { +static lu_byte reglevel (FuncState *fs, int nvar) { while (nvar-- > 0) { Vardesc *vd = getlocalvardesc(fs, nvar); /* get previous variable */ - if (vd->vd.kind != RDKCTC) /* is in a register? */ - return vd->vd.ridx + 1; + if (varinreg(vd)) /* is in a register? */ + return cast_byte(vd->vd.ridx + 1); } return 0; /* no variables in registers */ } @@ -240,7 +247,7 @@ static int reglevel (FuncState *fs, int nvar) { ** Return the number of variables in the register stack for the given ** function. */ -int luaY_nvarstack (FuncState *fs) { +lu_byte luaY_nvarstack (FuncState *fs) { return reglevel(fs, fs->nactvar); } @@ -250,7 +257,7 @@ int luaY_nvarstack (FuncState *fs) { */ static LocVar *localdebuginfo (FuncState *fs, int vidx) { Vardesc *vd = getlocalvardesc(fs, vidx); - if (vd->vd.kind == RDKCTC) + if (!varinreg(vd)) return NULL; /* no debug info. for constants */ else { int idx = vd->vd.pidx; @@ -266,13 +273,15 @@ static LocVar *localdebuginfo (FuncState *fs, int vidx) { static void init_var (FuncState *fs, expdesc *e, int vidx) { e->f = e->t = NO_JUMP; e->k = VLOCAL; - e->u.var.vidx = vidx; + e->u.var.vidx = cast_short(vidx); e->u.var.ridx = getlocalvardesc(fs, vidx)->vd.ridx; } /* -** Raises an error if variable described by 'e' is read only +** Raises an error if variable described by 'e' is read only; moreover, +** if 'e' is t[exp] where t is the vararg parameter, change it to index +** a real table. (Virtual vararg tables cannot be changed.) */ static void check_readonly (LexState *ls, expdesc *e) { FuncState *fs = ls->fs; @@ -282,7 +291,7 @@ static void check_readonly (LexState *ls, expdesc *e) { varname = ls->dyd->actvar.arr[e->u.info].vd.name; break; } - case VLOCAL: { + case VLOCAL: case VVARGVAR: { Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx); if (vardesc->vd.kind != VDKREG) /* not a regular variable? */ varname = vardesc->vd.name; @@ -294,14 +303,22 @@ static void check_readonly (LexState *ls, expdesc *e) { varname = up->name; break; } + case VVARGIND: { + needvatab(fs->f); /* function will need a vararg table */ + e->k = VINDEXED; + } /* FALLTHROUGH */ + case VINDEXUP: case VINDEXSTR: case VINDEXED: { /* global variable */ + if (e->u.ind.ro) /* read-only? */ + varname = tsvalue(&fs->f->k[e->u.ind.keystr]); + break; + } default: - return; /* other cases cannot be read-only */ - } - if (varname) { - const char *msg = luaO_pushfstring(ls->L, - "attempt to assign to const variable '%s'", getstr(varname)); - luaK_semerror(ls, msg); /* error */ + lua_assert(e->k == VINDEXI); /* this one doesn't need any check */ + return; /* integer index cannot be read-only */ } + if (varname) + luaK_semerror(ls, "attempt to assign to const variable '%s'", + getstr(varname)); } @@ -315,8 +332,9 @@ static void adjustlocalvars (LexState *ls, int nvars) { for (i = 0; i < nvars; i++) { int vidx = fs->nactvar++; Vardesc *var = getlocalvardesc(fs, vidx); - var->vd.ridx = reglevel++; + var->vd.ridx = cast_byte(reglevel++); var->vd.pidx = registerlocalvar(ls, fs, var->vd.name); + luaY_checklimit(fs, reglevel, MAXVARS, "local variables"); } } @@ -352,7 +370,7 @@ static int searchupvalue (FuncState *fs, TString *name) { static Upvaldesc *allocupvalue (FuncState *fs) { Proto *f = fs->f; int oldsize = f->sizeupvalues; - checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); + luaY_checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, Upvaldesc, MAXUPVAL, "upvalues"); while (oldsize < f->sizeupvalues) @@ -383,20 +401,43 @@ static int newupvalue (FuncState *fs, TString *name, expdesc *v) { /* -** Look for an active local variable with the name 'n' in the +** Look for an active variable with the name 'n' in the ** function 'fs'. If found, initialize 'var' with it and return -** its expression kind; otherwise return -1. +** its expression kind; otherwise return -1. While searching, +** var->u.info==-1 means that the preambular global declaration is +** active (the default while there is no other global declaration); +** var->u.info==-2 means there is no active collective declaration +** (some previous global declaration but no collective declaration); +** and var->u.info>=0 points to the inner-most (the first one found) +** collective declaration, if there is one. */ static int searchvar (FuncState *fs, TString *n, expdesc *var) { int i; for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) { Vardesc *vd = getlocalvardesc(fs, i); - if (eqstr(n, vd->vd.name)) { /* found? */ + if (varglobal(vd)) { /* global declaration? */ + if (vd->vd.name == NULL) { /* collective declaration? */ + if (var->u.info < 0) /* no previous collective declaration? */ + var->u.info = fs->firstlocal + i; /* this is the first one */ + } + else { /* global name */ + if (eqstr(n, vd->vd.name)) { /* found? */ + init_exp(var, VGLOBAL, fs->firstlocal + i); + return VGLOBAL; + } + else if (var->u.info == -1) /* active preambular declaration? */ + var->u.info = -2; /* invalidate preambular declaration */ + } + } + else if (eqstr(n, vd->vd.name)) { /* found? */ if (vd->vd.kind == RDKCTC) /* compile-time constant? */ init_exp(var, VCONST, fs->firstlocal + i); - else /* real variable */ + else { /* local variable */ init_var(fs, var, i); - return var->k; + if (vd->vd.kind == RDKVAVAR) /* vararg parameter? */ + var->k = VVARGVAR; + } + return cast_int(var->k); } } return -1; /* not found */ @@ -433,48 +474,72 @@ static void marktobeclosed (FuncState *fs) { ** 'var' as 'void' as a flag. */ static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { - if (fs == NULL) /* no more levels? */ - init_exp(var, VVOID, 0); /* default is global */ - else { - int v = searchvar(fs, n, var); /* look up locals at current level */ - if (v >= 0) { /* found? */ - if (v == VLOCAL && !base) - markupval(fs, var->u.var.vidx); /* local will be used as an upval */ + int v = searchvar(fs, n, var); /* look up variables at current level */ + if (v >= 0) { /* found? */ + if (!base) { + if (var->k == VVARGVAR) /* vararg parameter? */ + luaK_vapar2local(fs, var); /* change it to a regular local */ + if (var->k == VLOCAL) + markupval(fs, var->u.var.vidx); /* will be used as an upvalue */ } - else { /* not found as local at current level; try upvalues */ - int idx = searchupvalue(fs, n); /* try existing upvalues */ - if (idx < 0) { /* not found? */ + /* else nothing else to be done */ + } + else { /* not found at current level; try upvalues */ + int idx = searchupvalue(fs, n); /* try existing upvalues */ + if (idx < 0) { /* not found? */ + if (fs->prev != NULL) /* more levels? */ singlevaraux(fs->prev, n, var, 0); /* try upper levels */ - if (var->k == VLOCAL || var->k == VUPVAL) /* local or upvalue? */ - idx = newupvalue(fs, n, var); /* will be a new upvalue */ - else /* it is a global or a constant */ - return; /* don't need to do anything at this level */ - } - init_exp(var, VUPVAL, idx); /* new or old upvalue */ + if (var->k == VLOCAL || var->k == VUPVAL) /* local or upvalue? */ + idx = newupvalue(fs, n, var); /* will be a new upvalue */ + else /* it is a global or a constant */ + return; /* don't need to do anything at this level */ } + init_exp(var, VUPVAL, idx); /* new or old upvalue */ } } +static void buildglobal (LexState *ls, TString *varname, expdesc *var) { + FuncState *fs = ls->fs; + expdesc key; + init_exp(var, VGLOBAL, -1); /* global by default */ + singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ + if (var->k == VGLOBAL) + luaK_semerror(ls, "%s is global when accessing variable '%s'", + LUA_ENV, getstr(varname)); + luaK_exp2anyregup(fs, var); /* _ENV could be a constant */ + codestring(&key, varname); /* key is variable name */ + luaK_indexed(fs, var, &key); /* 'var' represents _ENV[varname] */ +} + + /* ** Find a variable with the given name 'n', handling global variables ** too. */ -static void singlevar (LexState *ls, expdesc *var) { - TString *varname = str_checkname(ls); +static void buildvar (LexState *ls, TString *varname, expdesc *var) { FuncState *fs = ls->fs; + init_exp(var, VGLOBAL, -1); /* global by default */ singlevaraux(fs, varname, var, 1); - if (var->k == VVOID) { /* global name? */ - expdesc key; - singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ - lua_assert(var->k != VVOID); /* this one must exist */ - luaK_exp2anyregup(fs, var); /* but could be a constant */ - codestring(&key, varname); /* key is variable name */ - luaK_indexed(fs, var, &key); /* env[varname] */ + if (var->k == VGLOBAL) { /* global name? */ + int info = var->u.info; + /* global by default in the scope of a global declaration? */ + if (info == -2) + luaK_semerror(ls, "variable '%s' not declared", getstr(varname)); + buildglobal(ls, varname, var); + if (info != -1 && ls->dyd->actvar.arr[info].vd.kind == GDKCONST) + var->u.ind.ro = 1; /* mark variable as read-only */ + else /* anyway must be a global */ + lua_assert(info == -1 || ls->dyd->actvar.arr[info].vd.kind == GDKREG); } } +static void singlevar (LexState *ls, expdesc *var) { + buildvar(ls, str_checkname(ls), var); +} + + /* ** Adjust the number of results from an expression list 'e' with 'nexps' ** expressions to 'nvars' values. @@ -482,6 +547,7 @@ static void singlevar (LexState *ls, expdesc *var) { static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { FuncState *fs = ls->fs; int needed = nvars - nexps; /* extra values needed */ + luaK_checkstack(fs, needed); if (hasmultret(e->k)) { /* last expression has multiple returns? */ int extra = needed + 1; /* discount last expression itself */ if (extra < 0) @@ -497,7 +563,7 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { if (needed > 0) luaK_reserveregs(fs, needed); /* registers for extra values */ else /* adding 'needed' is actually a subtraction */ - fs->freereg += needed; /* remove extra values */ + fs->freereg = cast_byte(fs->freereg + needed); /* remove extra values */ } @@ -509,29 +575,43 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { /* ** Generates an error that a goto jumps into the scope of some -** local variable. +** variable declaration. */ static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) { - const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name); - const char *msg = " at line %d jumps into the scope of local '%s'"; - msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname); - luaK_semerror(ls, msg); /* raise the error */ + TString *tsname = getlocalvardesc(ls->fs, gt->nactvar)->vd.name; + const char *varname = (tsname != NULL) ? getstr(tsname) : "*"; + luaK_semerror(ls, + " at line %d jumps into the scope of '%s'", + getstr(gt->name), gt->line, varname); /* raise the error */ } /* -** Solves the goto at index 'g' to given 'label' and removes it +** Closes the goto at index 'g' to given 'label' and removes it ** from the list of pending gotos. ** If it jumps into the scope of some variable, raises an error. +** The goto needs a CLOSE if it jumps out of a block with upvalues, +** or out of the scope of some variable and the block has upvalues +** (signaled by parameter 'bup'). */ -static void solvegoto (LexState *ls, int g, Labeldesc *label) { +static void closegoto (LexState *ls, int g, Labeldesc *label, int bup) { int i; + FuncState *fs = ls->fs; Labellist *gl = &ls->dyd->gt; /* list of gotos */ Labeldesc *gt = &gl->arr[g]; /* goto to be resolved */ lua_assert(eqstr(gt->name, label->name)); if (l_unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */ jumpscopeerror(ls, gt); - luaK_patchlist(ls->fs, gt->pc, label->pc); + if (gt->close || + (label->nactvar < gt->nactvar && bup)) { /* needs close? */ + lu_byte stklevel = reglevel(fs, label->nactvar); + /* move jump to CLOSE position */ + fs->f->code[gt->pc + 1] = fs->f->code[gt->pc]; + /* put CLOSE instruction at original position */ + fs->f->code[gt->pc] = CREATE_ABCk(OP_CLOSE, stklevel, 0, 0, 0); + gt->pc++; /* must point to jump instruction */ + } + luaK_patchlist(ls->fs, gt->pc, label->pc); /* goto jumps to label */ for (i = g; i < gl->n - 1; i++) /* remove goto from pending list */ gl->arr[i] = gl->arr[i + 1]; gl->n--; @@ -539,14 +619,14 @@ static void solvegoto (LexState *ls, int g, Labeldesc *label) { /* -** Search for an active label with the given name. +** Search for an active label with the given name, starting at +** index 'ilb' (so that it can search for all labels in current block +** or all labels in current function). */ -static Labeldesc *findlabel (LexState *ls, TString *name) { - int i; +static Labeldesc *findlabel (LexState *ls, TString *name, int ilb) { Dyndata *dyd = ls->dyd; - /* check labels in current function for a match */ - for (i = ls->fs->firstlabel; i < dyd->label.n; i++) { - Labeldesc *lb = &dyd->label.arr[i]; + for (; ilb < dyd->label.n; ilb++) { + Labeldesc *lb = &dyd->label.arr[ilb]; if (eqstr(lb->name, name)) /* correct label? */ return lb; } @@ -572,29 +652,19 @@ static int newlabelentry (LexState *ls, Labellist *l, TString *name, } -static int newgotoentry (LexState *ls, TString *name, int line, int pc) { - return newlabelentry(ls, &ls->dyd->gt, name, line, pc); -} - - /* -** Solves forward jumps. Check whether new label 'lb' matches any -** pending gotos in current block and solves them. Return true -** if any of the gotos need to close upvalues. +** Create an entry for the goto and the code for it. As it is not known +** at this point whether the goto may need a CLOSE, the code has a jump +** followed by an CLOSE. (As the CLOSE comes after the jump, it is a +** dead instruction; it works as a placeholder.) When the goto is closed +** against a label, if it needs a CLOSE, the two instructions swap +** positions, so that the CLOSE comes before the jump. */ -static int solvegotos (LexState *ls, Labeldesc *lb) { - Labellist *gl = &ls->dyd->gt; - int i = ls->fs->bl->firstgoto; - int needsclose = 0; - while (i < gl->n) { - if (eqstr(gl->arr[i].name, lb->name)) { - needsclose |= gl->arr[i].close; - solvegoto(ls, i, lb); /* will remove 'i' from the list */ - } - else - i++; - } - return needsclose; +static int newgotoentry (LexState *ls, TString *name, int line) { + FuncState *fs = ls->fs; + int pc = luaK_jump(fs); /* create jump */ + luaK_codeABC(fs, OP_CLOSE, 0, 1, 0); /* spaceholder, marked as dead */ + return newlabelentry(ls, &ls->dyd->gt, name, line, pc); } @@ -605,8 +675,7 @@ static int solvegotos (LexState *ls, Labeldesc *lb) { ** a close instruction if necessary. ** Returns true iff it added a close instruction. */ -static int createlabel (LexState *ls, TString *name, int line, - int last) { +static void createlabel (LexState *ls, TString *name, int line, int last) { FuncState *fs = ls->fs; Labellist *ll = &ls->dyd->label; int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs)); @@ -614,28 +683,37 @@ static int createlabel (LexState *ls, TString *name, int line, /* assume that locals are already out of scope */ ll->arr[l].nactvar = fs->bl->nactvar; } - if (solvegotos(ls, &ll->arr[l])) { /* need close? */ - luaK_codeABC(fs, OP_CLOSE, luaY_nvarstack(fs), 0, 0); - return 1; - } - return 0; } /* -** Adjust pending gotos to outer level of a block. +** Traverse the pending gotos of the finishing block checking whether +** each match some label of that block. Those that do not match are +** "exported" to the outer block, to be solved there. In particular, +** its 'nactvar' is updated with the level of the inner block, +** as the variables of the inner block are now out of scope. */ -static void movegotosout (FuncState *fs, BlockCnt *bl) { - int i; - Labellist *gl = &fs->ls->dyd->gt; - /* correct pending gotos to current block */ - for (i = bl->firstgoto; i < gl->n; i++) { /* for each pending goto */ - Labeldesc *gt = &gl->arr[i]; - /* leaving a variable scope? */ - if (reglevel(fs, gt->nactvar) > reglevel(fs, bl->nactvar)) - gt->close |= bl->upval; /* jump may need a close */ - gt->nactvar = bl->nactvar; /* update goto level */ +static void solvegotos (FuncState *fs, BlockCnt *bl) { + LexState *ls = fs->ls; + Labellist *gl = &ls->dyd->gt; + int outlevel = reglevel(fs, bl->nactvar); /* level outside the block */ + int igt = bl->firstgoto; /* first goto in the finishing block */ + while (igt < gl->n) { /* for each pending goto */ + Labeldesc *gt = &gl->arr[igt]; + /* search for a matching label in the current block */ + Labeldesc *lb = findlabel(ls, gt->name, bl->firstlabel); + if (lb != NULL) /* found a match? */ + closegoto(ls, igt, lb, bl->upval); /* close and remove goto */ + else { /* adjust 'goto' for outer block */ + /* block has variables to be closed and goto escapes the scope of + some variable? */ + if (bl->upval && reglevel(fs, gt->nactvar) > outlevel) + gt->close = 1; /* jump may need a close */ + gt->nactvar = bl->nactvar; /* correct level for outer block */ + igt++; /* go to next goto */ + } } + ls->dyd->label.n = bl->firstlabel; /* remove local labels */ } @@ -645,8 +723,9 @@ static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { bl->firstlabel = fs->ls->dyd->label.n; bl->firstgoto = fs->ls->dyd->gt.n; bl->upval = 0; + /* inherit 'insidetbc' from enclosing block */ bl->insidetbc = (fs->bl != NULL && fs->bl->insidetbc); - bl->previous = fs->bl; + bl->previous = fs->bl; /* link block in function's block list */ fs->bl = bl; lua_assert(fs->freereg == luaY_nvarstack(fs)); } @@ -656,39 +735,30 @@ static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { ** generates an error for an undefined 'goto'. */ static l_noret undefgoto (LexState *ls, Labeldesc *gt) { - const char *msg; - if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) { - msg = "break outside loop at line %d"; - msg = luaO_pushfstring(ls->L, msg, gt->line); - } - else { - msg = "no visible label '%s' for at line %d"; - msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); - } - luaK_semerror(ls, msg); + /* breaks are checked when created, cannot be undefined */ + lua_assert(!eqstr(gt->name, ls->brkn)); + luaK_semerror(ls, "no visible label '%s' for at line %d", + getstr(gt->name), gt->line); } static void leaveblock (FuncState *fs) { BlockCnt *bl = fs->bl; LexState *ls = fs->ls; - int hasclose = 0; - int stklevel = reglevel(fs, bl->nactvar); /* level outside the block */ - removevars(fs, bl->nactvar); /* remove block locals */ - lua_assert(bl->nactvar == fs->nactvar); /* back to level on entry */ - if (bl->isloop) /* has to fix pending breaks? */ - hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); - if (!hasclose && bl->previous && bl->upval) /* still need a 'close'? */ + lu_byte stklevel = reglevel(fs, bl->nactvar); /* level outside block */ + if (bl->previous && bl->upval) /* need a 'close'? */ luaK_codeABC(fs, OP_CLOSE, stklevel, 0, 0); fs->freereg = stklevel; /* free registers */ - ls->dyd->label.n = bl->firstlabel; /* remove local labels */ - fs->bl = bl->previous; /* current block now is previous one */ - if (bl->previous) /* was it a nested block? */ - movegotosout(fs, bl); /* update pending gotos to enclosing block */ - else { + removevars(fs, bl->nactvar); /* remove block locals */ + lua_assert(bl->nactvar == fs->nactvar); /* back to level on entry */ + if (bl->isloop == 2) /* has to fix pending breaks? */ + createlabel(ls, ls->brkn, 0, 0); + solvegotos(fs, bl); + if (bl->previous == NULL) { /* was it the last block? */ if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */ undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ } + fs->bl = bl->previous; /* current block now is previous one */ } @@ -727,6 +797,7 @@ static void codeclosure (LexState *ls, expdesc *v) { static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { + lua_State *L = ls->L; Proto *f = fs->f; fs->prev = ls->fs; /* linked list of funcstates */ fs->ls = ls; @@ -747,8 +818,11 @@ static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { fs->firstlabel = ls->dyd->label.n; fs->bl = NULL; f->source = ls->source; - luaC_objbarrier(ls->L, f, f->source); + luaC_objbarrier(L, f, f->source); f->maxstacksize = 2; /* registers 0/1 are always valid */ + fs->kcache = luaH_new(L); /* create table for function */ + sethvalue2s(L, L->top.p, fs->kcache); /* anchor it */ + luaD_inctop(L); enterblock(fs, bl, 0); } @@ -770,14 +844,16 @@ static void close_func (LexState *ls) { luaM_shrinkvector(L, f->locvars, f->sizelocvars, fs->ndebugvars, LocVar); luaM_shrinkvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc); ls->fs = fs->prev; + L->top.p--; /* pop kcache table */ luaC_checkGC(L); } - -/*============================================================*/ -/* GRAMMAR RULES */ -/*============================================================*/ +/* +** {====================================================================== +** GRAMMAR RULES +** ======================================================================= +*/ /* @@ -834,25 +910,36 @@ static void yindex (LexState *ls, expdesc *v) { ** ======================================================================= */ - typedef struct ConsControl { expdesc v; /* last list item read */ expdesc *t; /* table descriptor */ int nh; /* total number of 'record' elements */ int na; /* number of array elements already stored */ int tostore; /* number of array elements pending to be stored */ + int maxtostore; /* maximum number of pending elements */ } ConsControl; +/* +** Maximum number of elements in a constructor, to control the following: +** * counter overflows; +** * overflows in 'extra' for OP_NEWTABLE and OP_SETLIST; +** * overflows when adding multiple returns in OP_SETLIST. +*/ +#define MAX_CNST (INT_MAX/2) +#if MAX_CNST/(MAXARG_vC + 1) > MAXARG_Ax +#undef MAX_CNST +#define MAX_CNST (MAXARG_Ax * (MAXARG_vC + 1)) +#endif + + static void recfield (LexState *ls, ConsControl *cc) { /* recfield -> (NAME | '['exp']') = exp */ FuncState *fs = ls->fs; - int reg = ls->fs->freereg; + lu_byte reg = ls->fs->freereg; expdesc tab, key, val; - if (ls->t.token == TK_NAME) { - checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); + if (ls->t.token == TK_NAME) codename(ls, &key); - } else /* ls->t.token == '[' */ yindex(ls, &key); cc->nh++; @@ -866,10 +953,10 @@ static void recfield (LexState *ls, ConsControl *cc) { static void closelistfield (FuncState *fs, ConsControl *cc) { - if (cc->v.k == VVOID) return; /* there is no list item */ + lua_assert(cc->tostore > 0); luaK_exp2nextreg(fs, &cc->v); cc->v.k = VVOID; - if (cc->tostore == LFIELDS_PER_FLUSH) { + if (cc->tostore >= cc->maxtostore) { luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */ cc->na += cc->tostore; cc->tostore = 0; /* no more items pending */ @@ -922,12 +1009,28 @@ static void field (LexState *ls, ConsControl *cc) { } +/* +** Compute a limit for how many registers a constructor can use before +** emitting a 'SETLIST' instruction, based on how many registers are +** available. +*/ +static int maxtostore (FuncState *fs) { + int numfreeregs = MAX_FSTACK - fs->freereg; + if (numfreeregs >= 160) /* "lots" of registers? */ + return numfreeregs / 5; /* use up to 1/5 of them */ + else if (numfreeregs >= 80) /* still "enough" registers? */ + return 10; /* one 'SETLIST' instruction for each 10 values */ + else /* save registers for potential more nesting */ + return 1; +} + + static void constructor (LexState *ls, expdesc *t) { /* constructor -> '{' [ field { sep field } [sep] ] '}' sep -> ',' | ';' */ FuncState *fs = ls->fs; int line = ls->linenumber; - int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + int pc = luaK_codevABCk(fs, OP_NEWTABLE, 0, 0, 0, 0); ConsControl cc; luaK_code(fs, 0); /* space for extra arg. */ cc.na = cc.nh = cc.tostore = 0; @@ -935,14 +1038,17 @@ static void constructor (LexState *ls, expdesc *t) { init_exp(t, VNONRELOC, fs->freereg); /* table will be at stack top */ luaK_reserveregs(fs, 1); init_exp(&cc.v, VVOID, 0); /* no value (yet) */ - checknext(ls, '{'); + checknext(ls, '{' /*}*/); + cc.maxtostore = maxtostore(fs); do { - lua_assert(cc.v.k == VVOID || cc.tostore > 0); - if (ls->t.token == '}') break; - closelistfield(fs, &cc); + if (ls->t.token == /*{*/ '}') break; + if (cc.v.k != VVOID) /* is there a previous list item? */ + closelistfield(fs, &cc); /* close it */ field(ls, &cc); + luaY_checklimit(fs, cc.tostore + cc.na + cc.nh, MAX_CNST, + "items in a constructor"); } while (testnext(ls, ',') || testnext(ls, ';')); - check_match(ls, '}', '{', line); + check_match(ls, /*{*/ '}', '{' /*}*/, line); lastlistfield(fs, &cc); luaK_settablesize(fs, pc, t->u.info, cc.na, cc.nh); } @@ -950,9 +1056,9 @@ static void constructor (LexState *ls, expdesc *t) { /* }====================================================================== */ -static void setvararg (FuncState *fs, int nparams) { - fs->f->is_vararg = 1; - luaK_codeABC(fs, OP_VARARGPREP, nparams, 0, 0); +static void setvararg (FuncState *fs) { + fs->f->flag |= PF_VAHID; /* by default, use hidden vararg arguments */ + luaK_codeABC(fs, OP_VARARGPREP, 0, 0, 0); } @@ -961,7 +1067,7 @@ static void parlist (LexState *ls) { FuncState *fs = ls->fs; Proto *f = fs->f; int nparams = 0; - int isvararg = 0; + int varargk = 0; if (ls->t.token != ')') { /* is 'parlist' not empty? */ do { switch (ls->t.token) { @@ -971,19 +1077,26 @@ static void parlist (LexState *ls) { break; } case TK_DOTS: { - luaX_next(ls); - isvararg = 1; + varargk = 1; + luaX_next(ls); /* skip '...' */ + if (ls->t.token == TK_NAME) + new_varkind(ls, str_checkname(ls), RDKVAVAR); + else + new_localvarliteral(ls, "(vararg table)"); break; } default: luaX_syntaxerror(ls, " or '...' expected"); } - } while (!isvararg && testnext(ls, ',')); + } while (!varargk && testnext(ls, ',')); } adjustlocalvars(ls, nparams); f->numparams = cast_byte(fs->nactvar); - if (isvararg) - setvararg(fs, f->numparams); /* declared vararg */ - luaK_reserveregs(fs, fs->nactvar); /* reserve registers for parameters */ + if (varargk) { + setvararg(fs); /* declared vararg */ + adjustlocalvars(ls, 1); /* vararg parameter */ + } + /* reserve registers for parameters (plus vararg parameter, if present) */ + luaK_reserveregs(fs, fs->nactvar); } @@ -1040,7 +1153,7 @@ static void funcargs (LexState *ls, expdesc *f) { check_match(ls, ')', '(', line); break; } - case '{': { /* funcargs -> constructor */ + case '{' /*}*/: { /* funcargs -> constructor */ constructor(ls, &args); break; } @@ -1064,8 +1177,9 @@ static void funcargs (LexState *ls, expdesc *f) { } init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); luaK_fixline(fs, line); - fs->freereg = base+1; /* call removes function and arguments and leaves - one result (unless changed later) */ + /* call removes function and arguments and leaves one result (unless + changed later) */ + fs->freereg = cast_byte(base + 1); } @@ -1126,7 +1240,7 @@ static void suffixedexp (LexState *ls, expdesc *v) { funcargs(ls, v); break; } - case '(': case TK_STRING: case '{': { /* funcargs */ + case '(': case TK_STRING: case '{' /*}*/: { /* funcargs */ luaK_exp2nextreg(fs, v); funcargs(ls, v); break; @@ -1169,12 +1283,12 @@ static void simpleexp (LexState *ls, expdesc *v) { } case TK_DOTS: { /* vararg */ FuncState *fs = ls->fs; - check_condition(ls, fs->f->is_vararg, + check_condition(ls, isvararg(fs->f), "cannot use '...' outside a vararg function"); - init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1)); + init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, fs->f->numparams, 1)); break; } - case '{': { /* constructor */ + case '{' /*}*/: { /* constructor */ constructor(ls, v); return; } @@ -1330,7 +1444,7 @@ struct LHS_assign { */ static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { FuncState *fs = ls->fs; - int extra = fs->freereg; /* eventual position to save local variable */ + lu_byte extra = fs->freereg; /* eventual position to save local variable */ int conflict = 0; for (; lh; lh = lh->prev) { /* check all previous assignments */ if (vkisindexed(lh->v.k)) { /* assignment to table field? */ @@ -1365,6 +1479,15 @@ static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { } } + +/* Create code to store the "top" register in 'var' */ +static void storevartop (FuncState *fs, expdesc *var) { + expdesc e; + init_exp(&e, VNONRELOC, fs->freereg - 1); + luaK_storevar(fs, var, &e); /* will also free the top register */ +} + + /* ** Parse and compile a multiple assignment. The first "variable" ** (a 'suffixedexp') was already read by the caller. @@ -1398,8 +1521,7 @@ static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) { return; /* avoid default */ } } - init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ - luaK_storevar(ls->fs, &lh->v, &e); + storevartop(ls->fs, &lh->v); /* default assignment */ } @@ -1413,45 +1535,38 @@ static int cond (LexState *ls) { } -static void gotostat (LexState *ls) { - FuncState *fs = ls->fs; - int line = ls->linenumber; +static void gotostat (LexState *ls, int line) { TString *name = str_checkname(ls); /* label's name */ - Labeldesc *lb = findlabel(ls, name); - if (lb == NULL) /* no label? */ - /* forward jump; will be resolved when the label is declared */ - newgotoentry(ls, name, line, luaK_jump(fs)); - else { /* found a label */ - /* backward jump; will be resolved here */ - int lblevel = reglevel(fs, lb->nactvar); /* label level */ - if (luaY_nvarstack(fs) > lblevel) /* leaving the scope of a variable? */ - luaK_codeABC(fs, OP_CLOSE, lblevel, 0, 0); - /* create jump and link it to the label */ - luaK_patchlist(fs, luaK_jump(fs), lb->pc); - } + newgotoentry(ls, name, line); } /* ** Break statement. Semantically equivalent to "goto break". */ -static void breakstat (LexState *ls) { - int line = ls->linenumber; +static void breakstat (LexState *ls, int line) { + BlockCnt *bl; /* to look for an enclosing loop */ + for (bl = ls->fs->bl; bl != NULL; bl = bl->previous) { + if (bl->isloop) /* found one? */ + goto ok; + } + luaX_syntaxerror(ls, "break outside loop"); + ok: + bl->isloop = 2; /* signal that block has pending breaks */ luaX_next(ls); /* skip break */ - newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs)); + newgotoentry(ls, ls->brkn, line); } /* -** Check whether there is already a label with the given 'name'. +** Check whether there is already a label with the given 'name' at +** current function. */ static void checkrepeated (LexState *ls, TString *name) { - Labeldesc *lb = findlabel(ls, name); - if (l_unlikely(lb != NULL)) { /* already defined? */ - const char *msg = "label '%s' already defined on line %d"; - msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line); - luaK_semerror(ls, msg); /* error */ - } + Labeldesc *lb = findlabel(ls, name, ls->fs->firstlabel); + if (l_unlikely(lb != NULL)) /* already defined? */ + luaK_semerror(ls, "label '%s' already defined on line %d", + getstr(name), lb->line); /* error */ } @@ -1550,6 +1665,7 @@ static void forbody (LexState *ls, int base, int line, int nvars, int isgen) { int prep, endfor; checknext(ls, TK_DO); prep = luaK_codeABx(fs, forprep[isgen], base, 0); + fs->freereg--; /* both 'forprep' remove one register from the stack */ enterblock(fs, &bl, 0); /* scope for declared variables */ adjustlocalvars(ls, nvars); luaK_reserveregs(fs, nvars); @@ -1572,8 +1688,7 @@ static void fornum (LexState *ls, TString *varname, int line) { int base = fs->freereg; new_localvarliteral(ls, "(for state)"); new_localvarliteral(ls, "(for state)"); - new_localvarliteral(ls, "(for state)"); - new_localvar(ls, varname); + new_varkind(ls, varname, RDKCONST); /* control variable */ checknext(ls, '='); exp1(ls); /* initial value */ checknext(ls, ','); @@ -1584,7 +1699,7 @@ static void fornum (LexState *ls, TString *varname, int line) { luaK_int(fs, fs->freereg, 1); luaK_reserveregs(fs, 1); } - adjustlocalvars(ls, 3); /* control variables */ + adjustlocalvars(ls, 2); /* start scope for internal variables */ forbody(ls, base, line, 1, 0); } @@ -1593,16 +1708,15 @@ static void forlist (LexState *ls, TString *indexname) { /* forlist -> NAME {,NAME} IN explist forbody */ FuncState *fs = ls->fs; expdesc e; - int nvars = 5; /* gen, state, control, toclose, 'indexname' */ + int nvars = 4; /* function, state, closing, control */ int line; int base = fs->freereg; - /* create control variables */ - new_localvarliteral(ls, "(for state)"); - new_localvarliteral(ls, "(for state)"); - new_localvarliteral(ls, "(for state)"); - new_localvarliteral(ls, "(for state)"); - /* create declared variables */ - new_localvar(ls, indexname); + /* create internal variables */ + new_localvarliteral(ls, "(for state)"); /* iterator function */ + new_localvarliteral(ls, "(for state)"); /* state */ + new_localvarliteral(ls, "(for state)"); /* closing var. (after swap) */ + new_varkind(ls, indexname, RDKCONST); /* control variable */ + /* other declared variables */ while (testnext(ls, ',')) { new_localvar(ls, str_checkname(ls)); nvars++; @@ -1610,10 +1724,10 @@ static void forlist (LexState *ls, TString *indexname) { checknext(ls, TK_IN); line = ls->linenumber; adjust_assign(ls, 4, explist(ls, &e), &e); - adjustlocalvars(ls, 4); /* control variables */ - marktobeclosed(fs); /* last control var. must be closed */ - luaK_checkstack(fs, 3); /* extra space to call generator */ - forbody(ls, base, line, nvars - 4, 1); + adjustlocalvars(ls, 3); /* start scope for internal variables */ + marktobeclosed(fs); /* last internal var. must be closed */ + luaK_checkstack(fs, 2); /* extra space to call iterator */ + forbody(ls, base, line, nvars - 3, 1); } @@ -1637,38 +1751,16 @@ static void forstat (LexState *ls, int line) { static void test_then_block (LexState *ls, int *escapelist) { /* test_then_block -> [IF | ELSEIF] cond THEN block */ - BlockCnt bl; FuncState *fs = ls->fs; - expdesc v; - int jf; /* instruction to skip 'then' code (if condition is false) */ + int condtrue; luaX_next(ls); /* skip IF or ELSEIF */ - expr(ls, &v); /* read condition */ + condtrue = cond(ls); /* read condition */ checknext(ls, TK_THEN); - if (ls->t.token == TK_BREAK) { /* 'if x then break' ? */ - int line = ls->linenumber; - luaK_goiffalse(ls->fs, &v); /* will jump if condition is true */ - luaX_next(ls); /* skip 'break' */ - enterblock(fs, &bl, 0); /* must enter block before 'goto' */ - newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, v.t); - while (testnext(ls, ';')) {} /* skip semicolons */ - if (block_follow(ls, 0)) { /* jump is the entire block? */ - leaveblock(fs); - return; /* and that is it */ - } - else /* must skip over 'then' part if condition is false */ - jf = luaK_jump(fs); - } - else { /* regular case (not a break) */ - luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ - enterblock(fs, &bl, 0); - jf = v.f; - } - statlist(ls); /* 'then' part */ - leaveblock(fs); + block(ls); /* 'then' part */ if (ls->t.token == TK_ELSE || ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */ - luaK_patchtohere(fs, jf); + luaK_patchtohere(fs, condtrue); } @@ -1698,20 +1790,20 @@ static void localfunc (LexState *ls) { } -static int getlocalattribute (LexState *ls) { - /* ATTRIB -> ['<' Name '>'] */ +static lu_byte getvarattribute (LexState *ls, lu_byte df) { + /* attrib -> ['<' NAME '>'] */ if (testnext(ls, '<')) { - const char *attr = getstr(str_checkname(ls)); + TString *ts = str_checkname(ls); + const char *attr = getstr(ts); checknext(ls, '>'); if (strcmp(attr, "const") == 0) return RDKCONST; /* read-only variable */ else if (strcmp(attr, "close") == 0) return RDKTOCLOSE; /* to-be-closed variable */ else - luaK_semerror(ls, - luaO_pushfstring(ls->L, "unknown attribute '%s'", attr)); + luaK_semerror(ls, "unknown attribute '%s'", attr); } - return VDKREG; /* regular variable */ + return df; /* return default value */ } @@ -1724,18 +1816,20 @@ static void checktoclose (FuncState *fs, int level) { static void localstat (LexState *ls) { - /* stat -> LOCAL NAME ATTRIB { ',' NAME ATTRIB } ['=' explist] */ + /* stat -> LOCAL NAME attrib { ',' NAME attrib } ['=' explist] */ FuncState *fs = ls->fs; int toclose = -1; /* index of to-be-closed variable (if any) */ Vardesc *var; /* last variable */ - int vidx, kind; /* index and kind of last variable */ + int vidx; /* index of last variable */ int nvars = 0; int nexps; expdesc e; - do { - vidx = new_localvar(ls, str_checkname(ls)); - kind = getlocalattribute(ls); - getlocalvardesc(fs, vidx)->vd.kind = kind; + /* get prefixed attribute (if any); default is regular local variable */ + lu_byte defkind = getvarattribute(ls, VDKREG); + do { /* for each variable */ + TString *vname = str_checkname(ls); /* get its name */ + lu_byte kind = getvarattribute(ls, defkind); /* postfixed attribute */ + vidx = new_varkind(ls, vname, kind); /* predeclare it */ if (kind == RDKTOCLOSE) { /* to-be-closed? */ if (toclose != -1) /* one already present? */ luaK_semerror(ls, "multiple to-be-closed variables in local list"); @@ -1743,13 +1837,13 @@ static void localstat (LexState *ls) { } nvars++; } while (testnext(ls, ',')); - if (testnext(ls, '=')) + if (testnext(ls, '=')) /* initialization? */ nexps = explist(ls, &e); else { e.k = VVOID; nexps = 0; } - var = getlocalvardesc(fs, vidx); /* get last variable */ + var = getlocalvardesc(fs, vidx); /* retrieve last variable */ if (nvars == nexps && /* no adjustments? */ var->vd.kind == RDKCONST && /* last variable is const? */ luaK_exp2const(fs, &e, &var->k)) { /* compile-time constant? */ @@ -1765,6 +1859,116 @@ static void localstat (LexState *ls) { } +static lu_byte getglobalattribute (LexState *ls, lu_byte df) { + lu_byte kind = getvarattribute(ls, df); + switch (kind) { + case RDKTOCLOSE: + luaK_semerror(ls, "global variables cannot be to-be-closed"); + return kind; /* to avoid warnings */ + case RDKCONST: + return GDKCONST; /* adjust kind for global variable */ + default: + return kind; + } +} + + +static void checkglobal (LexState *ls, TString *varname, int line) { + FuncState *fs = ls->fs; + expdesc var; + int k; + buildglobal(ls, varname, &var); /* create global variable in 'var' */ + k = var.u.ind.keystr; /* index of global name in 'k' */ + luaK_codecheckglobal(fs, &var, k, line); +} + + +/* +** Recursively traverse list of globals to be initalized. When +** going, generate table description for the global. In the end, +** after all indices have been generated, read list of initializing +** expressions. When returning, generate the assignment of the value on +** the stack to the corresponding table description. 'n' is the variable +** being handled, range [0, nvars - 1]. +*/ +static void initglobal (LexState *ls, int nvars, int firstidx, int n, + int line) { + if (n == nvars) { /* traversed all variables? */ + expdesc e; + int nexps = explist(ls, &e); /* read list of expressions */ + adjust_assign(ls, nvars, nexps, &e); + } + else { /* handle variable 'n' */ + FuncState *fs = ls->fs; + expdesc var; + TString *varname = getlocalvardesc(fs, firstidx + n)->vd.name; + buildglobal(ls, varname, &var); /* create global variable in 'var' */ + enterlevel(ls); /* control recursion depth */ + initglobal(ls, nvars, firstidx, n + 1, line); + leavelevel(ls); + checkglobal(ls, varname, line); + storevartop(fs, &var); + } +} + + +static void globalnames (LexState *ls, lu_byte defkind) { + FuncState *fs = ls->fs; + int nvars = 0; + int lastidx; /* index of last registered variable */ + do { /* for each name */ + TString *vname = str_checkname(ls); + lu_byte kind = getglobalattribute(ls, defkind); + lastidx = new_varkind(ls, vname, kind); + nvars++; + } while (testnext(ls, ',')); + if (testnext(ls, '=')) /* initialization? */ + initglobal(ls, nvars, lastidx - nvars + 1, 0, ls->linenumber); + fs->nactvar = cast_short(fs->nactvar + nvars); /* activate declaration */ +} + + +static void globalstat (LexState *ls) { + /* globalstat -> (GLOBAL) attrib '*' + globalstat -> (GLOBAL) attrib NAME attrib {',' NAME attrib} */ + FuncState *fs = ls->fs; + /* get prefixed attribute (if any); default is regular global variable */ + lu_byte defkind = getglobalattribute(ls, GDKREG); + if (!testnext(ls, '*')) + globalnames(ls, defkind); + else { + /* use NULL as name to represent '*' entries */ + new_varkind(ls, NULL, defkind); + fs->nactvar++; /* activate declaration */ + } +} + + +static void globalfunc (LexState *ls, int line) { + /* globalfunc -> (GLOBAL FUNCTION) NAME body */ + expdesc var, b; + FuncState *fs = ls->fs; + TString *fname = str_checkname(ls); + new_varkind(ls, fname, GDKREG); /* declare global variable */ + fs->nactvar++; /* enter its scope */ + buildglobal(ls, fname, &var); + body(ls, &b, 0, ls->linenumber); /* compile and return closure in 'b' */ + checkglobal(ls, fname, line); + luaK_storevar(fs, &var, &b); + luaK_fixline(fs, line); /* definition "happens" in the first line */ +} + + +static void globalstatfunc (LexState *ls, int line) { + /* stat -> GLOBAL globalfunc | GLOBAL globalstat */ + luaX_next(ls); /* skip 'global' */ + if (testnext(ls, TK_FUNCTION)) + globalfunc(ls, line); + else + globalstat(ls); +} + + static int funcname (LexState *ls, expdesc *v) { /* funcname -> NAME {fieldsel} [':' NAME] */ int ismethod = 0; @@ -1785,8 +1989,8 @@ static void funcstat (LexState *ls, int line) { expdesc v, b; luaX_next(ls); /* skip FUNCTION */ ismethod = funcname(ls, &v); - body(ls, &b, ismethod, line); check_readonly(ls, &v); + body(ls, &b, ismethod, line); luaK_storevar(ls->fs, &v, &b); luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ } @@ -1884,6 +2088,10 @@ static void statement (LexState *ls) { localstat(ls); break; } + case TK_GLOBAL: { /* stat -> globalstatfunc */ + globalstatfunc(ls, line); + break; + } case TK_DBCOLON: { /* stat -> label */ luaX_next(ls); /* skip double colon */ labelstat(ls, str_checkname(ls), line); @@ -1895,14 +2103,30 @@ static void statement (LexState *ls) { break; } case TK_BREAK: { /* stat -> breakstat */ - breakstat(ls); + breakstat(ls, line); break; } case TK_GOTO: { /* stat -> 'goto' NAME */ luaX_next(ls); /* skip 'goto' */ - gotostat(ls); + gotostat(ls, line); break; } +#if defined(LUA_COMPAT_GLOBAL) + case TK_NAME: { + /* compatibility code to parse global keyword when "global" + is not reserved */ + if (ls->t.seminfo.ts == ls->glbn) { /* current = "global"? */ + int lk = luaX_lookahead(ls); + if (lk == '<' || lk == TK_NAME || lk == '*' || lk == TK_FUNCTION) { + /* 'global ' or 'global name' or 'global *' or + 'global function' */ + globalstatfunc(ls, line); + break; + } + } /* else... */ + } +#endif + /* FALLTHROUGH */ default: { /* stat -> func | assignment */ exprstat(ls); break; @@ -1916,6 +2140,8 @@ static void statement (LexState *ls) { /* }====================================================================== */ +/* }====================================================================== */ + /* ** compiles the main function, which is a regular vararg function with an @@ -1925,7 +2151,7 @@ static void mainfunc (LexState *ls, FuncState *fs) { BlockCnt bl; Upvaldesc *env; open_func(ls, fs, &bl); - setvararg(fs, 0); /* main function is always declared vararg */ + setvararg(fs); /* main function is always vararg */ env = allocupvalue(fs); /* ...set environment upvalue */ env->instack = 1; env->idx = 0; diff --git a/lua-5.4.7/src/lstate.c b/src/lstate.c similarity index 70% rename from lua-5.4.7/src/lstate.c rename to src/lstate.c index 7fefacb..70a11aa 100644 --- a/lua-5.4.7/src/lstate.c +++ b/src/lstate.c @@ -29,79 +29,45 @@ -/* -** thread state + extra space -*/ -typedef struct LX { - lu_byte extra_[LUA_EXTRASPACE]; - lua_State l; -} LX; - - -/* -** Main thread combines a thread state and the global state -*/ -typedef struct LG { - LX l; - global_State g; -} LG; - - - #define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l))) /* -** A macro to create a "random" seed when a state is created; -** the seed is used to randomize string hashes. +** these macros allow user-specific actions when a thread is +** created/deleted */ -#if !defined(luai_makeseed) +#if !defined(luai_userstateopen) +#define luai_userstateopen(L) ((void)L) +#endif -#include +#if !defined(luai_userstateclose) +#define luai_userstateclose(L) ((void)L) +#endif -/* -** Compute an initial seed with some level of randomness. -** Rely on Address Space Layout Randomization (if present) and -** current time. -*/ -#define addbuff(b,p,e) \ - { size_t t = cast_sizet(e); \ - memcpy(b + p, &t, sizeof(t)); p += sizeof(t); } - -static unsigned int luai_makeseed (lua_State *L) { - char buff[3 * sizeof(size_t)]; - unsigned int h = cast_uint(time(NULL)); - int p = 0; - addbuff(buff, p, L); /* heap variable */ - addbuff(buff, p, &h); /* local variable */ - addbuff(buff, p, &lua_newstate); /* public function */ - lua_assert(p == sizeof(buff)); - return luaS_hash(buff, p, h); -} +#if !defined(luai_userstatethread) +#define luai_userstatethread(L,L1) ((void)L) +#endif +#if !defined(luai_userstatefree) +#define luai_userstatefree(L,L1) ((void)L) #endif /* -** set GCdebt to a new value keeping the value (totalbytes + GCdebt) -** invariant (and avoiding underflows in 'totalbytes') +** set GCdebt to a new value keeping the real number of allocated +** objects (GCtotalobjs - GCdebt) invariant and avoiding overflows in +** 'GCtotalobjs'. */ void luaE_setdebt (global_State *g, l_mem debt) { l_mem tb = gettotalbytes(g); lua_assert(tb > 0); - if (debt < tb - MAX_LMEM) - debt = tb - MAX_LMEM; /* will make 'totalbytes == MAX_LMEM' */ - g->totalbytes = tb - debt; + if (debt > MAX_LMEM - tb) + debt = MAX_LMEM - tb; /* will make GCtotalbytes == MAX_LMEM */ + g->GCtotalbytes = tb + debt; g->GCdebt = debt; } -LUA_API int lua_setcstacklimit (lua_State *L, unsigned int limit) { - UNUSED(L); UNUSED(limit); - return LUAI_MAXCCALLS; /* warning?? */ -} - - CallInfo *luaE_extendCI (lua_State *L) { CallInfo *ci; lua_assert(L->ci->next == NULL); @@ -166,7 +132,7 @@ void luaE_checkcstack (lua_State *L) { if (getCcalls(L) == LUAI_MAXCCALLS) luaG_runerror(L, "C stack overflow"); else if (getCcalls(L) >= (LUAI_MAXCCALLS / 10 * 11)) - luaD_throw(L, LUA_ERRERR); /* error while handling stack error */ + luaD_errerr(L); /* error while handling stack error */ } @@ -177,26 +143,29 @@ LUAI_FUNC void luaE_incCstack (lua_State *L) { } +static void resetCI (lua_State *L) { + CallInfo *ci = L->ci = &L->base_ci; + ci->func.p = L->stack.p; + setnilvalue(s2v(ci->func.p)); /* 'function' entry for basic 'ci' */ + ci->top.p = ci->func.p + 1 + LUA_MINSTACK; /* +1 for 'function' entry */ + ci->u.c.k = NULL; + ci->callstatus = CIST_C; + L->status = LUA_OK; + L->errfunc = 0; /* stack unwind can "throw away" the error function */ +} + + static void stack_init (lua_State *L1, lua_State *L) { - int i; CallInfo *ci; + int i; /* initialize stack array */ L1->stack.p = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, StackValue); L1->tbclist.p = L1->stack.p; for (i = 0; i < BASIC_STACK_SIZE + EXTRA_STACK; i++) setnilvalue(s2v(L1->stack.p + i)); /* erase new stack */ - L1->top.p = L1->stack.p; L1->stack_last.p = L1->stack.p + BASIC_STACK_SIZE; /* initialize first ci */ - ci = &L1->base_ci; - ci->next = ci->previous = NULL; - ci->callstatus = CIST_C; - ci->func.p = L1->top.p; - ci->u.c.k = NULL; - ci->nresults = 0; - setnilvalue(s2v(L1->top.p)); /* 'function' entry for this 'ci' */ - L1->top.p++; - ci->top.p = L1->top.p + LUA_MINSTACK; - L1->ci = ci; + resetCI(L1); + L1->top.p = L1->stack.p + 1; /* +1 for 'function' entry */ } @@ -206,7 +175,8 @@ static void freestack (lua_State *L) { L->ci = &L->base_ci; /* free the entire 'ci' list */ freeCI(L); lua_assert(L->nci == 0); - luaM_freearray(L, L->stack.p, stacksize(L) + EXTRA_STACK); /* free stack */ + /* free stack */ + luaM_freearray(L, L->stack.p, cast_sizet(stacksize(L) + EXTRA_STACK)); } @@ -215,13 +185,19 @@ static void freestack (lua_State *L) { */ static void init_registry (lua_State *L, global_State *g) { /* create registry */ + TValue aux; Table *registry = luaH_new(L); sethvalue(L, &g->l_registry, registry); luaH_resize(L, registry, LUA_RIDX_LAST, 0); + /* registry[1] = false */ + setbfvalue(&aux); + luaH_setint(L, registry, 1, &aux); /* registry[LUA_RIDX_MAINTHREAD] = L */ - setthvalue(L, ®istry->array[LUA_RIDX_MAINTHREAD - 1], L); + setthvalue(L, &aux, L); + luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &aux); /* registry[LUA_RIDX_GLOBALS] = new table (table of globals) */ - sethvalue(L, ®istry->array[LUA_RIDX_GLOBALS - 1], luaH_new(L)); + sethvalue(L, &aux, luaH_new(L)); + luaH_setint(L, registry, LUA_RIDX_GLOBALS, &aux); } @@ -263,6 +239,16 @@ static void preinit_thread (lua_State *L, global_State *g) { L->status = LUA_OK; L->errfunc = 0; L->oldpc = 0; + L->base_ci.previous = L->base_ci.next = NULL; +} + + +lu_mem luaE_threadsize (lua_State *L) { + lu_mem sz = cast(lu_mem, sizeof(LX)) + + cast_uint(L->nci) * sizeof(CallInfo); + if (L->stack.p != NULL) + sz += cast_uint(stacksize(L) + EXTRA_STACK) * sizeof(StackValue); + return sz; } @@ -271,15 +257,16 @@ static void close_state (lua_State *L) { if (!completestate(g)) /* closing a partially built state? */ luaC_freeallobjects(L); /* just collect its objects */ else { /* closing a fully built state */ - L->ci = &L->base_ci; /* unwind CallInfo list */ + resetCI(L); luaD_closeprotected(L, 1, LUA_OK); /* close all upvalues */ + L->top.p = L->stack.p + 1; /* empty the stack to run finalizers */ luaC_freeallobjects(L); /* collect all objects */ luai_userstateclose(L); } - luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); + luaM_freearray(L, G(L)->strt.hash, cast_sizet(G(L)->strt.size)); freestack(L); - lua_assert(gettotalbytes(g) == sizeof(LG)); - (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ + lua_assert(gettotalbytes(g) == sizeof(global_State)); + (*g->frealloc)(g->ud, g, sizeof(global_State), 0); /* free main block */ } @@ -301,7 +288,7 @@ LUA_API lua_State *lua_newthread (lua_State *L) { L1->hook = L->hook; resethookcount(L1); /* initialize L1 extra space */ - memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread), + memcpy(lua_getextraspace(L1), lua_getextraspace(mainthread(g)), LUA_EXTRASPACE); luai_userstatethread(L, L1); stack_init(L1, L); /* init stack */ @@ -320,51 +307,39 @@ void luaE_freethread (lua_State *L, lua_State *L1) { } -int luaE_resetthread (lua_State *L, int status) { - CallInfo *ci = L->ci = &L->base_ci; /* unwind CallInfo list */ - setnilvalue(s2v(L->stack.p)); /* 'function' entry for basic 'ci' */ - ci->func.p = L->stack.p; - ci->callstatus = CIST_C; +TStatus luaE_resetthread (lua_State *L, TStatus status) { + resetCI(L); if (status == LUA_YIELD) status = LUA_OK; - L->status = LUA_OK; /* so it can run __close metamethods */ status = luaD_closeprotected(L, 1, status); if (status != LUA_OK) /* errors? */ luaD_seterrorobj(L, status, L->stack.p + 1); else L->top.p = L->stack.p + 1; - ci->top.p = L->top.p + LUA_MINSTACK; - luaD_reallocstack(L, cast_int(ci->top.p - L->stack.p), 0); + luaD_reallocstack(L, cast_int(L->ci->top.p - L->stack.p), 0); return status; } LUA_API int lua_closethread (lua_State *L, lua_State *from) { - int status; + TStatus status; lua_lock(L); L->nCcalls = (from) ? getCcalls(from) : 0; status = luaE_resetthread(L, L->status); + if (L == from) /* closing itself? */ + luaD_throwbaselevel(L, status); lua_unlock(L); - return status; -} - - -/* -** Deprecated! Use 'lua_closethread' instead. -*/ -LUA_API int lua_resetthread (lua_State *L) { - return lua_closethread(L, NULL); + return APIstatus(status); } -LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { +LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud, unsigned seed) { int i; lua_State *L; - global_State *g; - LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG))); - if (l == NULL) return NULL; - L = &l->l.l; - g = &l->g; + global_State *g = cast(global_State*, + (*f)(ud, NULL, LUA_TTHREAD, sizeof(global_State))); + if (g == NULL) return NULL; + L = &g->mainth.l; L->tt = LUA_VTHREAD; g->currentwhite = bitmask(WHITE0BIT); L->marked = luaC_white(g); @@ -376,8 +351,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { g->ud = ud; g->warnf = NULL; g->ud_warn = NULL; - g->mainthread = L; - g->seed = luai_makeseed(L); + g->seed = seed; g->gcstp = GCSTPGC; /* no GC while building state */ g->strt.size = g->strt.nuse = 0; g->strt.hash = NULL; @@ -394,16 +368,17 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { g->gray = g->grayagain = NULL; g->weak = g->ephemeron = g->allweak = NULL; g->twups = NULL; - g->totalbytes = sizeof(LG); + g->GCtotalbytes = sizeof(global_State); + g->GCmarked = 0; g->GCdebt = 0; - g->lastatomic = 0; setivalue(&g->nilvalue, 0); /* to signal that state is not yet built */ - setgcparam(g->gcpause, LUAI_GCPAUSE); - setgcparam(g->gcstepmul, LUAI_GCMUL); - g->gcstepsize = LUAI_GCSTEPSIZE; - setgcparam(g->genmajormul, LUAI_GENMAJORMUL); - g->genminormul = LUAI_GENMINORMUL; - for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; + setgcparam(g, PAUSE, LUAI_GCPAUSE); + setgcparam(g, STEPMUL, LUAI_GCMUL); + setgcparam(g, STEPSIZE, LUAI_GCSTEPSIZE); + setgcparam(g, MINORMUL, LUAI_GENMINORMUL); + setgcparam(g, MINORMAJOR, LUAI_MINORMAJOR); + setgcparam(g, MAJORMINOR, LUAI_MAJORMINOR); + for (i=0; i < LUA_NUMTYPES; i++) g->mt[i] = NULL; if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { /* memory allocation error: free partial state */ close_state(L); @@ -415,7 +390,7 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { LUA_API void lua_close (lua_State *L) { lua_lock(L); - L = G(L)->mainthread; /* only the main thread can be closed */ + L = mainthread(G(L)); /* only the main thread can be closed */ close_state(L); } diff --git a/lua-5.4.7/src/lstring.c b/src/lstring.c similarity index 65% rename from lua-5.4.7/src/lstring.c rename to src/lstring.c index 9775735..7563514 100644 --- a/lua-5.4.7/src/lstring.c +++ b/src/lstring.c @@ -25,22 +25,32 @@ /* ** Maximum size for string table. */ -#define MAXSTRTB cast_int(luaM_limitN(MAX_INT, TString*)) +#define MAXSTRTB cast_int(luaM_limitN(INT_MAX, TString*)) + +/* +** Initial size for the string table (must be power of 2). +** The Lua core alone registers ~50 strings (reserved words + +** metaevent keys + a few others). Libraries would typically add +** a few dozens more. +*/ +#if !defined(MINSTRTABSIZE) +#define MINSTRTABSIZE 128 +#endif /* -** equality for long strings +** generic equality for strings */ -int luaS_eqlngstr (TString *a, TString *b) { - size_t len = a->u.lnglen; - lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR); - return (a == b) || /* same instance or... */ - ((len == b->u.lnglen) && /* equal length and ... */ - (memcmp(getlngstr(a), getlngstr(b), len) == 0)); /* equal contents */ +int luaS_eqstr (TString *a, TString *b) { + size_t len1, len2; + const char *s1 = getlstr(a, len1); + const char *s2 = getlstr(b, len2); + return ((len1 == len2) && /* equal length and ... */ + (memcmp(s1, s2, len1) == 0)); /* equal contents */ } -unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) { +static unsigned luaS_hash (const char *str, size_t l, unsigned seed) { unsigned int h = seed ^ cast_uint(l); for (; l > 0; l--) h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1])); @@ -48,7 +58,7 @@ unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) { } -unsigned int luaS_hashlongstr (TString *ts) { +unsigned luaS_hashlongstr (TString *ts) { lua_assert(ts->tt == LUA_VLNGSTR); if (ts->extra == 0) { /* no hash? */ size_t len = ts->u.lnglen; @@ -136,28 +146,43 @@ void luaS_init (lua_State *L) { } +size_t luaS_sizelngstr (size_t len, int kind) { + switch (kind) { + case LSTRREG: /* regular long string */ + /* don't need 'falloc'/'ud', but need space for content */ + return offsetof(TString, falloc) + (len + 1) * sizeof(char); + case LSTRFIX: /* fixed external long string */ + /* don't need 'falloc'/'ud' */ + return offsetof(TString, falloc); + default: /* external long string with deallocation */ + lua_assert(kind == LSTRMEM); + return sizeof(TString); + } +} + /* ** creates a new string object */ -static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) { +static TString *createstrobj (lua_State *L, size_t totalsize, lu_byte tag, + unsigned h) { TString *ts; GCObject *o; - size_t totalsize; /* total size of TString object */ - totalsize = sizelstring(l); o = luaC_newobj(L, tag, totalsize); ts = gco2ts(o); ts->hash = h; ts->extra = 0; - getstr(ts)[l] = '\0'; /* ending 0 */ return ts; } TString *luaS_createlngstrobj (lua_State *L, size_t l) { - TString *ts = createstrobj(L, l, LUA_VLNGSTR, G(L)->seed); + size_t totalsize = luaS_sizelngstr(l, LSTRREG); + TString *ts = createstrobj(L, totalsize, LUA_VLNGSTR, G(L)->seed); ts->u.lnglen = l; - ts->shrlen = 0xFF; /* signals that it is a long string */ + ts->shrlen = LSTRREG; /* signals that it is a regular long string */ + ts->contents = cast_charp(ts) + offsetof(TString, falloc); + ts->contents[l] = '\0'; /* ending 0 */ return ts; } @@ -173,9 +198,9 @@ void luaS_remove (lua_State *L, TString *ts) { static void growstrtab (lua_State *L, stringtable *tb) { - if (l_unlikely(tb->nuse == MAX_INT)) { /* too many strings? */ + if (l_unlikely(tb->nuse == INT_MAX)) { /* too many strings? */ luaC_fullgc(L, 1); /* try to free some... */ - if (tb->nuse == MAX_INT) /* still too many? */ + if (tb->nuse == INT_MAX) /* still too many? */ luaM_error(L); /* cannot even create a message... */ } if (tb->size <= MAXSTRTB / 2) /* can grow string table? */ @@ -194,7 +219,8 @@ static TString *internshrstr (lua_State *L, const char *str, size_t l) { TString **list = &tb->hash[lmod(h, tb->size)]; lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */ for (ts = *list; ts != NULL; ts = ts->u.hnext) { - if (l == ts->shrlen && (memcmp(str, getshrstr(ts), l * sizeof(char)) == 0)) { + if (l == cast_uint(ts->shrlen) && + (memcmp(str, getshrstr(ts), l * sizeof(char)) == 0)) { /* found! */ if (isdead(g, ts)) /* dead (but not collected yet)? */ changewhite(ts); /* resurrect it */ @@ -206,8 +232,9 @@ static TString *internshrstr (lua_State *L, const char *str, size_t l) { growstrtab(L, tb); list = &tb->hash[lmod(h, tb->size)]; /* rehash with new size */ } - ts = createstrobj(L, l, LUA_VSHRSTR, h); - ts->shrlen = cast_byte(l); + ts = createstrobj(L, sizestrshr(l), LUA_VSHRSTR, h); + ts->shrlen = cast(ls_byte, l); + getshrstr(ts)[l] = '\0'; /* ending 0 */ memcpy(getshrstr(ts), str, l * sizeof(char)); ts->u.hnext = *list; *list = ts; @@ -256,7 +283,7 @@ TString *luaS_new (lua_State *L, const char *str) { } -Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue) { +Udata *luaS_newudata (lua_State *L, size_t s, unsigned short nuvalue) { Udata *u; int i; GCObject *o; @@ -272,3 +299,55 @@ Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue) { return u; } + +struct NewExt { + ls_byte kind; + const char *s; + size_t len; + TString *ts; /* output */ +}; + + +static void f_newext (lua_State *L, void *ud) { + struct NewExt *ne = cast(struct NewExt *, ud); + size_t size = luaS_sizelngstr(0, ne->kind); + ne->ts = createstrobj(L, size, LUA_VLNGSTR, G(L)->seed); +} + + +TString *luaS_newextlstr (lua_State *L, + const char *s, size_t len, lua_Alloc falloc, void *ud) { + struct NewExt ne; + if (!falloc) { + ne.kind = LSTRFIX; + f_newext(L, &ne); /* just create header */ + } + else { + ne.kind = LSTRMEM; + if (luaD_rawrunprotected(L, f_newext, &ne) != LUA_OK) { /* mem. error? */ + (*falloc)(ud, cast_voidp(s), len + 1, 0); /* free external string */ + luaM_error(L); /* re-raise memory error */ + } + ne.ts->falloc = falloc; + ne.ts->ud = ud; + } + ne.ts->shrlen = ne.kind; + ne.ts->u.lnglen = len; + ne.ts->contents = cast_charp(s); + return ne.ts; +} + + +/* +** Normalize an external string: If it is short, internalize it. +*/ +TString *luaS_normstr (lua_State *L, TString *ts) { + size_t len = ts->u.lnglen; + if (len > LUAI_MAXSHORTLEN) + return ts; /* long string; keep the original */ + else { + const char *str = getlngstr(ts); + return internshrstr(L, str, len); + } +} + diff --git a/lua-5.4.7/src/lstrlib.c b/src/lstrlib.c similarity index 87% rename from lua-5.4.7/src/lstrlib.c rename to src/lstrlib.c index 0316716..23df839 100644 --- a/lua-5.4.7/src/lstrlib.c +++ b/src/lstrlib.c @@ -24,6 +24,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" /* @@ -36,22 +37,6 @@ #endif -/* macro to 'unsign' a character */ -#define uchar(c) ((unsigned char)(c)) - - -/* -** Some sizes are better limited to fit in 'int', but must also fit in -** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.) -*/ -#define MAX_SIZET ((size_t)(~(size_t)0)) - -#define MAXSIZE \ - (sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX)) - - - - static int str_len (lua_State *L) { size_t l; luaL_checklstring(L, 1, &l); @@ -128,7 +113,7 @@ static int str_lower (lua_State *L) { const char *s = luaL_checklstring(L, 1, &l); char *p = luaL_buffinitsize(L, &b, l); for (i=0; i MAXSIZE / n)) + else if (l_unlikely(len > MAX_SIZE - lsep || + cast_st2S(len + lsep) > cast_st2S(MAX_SIZE) / n)) return luaL_error(L, "resulting string too large"); else { - size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep; + size_t totallen = (cast_sizet(n) * (len + lsep)) - lsep; luaL_Buffer b; char *p = luaL_buffinitsize(L, &b, totallen); while (n-- > 1) { /* first n-1 copies (followed by separator) */ - memcpy(p, s, l * sizeof(char)); p += l; + memcpy(p, s, len * sizeof(char)); p += len; if (lsep > 0) { /* empty 'memcpy' is not that cheap */ - memcpy(p, sep, lsep * sizeof(char)); - p += lsep; + memcpy(p, sep, lsep * sizeof(char)); p += lsep; } } - memcpy(p, s, l * sizeof(char)); /* last copy (not followed by separator) */ + memcpy(p, s, len * sizeof(char)); /* last copy without separator */ luaL_pushresultsize(&b, totallen); } return 1; @@ -187,7 +176,7 @@ static int str_byte (lua_State *L) { n = (int)(pose - posi) + 1; luaL_checkstack(L, n, "string slice too long"); for (i=0; iinit = 1; luaL_buffinit(L, &state->B); } - luaL_addlstring(&state->B, (const char *)b, size); + if (b == NULL) { /* finishing dump? */ + luaL_pushresult(&state->B); /* push result */ + lua_replace(L, 1); /* move it to reserved slot */ + } + else + luaL_addlstring(&state->B, (const char *)b, size); return 0; } @@ -233,12 +227,13 @@ static int writer (lua_State *L, const void *b, size_t size, void *ud) { static int str_dump (lua_State *L) { struct str_Writer state; int strip = lua_toboolean(L, 2); - luaL_checktype(L, 1, LUA_TFUNCTION); - lua_settop(L, 1); /* ensure function is on the top of the stack */ + luaL_argcheck(L, lua_type(L, 1) == LUA_TFUNCTION && !lua_iscfunction(L, 1), + 1, "Lua function expected"); + /* ensure function is on the top of the stack and vacate slot 1 */ + lua_pushvalue(L, 1); state.init = 0; - if (l_unlikely(lua_dump(L, writer, &state, strip) != 0)) - return luaL_error(L, "unable to dump given function"); - luaL_pushresult(&state.B); + lua_dump(L, writer, &state, strip); + lua_settop(L, 1); /* leave final result on top */ return 1; } @@ -274,11 +269,18 @@ static int tonum (lua_State *L, int arg) { } -static void trymt (lua_State *L, const char *mtname) { +/* +** To be here, either the first operand was a string or the first +** operand didn't have a corresponding metamethod. (Otherwise, that +** other metamethod would have been called.) So, if this metamethod +** doesn't work, the only other option would be for the second +** operand to have a different metamethod. +*/ +static void trymt (lua_State *L, const char *mtkey, const char *opname) { lua_settop(L, 2); /* back to the original arguments */ if (l_unlikely(lua_type(L, 2) == LUA_TSTRING || - !luaL_getmetafield(L, 2, mtname))) - luaL_error(L, "attempt to %s a '%s' with a '%s'", mtname + 2, + !luaL_getmetafield(L, 2, mtkey))) + luaL_error(L, "attempt to %s a '%s' with a '%s'", opname, luaL_typename(L, -2), luaL_typename(L, -1)); lua_insert(L, -3); /* put metamethod before arguments */ lua_call(L, 2, 1); /* call metamethod */ @@ -289,7 +291,7 @@ static int arith (lua_State *L, int op, const char *mtname) { if (tonum(L, 1) && tonum(L, 2)) lua_arith(L, op); /* result will be on the top */ else - trymt(L, mtname); + trymt(L, mtname, mtname + 2); return 1; } @@ -361,10 +363,10 @@ typedef struct MatchState { const char *p_end; /* end ('\0') of pattern */ lua_State *L; int matchdepth; /* control for recursive depth (to avoid C stack overflow) */ - unsigned char level; /* total number of captures (finished or unfinished) */ + int level; /* total number of captures (finished or unfinished) */ struct { const char *init; - ptrdiff_t len; + ptrdiff_t len; /* length or special value (CAP_*) */ } capture[LUA_MAXCAPTURES]; } MatchState; @@ -453,15 +455,15 @@ static int matchbracketclass (int c, const char *p, const char *ec) { while (++p < ec) { if (*p == L_ESC) { p++; - if (match_class(c, uchar(*p))) + if (match_class(c, cast_uchar(*p))) return sig; } else if ((*(p+1) == '-') && (p+2 < ec)) { p+=2; - if (uchar(*(p-2)) <= c && c <= uchar(*p)) + if (cast_uchar(*(p-2)) <= c && c <= cast_uchar(*p)) return sig; } - else if (uchar(*p) == c) return sig; + else if (cast_uchar(*p) == c) return sig; } return !sig; } @@ -472,12 +474,12 @@ static int singlematch (MatchState *ms, const char *s, const char *p, if (s >= ms->src_end) return 0; else { - int c = uchar(*s); + int c = cast_uchar(*s); switch (*p) { case '.': return 1; /* matches any char */ - case L_ESC: return match_class(c, uchar(*(p+1))); + case L_ESC: return match_class(c, cast_uchar(*(p+1))); case '[': return matchbracketclass(c, p, ep-1); - default: return (uchar(*p) == c); + default: return (cast_uchar(*p) == c); } } } @@ -559,7 +561,7 @@ static const char *end_capture (MatchState *ms, const char *s, static const char *match_capture (MatchState *ms, const char *s, int l) { size_t len; l = check_capture(ms, l); - len = ms->capture[l].len; + len = cast_sizet(ms->capture[l].len); if ((size_t)(ms->src_end-s) >= len && memcmp(ms->capture[l].init, s, len) == 0) return s+len; @@ -606,8 +608,8 @@ static const char *match (MatchState *ms, const char *s, const char *p) { luaL_error(ms->L, "missing '[' after '%%f' in pattern"); ep = classend(ms, p); /* points to what is next */ previous = (s == ms->src_init) ? '\0' : *(s - 1); - if (!matchbracketclass(uchar(previous), p, ep - 1) && - matchbracketclass(uchar(*s), p, ep - 1)) { + if (!matchbracketclass(cast_uchar(previous), p, ep - 1) && + matchbracketclass(cast_uchar(*s), p, ep - 1)) { p = ep; goto init; /* return match(ms, s, ep); */ } s = NULL; /* match failed */ @@ -616,7 +618,7 @@ static const char *match (MatchState *ms, const char *s, const char *p) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': { /* capture results (%0-%9)? */ - s = match_capture(ms, s, uchar(*(p + 1))); + s = match_capture(ms, s, cast_uchar(*(p + 1))); if (s != NULL) { p += 2; goto init; /* return match(ms, s, p + 2) */ } @@ -683,7 +685,7 @@ static const char *lmemfind (const char *s1, size_t l1, if (memcmp(init, s2+1, l2) == 0) return init-1; else { /* correct 'l1' and 's1' to try again */ - l1 -= init-s1; + l1 -= ct_diff2sz(init - s1); s1 = init; } } @@ -699,13 +701,13 @@ static const char *lmemfind (const char *s1, size_t l1, ** its length and put its address in '*cap'. If it is an integer ** (a position), push it on the stack and return CAP_POSITION. */ -static size_t get_onecapture (MatchState *ms, int i, const char *s, +static ptrdiff_t get_onecapture (MatchState *ms, int i, const char *s, const char *e, const char **cap) { if (i >= ms->level) { if (l_unlikely(i != 0)) luaL_error(ms->L, "invalid capture index %%%d", i + 1); *cap = s; - return e - s; + return (e - s); } else { ptrdiff_t capl = ms->capture[i].len; @@ -713,7 +715,8 @@ static size_t get_onecapture (MatchState *ms, int i, const char *s, if (l_unlikely(capl == CAP_UNFINISHED)) luaL_error(ms->L, "unfinished capture"); else if (capl == CAP_POSITION) - lua_pushinteger(ms->L, (ms->capture[i].init - ms->src_init) + 1); + lua_pushinteger(ms->L, + ct_diff2S(ms->capture[i].init - ms->src_init) + 1); return capl; } } @@ -727,7 +730,7 @@ static void push_onecapture (MatchState *ms, int i, const char *s, const char *cap; ptrdiff_t l = get_onecapture(ms, i, s, e, &cap); if (l != CAP_POSITION) - lua_pushlstring(ms->L, cap, l); + lua_pushlstring(ms->L, cap, cast_sizet(l)); /* else position was already pushed */ } @@ -784,8 +787,8 @@ static int str_find_aux (lua_State *L, int find) { /* do a plain search */ const char *s2 = lmemfind(s + init, ls - init, p, lp); if (s2) { - lua_pushinteger(L, (s2 - s) + 1); - lua_pushinteger(L, (s2 - s) + lp); + lua_pushinteger(L, ct_diff2S(s2 - s) + 1); + lua_pushinteger(L, cast_st2S(ct_diff2sz(s2 - s) + lp)); return 2; } } @@ -802,8 +805,8 @@ static int str_find_aux (lua_State *L, int find) { reprepstate(&ms); if ((res=match(&ms, s1, p)) != NULL) { if (find) { - lua_pushinteger(L, (s1 - s) + 1); /* start */ - lua_pushinteger(L, res - s); /* end */ + lua_pushinteger(L, ct_diff2S(s1 - s) + 1); /* start */ + lua_pushinteger(L, ct_diff2S(res - s)); /* end */ return push_captures(&ms, NULL, 0) + 2; } else @@ -875,23 +878,23 @@ static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, const char *news = lua_tolstring(L, 3, &l); const char *p; while ((p = (char *)memchr(news, L_ESC, l)) != NULL) { - luaL_addlstring(b, news, p - news); + luaL_addlstring(b, news, ct_diff2sz(p - news)); p++; /* skip ESC */ if (*p == L_ESC) /* '%%' */ luaL_addchar(b, *p); else if (*p == '0') /* '%0' */ - luaL_addlstring(b, s, e - s); - else if (isdigit(uchar(*p))) { /* '%n' */ + luaL_addlstring(b, s, ct_diff2sz(e - s)); + else if (isdigit(cast_uchar(*p))) { /* '%n' */ const char *cap; ptrdiff_t resl = get_onecapture(ms, *p - '1', s, e, &cap); if (resl == CAP_POSITION) luaL_addvalue(b); /* add position to accumulated result */ else - luaL_addlstring(b, cap, resl); + luaL_addlstring(b, cap, cast_sizet(resl)); } else luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); - l -= p + 1 - news; + l -= ct_diff2sz(p + 1 - news); news = p + 1; } luaL_addlstring(b, news, l); @@ -926,7 +929,7 @@ static int add_value (MatchState *ms, luaL_Buffer *b, const char *s, } if (!lua_toboolean(L, -1)) { /* nil or false? */ lua_pop(L, 1); /* remove value */ - luaL_addlstring(b, s, e - s); /* keep original text */ + luaL_addlstring(b, s, ct_diff2sz(e - s)); /* keep original text */ return 0; /* no changes */ } else if (l_unlikely(!lua_isstring(L, -1))) @@ -945,7 +948,8 @@ static int str_gsub (lua_State *L) { const char *p = luaL_checklstring(L, 2, &lp); /* pattern */ const char *lastmatch = NULL; /* end of last match */ int tr = lua_type(L, 3); /* replacement type */ - lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */ + /* max replacements */ + lua_Integer max_s = luaL_optinteger(L, 4, cast_st2S(srcl) + 1); int anchor = (*p == '^'); lua_Integer n = 0; /* replacement count */ int changed = 0; /* change flag */ @@ -975,7 +979,7 @@ static int str_gsub (lua_State *L) { if (!changed) /* no changes? */ lua_pushvalue(L, 1); /* return original string */ else { /* something changed */ - luaL_addlstring(&b, src, ms.src_end-src); + luaL_addlstring(&b, src, ct_diff2sz(ms.src_end - src)); luaL_pushresult(&b); /* create and return new string */ } lua_pushinteger(L, n); /* number of substitutions */ @@ -1013,15 +1017,15 @@ static int str_gsub (lua_State *L) { /* ** Add integer part of 'x' to buffer and return new 'x' */ -static lua_Number adddigit (char *buff, int n, lua_Number x) { +static lua_Number adddigit (char *buff, unsigned n, lua_Number x) { lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */ int d = (int)dd; - buff[n] = (d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ + buff[n] = cast_char(d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ return x - dd; /* return what is left */ } -static int num2straux (char *buff, int sz, lua_Number x) { +static int num2straux (char *buff, unsigned sz, lua_Number x) { /* if 'inf' or 'NaN', format it like '%g' */ if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); @@ -1032,7 +1036,7 @@ static int num2straux (char *buff, int sz, lua_Number x) { else { int e; lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ - int n = 0; /* character count */ + unsigned n = 0; /* character count */ if (m < 0) { /* is number negative? */ buff[n++] = '-'; /* add sign */ m = -m; /* make it positive */ @@ -1046,20 +1050,20 @@ static int num2straux (char *buff, int sz, lua_Number x) { m = adddigit(buff, n++, m * 16); } while (m > 0); } - n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ + n += cast_uint(l_sprintf(buff + n, sz - n, "p%+d", e)); /* add exponent */ lua_assert(n < sz); - return n; + return cast_int(n); } } -static int lua_number2strx (lua_State *L, char *buff, int sz, +static int lua_number2strx (lua_State *L, char *buff, unsigned sz, const char *fmt, lua_Number x) { int n = num2straux(buff, sz, x); if (fmt[SIZELENMOD] == 'A') { int i; for (i = 0; i < n; i++) - buff[i] = toupper(uchar(buff[i])); + buff[i] = cast_char(toupper(cast_uchar(buff[i]))); } else if (l_unlikely(fmt[SIZELENMOD] != 'a')) return luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented"); @@ -1126,12 +1130,12 @@ static void addquoted (luaL_Buffer *b, const char *s, size_t len) { luaL_addchar(b, '\\'); luaL_addchar(b, *s); } - else if (iscntrl(uchar(*s))) { + else if (iscntrl(cast_uchar(*s))) { char buff[10]; - if (!isdigit(uchar(*(s+1)))) - l_sprintf(buff, sizeof(buff), "\\%d", (int)uchar(*s)); + if (!isdigit(cast_uchar(*(s+1)))) + l_sprintf(buff, sizeof(buff), "\\%d", (int)cast_uchar(*s)); else - l_sprintf(buff, sizeof(buff), "\\%03d", (int)uchar(*s)); + l_sprintf(buff, sizeof(buff), "\\%03d", (int)cast_uchar(*s)); luaL_addstring(b, buff); } else @@ -1160,9 +1164,9 @@ static int quotefloat (lua_State *L, char *buff, lua_Number n) { int nb = lua_number2strx(L, buff, MAX_ITEM, "%" LUA_NUMBER_FRMLEN "a", n); /* ensures that 'buff' string uses a dot as the radix character */ - if (memchr(buff, '.', nb) == NULL) { /* no dot? */ + if (memchr(buff, '.', cast_uint(nb)) == NULL) { /* no dot? */ char point = lua_getlocaledecpoint(); /* try locale point */ - char *ppoint = (char *)memchr(buff, point, nb); + char *ppoint = (char *)memchr(buff, point, cast_uint(nb)); if (ppoint) *ppoint = '.'; /* change it to a dot */ } return nb; @@ -1192,7 +1196,7 @@ static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { : LUA_INTEGER_FMT; /* else use default format */ nb = l_sprintf(buff, MAX_ITEM, format, (LUAI_UACINT)n); } - luaL_addsize(b, nb); + luaL_addsize(b, cast_uint(nb)); break; } case LUA_TNIL: case LUA_TBOOLEAN: { @@ -1208,9 +1212,9 @@ static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { static const char *get2digits (const char *s) { - if (isdigit(uchar(*s))) { + if (isdigit(cast_uchar(*s))) { s++; - if (isdigit(uchar(*s))) s++; /* (2 digits at most) */ + if (isdigit(cast_uchar(*s))) s++; /* (2 digits at most) */ } return s; } @@ -1233,7 +1237,7 @@ static void checkformat (lua_State *L, const char *form, const char *flags, spec = get2digits(spec); /* skip precision */ } } - if (!isalpha(uchar(*spec))) /* did not go to the end? */ + if (!isalpha(cast_uchar(*spec))) /* did not go to the end? */ luaL_error(L, "invalid conversion specification: '%s'", form); } @@ -1286,7 +1290,7 @@ static int str_format (lua_State *L) { luaL_addchar(&b, *strfrmt++); /* %% */ else { /* format item */ char form[MAX_FORMAT]; /* to store the format ('%...') */ - int maxitem = MAX_ITEM; /* maximum length for the result */ + unsigned maxitem = MAX_ITEM; /* maximum length for the result */ char *buff = luaL_prepbuffsize(&b, maxitem); /* to put result */ int nb = 0; /* number of bytes in result */ if (++arg > top) @@ -1369,8 +1373,8 @@ static int str_format (lua_State *L) { return luaL_error(L, "invalid conversion '%s' to 'format'", form); } } - lua_assert(nb < maxitem); - luaL_addsize(&b, nb); + lua_assert(cast_uint(nb) < maxitem); + luaL_addsize(&b, cast_uint(nb)); } } luaL_pushresult(&b); @@ -1418,7 +1422,7 @@ static const union { typedef struct Header { lua_State *L; int islittle; - int maxalign; + unsigned maxalign; } Header; @@ -1446,14 +1450,14 @@ typedef enum KOption { */ static int digit (int c) { return '0' <= c && c <= '9'; } -static int getnum (const char **fmt, int df) { +static size_t getnum (const char **fmt, size_t df) { if (!digit(**fmt)) /* no number? */ return df; /* return default value */ else { - int a = 0; + size_t a = 0; do { - a = a*10 + (*((*fmt)++) - '0'); - } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10); + a = a*10 + cast_uint(*((*fmt)++) - '0'); + } while (digit(**fmt) && a <= (MAX_SIZE - 9)/10); return a; } } @@ -1461,14 +1465,14 @@ static int getnum (const char **fmt, int df) { /* ** Read an integer numeral and raises an error if it is larger -** than the maximum size for integers. +** than the maximum size of integers. */ -static int getnumlimit (Header *h, const char **fmt, int df) { - int sz = getnum(fmt, df); - if (l_unlikely(sz > MAXINTSIZE || sz <= 0)) - return luaL_error(h->L, "integral size (%d) out of limits [1,%d]", - sz, MAXINTSIZE); - return sz; +static unsigned getnumlimit (Header *h, const char **fmt, size_t df) { + size_t sz = getnum(fmt, df); + if (l_unlikely((sz - 1u) >= MAXINTSIZE)) + return cast_uint(luaL_error(h->L, + "integral size (%d) out of limits [1,%d]", sz, MAXINTSIZE)); + return cast_uint(sz); } @@ -1485,7 +1489,7 @@ static void initheader (lua_State *L, Header *h) { /* ** Read and classify next option. 'size' is filled with option's size. */ -static KOption getoption (Header *h, const char **fmt, int *size) { +static KOption getoption (Header *h, const char **fmt, size_t *size) { /* dummy structure to get native alignment requirements */ struct cD { char c; union { LUAI_MAXALIGN; } u; }; int opt = *((*fmt)++); @@ -1507,8 +1511,8 @@ static KOption getoption (Header *h, const char **fmt, int *size) { case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint; case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring; case 'c': - *size = getnum(fmt, -1); - if (l_unlikely(*size == -1)) + *size = getnum(fmt, cast_sizet(-1)); + if (l_unlikely(*size == cast_sizet(-1))) luaL_error(h->L, "missing size for format option 'c'"); return Kchar; case 'z': return Kzstr; @@ -1519,7 +1523,7 @@ static KOption getoption (Header *h, const char **fmt, int *size) { case '>': h->islittle = 0; break; case '=': h->islittle = nativeendian.little; break; case '!': { - const int maxalign = offsetof(struct cD, u); + const size_t maxalign = offsetof(struct cD, u); h->maxalign = getnumlimit(h, fmt, maxalign); break; } @@ -1538,10 +1542,10 @@ static KOption getoption (Header *h, const char **fmt, int *size) { ** the maximum alignment ('maxalign'). Kchar option needs no alignment ** despite its size. */ -static KOption getdetails (Header *h, size_t totalsize, - const char **fmt, int *psize, int *ntoalign) { +static KOption getdetails (Header *h, size_t totalsize, const char **fmt, + size_t *psize, unsigned *ntoalign) { KOption opt = getoption(h, fmt, psize); - int align = *psize; /* usually, alignment follows size */ + size_t align = *psize; /* usually, alignment follows size */ if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0) luaL_argerror(h->L, 1, "invalid next option for option 'X'"); @@ -1551,9 +1555,15 @@ static KOption getdetails (Header *h, size_t totalsize, else { if (align > h->maxalign) /* enforce maximum alignment */ align = h->maxalign; - if (l_unlikely((align & (align - 1)) != 0)) /* not a power of 2? */ + if (l_unlikely(!ispow2(align))) { /* not a power of 2? */ + *ntoalign = 0; /* to avoid warnings */ luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); - *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1); + } + else { + /* 'szmoda' = totalsize % align */ + unsigned szmoda = cast_uint(totalsize & (align - 1)); + *ntoalign = cast_uint((align - szmoda) & (align - 1)); + } } return opt; } @@ -1566,9 +1576,9 @@ static KOption getdetails (Header *h, size_t totalsize, ** bytes if necessary (by default they would be zeros). */ static void packint (luaL_Buffer *b, lua_Unsigned n, - int islittle, int size, int neg) { + int islittle, unsigned size, int neg) { char *buff = luaL_prepbuffsize(b, size); - int i; + unsigned i; buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ for (i = 1; i < size; i++) { n >>= NB; @@ -1587,7 +1597,7 @@ static void packint (luaL_Buffer *b, lua_Unsigned n, ** given 'islittle' is different from native endianness. */ static void copywithendian (char *dest, const char *src, - int size, int islittle) { + unsigned size, int islittle) { if (islittle == nativeendian.little) memcpy(dest, src, size); else { @@ -1608,8 +1618,11 @@ static int str_pack (lua_State *L) { lua_pushnil(L); /* mark to separate arguments from string buffer */ luaL_buffinit(L, &b); while (*fmt != '\0') { - int size, ntoalign; + unsigned ntoalign; + size_t size; KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + luaL_argcheck(L, size + ntoalign <= MAX_SIZE - totalsize, arg, + "result too long"); totalsize += ntoalign + size; while (ntoalign-- > 0) luaL_addchar(&b, LUAL_PACKPADBYTE); /* fill alignment */ @@ -1621,7 +1634,7 @@ static int str_pack (lua_State *L) { lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); } - packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0)); + packint(&b, (lua_Unsigned)n, h.islittle, cast_uint(size), (n < 0)); break; } case Kuint: { /* unsigned integers */ @@ -1629,7 +1642,7 @@ static int str_pack (lua_State *L) { if (size < SZINT) /* need overflow check? */ luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), arg, "unsigned overflow"); - packint(&b, (lua_Unsigned)n, h.islittle, size, 0); + packint(&b, (lua_Unsigned)n, h.islittle, cast_uint(size), 0); break; } case Kfloat: { /* C float */ @@ -1659,20 +1672,24 @@ static int str_pack (lua_State *L) { case Kchar: { /* fixed-size string */ size_t len; const char *s = luaL_checklstring(L, arg, &len); - luaL_argcheck(L, len <= (size_t)size, arg, - "string longer than given size"); + luaL_argcheck(L, len <= size, arg, "string longer than given size"); luaL_addlstring(&b, s, len); /* add string */ - while (len++ < (size_t)size) /* pad extra space */ - luaL_addchar(&b, LUAL_PACKPADBYTE); + if (len < size) { /* does it need padding? */ + size_t psize = size - len; /* pad size */ + char *buff = luaL_prepbuffsize(&b, psize); + memset(buff, LUAL_PACKPADBYTE, psize); + luaL_addsize(&b, psize); + } break; } case Kstring: { /* strings with length count */ size_t len; const char *s = luaL_checklstring(L, arg, &len); - luaL_argcheck(L, size >= (int)sizeof(size_t) || - len < ((size_t)1 << (size * NB)), + luaL_argcheck(L, size >= sizeof(lua_Unsigned) || + len < ((lua_Unsigned)1 << (size * NB)), arg, "string length does not fit in given size"); - packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */ + /* pack length */ + packint(&b, (lua_Unsigned)len, h.islittle, cast_uint(size), 0); luaL_addlstring(&b, s, len); totalsize += len; break; @@ -1703,16 +1720,17 @@ static int str_packsize (lua_State *L) { size_t totalsize = 0; /* accumulate total size of result */ initheader(L, &h); while (*fmt != '\0') { - int size, ntoalign; + unsigned ntoalign; + size_t size; KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); luaL_argcheck(L, opt != Kstring && opt != Kzstr, 1, "variable-length format"); size += ntoalign; /* total space used by option */ - luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, - "format result too large"); + luaL_argcheck(L, totalsize <= LUA_MAXINTEGER - size, + 1, "format result too large"); totalsize += size; } - lua_pushinteger(L, (lua_Integer)totalsize); + lua_pushinteger(L, cast_st2S(totalsize)); return 1; } @@ -1761,9 +1779,10 @@ static int str_unpack (lua_State *L) { luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); initheader(L, &h); while (*fmt != '\0') { - int size, ntoalign; + unsigned ntoalign; + size_t size; KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); - luaL_argcheck(L, (size_t)ntoalign + size <= ld - pos, 2, + luaL_argcheck(L, ntoalign + size <= ld - pos, 2, "data string too short"); pos += ntoalign; /* skip alignment */ /* stack space for item + next position */ @@ -1772,8 +1791,8 @@ static int str_unpack (lua_State *L) { switch (opt) { case Kint: case Kuint: { - lua_Integer res = unpackint(L, data + pos, h.islittle, size, - (opt == Kint)); + lua_Integer res = unpackint(L, data + pos, h.islittle, + cast_int(size), (opt == Kint)); lua_pushinteger(L, res); break; } @@ -1800,10 +1819,11 @@ static int str_unpack (lua_State *L) { break; } case Kstring: { - size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0); + lua_Unsigned len = (lua_Unsigned)unpackint(L, data + pos, + h.islittle, cast_int(size), 0); luaL_argcheck(L, len <= ld - pos - size, 2, "data string too short"); - lua_pushlstring(L, data + pos + size, len); - pos += len; /* skip string */ + lua_pushlstring(L, data + pos + size, cast_sizet(len)); + pos += cast_sizet(len); /* skip string */ break; } case Kzstr: { @@ -1820,7 +1840,7 @@ static int str_unpack (lua_State *L) { } pos += size; } - lua_pushinteger(L, pos + 1); /* next position */ + lua_pushinteger(L, cast_st2S(pos) + 1); /* next position */ return n + 1; } diff --git a/src/ltable.c b/src/ltable.c new file mode 100644 index 0000000..b7f88f6 --- /dev/null +++ b/src/ltable.c @@ -0,0 +1,1355 @@ +/* +** $Id: ltable.c $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#define ltable_c +#define LUA_CORE + +#include "lprefix.h" + + +/* +** Implementation of tables (aka arrays, objects, or hash tables). +** Tables keep its elements in two parts: an array part and a hash part. +** Non-negative integer keys are all candidates to be kept in the array +** part. The actual size of the array is the largest 'n' such that +** more than half the slots between 1 and n are in use. +** Hash uses a mix of chained scatter table with Brent's variation. +** A main invariant of these tables is that, if an element is not +** in its main position (i.e. the 'original' position that its hash gives +** to it), then the colliding element is in its own main position. +** Hence even when the load factor reaches 100%, performance remains good. +*/ + +#include +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* +** Only hash parts with at least 2^LIMFORLAST have a 'lastfree' field +** that optimizes finding a free slot. That field is stored just before +** the array of nodes, in the same block. Smaller tables do a complete +** search when looking for a free slot. +*/ +#define LIMFORLAST 3 /* log2 of real limit (8) */ + +/* +** The union 'Limbox' stores 'lastfree' and ensures that what follows it +** is properly aligned to store a Node. +*/ +typedef struct { Node *dummy; Node follows_pNode; } Limbox_aux; + +typedef union { + Node *lastfree; + char padding[offsetof(Limbox_aux, follows_pNode)]; +} Limbox; + +#define haslastfree(t) ((t)->lsizenode >= LIMFORLAST) +#define getlastfree(t) ((cast(Limbox *, (t)->node) - 1)->lastfree) + + +/* +** MAXABITS is the largest integer such that 2^MAXABITS fits in an +** unsigned int. +*/ +#define MAXABITS (l_numbits(int) - 1) + + +/* +** MAXASIZEB is the maximum number of elements in the array part such +** that the size of the array fits in 'size_t'. +*/ +#define MAXASIZEB (MAX_SIZET/(sizeof(Value) + 1)) + + +/* +** MAXASIZE is the maximum size of the array part. It is the minimum +** between 2^MAXABITS and MAXASIZEB. +*/ +#define MAXASIZE \ + (((1u << MAXABITS) < MAXASIZEB) ? (1u << MAXABITS) : cast_uint(MAXASIZEB)) + +/* +** MAXHBITS is the largest integer such that 2^MAXHBITS fits in a +** signed int. +*/ +#define MAXHBITS (MAXABITS - 1) + + +/* +** MAXHSIZE is the maximum size of the hash part. It is the minimum +** between 2^MAXHBITS and the maximum size such that, measured in bytes, +** it fits in a 'size_t'. +*/ +#define MAXHSIZE luaM_limitN(1 << MAXHBITS, Node) + + +/* +** When the original hash value is good, hashing by a power of 2 +** avoids the cost of '%'. +*/ +#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) + +/* +** for other types, it is better to avoid modulo by power of 2, as +** they can have many 2 factors. +*/ +#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1u)|1u)))) + + +#define hashstr(t,str) hashpow2(t, (str)->hash) +#define hashboolean(t,p) hashpow2(t, p) + + +#define hashpointer(t,p) hashmod(t, point2uint(p)) + + +#define dummynode (&dummynode_) + +/* +** Common hash part for tables with empty hash parts. That allows all +** tables to have a hash part, avoiding an extra check ("is there a hash +** part?") when indexing. Its sole node has an empty value and a key +** (DEADKEY, NULL) that is different from any valid TValue. +*/ +static const Node dummynode_ = { + {{NULL}, LUA_VEMPTY, /* value's value and type */ + LUA_TDEADKEY, 0, {NULL}} /* key type, next, and key value */ +}; + + +static const TValue absentkey = {ABSTKEYCONSTANT}; + + +/* +** Hash for integers. To allow a good hash, use the remainder operator +** ('%'). If integer fits as a non-negative int, compute an int +** remainder, which is faster. Otherwise, use an unsigned-integer +** remainder, which uses all bits and ensures a non-negative result. +*/ +static Node *hashint (const Table *t, lua_Integer i) { + lua_Unsigned ui = l_castS2U(i); + if (ui <= cast_uint(INT_MAX)) + return gnode(t, cast_int(ui) % cast_int((sizenode(t)-1) | 1)); + else + return hashmod(t, ui); +} + + +/* +** Hash for floating-point numbers. +** The main computation should be just +** n = frexp(n, &i); return (n * INT_MAX) + i +** but there are some numerical subtleties. +** In a two-complement representation, INT_MAX may not have an exact +** representation as a float, but INT_MIN does; because the absolute +** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the +** absolute value of the product 'frexp * -INT_MIN' is smaller or equal +** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when +** adding 'i'; the use of '~u' (instead of '-u') avoids problems with +** INT_MIN. +*/ +#if !defined(l_hashfloat) +static unsigned l_hashfloat (lua_Number n) { + int i; + lua_Integer ni; + n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); + if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */ + lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL)); + return 0; + } + else { /* normal case */ + unsigned int u = cast_uint(i) + cast_uint(ni); + return (u <= cast_uint(INT_MAX) ? u : ~u); + } +} +#endif + + +/* +** returns the 'main' position of an element in a table (that is, +** the index of its hash value). +*/ +static Node *mainpositionTV (const Table *t, const TValue *key) { + switch (ttypetag(key)) { + case LUA_VNUMINT: { + lua_Integer i = ivalue(key); + return hashint(t, i); + } + case LUA_VNUMFLT: { + lua_Number n = fltvalue(key); + return hashmod(t, l_hashfloat(n)); + } + case LUA_VSHRSTR: { + TString *ts = tsvalue(key); + return hashstr(t, ts); + } + case LUA_VLNGSTR: { + TString *ts = tsvalue(key); + return hashpow2(t, luaS_hashlongstr(ts)); + } + case LUA_VFALSE: + return hashboolean(t, 0); + case LUA_VTRUE: + return hashboolean(t, 1); + case LUA_VLIGHTUSERDATA: { + void *p = pvalue(key); + return hashpointer(t, p); + } + case LUA_VLCF: { + lua_CFunction f = fvalue(key); + return hashpointer(t, f); + } + default: { + GCObject *o = gcvalue(key); + return hashpointer(t, o); + } + } +} + + +l_sinline Node *mainpositionfromnode (const Table *t, Node *nd) { + TValue key; + getnodekey(cast(lua_State *, NULL), &key, nd); + return mainpositionTV(t, &key); +} + + +/* +** Check whether key 'k1' is equal to the key in node 'n2'. This +** equality is raw, so there are no metamethods. Floats with integer +** values have been normalized, so integers cannot be equal to +** floats. It is assumed that 'eqshrstr' is simply pointer equality, +** so that short strings are handled in the default case. The flag +** 'deadok' means to accept dead keys as equal to their original values. +** (Only collectable objects can produce dead keys.) Note that dead +** long strings are also compared by identity. Once a key is dead, +** its corresponding value may be collected, and then another value +** can be created with the same address. If this other value is given +** to 'next', 'equalkey' will signal a false positive. In a regular +** traversal, this situation should never happen, as all keys given to +** 'next' came from the table itself, and therefore could not have been +** collected. Outside a regular traversal, we have garbage in, garbage +** out. What is relevant is that this false positive does not break +** anything. (In particular, 'next' will return some other valid item +** on the table or nil.) +*/ +static int equalkey (const TValue *k1, const Node *n2, int deadok) { + if (rawtt(k1) != keytt(n2)) { /* not the same variants? */ + if (keyisshrstr(n2) && ttislngstring(k1)) { + /* an external string can be equal to a short-string key */ + return luaS_eqstr(tsvalue(k1), keystrval(n2)); + } + else if (deadok && keyisdead(n2) && iscollectable(k1)) { + /* a collectable value can be equal to a dead key */ + return gcvalue(k1) == gcvalueraw(keyval(n2)); + } + else + return 0; /* otherwise, different variants cannot be equal */ + } + else { /* equal variants */ + switch (keytt(n2)) { + case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: + return 1; + case LUA_VNUMINT: + return (ivalue(k1) == keyival(n2)); + case LUA_VNUMFLT: + return luai_numeq(fltvalue(k1), fltvalueraw(keyval(n2))); + case LUA_VLIGHTUSERDATA: + return pvalue(k1) == pvalueraw(keyval(n2)); + case LUA_VLCF: + return fvalue(k1) == fvalueraw(keyval(n2)); + case ctb(LUA_VLNGSTR): + return luaS_eqstr(tsvalue(k1), keystrval(n2)); + default: + return gcvalue(k1) == gcvalueraw(keyval(n2)); + } + } +} + + +/* +** "Generic" get version. (Not that generic: not valid for integers, +** which may be in array part, nor for floats with integral values.) +** See explanation about 'deadok' in function 'equalkey'. +*/ +static const TValue *getgeneric (Table *t, const TValue *key, int deadok) { + Node *n = mainpositionTV(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (equalkey(key, n, deadok)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +/* +** Return the index 'k' (converted to an unsigned) if it is inside +** the range [1, limit]. +*/ +static unsigned checkrange (lua_Integer k, unsigned limit) { + return (l_castS2U(k) - 1u < limit) ? cast_uint(k) : 0; +} + + +/* +** Return the index 'k' if 'k' is an appropriate key to live in the +** array part of a table, 0 otherwise. +*/ +#define arrayindex(k) checkrange(k, MAXASIZE) + + +/* +** Check whether an integer key is in the array part of a table and +** return its index there, or zero. +*/ +#define ikeyinarray(t,k) checkrange(k, t->asize) + + +/* +** Check whether a key is in the array part of a table and return its +** index there, or zero. +*/ +static unsigned keyinarray (Table *t, const TValue *key) { + return (ttisinteger(key)) ? ikeyinarray(t, ivalue(key)) : 0; +} + + +/* +** returns the index of a 'key' for table traversals. First goes all +** elements in the array part, then elements in the hash part. The +** beginning of a traversal is signaled by 0. +*/ +static unsigned findindex (lua_State *L, Table *t, TValue *key, + unsigned asize) { + unsigned int i; + if (ttisnil(key)) return 0; /* first iteration */ + i = keyinarray(t, key); + if (i != 0) /* is 'key' inside array part? */ + return i; /* yes; that's the index */ + else { + const TValue *n = getgeneric(t, key, 1); + if (l_unlikely(isabstkey(n))) + luaG_runerror(L, "invalid key to 'next'"); /* key not found */ + i = cast_uint(nodefromval(n) - gnode(t, 0)); /* key index in hash table */ + /* hash elements are numbered after array ones */ + return (i + 1) + asize; + } +} + + +int luaH_next (lua_State *L, Table *t, StkId key) { + unsigned int asize = t->asize; + unsigned int i = findindex(L, t, s2v(key), asize); /* find original key */ + for (; i < asize; i++) { /* try first array part */ + lu_byte tag = *getArrTag(t, i); + if (!tagisempty(tag)) { /* a non-empty entry? */ + setivalue(s2v(key), cast_int(i) + 1); + farr2val(t, i, tag, s2v(key + 1)); + return 1; + } + } + for (i -= asize; i < sizenode(t); i++) { /* hash part */ + if (!isempty(gval(gnode(t, i)))) { /* a non-empty entry? */ + Node *n = gnode(t, i); + getnodekey(L, s2v(key), n); + setobj2s(L, key + 1, gval(n)); + return 1; + } + } + return 0; /* no more elements */ +} + + +/* Extra space in Node array if it has a lastfree entry */ +#define extraLastfree(t) (haslastfree(t) ? sizeof(Limbox) : 0) + +/* 'node' size in bytes */ +static size_t sizehash (Table *t) { + return cast_sizet(sizenode(t)) * sizeof(Node) + extraLastfree(t); +} + + +static void freehash (lua_State *L, Table *t) { + if (!isdummy(t)) { + /* get pointer to the beginning of Node array */ + char *arr = cast_charp(t->node) - extraLastfree(t); + luaM_freearray(L, arr, sizehash(t)); + } +} + + +/* +** {============================================================= +** Rehash +** ============================================================== +*/ + +static int insertkey (Table *t, const TValue *key, TValue *value); +static void newcheckedkey (Table *t, const TValue *key, TValue *value); + + +/* +** Structure to count the keys in a table. +** 'total' is the total number of keys in the table. +** 'na' is the number of *array indices* in the table (see 'arrayindex'). +** 'deleted' is true if there are deleted nodes in the hash part. +** 'nums' is a "count array" where 'nums[i]' is the number of integer +** keys between 2^(i - 1) + 1 and 2^i. Note that 'na' is the summation +** of 'nums'. +*/ +typedef struct { + unsigned total; + unsigned na; + int deleted; + unsigned nums[MAXABITS + 1]; +} Counters; + + +/* +** Check whether it is worth to use 'na' array entries instead of 'nh' +** hash nodes. (A hash node uses ~3 times more memory than an array +** entry: Two values plus 'next' versus one value.) Evaluate with size_t +** to avoid overflows. +*/ +#define arrayXhash(na,nh) (cast_sizet(na) <= cast_sizet(nh) * 3) + +/* +** Compute the optimal size for the array part of table 't'. +** This size maximizes the number of elements going to the array part +** while satisfying the condition 'arrayXhash' with the use of memory if +** all those elements went to the hash part. +** 'ct->na' enters with the total number of array indices in the table +** and leaves with the number of keys that will go to the array part; +** return the optimal size for the array part. +*/ +static unsigned computesizes (Counters *ct) { + int i; + unsigned int twotoi; /* 2^i (candidate for optimal size) */ + unsigned int a = 0; /* number of elements smaller than 2^i */ + unsigned int na = 0; /* number of elements to go to array part */ + unsigned int optimal = 0; /* optimal size for array part */ + /* traverse slices while 'twotoi' does not overflow and total of array + indices still can satisfy 'arrayXhash' against the array size */ + for (i = 0, twotoi = 1; + twotoi > 0 && arrayXhash(twotoi, ct->na); + i++, twotoi *= 2) { + unsigned nums = ct->nums[i]; + a += nums; + if (nums > 0 && /* grows array only if it gets more elements... */ + arrayXhash(twotoi, a)) { /* ...while using "less memory" */ + optimal = twotoi; /* optimal size (till now) */ + na = a; /* all elements up to 'optimal' will go to array part */ + } + } + ct->na = na; + return optimal; +} + + +static void countint (lua_Integer key, Counters *ct) { + unsigned int k = arrayindex(key); + if (k != 0) { /* is 'key' an array index? */ + ct->nums[luaO_ceillog2(k)]++; /* count as such */ + ct->na++; + } +} + + +l_sinline int arraykeyisempty (const Table *t, unsigned key) { + int tag = *getArrTag(t, key - 1); + return tagisempty(tag); +} + + +/* +** Count keys in array part of table 't'. +*/ +static void numusearray (const Table *t, Counters *ct) { + int lg; + unsigned int ttlg; /* 2^lg */ + unsigned int ause = 0; /* summation of 'nums' */ + unsigned int i = 1; /* index to traverse all array keys */ + unsigned int asize = t->asize; + /* traverse each slice */ + for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) { + unsigned int lc = 0; /* counter */ + unsigned int lim = ttlg; + if (lim > asize) { + lim = asize; /* adjust upper limit */ + if (i > lim) + break; /* no more elements to count */ + } + /* count elements in range (2^(lg - 1), 2^lg] */ + for (; i <= lim; i++) { + if (!arraykeyisempty(t, i)) + lc++; + } + ct->nums[lg] += lc; + ause += lc; + } + ct->total += ause; + ct->na += ause; +} + + +/* +** Count keys in hash part of table 't'. As this only happens during +** a rehash, all nodes have been used. A node can have a nil value only +** if it was deleted after being created. +*/ +static void numusehash (const Table *t, Counters *ct) { + unsigned i = sizenode(t); + unsigned total = 0; + while (i--) { + Node *n = &t->node[i]; + if (isempty(gval(n))) { + lua_assert(!keyisnil(n)); /* entry was deleted; key cannot be nil */ + ct->deleted = 1; + } + else { + total++; + if (keyisinteger(n)) + countint(keyival(n), ct); + } + } + ct->total += total; +} + + +/* +** Convert an "abstract size" (number of slots in an array) to +** "concrete size" (number of bytes in the array). +*/ +static size_t concretesize (unsigned int size) { + if (size == 0) + return 0; + else /* space for the two arrays plus an unsigned in between */ + return size * (sizeof(Value) + 1) + sizeof(unsigned); +} + + +/* +** Resize the array part of a table. If new size is equal to the old, +** do nothing. Else, if new size is zero, free the old array. (It must +** be present, as the sizes are different.) Otherwise, allocate a new +** array, move the common elements to new proper position, and then +** frees the old array. +** We could reallocate the array, but we still would need to move the +** elements to their new position, so the copy implicit in realloc is a +** waste. Moreover, most allocators will move the array anyway when the +** new size is double the old one (the most common case). +*/ +static Value *resizearray (lua_State *L , Table *t, + unsigned oldasize, + unsigned newasize) { + if (oldasize == newasize) + return t->array; /* nothing to be done */ + else if (newasize == 0) { /* erasing array? */ + Value *op = t->array - oldasize; /* original array's real address */ + luaM_freemem(L, op, concretesize(oldasize)); /* free it */ + return NULL; + } + else { + size_t newasizeb = concretesize(newasize); + Value *np = cast(Value *, + luaM_reallocvector(L, NULL, 0, newasizeb, lu_byte)); + if (np == NULL) /* allocation error? */ + return NULL; + np += newasize; /* shift pointer to the end of value segment */ + if (oldasize > 0) { + /* move common elements to new position */ + size_t oldasizeb = concretesize(oldasize); + Value *op = t->array; /* original array */ + unsigned tomove = (oldasize < newasize) ? oldasize : newasize; + size_t tomoveb = (oldasize < newasize) ? oldasizeb : newasizeb; + lua_assert(tomoveb > 0); + memcpy(np - tomove, op - tomove, tomoveb); + luaM_freemem(L, op - oldasize, oldasizeb); /* free old block */ + } + return np; + } +} + + +/* +** Creates an array for the hash part of a table with the given +** size, or reuses the dummy node if size is zero. +** The computation for size overflow is in two steps: the first +** comparison ensures that the shift in the second one does not +** overflow. +*/ +static void setnodevector (lua_State *L, Table *t, unsigned size) { + if (size == 0) { /* no elements to hash part? */ + t->node = cast(Node *, dummynode); /* use common 'dummynode' */ + t->lsizenode = 0; + setdummy(t); /* signal that it is using dummy node */ + } + else { + int i; + int lsize = luaO_ceillog2(size); + if (lsize > MAXHBITS || (1 << lsize) > MAXHSIZE) + luaG_runerror(L, "table overflow"); + size = twoto(lsize); + if (lsize < LIMFORLAST) /* no 'lastfree' field? */ + t->node = luaM_newvector(L, size, Node); + else { + size_t bsize = size * sizeof(Node) + sizeof(Limbox); + char *node = luaM_newblock(L, bsize); + t->node = cast(Node *, node + sizeof(Limbox)); + getlastfree(t) = gnode(t, size); /* all positions are free */ + } + t->lsizenode = cast_byte(lsize); + setnodummy(t); + for (i = 0; i < cast_int(size); i++) { + Node *n = gnode(t, i); + gnext(n) = 0; + setnilkey(n); + setempty(gval(n)); + } + } +} + + +/* +** (Re)insert all elements from the hash part of 'ot' into table 't'. +*/ +static void reinserthash (lua_State *L, Table *ot, Table *t) { + unsigned j; + unsigned size = sizenode(ot); + for (j = 0; j < size; j++) { + Node *old = gnode(ot, j); + if (!isempty(gval(old))) { + /* doesn't need barrier/invalidate cache, as entry was + already present in the table */ + TValue k; + getnodekey(L, &k, old); + newcheckedkey(t, &k, gval(old)); + } + } +} + + +/* +** Exchange the hash part of 't1' and 't2'. (In 'flags', only the +** dummy bit must be exchanged: The 'isrealasize' is not related +** to the hash part, and the metamethod bits do not change during +** a resize, so the "real" table can keep their values.) +*/ +static void exchangehashpart (Table *t1, Table *t2) { + lu_byte lsizenode = t1->lsizenode; + Node *node = t1->node; + int bitdummy1 = t1->flags & BITDUMMY; + t1->lsizenode = t2->lsizenode; + t1->node = t2->node; + t1->flags = cast_byte((t1->flags & NOTBITDUMMY) | (t2->flags & BITDUMMY)); + t2->lsizenode = lsizenode; + t2->node = node; + t2->flags = cast_byte((t2->flags & NOTBITDUMMY) | bitdummy1); +} + + +/* +** Re-insert into the new hash part of a table the elements from the +** vanishing slice of the array part. +*/ +static void reinsertOldSlice (Table *t, unsigned oldasize, + unsigned newasize) { + unsigned i; + for (i = newasize; i < oldasize; i++) { /* traverse vanishing slice */ + lu_byte tag = *getArrTag(t, i); + if (!tagisempty(tag)) { /* a non-empty entry? */ + TValue key, aux; + setivalue(&key, l_castU2S(i) + 1); /* make the key */ + farr2val(t, i, tag, &aux); /* copy value into 'aux' */ + insertkey(t, &key, &aux); /* insert entry into the hash part */ + } + } +} + + +/* +** Clear new slice of the array. +*/ +static void clearNewSlice (Table *t, unsigned oldasize, unsigned newasize) { + for (; oldasize < newasize; oldasize++) + *getArrTag(t, oldasize) = LUA_VEMPTY; +} + + +/* +** Resize table 't' for the new given sizes. Both allocations (for +** the hash part and for the array part) can fail, which creates some +** subtleties. If the first allocation, for the hash part, fails, an +** error is raised and that is it. Otherwise, it copies the elements from +** the shrinking part of the array (if it is shrinking) into the new +** hash. Then it reallocates the array part. If that fails, the table +** is in its original state; the function frees the new hash part and then +** raises the allocation error. Otherwise, it sets the new hash part +** into the table, initializes the new part of the array (if any) with +** nils and reinserts the elements of the old hash back into the new +** parts of the table. +** Note that if the new size for the array part ('newasize') is equal to +** the old one ('oldasize'), this function will do nothing with that +** part. +*/ +void luaH_resize (lua_State *L, Table *t, unsigned newasize, + unsigned nhsize) { + Table newt; /* to keep the new hash part */ + unsigned oldasize = t->asize; + Value *newarray; + if (newasize > MAXASIZE) + luaG_runerror(L, "table overflow"); + /* create new hash part with appropriate size into 'newt' */ + newt.flags = 0; + setnodevector(L, &newt, nhsize); + if (newasize < oldasize) { /* will array shrink? */ + /* re-insert into the new hash the elements from vanishing slice */ + exchangehashpart(t, &newt); /* pretend table has new hash */ + reinsertOldSlice(t, oldasize, newasize); + exchangehashpart(t, &newt); /* restore old hash (in case of errors) */ + } + /* allocate new array */ + newarray = resizearray(L, t, oldasize, newasize); + if (l_unlikely(newarray == NULL && newasize > 0)) { /* allocation failed? */ + freehash(L, &newt); /* release new hash part */ + luaM_error(L); /* raise error (with array unchanged) */ + } + /* allocation ok; initialize new part of the array */ + exchangehashpart(t, &newt); /* 't' has the new hash ('newt' has the old) */ + t->array = newarray; /* set new array part */ + t->asize = newasize; + if (newarray != NULL) + *lenhint(t) = newasize / 2u; /* set an initial hint */ + clearNewSlice(t, oldasize, newasize); + /* re-insert elements from old hash part into new parts */ + reinserthash(L, &newt, t); /* 'newt' now has the old hash */ + freehash(L, &newt); /* free old hash part */ +} + + +void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { + unsigned nsize = allocsizenode(t); + luaH_resize(L, t, nasize, nsize); +} + + +/* +** Rehash a table. First, count its keys. If there are array indices +** outside the array part, compute the new best size for that part. +** Then, resize the table. +*/ +static void rehash (lua_State *L, Table *t, const TValue *ek) { + unsigned asize; /* optimal size for array part */ + Counters ct; + unsigned i; + unsigned nsize; /* size for the hash part */ + /* reset counts */ + for (i = 0; i <= MAXABITS; i++) ct.nums[i] = 0; + ct.na = 0; + ct.deleted = 0; + ct.total = 1; /* count extra key */ + if (ttisinteger(ek)) + countint(ivalue(ek), &ct); /* extra key may go to array */ + numusehash(t, &ct); /* count keys in hash part */ + if (ct.na == 0) { + /* no new keys to enter array part; keep it with the same size */ + asize = t->asize; + } + else { /* compute best size for array part */ + numusearray(t, &ct); /* count keys in array part */ + asize = computesizes(&ct); /* compute new size for array part */ + } + /* all keys not in the array part go to the hash part */ + nsize = ct.total - ct.na; + if (ct.deleted) { /* table has deleted entries? */ + /* insertion-deletion-insertion: give hash some extra size to + avoid repeated resizings */ + nsize += nsize >> 2; + } + /* resize the table to new computed sizes */ + luaH_resize(L, t, asize, nsize); +} + +/* +** }============================================================= +*/ + + +Table *luaH_new (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_VTABLE, sizeof(Table)); + Table *t = gco2t(o); + t->metatable = NULL; + t->flags = maskflags; /* table has no metamethod fields */ + t->array = NULL; + t->asize = 0; + setnodevector(L, t, 0); + return t; +} + + +lu_mem luaH_size (Table *t) { + lu_mem sz = cast(lu_mem, sizeof(Table)) + concretesize(t->asize); + if (!isdummy(t)) + sz += sizehash(t); + return sz; +} + + +/* +** Frees a table. +*/ +void luaH_free (lua_State *L, Table *t) { + freehash(L, t); + resizearray(L, t, t->asize, 0); + luaM_free(L, t); +} + + +static Node *getfreepos (Table *t) { + if (haslastfree(t)) { /* does it have 'lastfree' information? */ + /* look for a spot before 'lastfree', updating 'lastfree' */ + while (getlastfree(t) > t->node) { + Node *free = --getlastfree(t); + if (keyisnil(free)) + return free; + } + } + else { /* no 'lastfree' information */ + unsigned i = sizenode(t); + while (i--) { /* do a linear search */ + Node *free = gnode(t, i); + if (keyisnil(free)) + return free; + } + } + return NULL; /* could not find a free place */ +} + + + +/* +** Inserts a new key into a hash table; first, check whether key's main +** position is free. If not, check whether colliding node is in its main +** position or not: if it is not, move colliding node to an empty place +** and put new key in its main position; otherwise (colliding node is in +** its main position), new key goes to an empty position. Return 0 if +** could not insert key (could not find a free space). +*/ +static int insertkey (Table *t, const TValue *key, TValue *value) { + Node *mp = mainpositionTV(t, key); + /* table cannot already contain the key */ + lua_assert(isabstkey(getgeneric(t, key, 0))); + if (!isempty(gval(mp)) || isdummy(t)) { /* main position is taken? */ + Node *othern; + Node *f = getfreepos(t); /* get a free place */ + if (f == NULL) /* cannot find a free place? */ + return 0; + lua_assert(!isdummy(t)); + othern = mainpositionfromnode(t, mp); + if (othern != mp) { /* is colliding node out of its main position? */ + /* yes; move colliding node into free position */ + while (othern + gnext(othern) != mp) /* find previous */ + othern += gnext(othern); + gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */ + *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + if (gnext(mp) != 0) { + gnext(f) += cast_int(mp - f); /* correct 'next' */ + gnext(mp) = 0; /* now 'mp' is free */ + } + setempty(gval(mp)); + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + if (gnext(mp) != 0) + gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */ + else lua_assert(gnext(f) == 0); + gnext(mp) = cast_int(f - mp); + mp = f; + } + } + setnodekey(mp, key); + lua_assert(isempty(gval(mp))); + setobj2t(cast(lua_State *, 0), gval(mp), value); + return 1; +} + + +/* +** Insert a key in a table where there is space for that key, the +** key is valid, and the value is not nil. +*/ +static void newcheckedkey (Table *t, const TValue *key, TValue *value) { + unsigned i = keyinarray(t, key); + if (i > 0) /* is key in the array part? */ + obj2arr(t, i - 1, value); /* set value in the array */ + else { + int done = insertkey(t, key, value); /* insert key in the hash part */ + lua_assert(done); /* it cannot fail */ + cast(void, done); /* to avoid warnings */ + } +} + + +static void luaH_newkey (lua_State *L, Table *t, const TValue *key, + TValue *value) { + if (!ttisnil(value)) { /* do not insert nil values */ + int done = insertkey(t, key, value); + if (!done) { /* could not find a free place? */ + rehash(L, t, key); /* grow table */ + newcheckedkey(t, key, value); /* insert key in grown table */ + } + luaC_barrierback(L, obj2gco(t), key); + /* for debugging only: any new key may force an emergency collection */ + condchangemem(L, (void)0, (void)0, 1); + } +} + + +static const TValue *getintfromhash (Table *t, lua_Integer key) { + Node *n = hashint(t, key); + lua_assert(!ikeyinarray(t, key)); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisinteger(n) && keyival(n) == key) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) break; + n += nx; + } + } + return &absentkey; +} + + +static int hashkeyisempty (Table *t, lua_Unsigned key) { + const TValue *val = getintfromhash(t, l_castU2S(key)); + return isempty(val); +} + + +static lu_byte finishnodeget (const TValue *val, TValue *res) { + if (!ttisnil(val)) { + setobj(((lua_State*)NULL), res, val); + } + return ttypetag(val); +} + + +lu_byte luaH_getint (Table *t, lua_Integer key, TValue *res) { + unsigned k = ikeyinarray(t, key); + if (k > 0) { + lu_byte tag = *getArrTag(t, k - 1); + if (!tagisempty(tag)) + farr2val(t, k - 1, tag, res); + return tag; + } + else + return finishnodeget(getintfromhash(t, key), res); +} + + +/* +** search function for short strings +*/ +const TValue *luaH_Hgetshortstr (Table *t, TString *key) { + Node *n = hashstr(t, key); + lua_assert(strisshr(key)); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisshrstr(n) && eqshrstr(keystrval(n), key)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +lu_byte luaH_getshortstr (Table *t, TString *key, TValue *res) { + return finishnodeget(luaH_Hgetshortstr(t, key), res); +} + + +static const TValue *Hgetlongstr (Table *t, TString *key) { + TValue ko; + lua_assert(!strisshr(key)); + setsvalue(cast(lua_State *, NULL), &ko, key); + return getgeneric(t, &ko, 0); /* for long strings, use generic case */ +} + + +static const TValue *Hgetstr (Table *t, TString *key) { + if (strisshr(key)) + return luaH_Hgetshortstr(t, key); + else + return Hgetlongstr(t, key); +} + + +lu_byte luaH_getstr (Table *t, TString *key, TValue *res) { + return finishnodeget(Hgetstr(t, key), res); +} + + +/* +** main search function +*/ +lu_byte luaH_get (Table *t, const TValue *key, TValue *res) { + const TValue *slot; + switch (ttypetag(key)) { + case LUA_VSHRSTR: + slot = luaH_Hgetshortstr(t, tsvalue(key)); + break; + case LUA_VNUMINT: + return luaH_getint(t, ivalue(key), res); + case LUA_VNIL: + slot = &absentkey; + break; + case LUA_VNUMFLT: { + lua_Integer k; + if (luaV_flttointeger(fltvalue(key), &k, F2Ieq)) /* integral index? */ + return luaH_getint(t, k, res); /* use specialized version */ + /* else... */ + } /* FALLTHROUGH */ + default: + slot = getgeneric(t, key, 0); + break; + } + return finishnodeget(slot, res); +} + + +/* +** When a 'pset' cannot be completed, this function returns an encoding +** of its result, to be used by 'luaH_finishset'. +*/ +static int retpsetcode (Table *t, const TValue *slot) { + if (isabstkey(slot)) + return HNOTFOUND; /* no slot with that key */ + else /* return node encoded */ + return cast_int((cast(Node*, slot) - t->node)) + HFIRSTNODE; +} + + +static int finishnodeset (Table *t, const TValue *slot, TValue *val) { + if (!ttisnil(slot)) { + setobj(((lua_State*)NULL), cast(TValue*, slot), val); + return HOK; /* success */ + } + else + return retpsetcode(t, slot); +} + + +static int rawfinishnodeset (const TValue *slot, TValue *val) { + if (isabstkey(slot)) + return 0; /* no slot with that key */ + else { + setobj(((lua_State*)NULL), cast(TValue*, slot), val); + return 1; /* success */ + } +} + + +int luaH_psetint (Table *t, lua_Integer key, TValue *val) { + lua_assert(!ikeyinarray(t, key)); + return finishnodeset(t, getintfromhash(t, key), val); +} + + +static int psetint (Table *t, lua_Integer key, TValue *val) { + int hres; + luaH_fastseti(t, key, val, hres); + return hres; +} + + +/* +** This function could be just this: +** return finishnodeset(t, luaH_Hgetshortstr(t, key), val); +** However, it optimizes the common case created by constructors (e.g., +** {x=1, y=2}), which creates a key in a table that has no metatable, +** it is not old/black, and it already has space for the key. +*/ + +int luaH_psetshortstr (Table *t, TString *key, TValue *val) { + const TValue *slot = luaH_Hgetshortstr(t, key); + if (!ttisnil(slot)) { /* key already has a value? (all too common) */ + setobj(((lua_State*)NULL), cast(TValue*, slot), val); /* update it */ + return HOK; /* done */ + } + else if (checknoTM(t->metatable, TM_NEWINDEX)) { /* no metamethod? */ + if (ttisnil(val)) /* new value is nil? */ + return HOK; /* done (value is already nil/absent) */ + if (isabstkey(slot) && /* key is absent? */ + !(isblack(t) && iswhite(key))) { /* and don't need barrier? */ + TValue tk; /* key as a TValue */ + setsvalue(cast(lua_State *, NULL), &tk, key); + if (insertkey(t, &tk, val)) { /* insert key, if there is space */ + invalidateTMcache(t); + return HOK; + } + } + } + /* Else, either table has new-index metamethod, or it needs barrier, + or it needs to rehash for the new key. In any of these cases, the + operation cannot be completed here. Return a code for the caller. */ + return retpsetcode(t, slot); +} + + +int luaH_psetstr (Table *t, TString *key, TValue *val) { + if (strisshr(key)) + return luaH_psetshortstr(t, key, val); + else + return finishnodeset(t, Hgetlongstr(t, key), val); +} + + +int luaH_pset (Table *t, const TValue *key, TValue *val) { + switch (ttypetag(key)) { + case LUA_VSHRSTR: return luaH_psetshortstr(t, tsvalue(key), val); + case LUA_VNUMINT: return psetint(t, ivalue(key), val); + case LUA_VNIL: return HNOTFOUND; + case LUA_VNUMFLT: { + lua_Integer k; + if (luaV_flttointeger(fltvalue(key), &k, F2Ieq)) /* integral index? */ + return psetint(t, k, val); /* use specialized version */ + /* else... */ + } /* FALLTHROUGH */ + default: + return finishnodeset(t, getgeneric(t, key, 0), val); + } +} + +/* +** Finish a raw "set table" operation, where 'hres' encodes where the +** value should have been (the result of a previous 'pset' operation). +** Beware: when using this function the caller probably need to check a +** GC barrier and invalidate the TM cache. +*/ +void luaH_finishset (lua_State *L, Table *t, const TValue *key, + TValue *value, int hres) { + lua_assert(hres != HOK); + if (hres == HNOTFOUND) { + TValue aux; + if (l_unlikely(ttisnil(key))) + luaG_runerror(L, "table index is nil"); + else if (ttisfloat(key)) { + lua_Number f = fltvalue(key); + lua_Integer k; + if (luaV_flttointeger(f, &k, F2Ieq)) { + setivalue(&aux, k); /* key is equal to an integer */ + key = &aux; /* insert it as an integer */ + } + else if (l_unlikely(luai_numisnan(f))) + luaG_runerror(L, "table index is NaN"); + } + else if (isextstr(key)) { /* external string? */ + /* If string is short, must internalize it to be used as table key */ + TString *ts = luaS_normstr(L, tsvalue(key)); + setsvalue2s(L, L->top.p++, ts); /* anchor 'ts' (EXTRA_STACK) */ + luaH_newkey(L, t, s2v(L->top.p - 1), value); + L->top.p--; + return; + } + luaH_newkey(L, t, key, value); + } + else if (hres > 0) { /* regular Node? */ + setobj2t(L, gval(gnode(t, hres - HFIRSTNODE)), value); + } + else { /* array entry */ + hres = ~hres; /* real index */ + obj2arr(t, cast_uint(hres), value); + } +} + + +/* +** beware: when using this function you probably need to check a GC +** barrier and invalidate the TM cache. +*/ +void luaH_set (lua_State *L, Table *t, const TValue *key, TValue *value) { + int hres = luaH_pset(t, key, value); + if (hres != HOK) + luaH_finishset(L, t, key, value, hres); +} + + +/* +** Ditto for a GC barrier. (No need to invalidate the TM cache, as +** integers cannot be keys to metamethods.) +*/ +void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) { + unsigned ik = ikeyinarray(t, key); + if (ik > 0) + obj2arr(t, ik - 1, value); + else { + int ok = rawfinishnodeset(getintfromhash(t, key), value); + if (!ok) { + TValue k; + setivalue(&k, key); + luaH_newkey(L, t, &k, value); + } + } +} + + +/* +** Try to find a boundary in the hash part of table 't'. From the +** caller, we know that 'asize + 1' is present. We want to find a larger +** key that is absent from the table, so that we can do a binary search +** between the two keys to find a boundary. We keep doubling 'j' until +** we get an absent index. If the doubling would overflow, we try +** LUA_MAXINTEGER. If it is absent, we are ready for the binary search. +** ('j', being max integer, is larger or equal to 'i', but it cannot be +** equal because it is absent while 'i' is present.) Otherwise, 'j' is a +** boundary. ('j + 1' cannot be a present integer key because it is not +** a valid integer in Lua.) +** About 'rnd': If we used a fixed algorithm, a bad actor could fill +** a table with only the keys that would be probed, in such a way that +** a small table could result in a huge length. To avoid that, we use +** the state's seed as a source of randomness. For the first probe, +** we "randomly double" 'i' by adding to it a random number roughly its +** width. +*/ +static lua_Unsigned hash_search (lua_State *L, Table *t, unsigned asize) { + lua_Unsigned i = asize + 1; /* caller ensures t[i] is present */ + unsigned rnd = G(L)->seed; + int n = (asize > 0) ? luaO_ceillog2(asize) : 0; /* width of 'asize' */ + unsigned mask = (1u << n) - 1; /* 11...111 with the width of 'asize' */ + unsigned incr = (rnd & mask) + 1; /* first increment (at least 1) */ + lua_Unsigned j = (incr <= l_castS2U(LUA_MAXINTEGER) - i) ? i + incr : i + 1; + rnd >>= n; /* used 'n' bits from 'rnd' */ + while (!hashkeyisempty(t, j)) { /* repeat until an absent t[j] */ + i = j; /* 'i' is a present index */ + if (j <= l_castS2U(LUA_MAXINTEGER)/2 - 1) { + j = j*2 + (rnd & 1); /* try again with 2j or 2j+1 */ + rnd >>= 1; + } + else { + j = LUA_MAXINTEGER; + if (hashkeyisempty(t, j)) /* t[j] not present? */ + break; /* 'j' now is an absent index */ + else /* weird case */ + return j; /* well, max integer is a boundary... */ + } + } + /* i < j && t[i] present && t[j] absent */ + while (j - i > 1u) { /* do a binary search between them */ + lua_Unsigned m = (i + j) / 2; + if (hashkeyisempty(t, m)) j = m; + else i = m; + } + return i; +} + + +static unsigned int binsearch (Table *array, unsigned int i, unsigned int j) { + lua_assert(i <= j); + while (j - i > 1u) { /* binary search */ + unsigned int m = (i + j) / 2; + if (arraykeyisempty(array, m)) j = m; + else i = m; + } + return i; +} + + +/* return a border, saving it as a hint for next call */ +static lua_Unsigned newhint (Table *t, unsigned hint) { + lua_assert(hint <= t->asize); + *lenhint(t) = hint; + return hint; +} + + +/* +** Try to find a border in table 't'. (A 'border' is an integer index +** such that t[i] is present and t[i+1] is absent, or 0 if t[1] is absent, +** or 'maxinteger' if t[maxinteger] is present.) +** If there is an array part, try to find a border there. First try +** to find it in the vicinity of the previous result (hint), to handle +** cases like 't[#t + 1] = val' or 't[#t] = nil', that move the border +** by one entry. Otherwise, do a binary search to find the border. +** If there is no array part, or its last element is non empty, the +** border may be in the hash part. +*/ +lua_Unsigned luaH_getn (lua_State *L, Table *t) { + unsigned asize = t->asize; + if (asize > 0) { /* is there an array part? */ + const unsigned maxvicinity = 4; + unsigned limit = *lenhint(t); /* start with the hint */ + if (limit == 0) + limit = 1; /* make limit a valid index in the array */ + if (arraykeyisempty(t, limit)) { /* t[limit] empty? */ + /* there must be a border before 'limit' */ + unsigned i; + /* look for a border in the vicinity of the hint */ + for (i = 0; i < maxvicinity && limit > 1; i++) { + limit--; + if (!arraykeyisempty(t, limit)) + return newhint(t, limit); /* 'limit' is a border */ + } + /* t[limit] still empty; search for a border in [0, limit) */ + return newhint(t, binsearch(t, 0, limit)); + } + else { /* 'limit' is present in table; look for a border after it */ + unsigned i; + /* look for a border in the vicinity of the hint */ + for (i = 0; i < maxvicinity && limit < asize; i++) { + limit++; + if (arraykeyisempty(t, limit)) + return newhint(t, limit - 1); /* 'limit - 1' is a border */ + } + if (arraykeyisempty(t, asize)) { /* last element empty? */ + /* t[limit] not empty; search for a border in [limit, asize) */ + return newhint(t, binsearch(t, limit, asize)); + } + } + /* last element non empty; set a hint to speed up finding that again */ + /* (keys in the hash part cannot be hints) */ + *lenhint(t) = asize; + } + /* no array part or t[asize] is not empty; check the hash part */ + lua_assert(asize == 0 || !arraykeyisempty(t, asize)); + if (isdummy(t) || hashkeyisempty(t, asize + 1)) + return asize; /* 'asize + 1' is empty */ + else /* 'asize + 1' is also non empty */ + return hash_search(L, t, asize); +} + + + +#if defined(LUA_DEBUG) + +/* export this function for the test library */ + +Node *luaH_mainposition (const Table *t, const TValue *key) { + return mainpositionTV(t, key); +} + +#endif diff --git a/lua-5.4.7/src/ltablib.c b/src/ltablib.c similarity index 87% rename from lua-5.4.7/src/ltablib.c rename to src/ltablib.c index e6bc4d0..46ecb5e 100644 --- a/lua-5.4.7/src/ltablib.c +++ b/src/ltablib.c @@ -18,6 +18,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" /* @@ -58,6 +59,16 @@ static void checktab (lua_State *L, int arg, int what) { } +static int tcreate (lua_State *L) { + lua_Unsigned sizeseq = (lua_Unsigned)luaL_checkinteger(L, 1); + lua_Unsigned sizerest = (lua_Unsigned)luaL_optinteger(L, 2, 0); + luaL_argcheck(L, sizeseq <= cast_uint(INT_MAX), 1, "out of range"); + luaL_argcheck(L, sizerest <= cast_uint(INT_MAX), 2, "out of range"); + lua_createtable(L, cast_int(sizeseq), cast_int(sizerest)); + return 1; +} + + static int tinsert (lua_State *L) { lua_Integer pos; /* where to insert new element */ lua_Integer e = aux_getn(L, 1, TAB_RW); @@ -196,7 +207,7 @@ static int tunpack (lua_State *L) { lua_Integer i = luaL_optinteger(L, 2, 1); lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1)); if (i > e) return 0; /* empty range */ - n = (lua_Unsigned)e - i; /* number of elements minus 1 (avoid overflows) */ + n = l_castS2U(e) - l_castS2U(i); /* number of elements minus 1 */ if (l_unlikely(n >= (unsigned int)INT_MAX || !lua_checkstack(L, (int)(++n)))) return luaL_error(L, "too many results to unpack"); @@ -220,41 +231,26 @@ static int tunpack (lua_State *L) { */ -/* type for array indices */ +/* +** Type for array indices. These indices are always limited by INT_MAX, +** so it is safe to cast them to lua_Integer even for Lua 32 bits. +*/ typedef unsigned int IdxT; +/* Versions of lua_seti/lua_geti specialized for IdxT */ +#define geti(L,idt,idx) lua_geti(L, idt, l_castU2S(idx)) +#define seti(L,idt,idx) lua_seti(L, idt, l_castU2S(idx)) + + /* ** Produce a "random" 'unsigned int' to randomize pivot choice. This ** macro is used only when 'sort' detects a big imbalance in the result ** of a partition. (If you don't want/need this "randomness", ~0 is a ** good choice.) */ -#if !defined(l_randomizePivot) /* { */ - -#include - -/* size of 'e' measured in number of 'unsigned int's */ -#define sof(e) (sizeof(e) / sizeof(unsigned int)) - -/* -** Use 'time' and 'clock' as sources of "randomness". Because we don't -** know the types 'clock_t' and 'time_t', we cannot cast them to -** anything without risking overflows. A safe way to use their values -** is to copy them to an array of a known type and use the array values. -*/ -static unsigned int l_randomizePivot (void) { - clock_t c = clock(); - time_t t = time(NULL); - unsigned int buff[sof(c) + sof(t)]; - unsigned int i, rnd = 0; - memcpy(buff, &c, sof(c) * sizeof(unsigned int)); - memcpy(buff + sof(c), &t, sof(t) * sizeof(unsigned int)); - for (i = 0; i < sof(buff); i++) - rnd += buff[i]; - return rnd; -} - +#if !defined(l_randomizePivot) +#define l_randomizePivot(L) luaL_makeseed(L) #endif /* } */ @@ -263,8 +259,8 @@ static unsigned int l_randomizePivot (void) { static void set2 (lua_State *L, IdxT i, IdxT j) { - lua_seti(L, 1, i); - lua_seti(L, 1, j); + seti(L, 1, i); + seti(L, 1, j); } @@ -301,15 +297,15 @@ static IdxT partition (lua_State *L, IdxT lo, IdxT up) { /* loop invariant: a[lo .. i] <= P <= a[j .. up] */ for (;;) { /* next loop: repeat ++i while a[i] < P */ - while ((void)lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) { - if (l_unlikely(i == up - 1)) /* a[i] < P but a[up - 1] == P ?? */ + while ((void)geti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (l_unlikely(i == up - 1)) /* a[up - 1] < P == a[up - 1] */ luaL_error(L, "invalid order function for sorting"); lua_pop(L, 1); /* remove a[i] */ } - /* after the loop, a[i] >= P and a[lo .. i - 1] < P */ + /* after the loop, a[i] >= P and a[lo .. i - 1] < P (a) */ /* next loop: repeat --j while P < a[j] */ - while ((void)lua_geti(L, 1, --j), sort_comp(L, -3, -1)) { - if (l_unlikely(j < i)) /* j < i but a[j] > P ?? */ + while ((void)geti(L, 1, --j), sort_comp(L, -3, -1)) { + if (l_unlikely(j < i)) /* j <= i - 1 and a[j] > P, contradicts (a) */ luaL_error(L, "invalid order function for sorting"); lua_pop(L, 1); /* remove a[j] */ } @@ -333,7 +329,7 @@ static IdxT partition (lua_State *L, IdxT lo, IdxT up) { */ static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) { IdxT r4 = (up - lo) / 4; /* range/4 */ - IdxT p = rnd % (r4 * 2) + (lo + r4); + IdxT p = (rnd ^ lo ^ up) % (r4 * 2) + (lo + r4); lua_assert(lo + r4 <= p && p <= up - r4); return p; } @@ -342,14 +338,13 @@ static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) { /* ** Quicksort algorithm (recursive function) */ -static void auxsort (lua_State *L, IdxT lo, IdxT up, - unsigned int rnd) { +static void auxsort (lua_State *L, IdxT lo, IdxT up, unsigned rnd) { while (lo < up) { /* loop for tail recursion */ IdxT p; /* Pivot index */ IdxT n; /* to be used later */ /* sort elements 'lo', 'p', and 'up' */ - lua_geti(L, 1, lo); - lua_geti(L, 1, up); + geti(L, 1, lo); + geti(L, 1, up); if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */ set2(L, lo, up); /* swap a[lo] - a[up] */ else @@ -360,13 +355,13 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, p = (lo + up)/2; /* middle element is a good pivot */ else /* for larger intervals, it is worth a random pivot */ p = choosePivot(lo, up, rnd); - lua_geti(L, 1, p); - lua_geti(L, 1, lo); + geti(L, 1, p); + geti(L, 1, lo); if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */ set2(L, p, lo); /* swap a[p] - a[lo] */ else { lua_pop(L, 1); /* remove a[lo] */ - lua_geti(L, 1, up); + geti(L, 1, up); if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */ set2(L, p, up); /* swap a[up] - a[p] */ else @@ -374,9 +369,9 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, } if (up - lo == 2) /* only 3 elements? */ return; /* already sorted */ - lua_geti(L, 1, p); /* get middle element (Pivot) */ + geti(L, 1, p); /* get middle element (Pivot) */ lua_pushvalue(L, -1); /* push Pivot */ - lua_geti(L, 1, up - 1); /* push a[up - 1] */ + geti(L, 1, up - 1); /* push a[up - 1] */ set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */ p = partition(L, lo, up); /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */ @@ -391,7 +386,7 @@ static void auxsort (lua_State *L, IdxT lo, IdxT up, up = p - 1; /* tail call for [lo .. p - 1] (lower interval) */ } if ((up - lo) / 128 > n) /* partition too imbalanced? */ - rnd = l_randomizePivot(); /* try a new randomization */ + rnd = l_randomizePivot(L); /* try a new randomization */ } /* tail call auxsort(L, lo, up, rnd) */ } @@ -413,6 +408,7 @@ static int sort (lua_State *L) { static const luaL_Reg tab_funcs[] = { {"concat", tconcat}, + {"create", tcreate}, {"insert", tinsert}, {"pack", tpack}, {"unpack", tunpack}, diff --git a/lua-5.4.7/src/ltm.c b/src/ltm.c similarity index 52% rename from lua-5.4.7/src/ltm.c rename to src/ltm.c index 07a0608..f2a373f 100644 --- a/lua-5.4.7/src/ltm.c +++ b/src/ltm.c @@ -58,7 +58,7 @@ void luaT_init (lua_State *L) { ** tag methods */ const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { - const TValue *tm = luaH_getshortstr(events, ename); + const TValue *tm = luaH_Hgetshortstr(events, ename); lua_assert(event <= TM_EQ); if (notm(tm)) { /* no tag method? */ events->flags |= cast_byte(1u<mt[ttype(o)]; } - return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : &G(L)->nilvalue); + return (mt ? luaH_Hgetshortstr(mt, G(L)->tmname[event]) : &G(L)->nilvalue); } @@ -92,7 +92,7 @@ const char *luaT_objtypename (lua_State *L, const TValue *o) { Table *mt; if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) || (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) { - const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name")); + const TValue *name = luaH_Hgetshortstr(mt, luaS_new(L, "__name")); if (ttisstring(name)) /* is '__name' a string? */ return getstr(tsvalue(name)); /* use it as type name */ } @@ -116,8 +116,8 @@ void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, } -void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1, - const TValue *p2, StkId res) { +lu_byte luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, StkId res) { ptrdiff_t result = savestack(L, res); StkId func = L->top.p; setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ @@ -131,6 +131,7 @@ void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1, luaD_callnoyield(L, func, 1); res = restorestack(L, result); setobjs2s(L, res, --L->top.p); /* move result to its place */ + return ttypetag(s2v(res)); /* return tag of the result */ } @@ -139,15 +140,16 @@ static int callbinTM (lua_State *L, const TValue *p1, const TValue *p2, const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ if (notm(tm)) tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ - if (notm(tm)) return 0; - luaT_callTMres(L, tm, p1, p2, res); - return 1; + if (notm(tm)) + return -1; /* tag method not found */ + else /* call tag method and return the tag of the result */ + return luaT_callTMres(L, tm, p1, p2, res); } void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, StkId res, TMS event) { - if (l_unlikely(!callbinTM(L, p1, p2, res, event))) { + if (l_unlikely(callbinTM(L, p1, p2, res, event) < 0)) { switch (event) { case TM_BAND: case TM_BOR: case TM_BXOR: case TM_SHL: case TM_SHR: case TM_BNOT: { @@ -164,11 +166,14 @@ void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, } +/* +** The use of 'p1' after 'callbinTM' is safe because, when a tag +** method is not found, 'callbinTM' cannot change the stack. +*/ void luaT_tryconcatTM (lua_State *L) { - StkId top = L->top.p; - if (l_unlikely(!callbinTM(L, s2v(top - 2), s2v(top - 1), top - 2, - TM_CONCAT))) - luaG_concaterror(L, s2v(top - 2), s2v(top - 1)); + StkId p1 = L->top.p - 2; /* first argument */ + if (l_unlikely(callbinTM(L, s2v(p1), s2v(p1 + 1), p1, TM_CONCAT) < 0)) + luaG_concaterror(L, s2v(p1), s2v(p1 + 1)); } @@ -191,28 +196,12 @@ void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2, /* ** Calls an order tag method. -** For lessequal, LUA_COMPAT_LT_LE keeps compatibility with old -** behavior: if there is no '__le', try '__lt', based on l <= r iff -** !(r < l) (assuming a total order). If the metamethod yields during -** this substitution, the continuation has to know about it (to negate -** the result of rtop.p, event)) /* try original event */ - return !l_isfalse(s2v(L->top.p)); -#if defined(LUA_COMPAT_LT_LE) - else if (event == TM_LE) { - /* try '!(p2 < p1)' for '(p1 <= p2)' */ - L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */ - if (callbinTM(L, p2, p1, L->top.p, TM_LT)) { - L->ci->callstatus ^= CIST_LEQ; /* clear mark */ - return l_isfalse(s2v(L->top.p)); - } - /* else error will remove this 'ci'; no need to clear mark */ - } -#endif + int tag = callbinTM(L, p1, p2, L->top.p, event); /* try original event */ + if (tag >= 0) /* found tag method? */ + return !tagisfalse(tag); luaG_ordererror(L, p1, p2); /* no metamethod found */ return 0; /* to avoid warnings */ } @@ -235,36 +224,140 @@ int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, } -void luaT_adjustvarargs (lua_State *L, int nfixparams, CallInfo *ci, - const Proto *p) { +/* +** Create a vararg table at the top of the stack, with 'n' elements +** starting at 'f'. +*/ +static void createvarargtab (lua_State *L, StkId f, int n) { + int i; + TValue key, value; + Table *t = luaH_new(L); + sethvalue(L, s2v(L->top.p), t); + L->top.p++; + luaH_resize(L, t, cast_uint(n), 1); + setsvalue(L, &key, luaS_new(L, "n")); /* key is "n" */ + setivalue(&value, n); /* value is n */ + /* No need to anchor the key: Due to the resize, the next operation + cannot trigger a garbage collection */ + luaH_set(L, t, &key, &value); /* t.n = n */ + for (i = 0; i < n; i++) + luaH_setint(L, t, i + 1, s2v(f + i)); + luaC_checkGC(L); +} + + +/* +** initial stack: func arg1 ... argn extra1 ... +** ^ ci->func ^ L->top +** final stack: func nil ... nil extra1 ... func arg1 ... argn +** ^ ci->func +*/ +static void buildhiddenargs (lua_State *L, CallInfo *ci, const Proto *p, + int totalargs, int nfixparams, int nextra) { int i; - int actual = cast_int(L->top.p - ci->func.p) - 1; /* number of arguments */ - int nextra = actual - nfixparams; /* number of extra arguments */ ci->u.l.nextraargs = nextra; luaD_checkstack(L, p->maxstacksize + 1); - /* copy function to the top of the stack */ + /* copy function to the top of the stack, after extra arguments */ setobjs2s(L, L->top.p++, ci->func.p); - /* move fixed parameters to the top of the stack */ + /* move fixed parameters to after the copied function */ for (i = 1; i <= nfixparams; i++) { setobjs2s(L, L->top.p++, ci->func.p + i); setnilvalue(s2v(ci->func.p + i)); /* erase original parameter (for GC) */ } - ci->func.p += actual + 1; - ci->top.p += actual + 1; - lua_assert(L->top.p <= ci->top.p && ci->top.p <= L->stack_last.p); + ci->func.p += totalargs + 1; /* 'func' now lives after hidden arguments */ + ci->top.p += totalargs + 1; } -void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted) { - int i; +void luaT_adjustvarargs (lua_State *L, CallInfo *ci, const Proto *p) { + int totalargs = cast_int(L->top.p - ci->func.p) - 1; + int nfixparams = p->numparams; + int nextra = totalargs - nfixparams; /* number of extra arguments */ + if (p->flag & PF_VATAB) { /* does it need a vararg table? */ + lua_assert(!(p->flag & PF_VAHID)); + createvarargtab(L, ci->func.p + nfixparams + 1, nextra); + /* move table to proper place (last parameter) */ + setobjs2s(L, ci->func.p + nfixparams + 1, L->top.p - 1); + } + else { /* no table */ + lua_assert(p->flag & PF_VAHID); + buildhiddenargs(L, ci, p, totalargs, nfixparams, nextra); + /* set vararg parameter to nil */ + setnilvalue(s2v(ci->func.p + nfixparams + 1)); + lua_assert(L->top.p <= ci->top.p && ci->top.p <= L->stack_last.p); + } +} + + +void luaT_getvararg (CallInfo *ci, StkId ra, TValue *rc) { int nextra = ci->u.l.nextraargs; + lua_Integer n; + if (tointegerns(rc, &n)) { /* integral value? */ + if (l_castS2U(n) - 1 < cast_uint(nextra)) { + StkId slot = ci->func.p - nextra + cast_int(n) - 1; + setobjs2s(((lua_State*)NULL), ra, slot); + return; + } + } + else if (ttisstring(rc)) { /* string value? */ + size_t len; + const char *s = getlstr(tsvalue(rc), len); + if (len == 1 && s[0] == 'n') { /* key is "n"? */ + setivalue(s2v(ra), nextra); + return; + } + } + setnilvalue(s2v(ra)); /* else produce nil */ +} + + +/* +** Get the number of extra arguments in a vararg function. If vararg +** table has been optimized away, that number is in the call info. +** Otherwise, get the field 'n' from the vararg table and check that it +** has a proper value (non-negative integer not larger than the stack +** limit). +*/ +static int getnumargs (lua_State *L, CallInfo *ci, Table *h) { + if (h == NULL) /* no vararg table? */ + return ci->u.l.nextraargs; + else { + TValue res; + if (luaH_getshortstr(h, luaS_new(L, "n"), &res) != LUA_VNUMINT || + l_castS2U(ivalue(&res)) > cast_uint(INT_MAX/2)) + luaG_runerror(L, "vararg table has no proper 'n'"); + return cast_int(ivalue(&res)); + } +} + + +/* +** Get 'wanted' vararg arguments and put them in 'where'. 'vatab' is +** the register of the vararg table or -1 if there is no vararg table. +*/ +void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted, + int vatab) { + Table *h = (vatab < 0) ? NULL : hvalue(s2v(ci->func.p + vatab + 1)); + int nargs = getnumargs(L, ci, h); /* number of available vararg args. */ + int i, touse; /* 'touse' is minimum between 'wanted' and 'nargs' */ if (wanted < 0) { - wanted = nextra; /* get all extra arguments available */ - checkstackGCp(L, nextra, where); /* ensure stack space */ - L->top.p = where + nextra; /* next instruction will need top */ + touse = wanted = nargs; /* get all extra arguments available */ + checkstackp(L, nargs, where); /* ensure stack space */ + L->top.p = where + nargs; /* next instruction will need top */ + } + else + touse = (nargs > wanted) ? wanted : nargs; + if (h == NULL) { /* no vararg table? */ + for (i = 0; i < touse; i++) /* get vararg values from the stack */ + setobjs2s(L, where + i, ci->func.p - nargs + i); + } + else { /* get vararg values from vararg table */ + for (i = 0; i < touse; i++) { + lu_byte tag = luaH_getint(h, i + 1, s2v(where + i)); + if (tagisempty(tag)) + setnilvalue(s2v(where + i)); + } } - for (i = 0; i < wanted && i < nextra; i++) - setobjs2s(L, where + i, ci->func.p - nextra + i); for (; i < wanted; i++) /* complete required results with nil */ setnilvalue(s2v(where + i)); } diff --git a/lua-5.4.7/src/lua.c b/src/lua.c similarity index 81% rename from lua-5.4.7/src/lua.c rename to src/lua.c index 6da331f..5054583 100644 --- a/lua-5.4.7/src/lua.c +++ b/src/lua.c @@ -19,6 +19,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" #if !defined(LUA_PROGNAME) @@ -302,7 +303,8 @@ static int collectargs (char **argv, int *first) { case '-': /* '--' */ if (argv[i][2] != '\0') /* extra characters after '--'? */ return has_error; /* invalid option */ - *first = i + 1; + /* if there is a script name, it comes after '--' */ + *first = (argv[i + 1] != NULL) ? i + 1 : 0; return args; case '\0': /* '-' */ return args; /* script "name" is '-' */ @@ -347,6 +349,7 @@ static int collectargs (char **argv, int *first) { */ static int runargs (lua_State *L, char **argv, int n) { int i; + lua_warning(L, "@off", 0); /* by default, Lua stand-alone has warnings off */ for (i = 1; i < n; i++) { int option = argv[i][1]; lua_assert(argv[i][0] == '-'); /* already checked */ @@ -431,30 +434,91 @@ static int handle_luainit (lua_State *L) { /* -** lua_readline defines how to show a prompt and then read a line from -** the standard input. -** lua_saveline defines how to "save" a read line in a "history". -** lua_freeline defines how to free a line read by lua_readline. +** * lua_initreadline initializes the readline system. +** * lua_readline defines how to show a prompt and then read a line from +** the standard input. +** * lua_saveline defines how to "save" a read line in a "history". +** * lua_freeline defines how to free a line read by lua_readline. */ + #if !defined(lua_readline) /* { */ +/* Otherwise, all previously listed functions should be defined. */ #if defined(LUA_USE_READLINE) /* { */ +/* Lua will be linked with '-lreadline' */ #include #include + #define lua_initreadline(L) ((void)L, rl_readline_name="lua") -#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) -#define lua_saveline(L,line) ((void)L, add_history(line)) -#define lua_freeline(L,b) ((void)L, free(b)) +#define lua_readline(buff,prompt) ((void)buff, readline(prompt)) +#define lua_saveline(line) add_history(line) +#define lua_freeline(line) free(line) -#else /* }{ */ +#else /* }{ */ +/* use dynamically loaded readline (or nothing) */ + +/* pointer to 'readline' function (if any) */ +typedef char *(*l_readlineT) (const char *prompt); +static l_readlineT l_readline = NULL; + +/* pointer to 'add_history' function (if any) */ +typedef void (*l_addhistT) (const char *string); +static l_addhistT l_addhist = NULL; + + +static char *lua_readline (char *buff, const char *prompt) { + if (l_readline != NULL) /* is there a 'readline'? */ + return (*l_readline)(prompt); /* use it */ + else { /* emulate 'readline' over 'buff' */ + fputs(prompt, stdout); + fflush(stdout); /* show prompt */ + return fgets(buff, LUA_MAXINPUT, stdin); /* read line */ + } +} -#define lua_initreadline(L) ((void)L) -#define lua_readline(L,b,p) \ - ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ - fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ -#define lua_saveline(L,line) { (void)L; (void)line; } -#define lua_freeline(L,b) { (void)L; (void)b; } + +static void lua_saveline (const char *line) { + if (l_addhist != NULL) /* is there an 'add_history'? */ + (*l_addhist)(line); /* use it */ + /* else nothing to be done */ +} + + +static void lua_freeline (char *line) { + if (l_readline != NULL) /* is there a 'readline'? */ + free(line); /* free line created by it */ + /* else 'lua_readline' used an automatic buffer; nothing to free */ +} + + +#if defined(LUA_USE_DLOPEN) && defined(LUA_READLINELIB) /* { */ +/* try to load 'readline' dynamically */ + +#include + +static void lua_initreadline (lua_State *L) { + void *lib = dlopen(LUA_READLINELIB, RTLD_NOW | RTLD_LOCAL); + if (lib == NULL) + lua_warning(L, "library '" LUA_READLINELIB "' not found", 0); + else { + const char **name = cast(const char**, dlsym(lib, "rl_readline_name")); + if (name != NULL) + *name = "lua"; + l_readline = cast(l_readlineT, cast_func(dlsym(lib, "readline"))); + l_addhist = cast(l_addhistT, cast_func(dlsym(lib, "add_history"))); + if (l_readline == NULL) + lua_warning(L, "unable to load 'readline'", 0); + } +} + +#else /* }{ */ +/* no dlopen or LUA_READLINELIB undefined */ + +/* Leave pointers with NULL */ +#define lua_initreadline(L) ((void)L) + +#endif /* } */ #endif /* } */ @@ -490,10 +554,8 @@ static int incomplete (lua_State *L, int status) { if (status == LUA_ERRSYNTAX) { size_t lmsg; const char *msg = lua_tolstring(L, -1, &lmsg); - if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) { - lua_pop(L, 1); + if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) return 1; - } } return 0; /* else... */ } @@ -504,21 +566,17 @@ static int incomplete (lua_State *L, int status) { */ static int pushline (lua_State *L, int firstline) { char buffer[LUA_MAXINPUT]; - char *b = buffer; size_t l; const char *prmt = get_prompt(L, firstline); - int readstatus = lua_readline(L, b, prmt); - if (readstatus == 0) - return 0; /* no input (prompt will be popped by caller) */ + char *b = lua_readline(buffer, prmt); lua_pop(L, 1); /* remove prompt */ + if (b == NULL) + return 0; /* no input */ l = strlen(b); if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ b[--l] = '\0'; /* remove it */ - if (firstline && b[0] == '=') /* for compatibility with 5.2, ... */ - lua_pushfstring(L, "return %s", b + 1); /* change '=' to 'return' */ - else - lua_pushlstring(L, b, l); - lua_freeline(L, b); + lua_pushlstring(L, b, l); + lua_freeline(b); return 1; } @@ -531,32 +589,44 @@ static int addreturn (lua_State *L) { const char *line = lua_tostring(L, -1); /* original line */ const char *retline = lua_pushfstring(L, "return %s;", line); int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin"); - if (status == LUA_OK) { + if (status == LUA_OK) lua_remove(L, -2); /* remove modified line */ - if (line[0] != '\0') /* non empty? */ - lua_saveline(L, line); /* keep history */ - } else lua_pop(L, 2); /* pop result from 'luaL_loadbuffer' and modified line */ return status; } +static void checklocal (const char *line) { + static const size_t szloc = sizeof("local") - 1; + static const char space[] = " \t"; + line += strspn(line, space); /* skip spaces */ + if (strncmp(line, "local", szloc) == 0 && /* "local"? */ + strchr(space, *(line + szloc)) != NULL) { /* followed by a space? */ + lua_writestringerror("%s\n", + "warning: locals do not survive across lines in interactive mode"); + } +} + + /* -** Read multiple lines until a complete Lua statement +** Read multiple lines until a complete Lua statement or an error not +** for an incomplete statement. Start with first line already read in +** the stack. */ static int multiline (lua_State *L) { + size_t len; + const char *line = lua_tolstring(L, 1, &len); /* get first line */ + checklocal(line); for (;;) { /* repeat until gets a complete statement */ - size_t len; - const char *line = lua_tolstring(L, 1, &len); /* get what it has */ int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */ - if (!incomplete(L, status) || !pushline(L, 0)) { - lua_saveline(L, line); /* keep history */ - return status; /* cannot or should not try to add continuation line */ - } + if (!incomplete(L, status) || !pushline(L, 0)) + return status; /* should not or cannot try to add continuation line */ + lua_remove(L, -2); /* remove error message (from incomplete line) */ lua_pushliteral(L, "\n"); /* add newline... */ lua_insert(L, -2); /* ...between the two lines */ lua_concat(L, 3); /* join them */ + line = lua_tolstring(L, 1, &len); /* get what is has */ } } @@ -568,12 +638,16 @@ static int multiline (lua_State *L) { ** in the top of the stack. */ static int loadline (lua_State *L) { + const char *line; int status; lua_settop(L, 0); if (!pushline(L, 1)) return -1; /* no input */ if ((status = addreturn(L)) != LUA_OK) /* 'return ...' did not work? */ status = multiline(L); /* try as command, maybe with continuation lines */ + line = lua_tostring(L, 1); + if (line[0] != '\0') /* non empty? */ + lua_saveline(line); /* keep history */ lua_remove(L, 1); /* remove line from the stack */ lua_assert(lua_gettop(L) == 1); return status; @@ -618,6 +692,10 @@ static void doREPL (lua_State *L) { /* }================================================================== */ +#if !defined(luai_openlibs) +#define luai_openlibs(L) luaL_openselectedlibs(L, ~0, 0) +#endif + /* ** Main body of stand-alone interpreter (to be called in protected mode). @@ -640,15 +718,15 @@ static int pmain (lua_State *L) { lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */ lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); } - luaL_openlibs(L); /* open standard libraries */ + luai_openlibs(L); /* open standard libraries */ createargtable(L, argv, argc, script); /* create table 'arg' */ lua_gc(L, LUA_GCRESTART); /* start GC... */ - lua_gc(L, LUA_GCGEN, 0, 0); /* ...in generational mode */ + lua_gc(L, LUA_GCGEN); /* ...in generational mode */ if (!(args & has_E)) { /* no option '-E'? */ if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ return 0; /* error running LUA_INIT */ } - if (!runargs(L, argv, optlim)) /* execute arguments -e and -l */ + if (!runargs(L, argv, optlim)) /* execute arguments -e, -l, and -W */ return 0; /* something failed */ if (script > 0) { /* execute main script (if there is one) */ if (handle_script(L, argv + script) != LUA_OK) diff --git a/lua-5.4.7/src/luac.c b/src/luac.c similarity index 97% rename from lua-5.4.7/src/luac.c rename to src/luac.c index 5f4a141..4a2016a 100644 --- a/lua-5.4.7/src/luac.c +++ b/src/luac.c @@ -18,6 +18,7 @@ #include "lua.h" #include "lauxlib.h" +#include "lapi.h" #include "ldebug.h" #include "lobject.h" #include "lopcodes.h" @@ -346,6 +347,8 @@ static void PrintCode(const Proto* f) int bx=GETARG_Bx(i); int sb=GETARG_sB(i); int sc=GETARG_sC(i); + int vb=GETARG_vB(i); + int vc=GETARG_vC(i); int sbx=GETARG_sBx(i); int isk=GETARG_k(i); int line=luaG_getfuncline(f,pc); @@ -427,8 +430,8 @@ static void PrintCode(const Proto* f) if (isk) { printf(" "); PrintConstant(f,c); } break; case OP_NEWTABLE: - printf("%d %d %d",a,b,c); - printf(COMMENT "%d",c+EXTRAARGC); + printf("%d %d %d%s",a,vb,vc,ISK); + printf(COMMENT "%d",vc+EXTRAARGC); break; case OP_SELF: printf("%d %d %d%s",a,b,c,ISK); @@ -477,10 +480,10 @@ static void PrintCode(const Proto* f) printf("%d %d %d",a,b,c); printf(COMMENT); PrintConstant(f,c); break; - case OP_SHRI: + case OP_SHLI: printf("%d %d %d",a,b,sc); break; - case OP_SHLI: + case OP_SHRI: printf("%d %d %d",a,b,sc); break; case OP_ADD: @@ -632,7 +635,7 @@ static void PrintCode(const Proto* f) printf(COMMENT "to %d",pc-bx+2); break; case OP_SETLIST: - printf("%d %d %d",a,b,c); + printf("%d %d %d%s",a,vb,vc,ISK); if (isk) printf(COMMENT "%d",c+EXTRAARGC); break; case OP_CLOSURE: @@ -640,10 +643,18 @@ static void PrintCode(const Proto* f) printf(COMMENT "%p",VOID(f->p[bx])); break; case OP_VARARG: - printf("%d %d",a,c); + printf("%d %d %d%s",a,b,c,ISK); printf(COMMENT); if (c==0) printf("all out"); else printf("%d out",c-1); break; + case OP_GETVARG: + printf("%d %d %d",a,b,c); + break; + case OP_ERRNNIL: + printf("%d %d",a,bx); + printf(COMMENT); + if (bx==0) printf("?"); else PrintConstant(f,bx-1); + break; case OP_VARARGPREP: printf("%d",a); break; @@ -661,7 +672,6 @@ static void PrintCode(const Proto* f) } } - #define SS(x) ((x==1)?"":"s") #define S(x) (int)(x),SS(x) @@ -679,7 +689,7 @@ static void PrintHeader(const Proto* f) f->linedefined,f->lastlinedefined, S(f->sizecode),VOID(f)); printf("%d%s param%s, %d slot%s, %d upvalue%s, ", - (int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams), + (int)(f->numparams),isvararg(f)?"+":"",SS(f->numparams), S(f->maxstacksize),S(f->sizeupvalues)); printf("%d local%s, %d constant%s, %d function%s\n", S(f->sizelocvars),S(f->sizek),S(f->sizep)); diff --git a/src/lundump.c b/src/lundump.c new file mode 100644 index 0000000..3b61cc8 --- /dev/null +++ b/src/lundump.c @@ -0,0 +1,424 @@ +/* +** $Id: lundump.c $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define lundump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstring.h" +#include "ltable.h" +#include "lundump.h" +#include "lzio.h" + + +#if !defined(luai_verifycode) +#define luai_verifycode(L,f) /* empty */ +#endif + + +typedef struct { + lua_State *L; + ZIO *Z; + const char *name; + Table *h; /* list for string reuse */ + size_t offset; /* current position relative to beginning of dump */ + lua_Unsigned nstr; /* number of strings in the list */ + lu_byte fixed; /* dump is fixed in memory */ +} LoadState; + + +static l_noret error (LoadState *S, const char *why) { + luaO_pushfstring(S->L, "%s: bad binary format (%s)", S->name, why); + luaD_throw(S->L, LUA_ERRSYNTAX); +} + + +/* +** All high-level loads go through loadVector; you can change it to +** adapt to the endianness of the input +*/ +#define loadVector(S,b,n) loadBlock(S,b,cast_sizet(n)*sizeof((b)[0])) + +static void loadBlock (LoadState *S, void *b, size_t size) { + if (luaZ_read(S->Z, b, size) != 0) + error(S, "truncated chunk"); + S->offset += size; +} + + +static void loadAlign (LoadState *S, unsigned align) { + unsigned padding = align - cast_uint(S->offset % align); + if (padding < align) { /* (padding == align) means no padding */ + lua_Integer paddingContent; + loadBlock(S, &paddingContent, padding); + lua_assert(S->offset % align == 0); + } +} + + +#define getaddr(S,n,t) cast(t *, getaddr_(S,cast_sizet(n) * sizeof(t))) + +static const void *getaddr_ (LoadState *S, size_t size) { + const void *block = luaZ_getaddr(S->Z, size); + S->offset += size; + if (block == NULL) + error(S, "truncated fixed buffer"); + return block; +} + + +#define loadVar(S,x) loadVector(S,&x,1) + + +static lu_byte loadByte (LoadState *S) { + int b = zgetc(S->Z); + if (b == EOZ) + error(S, "truncated chunk"); + S->offset++; + return cast_byte(b); +} + + +static lua_Unsigned loadVarint (LoadState *S, lua_Unsigned limit) { + lua_Unsigned x = 0; + int b; + limit >>= 7; + do { + b = loadByte(S); + if (x > limit) + error(S, "integer overflow"); + x = (x << 7) | (b & 0x7f); + } while ((b & 0x80) != 0); + return x; +} + + +static size_t loadSize (LoadState *S) { + return cast_sizet(loadVarint(S, MAX_SIZE)); +} + + +static int loadInt (LoadState *S) { + return cast_int(loadVarint(S, cast_sizet(INT_MAX))); +} + + + +static lua_Number loadNumber (LoadState *S) { + lua_Number x; + loadVar(S, x); + return x; +} + + +static lua_Integer loadInteger (LoadState *S) { + lua_Unsigned cx = loadVarint(S, LUA_MAXUNSIGNED); + /* decode unsigned to signed */ + if ((cx & 1) != 0) + return l_castU2S(~(cx >> 1)); + else + return l_castU2S(cx >> 1); +} + + +/* +** Load a nullable string into slot 'sl' from prototype 'p'. The +** assignment to the slot and the barrier must be performed before any +** possible GC activity, to anchor the string. (Both 'loadVector' and +** 'luaH_setint' can call the GC.) +*/ +static void loadString (LoadState *S, Proto *p, TString **sl) { + lua_State *L = S->L; + TString *ts; + TValue sv; + size_t size = loadSize(S); + if (size == 0) { /* previously saved string? */ + lua_Unsigned idx = loadVarint(S, LUA_MAXUNSIGNED); /* get its index */ + TValue stv; + if (idx == 0) { /* no string? */ + lua_assert(*sl == NULL); /* must be prefilled */ + return; + } + if (novariant(luaH_getint(S->h, l_castU2S(idx), &stv)) != LUA_TSTRING) + error(S, "invalid string index"); + *sl = ts = tsvalue(&stv); /* get its value */ + luaC_objbarrier(L, p, ts); + return; /* do not save it again */ + } + else if ((size -= 1) <= LUAI_MAXSHORTLEN) { /* short string? */ + char buff[LUAI_MAXSHORTLEN + 1]; /* extra space for '\0' */ + loadVector(S, buff, size + 1); /* load string into buffer */ + *sl = ts = luaS_newlstr(L, buff, size); /* create string */ + luaC_objbarrier(L, p, ts); + } + else if (S->fixed) { /* for a fixed buffer, use a fixed string */ + const char *s = getaddr(S, size + 1, char); /* get content address */ + *sl = ts = luaS_newextlstr(L, s, size, NULL, NULL); + luaC_objbarrier(L, p, ts); + } + else { /* create internal copy */ + *sl = ts = luaS_createlngstrobj(L, size); /* create string */ + luaC_objbarrier(L, p, ts); + loadVector(S, getlngstr(ts), size + 1); /* load directly in final place */ + } + /* add string to list of saved strings */ + S->nstr++; + setsvalue(L, &sv, ts); + luaH_setint(L, S->h, l_castU2S(S->nstr), &sv); + luaC_objbarrierback(L, obj2gco(S->h), ts); +} + + +static void loadCode (LoadState *S, Proto *f) { + int n = loadInt(S); + loadAlign(S, sizeof(f->code[0])); + if (S->fixed) { + f->code = getaddr(S, n, Instruction); + f->sizecode = n; + } + else { + f->code = luaM_newvectorchecked(S->L, n, Instruction); + f->sizecode = n; + loadVector(S, f->code, n); + } +} + + +static void loadFunction(LoadState *S, Proto *f); + + +static void loadConstants (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + f->k = luaM_newvectorchecked(S->L, n, TValue); + f->sizek = n; + for (i = 0; i < n; i++) + setnilvalue(&f->k[i]); + for (i = 0; i < n; i++) { + TValue *o = &f->k[i]; + int t = loadByte(S); + switch (t) { + case LUA_VNIL: + setnilvalue(o); + break; + case LUA_VFALSE: + setbfvalue(o); + break; + case LUA_VTRUE: + setbtvalue(o); + break; + case LUA_VNUMFLT: + setfltvalue(o, loadNumber(S)); + break; + case LUA_VNUMINT: + setivalue(o, loadInteger(S)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: { + lua_assert(f->source == NULL); + loadString(S, f, &f->source); /* use 'source' to anchor string */ + if (f->source == NULL) + error(S, "bad format for constant string"); + setsvalue2n(S->L, o, f->source); /* save it in the right place */ + f->source = NULL; + break; + } + default: error(S, "invalid constant"); + } + } +} + + +static void loadProtos (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + f->p = luaM_newvectorchecked(S->L, n, Proto *); + f->sizep = n; + for (i = 0; i < n; i++) + f->p[i] = NULL; + for (i = 0; i < n; i++) { + f->p[i] = luaF_newproto(S->L); + luaC_objbarrier(S->L, f, f->p[i]); + loadFunction(S, f->p[i]); + } +} + + +/* +** Load the upvalues for a function. The names must be filled first, +** because the filling of the other fields can raise read errors and +** the creation of the error message can call an emergency collection; +** in that case all prototypes must be consistent for the GC. +*/ +static void loadUpvalues (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); + f->sizeupvalues = n; + for (i = 0; i < n; i++) /* make array valid for GC */ + f->upvalues[i].name = NULL; + for (i = 0; i < n; i++) { /* following calls can raise errors */ + f->upvalues[i].instack = loadByte(S); + f->upvalues[i].idx = loadByte(S); + f->upvalues[i].kind = loadByte(S); + } +} + + +static void loadDebug (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + if (S->fixed) { + f->lineinfo = getaddr(S, n, ls_byte); + f->sizelineinfo = n; + } + else { + f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); + f->sizelineinfo = n; + loadVector(S, f->lineinfo, n); + } + n = loadInt(S); + if (n > 0) { + loadAlign(S, sizeof(int)); + if (S->fixed) { + f->abslineinfo = getaddr(S, n, AbsLineInfo); + f->sizeabslineinfo = n; + } + else { + f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); + f->sizeabslineinfo = n; + loadVector(S, f->abslineinfo, n); + } + } + n = loadInt(S); + f->locvars = luaM_newvectorchecked(S->L, n, LocVar); + f->sizelocvars = n; + for (i = 0; i < n; i++) + f->locvars[i].varname = NULL; + for (i = 0; i < n; i++) { + loadString(S, f, &f->locvars[i].varname); + f->locvars[i].startpc = loadInt(S); + f->locvars[i].endpc = loadInt(S); + } + n = loadInt(S); + if (n != 0) /* does it have debug information? */ + n = f->sizeupvalues; /* must be this many */ + for (i = 0; i < n; i++) + loadString(S, f, &f->upvalues[i].name); +} + + +static void loadFunction (LoadState *S, Proto *f) { + f->linedefined = loadInt(S); + f->lastlinedefined = loadInt(S); + f->numparams = loadByte(S); + /* get only the meaningful flags */ + f->flag = cast_byte(loadByte(S) & ~PF_FIXED); + if (S->fixed) + f->flag |= PF_FIXED; /* signal that code is fixed */ + f->maxstacksize = loadByte(S); + loadCode(S, f); + loadConstants(S, f); + loadUpvalues(S, f); + loadProtos(S, f); + loadString(S, f, &f->source); + loadDebug(S, f); +} + + +static void checkliteral (LoadState *S, const char *s, const char *msg) { + char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ + size_t len = strlen(s); + loadVector(S, buff, len); + if (memcmp(s, buff, len) != 0) + error(S, msg); +} + + +static l_noret numerror (LoadState *S, const char *what, const char *tname) { + const char *msg = luaO_pushfstring(S->L, "%s %s mismatch", tname, what); + error(S, msg); +} + + +static void checknumsize (LoadState *S, int size, const char *tname) { + if (size != loadByte(S)) + numerror(S, "size", tname); +} + + +static void checknumformat (LoadState *S, int eq, const char *tname) { + if (!eq) + numerror(S, "format", tname); +} + + +#define checknum(S,tvar,value,tname) \ + { tvar i; checknumsize(S, sizeof(i), tname); \ + loadVar(S, i); \ + checknumformat(S, i == value, tname); } + + +static void checkHeader (LoadState *S) { + /* skip 1st char (already read and checked) */ + checkliteral(S, &LUA_SIGNATURE[1], "not a binary chunk"); + if (loadByte(S) != LUAC_VERSION) + error(S, "version mismatch"); + if (loadByte(S) != LUAC_FORMAT) + error(S, "format mismatch"); + checkliteral(S, LUAC_DATA, "corrupted chunk"); + checknum(S, int, LUAC_INT, "int"); + checknum(S, Instruction, LUAC_INST, "instruction"); + checknum(S, lua_Integer, LUAC_INT, "Lua integer"); + checknum(S, lua_Number, LUAC_NUM, "Lua number"); +} + + +/* +** Load precompiled chunk. +*/ +LClosure *luaU_undump (lua_State *L, ZIO *Z, const char *name, int fixed) { + LoadState S; + LClosure *cl; + if (*name == '@' || *name == '=') + name = name + 1; + else if (*name == LUA_SIGNATURE[0]) + name = "binary string"; + S.name = name; + S.L = L; + S.Z = Z; + S.fixed = cast_byte(fixed); + S.offset = 1; /* fist byte was already read */ + checkHeader(&S); + cl = luaF_newLclosure(L, loadByte(&S)); + setclLvalue2s(L, L->top.p, cl); + luaD_inctop(L); + S.h = luaH_new(L); /* create list of saved strings */ + S.nstr = 0; + sethvalue2s(L, L->top.p, S.h); /* anchor it */ + luaD_inctop(L); + cl->p = luaF_newproto(L); + luaC_objbarrier(L, cl, cl->p); + loadFunction(&S, cl->p); + if (cl->nupvalues != cl->p->sizeupvalues) + error(&S, "corrupted chunk"); + luai_verifycode(L, cl->p); + L->top.p--; /* pop table */ + return cl; +} + diff --git a/lua-5.4.7/src/lutf8lib.c b/src/lutf8lib.c similarity index 78% rename from lua-5.4.7/src/lutf8lib.c rename to src/lutf8lib.c index 3a5b9bc..b7f3fe1 100644 --- a/lua-5.4.7/src/lutf8lib.c +++ b/src/lutf8lib.c @@ -10,7 +10,6 @@ #include "lprefix.h" -#include #include #include #include @@ -19,6 +18,7 @@ #include "lauxlib.h" #include "lualib.h" +#include "llimits.h" #define MAXUNICODE 0x10FFFFu @@ -28,15 +28,6 @@ #define MSGInvalid "invalid UTF-8 code" -/* -** Integer type for decoded UTF-8 values; MAXUTF needs 31 bits. -*/ -#if (UINT_MAX >> 30) >= 1 -typedef unsigned int utfint; -#else -typedef unsigned long utfint; -#endif - #define iscont(c) (((c) & 0xC0) == 0x80) #define iscontp(p) iscont(*(p)) @@ -55,15 +46,15 @@ static lua_Integer u_posrelat (lua_Integer pos, size_t len) { ** Decode one UTF-8 sequence, returning NULL if byte sequence is ** invalid. The array 'limits' stores the minimum value for each ** sequence length, to check for overlong representations. Its first -** entry forces an error for non-ascii bytes with no continuation +** entry forces an error for non-ASCII bytes with no continuation ** bytes (count == 0). */ -static const char *utf8_decode (const char *s, utfint *val, int strict) { - static const utfint limits[] = - {~(utfint)0, 0x80, 0x800, 0x10000u, 0x200000u, 0x4000000u}; +static const char *utf8_decode (const char *s, l_uint32 *val, int strict) { + static const l_uint32 limits[] = + {~(l_uint32)0, 0x80, 0x800, 0x10000u, 0x200000u, 0x4000000u}; unsigned int c = (unsigned char)s[0]; - utfint res = 0; /* final result */ - if (c < 0x80) /* ascii? */ + l_uint32 res = 0; /* final result */ + if (c < 0x80) /* ASCII? */ res = c; else { int count = 0; /* to count number of continuation bytes */ @@ -73,7 +64,7 @@ static const char *utf8_decode (const char *s, utfint *val, int strict) { return NULL; /* invalid byte sequence */ res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */ } - res |= ((utfint)(c & 0x7F) << (count * 5)); /* add first byte */ + res |= ((l_uint32)(c & 0x7F) << (count * 5)); /* add first byte */ if (count > 5 || res > MAXUTF || res < limits[count]) return NULL; /* invalid byte sequence */ s += count; /* skip continuation bytes read */ @@ -111,7 +102,7 @@ static int utflen (lua_State *L) { lua_pushinteger(L, posi + 1); /* ... and current position */ return 2; } - posi = s1 - s; + posi = ct_diff2S(s1 - s); n++; } lua_pushinteger(L, n); @@ -141,11 +132,11 @@ static int codepoint (lua_State *L) { n = 0; /* count the number of returns */ se = s + pose; /* string end */ for (s += posi - 1; s < se;) { - utfint code; + l_uint32 code; s = utf8_decode(s, &code, !lax); if (s == NULL) return luaL_error(L, MSGInvalid); - lua_pushinteger(L, code); + lua_pushinteger(L, l_castU2S(code)); n++; } return n; @@ -181,14 +172,14 @@ static int utfchar (lua_State *L) { /* -** offset(s, n, [i]) -> index where n-th character counting from -** position 'i' starts; 0 means character at 'i'. +** offset(s, n, [i]) -> indices where n-th character counting from +** position 'i' starts and ends; 0 means character at 'i'. */ static int byteoffset (lua_State *L) { size_t len; const char *s = luaL_checklstring(L, 1, &len); lua_Integer n = luaL_checkinteger(L, 2); - lua_Integer posi = (n >= 0) ? 1 : len + 1; + lua_Integer posi = (n >= 0) ? 1 : cast_st2S(len) + 1; posi = u_posrelat(luaL_optinteger(L, 3, posi), len); luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3, "position out of bounds"); @@ -200,28 +191,37 @@ static int byteoffset (lua_State *L) { if (iscontp(s + posi)) return luaL_error(L, "initial position is a continuation byte"); if (n < 0) { - while (n < 0 && posi > 0) { /* move back */ - do { /* find beginning of previous character */ - posi--; - } while (posi > 0 && iscontp(s + posi)); - n++; - } - } - else { - n--; /* do not move for 1st character */ - while (n > 0 && posi < (lua_Integer)len) { - do { /* find beginning of next character */ - posi++; - } while (iscontp(s + posi)); /* (cannot pass final '\0') */ - n--; - } - } + while (n < 0 && posi > 0) { /* move back */ + do { /* find beginning of previous character */ + posi--; + } while (posi > 0 && iscontp(s + posi)); + n++; + } + } + else { + n--; /* do not move for 1st character */ + while (n > 0 && posi < (lua_Integer)len) { + do { /* find beginning of next character */ + posi++; + } while (iscontp(s + posi)); /* (cannot pass final '\0') */ + n--; + } + } } - if (n == 0) /* did it find given character? */ - lua_pushinteger(L, posi + 1); - else /* no such character */ + if (n != 0) { /* did not find given character? */ luaL_pushfail(L); - return 1; + return 1; + } + lua_pushinteger(L, posi + 1); /* initial position */ + if ((s[posi] & 0x80) != 0) { /* multi-byte character? */ + if (iscont(s[posi])) + return luaL_error(L, "initial position is a continuation byte"); + while (iscontp(s + posi + 1)) + posi++; /* skip to last continuation byte */ + } + /* else one-byte character: final position is the initial one */ + lua_pushinteger(L, posi + 1); /* 'posi' now is the final position */ + return 2; } @@ -235,12 +235,12 @@ static int iter_aux (lua_State *L, int strict) { if (n >= len) /* (also handles original 'n' being negative) */ return 0; /* no more codepoints */ else { - utfint code; + l_uint32 code; const char *next = utf8_decode(s + n, &code, strict); if (next == NULL || iscontp(next)) return luaL_error(L, MSGInvalid); - lua_pushinteger(L, n + 1); - lua_pushinteger(L, code); + lua_pushinteger(L, l_castU2S(n + 1)); + lua_pushinteger(L, l_castU2S(code)); return 2; } } diff --git a/lua-5.4.7/src/lvm.c b/src/lvm.c similarity index 79% rename from lua-5.4.7/src/lvm.c rename to src/lvm.c index fcd24e1..c70e2b8 100644 --- a/lua-5.4.7/src/lvm.c +++ b/src/lvm.c @@ -18,6 +18,7 @@ #include "lua.h" +#include "lapi.h" #include "ldebug.h" #include "ldo.h" #include "lfunc.h" @@ -93,7 +94,9 @@ static int l_strton (const TValue *obj, TValue *result) { return 0; else { TString *st = tsvalue(obj); - return (luaO_str2num(getstr(st), result) == tsslen(st) + 1); + size_t stlen; + const char *s = getlstr(st, stlen); + return (luaO_str2num(s, result) == stlen + 1); } } @@ -124,8 +127,8 @@ int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode) { lua_Number f = l_floor(n); if (n != f) { /* not an integral value? */ if (mode == F2Ieq) return 0; /* fails if mode demands integral value */ - else if (mode == F2Iceil) /* needs ceil? */ - f += 1; /* convert floor to ceil (remember: n != f) */ + else if (mode == F2Iceil) /* needs ceiling? */ + f += 1; /* convert floor to ceiling (remember: n != f) */ } return lua_numbertointeger(f, p); } @@ -198,12 +201,15 @@ static int forlimit (lua_State *L, lua_Integer init, const TValue *lim, /* ** Prepare a numerical for loop (opcode OP_FORPREP). +** Before execution, stack is as follows: +** ra : initial value +** ra + 1 : limit +** ra + 2 : step ** Return true to skip the loop. Otherwise, ** after preparation, stack will be as follows: -** ra : internal index (safe copy of the control variable) -** ra + 1 : loop counter (integer loops) or limit (float loops) -** ra + 2 : step -** ra + 3 : control variable +** ra : loop counter (integer loops) or limit (float loops) +** ra + 1 : step +** ra + 2 : control variable */ static int forprep (lua_State *L, StkId ra) { TValue *pinit = s2v(ra); @@ -215,7 +221,6 @@ static int forprep (lua_State *L, StkId ra) { lua_Integer limit; if (step == 0) luaG_runerror(L, "'for' step is zero"); - setivalue(s2v(ra + 3), init); /* control variable */ if (forlimit(L, init, plimit, &limit, step)) return 1; /* skip the loop */ else { /* prepare loop counter */ @@ -230,9 +235,10 @@ static int forprep (lua_State *L, StkId ra) { /* 'step+1' avoids negating 'mininteger' */ count /= l_castS2U(-(step + 1)) + 1u; } - /* store the counter in place of the limit (which won't be - needed anymore) */ - setivalue(plimit, l_castU2S(count)); + /* use 'chgivalue' for places that for sure had integers */ + chgivalue(s2v(ra), l_castU2S(count)); /* change init to count */ + setivalue(s2v(ra + 1), step); /* change limit to step */ + chgivalue(s2v(ra + 2), init); /* change step to init */ } } else { /* try making all values floats */ @@ -249,11 +255,10 @@ static int forprep (lua_State *L, StkId ra) { : luai_numlt(init, limit)) return 1; /* skip the loop */ else { - /* make sure internal values are all floats */ - setfltvalue(plimit, limit); - setfltvalue(pstep, step); - setfltvalue(s2v(ra), init); /* internal index */ - setfltvalue(s2v(ra + 3), init); /* control variable */ + /* make sure all values are floats */ + setfltvalue(s2v(ra), limit); + setfltvalue(s2v(ra + 1), step); + setfltvalue(s2v(ra + 2), init); /* control variable */ } } return 0; @@ -266,14 +271,13 @@ static int forprep (lua_State *L, StkId ra) { ** written online with opcode OP_FORLOOP, for performance.) */ static int floatforloop (StkId ra) { - lua_Number step = fltvalue(s2v(ra + 2)); - lua_Number limit = fltvalue(s2v(ra + 1)); - lua_Number idx = fltvalue(s2v(ra)); /* internal index */ + lua_Number step = fltvalue(s2v(ra + 1)); + lua_Number limit = fltvalue(s2v(ra)); + lua_Number idx = fltvalue(s2v(ra + 2)); /* control variable */ idx = luai_numadd(L, idx, step); /* increment index */ if (luai_numlt(0, step) ? luai_numle(idx, limit) : luai_numle(limit, idx)) { - chgfltvalue(s2v(ra), idx); /* update internal index */ - setfltvalue(s2v(ra + 3), idx); /* and control variable */ + chgfltvalue(s2v(ra + 2), idx); /* update control variable */ return 1; /* jump back */ } else @@ -282,16 +286,14 @@ static int floatforloop (StkId ra) { /* -** Finish the table access 'val = t[key]'. -** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to -** t[k] entry (which must be empty). +** Finish the table access 'val = t[key]' and return the tag of the result. */ -void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, - const TValue *slot) { +lu_byte luaV_finishget (lua_State *L, const TValue *t, TValue *key, + StkId val, lu_byte tag) { int loop; /* counter to avoid infinite loops */ const TValue *tm; /* metamethod */ for (loop = 0; loop < MAXTAGLOOP; loop++) { - if (slot == NULL) { /* 't' is not a table? */ + if (tag == LUA_VNOTABLE) { /* 't' is not a table? */ lua_assert(!ttistable(t)); tm = luaT_gettmbyobj(L, t, TM_INDEX); if (l_unlikely(notm(tm))) @@ -299,47 +301,49 @@ void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, /* else will try the metamethod */ } else { /* 't' is a table */ - lua_assert(isempty(slot)); tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ if (tm == NULL) { /* no metamethod? */ setnilvalue(s2v(val)); /* result is nil */ - return; + return LUA_VNIL; } /* else will try the metamethod */ } if (ttisfunction(tm)) { /* is metamethod a function? */ - luaT_callTMres(L, tm, t, key, val); /* call it */ - return; + tag = luaT_callTMres(L, tm, t, key, val); /* call it */ + return tag; /* return tag of the result */ } t = tm; /* else try to access 'tm[key]' */ - if (luaV_fastget(L, t, key, slot, luaH_get)) { /* fast track? */ - setobj2s(L, val, slot); /* done */ - return; - } + luaV_fastget(t, key, s2v(val), luaH_get, tag); + if (!tagisempty(tag)) + return tag; /* done */ /* else repeat (tail call 'luaV_finishget') */ } luaG_runerror(L, "'__index' chain too long; possible loop"); + return 0; /* to avoid warnings */ } /* ** Finish a table assignment 't[key] = val'. -** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points -** to the entry 't[key]', or to a value with an absent key if there -** is no such entry. (The value at 'slot' must be empty, otherwise -** 'luaV_fastget' would have done the job.) +** About anchoring the table before the call to 'luaH_finishset': +** This call may trigger an emergency collection. When loop>0, +** the table being accessed is a field in some metatable. If this +** metatable is weak and the table is not anchored, this collection +** could collect that table while it is being updated. */ void luaV_finishset (lua_State *L, const TValue *t, TValue *key, - TValue *val, const TValue *slot) { + TValue *val, int hres) { int loop; /* counter to avoid infinite loops */ for (loop = 0; loop < MAXTAGLOOP; loop++) { const TValue *tm; /* '__newindex' metamethod */ - if (slot != NULL) { /* is 't' a table? */ + if (hres != HNOTATABLE) { /* is 't' a table? */ Table *h = hvalue(t); /* save 't' table */ - lua_assert(isempty(slot)); /* slot must be empty */ tm = fasttm(L, h->metatable, TM_NEWINDEX); /* get metamethod */ if (tm == NULL) { /* no metamethod? */ - luaH_finishset(L, h, key, slot, val); /* set new value */ + sethvalue2s(L, L->top.p, h); /* anchor 't' */ + L->top.p++; /* assume EXTRA_STACK */ + luaH_finishset(L, h, key, val, hres); /* set new value */ + L->top.p--; invalidateTMcache(h); luaC_barrierback(L, obj2gco(h), val); return; @@ -357,8 +361,9 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key, return; } t = tm; /* else repeat assignment over 'tm' */ - if (luaV_fastget(L, t, key, slot, luaH_get)) { - luaV_finishfastset(L, t, slot, val); + luaV_fastset(t, key, val, hres, luaH_pset); + if (hres == HOK) { + luaV_finishfastset(L, t, val); return; /* done */ } /* else 'return luaV_finishset(L, t, key, val, slot)' (loop) */ @@ -367,6 +372,14 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key, } +/* +** Function to be used for 0-terminated string order comparison +*/ +#if !defined(l_strcoll) +#define l_strcoll strcoll +#endif + + /* ** Compare two strings 'ts1' x 'ts2', returning an integer less-equal- ** -greater than zero if 'ts1' is less-equal-greater than 'ts2'. @@ -376,12 +389,12 @@ void luaV_finishset (lua_State *L, const TValue *t, TValue *key, ** have different lengths. */ static int l_strcmp (const TString *ts1, const TString *ts2) { - const char *s1 = getstr(ts1); - size_t rl1 = tsslen(ts1); /* real length */ - const char *s2 = getstr(ts2); - size_t rl2 = tsslen(ts2); + size_t rl1; /* real length */ + const char *s1 = getlstr(ts1, rl1); + size_t rl2; + const char *s2 = getlstr(ts2, rl2); for (;;) { /* for each segment */ - int temp = strcoll(s1, s2); + int temp = l_strcoll(s1, s2); if (temp != 0) /* not equal? */ return temp; /* done */ else { /* strings are equal up to a '\0' */ @@ -568,52 +581,74 @@ int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { */ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { const TValue *tm; - if (ttypetag(t1) != ttypetag(t2)) { /* not the same variant? */ - if (ttype(t1) != ttype(t2) || ttype(t1) != LUA_TNUMBER) - return 0; /* only numbers can be equal with different variants */ - else { /* two numbers with different variants */ - /* One of them is an integer. If the other does not have an - integer value, they cannot be equal; otherwise, compare their - integer values. */ - lua_Integer i1, i2; - return (luaV_tointegerns(t1, &i1, F2Ieq) && - luaV_tointegerns(t2, &i2, F2Ieq) && - i1 == i2); + if (ttype(t1) != ttype(t2)) /* not the same type? */ + return 0; + else if (ttypetag(t1) != ttypetag(t2)) { + switch (ttypetag(t1)) { + case LUA_VNUMINT: { /* integer == float? */ + /* integer and float can only be equal if float has an integer + value equal to the integer */ + lua_Integer i2; + return (luaV_flttointeger(fltvalue(t2), &i2, F2Ieq) && + ivalue(t1) == i2); + } + case LUA_VNUMFLT: { /* float == integer? */ + lua_Integer i1; /* see comment in previous case */ + return (luaV_flttointeger(fltvalue(t1), &i1, F2Ieq) && + i1 == ivalue(t2)); + } + case LUA_VSHRSTR: case LUA_VLNGSTR: { + /* compare two strings with different variants: they can be + equal when one string is a short string and the other is + an external string */ + return luaS_eqstr(tsvalue(t1), tsvalue(t2)); + } + default: + /* only numbers (integer/float) and strings (long/short) can have + equal values with different variants */ + return 0; } } - /* values have same type and same variant */ - switch (ttypetag(t1)) { - case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: return 1; - case LUA_VNUMINT: return (ivalue(t1) == ivalue(t2)); - case LUA_VNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2)); - case LUA_VLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); - case LUA_VLCF: return fvalue(t1) == fvalue(t2); - case LUA_VSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2)); - case LUA_VLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2)); - case LUA_VUSERDATA: { - if (uvalue(t1) == uvalue(t2)) return 1; - else if (L == NULL) return 0; - tm = fasttm(L, uvalue(t1)->metatable, TM_EQ); - if (tm == NULL) - tm = fasttm(L, uvalue(t2)->metatable, TM_EQ); - break; /* will try TM */ + else { /* equal variants */ + switch (ttypetag(t1)) { + case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: + return 1; + case LUA_VNUMINT: + return (ivalue(t1) == ivalue(t2)); + case LUA_VNUMFLT: + return (fltvalue(t1) == fltvalue(t2)); + case LUA_VLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); + case LUA_VSHRSTR: + return eqshrstr(tsvalue(t1), tsvalue(t2)); + case LUA_VLNGSTR: + return luaS_eqstr(tsvalue(t1), tsvalue(t2)); + case LUA_VUSERDATA: { + if (uvalue(t1) == uvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, uvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, uvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + case LUA_VTABLE: { + if (hvalue(t1) == hvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, hvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, hvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + case LUA_VLCF: + return (fvalue(t1) == fvalue(t2)); + default: /* functions and threads */ + return (gcvalue(t1) == gcvalue(t2)); } - case LUA_VTABLE: { - if (hvalue(t1) == hvalue(t2)) return 1; - else if (L == NULL) return 0; - tm = fasttm(L, hvalue(t1)->metatable, TM_EQ); - if (tm == NULL) - tm = fasttm(L, hvalue(t2)->metatable, TM_EQ); - break; /* will try TM */ + if (tm == NULL) /* no TM? */ + return 0; /* objects are different */ + else { + int tag = luaT_callTMres(L, tm, t1, t2, L->top.p); /* call TM */ + return !tagisfalse(tag); } - default: - return gcvalue(t1) == gcvalue(t2); - } - if (tm == NULL) /* no TM? */ - return 0; /* objects are different */ - else { - luaT_callTMres(L, tm, t1, t2, L->top.p); /* call TM */ - return !l_isfalse(s2v(L->top.p)); } } @@ -622,6 +657,11 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { #define tostring(L,o) \ (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1))) +/* +** Check whether object is a short empty string to optimize concatenation. +** (External strings can be empty too; they will be concatenated like +** non-empty ones.) +*/ #define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0) /* copy strings in stack from top - n up to top - 1 to buffer */ @@ -629,8 +669,9 @@ static void copy2buff (StkId top, int n, char *buff) { size_t tl = 0; /* size already copied */ do { TString *st = tsvalue(s2v(top - n)); - size_t l = tsslen(st); /* length of string being copied */ - memcpy(buff + tl, getstr(st), l * sizeof(char)); + size_t l; /* length of string being copied */ + const char *s = getlstr(st, l); + memcpy(buff + tl, s, l * sizeof(char)); tl += l; } while (--n > 0); } @@ -655,8 +696,8 @@ void luaV_concat (lua_State *L, int total) { setobjs2s(L, top - 2, top - 1); /* result is second op. */ } else { - /* at least two non-empty string values; get as many as possible */ - size_t tl = tsslen(tsvalue(s2v(top - 1))); + /* at least two string values; get as many as possible */ + size_t tl = tsslen(tsvalue(s2v(top - 1))); /* total length */ TString *ts; /* collect total length and number of strings */ for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) { @@ -694,7 +735,7 @@ void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) { Table *h = hvalue(rb); tm = fasttm(L, h->metatable, TM_LEN); if (tm) break; /* metamethod? break switch to call it */ - setivalue(s2v(ra), luaH_getn(h)); /* else primitive len */ + setivalue(s2v(ra), l_castU2S(luaH_getn(L, h))); /* else primitive len */ return; } case LUA_VSHRSTR: { @@ -702,7 +743,7 @@ void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) { return; } case LUA_VLNGSTR: { - setivalue(s2v(ra), tsvalue(rb)->u.lnglen); + setivalue(s2v(ra), cast_st2S(tsvalue(rb)->u.lnglen)); return; } default: { /* try metamethod */ @@ -768,7 +809,7 @@ lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) { /* number of bits in an integer */ -#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) +#define NBITS l_numbits(lua_Integer) /* @@ -833,12 +874,6 @@ void luaV_finishOp (lua_State *L) { case OP_EQ: { /* note that 'OP_EQI'/'OP_EQK' cannot yield */ int res = !l_isfalse(s2v(L->top.p - 1)); L->top.p--; -#if defined(LUA_COMPAT_LT_LE) - if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */ - ci->callstatus ^= CIST_LEQ; /* clear mark */ - res = !res; /* negate result */ - } -#endif lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP); if (res != GETARG_k(inst)) /* condition failed? */ ci->u.l.savedpc++; /* skip jump instruction */ @@ -882,6 +917,10 @@ void luaV_finishOp (lua_State *L) { /* ** {================================================================== ** Macros for arithmetic/bitwise/comparison opcodes in 'luaV_execute' +** +** All these macros are to be used exclusively inside the main +** iterpreter loop (function luaV_execute) and may access directly +** the local variables of that function (L, i, pc, ci, etc.). ** =================================================================== */ @@ -903,27 +942,28 @@ void luaV_finishOp (lua_State *L) { ** operation, 'fop' is the float operation. */ #define op_arithI(L,iop,fop) { \ - StkId ra = RA(i); \ + TValue *ra = vRA(i); \ TValue *v1 = vRB(i); \ int imm = GETARG_sC(i); \ if (ttisinteger(v1)) { \ lua_Integer iv1 = ivalue(v1); \ - pc++; setivalue(s2v(ra), iop(L, iv1, imm)); \ + pc++; setivalue(ra, iop(L, iv1, imm)); \ } \ else if (ttisfloat(v1)) { \ lua_Number nb = fltvalue(v1); \ lua_Number fimm = cast_num(imm); \ - pc++; setfltvalue(s2v(ra), fop(L, nb, fimm)); \ + pc++; setfltvalue(ra, fop(L, nb, fimm)); \ }} /* ** Auxiliary function for arithmetic operations over floats and others -** with two register operands. +** with two operands. */ #define op_arithf_aux(L,v1,v2,fop) { \ lua_Number n1; lua_Number n2; \ if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ + StkId ra = RA(i); \ pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \ }} @@ -932,7 +972,6 @@ void luaV_finishOp (lua_State *L) { ** Arithmetic operations over floats and others with register operands. */ #define op_arithf(L,fop) { \ - StkId ra = RA(i); \ TValue *v1 = vRB(i); \ TValue *v2 = vRC(i); \ op_arithf_aux(L, v1, v2, fop); } @@ -942,7 +981,6 @@ void luaV_finishOp (lua_State *L) { ** Arithmetic operations with K operands for floats. */ #define op_arithfK(L,fop) { \ - StkId ra = RA(i); \ TValue *v1 = vRB(i); \ TValue *v2 = KC(i); lua_assert(ttisnumber(v2)); \ op_arithf_aux(L, v1, v2, fop); } @@ -952,8 +990,8 @@ void luaV_finishOp (lua_State *L) { ** Arithmetic operations over integers and floats. */ #define op_arith_aux(L,v1,v2,iop,fop) { \ - StkId ra = RA(i); \ if (ttisinteger(v1) && ttisinteger(v2)) { \ + StkId ra = RA(i); \ lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ pc++; setivalue(s2v(ra), iop(L, i1, i2)); \ } \ @@ -982,12 +1020,12 @@ void luaV_finishOp (lua_State *L) { ** Bitwise operations with constant operand. */ #define op_bitwiseK(L,op) { \ - StkId ra = RA(i); \ TValue *v1 = vRB(i); \ TValue *v2 = KC(i); \ lua_Integer i1; \ lua_Integer i2 = ivalue(v2); \ if (tointegerns(v1, &i1)) { \ + StkId ra = RA(i); \ pc++; setivalue(s2v(ra), op(i1, i2)); \ }} @@ -996,11 +1034,11 @@ void luaV_finishOp (lua_State *L) { ** Bitwise operations with register operands. */ #define op_bitwise(L,op) { \ - StkId ra = RA(i); \ TValue *v1 = vRB(i); \ TValue *v2 = vRC(i); \ lua_Integer i1; lua_Integer i2; \ if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \ + StkId ra = RA(i); \ pc++; setivalue(s2v(ra), op(i1, i2)); \ }} @@ -1011,18 +1049,18 @@ void luaV_finishOp (lua_State *L) { ** integers. */ #define op_order(L,opi,opn,other) { \ - StkId ra = RA(i); \ + TValue *ra = vRA(i); \ int cond; \ TValue *rb = vRB(i); \ - if (ttisinteger(s2v(ra)) && ttisinteger(rb)) { \ - lua_Integer ia = ivalue(s2v(ra)); \ + if (ttisinteger(ra) && ttisinteger(rb)) { \ + lua_Integer ia = ivalue(ra); \ lua_Integer ib = ivalue(rb); \ cond = opi(ia, ib); \ } \ - else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) \ - cond = opn(s2v(ra), rb); \ + else if (ttisnumber(ra) && ttisnumber(rb)) \ + cond = opn(ra, rb); \ else \ - Protect(cond = other(L, s2v(ra), rb)); \ + Protect(cond = other(L, ra, rb)); \ docondjump(); } @@ -1031,19 +1069,19 @@ void luaV_finishOp (lua_State *L) { ** always small enough to have an exact representation as a float.) */ #define op_orderI(L,opi,opf,inv,tm) { \ - StkId ra = RA(i); \ + TValue *ra = vRA(i); \ int cond; \ int im = GETARG_sB(i); \ - if (ttisinteger(s2v(ra))) \ - cond = opi(ivalue(s2v(ra)), im); \ - else if (ttisfloat(s2v(ra))) { \ - lua_Number fa = fltvalue(s2v(ra)); \ + if (ttisinteger(ra)) \ + cond = opi(ivalue(ra), im); \ + else if (ttisfloat(ra)) { \ + lua_Number fa = fltvalue(ra); \ lua_Number fim = cast_num(im); \ cond = opf(fa, fim); \ } \ else { \ int isf = GETARG_C(i); \ - Protect(cond = luaT_callorderiTM(L, s2v(ra), im, inv, isf, tm)); \ + Protect(cond = luaT_callorderiTM(L, ra, im, inv, isf, tm)); \ } \ docondjump(); } @@ -1062,6 +1100,7 @@ void luaV_finishOp (lua_State *L) { #define RA(i) (base+GETARG_A(i)) +#define vRA(i) s2v(RA(i)) #define RB(i) (base+GETARG_B(i)) #define vRB(i) s2v(RB(i)) #define KB(i) (k+GETARG_B(i)) @@ -1102,14 +1141,14 @@ void luaV_finishOp (lua_State *L) { /* ** Correct global 'pc'. */ -#define savepc(L) (ci->u.l.savedpc = pc) +#define savepc(ci) (ci->u.l.savedpc = pc) /* ** Whenever code can raise errors, the global 'pc' and the global ** 'top' must be correct to report occasional errors. */ -#define savestate(L,ci) (savepc(L), L->top.p = ci->top.p) +#define savestate(L,ci) (savepc(ci), L->top.p = ci->top.p) /* @@ -1119,7 +1158,7 @@ void luaV_finishOp (lua_State *L) { #define Protect(exp) (savestate(L,ci), (exp), updatetrap(ci)) /* special version that does not change the top */ -#define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) +#define ProtectNT(exp) (savepc(ci), (exp), updatetrap(ci)) /* ** Protect code that can only raise errors. (That is, it cannot change @@ -1127,9 +1166,17 @@ void luaV_finishOp (lua_State *L) { */ #define halfProtect(exp) (savestate(L,ci), (exp)) +/* +** macro executed during Lua functions at points where the +** function can yield. +*/ +#if !defined(luai_threadyield) +#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} +#endif + /* 'c' is the limit of live values in the stack */ #define checkGC(L,c) \ - { luaC_condGC(L, (savepc(L), L->top.p = (c)), \ + { luaC_condGC(L, (savepc(ci), L->top.p = (c)), \ updatetrap(ci)); \ luai_threadyield(L); } @@ -1171,13 +1218,17 @@ void luaV_execute (lua_State *L, CallInfo *ci) { Instruction i; /* instruction being executed */ vmfetch(); #if 0 - /* low-level line tracing for debugging Lua */ - printf("line: %d\n", luaG_getfuncline(cl->p, pcRel(pc, cl->p))); + { /* low-level line tracing for debugging Lua */ + #include "lopnames.h" + int pcrel = pcRel(pc, cl->p); + printf("line: %d; %s (%d)\n", luaG_getfuncline(cl->p, pcrel), + opnames[GET_OPCODE(i)], pcrel); + } #endif lua_assert(base == ci->func.p + 1); lua_assert(base <= L->top.p && L->top.p <= L->stack_last.p); - /* invalidate top for instructions not expecting it */ - lua_assert(isIT(i) || (cast_void(L->top.p = base), 1)); + /* for tests, invalidate top for instructions not expecting it */ + lua_assert(luaP_isIT(i) || (cast_void(L->top.p = base), 1)); vmdispatch (GET_OPCODE(i)) { vmcase(OP_MOVE) { StkId ra = RA(i); @@ -1248,126 +1299,123 @@ void luaV_execute (lua_State *L, CallInfo *ci) { } vmcase(OP_GETTABUP) { StkId ra = RA(i); - const TValue *slot; TValue *upval = cl->upvals[GETARG_B(i)]->v.p; TValue *rc = KC(i); TString *key = tsvalue(rc); /* key must be a short string */ - if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { - setobj2s(L, ra, slot); - } - else - Protect(luaV_finishget(L, upval, rc, ra, slot)); + lu_byte tag; + luaV_fastget(upval, key, s2v(ra), luaH_getshortstr, tag); + if (tagisempty(tag)) + Protect(luaV_finishget(L, upval, rc, ra, tag)); vmbreak; } vmcase(OP_GETTABLE) { StkId ra = RA(i); - const TValue *slot; TValue *rb = vRB(i); TValue *rc = vRC(i); - lua_Unsigned n; - if (ttisinteger(rc) /* fast track for integers? */ - ? (cast_void(n = ivalue(rc)), luaV_fastgeti(L, rb, n, slot)) - : luaV_fastget(L, rb, rc, slot, luaH_get)) { - setobj2s(L, ra, slot); + lu_byte tag; + if (ttisinteger(rc)) { /* fast track for integers? */ + luaV_fastgeti(rb, ivalue(rc), s2v(ra), tag); } else - Protect(luaV_finishget(L, rb, rc, ra, slot)); + luaV_fastget(rb, rc, s2v(ra), luaH_get, tag); + if (tagisempty(tag)) + Protect(luaV_finishget(L, rb, rc, ra, tag)); vmbreak; } vmcase(OP_GETI) { StkId ra = RA(i); - const TValue *slot; TValue *rb = vRB(i); int c = GETARG_C(i); - if (luaV_fastgeti(L, rb, c, slot)) { - setobj2s(L, ra, slot); - } - else { + lu_byte tag; + luaV_fastgeti(rb, c, s2v(ra), tag); + if (tagisempty(tag)) { TValue key; setivalue(&key, c); - Protect(luaV_finishget(L, rb, &key, ra, slot)); + Protect(luaV_finishget(L, rb, &key, ra, tag)); } vmbreak; } vmcase(OP_GETFIELD) { StkId ra = RA(i); - const TValue *slot; TValue *rb = vRB(i); TValue *rc = KC(i); TString *key = tsvalue(rc); /* key must be a short string */ - if (luaV_fastget(L, rb, key, slot, luaH_getshortstr)) { - setobj2s(L, ra, slot); - } - else - Protect(luaV_finishget(L, rb, rc, ra, slot)); + lu_byte tag; + luaV_fastget(rb, key, s2v(ra), luaH_getshortstr, tag); + if (tagisempty(tag)) + Protect(luaV_finishget(L, rb, rc, ra, tag)); vmbreak; } vmcase(OP_SETTABUP) { - const TValue *slot; + int hres; TValue *upval = cl->upvals[GETARG_A(i)]->v.p; TValue *rb = KB(i); TValue *rc = RKC(i); TString *key = tsvalue(rb); /* key must be a short string */ - if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { - luaV_finishfastset(L, upval, slot, rc); - } + luaV_fastset(upval, key, rc, hres, luaH_psetshortstr); + if (hres == HOK) + luaV_finishfastset(L, upval, rc); else - Protect(luaV_finishset(L, upval, rb, rc, slot)); + Protect(luaV_finishset(L, upval, rb, rc, hres)); vmbreak; } vmcase(OP_SETTABLE) { StkId ra = RA(i); - const TValue *slot; + int hres; TValue *rb = vRB(i); /* key (table is in 'ra') */ TValue *rc = RKC(i); /* value */ - lua_Unsigned n; - if (ttisinteger(rb) /* fast track for integers? */ - ? (cast_void(n = ivalue(rb)), luaV_fastgeti(L, s2v(ra), n, slot)) - : luaV_fastget(L, s2v(ra), rb, slot, luaH_get)) { - luaV_finishfastset(L, s2v(ra), slot, rc); + if (ttisinteger(rb)) { /* fast track for integers? */ + luaV_fastseti(s2v(ra), ivalue(rb), rc, hres); } + else { + luaV_fastset(s2v(ra), rb, rc, hres, luaH_pset); + } + if (hres == HOK) + luaV_finishfastset(L, s2v(ra), rc); else - Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + Protect(luaV_finishset(L, s2v(ra), rb, rc, hres)); vmbreak; } vmcase(OP_SETI) { StkId ra = RA(i); - const TValue *slot; - int c = GETARG_B(i); + int hres; + int b = GETARG_B(i); TValue *rc = RKC(i); - if (luaV_fastgeti(L, s2v(ra), c, slot)) { - luaV_finishfastset(L, s2v(ra), slot, rc); - } + luaV_fastseti(s2v(ra), b, rc, hres); + if (hres == HOK) + luaV_finishfastset(L, s2v(ra), rc); else { TValue key; - setivalue(&key, c); - Protect(luaV_finishset(L, s2v(ra), &key, rc, slot)); + setivalue(&key, b); + Protect(luaV_finishset(L, s2v(ra), &key, rc, hres)); } vmbreak; } vmcase(OP_SETFIELD) { StkId ra = RA(i); - const TValue *slot; + int hres; TValue *rb = KB(i); TValue *rc = RKC(i); TString *key = tsvalue(rb); /* key must be a short string */ - if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) { - luaV_finishfastset(L, s2v(ra), slot, rc); - } + luaV_fastset(s2v(ra), key, rc, hres, luaH_psetshortstr); + if (hres == HOK) + luaV_finishfastset(L, s2v(ra), rc); else - Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + Protect(luaV_finishset(L, s2v(ra), rb, rc, hres)); vmbreak; } vmcase(OP_NEWTABLE) { StkId ra = RA(i); - int b = GETARG_B(i); /* log2(hash size) + 1 */ - int c = GETARG_C(i); /* array size */ + unsigned b = cast_uint(GETARG_vB(i)); /* log2(hash size) + 1 */ + unsigned c = cast_uint(GETARG_vC(i)); /* array size */ Table *t; if (b > 0) - b = 1 << (b - 1); /* size is 2^(b - 1) */ - lua_assert((!TESTARG_k(i)) == (GETARG_Ax(*pc) == 0)); - if (TESTARG_k(i)) /* non-zero extra argument? */ - c += GETARG_Ax(*pc) * (MAXARG_C + 1); /* add it to size */ + b = 1u << (b - 1); /* hash size is 2^(b - 1) */ + if (TESTARG_k(i)) { /* non-zero extra argument? */ + lua_assert(GETARG_Ax(*pc) != 0); + /* add it to array size */ + c += cast_uint(GETARG_Ax(*pc)) * (MAXARG_vC + 1); + } pc++; /* skip extra argument */ L->top.p = ra + 1; /* correct top in case of emergency GC */ t = luaH_new(L); /* memory allocation */ @@ -1379,16 +1427,14 @@ void luaV_execute (lua_State *L, CallInfo *ci) { } vmcase(OP_SELF) { StkId ra = RA(i); - const TValue *slot; + lu_byte tag; TValue *rb = vRB(i); - TValue *rc = RKC(i); - TString *key = tsvalue(rc); /* key must be a string */ + TValue *rc = KC(i); + TString *key = tsvalue(rc); /* key must be a short string */ setobj2s(L, ra + 1, rb); - if (luaV_fastget(L, rb, key, slot, luaH_getstr)) { - setobj2s(L, ra, slot); - } - else - Protect(luaV_finishget(L, rb, rc, ra, slot)); + luaV_fastget(rb, key, s2v(ra), luaH_getshortstr, tag); + if (tagisempty(tag)) + Protect(luaV_finishget(L, rb, rc, ra, tag)); vmbreak; } vmcase(OP_ADDI) { @@ -1437,23 +1483,23 @@ void luaV_execute (lua_State *L, CallInfo *ci) { op_bitwiseK(L, l_bxor); vmbreak; } - vmcase(OP_SHRI) { + vmcase(OP_SHLI) { StkId ra = RA(i); TValue *rb = vRB(i); int ic = GETARG_sC(i); lua_Integer ib; if (tointegerns(rb, &ib)) { - pc++; setivalue(s2v(ra), luaV_shiftl(ib, -ic)); + pc++; setivalue(s2v(ra), luaV_shiftl(ic, ib)); } vmbreak; } - vmcase(OP_SHLI) { + vmcase(OP_SHRI) { StkId ra = RA(i); TValue *rb = vRB(i); int ic = GETARG_sC(i); lua_Integer ib; if (tointegerns(rb, &ib)) { - pc++; setivalue(s2v(ra), luaV_shiftl(ic, ib)); + pc++; setivalue(s2v(ra), luaV_shiftl(ib, -ic)); } vmbreak; } @@ -1499,14 +1545,14 @@ void luaV_execute (lua_State *L, CallInfo *ci) { op_bitwise(L, l_bxor); vmbreak; } - vmcase(OP_SHR) { - op_bitwise(L, luaV_shiftr); - vmbreak; - } vmcase(OP_SHL) { op_bitwise(L, luaV_shiftl); vmbreak; } + vmcase(OP_SHR) { + op_bitwise(L, luaV_shiftr); + vmbreak; + } vmcase(OP_MMBIN) { StkId ra = RA(i); Instruction pi = *(pc - 2); /* original arith. expression */ @@ -1587,6 +1633,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { } vmcase(OP_CLOSE) { StkId ra = RA(i); + lua_assert(!GETARG_B(i)); /* 'close must be alive */ Protect(luaF_close(L, ra, LUA_OK, 1)); vmbreak; } @@ -1678,7 +1725,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { if (b != 0) /* fixed number of arguments? */ L->top.p = ra + b; /* top signals number of arguments */ /* else previous instruction set top */ - savepc(L); /* in case of errors */ + savepc(ci); /* in case of errors */ if ((newci = luaD_precall(L, ra, nresults)) == NULL) updatetrap(ci); /* C call; nothing else to be done */ else { /* Lua call: run function in this same C frame */ @@ -1744,10 +1791,10 @@ void luaV_execute (lua_State *L, CallInfo *ci) { trap = 1; } else { /* do the 'poscall' here */ - int nres; + int nres = get_nresults(ci->callstatus); L->ci = ci->previous; /* back to caller */ L->top.p = base - 1; - for (nres = ci->nresults; l_unlikely(nres > 0); nres--) + for (; l_unlikely(nres > 0); nres--) setnilvalue(s2v(L->top.p++)); /* all results are nil */ } goto ret; @@ -1761,7 +1808,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { trap = 1; } else { /* do the 'poscall' here */ - int nres = ci->nresults; + int nres = get_nresults(ci->callstatus); L->ci = ci->previous; /* back to caller */ if (nres == 0) L->top.p = base - 1; /* asked for no results */ @@ -1783,15 +1830,14 @@ void luaV_execute (lua_State *L, CallInfo *ci) { } vmcase(OP_FORLOOP) { StkId ra = RA(i); - if (ttisinteger(s2v(ra + 2))) { /* integer loop? */ - lua_Unsigned count = l_castS2U(ivalue(s2v(ra + 1))); + if (ttisinteger(s2v(ra + 1))) { /* integer loop? */ + lua_Unsigned count = l_castS2U(ivalue(s2v(ra))); if (count > 0) { /* still more iterations? */ - lua_Integer step = ivalue(s2v(ra + 2)); - lua_Integer idx = ivalue(s2v(ra)); /* internal index */ - chgivalue(s2v(ra + 1), count - 1); /* update counter */ + lua_Integer step = ivalue(s2v(ra + 1)); + lua_Integer idx = ivalue(s2v(ra + 2)); /* control variable */ + chgivalue(s2v(ra), l_castU2S(count - 1)); /* update counter */ idx = intop(+, idx, step); /* add step to index */ - chgivalue(s2v(ra), idx); /* update internal index */ - setivalue(s2v(ra + 3), idx); /* and control variable */ + chgivalue(s2v(ra + 2), idx); /* update control variable */ pc -= GETARG_Bx(i); /* jump back */ } } @@ -1808,26 +1854,38 @@ void luaV_execute (lua_State *L, CallInfo *ci) { vmbreak; } vmcase(OP_TFORPREP) { + /* before: 'ra' has the iterator function, 'ra + 1' has the state, + 'ra + 2' has the initial value for the control variable, and + 'ra + 3' has the closing variable. This opcode then swaps the + control and the closing variables and marks the closing variable + as to-be-closed. + */ StkId ra = RA(i); - /* create to-be-closed upvalue (if needed) */ - halfProtect(luaF_newtbcupval(L, ra + 3)); - pc += GETARG_Bx(i); - i = *(pc++); /* go to next instruction */ + TValue temp; /* to swap control and closing variables */ + setobj(L, &temp, s2v(ra + 3)); + setobjs2s(L, ra + 3, ra + 2); + setobj2s(L, ra + 2, &temp); + /* create to-be-closed upvalue (if closing var. is not nil) */ + halfProtect(luaF_newtbcupval(L, ra + 2)); + pc += GETARG_Bx(i); /* go to end of the loop */ + i = *(pc++); /* fetch next instruction */ lua_assert(GET_OPCODE(i) == OP_TFORCALL && ra == RA(i)); goto l_tforcall; } vmcase(OP_TFORCALL) { l_tforcall: { - StkId ra = RA(i); /* 'ra' has the iterator function, 'ra + 1' has the state, - 'ra + 2' has the control variable, and 'ra + 3' has the - to-be-closed variable. The call will use the stack after - these values (starting at 'ra + 4') + 'ra + 2' has the closing variable, and 'ra + 3' has the control + variable. The call will use the stack starting at 'ra + 3', + so that it preserves the first three values, and the first + return will be the new value for the control variable. */ - /* push function, state, and control variable */ - memcpy(ra + 4, ra, 3 * sizeof(*ra)); - L->top.p = ra + 4 + 3; - ProtectNT(luaD_call(L, ra + 4, GETARG_C(i))); /* do the call */ + StkId ra = RA(i); + setobjs2s(L, ra + 5, ra + 3); /* copy the control variable */ + setobjs2s(L, ra + 4, ra + 1); /* copy state */ + setobjs2s(L, ra + 3, ra); /* copy function */ + L->top.p = ra + 3 + 3; + ProtectNT(luaD_call(L, ra + 3, GETARG_C(i))); /* do the call */ updatestack(ci); /* stack may have changed */ i = *(pc++); /* go to next instruction */ lua_assert(GET_OPCODE(i) == OP_TFORLOOP && ra == RA(i)); @@ -1836,31 +1894,33 @@ void luaV_execute (lua_State *L, CallInfo *ci) { vmcase(OP_TFORLOOP) { l_tforloop: { StkId ra = RA(i); - if (!ttisnil(s2v(ra + 4))) { /* continue loop? */ - setobjs2s(L, ra + 2, ra + 4); /* save control variable */ + if (!ttisnil(s2v(ra + 3))) /* continue loop? */ pc -= GETARG_Bx(i); /* jump back */ - } vmbreak; }} vmcase(OP_SETLIST) { StkId ra = RA(i); - int n = GETARG_B(i); - unsigned int last = GETARG_C(i); + unsigned n = cast_uint(GETARG_vB(i)); + unsigned last = cast_uint(GETARG_vC(i)); Table *h = hvalue(s2v(ra)); if (n == 0) - n = cast_int(L->top.p - ra) - 1; /* get up to the top */ + n = cast_uint(L->top.p - ra) - 1; /* get up to the top */ else L->top.p = ci->top.p; /* correct top in case of emergency GC */ last += n; if (TESTARG_k(i)) { - last += GETARG_Ax(*pc) * (MAXARG_C + 1); + last += cast_uint(GETARG_Ax(*pc)) * (MAXARG_vC + 1); pc++; } - if (last > luaH_realasize(h)) /* needs more space? */ + /* when 'n' is known, table should have proper size */ + if (last > h->asize) { /* needs more space? */ + /* fixed-size sets should have space preallocated */ + lua_assert(GETARG_vB(i) == 0); luaH_resizearray(L, h, last); /* preallocate it at once */ + } for (; n > 0; n--) { TValue *val = s2v(ra + n); - setobj2t(L, &h->array[last - 1], val); + obj2arr(h, last - 1, val); last--; luaC_barrierback(L, obj2gco(h), val); } @@ -1875,12 +1935,25 @@ void luaV_execute (lua_State *L, CallInfo *ci) { } vmcase(OP_VARARG) { StkId ra = RA(i); - int n = GETARG_C(i) - 1; /* required results */ - Protect(luaT_getvarargs(L, ci, ra, n)); + int n = GETARG_C(i) - 1; /* required results (-1 means all) */ + int vatab = GETARG_k(i) ? GETARG_B(i) : -1; + Protect(luaT_getvarargs(L, ci, ra, n, vatab)); + vmbreak; + } + vmcase(OP_GETVARG) { + StkId ra = RA(i); + TValue *rc = vRC(i); + luaT_getvararg(ci, ra, rc); + vmbreak; + } + vmcase(OP_ERRNNIL) { + TValue *ra = vRA(i); + if (!ttisnil(ra)) + halfProtect(luaG_errnnil(L, cl, GETARG_Bx(i))); vmbreak; } vmcase(OP_VARARGPREP) { - ProtectNT(luaT_adjustvarargs(L, GETARG_A(i), ci, cl->p)); + ProtectNT(luaT_adjustvarargs(L, ci, cl->p)); if (l_unlikely(trap)) { /* previous "Protect" updated trap */ luaD_hookcall(L, ci); L->oldpc = 1; /* next opcode will be seen as a "new" line */ diff --git a/lua-5.4.7/src/lzio.c b/src/lzio.c similarity index 57% rename from lua-5.4.7/src/lzio.c rename to src/lzio.c index cd0a02d..301df4b 100644 --- a/lua-5.4.7/src/lzio.c +++ b/src/lzio.c @@ -14,6 +14,7 @@ #include "lua.h" +#include "lapi.h" #include "llimits.h" #include "lmem.h" #include "lstate.h" @@ -45,17 +46,25 @@ void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { /* --------------------------------------------------------------- read --- */ + +static int checkbuffer (ZIO *z) { + if (z->n == 0) { /* no bytes in buffer? */ + if (luaZ_fill(z) == EOZ) /* try to read more */ + return 0; /* no more input */ + else { + z->n++; /* luaZ_fill consumed first byte; put it back */ + z->p--; + } + } + return 1; /* now buffer has something */ +} + + size_t luaZ_read (ZIO *z, void *b, size_t n) { while (n) { size_t m; - if (z->n == 0) { /* no bytes in buffer? */ - if (luaZ_fill(z) == EOZ) /* try to read more */ - return n; /* no more input; return number of missing bytes */ - else { - z->n++; /* luaZ_fill consumed first byte; put it back */ - z->p--; - } - } + if (!checkbuffer(z)) + return n; /* no more input; return number of missing bytes */ m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ memcpy(b, z->p, m); z->n -= m; @@ -66,3 +75,15 @@ size_t luaZ_read (ZIO *z, void *b, size_t n) { return 0; } + +const void *luaZ_getaddr (ZIO* z, size_t n) { + const void *res; + if (!checkbuffer(z)) + return NULL; /* no more input */ + if (z->n < n) /* not enough bytes? */ + return NULL; /* block not whole; cannot give an address */ + res = z->p; /* get block address */ + z->n -= n; /* consume these bytes */ + z->p += n; + return res; +}