From 76eda883a5f68c37a060d594c1fc93117a6eb99a Mon Sep 17 00:00:00 2001 From: "Marco Antonio J. Costa" Date: Thu, 30 Jul 2026 12:29:22 -0300 Subject: [PATCH] build Lua from vendored source instead of the prebuilt lua51.lib MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tree carried two prebuilt Lua static libraries and a copy of the Lua public headers. lua51.lib is 5.1.2 and matched the headers; lua51.vc9.lib is 5.1.4 and was dead weight — it came second in Ja2_Libraries, so the linker resolved every Lua symbol out of lua51.lib and never pulled an object from it. Just as well, since it asks for /DEFAULTLIB:MSVCRT while we build /MT. ext/lua-5.1.5 is the upstream tarball unmodified, built as lua51 the way the other vendored libraries are, and its src directory replaces lua/ as the home of lua.h, luaconf.h, lauxlib.h and lualib.h. Those four headers were stock 5.1.2 retabbed, so 5.1.5 is bugfix-only against what the game compiled against; the bytecode format is unchanged across 5.1.x and every script under gamedir is plain source anyway. lua/lua.hpp had no includers and returns to etc/ where upstream keeps it. /SAFESEH:NO goes with it. Its two stated reasons were lua51.lib and the smackw32 import library, and both are now gone: every remaining prebuilt static library is SAFESEH-clean (libexpatMT.lib 5 of 5 members with @feat.00 = 0x1, RakNetLibStatic.lib 79 of 79), and lld-link emits a 3155-entry SEHandlerTable without it. The /MT comment blamed the wrong library. lua51.lib carried no linker directives at all; RakNetLibStatic.lib is what pins us to the static runtime, with /DEFAULTLIB:LIBCMT and /DEFAULTLIB:libcpmt. Verified by building all four applications in Debug and Release, and by linking the tarball's own lua.c against our lua51.lib with the build's clang-cl flags and running it under Wine: 5.1 stdlib, GC, coroutines and the x86 __asm fld/fistp lua_number2int fast path all behave. The game itself could not be launched here — this checkout's gamedir has loose Data directories but no SLF archives, so VFS aborts on Data\Ambient.slf long before any script runs. Co-Authored-By: Claude Opus 5 --- CMakeLists.txt | 11 +- ext/lua-5.1.5/CMakeLists.txt | 34 + ext/lua-5.1.5/COPYRIGHT | 34 + ext/lua-5.1.5/HISTORY | 183 + ext/lua-5.1.5/INSTALL | 99 + ext/lua-5.1.5/Makefile | 128 + ext/lua-5.1.5/README | 37 + ext/lua-5.1.5/doc/contents.html | 497 ++ ext/lua-5.1.5/doc/cover.png | Bin 0 -> 3305 bytes ext/lua-5.1.5/doc/logo.gif | Bin 0 -> 4232 bytes ext/lua-5.1.5/doc/lua.1 | 163 + ext/lua-5.1.5/doc/lua.css | 83 + ext/lua-5.1.5/doc/lua.html | 172 + ext/lua-5.1.5/doc/luac.1 | 136 + ext/lua-5.1.5/doc/luac.html | 145 + ext/lua-5.1.5/doc/manual.css | 24 + ext/lua-5.1.5/doc/manual.html | 8804 ++++++++++++++++++++++++++ ext/lua-5.1.5/doc/readme.html | 40 + ext/lua-5.1.5/etc/Makefile | 44 + ext/lua-5.1.5/etc/README | 37 + ext/lua-5.1.5/etc/all.c | 38 + {lua => ext/lua-5.1.5/etc}/lua.hpp | 0 ext/lua-5.1.5/etc/lua.ico | Bin 0 -> 1078 bytes ext/lua-5.1.5/etc/lua.pc | 31 + ext/lua-5.1.5/etc/luavs.bat | 28 + ext/lua-5.1.5/etc/min.c | 39 + ext/lua-5.1.5/etc/noparser.c | 50 + ext/lua-5.1.5/etc/strict.lua | 41 + ext/lua-5.1.5/src/Makefile | 182 + ext/lua-5.1.5/src/lapi.c | 1087 ++++ ext/lua-5.1.5/src/lapi.h | 16 + ext/lua-5.1.5/src/lauxlib.c | 652 ++ {lua => ext/lua-5.1.5/src}/lauxlib.h | 54 +- ext/lua-5.1.5/src/lbaselib.c | 653 ++ ext/lua-5.1.5/src/lcode.c | 831 +++ ext/lua-5.1.5/src/lcode.h | 76 + ext/lua-5.1.5/src/ldblib.c | 398 ++ ext/lua-5.1.5/src/ldebug.c | 638 ++ ext/lua-5.1.5/src/ldebug.h | 33 + ext/lua-5.1.5/src/ldo.c | 519 ++ ext/lua-5.1.5/src/ldo.h | 57 + ext/lua-5.1.5/src/ldump.c | 164 + ext/lua-5.1.5/src/lfunc.c | 174 + ext/lua-5.1.5/src/lfunc.h | 34 + ext/lua-5.1.5/src/lgc.c | 710 +++ ext/lua-5.1.5/src/lgc.h | 110 + ext/lua-5.1.5/src/linit.c | 38 + ext/lua-5.1.5/src/liolib.c | 556 ++ ext/lua-5.1.5/src/llex.c | 463 ++ ext/lua-5.1.5/src/llex.h | 81 + ext/lua-5.1.5/src/llimits.h | 128 + ext/lua-5.1.5/src/lmathlib.c | 263 + ext/lua-5.1.5/src/lmem.c | 86 + ext/lua-5.1.5/src/lmem.h | 49 + ext/lua-5.1.5/src/loadlib.c | 666 ++ ext/lua-5.1.5/src/lobject.c | 214 + ext/lua-5.1.5/src/lobject.h | 381 ++ ext/lua-5.1.5/src/lopcodes.c | 102 + ext/lua-5.1.5/src/lopcodes.h | 268 + ext/lua-5.1.5/src/loslib.c | 243 + ext/lua-5.1.5/src/lparser.c | 1339 ++++ ext/lua-5.1.5/src/lparser.h | 82 + ext/lua-5.1.5/src/lstate.c | 214 + ext/lua-5.1.5/src/lstate.h | 169 + ext/lua-5.1.5/src/lstring.c | 111 + ext/lua-5.1.5/src/lstring.h | 31 + ext/lua-5.1.5/src/lstrlib.c | 871 +++ ext/lua-5.1.5/src/ltable.c | 588 ++ ext/lua-5.1.5/src/ltable.h | 40 + ext/lua-5.1.5/src/ltablib.c | 287 + ext/lua-5.1.5/src/ltm.c | 75 + ext/lua-5.1.5/src/ltm.h | 54 + ext/lua-5.1.5/src/lua.c | 392 ++ {lua => ext/lua-5.1.5/src}/lua.h | 167 +- ext/lua-5.1.5/src/luac.c | 200 + {lua => ext/lua-5.1.5/src}/luaconf.h | 65 +- {lua => ext/lua-5.1.5/src}/lualib.h | 2 +- ext/lua-5.1.5/src/lundump.c | 227 + ext/lua-5.1.5/src/lundump.h | 36 + ext/lua-5.1.5/src/lvm.c | 767 +++ ext/lua-5.1.5/src/lvm.h | 36 + ext/lua-5.1.5/src/lzio.c | 82 + ext/lua-5.1.5/src/lzio.h | 67 + ext/lua-5.1.5/src/print.c | 227 + ext/lua-5.1.5/test/README | 26 + ext/lua-5.1.5/test/bisect.lua | 27 + ext/lua-5.1.5/test/cf.lua | 16 + ext/lua-5.1.5/test/echo.lua | 5 + ext/lua-5.1.5/test/env.lua | 7 + ext/lua-5.1.5/test/factorial.lua | 32 + ext/lua-5.1.5/test/fib.lua | 40 + ext/lua-5.1.5/test/fibfor.lua | 13 + ext/lua-5.1.5/test/globals.lua | 13 + ext/lua-5.1.5/test/hello.lua | 3 + ext/lua-5.1.5/test/life.lua | 111 + ext/lua-5.1.5/test/luac.lua | 7 + ext/lua-5.1.5/test/printf.lua | 7 + ext/lua-5.1.5/test/readonly.lua | 12 + ext/lua-5.1.5/test/sieve.lua | 29 + ext/lua-5.1.5/test/sort.lua | 66 + ext/lua-5.1.5/test/table.lua | 12 + ext/lua-5.1.5/test/trace-calls.lua | 32 + ext/lua-5.1.5/test/trace-globals.lua | 38 + ext/lua-5.1.5/test/xd.lua | 14 + lua/CMakeLists.txt | 1 + lua51.lib | Bin 456476 -> 0 bytes lua51.vc9.lib | Bin 482002 -> 0 bytes 107 files changed, 27315 insertions(+), 149 deletions(-) create mode 100644 ext/lua-5.1.5/CMakeLists.txt create mode 100644 ext/lua-5.1.5/COPYRIGHT create mode 100644 ext/lua-5.1.5/HISTORY create mode 100644 ext/lua-5.1.5/INSTALL create mode 100644 ext/lua-5.1.5/Makefile create mode 100644 ext/lua-5.1.5/README create mode 100644 ext/lua-5.1.5/doc/contents.html create mode 100644 ext/lua-5.1.5/doc/cover.png create mode 100644 ext/lua-5.1.5/doc/logo.gif create mode 100644 ext/lua-5.1.5/doc/lua.1 create mode 100644 ext/lua-5.1.5/doc/lua.css create mode 100644 ext/lua-5.1.5/doc/lua.html create mode 100644 ext/lua-5.1.5/doc/luac.1 create mode 100644 ext/lua-5.1.5/doc/luac.html create mode 100644 ext/lua-5.1.5/doc/manual.css create mode 100644 ext/lua-5.1.5/doc/manual.html create mode 100644 ext/lua-5.1.5/doc/readme.html create mode 100644 ext/lua-5.1.5/etc/Makefile create mode 100644 ext/lua-5.1.5/etc/README create mode 100644 ext/lua-5.1.5/etc/all.c rename {lua => ext/lua-5.1.5/etc}/lua.hpp (100%) create mode 100644 ext/lua-5.1.5/etc/lua.ico create mode 100644 ext/lua-5.1.5/etc/lua.pc create mode 100644 ext/lua-5.1.5/etc/luavs.bat create mode 100644 ext/lua-5.1.5/etc/min.c create mode 100644 ext/lua-5.1.5/etc/noparser.c create mode 100644 ext/lua-5.1.5/etc/strict.lua create mode 100644 ext/lua-5.1.5/src/Makefile create mode 100644 ext/lua-5.1.5/src/lapi.c create mode 100644 ext/lua-5.1.5/src/lapi.h create mode 100644 ext/lua-5.1.5/src/lauxlib.c rename {lua => ext/lua-5.1.5/src}/lauxlib.h (75%) create mode 100644 ext/lua-5.1.5/src/lbaselib.c create mode 100644 ext/lua-5.1.5/src/lcode.c create mode 100644 ext/lua-5.1.5/src/lcode.h create mode 100644 ext/lua-5.1.5/src/ldblib.c create mode 100644 ext/lua-5.1.5/src/ldebug.c create mode 100644 ext/lua-5.1.5/src/ldebug.h create mode 100644 ext/lua-5.1.5/src/ldo.c create mode 100644 ext/lua-5.1.5/src/ldo.h create mode 100644 ext/lua-5.1.5/src/ldump.c create mode 100644 ext/lua-5.1.5/src/lfunc.c create mode 100644 ext/lua-5.1.5/src/lfunc.h create mode 100644 ext/lua-5.1.5/src/lgc.c create mode 100644 ext/lua-5.1.5/src/lgc.h create mode 100644 ext/lua-5.1.5/src/linit.c create mode 100644 ext/lua-5.1.5/src/liolib.c create mode 100644 ext/lua-5.1.5/src/llex.c create mode 100644 ext/lua-5.1.5/src/llex.h create mode 100644 ext/lua-5.1.5/src/llimits.h create mode 100644 ext/lua-5.1.5/src/lmathlib.c create mode 100644 ext/lua-5.1.5/src/lmem.c create mode 100644 ext/lua-5.1.5/src/lmem.h create mode 100644 ext/lua-5.1.5/src/loadlib.c create mode 100644 ext/lua-5.1.5/src/lobject.c create mode 100644 ext/lua-5.1.5/src/lobject.h create mode 100644 ext/lua-5.1.5/src/lopcodes.c create mode 100644 ext/lua-5.1.5/src/lopcodes.h create mode 100644 ext/lua-5.1.5/src/loslib.c create mode 100644 ext/lua-5.1.5/src/lparser.c create mode 100644 ext/lua-5.1.5/src/lparser.h create mode 100644 ext/lua-5.1.5/src/lstate.c create mode 100644 ext/lua-5.1.5/src/lstate.h create mode 100644 ext/lua-5.1.5/src/lstring.c create mode 100644 ext/lua-5.1.5/src/lstring.h create mode 100644 ext/lua-5.1.5/src/lstrlib.c create mode 100644 ext/lua-5.1.5/src/ltable.c create mode 100644 ext/lua-5.1.5/src/ltable.h create mode 100644 ext/lua-5.1.5/src/ltablib.c create mode 100644 ext/lua-5.1.5/src/ltm.c create mode 100644 ext/lua-5.1.5/src/ltm.h create mode 100644 ext/lua-5.1.5/src/lua.c rename {lua => ext/lua-5.1.5/src}/lua.h (60%) create mode 100644 ext/lua-5.1.5/src/luac.c rename {lua => ext/lua-5.1.5/src}/luaconf.h (92%) rename {lua => ext/lua-5.1.5/src}/lualib.h (93%) create mode 100644 ext/lua-5.1.5/src/lundump.c create mode 100644 ext/lua-5.1.5/src/lundump.h create mode 100644 ext/lua-5.1.5/src/lvm.c create mode 100644 ext/lua-5.1.5/src/lvm.h create mode 100644 ext/lua-5.1.5/src/lzio.c create mode 100644 ext/lua-5.1.5/src/lzio.h create mode 100644 ext/lua-5.1.5/src/print.c create mode 100644 ext/lua-5.1.5/test/README create mode 100644 ext/lua-5.1.5/test/bisect.lua create mode 100644 ext/lua-5.1.5/test/cf.lua create mode 100644 ext/lua-5.1.5/test/echo.lua create mode 100644 ext/lua-5.1.5/test/env.lua create mode 100644 ext/lua-5.1.5/test/factorial.lua create mode 100644 ext/lua-5.1.5/test/fib.lua create mode 100644 ext/lua-5.1.5/test/fibfor.lua create mode 100644 ext/lua-5.1.5/test/globals.lua create mode 100644 ext/lua-5.1.5/test/hello.lua create mode 100644 ext/lua-5.1.5/test/life.lua create mode 100644 ext/lua-5.1.5/test/luac.lua create mode 100644 ext/lua-5.1.5/test/printf.lua create mode 100644 ext/lua-5.1.5/test/readonly.lua create mode 100644 ext/lua-5.1.5/test/sieve.lua create mode 100644 ext/lua-5.1.5/test/sort.lua create mode 100644 ext/lua-5.1.5/test/table.lua create mode 100644 ext/lua-5.1.5/test/trace-calls.lua create mode 100644 ext/lua-5.1.5/test/trace-globals.lua create mode 100644 ext/lua-5.1.5/test/xd.lua delete mode 100644 lua51.lib delete mode 100644 lua51.vc9.lib diff --git a/CMakeLists.txt b/CMakeLists.txt index 01eb82f9b..10ce1b4d7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,8 +52,8 @@ endif() # whether we are using MSBuild as a generator set(usingMsBuild $) -# lua51.lib and lua51.vc9.lib have been built with /MTx, so we must as well -# TODO: build our own Lua 5.1.2 from source so we can use whichever +# RakNetLibStatic.lib carries /DEFAULTLIB:LIBCMT and /DEFAULTLIB:libcpmt, so the +# static runtime is forced on us until RakNet too is built from source set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") # make Debug builds /Z7 instead of /Zi so they can be sccache'd set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT @@ -64,6 +64,7 @@ include_directories( "${CMAKE_SOURCE_DIR}/Ja2" "${CMAKE_SOURCE_DIR}/ext/VFS/include" "${CMAKE_SOURCE_DIR}/ext/libsmacker" + "${CMAKE_SOURCE_DIR}/ext/lua-5.1.5/src" "${CMAKE_SOURCE_DIR}/Utils" "${CMAKE_SOURCE_DIR}/TileEngine" "${CMAKE_SOURCE_DIR}/TacticalAI" @@ -82,6 +83,7 @@ include_directories( # external libraries add_subdirectory("ext/libpng") add_subdirectory("ext/libsmacker") +add_subdirectory("ext/lua-5.1.5") add_subdirectory("ext/zlib") add_subdirectory("ext/VFS") target_link_libraries(bfVFS PRIVATE 7z) @@ -135,8 +137,6 @@ endif() set(Ja2_Libraries "${binkw32_lib}" "${CMAKE_SOURCE_DIR}/libexpatMT.lib" -"${CMAKE_SOURCE_DIR}/lua51.lib" -"${CMAKE_SOURCE_DIR}/lua51.vc9.lib" "dbghelp.lib" "winmm.lib" "ws2_32.lib" @@ -206,9 +206,6 @@ foreach(app IN LISTS ApplicationTargets) # RakNetLibStatic.lib was built against an older CRT and still calls # _vsnprintf, which the UCRT only exports through this compatibility library. target_link_libraries(${exe} PRIVATE ${Ja2_Libraries} legacy_stdio_definitions.lib) - # The prebuilt lua51.lib and smackw32 import library carry no safe exception - # handler table, so the image cannot claim one whatever links it. - target_link_options(${exe} PRIVATE /SAFESEH:NO) target_compile_definitions(${exe} PRIVATE ${compilationFlags} ${debugFlags}) # language library for the application, e.g. JA2MAPEDITOR_i18n — one per app, all 8 diff --git a/ext/lua-5.1.5/CMakeLists.txt b/ext/lua-5.1.5/CMakeLists.txt new file mode 100644 index 000000000..9145d0ad1 --- /dev/null +++ b/ext/lua-5.1.5/CMakeLists.txt @@ -0,0 +1,34 @@ +# The Lua core and standard library, as shipped. lua.c (interpreter) and +# luac.c/print.c (compiler) are the command line tools and are not built. +add_library(lua51 STATIC +"src/lapi.c" +"src/lcode.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/ldblib.c" +"src/liolib.c" +"src/lmathlib.c" +"src/loslib.c" +"src/lstrlib.c" +"src/ltablib.c" +"src/loadlib.c" +"src/linit.c" +) +target_include_directories(lua51 PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src") diff --git a/ext/lua-5.1.5/COPYRIGHT b/ext/lua-5.1.5/COPYRIGHT new file mode 100644 index 000000000..a86026803 --- /dev/null +++ b/ext/lua-5.1.5/COPYRIGHT @@ -0,0 +1,34 @@ +Lua License +----------- + +Lua is licensed under the terms of the MIT license reproduced below. +This means that Lua is free software and can be used for both academic +and commercial purposes at absolutely no cost. + +For details and rationale, see http://www.lua.org/license.html . + +=============================================================================== + +Copyright (C) 1994-2012 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. + +=============================================================================== + +(end of COPYRIGHT) diff --git a/ext/lua-5.1.5/HISTORY b/ext/lua-5.1.5/HISTORY new file mode 100644 index 000000000..ce0c95bc6 --- /dev/null +++ b/ext/lua-5.1.5/HISTORY @@ -0,0 +1,183 @@ +HISTORY for Lua 5.1 + +* Changes from version 5.0 to 5.1 + ------------------------------- + Language: + + new module system. + + new semantics for control variables of fors. + + new semantics for setn/getn. + + new syntax/semantics for varargs. + + new long strings and comments. + + new `mod' operator (`%') + + new length operator #t + + metatables for all types + API: + + new functions: lua_createtable, lua_get(set)field, lua_push(to)integer. + + user supplies memory allocator (lua_open becomes lua_newstate). + + luaopen_* functions must be called through Lua. + Implementation: + + new configuration scheme via luaconf.h. + + incremental garbage collection. + + better handling of end-of-line in the lexer. + + fully reentrant parser (new Lua function `load') + + better support for 64-bit machines. + + native loadlib support for Mac OS X. + + standard distribution in only one library (lualib.a merged into lua.a) + +* Changes from version 4.0 to 5.0 + ------------------------------- + Language: + + lexical scoping. + + Lua coroutines. + + standard libraries now packaged in tables. + + tags replaced by metatables and tag methods replaced by metamethods, + stored in metatables. + + proper tail calls. + + each function can have its own global table, which can be shared. + + new __newindex metamethod, called when we insert a new key into a table. + + new block comments: --[[ ... ]]. + + new generic for. + + new weak tables. + + new boolean type. + + new syntax "local function". + + (f()) returns the first value returned by f. + + {f()} fills a table with all values returned by f. + + \n ignored in [[\n . + + fixed and-or priorities. + + more general syntax for function definition (e.g. function a.x.y:f()...end). + + more general syntax for function calls (e.g. (print or write)(9)). + + new functions (time/date, tmpfile, unpack, require, load*, etc.). + API: + + chunks are loaded by using lua_load; new luaL_loadfile and luaL_loadbuffer. + + introduced lightweight userdata, a simple "void*" without a metatable. + + new error handling protocol: the core no longer prints error messages; + all errors are reported to the caller on the stack. + + new lua_atpanic for host cleanup. + + new, signal-safe, hook scheme. + Implementation: + + new license: MIT. + + new, faster, register-based virtual machine. + + support for external multithreading and coroutines. + + new and consistent error message format. + + the core no longer needs "stdio.h" for anything (except for a single + use of sprintf to convert numbers to strings). + + lua.c now runs the environment variable LUA_INIT, if present. It can + be "@filename", to run a file, or the chunk itself. + + support for user extensions in lua.c. + sample implementation given for command line editing. + + new dynamic loading library, active by default on several platforms. + + safe garbage-collector metamethods. + + precompiled bytecodes checked for integrity (secure binary dostring). + + strings are fully aligned. + + position capture in string.find. + + read('*l') can read lines with embedded zeros. + +* Changes from version 3.2 to 4.0 + ------------------------------- + Language: + + new "break" and "for" statements (both numerical and for tables). + + uniform treatment of globals: globals are now stored in a Lua table. + + improved error messages. + + no more '$debug': full speed *and* full debug information. + + new read form: read(N) for next N bytes. + + general read patterns now deprecated. + (still available with -DCOMPAT_READPATTERNS.) + + all return values are passed as arguments for the last function + (old semantics still available with -DLUA_COMPAT_ARGRET) + + garbage collection tag methods for tables now deprecated. + + there is now only one tag method for order. + API: + + New API: fully re-entrant, simpler, and more efficient. + + New debug API. + Implementation: + + faster than ever: cleaner virtual machine and new hashing algorithm. + + non-recursive garbage-collector algorithm. + + reduced memory usage for programs with many strings. + + improved treatment for memory allocation errors. + + improved support for 16-bit machines (we hope). + + code now compiles unmodified as both ANSI C and C++. + + numbers in bases other than 10 are converted using strtoul. + + new -f option in Lua to support #! scripts. + + luac can now combine text and binaries. + +* Changes from version 3.1 to 3.2 + ------------------------------- + + redirected all output in Lua's core to _ERRORMESSAGE and _ALERT. + + increased limit on the number of constants and globals per function + (from 2^16 to 2^24). + + debugging info (lua_debug and hooks) moved into lua_state and new API + functions provided to get and set this info. + + new debug lib gives full debugging access within Lua. + + new table functions "foreachi", "sort", "tinsert", "tremove", "getn". + + new io functions "flush", "seek". + +* Changes from version 3.0 to 3.1 + ------------------------------- + + NEW FEATURE: anonymous functions with closures (via "upvalues"). + + new syntax: + - local variables in chunks. + - better scope control with DO block END. + - constructors can now be also written: { record-part; list-part }. + - more general syntax for function calls and lvalues, e.g.: + f(x).y=1 + o:f(x,y):g(z) + f"string" is sugar for f("string") + + strings may now contain arbitrary binary data (e.g., embedded zeros). + + major code re-organization and clean-up; reduced module interdependecies. + + no arbitrary limits on the total number of constants and globals. + + support for multiple global contexts. + + better syntax error messages. + + new traversal functions "foreach" and "foreachvar". + + the default for numbers is now double. + changing it to use floats or longs is easy. + + complete debug information stored in pre-compiled chunks. + + sample interpreter now prompts user when run interactively, and also + handles control-C interruptions gracefully. + +* Changes from version 2.5 to 3.0 + ------------------------------- + + NEW CONCEPT: "tag methods". + Tag methods replace fallbacks as the meta-mechanism for extending the + semantics of Lua. Whereas fallbacks had a global nature, tag methods + work on objects having the same tag (e.g., groups of tables). + Existing code that uses fallbacks should work without change. + + new, general syntax for constructors {[exp] = exp, ... }. + + support for handling variable number of arguments in functions (varargs). + + support for conditional compilation ($if ... $else ... $end). + + cleaner semantics in API simplifies host code. + + better support for writing libraries (auxlib.h). + + better type checking and error messages in the standard library. + + luac can now also undump. + +* Changes from version 2.4 to 2.5 + ------------------------------- + + io and string libraries are now based on pattern matching; + the old libraries are still available for compatibility + + dofile and dostring can now return values (via return statement) + + better support for 16- and 64-bit machines + + expanded documentation, with more examples + +* Changes from version 2.2 to 2.4 + ------------------------------- + + external compiler creates portable binary files that can be loaded faster + + interface for debugging and profiling + + new "getglobal" fallback + + new functions for handling references to Lua objects + + new functions in standard lib + + only one copy of each string is stored + + expanded documentation, with more examples + +* Changes from version 2.1 to 2.2 + ------------------------------- + + functions now may be declared with any "lvalue" as a name + + garbage collection of functions + + support for pipes + +* Changes from version 1.1 to 2.1 + ------------------------------- + + object-oriented support + + fallbacks + + simplified syntax for tables + + many internal improvements + +(end of HISTORY) diff --git a/ext/lua-5.1.5/INSTALL b/ext/lua-5.1.5/INSTALL new file mode 100644 index 000000000..17eb8aee8 --- /dev/null +++ b/ext/lua-5.1.5/INSTALL @@ -0,0 +1,99 @@ +INSTALL for Lua 5.1 + +* Building Lua + ------------ + Lua is built in the src directory, but the build process can be + controlled from the top-level Makefile. + + Building Lua on Unix systems should be very easy. First do "make" and + see if your platform is listed. If so, just do "make xxx", where xxx + is your platform name. The platforms currently supported are: + aix ansi bsd freebsd generic linux macosx mingw posix solaris + + If your platform is not listed, try the closest one or posix, generic, + ansi, in this order. + + See below for customization instructions and for instructions on how + to build with other Windows compilers. + + If you want to check that Lua has been built correctly, do "make test" + after building Lua. Also, have a look at the example programs in test. + +* 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 Makefile. You must + have the right permissions to install files. + + If you want to build and install Lua in one step, do "make xxx install", + where xxx is your platform name. + + If you want to install Lua locally, then do "make local". This will + create directories bin, include, lib, man, and install Lua there as + follows: + + 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. + + There are man pages for lua and luac, in both nroff and html, and a + reference manual in html in doc, some sample code in test, and some + useful stuff in etc. You don't need these directories for development. + + If you want to install Lua locally, but in some other directory, do + "make install INSTALL_TOP=xxx", where xxx is your chosen directory. + + See below for instructions for Windows and other systems. + +* Customization + ------------- + Three 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 when invoking make. + + On the other hand, if you need to select some Lua features, you'll need + to edit src/luaconf.h. The edited file will be the one installed, and + it will be used by any Lua clients that you build, to ensure consistency. + + We strongly recommend that you enable dynamic loading. This is done + automatically for all platforms listed above that have this feature + (and also Windows). See src/luaconf.h and also src/Makefile. + +* Building Lua on Windows and 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 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 ldblib.c liolib.c lmathlib.c loslib.c + ltablib.c lstrlib.c loadlib.c linit.c + + interpreter: library, lua.c + + compiler: library, luac.c print.c + + If you use Visual Studio .NET, you can use etc/luavs.bat in its + "Command Prompt". + + If all you want is to build the Lua interpreter, you may put all .c files + in a single project, except for luac.c and print.c. Or just use etc/all.c. + + To use Lua as a library in your own programs, you'll need to know how to + create and use libraries with your compiler. + + As mentioned above, you may edit luaconf.h to select some features before + building Lua. + +(end of INSTALL) diff --git a/ext/lua-5.1.5/Makefile b/ext/lua-5.1.5/Makefile new file mode 100644 index 000000000..209a13244 --- /dev/null +++ b/ext/lua-5.1.5/Makefile @@ -0,0 +1,128 @@ +# makefile for installing Lua +# see INSTALL for installation instructions +# see src/Makefile and src/luaconf.h for further customization + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= none + +# Where to install. The installation starts in the src and doc directories, +# so take care if INSTALL_TOP is not an absolute path. +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 +# +# You probably want to make INSTALL_LMOD and INSTALL_CMOD consistent with +# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h (and also with etc/lua.pc). +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 (do "make ranlib"). +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) + +# Utilities. +MKDIR= mkdir -p +RANLIB= ranlib + +# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= + +# Convenience platforms targets. +PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris + +# What to install. +TO_BIN= lua luac +TO_INC= lua.h luaconf.h lualib.h lauxlib.h ../etc/lua.hpp +TO_LIB= liblua.a +TO_MAN= lua.1 luac.1 + +# Lua version and release. +V= 5.1 +R= 5.1.5 + +all: $(PLAT) + +$(PLATS) clean: + cd src && $(MAKE) $@ + +test: dummy + src/lua test/hello.lua + +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) + +ranlib: + cd src && cd $(INSTALL_LIB) && $(RANLIB) $(TO_LIB) + +local: + $(MAKE) install INSTALL_TOP=.. + +none: + @echo "Please do" + @echo " make PLATFORM" + @echo "where PLATFORM is one of these:" + @echo " $(PLATS)" + @echo "See INSTALL for complete instructions." + +# make may get confused with test/ and INSTALL in a case-insensitive OS +dummy: + +# echo config parameters +echo: + @echo "" + @echo "These are the parameters currently set in src/Makefile to build Lua $R:" + @echo "" + @cd src && $(MAKE) -s echo + @echo "" + @echo "These are the parameters currently set in Makefile to install Lua $R:" + @echo "" + @echo "PLAT = $(PLAT)" + @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 "" + @echo "See also src/luaconf.h ." + @echo "" + +# echo private config parameters +pecho: + @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 config parameters as Lua code +# uncomment the last sed expression if you want nil instead of empty strings +lecho: + @echo "-- installation parameters for Lua $R" + @echo "VERSION = '$V'" + @echo "RELEASE = '$R'" + @$(MAKE) echo | grep = | sed -e 's/= /= "/' -e 's/$$/"/' #-e 's/""/nil/' + @echo "-- EOF" + +# list targets that do not create files (but not all makes understand .PHONY) +.PHONY: all $(PLATS) clean test install local none dummy echo pecho lecho + +# (end of Makefile) diff --git a/ext/lua-5.1.5/README b/ext/lua-5.1.5/README new file mode 100644 index 000000000..11b4dff70 --- /dev/null +++ b/ext/lua-5.1.5/README @@ -0,0 +1,37 @@ +README for Lua 5.1 + +See INSTALL for installation instructions. +See HISTORY for a summary of changes since the last released version. + +* What is Lua? + ------------ + Lua is a powerful, light-weight programming language designed for extending + applications. Lua is also frequently used as a general-purpose, stand-alone + language. Lua is free software. + + For complete information, visit Lua's web site at http://www.lua.org/ . + For an executive summary, see http://www.lua.org/about.html . + + Lua has been used in many different projects around the world. + For a short list, see http://www.lua.org/uses.html . + +* Availability + ------------ + Lua is freely available for both academic and commercial purposes. + See COPYRIGHT and http://www.lua.org/license.html for details. + Lua can be downloaded at http://www.lua.org/download.html . + +* Installation + ------------ + Lua is implemented in pure ANSI C, and compiles unmodified in all known + platforms that have an ANSI C compiler. In most Unix-like platforms, simply + do "make" with a suitable target. See INSTALL for detailed instructions. + +* Origin + ------ + Lua is developed at Lua.org, a laboratory of the Department of Computer + Science of PUC-Rio (the Pontifical Catholic University of Rio de Janeiro + in Brazil). + For more information about the authors, see http://www.lua.org/authors.html . + +(end of README) diff --git a/ext/lua-5.1.5/doc/contents.html b/ext/lua-5.1.5/doc/contents.html new file mode 100644 index 000000000..3d83da98a --- /dev/null +++ b/ext/lua-5.1.5/doc/contents.html @@ -0,0 +1,497 @@ + + + +Lua 5.1 Reference Manual - contents + + + + + + + +
+

+ +Lua 5.1 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. + +

+This manual is also available as a book: +

+ + + +Lua 5.1 Reference Manual +
by R. Ierusalimschy, L. H. de Figueiredo, W. Celes +
Lua.org, August 2006 +
ISBN 85-903798-3-3 +
+
+ +

+Buy a copy +of this book and +help to support +the Lua project. + +

+start +· +contents +· +index +· +other versions +


+ +Copyright © 2006–2012 Lua.org, PUC-Rio. +Freely available under the terms of the +Lua license. + + +

Contents

+ + +

Index

+ + + + + + + +
+

Lua functions

+_G
+_VERSION
+

+ +assert
+collectgarbage
+dofile
+error
+getfenv
+getmetatable
+ipairs
+load
+loadfile
+loadstring
+module
+next
+pairs
+pcall
+print
+rawequal
+rawget
+rawset
+require
+select
+setfenv
+setmetatable
+tonumber
+tostring
+type
+unpack
+xpcall
+

+ +coroutine.create
+coroutine.resume
+coroutine.running
+coroutine.status
+coroutine.wrap
+coroutine.yield
+

+ +debug.debug
+debug.getfenv
+debug.gethook
+debug.getinfo
+debug.getlocal
+debug.getmetatable
+debug.getregistry
+debug.getupvalue
+debug.setfenv
+debug.sethook
+debug.setlocal
+debug.setmetatable
+debug.setupvalue
+debug.traceback
+ +

+

 

+file:close
+file:flush
+file:lines
+file:read
+file:seek
+file:setvbuf
+file:write
+

+ +io.close
+io.flush
+io.input
+io.lines
+io.open
+io.output
+io.popen
+io.read
+io.stderr
+io.stdin
+io.stdout
+io.tmpfile
+io.type
+io.write
+

+ +math.abs
+math.acos
+math.asin
+math.atan
+math.atan2
+math.ceil
+math.cos
+math.cosh
+math.deg
+math.exp
+math.floor
+math.fmod
+math.frexp
+math.huge
+math.ldexp
+math.log
+math.log10
+math.max
+math.min
+math.modf
+math.pi
+math.pow
+math.rad
+math.random
+math.randomseed
+math.sin
+math.sinh
+math.sqrt
+math.tan
+math.tanh
+

+ +os.clock
+os.date
+os.difftime
+os.execute
+os.exit
+os.getenv
+os.remove
+os.rename
+os.setlocale
+os.time
+os.tmpname
+

+ +package.cpath
+package.loaded
+package.loaders
+package.loadlib
+package.path
+package.preload
+package.seeall
+

+ +string.byte
+string.char
+string.dump
+string.find
+string.format
+string.gmatch
+string.gsub
+string.len
+string.lower
+string.match
+string.rep
+string.reverse
+string.sub
+string.upper
+

+ +table.concat
+table.insert
+table.maxn
+table.remove
+table.sort
+ +

+

C API

+lua_Alloc
+lua_CFunction
+lua_Debug
+lua_Hook
+lua_Integer
+lua_Number
+lua_Reader
+lua_State
+lua_Writer
+

+ +lua_atpanic
+lua_call
+lua_checkstack
+lua_close
+lua_concat
+lua_cpcall
+lua_createtable
+lua_dump
+lua_equal
+lua_error
+lua_gc
+lua_getallocf
+lua_getfenv
+lua_getfield
+lua_getglobal
+lua_gethook
+lua_gethookcount
+lua_gethookmask
+lua_getinfo
+lua_getlocal
+lua_getmetatable
+lua_getstack
+lua_gettable
+lua_gettop
+lua_getupvalue
+lua_insert
+lua_isboolean
+lua_iscfunction
+lua_isfunction
+lua_islightuserdata
+lua_isnil
+lua_isnone
+lua_isnoneornil
+lua_isnumber
+lua_isstring
+lua_istable
+lua_isthread
+lua_isuserdata
+lua_lessthan
+lua_load
+lua_newstate
+lua_newtable
+lua_newthread
+lua_newuserdata
+lua_next
+lua_objlen
+lua_pcall
+lua_pop
+lua_pushboolean
+lua_pushcclosure
+lua_pushcfunction
+lua_pushfstring
+lua_pushinteger
+lua_pushlightuserdata
+lua_pushliteral
+lua_pushlstring
+lua_pushnil
+lua_pushnumber
+lua_pushstring
+lua_pushthread
+lua_pushvalue
+lua_pushvfstring
+lua_rawequal
+lua_rawget
+lua_rawgeti
+lua_rawset
+lua_rawseti
+lua_register
+lua_remove
+lua_replace
+lua_resume
+lua_setallocf
+lua_setfenv
+lua_setfield
+lua_setglobal
+lua_sethook
+lua_setlocal
+lua_setmetatable
+lua_settable
+lua_settop
+lua_setupvalue
+lua_status
+lua_toboolean
+lua_tocfunction
+lua_tointeger
+lua_tolstring
+lua_tonumber
+lua_topointer
+lua_tostring
+lua_tothread
+lua_touserdata
+lua_type
+lua_typename
+lua_upvalueindex
+lua_xmove
+lua_yield
+ +

+

auxiliary library

+luaL_Buffer
+luaL_Reg
+

+ +luaL_addchar
+luaL_addlstring
+luaL_addsize
+luaL_addstring
+luaL_addvalue
+luaL_argcheck
+luaL_argerror
+luaL_buffinit
+luaL_callmeta
+luaL_checkany
+luaL_checkint
+luaL_checkinteger
+luaL_checklong
+luaL_checklstring
+luaL_checknumber
+luaL_checkoption
+luaL_checkstack
+luaL_checkstring
+luaL_checktype
+luaL_checkudata
+luaL_dofile
+luaL_dostring
+luaL_error
+luaL_getmetafield
+luaL_getmetatable
+luaL_gsub
+luaL_loadbuffer
+luaL_loadfile
+luaL_loadstring
+luaL_newmetatable
+luaL_newstate
+luaL_openlibs
+luaL_optint
+luaL_optinteger
+luaL_optlong
+luaL_optlstring
+luaL_optnumber
+luaL_optstring
+luaL_prepbuffer
+luaL_pushresult
+luaL_ref
+luaL_register
+luaL_typename
+luaL_typerror
+luaL_unref
+luaL_where
+ +

+

+ +


+ +Last update: +Mon Feb 13 18:53:32 BRST 2012 + + + + + diff --git a/ext/lua-5.1.5/doc/cover.png b/ext/lua-5.1.5/doc/cover.png new file mode 100644 index 0000000000000000000000000000000000000000..2dbb198123f03a7250bfa57c8253739962d69afb GIT binary patch literal 3305 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 literal 0 HcmV?d00001 diff --git a/ext/lua-5.1.5/doc/logo.gif b/ext/lua-5.1.5/doc/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..2f5e4ac2e742fbb7675e739879211553758aea9c GIT binary patch literal 4232 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 PWz_J}_#7St0k8iB@FZjZ literal 0 HcmV?d00001 diff --git a/ext/lua-5.1.5/doc/lua.1 b/ext/lua-5.1.5/doc/lua.1 new file mode 100644 index 000000000..24809cc6c --- /dev/null +++ b/ext/lua-5.1.5/doc/lua.1 @@ -0,0 +1,163 @@ +.\" $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $ +.TH LUA 1 "$Date: 2006/01/06 16:03:34 $" +.SH NAME +lua \- Lua interpreter +.SH SYNOPSIS +.B lua +[ +.I options +] +[ +.I script +[ +.I args +] +] +.SH DESCRIPTION +.B lua +is the stand-alone 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 +The given +.I options +(see below) +are executed and then +the Lua program in file +.I script +is loaded and executed. +The given +.I args +are available to +.I script +as strings in a global table named +.BR arg . +If these arguments contain spaces or other characters special to the shell, +then they should be quoted +(but note that the quotes will be removed by the shell). +The arguments in +.B arg +start at 0, +which contains the string +.RI ' script '. +The index of the last argument is stored in +.BR arg.n . +The arguments given in the command line before +.IR script , +including the name of the interpreter, +are available in negative indices in +.BR arg . +.LP +At the very start, +before even handling the command line, +.B lua +executes the contents of the environment variable +.BR LUA_INIT , +if it is defined. +If the value of +.B LUA_INIT +is of the form +.RI '@ filename ', +then +.I filename +is executed. +Otherwise, the string is assumed to be a Lua statement and is executed. +.LP +Options start with +.B '\-' +and are described below. +You can use +.B "'\--'" +to signal the end of options. +.LP +If no arguments are given, +then +.B "\-v \-i" +is assumed when the standard input is a terminal; +otherwise, +.B "\-" +is assumed. +.LP +In interactive mode, +.B lua +prompts the user, +reads lines from the standard input, +and executes them as they are read. +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. +So, one way to interrupt the reading of an incomplete statement is +to force a syntax error: +adding a +.B ';' +in the middle of a statement is a sure way of forcing a syntax error +(except inside multiline strings and comments; these must be closed explicitly). +If a line starts with +.BR '=' , +then +.B lua +displays the values of all the expressions in the remainder of the +line. The expressions must be separated by commas. +The primary prompt is the value of the global variable +.BR _PROMPT , +if this value is a string; +otherwise, the default prompt is used. +Similarly, the secondary prompt is the value of the global variable +.BR _PROMPT2 . +So, +to change the prompts, +set the corresponding variable to a string of your choice. +You can do that after calling the interpreter +or on the command line +(but in this case you have to be careful with quotes +if the prompt string contains a space; otherwise you may confuse the shell.) +The default prompts are "> " and ">> ". +.SH OPTIONS +.TP +.B \- +load and execute the standard input as a file, +that is, +not interactively, +even when the standard input is a terminal. +.TP +.BI \-e " stat" +execute statement +.IR stat . +You need to quote +.I stat +if it contains spaces, quotes, +or other characters special to the shell. +.TP +.B \-i +enter interactive mode after +.I script +is executed. +.TP +.BI \-l " name" +call +.BI require(' name ') +before executing +.IR script . +Typically used to load libraries. +.TP +.B \-v +show version information. +.SH "SEE ALSO" +.BR luac (1) +.br +http://www.lua.org/ +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH AUTHORS +R. Ierusalimschy, +L. H. de Figueiredo, +and +W. Celes +.\" EOF diff --git a/ext/lua-5.1.5/doc/lua.css b/ext/lua-5.1.5/doc/lua.css new file mode 100644 index 000000000..7fafbb1bb --- /dev/null +++ b/ext/lua-5.1.5/doc/lua.css @@ -0,0 +1,83 @@ +body { + color: #000000 ; + background-color: #FFFFFF ; + font-family: Helvetica, Arial, sans-serif ; + text-align: justify ; + margin-right: 30px ; + margin-left: 30px ; +} + +h1, h2, h3, h4 { + font-family: Verdana, Geneva, sans-serif ; + font-weight: normal ; + font-style: italic ; +} + +h2 { + padding-top: 0.4em ; + padding-bottom: 0.4em ; + padding-left: 30px ; + padding-right: 30px ; + margin-left: -30px ; + background-color: #E0E0FF ; +} + +h3 { + padding-left: 0.5em ; + border-left: solid #E0E0FF 1em ; +} + +table h3 { + padding-left: 0px ; + border-left: none ; +} + +a:link { + color: #000080 ; + background-color: inherit ; + text-decoration: none ; +} + +a:visited { + background-color: inherit ; + text-decoration: none ; +} + +a:link:hover, a:visited:hover { + color: #000080 ; + background-color: #E0E0FF ; +} + +a:link:active, a:visited:active { + color: #FF0000 ; +} + +hr { + border: 0 ; + height: 1px ; + color: #a0a0a0 ; + background-color: #a0a0a0 ; +} + +:target { + background-color: #F8F8F8 ; + padding: 8px ; + border: solid #a0a0a0 2px ; +} + +.footer { + color: gray ; + font-size: small ; +} + +input[type=text] { + border: solid #a0a0a0 2px ; + border-radius: 2em ; + -moz-border-radius: 2em ; + background-image: url('images/search.png') ; + background-repeat: no-repeat; + background-position: 4px center ; + padding-left: 20px ; + height: 2em ; +} + diff --git a/ext/lua-5.1.5/doc/lua.html b/ext/lua-5.1.5/doc/lua.html new file mode 100644 index 000000000..1d435ab02 --- /dev/null +++ b/ext/lua-5.1.5/doc/lua.html @@ -0,0 +1,172 @@ + + + +LUA man page + + + + + +

NAME

+lua - Lua interpreter +

SYNOPSIS

+lua +[ +options +] +[ +script +[ +args +] +] +

DESCRIPTION

+lua +is the stand-alone Lua interpreter. +It loads and executes Lua programs, +either in textual source form or +in precompiled binary form. +(Precompiled binaries are output by +luac, +the Lua compiler.) +lua +can be used as a batch interpreter and also interactively. +

+The given +options +(see below) +are executed and then +the Lua program in file +script +is loaded and executed. +The given +args +are available to +script +as strings in a global table named +arg. +If these arguments contain spaces or other characters special to the shell, +then they should be quoted +(but note that the quotes will be removed by the shell). +The arguments in +arg +start at 0, +which contains the string +'script'. +The index of the last argument is stored in +arg.n. +The arguments given in the command line before +script, +including the name of the interpreter, +are available in negative indices in +arg. +

+At the very start, +before even handling the command line, +lua +executes the contents of the environment variable +LUA_INIT, +if it is defined. +If the value of +LUA_INIT +is of the form +'@filename', +then +filename +is executed. +Otherwise, the string is assumed to be a Lua statement and is executed. +

+Options start with +'-' +and are described below. +You can use +'--' +to signal the end of options. +

+If no arguments are given, +then +"-v -i" +is assumed when the standard input is a terminal; +otherwise, +"-" +is assumed. +

+In interactive mode, +lua +prompts the user, +reads lines from the standard input, +and executes them as they are read. +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. +So, one way to interrupt the reading of an incomplete statement is +to force a syntax error: +adding a +';' +in the middle of a statement is a sure way of forcing a syntax error +(except inside multiline strings and comments; these must be closed explicitly). +If a line starts with +'=', +then +lua +displays the values of all the expressions in the remainder of the +line. The expressions must be separated by commas. +The primary prompt is the value of the global variable +_PROMPT, +if this value is a string; +otherwise, the default prompt is used. +Similarly, the secondary prompt is the value of the global variable +_PROMPT2. +So, +to change the prompts, +set the corresponding variable to a string of your choice. +You can do that after calling the interpreter +or on the command line +(but in this case you have to be careful with quotes +if the prompt string contains a space; otherwise you may confuse the shell.) +The default prompts are "> " and ">> ". +

OPTIONS

+

+- +load and execute the standard input as a file, +that is, +not interactively, +even when the standard input is a terminal. +

+-e stat +execute statement +stat. +You need to quote +stat +if it contains spaces, quotes, +or other characters special to the shell. +

+-i +enter interactive mode after +script +is executed. +

+-l name +call +require('name') +before executing +script. +Typically used to load libraries. +

+-v +show version information. +

SEE ALSO

+luac(1) +
+http://www.lua.org/ +

DIAGNOSTICS

+Error messages should be self explanatory. +

AUTHORS

+R. Ierusalimschy, +L. H. de Figueiredo, +and +W. Celes + + + diff --git a/ext/lua-5.1.5/doc/luac.1 b/ext/lua-5.1.5/doc/luac.1 new file mode 100644 index 000000000..d8146782d --- /dev/null +++ b/ext/lua-5.1.5/doc/luac.1 @@ -0,0 +1,136 @@ +.\" $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $ +.TH LUAC 1 "$Date: 2006/01/06 16:03:34 $" +.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 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. +.LP +Pre-compiling 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. +.LP +Pre-compiled chunks are not necessarily smaller than the corresponding source. +The main goal in pre-compiling is faster loading. +.LP +The binary files created by +.B luac +are portable only among architectures with the same word size and byte order. +.LP +.B luac +produces a single output file containing the bytecodes +for all source files given. +By default, +the output file is named +.BR luac.out , +but you can change this with the +.B \-o +option. +.LP +In the command line, +you can mix +text files containing Lua source and +binary files containing precompiled chunks. +This is useful to combine several precompiled chunks, +even from different (but compatible) platforms, +into a single precompiled chunk. +.LP +You can use +.B "'\-'" +to indicate the standard input as a source file +and +.B "'\--'" +to signal the end of options +(that is, +all remaining arguments will be treated as files even if they start with +.BR "'\-'" ). +.LP +The internal format of the binary files produced by +.B luac +is likely to change when a new version of Lua is released. +So, +save the source files of all Lua programs that you precompile. +.LP +.SH OPTIONS +Options must be separate. +.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. +.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 a source file 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. +Lua always performs a thorough integrity test on precompiled chunks. +Bytecode that passes this test is completely safe, +in the sense that it will not break the interpreter. +However, +there is no guarantee that such code does anything sensible. +(None can be given, because the halting problem is unsolvable.) +If no files are given, then +.B luac +loads +.B luac.out +and tests its contents. +No messages are displayed if the file passes the integrity test. +.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. +For instance, +line numbers and names of local variables are lost. +.TP +.B \-v +show version information. +.SH FILES +.TP 15 +.B luac.out +default output file +.SH "SEE ALSO" +.BR lua (1) +.br +http://www.lua.org/ +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH AUTHORS +L. H. de Figueiredo, +R. Ierusalimschy and +W. Celes +.\" EOF diff --git a/ext/lua-5.1.5/doc/luac.html b/ext/lua-5.1.5/doc/luac.html new file mode 100644 index 000000000..179ffe828 --- /dev/null +++ b/ext/lua-5.1.5/doc/luac.html @@ -0,0 +1,145 @@ + + + +LUAC man page + + + + + +

NAME

+luac - Lua compiler +

SYNOPSIS

+luac +[ +options +] [ +filenames +] +

DESCRIPTION

+luac +is the Lua compiler. +It translates programs written in the Lua programming language +into binary files that can be later loaded and executed. +

+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. +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. +

+The binary files created by +luac +are portable only among architectures with the same word size and byte order. +

+luac +produces a single output file containing the bytecodes +for all source files given. +By default, +the output file is named +luac.out, +but you can change this with the +-o +option. +

+In the command line, +you can mix +text files containing Lua source and +binary files containing precompiled chunks. +This is useful because several precompiled chunks, +even from different (but compatible) platforms, +can be combined into a single precompiled chunk. +

+You can use +'-' +to indicate the standard input as a source file +and +'--' +to signal the end of options +(that is, +all remaining arguments will be treated as files even if they start with +'-'). +

+The internal format of the binary files produced by +luac +is likely to change when a new version of Lua is released. +So, +save the source files of all Lua programs that you precompile. +

+

OPTIONS

+Options must be separate. +

+-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 +luac +loads +luac.out +and lists its contents. +

+-o file +output to +file, +instead of the default +luac.out. +(You can use +'-' +for standard output, +but not on platforms that open standard output in text mode.) +The output file may be a source file because +all files are loaded before the output file is written. +Be careful not to overwrite precious files. +

+-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. +Lua always performs a thorough integrity test on precompiled chunks. +Bytecode that passes this test is completely safe, +in the sense that it will not break the interpreter. +However, +there is no guarantee that such code does anything sensible. +(None can be given, because the halting problem is unsolvable.) +If no files are given, then +luac +loads +luac.out +and tests its contents. +No messages are displayed if the file passes the integrity test. +

+-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. +For instance, +line numbers and names of local variables are lost. +

+-v +show version information. +

FILES

+

+luac.out +default output file +

SEE ALSO

+lua(1) +
+http://www.lua.org/ +

DIAGNOSTICS

+Error messages should be self explanatory. +

AUTHORS

+L. H. de Figueiredo, +R. Ierusalimschy and +W. Celes + + + diff --git a/ext/lua-5.1.5/doc/manual.css b/ext/lua-5.1.5/doc/manual.css new file mode 100644 index 000000000..b49b36293 --- /dev/null +++ b/ext/lua-5.1.5/doc/manual.css @@ -0,0 +1,24 @@ +h3 code { + font-family: inherit ; + font-size: inherit ; +} + +pre, code { + font-size: 12pt ; +} + +span.apii { + float: right ; + font-family: inherit ; + font-style: normal ; + font-size: small ; + color: gray ; +} + +p+h1, ul+h1 { + padding-top: 0.4em ; + padding-bottom: 0.4em ; + padding-left: 30px ; + margin-left: -30px ; + background-color: #E0E0FF ; +} diff --git a/ext/lua-5.1.5/doc/manual.html b/ext/lua-5.1.5/doc/manual.html new file mode 100644 index 000000000..4e41683d0 --- /dev/null +++ b/ext/lua-5.1.5/doc/manual.html @@ -0,0 +1,8804 @@ + + + + +Lua 5.1 Reference Manual + + + + + + + +
+

+ +Lua 5.1 Reference Manual +

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

+ +Copyright © 2006–2012 Lua.org, PUC-Rio. +Freely available under the terms of the +Lua license. + +


+

+ +contents +· +index +· +other versions + + +

+ + + + + + +

1 - Introduction

+ +

+Lua is an extension programming language designed to support +general procedural programming with data description +facilities. +It also offers good support for object-oriented programming, +functional programming, and data-driven programming. +Lua is intended to be used as a powerful, light-weight +scripting language for any program that needs one. +Lua is implemented as a library, written in clean C +(that is, in the common subset of ANSI C and C++). + + +

+Being an extension language, Lua has no notion of a "main" program: +it only works embedded in a host client, +called the embedding program or simply the host. +This 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. +The Lua distribution includes a sample host program called lua, +which uses the Lua library to offer a complete, stand-alone Lua interpreter. + + +

+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 (Second Edition). + + + +

2 - 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. + + +

+The 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 §8 +at the end of this manual. + + + +

2.1 - Lexical Conventions

+ +

+Names +(also called identifiers) +in Lua can be any string of letters, +digits, and underscores, +not beginning with a digit. +This coincides with the definition of names in most languages. +(The definition of letter depends on the current locale: +any character considered alphabetic by the current locale +can be used in an identifier.) +Identifiers are used to name variables and table fields. + + +

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

+     and       break     do        else      elseif
+     end       false     for       function  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, names starting with an underscore followed by +uppercase letters (such as _VERSION) +are reserved for internal global variables used by Lua. + + +

+The following strings denote other tokens: + +

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

+Literal strings +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]). +Moreover, a backslash followed by a real newline +results in a newline in the string. +A character in a string can also be specified by its numerical value +using the escape sequence \ddd, +where ddd is a sequence of up to three decimal digits. +(Note that if a numerical escape is to be followed by a digit, +it must be expressed using exactly three digits.) +Strings in Lua can contain any 8-bit value, including embedded zeros, +which can be specified as '\0'. + + +

+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 string starts with an opening long bracket of any level and +ends at the first closing long 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. +They can contain anything except a closing bracket of the proper level. + + +

+For convenience, +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"]==]
+
+ +

+A numerical constant can be written with an optional decimal part +and an optional decimal exponent. +Lua also accepts integer hexadecimal constants, +by prefixing them with 0x. +Examples of valid numerical constants are + +

+     3   3.0   3.1416   314.16e-2   0.31416E1   0xff   0x56
+
+ +

+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. +Long comments are frequently used to disable code temporarily. + + + + + +

2.2 - 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. +Nil is the type of the value nil, +whose main property is to be different from any other value; +it usually represents the absence of a useful value. +Boolean is the type of the values false and true. +Both nil and false make a condition false; +any other value makes it true. +Number represents real (double-precision floating-point) numbers. +(It is easy to build Lua interpreters that use other +internal representations for numbers, +such as single-precision float or long integers; +see file luaconf.h.) +String represents arrays of characters. + +Lua is 8-bit clean: +strings can contain any 8-bit character, +including embedded zeros ('\0') (see §2.1). + + +

+Lua can call (and manipulate) functions written in Lua and +functions written in C +(see §2.5.8). + + +

+The type userdata is provided to allow arbitrary C data to +be stored in Lua variables. +This type corresponds to a block of raw memory +and has no pre-defined operations in Lua, +except assignment and identity test. +However, by using metatables, +the programmer can define operations for userdata values +(see §2.8). +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. + + +

+The type thread represents independent threads of execution +and it is used to implement coroutines (see §2.11). +Do not confuse Lua threads with operating-system threads. +Lua supports coroutines on all systems, +even those that do not support threads. + + +

+The type table implements associative arrays, +that is, arrays that can be indexed not only with numbers, +but with any value (except nil). +Tables can be heterogeneous; +that is, they can contain values of all types (except nil). +Tables are the sole data structuring mechanism in Lua; +they can be used to represent ordinary arrays, +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 §2.5.7). + + +

+Like indices, +the value of a table field can be of any type (except nil). +In particular, +because functions are first-class values, +table fields can contain functions. +Thus tables can also carry methods (see §2.5.9). + + +

+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. + + + +

2.2.1 - Coercion

+ +

+Lua provides automatic conversion between +string and number values at run time. +Any arithmetic operation applied to a string tries to convert +this string to a number, following the usual conversion rules. +Conversely, whenever a number is used where a string is expected, +the number is converted to a string, in a reasonable format. +For complete control over how numbers are converted to strings, +use the format function from the string library +(see string.format). + + + + + + + +

2.3 - 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, as defined in §2.1. + + +

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

+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 global variables +and table fields can be changed via metatables. +An access to an indexed variable t[i] is equivalent to +a call gettable_event(t,i). +(See §2.8 for a complete description of the +gettable_event function. +This function is not defined or callable in Lua. +We use it here only for explanatory purposes.) + + +

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

+	var ::= prefixexp `.´ Name
+
+ +

+All global variables live as fields in ordinary Lua tables, +called environment tables or simply +environments (see §2.9). +Each function has its own reference to an environment, +so that all global variables in this function +will refer to this environment table. +When a function is created, +it inherits the environment from the function that created it. +To get the environment table of a Lua function, +you call getfenv. +To replace it, +you call setfenv. +(You can only manipulate the environment of C functions +through the debug library; (see §5.9).) + + +

+An access to a global variable x +is equivalent to _env.x, +which in turn is equivalent to + +

+     gettable_event(_env, "x")
+

+where _env is the environment of the running function. +(See §2.8 for a complete description of the +gettable_event function. +This function is not defined or callable in Lua. +Similarly, the _env variable is not defined in Lua. +We use them here only for explanatory purposes.) + + + + + +

2.4 - Statements

+ +

+Lua supports an almost conventional set of statements, +similar to those in Pascal or C. +This set includes +assignments, control structures, function calls, +and variable declarations. + + + +

2.4.1 - Chunks

+ +

+The unit of execution of Lua is called a chunk. +A chunk is simply a sequence of statements, +which are executed sequentially. +Each statement can be optionally followed by a semicolon: + +

+	chunk ::= {stat [`;´]}
+

+There are no empty statements and thus ';;' is not legal. + + +

+Lua handles a chunk as the body of an anonymous function +with a variable number of arguments +(see §2.5.9). +As such, chunks can define local variables, +receive arguments, and return values. + + +

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

+Chunks can also be pre-compiled into binary form; +see program luac for details. +Programs in source and compiled forms are interchangeable; +Lua automatically detects the file type and acts accordingly. + + + + + + +

2.4.2 - Blocks

+A block is a list of statements; +syntactically, a block is the same as a chunk: + +

+	block ::= chunk
+
+ +

+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 or break statement in the middle +of another block (see §2.4.4). + + + + + +

2.4.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 §2.5. + + +

+Before the assignment, +the list of values is adjusted to the length of +the list of variables. +If there are more values than needed, +the excess values are thrown away. +If there are fewer values than needed, +the list is extended with as many nil's as needed. +If the list of expressions ends with a function call, +then all values returned by that call enter the list of values, +before the adjustment +(except when the call is enclosed in parentheses; see §2.5). + + +

+The assignment statement first evaluates all its expressions +and only then are the assignments performed. +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. + + +

+The meaning of assignments to global variables +and table fields can be changed via metatables. +An assignment to an indexed variable t[i] = val is equivalent to +settable_event(t,i,val). +(See §2.8 for a complete description of the +settable_event function. +This function is not defined or callable in Lua. +We use it here only for explanatory purposes.) + + +

+An assignment to a global variable x = val +is equivalent to the assignment +_env.x = val, +which in turn is equivalent to + +

+     settable_event(_env, "x", val)
+

+where _env is the environment of the running function. +(The _env variable is not defined in Lua. +We use it here only for explanatory purposes.) + + + + + +

2.4.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 §2.4.5). + + +

+The condition expression of a +control structure can return any value. +Both false and nil are considered false. +All values different from nil and false are considered true +(in particular, the number 0 and the empty string are also true). + + +

+In the repeatuntil 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 return statement is used to return values +from a function or a chunk (which is just a function). + +Functions and chunks can return more than one value, +and so the syntax for the return statement is + +

+	stat ::= return [explist]
+
+ +

+The break statement is used to terminate 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 and break +statements can only be written as the last statement of a block. +If it is really necessary to return or break in the +middle of a block, +then an explicit inner block can be used, +as in the idioms +do return end and do break end, +because now return and break are the last statements in +their (inner) blocks. + + + + + +

2.4.5 - For Statement

+ +

+ +The for statement has two forms: +one numeric and one generic. + + +

+The numeric for loop repeats a block of code while a +control variable runs through an arithmetic progression. +It has the following syntax: + +

+	stat ::= for Name `=´ exp `,´ exp [`,´ exp] do block end
+

+The block is repeated for name starting at the value of +the first exp, until it passes the second exp by steps of the +third exp. +More precisely, a for statement like + +

+     for v = e1, e2, e3 do block end
+

+is equivalent to the code: + +

+     do
+       local var, limit, step = tonumber(e1), tonumber(e2), tonumber(e3)
+       if not (var and limit and step) then error() end
+       while (step > 0 and var <= limit) or (step <= 0 and var >= limit) do
+         local v = var
+         block
+         var = var + step
+       end
+     end
+

+Note the following: + +

    + +
  • +All three control expressions are evaluated only once, +before the loop starts. +They must all result in numbers. +
  • + +
  • +var, limit, and step are invisible variables. +The names shown here are for explanatory purposes only. +
  • + +
  • +If the third expression (the step) is absent, +then a step of 1 is used. +
  • + +
  • +You can use break to exit a for loop. +
  • + +
  • +The loop variable v is local to the loop; +you cannot use its value after the for ends or is broken. +If you need this value, +assign it to another variable before breaking or exiting the 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 block end
+

+is equivalent to the code: + +

+     do
+       local f, s, var = explist
+       while true do
+         local var_1, ···, var_n = f(s, var)
+         var = var_1
+         if var == nil then break end
+         block
+       end
+     end
+

+Note the following: + +

    + +
  • +explist is evaluated only once. +Its results are an iterator function, +a state, +and an initial value for the first iterator variable. +
  • + +
  • +f, s, and var are invisible variables. +The names are here for explanatory purposes only. +
  • + +
  • +You can use break to exit a for loop. +
  • + +
  • +The loop variables var_i are local to the loop; +you cannot use their values after the for ends. +If you need these values, +then assign them to other variables before breaking or exiting the loop. +
  • + +
+ + + + +

2.4.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 §2.5.8. + + + + + +

2.4.7 - Local Declarations

+Local variables can be declared anywhere inside a block. +The declaration can include an initial assignment: + +

+	stat ::= local namelist [`=´ explist]
+

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

+A chunk is also a block (see §2.4.1), +and so local variables can be declared in a chunk outside any explicit block. +The scope of such local variables extends until the end of the chunk. + + +

+The visibility rules for local variables are explained in §2.6. + + + + + + + +

2.5 - Expressions

+ +

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

+	exp ::= prefixexp
+	exp ::= nil | false | true
+	exp ::= Number
+	exp ::= String
+	exp ::= function
+	exp ::= tableconstructor
+	exp ::= `...´
+	exp ::= exp binop exp
+	exp ::= unop exp
+	prefixexp ::= var | functioncall | `(´ exp `)´
+
+ +

+Numbers and literal strings are explained in §2.1; +variables are explained in §2.3; +function definitions are explained in §2.5.9; +function calls are explained in §2.5.8; +table constructors are explained in §2.5.7. +Vararg expressions, +denoted by three dots ('...'), can only be used when +directly inside a vararg function; +they are explained in §2.5.9. + + +

+Binary operators comprise arithmetic operators (see §2.5.1), +relational operators (see §2.5.2), logical operators (see §2.5.3), +and the concatenation operator (see §2.5.4). +Unary operators comprise the unary minus (see §2.5.1), +the unary not (see §2.5.3), +and the unary length operator (see §2.5.5). + + +

+Both function calls and vararg expressions can result in multiple values. +If an expression is used as a statement +(only possible for function calls (see §2.4.6)), +then its return list is adjusted to zero elements, +thus discarding all returned values. +If an expression is used as the last (or the only) element +of a list of expressions, +then no adjustment is made +(unless the call is enclosed in parentheses). +In all other contexts, +Lua adjusts the result list to one element, +discarding all values except the first one. + + +

+Here are some examples: + +

+     f()                -- adjusted to 0 results
+     g(f(), x)          -- f() is adjusted to 1 result
+     g(x, f())          -- g gets x plus all results from f()
+     a,b,c = f(), x     -- f() is adjusted to 1 result (c gets nil)
+     a,b = ...          -- a gets the first vararg parameter, b gets
+                        -- the second (both a and b can get nil if there
+                        -- is no corresponding vararg parameter)
+     
+     a,b,c = x, f()     -- f() is adjusted to 2 results
+     a,b,c = f()        -- f() is adjusted to 3 results
+     return f()         -- returns all results from f()
+     return ...         -- returns all received vararg parameters
+     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 parameters
+     {f(), nil}         -- f() is adjusted to 1 result
+
+ +

+Any expression enclosed in parentheses always results in only one value. +Thus, +(f(x,y,z)) is always a single value, +even if f returns several values. +(The value of (f(x,y,z)) is the first value returned by f +or nil if f does not return any values.) + + + +

2.5.1 - Arithmetic Operators

+Lua supports the usual arithmetic operators: +the binary + (addition), +- (subtraction), * (multiplication), +/ (division), % (modulo), and ^ (exponentiation); +and unary - (negation). +If the operands are numbers, or strings that can be converted to +numbers (see §2.2.1), +then all operations have the usual meaning. +Exponentiation works for any exponent. +For instance, x^(-0.5) computes the inverse of the square root of x. +Modulo is defined as + +

+     a % b == a - math.floor(a/b)*b
+

+That is, it is the remainder of a division that rounds +the quotient towards minus infinity. + + + + + +

2.5.2 - Relational Operators

+The relational operators in Lua are + +

+     ==    ~=    <     >     <=    >=
+

+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. +Numbers and strings are compared in the usual way. +Objects (tables, userdata, threads, and functions) +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, userdata, thread, or function), +this new object is different from any previously existing object. + + +

+You can change the way that Lua compares tables and userdata +by using the "eq" metamethod (see §2.8). + + +

+The conversion rules of §2.2.1 +do not apply to equality comparisons. +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 as such. +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.8). +A comparison a > b is translated to b < a +and a >= b is translated to b <= a. + + + + + +

2.5.3 - Logical Operators

+The logical operators in Lua are +and, or, and not. +Like the control structures (see §2.4.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-cut 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
+

+(In this manual, +--> indicates the result of the preceding expression.) + + + + + +

2.5.4 - Concatenation

+The string concatenation operator in Lua is +denoted by two dots ('..'). +If both operands are strings or numbers, then they are converted to +strings according to the rules mentioned in §2.2.1. +Otherwise, the "concat" metamethod is called (see §2.8). + + + + + +

2.5.5 - The Length Operator

+ +

+The length operator is denoted by the unary 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 of a table t is defined to be any +integer index n +such that t[n] is not nil and t[n+1] is nil; +moreover, if t[1] is nil, n can be zero. +For a regular array, with non-nil values from 1 to a given n, +its length is exactly that n, +the index of its last value. +If the array has "holes" +(that is, nil values between other non-nil values), +then #t can be any of the indices that +directly precedes a nil value +(that is, it may consider any such nil value as the end of +the array). + + + + + +

2.5.6 - Precedence

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

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

+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. + + + + + +

2.5.7 - 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. +Finally, fields of the form exp are equivalent to +[i] = exp, where i are consecutive numerical 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
+
+ +

+If the last field in the list has the form exp +and the expression is a function call or a vararg expression, +then all values returned by this expression enter the list consecutively +(see §2.5.8). +To avoid this, +enclose the function call or the vararg expression +in parentheses (see §2.5). + + +

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

2.5.8 - 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, the prefixexp "call" metamethod is called, +having as first parameter the value of prefixexp, +followed by the original call arguments +(see §2.8). + + +

+The form + +

+	functioncall ::= prefixexp `:´ Name args
+

+can be used to call "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 ::= String
+

+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. + + +

+As an exception to the free-format syntax of Lua, +you cannot put a line break before the '(' in a function call. +This restriction avoids some ambiguities in the language. +If you write + +

+     a = f
+     (g).x(a)
+

+Lua would see that as a single statement, a = f(g).x(a). +So, if you want two statements, you must add a semi-colon between them. +If you actually want to call f, +you must remove the line break before (g). + + +

+A call of the form return functioncall 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; +this syntax makes the calling function return exactly +the returns of the called function. +So, none of the following examples are tail calls: + +

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

2.5.9 - Function Definitions

+ +

+The syntax for function definition is + +

+	function ::= 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 pre-compiles a chunk, +all its function bodies are pre-compiled too. +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. +Different instances of the same function +can refer to different external local variables +and can have different environment tables. + + +

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

+	parlist ::= namelist [`,´ `...´] | `...´
+

+When a function is called, +the list of arguments is adjusted to +the length of the list of parameters, +unless the function is a variadic or vararg function, +which is +indicated by three dots ('...') at the end of its parameter list. +A vararg 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. +If a vararg expression is used inside another expression +or in the middle of a list of expressions, +then its return list is adjusted to one element. +If the expression is used as the last element of a list of expressions, +then no adjustment is made +(unless that last expression is enclosed in parentheses). + + +

+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 §2.4.4). +If control reaches the end of a function +without encountering a return statement, +then the function returns with no results. + + +

+The colon syntax +is used for defining methods, +that is, functions that have an implicit extra parameter self. +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
+
+ + + + + + +

2.6 - Visibility Rules

+ +

+ +Lua is a lexically scoped language. +The scope of variables begins at the first statement after +their declaration and lasts until the end of the innermost block that +includes the declaration. +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, +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. + + + + + +

2.7 - Error Handling

+ +

+Because Lua is an embedded extension language, +all Lua actions start from C code in the host program +calling a function from the Lua library (see lua_pcall). +Whenever an error occurs during Lua compilation or execution, +control returns to C, +which can take appropriate measures +(such as printing an error message). + + +

+Lua code can explicitly generate an error by calling the +error function. +If you need to catch errors in Lua, +you can use the pcall function. + + + + + +

2.8 - Metatables

+ +

+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 special operations. +You can change several aspects of the behavior +of operations over 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" in its metatable. +If it finds one, +Lua calls this function to perform the addition. + + +

+We call the keys in a metatable events +and the values metamethods. +In the previous example, the event is "add" +and the metamethod is the function that performs the addition. + + +

+You can query the metatable of any value +through the getmetatable function. + + +

+You can replace the metatable of tables +through the setmetatable +function. +You cannot change the metatable of other types from Lua +(except by using the debug library); +you must use the C API for that. + + +

+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. + + +

+A metatable controls how an object behaves in arithmetic operations, +order comparisons, concatenation, length operation, and indexing. +A metatable also can define a function to be called when a userdata +is garbage collected. +For each of these operations Lua associates a specific key +called an event. +When Lua performs one of these operations over a value, +it checks whether this value has a metatable with the corresponding event. +If so, the value associated with that key (the metamethod) +controls how Lua will perform the operation. + + +

+Metatables control the operations listed next. +Each operation is identified by its corresponding name. +The key for each operation is a string with its name prefixed by +two underscores, '__'; +for instance, the key for operation "add" is the +string "__add". +The semantics of these operations is better explained by a Lua function +describing how the interpreter executes the operation. + + +

+The code shown here in Lua is only illustrative; +the real behavior is hard coded in the interpreter +and it is much more efficient than this simulation. +All functions used in these descriptions +(rawget, tonumber, etc.) +are described in §5.1. +In particular, to retrieve the metamethod of a given object, +we use the expression + +

+     metatable(obj)[event]
+

+This should be read as + +

+     rawget(getmetatable(obj) or {}, event)
+

+ +That is, the access to a metamethod does not invoke other metamethods, +and the access to objects with no metatables does not fail +(it simply results in nil). + + + +

    + +
  • "add": +the + operation. + + + +

    +The function getbinhandler below defines how Lua chooses a handler +for a binary operation. +First, Lua tries the first operand. +If its type does not define a handler for the operation, +then Lua tries the second operand. + +

    +     function getbinhandler (op1, op2, event)
    +       return metatable(op1)[event] or metatable(op2)[event]
    +     end
    +

    +By using this function, +the behavior of the op1 + op2 is + +

    +     function add_event (op1, op2)
    +       local o1, o2 = tonumber(op1), tonumber(op2)
    +       if o1 and o2 then  -- both operands are numeric?
    +         return o1 + o2   -- '+' here is the primitive 'add'
    +       else  -- at least one of the operands is not numeric
    +         local h = getbinhandler(op1, op2, "__add")
    +         if h then
    +           -- call the handler with both operands
    +           return (h(op1, op2))
    +         else  -- no handler available: default behavior
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
  • "sub": +the - operation. + +Behavior similar to the "add" operation. +
  • + +
  • "mul": +the * operation. + +Behavior similar to the "add" operation. +
  • + +
  • "div": +the / operation. + +Behavior similar to the "add" operation. +
  • + +
  • "mod": +the % operation. + +Behavior similar to the "add" operation, +with the operation +o1 - floor(o1/o2)*o2 as the primitive operation. +
  • + +
  • "pow": +the ^ (exponentiation) operation. + +Behavior similar to the "add" operation, +with the function pow (from the C math library) +as the primitive operation. +
  • + +
  • "unm": +the unary - operation. + + +
    +     function unm_event (op)
    +       local o = tonumber(op)
    +       if o then  -- operand is numeric?
    +         return -o  -- '-' here is the primitive 'unm'
    +       else  -- the operand is not numeric.
    +         -- Try to get a handler from the operand
    +         local h = metatable(op).__unm
    +         if h then
    +           -- call the handler with the operand
    +           return (h(op))
    +         else  -- no handler available: default behavior
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
  • "concat": +the .. (concatenation) operation. + + +
    +     function concat_event (op1, op2)
    +       if (type(op1) == "string" or type(op1) == "number") and
    +          (type(op2) == "string" or type(op2) == "number") then
    +         return op1 .. op2  -- primitive string concatenation
    +       else
    +         local h = getbinhandler(op1, op2, "__concat")
    +         if h then
    +           return (h(op1, op2))
    +         else
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
  • "len": +the # operation. + + +
    +     function len_event (op)
    +       if type(op) == "string" then
    +         return strlen(op)         -- primitive string length
    +       elseif type(op) == "table" then
    +         return #op                -- primitive table length
    +       else
    +         local h = metatable(op).__len
    +         if h then
    +           -- call the handler with the operand
    +           return (h(op))
    +         else  -- no handler available: default behavior
    +           error(···)
    +         end
    +       end
    +     end
    +

    +See §2.5.5 for a description of the length of a table. +

  • + +
  • "eq": +the == operation. + +The function getcomphandler defines how Lua chooses a metamethod +for comparison operators. +A metamethod only is selected when both objects +being compared have the same type +and the same metamethod for the selected operation. + +
    +     function getcomphandler (op1, op2, event)
    +       if type(op1) ~= type(op2) then return nil end
    +       local mm1 = metatable(op1)[event]
    +       local mm2 = metatable(op2)[event]
    +       if mm1 == mm2 then return mm1 else return nil end
    +     end
    +

    +The "eq" event is defined as follows: + +

    +     function eq_event (op1, op2)
    +       if type(op1) ~= type(op2) then  -- different types?
    +         return false   -- different objects
    +       end
    +       if op1 == op2 then   -- primitive equal?
    +         return true   -- objects are equal
    +       end
    +       -- try metamethod
    +       local h = getcomphandler(op1, op2, "__eq")
    +       if h then
    +         return (h(op1, op2))
    +       else
    +         return false
    +       end
    +     end
    +

    +a ~= b is equivalent to not (a == b). +

  • + +
  • "lt": +the < operation. + + +
    +     function lt_event (op1, op2)
    +       if type(op1) == "number" and type(op2) == "number" then
    +         return op1 < op2   -- numeric comparison
    +       elseif type(op1) == "string" and type(op2) == "string" then
    +         return op1 < op2   -- lexicographic comparison
    +       else
    +         local h = getcomphandler(op1, op2, "__lt")
    +         if h then
    +           return (h(op1, op2))
    +         else
    +           error(···)
    +         end
    +       end
    +     end
    +

    +a > b is equivalent to b < a. +

  • + +
  • "le": +the <= operation. + + +
    +     function le_event (op1, op2)
    +       if type(op1) == "number" and type(op2) == "number" then
    +         return op1 <= op2   -- numeric comparison
    +       elseif type(op1) == "string" and type(op2) == "string" then
    +         return op1 <= op2   -- lexicographic comparison
    +       else
    +         local h = getcomphandler(op1, op2, "__le")
    +         if h then
    +           return (h(op1, op2))
    +         else
    +           h = getcomphandler(op1, op2, "__lt")
    +           if h then
    +             return not h(op2, op1)
    +           else
    +             error(···)
    +           end
    +         end
    +       end
    +     end
    +

    +a >= b is equivalent to b <= a. +Note that, in the absence of a "le" metamethod, +Lua tries the "lt", assuming that a <= b is +equivalent to not (b < a). +

  • + +
  • "index": +The indexing access table[key]. + + +
    +     function gettable_event (table, key)
    +       local h
    +       if type(table) == "table" then
    +         local v = rawget(table, key)
    +         if v ~= nil then return v end
    +         h = metatable(table).__index
    +         if h == nil then return nil end
    +       else
    +         h = metatable(table).__index
    +         if h == nil then
    +           error(···)
    +         end
    +       end
    +       if type(h) == "function" then
    +         return (h(table, key))     -- call the handler
    +       else return h[key]           -- or repeat operation on it
    +       end
    +     end
    +

    +

  • + +
  • "newindex": +The indexing assignment table[key] = value. + + +
    +     function settable_event (table, key, value)
    +       local h
    +       if type(table) == "table" then
    +         local v = rawget(table, key)
    +         if v ~= nil then rawset(table, key, value); return end
    +         h = metatable(table).__newindex
    +         if h == nil then rawset(table, key, value); return end
    +       else
    +         h = metatable(table).__newindex
    +         if h == nil then
    +           error(···)
    +         end
    +       end
    +       if type(h) == "function" then
    +         h(table, key,value)           -- call the handler
    +       else h[key] = value             -- or repeat operation on it
    +       end
    +     end
    +

    +

  • + +
  • "call": +called when Lua calls a value. + + +
    +     function function_event (func, ...)
    +       if type(func) == "function" then
    +         return func(...)   -- primitive call
    +       else
    +         local h = metatable(func).__call
    +         if h then
    +           return h(func, ...)
    +         else
    +           error(···)
    +         end
    +       end
    +     end
    +

    +

  • + +
+ + + + +

2.9 - Environments

+ +

+Besides metatables, +objects of types thread, function, and userdata +have another table associated with them, +called their environment. +Like metatables, environments are regular tables and +multiple objects can share the same environment. + + +

+Threads are created sharing the environment of the creating thread. +Userdata and C functions are created sharing the environment +of the creating C function. +Non-nested Lua functions +(created by loadfile, loadstring or load) +are created sharing the environment of the creating thread. +Nested Lua functions are created sharing the environment of +the creating Lua function. + + +

+Environments associated with userdata have no meaning for Lua. +It is only a convenience feature for programmers to associate a table to +a userdata. + + +

+Environments associated with threads are called +global environments. +They are used as the default environment for threads and +non-nested Lua functions created by the thread +and can be directly accessed by C code (see §3.3). + + +

+The environment associated with a C function can be directly +accessed by C code (see §3.3). +It is used as the default environment for other C functions +and userdata created by the function. + + +

+Environments associated with Lua functions are used to resolve +all accesses to global variables within the function (see §2.3). +They are used as the default environment for nested Lua functions +created by the function. + + +

+You can change the environment of a Lua function or the +running thread by calling setfenv. +You can get the environment of a Lua function or the running thread +by calling getfenv. +To manipulate the environment of other objects +(userdata, C functions, other threads) you must +use the C API. + + + + + +

2.10 - Garbage Collection

+ +

+Lua performs automatic memory management. +This means that +you have to worry neither about allocating memory for new objects +nor about freeing it when the objects are no longer needed. +Lua manages memory automatically by running +a garbage collector from time to time +to collect all dead objects +(that is, objects that are no longer accessible from Lua). +All memory used by Lua is subject to automatic management: +tables, userdata, functions, threads, strings, etc. + + +

+Lua implements an incremental mark-and-sweep collector. +It uses two numbers to control its garbage-collection cycles: +the garbage-collector pause and +the garbage-collector step multiplier. +Both use percentage points as units +(so that a value of 100 means an internal value of 1). + + +

+The garbage-collector pause +controls how long the collector waits before starting a new cycle. +Larger values make the collector less aggressive. +Values smaller 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 step multiplier +controls the relative speed of the collector relative to +memory allocation. +Larger values make the collector more aggressive but also increase +the size of each incremental step. +Values smaller than 100 make the collector too slow and +can result in the collector never finishing a cycle. +The default, 200, means that the collector runs at "twice" +the speed of memory allocation. + + +

+You can change these numbers by calling lua_gc in C +or collectgarbage in Lua. +With these functions you can also control +the collector directly (e.g., stop and restart it). + + + +

2.10.1 - Garbage-Collection Metamethods

+ +

+Using the C API, +you can set garbage-collector metamethods for userdata (see §2.8). +These metamethods are also called finalizers. +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). + + +

+Garbage userdata with a field __gc in their metatables are not +collected immediately by the garbage collector. +Instead, Lua puts them in a list. +After the collection, +Lua does the equivalent of the following function +for each userdata in that list: + +

+     function gc_event (udata)
+       local h = metatable(udata).__gc
+       if h then
+         h(udata)
+       end
+     end
+
+ +

+At the end of each garbage-collection cycle, +the finalizers for userdata are called in reverse +order of their creation, +among those collected in that cycle. +That is, the first finalizer to be called is the one associated +with the userdata created last in the program. +The userdata itself is freed only in the next garbage-collection cycle. + + + + + +

2.10.2 - 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 this object. + + +

+A weak table can have weak keys, weak values, or both. +A table with weak keys allows the collection of its keys, +but prevents the collection of its values. +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. +If the __mode field is a string containing the character 'k', +the keys in the table are weak. +If __mode contains 'v', +the values in the table are weak. + + +

+After you use a table as a metatable, +you should not change the value of its __mode field. +Otherwise, the weak behavior of the tables controlled by this +metatable is undefined. + + + + + + + +

2.11 - 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 with a call to 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 execution. + + +

+When you first call coroutine.resume, +passing as its first argument +a thread returned by coroutine.create, +the coroutine starts its execution, +at the first line of its main function. +Extra arguments passed to coroutine.resume are passed on +to the coroutine main 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 the first case, coroutine.resume returns true, +plus any values returned by the coroutine main function. +In case of errors, coroutine.resume returns false +plus an error message. + + +

+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, +coroutine.wrap does not catch errors; +any error is propagated to the caller. + + +

+As an example, +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
+
+ + + + +

3 - 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. +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 a proper definition for the macro luai_apicheck, +in file luaconf.h. + + + +

3.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.). + + +

+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 pushes 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); +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. +We say that an index is valid +if it lies between 1 and the stack top +(that is, if 1 ≤ abs(index) ≤ top). + + + + + + +

3.2 - Stack Size

+ +

+When you interact with Lua API, +you are responsible for ensuring consistency. +In particular, +you are responsible for controlling stack overflow. +You can use the function lua_checkstack +to grow the stack size. + + +

+Whenever Lua calls C, +it ensures that at least LUA_MINSTACK stack positions are available. +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. + + +

+Most query functions accept as indices any value inside the +available stack space, that is, indices up to the maximum stack size +you have set through lua_checkstack. +Such indices are called acceptable indices. +More formally, we define an acceptable index +as follows: + +

+     (index < 0 && abs(index) <= top) ||
+     (index > 0 && index <= stackspace)
+

+Note that 0 is never an acceptable index. + + + + + +

3.3 - Pseudo-Indices

+ +

+Unless otherwise noted, +any function that accepts valid indices can also be called with +pseudo-indices, +which represent some Lua values that are accessible to C code +but which are not in the stack. +Pseudo-indices are used to access the thread environment, +the function environment, +the registry, +and the upvalues of a C function (see §3.4). + + +

+The thread environment (where global variables live) is +always at pseudo-index LUA_GLOBALSINDEX. +The environment of the running C function is always +at pseudo-index LUA_ENVIRONINDEX. + + +

+To access and change the value of global variables, +you can use regular table operations over an environment table. +For instance, to access the value of a global variable, do + +

+     lua_getfield(L, LUA_GLOBALSINDEX, varname);
+
+ + + + +

3.4 - C Closures

+ +

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

+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 value associated with a function is at position +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), +produces an acceptable (but invalid) index. + + + + + +

3.5 - Registry

+ +

+Lua provides a registry, +a pre-defined table that can be used by any C code to +store whatever Lua value it needs to store. +This table is always located at pseudo-index +LUA_REGISTRYINDEX. +Any C library can store data into this table, +but it should take care to choose keys 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. + + +

+The integer keys in the registry are used by the reference mechanism, +implemented by the auxiliary library, +and therefore should not be used for other purposes. + + + + + +

3.6 - Error Handling in C

+ +

+Internally, Lua uses the C longjmp facility to handle errors. +(You can also choose to use exceptions if you use C++; +see file luaconf.h.) +When Lua faces any error +(such as memory allocation errors, type errors, syntax errors, +and runtime errors) +it raises an error; +that is, it does a long jump. +A protected environment uses setjmp +to set a recover point; +any error jumps to the most recent active recover point. + + +

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

+Inside a C function you can throw an error by calling lua_error. + + + + + +

3.7 - 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 +(e.g., they may depend on what is on the stack). +The third field, x, +tells whether the function may throw errors: +'-' means the function never throws any error; +'m' means the function may throw an error +only due to not enough memory; +'e' means the function may throw other kinds of errors; +'v' means the function may throw an error on purpose. + + + +


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; +nsize, the new size of the block. +ptr is NULL if and only if osize is zero. +When nsize is zero, the allocator must return NULL; +if osize is not zero, +it should free the block pointed to by ptr. +When nsize is not zero, the allocator returns NULL +if and only if it cannot fill the request. +When nsize is not zero and osize is zero, +the allocator should behave like malloc. +When nsize and osize are not zero, +the allocator behaves like realloc. +Lua assumes that the allocator never fails when +osize >= nsize. + + +

+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);
+     }
+

+This code assumes +that free(NULL) has no effect and that +realloc(NULL, size) is equivalent to malloc(size). +ANSI C ensures both behaviors. + + + + + +


lua_atpanic

+[-0, +0, -] +

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

+Sets a new panic function and returns the old one. + + +

+If an error happens outside any protected environment, +Lua calls a panic function +and then calls exit(EXIT_FAILURE), +thus exiting the host application. +Your panic function can avoid this exit by +never returning (e.g., doing a long jump). + + +

+The panic function can access the error message at the top of the stack. + + + + + +


lua_call

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

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

+Calls a function. + + +

+To call a function you must use the following protocol: +first, the function to be called is pushed onto the stack; +then, the arguments to the function 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. +All arguments and the function value are popped from the stack +when the function is called. +The function results are pushed onto the stack when the function returns. +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. +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 inside the called 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_getfield(L, LUA_GLOBALSINDEX, "f"); /* function to be called */
+     lua_pushstring(L, "how");                        /* 1st argument */
+     lua_getfield(L, LUA_GLOBALSINDEX, "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_setfield(L, LUA_GLOBALSINDEX, "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_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 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 numerical arguments and returns their average and sum: + +

+     static int foo (lua_State *L) {
+       int n = lua_gettop(L);    /* number of arguments */
+       lua_Number sum = 0;
+       int i;
+       for (i = 1; i <= n; i++) {
+         if (!lua_isnumber(L, i)) {
+           lua_pushstring(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, m] +

int lua_checkstack (lua_State *L, int extra);
+ +

+Ensures that there are at least extra free stack slots in the stack. +It returns false if it cannot grow the stack to that size. +This function never shrinks the stack; +if the stack is already larger than the new size, +it is left unchanged. + + + + + +


lua_close

+[-0, +0, -] +

void lua_close (lua_State *L);
+ +

+Destroys 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, +such as a daemon or a web server, +might need to release states as soon as they are not needed, +to avoid growing too large. + + + + + +


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 at 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 §2.5.4). + + + + + +


lua_cpcall

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

int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
+ +

+Calls the C function func in protected mode. +func starts with only one element in its stack, +a light userdata containing ud. +In case of errors, +lua_cpcall returns the same error codes as lua_pcall, +plus the error object on the top of the stack; +otherwise, it returns zero, and does not change the stack. +All values returned by func are discarded. + + + + + +


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. +The new table has space pre-allocated +for narr array elements and nrec non-array elements. +This pre-allocation is useful when you know exactly how many elements +the table will have. +Otherwise you can use the function lua_newtable. + + + + + +


lua_dump

+[-0, +0, m] +

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

+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. + + +

+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_equal

+[-0, +0, e] +

int lua_equal (lua_State *L, int index1, int index2);
+ +

+Returns 1 if the two values in acceptable indices index1 and +index2 are equal, +following the semantics of the Lua == operator +(that is, may call metamethods). +Otherwise returns 0. +Also returns 0 if any of the indices is non valid. + + + + + +


lua_error

+[-1, +0, v] +

int lua_error (lua_State *L);
+ +

+Generates a Lua error. +The error message (which can actually be a Lua value of any type) +must be on the stack top. +This function does a long jump, +and therefore never returns. +(see luaL_error). + + + + + +


lua_gc

+[-0, +0, e] +

int lua_gc (lua_State *L, int what, int data);
+ +

+Controls the garbage collector. + + +

+This function performs several tasks, +according to the value of the parameter what: + +

    + +
  • LUA_GCSTOP: +stops the garbage collector. +
  • + +
  • LUA_GCRESTART: +restarts the garbage collector. +
  • + +
  • LUA_GCCOLLECT: +performs a full garbage-collection cycle. +
  • + +
  • 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: +performs an incremental step of garbage collection. +The step "size" is controlled by data +(larger values mean more steps) in a non-specified way. +If you want to control the step size +you must experimentally tune the value of data. +The function returns 1 if the step finished a +garbage-collection cycle. +
  • + +
  • LUA_GCSETPAUSE: +sets data as the new value +for the pause of the collector (see §2.10). +The function returns the previous value of the pause. +
  • + +
  • LUA_GCSETSTEPMUL: +sets data as the new value for the step multiplier of +the collector (see §2.10). +The function returns the previous value of the step multiplier. +
  • + +
+ + + + +

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 passed to lua_newstate. + + + + + +


lua_getfenv

+[-0, +1, -] +

void lua_getfenv (lua_State *L, int index);
+ +

+Pushes onto the stack the environment table of +the value at the given index. + + + + + +


lua_getfield

+[-0, +1, e] +

void 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 valid index. +As in Lua, this function may trigger a metamethod +for the "index" event (see §2.8). + + + + + +


lua_getglobal

+[-0, +1, e] +

void lua_getglobal (lua_State *L, const char *name);
+ +

+Pushes onto the stack the value of the global name. +It is defined as a macro: + +

+     #define lua_getglobal(L,s)  lua_getfield(L, LUA_GLOBALSINDEX, s)
+
+ + + + +

lua_getmetatable

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

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

+Pushes onto the stack the metatable of the value at the given +acceptable index. +If the index is not valid, +or if the value does not have a metatable, +the function returns 0 and pushes nothing on the stack. + + + + + +


lua_gettable

+[-1, +1, e] +

void lua_gettable (lua_State *L, int index);
+ +

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

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


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 +(and so 0 means an empty stack). + + + + + +


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. +Cannot be called with a pseudo-index, +because a pseudo-index is not an actual stack position. + + + + + +


lua_Integer

+
typedef ptrdiff_t lua_Integer;
+ +

+The type used by the Lua API to represent integral values. + + +

+By default it is a ptrdiff_t, +which is usually the largest signed integral type the machine handles +"comfortably". + + + + + +


lua_isboolean

+[-0, +0, -] +

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

+Returns 1 if the value at the given acceptable index has type boolean, +and 0 otherwise. + + + + + +


lua_iscfunction

+[-0, +0, -] +

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

+Returns 1 if the value at the given acceptable 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 acceptable index is a function +(either C or Lua), and 0 otherwise. + + + + + +


lua_islightuserdata

+[-0, +0, -] +

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

+Returns 1 if the value at the given acceptable 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 acceptable index is nil, +and 0 otherwise. + + + + + +


lua_isnone

+[-0, +0, -] +

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

+Returns 1 if the given acceptable index is not valid +(that is, it refers to an element outside the current stack), +and 0 otherwise. + + + + + +


lua_isnoneornil

+[-0, +0, -] +

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

+Returns 1 if the given acceptable index is not valid +(that is, it refers to an element outside the current stack) +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 acceptable 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 acceptable 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 acceptable 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 acceptable 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 acceptable index is a userdata +(either full or light), and 0 otherwise. + + + + + +


lua_lessthan

+[-0, +0, e] +

int lua_lessthan (lua_State *L, int index1, int index2);
+ +

+Returns 1 if the value at acceptable index index1 is smaller +than the value at acceptable index index2, +following the semantics of the Lua < operator +(that is, may call metamethods). +Otherwise returns 0. +Also returns 0 if any of the indices is non valid. + + + + + +


lua_load

+[-0, +1, -] +

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

+Loads a Lua chunk. +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 return values of lua_load are: + +

    + +
  • 0: no errors;
  • + +
  • LUA_ERRSYNTAX: +syntax error during pre-compilation;
  • + +
  • LUA_ERRMEM: +memory allocation error.
  • + +
+ +

+This function only loads a chunk; +it does not run it. + + +

+lua_load automatically detects whether the chunk is text or binary, +and loads it accordingly (see program luac). + + +

+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 §3.8). + + + + + +


lua_newstate

+[-0, +0, -] +

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

+Creates a new, independent state. +Returns NULL if cannot create the state +(due to lack of memory). +The argument f is the allocator function; +Lua does all memory allocation for this state through this function. +The second argument, ud, is an opaque pointer that Lua +simply 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 state returned by this function shares with the original state +all global objects (such as tables), +but has an independent execution stack. + + +

+There is no explicit function to close or to destroy a thread. +Threads are subject to garbage collection, +like any Lua object. + + + + + +


lua_newuserdata

+[-0, +1, m] +

void *lua_newuserdata (lua_State *L, size_t size);
+ +

+This function allocates a new block of memory with the given size, +pushes onto the stack a new full userdata with the block address, +and returns this address. + + +

+Userdata represent C values in Lua. +A full userdata represents a block of memory. +It is an object (like a table): +you must create it, it can have its own metatable, +and you can detect when it is being collected. +A full userdata is only equal to itself (under raw equality). + + +

+When Lua collects a full userdata with a gc metamethod, +Lua calls the metamethod and marks the userdata as finalized. +When this userdata is collected again then +Lua frees its corresponding memory. + + + + + +


lua_next

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

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 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, +do not call lua_tolstring directly on a key, +unless you know that the key is actually a string. +Recall that lua_tolstring changes +the value at the given index; +this confuses the next call to lua_next. + + + + + +


lua_Number

+
typedef double lua_Number;
+ +

+The type of numbers in Lua. +By default, it is double, but that can be changed in luaconf.h. + + +

+Through the configuration file you can change +Lua to operate with another type for numbers (e.g., float or long). + + + + + +


lua_objlen

+[-0, +0, -] +

size_t lua_objlen (lua_State *L, int index);
+ +

+Returns the "length" of the value at the given acceptable index: +for strings, this is the string length; +for tables, this is the result of the length operator ('#'); +for userdata, this is the size of the block of memory allocated +for the userdata; +for other values, it is 0. + + + + + +


lua_pcall

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

int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
+ +

+Calls a function 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 message), +and returns an error code. +Like lua_call, +lua_pcall always removes the function +and its arguments from the stack. + + +

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

+Typically, the error handler function is used to add more debug +information to the error message, 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 0 in case of success +or one of the following error codes +(defined in lua.h): + +

    + +
  • LUA_ERRRUN: +a runtime error. +
  • + +
  • LUA_ERRMEM: +memory allocation error. +For such errors, Lua does not call the error handler function. +
  • + +
  • LUA_ERRERR: +error while running the error handler function. +
  • + +
+ + + + +

lua_pop

+[-n, +0, -] +

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

+Pops n elements from the stack. + + + + + +


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. + + +

+When a C function is created, +it is possible to associate some values with it, +thus creating a C closure (see §3.4); +these values are then accessible to the function whenever it is called. +To associate values with a C function, +first these values should be pushed onto the stack +(when there are multiple values, 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 should be +associated with the function. +lua_pushcclosure also pops these values from the stack. + + +

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


lua_pushcfunction

+[-0, +1, m] +

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

+Pushes a C function 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. + + +

+Any function to be registered in Lua must +follow the correct protocol to receive its parameters +and return its results (see lua_CFunction). + + +

+lua_pushcfunction is defined as a macro: + +

+     #define lua_pushcfunction(L,f)  lua_pushcclosure(L,f,0)
+
+ + + + +

lua_pushfstring

+[-0, +1, m] +

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

+Pushes onto the stack a formatted string +and returns a pointer to this string. +It is similar to the C function sprintf, +but has some important differences: + +

    + +
  • +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). +
  • + +
  • +The conversion specifiers are quite restricted. +There are no flags, widths, or precisions. +The conversion specifiers can only be +'%%' (inserts a '%' in the string), +'%s' (inserts a zero-terminated string, with no size restrictions), +'%f' (inserts a lua_Number), +'%p' (inserts a pointer as a hexadecimal numeral), +'%d' (inserts an int), and +'%c' (inserts an int as a character). +
  • + +
+ + + + +

lua_pushinteger

+[-0, +1, -] +

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

+Pushes a number 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. +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] +

void lua_pushliteral (lua_State *L, const char *s);
+ +

+This macro is equivalent to lua_pushlstring, +but can be used only when s is a literal string. +In these cases, it automatically provides the string length. + + + + + +


lua_pushlstring

+[-0, +1, m] +

void 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 makes (or reuses) 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 embedded zeros. + + + + + +


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 number with value n onto the stack. + + + + + +


lua_pushstring

+[-0, +1, m] +

void lua_pushstring (lua_State *L, const char *s);
+ +

+Pushes the zero-terminated string pointed to by s +onto the stack. +Lua makes (or reuses) an internal copy of the given string, +so the memory at s can be freed or reused immediately after +the function returns. +The string cannot contain embedded zeros; +it is assumed to end at the first zero. + + + + + +


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 valid index +onto the stack. + + + + + +


lua_pushvfstring

+[-0, +1, m] +

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 acceptable indices index1 and +index2 are primitively equal +(that is, without calling metamethods). +Otherwise returns 0. +Also returns 0 if any of the indices are non valid. + + + + + +


lua_rawget

+[-1, +1, -] +

void lua_rawget (lua_State *L, int index);
+ +

+Similar to lua_gettable, but does a raw access +(i.e., without metamethods). + + + + + +


lua_rawgeti

+[-0, +1, -] +

void lua_rawgeti (lua_State *L, int index, int n);
+ +

+Pushes onto the stack the value t[n], +where t is the value at the given valid index. +The access is raw; +that is, it does not invoke metamethods. + + + + + +


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). + + + + + +


lua_rawseti

+[-1, +0, m] +

void lua_rawseti (lua_State *L, int index, int n);
+ +

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

+This function pops the value from the stack. +The assignment is raw; +that is, it does not invoke metamethods. + + + + + +


lua_Reader

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

+The reader function used by lua_load. +Every time it needs another piece of the chunk, +lua_load 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. +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 position (and pops it), +without shifting any element +(therefore replacing the value at the given position). + + + + + +


lua_resume

+[-?, +?, -] +

int lua_resume (lua_State *L, int narg);
+ +

+Starts and resumes a coroutine in a given thread. + + +

+To start a coroutine, you first create a new thread +(see lua_newthread); +then you push onto its stack the main function plus any arguments; +then you call lua_resume, +with narg being the number of arguments. +This call returns when the coroutine suspends or finishes its execution. +When it returns, the stack contains all values passed to lua_yield, +or all values returned by the body function. +lua_resume returns +LUA_YIELD if the coroutine yields, +0 if the coroutine finishes its execution +without errors, +or an error code in case of errors (see lua_pcall). +In case of errors, +the stack is not unwound, +so you can use the debug API over it. +The error message is on the top of the stack. +To restart a coroutine, you put on its stack only the values to +be passed as results from yield, +and then call lua_resume. + + + + + +


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_setfenv

+[-1, +0, -] +

int lua_setfenv (lua_State *L, int index);
+ +

+Pops a table from the stack and sets it as +the new environment for the value at the given index. +If the value at the given index is +neither a function nor a thread nor a userdata, +lua_setfenv returns 0. +Otherwise it returns 1. + + + + + +


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 valid index +and v is the value at 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.8). + + + + + +


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. +It is defined as a macro: + +

+     #define lua_setglobal(L,s)   lua_setfield(L, LUA_GLOBALSINDEX, s)
+
+ + + + +

lua_setmetatable

+[-1, +0, -] +

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

+Pops a table from the stack and +sets it as the new metatable for the value at the given +acceptable index. + + + + + +


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 valid index, +v is the value at 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.8). + + + + + +


lua_settop

+[-?, +?, -] +

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

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


lua_State

+
typedef struct lua_State lua_State;
+ +

+Opaque structure that keeps the whole state of a Lua interpreter. +The Lua library is fully reentrant: +it has no global variables. +All information about a state is kept in this structure. + + +

+A pointer to this state 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 0 for a normal thread, +an error code if the thread finished its execution with an error, +or LUA_YIELD if the thread is suspended. + + + + + +


lua_toboolean

+[-0, +0, -] +

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

+Converts the Lua value at the given acceptable index to a C boolean +value (0 or 1). +Like all tests in Lua, +lua_toboolean returns 1 for any Lua value +different from false and nil; +otherwise it returns 0. +It also returns 0 when called with a non-valid index. +(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 acceptable index to a C function. +That value must be a C function; +otherwise, returns NULL. + + + + + +


lua_tointeger

+[-0, +0, -] +

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

+Converts the Lua value at the given acceptable index +to the signed integral type lua_Integer. +The Lua value must be a number or a string convertible to a number +(see §2.2.1); +otherwise, lua_tointeger returns 0. + + +

+If the number is not an integer, +it is truncated in some non-specified way. + + + + + +


lua_tolstring

+[-0, +0, m] +

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

+Converts the Lua value at the given acceptable index to a C string. +If len is not NULL, +it also 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 fully aligned pointer +to a string inside the Lua state. +This string always has a zero ('\0') +after its last character (as in C), +but can contain other zeros in its body. +Because Lua has garbage collection, +there is no guarantee that the pointer returned by lua_tolstring +will be valid after the corresponding value is removed from the stack. + + + + + +


lua_tonumber

+[-0, +0, -] +

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

+Converts the Lua value at the given acceptable 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 §2.2.1); +otherwise, lua_tonumber returns 0. + + + + + +


lua_topointer

+[-0, +0, -] +

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

+Converts the value at the given acceptable index to a generic +C pointer (void*). +The value can be a userdata, a table, a thread, 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 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 acceptable 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 acceptable index is a full userdata, +returns its block address. +If the value is a light userdata, +returns its 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 acceptable index, +or LUA_TNONE for a non-valid index +(that is, an index to an "empty" stack position). +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_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 it produces another piece of chunk, +lua_dump calls the writer, +passing along the buffer to be written (p), +its size (sz), +and the data 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 global state. + + +

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


lua_yield

+[-?, +?, -] +

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

+Yields a coroutine. + + +

+This function should only be called as the +return expression of a C function, as follows: + +

+     return lua_yield (L, nresults);
+

+When a C function calls lua_yield in that way, +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 are passed as results to lua_resume. + + + + + + + +

3.8 - 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) */
+  int currentline;            /* (l) */
+  int nups;                   /* (u) number of upvalues */
+  int linedefined;            /* (S) */
+  int lastlinedefined;        /* (S) */
+  char short_src[LUA_IDSIZE]; /* (S) */
+  /* private part */
+  other fields
+} lua_Debug;
+ +

+A structure used to carry different pieces of +information about an active function. +lua_getstack fills only the private part +of this structure, for later use. +To fill the other fields of lua_Debug with useful information, +call lua_getinfo. + + +

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

    + +
  • source: +If the function was defined in a string, +then source is that string. +If the function was defined in a file, +then source starts with a '@' followed by the file name. +
  • + +
  • 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, +and "tail" if it was a function that did a tail call. +In the latter case, +Lua has no other information about the function. +
  • + +
  • 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.) +
  • + +
  • nups: +the number of upvalues of the function. +
  • + +
+ + + + +

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);
+ +

+Returns 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 in 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_getfield(L, LUA_GLOBALSINDEX, "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: + +

    + +
  • 'n': fills in the field name and namewhat; +
  • + +
  • 'S': +fills in the fields source, short_src, +linedefined, lastlinedefined, and what; +
  • + +
  • 'l': fills in the field currentline; +
  • + +
  • 'u': fills in the field nups; +
  • + +
  • 'f': +pushes onto the stack the function that is +running at the given level; +
  • + +
  • 'L': +pushes onto the stack a table whose indices are the +numbers of the lines that are valid on the function. +(A valid line is a line with some associated code, +that is, a line where you can put a break point. +Non-valid lines include empty lines and comments.) +
  • + +
+ +

+This function returns 0 on error +(for instance, an invalid option in what). + + + + + +


lua_getlocal

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

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

+Gets information about a local variable of a given activation record. +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 +(1 is the first parameter or active local variable, and so on, +until the last active local variable). +lua_getlocal pushes the variable's value onto the stack +and returns its name. + + +

+Variable names starting with '(' (open parentheses) +represent internal variables +(loop control variables, temporaries, and C function locals). + + +

+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);
+ +

+Get 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. +When there are no errors, lua_getstack returns 1; +when called with a level greater than the stack depth, +it returns 0. + + + + + +


lua_getupvalue

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

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

+Gets information about a closure's upvalue. +(For Lua functions, +upvalues are the external local variables that the function uses, +and that are consequently included in its closure.) +lua_getupvalue gets the index n of an upvalue, +pushes the upvalue's value onto the stack, +and returns its name. +funcindex points to the closure in the stack. +(Upvalues have no particular order, +as they are active through the whole function. +So, they are numbered in an arbitrary order.) + + +

+Returns NULL (and pushes nothing) +when the index is greater than the number of upvalues. +For C functions, this function uses the empty string "" +as a name for all 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_HOOKTAILRET, 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 return events, event can be LUA_HOOKRET, +the normal value, or LUA_HOOKTAILRET. +In the latter case, Lua is simulating a return from +a function that did a tail call; +in this case, it is useless to call lua_getinfo. + + +

+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. + + + + + +


lua_sethook

+[-0, +0, -] +

int 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, +before the function gets its arguments. +
  • + +
  • The return hook: is called when the interpreter returns from a function. +The hook is called just before Lua leaves the function. +You have no access to the values to be returned by 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.) +
  • + +
+ +

+A hook is disabled by setting mask to zero. + + + + + +


lua_setlocal

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

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

+Sets the value of a local variable of a given activation record. +Parameters ar and n are as in lua_getlocal +(see lua_getlocal). +lua_setlocal assigns the value at 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. + + + + + +


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 at the top of the stack +to the upvalue and returns its name. +It also pops the value from the stack. +Parameters funcindex and n are as in the lua_getupvalue +(see lua_getupvalue). + + +

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

4 - 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 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 this API. + + +

+Several functions in the auxiliary library are used to +check C function arguments. +Their names are always luaL_check* or luaL_opt*. +All of these functions throw an error if the check is not satisfied. +Because the error message is formatted for arguments +(e.g., "bad argument #1"), +you should not use these functions for other stack values. + + + +

4.1 - Functions and Types

+ +

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


luaL_addchar

+[-0, +0, m] +

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

+Adds the character c to the buffer B +(see luaL_Buffer). + + + + + +


luaL_addlstring

+[-0, +0, 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 may contain embedded zeros. + + + + + +


luaL_addsize

+[-0, +0, m] +

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

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


luaL_addstring

+[-0, +0, 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). +The string may not contain embedded zeros. + + + + + +


luaL_addvalue

+[-1, +0, m] +

void luaL_addvalue (luaL_Buffer *B);
+ +

+Adds the value at 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 narg,
+                    const char *extramsg);
+ +

+Checks whether cond is true. +If not, raises an error with the following message, +where func is retrieved from the call stack: + +

+     bad argument #<narg> to <func> (<extramsg>)
+
+ + + + +

luaL_argerror

+[-0, +0, v] +

int luaL_argerror (lua_State *L, int narg, const char *extramsg);
+ +

+Raises an error with the following message, +where func is retrieved from the call stack: + +

+     bad argument #<narg> to <func> (<extramsg>)
+
+ +

+This function never returns, +but it is an idiom to use it in C functions +as return luaL_argerror(args). + + + + + +


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 you declare a variable b of type luaL_Buffer.
  • + +
  • Then you initialize it with a call luaL_buffinit(L, &b).
  • + +
  • +Then you add string pieces to the buffer calling any of +the luaL_add* functions. +
  • + +
  • +You finish by calling luaL_pushresult(&b). +This call leaves the final string on the top of the stack. +
  • + +
+ +

+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_buffinit

+[-0, +0, -] +

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

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


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 and passes the object as its only argument. +In this case this function returns 1 and pushes onto the +stack the value returned by the call. +If there is no metatable or no metamethod, +this function returns 0 (without pushing any value on the stack). + + + + + +


luaL_checkany

+[-0, +0, v] +

void luaL_checkany (lua_State *L, int narg);
+ +

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


luaL_checkint

+[-0, +0, v] +

int luaL_checkint (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a number +and returns this number cast to an int. + + + + + +


luaL_checkinteger

+[-0, +0, v] +

lua_Integer luaL_checkinteger (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a number +and returns this number cast to a lua_Integer. + + + + + +


luaL_checklong

+[-0, +0, v] +

long luaL_checklong (lua_State *L, int narg);
+ +

+Checks whether the function argument narg is a number +and returns this number cast to a long. + + + + + +


luaL_checklstring

+[-0, +0, v] +

const char *luaL_checklstring (lua_State *L, int narg, size_t *l);
+ +

+Checks whether the function argument narg is a string +and returns this string; +if l is not NULL fills *l +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 narg);
+ +

+Checks whether the function argument narg is a number +and returns this number. + + + + + +


luaL_checkoption

+[-0, +0, v] +

int luaL_checkoption (lua_State *L,
+                      int narg,
+                      const char *def,
+                      const char *const lst[]);
+ +

+Checks whether the function argument narg 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 narg or if 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. + + + + + +


luaL_checkstring

+[-0, +0, v] +

const char *luaL_checkstring (lua_State *L, int narg);
+ +

+Checks whether the function argument narg 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 narg, int t);
+ +

+Checks whether the function argument narg 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 narg, const char *tname);
+ +

+Checks whether the function argument narg is a userdata +of the type tname (see luaL_newmetatable). + + + + + +


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 if there are no errors +or 1 in case of errors. + + + + + +


luaL_dostring

+[-0, +?, m] +

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 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_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. +If the object does not have a metatable, +or if the metatable does not have this field, +returns 0 and pushes nothing. + + + + + +


luaL_getmetatable

+[-0, +1, -] +

void luaL_getmetatable (lua_State *L, const char *tname);
+ +

+Pushes onto the stack the metatable associated with name tname +in the registry (see luaL_newmetatable). + + + + + +


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 by replacing +any occurrence of the string p +with the string r. +Pushes the resulting string on the stack and returns it. + + + + + +


luaL_loadbuffer

+[-0, +1, m] +

int luaL_loadbuffer (lua_State *L,
+                     const char *buff,
+                     size_t sz,
+                     const char *name);
+ +

+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. + + + + + +


luaL_loadfile

+[-0, +1, m] +

int luaL_loadfile (lua_State *L, const char *filename);
+ +

+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 #. + + +

+This function returns the same results as lua_load, +but it has an extra error code LUA_ERRFILE +if it cannot open/read the file. + + +

+As lua_load, this function only loads the chunk; +it does not run it. + + + + + +


luaL_loadstring

+[-0, +1, m] +

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_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 it to the registry with key tname, +and returns 1. + + +

+In both cases 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 standard C realloc function +and then sets a panic function (see lua_atpanic) that prints +an error message to the standard error output in case of fatal +errors. + + +

+Returns the new state, +or NULL if there is a memory allocation error. + + + + + +


luaL_openlibs

+[-0, +0, m] +

void luaL_openlibs (lua_State *L);
+ +

+Opens all standard Lua libraries into the given state. + + + + + +


luaL_optint

+[-0, +0, v] +

int luaL_optint (lua_State *L, int narg, int d);
+ +

+If the function argument narg is a number, +returns this number cast to an int. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_optinteger

+[-0, +0, v] +

lua_Integer luaL_optinteger (lua_State *L,
+                             int narg,
+                             lua_Integer d);
+ +

+If the function argument narg is a number, +returns this number cast to a lua_Integer. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_optlong

+[-0, +0, v] +

long luaL_optlong (lua_State *L, int narg, long d);
+ +

+If the function argument narg is a number, +returns this number cast to a long. +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 narg,
+                             const char *d,
+                             size_t *l);
+ +

+If the function argument narg 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 the position *l with the results's length. + + + + + +


luaL_optnumber

+[-0, +0, v] +

lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number d);
+ +

+If the function argument narg is a number, +returns this 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 narg,
+                            const char *d);
+ +

+If the function argument narg is a string, +returns this string. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_prepbuffer

+[-0, +0, -] +

char *luaL_prepbuffer (luaL_Buffer *B);
+ +

+Returns an address to a space of size LUAL_BUFFERSIZE +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_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_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 at 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 table t, +luaL_ref ensures the uniqueness of the key it returns. +You can retrieve an object referred by reference r +by calling lua_rawgeti(L, t, r). +Function luaL_unref frees a reference and its associated object. + + +

+If the object at 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_register. +name is the function name and func is a pointer to +the function. +Any array of luaL_Reg must end with an sentinel entry +in which both name and func are NULL. + + + + + +


luaL_register

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

void luaL_register (lua_State *L,
+                    const char *libname,
+                    const luaL_Reg *l);
+ +

+Opens a library. + + +

+When called with libname equal to NULL, +it simply registers all functions in the list l +(see luaL_Reg) into the table on the top of the stack. + + +

+When called with a non-null libname, +luaL_register creates a new table t, +sets it as the value of the global variable libname, +sets it as the value of package.loaded[libname], +and registers on it all functions in the list l. +If there is a table in package.loaded[libname] or in +variable libname, +reuses this table instead of creating a new one. + + +

+In any case the function leaves the table +on the top of the stack. + + + + + +


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_typerror

+[-0, +0, v] +

int luaL_typerror (lua_State *L, int narg, const char *tname);
+ +

+Generates an error with a message like the following: + +

+     location: bad argument narg to 'func' (tname expected, got rt)
+

+where location is produced by luaL_where, +func is the name of the current function, +and rt is the type name of the actual argument. + + + + + +


luaL_unref

+[-0, +0, -] +

void luaL_unref (lua_State *L, int t, int ref);
+ +

+Releases 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. + + + + + + + +

5 - Standard Libraries

+ +

+The standard Lua libraries provide useful functions +that are implemented directly 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 are quite useful or have critical performance requirements that +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. +Currently, Lua has the following standard libraries: + +

    + +
  • basic library, which includes the coroutine sub-library;
  • + +
  • package library;
  • + +
  • string manipulation;
  • + +
  • table manipulation;
  • + +
  • mathematical functions (sin, log, etc.);
  • + +
  • input and output;
  • + +
  • operating system facilities;
  • + +
  • debug facilities.
  • + +

+Except for the basic and 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, +it can open them individually by calling +luaopen_base (for the basic library), +luaopen_package (for the package library), +luaopen_string (for the string 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 +and should not be called directly: +you must call them like any other Lua C function, +e.g., by using lua_call. + + + +

5.1 - Basic Functions

+ +

+The basic library provides some 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])

+Issues an error when +the value of its argument v is false (i.e., nil or false); +otherwise, returns all its arguments. +message is an error message; +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 the garbage collector. +
  • + +
  • "restart": +restarts the garbage collector. +
  • + +
  • "count": +returns the total memory in use by Lua (in Kbytes). +
  • + +
  • "step": +performs a garbage-collection step. +The step "size" is controlled by arg +(larger values mean more steps) in a non-specified way. +If you want to control the step size +you must experimentally tune the value of arg. +Returns true if the step finished a collection cycle. +
  • + +
  • "setpause": +sets arg as the new value for the pause of +the collector (see §2.10). +Returns the previous value for pause. +
  • + +
  • "setstepmul": +sets arg as the new value for the step multiplier of +the collector (see §2.10). +Returns the previous value for step. +
  • + +
+ + + +

+


dofile ([filename])

+Opens the named file and executes its contents as a Lua chunk. +When called without arguments, +dofile executes the contents 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])

+Terminates the last protected function called +and returns message as the error message. +Function error never returns. + + +

+Usually, error adds some information about the error position +at the beginning of the message. +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 (that is, _G._G = _G). +Lua itself does not use this variable; +changing its value does not affect any environment, +nor vice-versa. +(Use setfenv to change environments.) + + + + +

+


getfenv ([f])

+Returns the current environment in use by the function. +f can be a Lua function or a number +that specifies the function at that stack level: +Level 1 is the function calling getfenv. +If the given function is not a Lua function, +or if f is 0, +getfenv returns the global environment. +The default for f is 1. + + + + +

+


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 pairs (1,t[1]), (2,t[2]), ···, +up to the first integer key absent from the table. + + + + +

+


load (func [, chunkname])

+ + +

+Loads a chunk using function func to get its pieces. +Each call to func 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 errors, +returns the compiled chunk as a function; +otherwise, returns nil plus the error message. +The environment of the returned function is the global environment. + + +

+chunkname is used as the chunk name for error messages +and debug information. +When absent, +it defaults to "=(load)". + + + + +

+


loadfile ([filename])

+ + +

+Similar to load, +but gets the chunk from file filename +or from the standard input, +if no file name is given. + + + + +

+


loadstring (string [, chunkname])

+ + +

+Similar to load, +but gets the chunk from the given string. + + +

+To load and run a given string, use the idiom + +

+     assert(loadstring(s))()
+
+ +

+When absent, +chunkname defaults to the given string. + + + + +

+


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. +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 numeric order, +use a numerical for or the ipairs function.) + + +

+The behavior of next is undefined if, +during the traversal, +you assign any value to a non-existent field in the table. +You may however modify existing fields. +In particular, you may clear existing fields. + + + + +

+


pairs (t)

+ + +

+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 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 message. + + + + +

+


print (···)

+Receives any number of arguments, +and prints their values to stdout, +using the tostring function to convert them to strings. +print is not intended for formatted output, +but only as a quick way to show a value, +typically for debugging. +For formatted output, use string.format. + + + + +

+


rawequal (v1, v2)

+Checks whether v1 is equal to v2, +without invoking any metamethod. +Returns a boolean. + + + + +

+


rawget (table, index)

+Gets the real value of table[index], +without invoking any metamethod. +table must be a table; +index may be any value. + + + + +

+


rawset (table, index, value)

+Sets the real value of table[index] to value, +without invoking any metamethod. +table must be a table, +index any value different from nil, +and value any Lua value. + + +

+This function returns table. + + + + +

+


select (index, ···)

+ + +

+If index is a number, +returns all arguments after argument number index. +Otherwise, index must be the string "#", +and select returns the total number of extra arguments it received. + + + + +

+


setfenv (f, table)

+ + +

+Sets the environment to be used by the given function. +f can be a Lua function or a number +that specifies the function at that stack level: +Level 1 is the function calling setfenv. +setfenv returns the given function. + + +

+As a special case, when f is 0 setfenv changes +the environment of the running thread. +In this case, setfenv returns no values. + + + + +

+


setmetatable (table, metatable)

+ + +

+Sets the metatable for the given table. +(You cannot change the metatable of other types from Lua, only from C.) +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. + + + + +

+


tonumber (e [, base])

+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 nil. + + +

+An optional argument specifies the base to interpret the numeral. +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. +In base 10 (the default), the number can have a decimal part, +as well as an optional exponent part (see §2.1). +In other bases, only unsigned integers are accepted. + + + + +

+


tostring (e)

+Receives an argument of any type and +converts it to a string in a reasonable format. +For complete control of how numbers are converted, +use string.format. + + +

+If the metatable of e has a "__tostring" field, +then tostring calls the corresponding value +with e as argument, +and uses the result of the call as its result. + + + + +

+


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". + + + + +

+


unpack (list [, i [, j]])

+Returns the elements from the given table. +This function is equivalent to + +
+     return list[i], list[i+1], ···, list[j]
+

+except that the above code can be written only for a fixed number +of elements. +By default, i is 1 and j is the length of the list, +as defined by the length operator (see §2.5.5). + + + + +

+


_VERSION

+A global variable (not a function) that +holds a string containing the current interpreter version. +The current contents of this variable is "Lua 5.1". + + + + +

+


xpcall (f, err)

+ + +

+This function is similar to pcall, +except that you can set a new error handler. + + +

+xpcall calls function f in protected mode, +using err as the error handler. +Any error inside f is not propagated; +instead, xpcall catches the error, +calls the err function with the original error object, +and returns a status code. +Its first result is the status code (a boolean), +which is true if the call succeeds without errors. +In this case, xpcall also returns all results from the call, +after this first result. +In case of any error, +xpcall returns false plus the result from err. + + + + + + + +

5.2 - Coroutine Manipulation

+ +

+The operations related to coroutines comprise a sub-library of +the basic library and come inside the table coroutine. +See §2.11 for a general description of coroutines. + + +

+


coroutine.create (f)

+ + +

+Creates a new coroutine, with body f. +f must be a Lua function. +Returns this new coroutine, +an object with type "thread". + + + + +

+


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 +(if the coroutine yields) or any values returned by the body function +(if the coroutine terminates). +If there is any error, +resume returns false plus the error message. + + + + +

+


coroutine.running ()

+ + +

+Returns the running coroutine, +or nil when called by the main thread. + + + + +

+


coroutine.status (co)

+ + +

+Returns the status of coroutine co, as a string: +"running", +if the coroutine is running (that is, it 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 Lua function. +Returns a function that resumes the coroutine each time it is called. +Any arguments passed to the function behave as the +extra arguments to resume. +Returns the same values returned by resume, +except the first boolean. +In case of error, propagates the error. + + + + +

+


coroutine.yield (···)

+ + +

+Suspends the execution of the calling coroutine. +The coroutine cannot be running a C function, +a metamethod, or an iterator. +Any arguments to yield are passed as extra results to resume. + + + + + + + +

5.3 - Modules

+ +

+The package library provides basic +facilities for loading and building modules in Lua. +It exports two of its functions directly in the global environment: +require and module. +Everything else is exported in a table package. + + +

+


module (name [, ···])

+ + +

+Creates a module. +If there is a table in package.loaded[name], +this table is the module. +Otherwise, if there is a global table t with the given name, +this table is the module. +Otherwise creates a new table t and +sets it as the value of the global name and +the value of package.loaded[name]. +This function also initializes t._NAME with the given name, +t._M with the module (t itself), +and t._PACKAGE with the package name +(the full module name minus last component; see below). +Finally, module sets t as the new environment +of the current function and the new value of package.loaded[name], +so that require returns t. + + +

+If name is a compound name +(that is, one with components separated by dots), +module creates (or reuses, if they already exist) +tables for each component. +For instance, if name is a.b.c, +then module stores the module table in field c of +field b of global a. + + +

+This function can receive optional options after +the module name, +where each option is a function to be applied over the module. + + + + +

+


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]. +Otherwise, it tries to find a loader for the module. + + +

+To find a loader, +require is guided by the package.loaders array. +By changing this array, +we can change how require looks for a module. +The following explanation is based on the default configuration +for package.loaders. + + +

+First require queries package.preload[modname]. +If it has a value, +this value (which should 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.loaders). + + +

+Once a loader is found, +require calls the loader with a single argument, modname. +If the loader returns any value, +require assigns the returned value to package.loaded[modname]. +If the loader returns no 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]. + + +

+If there is any error loading or running the module, +or if it cannot find any loader for the module, +then require signals an error. + + + + +

+


package.cpath

+ + +

+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 +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. + + + + +

+


package.loaders

+ + +

+A table used by require to control how to load 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 parameter. +The function can return another function (the module loader) +or a string explaining why it did not find that module +(or nil if it has nothing to say). +Lua initializes this table with four 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. +A path is a sequence of templates separated by semicolons. +For each template, +the searcher will change each interrogation +mark in the template by filename, +which is the module name with each dot replaced by a +"directory separator" (such as "/" in Unix); +then it will try to open the resulting file name. +So, for instance, if the Lua path is the string + +

+     "./?.lua;./?.lc;/usr/local/?/init.lua"
+

+the search for a Lua file for module foo +will try to open the files +./foo.lua, ./foo.lc, and +/usr/local/foo/init.lua, in that order. + + +

+The third searcher looks for a loader as a C library, +using the path given by the variable package.cpath. +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 prefix up to (and including) the first hyphen is removed. +For instance, if the module name is a.v1-b.c, +the function name will be luaopen_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. + + + + +

+


package.loadlib (libname, funcname)

+ + +

+Dynamically links the host program with the C library libname. +Inside this library, looks for a function funcname +and returns this function as a C function. +(So, funcname must follow the protocol (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 extension. +funcname must be the exact name exported by the C library +(which may depend on the C compiler and linker used). + + +

+This function is not supported by ANSI 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). + + + + +

+


package.path

+ + +

+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 or +with a default path defined in luaconf.h, +if the environment variable is not defined. +Any ";;" 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). + + + + +

+


package.seeall (module)

+ + +

+Sets a metatable for module with +its __index field referring to the global environment, +so that this module inherits values +from the global environment. +To be used as an option to function module. + + + + + + + +

5.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 numerical 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. + + +

+Note that numerical 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 numerical code equal +to its corresponding argument. + + +

+Note that numerical codes are not necessarily portable across platforms. + + + + +

+


string.dump (function)

+ + +

+Returns a string containing a binary representation of the given function, +so that a later loadstring on this string returns +a copy of the function. +function must be a Lua function without upvalues. + + + + +

+


string.find (s, pattern [, init [, plain]])

+Looks for the first match of +pattern 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 nil. +A third, optional numerical argument init specifies +where to start the search; +its default value is 1 and can be negative. +A value of 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". +Note that if plain is given, then init must be given as well. + + +

+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 printf family of +standard C functions. +The only differences are that the options/modifiers +*, l, L, n, p, +and h are not supported +and that there is an extra option, q. +The q option formats a string in a form suitable to be safely read +back by the Lua interpreter: +the string is written between double quotes, +and all double quotes, newlines, embedded zeros, +and backslashes in the string +are correctly escaped when written. +For instance, the call + +
+     string.format('%q', 'a string with "quotes" and \n new line')
+

+will produce the string: + +

+     "a string with \"quotes\" and \
+      new line"
+
+ +

+The options c, d, E, e, f, +g, G, i, o, u, X, and x all +expect a number as argument, +whereas q and s expect a string. + + +

+This function does not accept string values +containing embedded zeros, +except as arguments to the q option. + + + + +

+


string.gmatch (s, pattern)

+Returns an iterator function that, +each time it is called, +returns the next captures from pattern over string s. +If pattern specifies no captures, +then the whole match is produced in each call. + + +

+As an example, the following loop + +

+     s = "hello world from Lua"
+     for w in string.gmatch(s, "%a+") do
+       print(w)
+     end
+

+will iterate over all the words from string s, +printing one per line. +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 '^' 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 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. + + +

+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 %n, +with n between 1 and 9, +stands for the value of the n-th captured substring (see below). +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 the pattern specifies no captures, +then the whole match is used 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; +if the pattern specifies no captures, +then the whole match is passed as a sole argument. + + +

+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 loadstring(s)()
+         end)
+     --> x="4+5 = 9"
+     
+     local t = {name="lua", version="5.1"}
+     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
+     --> x="lua-5.1.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 +pattern in the string s. +If it finds one, then match returns +the captures from the pattern; +otherwise it returns nil. +If pattern specifies no captures, +then the whole match is returned. +A third, optional numerical argument init specifies +where to start the search; +its default value is 1 and can be negative. + + + + +

+


string.rep (s, n)

+Returns a string that is the concatenation of n copies of +the string s. + + + + +

+


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) returns a suffix of s +with length i. + + + + +

+


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. + + + +

5.4.1 - Patterns

+ + +

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.
  • + +
  • %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.
  • + +
  • %z: represents the character with representation 0.
  • + +
  • %x: (where x is any non-alphanumeric character) +represents the character x. +This is the standard way to escape the magic characters. +Any punctuation character (even the non magic) +can be preceded by a '%' +when used 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 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. + + +

    +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 0 or more repetitions of characters in the class. +These repetition items will always match the longest possible sequence; +
  • + +
  • +a single character class followed by '+', +which matches 1 or more repetitions of characters in the class. +These repetition items will always match the longest possible sequence; +
  • + +
  • +a single character class followed by '-', +which also matches 0 or more repetitions of characters in the class. +Unlike '*', +these repetition items will always match the shortest possible sequence; +
  • + +
  • +a single character class followed by '?', +which matches 0 or 1 occurrence of a character in the class; +
  • + +
  • +%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. +
  • + +
+ + + + +

Pattern:

+A pattern is a sequence of pattern items. +A '^' 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 empty 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. + + +

+A pattern cannot contain embedded zeros. Use %z instead. + + + + + + + + + + + +

5.5 - Table Manipulation

+This library provides generic functions for table manipulation. +It provides all its functions inside the table table. + + +

+Most functions in the table library assume that the table +represents an array or a list. +For these functions, when we talk about the "length" of a table +we mean the result of the length operator. + + +

+


table.concat (table [, sep [, i [, j]]])

+Given an array where all elements are strings or numbers, +returns table[i]..sep..table[i+1] ··· sep..table[j]. +The default value for sep is the empty string, +the default for i is 1, +and the default for j is the length of the table. +If i is greater than j, returns the empty string. + + + + +

+


table.insert (table, [pos,] value)

+ + +

+Inserts element value at position pos in table, +shifting up other elements to open space, if necessary. +The default value for pos is n+1, +where n is the length of the table (see §2.5.5), +so that a call table.insert(t,x) inserts x at the end +of table t. + + + + +

+


table.maxn (table)

+ + +

+Returns the largest positive numerical index of the given table, +or zero if the table has no positive numerical indices. +(To do its job this function does a linear traversal of +the whole table.) + + + + +

+


table.remove (table [, pos])

+ + +

+Removes from table the element at position pos, +shifting down other elements to close the space, if necessary. +Returns the value of the removed element. +The default value for pos is n, +where n is the length of the table, +so that a call table.remove(t) removes the last element +of table t. + + + + +

+


table.sort (table [, comp])

+Sorts table elements in a given order, in-place, +from table[1] to table[n], +where n is the length of the table. +If comp is given, +then it must be a function that receives two table elements, +and returns true +when the first is less than the second +(so that not comp(a[i+1],a[i]) will be true after the sort). +If comp is not given, +then the standard Lua operator < is used instead. + + +

+The sort algorithm is not stable; +that is, elements considered equal by the given order +may have their relative positions changed by the sort. + + + + + + + +

5.6 - Mathematical Functions

+ +

+This library is an interface to the standard C math library. +It provides all its functions inside the table math. + + +

+


math.abs (x)

+ + +

+Returns the absolute value of x. + + + + +

+


math.acos (x)

+ + +

+Returns the arc cosine of x (in radians). + + + + +

+


math.asin (x)

+ + +

+Returns the arc sine of x (in radians). + + + + +

+


math.atan (x)

+ + +

+Returns the arc tangent of x (in radians). + + + + +

+


math.atan2 (y, x)

+ + +

+Returns the arc tangent of y/x (in radians), +but uses the signs of both parameters to find the +quadrant of the result. +(It also handles correctly the case of x being zero.) + + + + +

+


math.ceil (x)

+ + +

+Returns the smallest integer larger than or equal to x. + + + + +

+


math.cos (x)

+ + +

+Returns the cosine of x (assumed to be in radians). + + + + +

+


math.cosh (x)

+ + +

+Returns the hyperbolic cosine of x. + + + + +

+


math.deg (x)

+ + +

+Returns the angle x (given in radians) in degrees. + + + + +

+


math.exp (x)

+ + +

+Returns the value ex. + + + + +

+


math.floor (x)

+ + +

+Returns the largest integer smaller 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. + + + + +

+


math.frexp (x)

+ + +

+Returns m and e such that x = m2e, +e is an integer and the absolute value of m is +in the range [0.5, 1) +(or zero when x is zero). + + + + +

+


math.huge

+ + +

+The value HUGE_VAL, +a value larger than or equal to any other numerical value. + + + + +

+


math.ldexp (m, e)

+ + +

+Returns m2e (e should be an integer). + + + + +

+


math.log (x)

+ + +

+Returns the natural logarithm of x. + + + + +

+


math.log10 (x)

+ + +

+Returns the base-10 logarithm of x. + + + + +

+


math.max (x, ···)

+ + +

+Returns the maximum value among its arguments. + + + + +

+


math.min (x, ···)

+ + +

+Returns the minimum value among its arguments. + + + + +

+


math.modf (x)

+ + +

+Returns two numbers, +the integral part of x and the fractional part of x. + + + + +

+


math.pi

+ + +

+The value of pi. + + + + +

+


math.pow (x, y)

+ + +

+Returns xy. +(You can also use the expression x^y to compute this value.) + + + + +

+


math.rad (x)

+ + +

+Returns the angle x (given in degrees) in radians. + + + + +

+


math.random ([m [, n]])

+ + +

+This function is an interface to the simple +pseudo-random generator function rand provided by ANSI C. +(No guarantees can be given for its statistical properties.) + + +

+When called without arguments, +returns a uniform pseudo-random real number +in the range [0,1). +When called with an integer number m, +math.random returns +a uniform pseudo-random integer in the range [1, m]. +When called with two integer numbers m and n, +math.random returns a uniform pseudo-random +integer in the range [m, n]. + + + + +

+


math.randomseed (x)

+ + +

+Sets x as the "seed" +for the pseudo-random generator: +equal seeds produce equal sequences of numbers. + + + + +

+


math.sin (x)

+ + +

+Returns the sine of x (assumed to be in radians). + + + + +

+


math.sinh (x)

+ + +

+Returns the hyperbolic sine of x. + + + + +

+


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.tanh (x)

+ + +

+Returns the hyperbolic tangent of x. + + + + + + + +

5.7 - Input and Output Facilities

+ +

+The I/O library provides two different styles for file manipulation. +The first one uses implicit file descriptors; +that is, there are operations to set a default input file and a +default output file, +and all input/output operations are over these default files. +The second style uses explicit file descriptors. + + +

+When using implicit file descriptors, +all operations are supplied by table io. +When using explicit file descriptors, +the operation io.open returns a file descriptor +and then all operations are supplied as methods of the file descriptor. + + +

+The table io also provides +three predefined file descriptors 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 nil on failure +(plus an error message as a second result and +a system-dependent error code as a third result) +and some value different from nil on success. + + +

+


io.close ([file])

+ + +

+Equivalent to file:close(). +Without a file, closes the default output file. + + + + +

+


io.flush ()

+ + +

+Equivalent to file:flush over the default output file. + + + + +

+


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 parameters, +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, +each time it is called, +returns a new line from the file. +Therefore, the construction + +

+     for line in io.lines(filename) do body end
+

+will iterate over all lines of the file. +When the iterator function detects the end of file, +it returns nil (to finish the loop) and automatically closes the file. + + +

+The call io.lines() (with no file name) is equivalent +to io.input():lines(); +that is, it iterates over the lines of the default input file. +In this case it does not close the file when the loop ends. + + + + +

+


io.open (filename [, mode])

+ + +

+This function opens a file, +in the mode specified in the string mode. +It returns a new file handle, +or, in case of errors, nil plus an error message. + + +

+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. +This string is exactly what is used in the +standard C function fopen. + + + + +

+


io.output ([file])

+ + +

+Similar to io.input, but operates over the default output file. + + + + +

+


io.popen (prog [, mode])

+ + +

+Starts 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"). + + +

+This function is system dependent and is not available +on all platforms. + + + + +

+


io.read (···)

+ + +

+Equivalent to io.input():read. + + + + +

+


io.tmpfile ()

+ + +

+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 nil 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. + + + + +

+


file:flush ()

+ + +

+Saves any written data to file. + + + + +

+


file:lines ()

+ + +

+Returns an iterator function that, +each time it is called, +returns a new line from the file. +Therefore, the construction + +

+     for line in file:lines() do body end
+

+will iterate over all lines of the file. +(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 nil if it cannot read data with the specified format. +When called without formats, +it uses a default format that reads the entire next line +(see below). + + +

+The available formats are + +

    + +
  • "*n": +reads a number; +this is the only format that returns a number instead of a string. +
  • + +
  • "*a": +reads the whole file, starting at the current position. +On end of file, it returns the empty string. +
  • + +
  • "*l": +reads the next line (skipping the end of line), +returning nil on end of file. +This is the default format. +
  • + +
  • number: +reads a string with up to this number of characters, +returning nil on end of file. +If number is zero, +it reads nothing and returns an empty string, +or nil on end of file. +
  • + +
+ + + +

+


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, function seek returns the final file position, +measured in bytes from the beginning of the file. +If this function fails, it returns nil, +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 an output file. +There are three available modes: + +

    + +
  • "no": +no buffering; the result of any output operation appears immediately. +
  • + +
  • "full": +full buffering; output operation is performed only +when the buffer is full (or when you explicitly flush the file +(see io.flush)). +
  • + +
  • "line": +line buffering; output is buffered until a newline is output +or there is any input from some special files +(such as a terminal device). +
  • + +

+For the last two cases, size +specifies the size of the buffer, in bytes. +The default is an appropriate size. + + + + +

+


file:write (···)

+ + +

+Writes the value of each of its arguments to +the file. +The arguments must be strings or numbers. +To write other values, +use tostring or string.format before write. + + + + + + + +

5.8 - 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. + + + + +

+


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 (four digits), month (1--12), day (1--31), +hour (0--23), min (0--59), sec (0--61), +wday (weekday, Sunday is 1), +yday (day of the year), +and isdst (daylight saving flag, a boolean). + + +

+If format is not "*t", +then date returns the date as a string, +formatted according to the same rules as the C function strftime. + + +

+When called without arguments, +date returns a reasonable date and time representation that depends on +the host system and on the current locale +(that is, os.date() is equivalent to os.date("%c")). + + + + +

+


os.difftime (t2, t1)

+ + +

+Returns the number of seconds from time t1 to time t2. +In POSIX, Windows, and some other systems, +this value is exactly t2-t1. + + + + +

+


os.execute ([command])

+ + +

+This function is equivalent to the C function system. +It passes command to be executed by an operating system shell. +It returns a status code, which is system-dependent. +If command is absent, then it returns nonzero if a shell is available +and zero otherwise. + + + + +

+


os.exit ([code])

+ + +

+Calls the C function exit, +with an optional code, +to terminate the host program. +The default value for code is the success code. + + + + +

+


os.getenv (varname)

+ + +

+Returns the value of the process environment variable varname, +or nil if the variable is not defined. + + + + +

+


os.remove (filename)

+ + +

+Deletes the file or directory with the given name. +Directories must be empty to be removed. +If this function fails, it returns nil, +plus a string describing the error. + + + + +

+


os.rename (oldname, newname)

+ + +

+Renames file or directory named oldname to newname. +If this function fails, it returns nil, +plus a string describing the error. + + + + +

+


os.setlocale (locale [, category])

+ + +

+Sets the current locale of the program. +locale is a 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 nil 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. + + + + +

+


os.time ([table])

+ + +

+Returns the current time when called without arguments, +or a time representing the date and time specified by the given table. +This table must have fields year, month, and day, +and may have fields hour, min, sec, and isdst +(for a description of these fields, see the os.date function). + + +

+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 +date and difftime. + + + + +

+


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. + + +

+On some systems (POSIX), +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. + + + + + + + +

5.9 - The Debug Library

+ +

+This library provides +the functionality of the debug interface to Lua programs. +You should exert care when using this library. +The functions provided here should be used exclusively for debugging +and similar tasks, such as profiling. +Please resist the temptation to use them as a +usual programming tool: +they can be very slow. +Moreover, several of these functions +violate some assumptions about Lua code +(e.g., that variables local to a function +cannot be accessed from outside or +that userdata metatables cannot be changed by Lua code) +and therefore can compromise otherwise secure code. + + +

+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.getfenv (o)

+Returns the environment of object o. + + + + +

+


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). + + + + +

+


debug.getinfo ([thread,] function [, 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 function, +which means the function running at level function of the call stack +of the given thread: +level 0 is the current function (getinfo itself); +level 1 is the function that called getinfo; +and so on. +If function is a number larger than the number of active functions, +then getinfo returns nil. + + +

+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. +If present, +the option 'f' +adds a field named func with the function itself. +If present, +the option 'L' +adds a field named activelines with the table of +valid lines. + + +

+For instance, the expression debug.getinfo(1,"n").name returns +a table with 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,] level, local)

+ + +

+This function returns the name and the value of the local variable +with index local of the function at level level of the stack. +(The first parameter or local variable has index 1, and so on, +until the last active local variable.) +The function returns nil 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 debug.getinfo to check whether the level is valid.) + + +

+Variable names starting with '(' (open parentheses) +represent internal variables +(loop control variables, temporaries, and C function locals). + + + + +

+


debug.getmetatable (object)

+ + +

+Returns the metatable of the given object +or nil if it does not have a metatable. + + + + +

+


debug.getregistry ()

+ + +

+Returns the registry table (see §3.5). + + + + +

+


debug.getupvalue (func, up)

+ + +

+This function returns the name and the value of the upvalue +with index up of the function func. +The function returns nil if there is no upvalue with the given index. + + + + +

+


debug.setfenv (object, table)

+ + +

+Sets the environment of the given object to the given table. +Returns object. + + + + +

+


debug.sethook ([thread,] hook, mask [, count])

+ + +

+Sets the given function as a hook. +The string mask and the number count describe +when the hook will be called. +The string mask may have 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.
  • +

+With a count different from zero, +the hook is called 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", "return" (or "tail return", +when simulating a return from a tail call), +"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), +unless the event is "tail return". +In this case, Lua is only simulating the return, +and a call to getinfo will return invalid data. + + + + +

+


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 nil 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. + + + + +

+


debug.setmetatable (object, table)

+ + +

+Sets the metatable for the given object to the given table +(which can be nil). + + + + +

+


debug.setupvalue (func, up, value)

+ + +

+This function assigns the value value to the upvalue +with index up of the function func. +The function returns nil if there is no upvalue +with the given index. +Otherwise, it returns the name of the upvalue. + + + + +

+


debug.traceback ([thread,] [message [, level]])

+ + +

+Returns a string with a traceback of the call stack. +An 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). + + + + + + + +

6 - Lua Stand-alone

+ +

+Although Lua has been designed as an extension language, +to be embedded in a host C program, +it is also frequently used as a stand-alone language. +An interpreter for Lua as a stand-alone language, +called simply lua, +is provided with the standard distribution. +The stand-alone interpreter includes +all standard libraries, including the debug library. +Its usage is: + +

+     lua [options] [script [args]]
+

+The options are: + +

    +
  • -e stat: executes string stat;
  • +
  • -l mod: "requires" mod;
  • +
  • -i: enters interactive mode after running script;
  • +
  • -v: prints version information;
  • +
  • --: stops handling options;
  • +
  • -: executes stdin as a file and stops handling options.
  • +

+After handling its options, lua runs the given script, +passing to it the given args as string arguments. +When called without arguments, +lua behaves as lua -v -i +when the standard input (stdin) is a terminal, +and as lua - otherwise. + + +

+Before running any argument, +the interpreter checks for an environment variable LUA_INIT. +If its format is @filename, +then lua executes the file. +Otherwise, lua executes the string itself. + + +

+All options are handled in order, except -i. +For instance, an invocation like + +

+     $ lua -e'a=1' -e 'print(a)' script.lua
+

+will first set a to 1, then print the value of a (which is '1'), +and finally run the file script.lua with no arguments. +(Here $ is the shell prompt. Your prompt may be different.) + + +

+Before starting to run the script, +lua collects all arguments in the command line +in a global table called arg. +The script name is stored at 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 the options) +go to negative indices. +For instance, in the call + +

+     $ lua -la b.lua t1 t2
+

+the interpreter first runs the file a.lua, +then creates a table + +

+     arg = { [-2] = "lua", [-1] = "-la",
+             [0] = "b.lua",
+             [1] = "t1", [2] = "t2" }
+

+and finally runs the file b.lua. +The script is called with arg[1], arg[2], ··· +as arguments; +it can also access these arguments with the vararg expression '...'. + + +

+In interactive mode, +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). +Therefore, both prompts can be changed directly on the command line +or in any Lua programs by assigning to _PROMPT. +See the next example: + +

+     $ lua -e"_PROMPT='myprompt> '" -i
+

+(The outer pair of quotes is for the shell, +the inner pair is for Lua.) +Note the use of -i to enter interactive mode; +otherwise, +the program would just end silently +right after the assignment to _PROMPT. + + +

+To allow the use of Lua as a +script interpreter in Unix systems, +the stand-alone interpreter skips +the first line of a 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.) + + + +

7 - Incompatibilities with the Previous Version

+ +

+Here we list the incompatibilities that you may find when moving a program +from Lua 5.0 to Lua 5.1. +You can avoid most of the incompatibilities compiling Lua with +appropriate options (see file luaconf.h). +However, +all these compatibility options will be removed in the next version of Lua. + + + +

7.1 - Changes in the Language

+
    + +
  • +The vararg system changed from the pseudo-argument arg with a +table with the extra arguments to the vararg expression. +(See compile-time option LUA_COMPAT_VARARG in luaconf.h.) +
  • + +
  • +There was a subtle change in the scope of the implicit +variables of the for statement and for the repeat statement. +
  • + +
  • +The long string/long comment syntax ([[string]]) +does not allow nesting. +You can use the new syntax ([=[string]=]) in these cases. +(See compile-time option LUA_COMPAT_LSTR in luaconf.h.) +
  • + +
+ + + + +

7.2 - Changes in the Libraries

+
    + +
  • +Function string.gfind was renamed string.gmatch. +(See compile-time option LUA_COMPAT_GFIND in luaconf.h.) +
  • + +
  • +When string.gsub is called with a function as its +third argument, +whenever this function returns nil or false the +replacement string is the whole match, +instead of the empty string. +
  • + +
  • +Function table.setn was deprecated. +Function table.getn corresponds +to the new length operator (#); +use the operator instead of the function. +(See compile-time option LUA_COMPAT_GETN in luaconf.h.) +
  • + +
  • +Function loadlib was renamed package.loadlib. +(See compile-time option LUA_COMPAT_LOADLIB in luaconf.h.) +
  • + +
  • +Function math.mod was renamed math.fmod. +(See compile-time option LUA_COMPAT_MOD in luaconf.h.) +
  • + +
  • +Functions table.foreach and table.foreachi are deprecated. +You can use a for loop with pairs or ipairs instead. +
  • + +
  • +There were substantial changes in function require due to +the new module system. +However, the new behavior is mostly compatible with the old, +but require gets the path from package.path instead +of from LUA_PATH. +
  • + +
  • +Function collectgarbage has different arguments. +Function gcinfo is deprecated; +use collectgarbage("count") instead. +
  • + +
+ + + + +

7.3 - Changes in the API

+
    + +
  • +The luaopen_* functions (to open libraries) +cannot be called directly, +like a regular C function. +They must be called through Lua, +like a Lua function. +
  • + +
  • +Function lua_open was replaced by lua_newstate to +allow the user to set a memory-allocation function. +You can use luaL_newstate from the standard library to +create a state with a standard allocation function +(based on realloc). +
  • + +
  • +Functions luaL_getn and luaL_setn +(from the auxiliary library) are deprecated. +Use lua_objlen instead of luaL_getn +and nothing instead of luaL_setn. +
  • + +
  • +Function luaL_openlib was replaced by luaL_register. +
  • + +
  • +Function luaL_checkudata now throws an error when the given value +is not a userdata of the expected type. +(In Lua 5.0 it returned NULL.) +
  • + +
+ + + + +

8 - The Complete Syntax of Lua

+ +

+Here is the complete syntax of Lua in extended BNF. +(It does not describe operator precedences.) + + + + +

+
+	chunk ::= {stat [`;´]} [laststat [`;´]]
+
+	block ::= chunk
+
+	stat ::=  varlist `=´ explist | 
+		 functioncall | 
+		 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 namelist [`=´ explist] 
+
+	laststat ::= return [explist] | break
+
+	funcname ::= Name {`.´ Name} [`:´ Name]
+
+	varlist ::= var {`,´ var}
+
+	var ::=  Name | prefixexp `[´ exp `]´ | prefixexp `.´ Name 
+
+	namelist ::= Name {`,´ Name}
+
+	explist ::= {exp `,´} exp
+
+	exp ::=  nil | false | true | Number | String | `...´ | function | 
+		 prefixexp | tableconstructor | exp binop exp | unop exp 
+
+	prefixexp ::= var | functioncall | `(´ exp `)´
+
+	functioncall ::=  prefixexp args | prefixexp `:´ Name args 
+
+	args ::=  `(´ [explist] `)´ | tableconstructor | String 
+
+	function ::= 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 | `#´
+
+
+ +

+ + + + + + + +


+ +Last update: +Mon Feb 13 18:54:19 BRST 2012 + + + + + diff --git a/ext/lua-5.1.5/doc/readme.html b/ext/lua-5.1.5/doc/readme.html new file mode 100644 index 000000000..3ed6a8189 --- /dev/null +++ b/ext/lua-5.1.5/doc/readme.html @@ -0,0 +1,40 @@ + + +Lua documentation + + + + + +
+

+Lua +Documentation +

+ +This is the documentation included in the source distribution of Lua 5.1.5. + + + +Lua's +official web site +contains updated documentation, +especially the +reference manual. +

+ +


+ +Last update: +Fri Feb 3 09:44:42 BRST 2012 + + + + diff --git a/ext/lua-5.1.5/etc/Makefile b/ext/lua-5.1.5/etc/Makefile new file mode 100644 index 000000000..6d00008d9 --- /dev/null +++ b/ext/lua-5.1.5/etc/Makefile @@ -0,0 +1,44 @@ +# makefile for Lua etc + +TOP= .. +LIB= $(TOP)/src +INC= $(TOP)/src +BIN= $(TOP)/src +SRC= $(TOP)/src +TST= $(TOP)/test + +CC= gcc +CFLAGS= -O2 -Wall -I$(INC) $(MYCFLAGS) +MYCFLAGS= +MYLDFLAGS= -Wl,-E +MYLIBS= -lm +#MYLIBS= -lm -Wl,-E -ldl -lreadline -lhistory -lncurses +RM= rm -f + +default: + @echo 'Please choose a target: min noparser one strict clean' + +min: min.c + $(CC) $(CFLAGS) $@.c -L$(LIB) -llua $(MYLIBS) + echo 'print"Hello there!"' | ./a.out + +noparser: noparser.o + $(CC) noparser.o $(SRC)/lua.o -L$(LIB) -llua $(MYLIBS) + $(BIN)/luac $(TST)/hello.lua + -./a.out luac.out + -./a.out -e'a=1' + +one: + $(CC) $(CFLAGS) all.c $(MYLIBS) + ./a.out $(TST)/hello.lua + +strict: + -$(BIN)/lua -e 'print(a);b=2' + -$(BIN)/lua -lstrict -e 'print(a)' + -$(BIN)/lua -e 'function f() b=2 end f()' + -$(BIN)/lua -lstrict -e 'function f() b=2 end f()' + +clean: + $(RM) a.out core core.* *.o luac.out + +.PHONY: default min noparser one strict clean diff --git a/ext/lua-5.1.5/etc/README b/ext/lua-5.1.5/etc/README new file mode 100644 index 000000000..5149fc91d --- /dev/null +++ b/ext/lua-5.1.5/etc/README @@ -0,0 +1,37 @@ +This directory contains some useful files and code. +Unlike the code in ../src, everything here is in the public domain. + +If any of the makes fail, you're probably not using the same libraries +used to build Lua. Set MYLIBS in Makefile accordingly. + +all.c + Full Lua interpreter in a single file. + Do "make one" for a demo. + +lua.hpp + Lua header files for C++ using 'extern "C"'. + +lua.ico + A Lua icon for Windows (and web sites: save as favicon.ico). + Drawn by hand by Markus Gritsch . + +lua.pc + pkg-config data for Lua + +luavs.bat + Script to build Lua under "Visual Studio .NET Command Prompt". + Run it from the toplevel as etc\luavs.bat. + +min.c + A minimal Lua interpreter. + Good for learning and for starting your own. + Do "make min" for a demo. + +noparser.c + Linking with noparser.o avoids loading the parsing modules in lualib.a. + Do "make noparser" for a demo. + +strict.lua + Traps uses of undeclared global variables. + Do "make strict" for a demo. + diff --git a/ext/lua-5.1.5/etc/all.c b/ext/lua-5.1.5/etc/all.c new file mode 100644 index 000000000..dab68fac5 --- /dev/null +++ b/ext/lua-5.1.5/etc/all.c @@ -0,0 +1,38 @@ +/* +* all.c -- Lua core, libraries and interpreter in a single file +*/ + +#define luaall_c + +#include "lapi.c" +#include "lcode.c" +#include "ldebug.c" +#include "ldo.c" +#include "ldump.c" +#include "lfunc.c" +#include "lgc.c" +#include "llex.c" +#include "lmem.c" +#include "lobject.c" +#include "lopcodes.c" +#include "lparser.c" +#include "lstate.c" +#include "lstring.c" +#include "ltable.c" +#include "ltm.c" +#include "lundump.c" +#include "lvm.c" +#include "lzio.c" + +#include "lauxlib.c" +#include "lbaselib.c" +#include "ldblib.c" +#include "liolib.c" +#include "linit.c" +#include "lmathlib.c" +#include "loadlib.c" +#include "loslib.c" +#include "lstrlib.c" +#include "ltablib.c" + +#include "lua.c" diff --git a/lua/lua.hpp b/ext/lua-5.1.5/etc/lua.hpp similarity index 100% rename from lua/lua.hpp rename to ext/lua-5.1.5/etc/lua.hpp diff --git a/ext/lua-5.1.5/etc/lua.ico b/ext/lua-5.1.5/etc/lua.ico new file mode 100644 index 0000000000000000000000000000000000000000..ccbabc4e2004683f29598a991006d7caff6d837d GIT binary patch literal 1078 zcma)5y>7xl4E|D3VJbX9VX7GW1~6FSw!BIQq_T0tNo32b^bxZ4H5fZGR7xh?&v!Y3 zDh3=J`#b+#Yy%W{!g4u>(a#g`Mme7+yefc~5wPOflDr`o81qe{?|t$BfABsDzNw;V z8cH*0{6W<;G9Np#7ik(qoR4aR5-A@{5)}DJ9&}FRBA#X_5+im4-kQSzMF^)-t2(Vi ztw-^|Sn8@O_lM9`oos+0wMZGt&`Bq(aK&XCv1Gfr&Jtd6%lKPdD{s=unqGWyb3%y{X9SS{jB~HMh0oKMISQrDC zJ;K?)>ElnpmN^UNE-rXxtyk{c#rCe~`P=qnFT7 bCxwx*w%~s~=?o*z_6Fk4@7l(poWF`cPpA(! literal 0 HcmV?d00001 diff --git a/ext/lua-5.1.5/etc/lua.pc b/ext/lua-5.1.5/etc/lua.pc new file mode 100644 index 000000000..07e2852b0 --- /dev/null +++ b/ext/lua-5.1.5/etc/lua.pc @@ -0,0 +1,31 @@ +# lua.pc -- pkg-config data for Lua + +# vars from install Makefile + +# grep '^V=' ../Makefile +V= 5.1 +# grep '^R=' ../Makefile +R= 5.1.5 + +# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/' +prefix= /usr/local +INSTALL_BIN= ${prefix}/bin +INSTALL_INC= ${prefix}/include +INSTALL_LIB= ${prefix}/lib +INSTALL_MAN= ${prefix}/man/man1 +INSTALL_LMOD= ${prefix}/share/lua/${V} +INSTALL_CMOD= ${prefix}/lib/lua/${V} + +# canonical vars +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Lua +Description: An Extensible Extension Language +Version: ${R} +Requires: +Libs: -L${libdir} -llua -lm +Cflags: -I${includedir} + +# (end of lua.pc) diff --git a/ext/lua-5.1.5/etc/luavs.bat b/ext/lua-5.1.5/etc/luavs.bat new file mode 100644 index 000000000..08c2beddf --- /dev/null +++ b/ext/lua-5.1.5/etc/luavs.bat @@ -0,0 +1,28 @@ +@rem Script to build Lua under "Visual Studio .NET Command Prompt". +@rem Do not run from this directory; run it from the toplevel: etc\luavs.bat . +@rem It creates lua51.dll, lua51.lib, lua.exe, and luac.exe in src. +@rem (contributed by David Manura and Mike Pall) + +@setlocal +@set MYCOMPILE=cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE +@set MYLINK=link /nologo +@set MYMT=mt /nologo + +cd src +%MYCOMPILE% /DLUA_BUILD_AS_DLL l*.c +del lua.obj luac.obj +%MYLINK% /DLL /out:lua51.dll l*.obj +if exist lua51.dll.manifest^ + %MYMT% -manifest lua51.dll.manifest -outputresource:lua51.dll;2 +%MYCOMPILE% /DLUA_BUILD_AS_DLL lua.c +%MYLINK% /out:lua.exe lua.obj lua51.lib +if exist lua.exe.manifest^ + %MYMT% -manifest lua.exe.manifest -outputresource:lua.exe +%MYCOMPILE% l*.c print.c +del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathlib.obj^ + loslib.obj ltablib.obj lstrlib.obj loadlib.obj +%MYLINK% /out:luac.exe *.obj +if exist luac.exe.manifest^ + %MYMT% -manifest luac.exe.manifest -outputresource:luac.exe +del *.obj *.manifest +cd .. diff --git a/ext/lua-5.1.5/etc/min.c b/ext/lua-5.1.5/etc/min.c new file mode 100644 index 000000000..6a85a4d10 --- /dev/null +++ b/ext/lua-5.1.5/etc/min.c @@ -0,0 +1,39 @@ +/* +* min.c -- a minimal Lua interpreter +* loads stdin only with minimal error handling. +* no interaction, and no standard library, only a "print" function. +*/ + +#include + +#include "lua.h" +#include "lauxlib.h" + +static int print(lua_State *L) +{ + int n=lua_gettop(L); + int i; + for (i=1; i<=n; i++) + { + if (i>1) printf("\t"); + if (lua_isstring(L,i)) + printf("%s",lua_tostring(L,i)); + else if (lua_isnil(L,i)) + printf("%s","nil"); + else if (lua_isboolean(L,i)) + printf("%s",lua_toboolean(L,i) ? "true" : "false"); + else + printf("%s:%p",luaL_typename(L,i),lua_topointer(L,i)); + } + printf("\n"); + return 0; +} + +int main(void) +{ + lua_State *L=lua_open(); + lua_register(L,"print",print); + if (luaL_dofile(L,NULL)!=0) fprintf(stderr,"%s\n",lua_tostring(L,-1)); + lua_close(L); + return 0; +} diff --git a/ext/lua-5.1.5/etc/noparser.c b/ext/lua-5.1.5/etc/noparser.c new file mode 100644 index 000000000..13ba54623 --- /dev/null +++ b/ext/lua-5.1.5/etc/noparser.c @@ -0,0 +1,50 @@ +/* +* The code below can be used to make a Lua core that does not contain the +* parsing modules (lcode, llex, lparser), which represent 35% of the total core. +* You'll only be able to load binary files and strings, precompiled with luac. +* (Of course, you'll have to build luac with the original parsing modules!) +* +* To use this module, simply compile it ("make noparser" does that) and list +* its object file before the Lua libraries. The linker should then not load +* the parsing modules. To try it, do "make luab". +* +* If you also want to avoid the dump module (ldump.o), define NODUMP. +* #define NODUMP +*/ + +#define LUA_CORE + +#include "llex.h" +#include "lparser.h" +#include "lzio.h" + +LUAI_FUNC void luaX_init (lua_State *L) { + UNUSED(L); +} + +LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { + UNUSED(z); + UNUSED(buff); + UNUSED(name); + lua_pushliteral(L,"parser not loaded"); + lua_error(L); + return NULL; +} + +#ifdef NODUMP +#include "lundump.h" + +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip) { + UNUSED(f); + UNUSED(w); + UNUSED(data); + UNUSED(strip); +#if 1 + UNUSED(L); + return 0; +#else + lua_pushliteral(L,"dumper not loaded"); + lua_error(L); +#endif +} +#endif diff --git a/ext/lua-5.1.5/etc/strict.lua b/ext/lua-5.1.5/etc/strict.lua new file mode 100644 index 000000000..604619dd2 --- /dev/null +++ b/ext/lua-5.1.5/etc/strict.lua @@ -0,0 +1,41 @@ +-- +-- strict.lua +-- checks uses of undeclared global variables +-- All global variables must be 'declared' through a regular assignment +-- (even assigning nil will do) in a main chunk before being used +-- anywhere or assigned to inside a function. +-- + +local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget + +local mt = getmetatable(_G) +if mt == nil then + mt = {} + setmetatable(_G, mt) +end + +mt.__declared = {} + +local function what () + local d = getinfo(3, "S") + return d and d.what or "C" +end + +mt.__newindex = function (t, n, v) + if not mt.__declared[n] then + local w = what() + if w ~= "main" and w ~= "C" then + error("assign to undeclared variable '"..n.."'", 2) + end + mt.__declared[n] = true + end + rawset(t, n, v) +end + +mt.__index = function (t, n) + if not mt.__declared[n] and what() ~= "C" then + error("variable '"..n.."' is not declared", 2) + end + return rawget(t, n) +end + diff --git a/ext/lua-5.1.5/src/Makefile b/ext/lua-5.1.5/src/Makefile new file mode 100644 index 000000000..e0d4c9fa6 --- /dev/null +++ b/ext/lua-5.1.5/src/Makefile @@ -0,0 +1,182 @@ +# makefile for building Lua +# see ../INSTALL for installation instructions +# see ../Makefile and luaconf.h for further customization + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= none + +CC= gcc +CFLAGS= -O2 -Wall $(MYCFLAGS) +AR= ar rcu +RANLIB= ranlib +RM= rm -f +LIBS= -lm $(MYLIBS) + +MYCFLAGS= +MYLDFLAGS= +MYLIBS= + +# == END OF USER SETTINGS. NO NEED TO CHANGE ANYTHING BELOW THIS LINE ========= + +PLATS= aix ansi bsd freebsd generic linux macosx mingw posix solaris + +LUA_A= liblua.a +CORE_O= lapi.o lcode.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 ldblib.o liolib.o lmathlib.o loslib.o ltablib.o \ + lstrlib.o loadlib.o linit.o + +LUA_T= lua +LUA_O= lua.o + +LUAC_T= luac +LUAC_O= luac.o print.o + +ALL_O= $(CORE_O) $(LIB_O) $(LUA_O) $(LUAC_O) +ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) +ALL_A= $(LUA_A) + +default: $(PLAT) + +all: $(ALL_T) + +o: $(ALL_O) + +a: $(ALL_A) + +$(LUA_A): $(CORE_O) $(LIB_O) + $(AR) $@ $(CORE_O) $(LIB_O) # DLL needs all object files + $(RANLIB) $@ + +$(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(MYLDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + +$(LUAC_T): $(LUAC_O) $(LUA_A) + $(CC) -o $@ $(MYLDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) + +clean: + $(RM) $(ALL_T) $(ALL_O) + +depend: + @$(CC) $(CFLAGS) -MM l*.c print.c + +echo: + @echo "PLAT = $(PLAT)" + @echo "CC = $(CC)" + @echo "CFLAGS = $(CFLAGS)" + @echo "AR = $(AR)" + @echo "RANLIB = $(RANLIB)" + @echo "RM = $(RM)" + @echo "MYCFLAGS = $(MYCFLAGS)" + @echo "MYLDFLAGS = $(MYLDFLAGS)" + @echo "MYLIBS = $(MYLIBS)" + +# convenience targets for popular platforms + +none: + @echo "Please choose a platform:" + @echo " $(PLATS)" + +aix: + $(MAKE) all CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" MYLDFLAGS="-brtl -bexpall" + +ansi: + $(MAKE) all MYCFLAGS=-DLUA_ANSI + +bsd: + $(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-Wl,-E" + +freebsd: + $(MAKE) all MYCFLAGS="-DLUA_USE_LINUX" MYLIBS="-Wl,-E -lreadline" + +generic: + $(MAKE) all MYCFLAGS= + +linux: + $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-Wl,-E -ldl -lreadline -lhistory -lncurses" + +macosx: + $(MAKE) all MYCFLAGS=-DLUA_USE_LINUX MYLIBS="-lreadline" +# use this on Mac OS X 10.3- +# $(MAKE) all MYCFLAGS=-DLUA_USE_MACOSX + +mingw: + $(MAKE) "LUA_A=lua51.dll" "LUA_T=lua.exe" \ + "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ + "MYCFLAGS=-DLUA_BUILD_AS_DLL" "MYLIBS=" "MYLDFLAGS=-s" lua.exe + $(MAKE) "LUAC_T=luac.exe" luac.exe + +posix: + $(MAKE) all MYCFLAGS=-DLUA_USE_POSIX + +solaris: + $(MAKE) all MYCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" MYLIBS="-ldl" + +# list targets that do not create files (but not all makes understand .PHONY) +.PHONY: all $(PLATS) default o a clean depend echo none + +# DO NOT DELETE + +lapi.o: lapi.c lua.h luaconf.h lapi.h lobject.h llimits.h ldebug.h \ + lstate.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h \ + lundump.h lvm.h +lauxlib.o: lauxlib.c lua.h luaconf.h lauxlib.h +lbaselib.o: lbaselib.c lua.h luaconf.h lauxlib.h lualib.h +lcode.o: lcode.c 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 \ + ltable.h +ldblib.o: ldblib.c lua.h luaconf.h lauxlib.h lualib.h +ldebug.o: ldebug.c lua.h luaconf.h lapi.h lobject.h llimits.h lcode.h \ + llex.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 lvm.h +ldo.o: ldo.c 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 lparser.h lstring.h \ + ltable.h lundump.h lvm.h +ldump.o: ldump.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h \ + lzio.h lmem.h lundump.h +lfunc.o: lfunc.c lua.h luaconf.h lfunc.h lobject.h llimits.h lgc.h lmem.h \ + lstate.h ltm.h lzio.h +lgc.o: lgc.c 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 lua.h luaconf.h lualib.h lauxlib.h +liolib.o: liolib.c lua.h luaconf.h lauxlib.h lualib.h +llex.o: llex.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h ltm.h \ + lzio.h lmem.h llex.h lparser.h lstring.h lgc.h ltable.h +lmathlib.o: lmathlib.c lua.h luaconf.h lauxlib.h lualib.h +lmem.o: lmem.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h ldo.h +loadlib.o: loadlib.c lua.h luaconf.h lauxlib.h lualib.h +lobject.o: lobject.c lua.h luaconf.h ldo.h lobject.h llimits.h lstate.h \ + ltm.h lzio.h lmem.h lstring.h lgc.h lvm.h +lopcodes.o: lopcodes.c lopcodes.h llimits.h lua.h luaconf.h +loslib.o: loslib.c lua.h luaconf.h lauxlib.h lualib.h +lparser.o: lparser.c 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 lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h llex.h lstring.h ltable.h +lstring.o: lstring.c lua.h luaconf.h lmem.h llimits.h lobject.h lstate.h \ + ltm.h lzio.h lstring.h lgc.h +lstrlib.o: lstrlib.c lua.h luaconf.h lauxlib.h lualib.h +ltable.o: ltable.c lua.h luaconf.h ldebug.h lstate.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h ldo.h lgc.h ltable.h +ltablib.o: ltablib.c lua.h luaconf.h lauxlib.h lualib.h +ltm.o: ltm.c lua.h luaconf.h lobject.h llimits.h lstate.h ltm.h lzio.h \ + lmem.h lstring.h lgc.h ltable.h +lua.o: lua.c lua.h luaconf.h lauxlib.h lualib.h +luac.o: luac.c lua.h luaconf.h lauxlib.h ldo.h lobject.h llimits.h \ + lstate.h ltm.h lzio.h lmem.h lfunc.h lopcodes.h lstring.h lgc.h \ + lundump.h +lundump.o: lundump.c 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 +lvm.o: lvm.c 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 +lzio.o: lzio.c lua.h luaconf.h llimits.h lmem.h lstate.h lobject.h ltm.h \ + lzio.h +print.o: print.c ldebug.h lstate.h lua.h luaconf.h lobject.h llimits.h \ + ltm.h lzio.h lmem.h lopcodes.h lundump.h + +# (end of Makefile) diff --git a/ext/lua-5.1.5/src/lapi.c b/ext/lua-5.1.5/src/lapi.c new file mode 100644 index 000000000..5d5145d2e --- /dev/null +++ b/ext/lua-5.1.5/src/lapi.c @@ -0,0 +1,1087 @@ +/* +** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $ +** Lua API +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + +#define lapi_c +#define LUA_CORE + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" + + + +const char lua_ident[] = + "$Lua: " LUA_RELEASE " " LUA_COPYRIGHT " $\n" + "$Authors: " LUA_AUTHORS " $\n" + "$URL: www.lua.org $\n"; + + + +#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) + +#define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject) + +#define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;} + + + +static TValue *index2adr (lua_State *L, int idx) { + if (idx > 0) { + TValue *o = L->base + (idx - 1); + api_check(L, idx <= L->ci->top - L->base); + if (o >= L->top) return cast(TValue *, luaO_nilobject); + else return o; + } + else if (idx > LUA_REGISTRYINDEX) { + api_check(L, idx != 0 && -idx <= L->top - L->base); + return L->top + idx; + } + else switch (idx) { /* pseudo-indices */ + case LUA_REGISTRYINDEX: return registry(L); + case LUA_ENVIRONINDEX: { + Closure *func = curr_func(L); + sethvalue(L, &L->env, func->c.env); + return &L->env; + } + case LUA_GLOBALSINDEX: return gt(L); + default: { + Closure *func = curr_func(L); + idx = LUA_GLOBALSINDEX - idx; + return (idx <= func->c.nupvalues) + ? &func->c.upvalue[idx-1] + : cast(TValue *, luaO_nilobject); + } + } +} + + +static Table *getcurrenv (lua_State *L) { + if (L->ci == L->base_ci) /* no enclosing function? */ + return hvalue(gt(L)); /* use global table as environment */ + else { + Closure *func = curr_func(L); + return func->c.env; + } +} + + +void luaA_pushobject (lua_State *L, const TValue *o) { + setobj2s(L, L->top, o); + api_incr_top(L); +} + + +LUA_API int lua_checkstack (lua_State *L, int size) { + int res = 1; + lua_lock(L); + if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK) + res = 0; /* stack overflow */ + else if (size > 0) { + luaD_checkstack(L, size); + if (L->ci->top < L->top + size) + L->ci->top = L->top + size; + } + lua_unlock(L); + return res; +} + + +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_check(from, G(from) == G(to)); + api_check(from, to->ci->top - to->top >= n); + from->top -= n; + for (i = 0; i < n; i++) { + setobj2s(to, to->top++, from->top + i); + } + lua_unlock(to); +} + + +LUA_API void lua_setlevel (lua_State *from, lua_State *to) { + to->nCcalls = from->nCcalls; +} + + +LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { + lua_CFunction old; + lua_lock(L); + old = G(L)->panic; + G(L)->panic = panicf; + lua_unlock(L); + return old; +} + + +LUA_API lua_State *lua_newthread (lua_State *L) { + lua_State *L1; + lua_lock(L); + luaC_checkGC(L); + L1 = luaE_newthread(L); + setthvalue(L, L->top, L1); + api_incr_top(L); + lua_unlock(L); + luai_userstatethread(L, L1); + return L1; +} + + + +/* +** basic stack manipulation +*/ + + +LUA_API int lua_gettop (lua_State *L) { + return cast_int(L->top - L->base); +} + + +LUA_API void lua_settop (lua_State *L, int idx) { + lua_lock(L); + if (idx >= 0) { + api_check(L, idx <= L->stack_last - L->base); + while (L->top < L->base + idx) + setnilvalue(L->top++); + L->top = L->base + idx; + } + else { + api_check(L, -(idx+1) <= (L->top - L->base)); + L->top += idx+1; /* `subtract' index (index is negative) */ + } + lua_unlock(L); +} + + +LUA_API void lua_remove (lua_State *L, int idx) { + StkId p; + lua_lock(L); + p = index2adr(L, idx); + api_checkvalidindex(L, p); + while (++p < L->top) setobjs2s(L, p-1, p); + L->top--; + lua_unlock(L); +} + + +LUA_API void lua_insert (lua_State *L, int idx) { + StkId p; + StkId q; + lua_lock(L); + p = index2adr(L, idx); + api_checkvalidindex(L, p); + for (q = L->top; q>p; q--) setobjs2s(L, q, q-1); + setobjs2s(L, p, L->top); + lua_unlock(L); +} + + +LUA_API void lua_replace (lua_State *L, int idx) { + StkId o; + lua_lock(L); + /* explicit test for incompatible code */ + if (idx == LUA_ENVIRONINDEX && L->ci == L->base_ci) + luaG_runerror(L, "no calling environment"); + api_checknelems(L, 1); + o = index2adr(L, idx); + api_checkvalidindex(L, o); + if (idx == LUA_ENVIRONINDEX) { + Closure *func = curr_func(L); + api_check(L, ttistable(L->top - 1)); + func->c.env = hvalue(L->top - 1); + luaC_barrier(L, func, L->top - 1); + } + else { + setobj(L, o, L->top - 1); + if (idx < LUA_GLOBALSINDEX) /* function upvalue? */ + luaC_barrier(L, curr_func(L), L->top - 1); + } + L->top--; + lua_unlock(L); +} + + +LUA_API void lua_pushvalue (lua_State *L, int idx) { + lua_lock(L); + setobj2s(L, L->top, index2adr(L, idx)); + api_incr_top(L); + lua_unlock(L); +} + + + +/* +** access functions (stack -> C) +*/ + + +LUA_API int lua_type (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return (o == luaO_nilobject) ? LUA_TNONE : ttype(o); +} + + +LUA_API const char *lua_typename (lua_State *L, int t) { + UNUSED(L); + return (t == LUA_TNONE) ? "no value" : luaT_typenames[t]; +} + + +LUA_API int lua_iscfunction (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return iscfunction(o); +} + + +LUA_API int lua_isnumber (lua_State *L, int idx) { + TValue n; + const TValue *o = index2adr(L, idx); + return tonumber(o, &n); +} + + +LUA_API int lua_isstring (lua_State *L, int idx) { + int t = lua_type(L, idx); + return (t == LUA_TSTRING || t == LUA_TNUMBER); +} + + +LUA_API int lua_isuserdata (lua_State *L, int idx) { + const TValue *o = index2adr(L, idx); + return (ttisuserdata(o) || ttislightuserdata(o)); +} + + +LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { + StkId o1 = index2adr(L, index1); + StkId o2 = index2adr(L, index2); + return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 + : luaO_rawequalObj(o1, o2); +} + + +LUA_API int lua_equal (lua_State *L, int index1, int index2) { + StkId o1, o2; + int i; + lua_lock(L); /* may call tag method */ + o1 = index2adr(L, index1); + o2 = index2adr(L, index2); + i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 : equalobj(L, o1, o2); + lua_unlock(L); + return i; +} + + +LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { + StkId o1, o2; + int i; + lua_lock(L); /* may call tag method */ + o1 = index2adr(L, index1); + o2 = index2adr(L, index2); + i = (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0 + : luaV_lessthan(L, o1, o2); + lua_unlock(L); + return i; +} + + + +LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { + TValue n; + const TValue *o = index2adr(L, idx); + if (tonumber(o, &n)) + return nvalue(o); + else + return 0; +} + + +LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { + TValue n; + const TValue *o = index2adr(L, idx); + if (tonumber(o, &n)) { + lua_Integer res; + lua_Number num = nvalue(o); + lua_number2integer(res, num); + return res; + } + else + return 0; +} + + +LUA_API int lua_toboolean (lua_State *L, int idx) { + const TValue *o = index2adr(L, idx); + return !l_isfalse(o); +} + + +LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { + StkId o = index2adr(L, idx); + if (!ttisstring(o)) { + lua_lock(L); /* `luaV_tostring' may create a new string */ + if (!luaV_tostring(L, o)) { /* conversion failed? */ + if (len != NULL) *len = 0; + lua_unlock(L); + return NULL; + } + luaC_checkGC(L); + o = index2adr(L, idx); /* previous call may reallocate the stack */ + lua_unlock(L); + } + if (len != NULL) *len = tsvalue(o)->len; + return svalue(o); +} + + +LUA_API size_t lua_objlen (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + switch (ttype(o)) { + case LUA_TSTRING: return tsvalue(o)->len; + case LUA_TUSERDATA: return uvalue(o)->len; + case LUA_TTABLE: return luaH_getn(hvalue(o)); + case LUA_TNUMBER: { + size_t l; + lua_lock(L); /* `luaV_tostring' may create a new string */ + l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0); + lua_unlock(L); + return l; + } + default: return 0; + } +} + + +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return (!iscfunction(o)) ? NULL : clvalue(o)->c.f; +} + + +LUA_API void *lua_touserdata (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + switch (ttype(o)) { + case LUA_TUSERDATA: return (rawuvalue(o) + 1); + case LUA_TLIGHTUSERDATA: return pvalue(o); + default: return NULL; + } +} + + +LUA_API lua_State *lua_tothread (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + return (!ttisthread(o)) ? NULL : thvalue(o); +} + + +LUA_API const void *lua_topointer (lua_State *L, int idx) { + StkId o = index2adr(L, idx); + switch (ttype(o)) { + case LUA_TTABLE: return hvalue(o); + case LUA_TFUNCTION: return clvalue(o); + case LUA_TTHREAD: return thvalue(o); + case LUA_TUSERDATA: + case LUA_TLIGHTUSERDATA: + return lua_touserdata(L, idx); + default: return NULL; + } +} + + + +/* +** push functions (C -> stack) +*/ + + +LUA_API void lua_pushnil (lua_State *L) { + lua_lock(L); + setnilvalue(L->top); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { + lua_lock(L); + setnvalue(L->top, n); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { + lua_lock(L); + setnvalue(L->top, cast_num(n)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { + lua_lock(L); + luaC_checkGC(L); + setsvalue2s(L, L->top, luaS_newlstr(L, s, len)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushstring (lua_State *L, const char *s) { + if (s == NULL) + lua_pushnil(L); + else + lua_pushlstring(L, s, strlen(s)); +} + + +LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, + va_list argp) { + const char *ret; + lua_lock(L); + luaC_checkGC(L); + ret = luaO_pushvfstring(L, fmt, argp); + lua_unlock(L); + return ret; +} + + +LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { + const char *ret; + va_list argp; + lua_lock(L); + luaC_checkGC(L); + va_start(argp, fmt); + ret = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + lua_unlock(L); + return ret; +} + + +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { + Closure *cl; + lua_lock(L); + luaC_checkGC(L); + api_checknelems(L, n); + cl = luaF_newCclosure(L, n, getcurrenv(L)); + cl->c.f = fn; + L->top -= n; + while (n--) + setobj2n(L, &cl->c.upvalue[n], L->top+n); + setclvalue(L, L->top, cl); + lua_assert(iswhite(obj2gco(cl))); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushboolean (lua_State *L, int b) { + lua_lock(L); + setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { + lua_lock(L); + setpvalue(L->top, p); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API int lua_pushthread (lua_State *L) { + lua_lock(L); + setthvalue(L, L->top, L); + api_incr_top(L); + lua_unlock(L); + return (G(L)->mainthread == L); +} + + + +/* +** get functions (Lua -> stack) +*/ + + +LUA_API void lua_gettable (lua_State *L, int idx) { + StkId t; + lua_lock(L); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + luaV_gettable(L, t, L->top - 1, L->top - 1); + lua_unlock(L); +} + + +LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { + StkId t; + TValue key; + lua_lock(L); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + setsvalue(L, &key, luaS_new(L, k)); + luaV_gettable(L, t, &key, L->top); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_rawget (lua_State *L, int idx) { + StkId t; + lua_lock(L); + t = index2adr(L, idx); + api_check(L, ttistable(t)); + setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); + lua_unlock(L); +} + + +LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { + StkId o; + lua_lock(L); + o = index2adr(L, idx); + api_check(L, ttistable(o)); + setobj2s(L, L->top, luaH_getnum(hvalue(o), n)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { + lua_lock(L); + luaC_checkGC(L); + sethvalue(L, L->top, luaH_new(L, narray, nrec)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API int lua_getmetatable (lua_State *L, int objindex) { + const TValue *obj; + Table *mt = NULL; + int res; + lua_lock(L); + obj = index2adr(L, objindex); + switch (ttype(obj)) { + case LUA_TTABLE: + mt = hvalue(obj)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(obj)->metatable; + break; + default: + mt = G(L)->mt[ttype(obj)]; + break; + } + if (mt == NULL) + res = 0; + else { + sethvalue(L, L->top, mt); + api_incr_top(L); + res = 1; + } + lua_unlock(L); + return res; +} + + +LUA_API void lua_getfenv (lua_State *L, int idx) { + StkId o; + lua_lock(L); + o = index2adr(L, idx); + api_checkvalidindex(L, o); + switch (ttype(o)) { + case LUA_TFUNCTION: + sethvalue(L, L->top, clvalue(o)->c.env); + break; + case LUA_TUSERDATA: + sethvalue(L, L->top, uvalue(o)->env); + break; + case LUA_TTHREAD: + setobj2s(L, L->top, gt(thvalue(o))); + break; + default: + setnilvalue(L->top); + break; + } + api_incr_top(L); + lua_unlock(L); +} + + +/* +** set functions (stack -> Lua) +*/ + + +LUA_API void lua_settable (lua_State *L, int idx) { + StkId t; + lua_lock(L); + api_checknelems(L, 2); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + luaV_settable(L, t, L->top - 2, L->top - 1); + L->top -= 2; /* pop index and value */ + lua_unlock(L); +} + + +LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { + StkId t; + TValue key; + lua_lock(L); + api_checknelems(L, 1); + t = index2adr(L, idx); + api_checkvalidindex(L, t); + setsvalue(L, &key, luaS_new(L, k)); + luaV_settable(L, t, &key, L->top - 1); + L->top--; /* pop value */ + lua_unlock(L); +} + + +LUA_API void lua_rawset (lua_State *L, int idx) { + StkId t; + lua_lock(L); + api_checknelems(L, 2); + t = index2adr(L, idx); + api_check(L, ttistable(t)); + setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); + luaC_barriert(L, hvalue(t), L->top-1); + L->top -= 2; + lua_unlock(L); +} + + +LUA_API void lua_rawseti (lua_State *L, int idx, int n) { + StkId o; + lua_lock(L); + api_checknelems(L, 1); + o = index2adr(L, idx); + api_check(L, ttistable(o)); + setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); + luaC_barriert(L, hvalue(o), L->top-1); + L->top--; + lua_unlock(L); +} + + +LUA_API int lua_setmetatable (lua_State *L, int objindex) { + TValue *obj; + Table *mt; + lua_lock(L); + api_checknelems(L, 1); + obj = index2adr(L, objindex); + api_checkvalidindex(L, obj); + if (ttisnil(L->top - 1)) + mt = NULL; + else { + api_check(L, ttistable(L->top - 1)); + mt = hvalue(L->top - 1); + } + switch (ttype(obj)) { + case LUA_TTABLE: { + hvalue(obj)->metatable = mt; + if (mt) + luaC_objbarriert(L, hvalue(obj), mt); + break; + } + case LUA_TUSERDATA: { + uvalue(obj)->metatable = mt; + if (mt) + luaC_objbarrier(L, rawuvalue(obj), mt); + break; + } + default: { + G(L)->mt[ttype(obj)] = mt; + break; + } + } + L->top--; + lua_unlock(L); + return 1; +} + + +LUA_API int lua_setfenv (lua_State *L, int idx) { + StkId o; + int res = 1; + lua_lock(L); + api_checknelems(L, 1); + o = index2adr(L, idx); + api_checkvalidindex(L, o); + api_check(L, ttistable(L->top - 1)); + switch (ttype(o)) { + case LUA_TFUNCTION: + clvalue(o)->c.env = hvalue(L->top - 1); + break; + case LUA_TUSERDATA: + uvalue(o)->env = hvalue(L->top - 1); + break; + case LUA_TTHREAD: + sethvalue(L, gt(thvalue(o)), hvalue(L->top - 1)); + break; + default: + res = 0; + break; + } + if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); + L->top--; + lua_unlock(L); + return res; +} + + +/* +** `load' and `call' functions (run Lua code) +*/ + + +#define adjustresults(L,nres) \ + { if (nres == LUA_MULTRET && L->top >= L->ci->top) L->ci->top = L->top; } + + +#define checkresults(L,na,nr) \ + api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na))) + + +LUA_API void lua_call (lua_State *L, int nargs, int nresults) { + StkId func; + lua_lock(L); + api_checknelems(L, nargs+1); + checkresults(L, nargs, nresults); + func = L->top - (nargs+1); + luaD_call(L, func, nresults); + adjustresults(L, nresults); + lua_unlock(L); +} + + + +/* +** Execute a protected call. +*/ +struct CallS { /* data to `f_call' */ + StkId func; + int nresults; +}; + + +static void f_call (lua_State *L, void *ud) { + struct CallS *c = cast(struct CallS *, ud); + luaD_call(L, c->func, c->nresults); +} + + + +LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { + struct CallS c; + int status; + ptrdiff_t func; + lua_lock(L); + api_checknelems(L, nargs+1); + checkresults(L, nargs, nresults); + if (errfunc == 0) + func = 0; + else { + StkId o = index2adr(L, errfunc); + api_checkvalidindex(L, o); + func = savestack(L, o); + } + c.func = L->top - (nargs+1); /* function to be called */ + c.nresults = nresults; + status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); + adjustresults(L, nresults); + lua_unlock(L); + return status; +} + + +/* +** Execute a protected C call. +*/ +struct CCallS { /* data to `f_Ccall' */ + lua_CFunction func; + void *ud; +}; + + +static void f_Ccall (lua_State *L, void *ud) { + struct CCallS *c = cast(struct CCallS *, ud); + Closure *cl; + cl = luaF_newCclosure(L, 0, getcurrenv(L)); + cl->c.f = c->func; + setclvalue(L, L->top, cl); /* push function */ + api_incr_top(L); + setpvalue(L->top, c->ud); /* push only argument */ + api_incr_top(L); + luaD_call(L, L->top - 2, 0); +} + + +LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { + struct CCallS c; + int status; + lua_lock(L); + c.func = func; + c.ud = ud; + status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0); + lua_unlock(L); + return status; +} + + +LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, + const char *chunkname) { + ZIO z; + int status; + lua_lock(L); + if (!chunkname) chunkname = "?"; + luaZ_init(L, &z, reader, data); + status = luaD_protectedparser(L, &z, chunkname); + lua_unlock(L); + return status; +} + + +LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data) { + int status; + TValue *o; + lua_lock(L); + api_checknelems(L, 1); + o = L->top - 1; + if (isLfunction(o)) + status = luaU_dump(L, clvalue(o)->l.p, writer, data, 0); + else + status = 1; + lua_unlock(L); + return status; +} + + +LUA_API int lua_status (lua_State *L) { + return L->status; +} + + +/* +** Garbage-collection function +*/ + +LUA_API int lua_gc (lua_State *L, int what, int data) { + int res = 0; + global_State *g; + lua_lock(L); + g = G(L); + switch (what) { + case LUA_GCSTOP: { + g->GCthreshold = MAX_LUMEM; + break; + } + case LUA_GCRESTART: { + g->GCthreshold = g->totalbytes; + break; + } + case LUA_GCCOLLECT: { + luaC_fullgc(L); + break; + } + case LUA_GCCOUNT: { + /* GC values are expressed in Kbytes: #bytes/2^10 */ + res = cast_int(g->totalbytes >> 10); + break; + } + case LUA_GCCOUNTB: { + res = cast_int(g->totalbytes & 0x3ff); + break; + } + case LUA_GCSTEP: { + lu_mem a = (cast(lu_mem, data) << 10); + if (a <= g->totalbytes) + g->GCthreshold = g->totalbytes - a; + else + g->GCthreshold = 0; + while (g->GCthreshold <= g->totalbytes) { + luaC_step(L); + if (g->gcstate == GCSpause) { /* end of cycle? */ + res = 1; /* signal it */ + break; + } + } + break; + } + case LUA_GCSETPAUSE: { + res = g->gcpause; + g->gcpause = data; + break; + } + case LUA_GCSETSTEPMUL: { + res = g->gcstepmul; + g->gcstepmul = data; + break; + } + default: res = -1; /* invalid option */ + } + lua_unlock(L); + return res; +} + + + +/* +** miscellaneous functions +*/ + + +LUA_API int lua_error (lua_State *L) { + lua_lock(L); + api_checknelems(L, 1); + luaG_errormsg(L); + lua_unlock(L); + return 0; /* to avoid warnings */ +} + + +LUA_API int lua_next (lua_State *L, int idx) { + StkId t; + int more; + lua_lock(L); + t = index2adr(L, idx); + api_check(L, ttistable(t)); + more = luaH_next(L, hvalue(t), L->top - 1); + if (more) { + api_incr_top(L); + } + else /* no more elements */ + L->top -= 1; /* remove key */ + lua_unlock(L); + return more; +} + + +LUA_API void lua_concat (lua_State *L, int n) { + lua_lock(L); + api_checknelems(L, n); + if (n >= 2) { + luaC_checkGC(L); + luaV_concat(L, n, cast_int(L->top - L->base) - 1); + L->top -= (n-1); + } + else if (n == 0) { /* push empty string */ + setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); + api_incr_top(L); + } + /* else n == 1; nothing to do */ + lua_unlock(L); +} + + +LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { + lua_Alloc f; + lua_lock(L); + if (ud) *ud = G(L)->ud; + f = G(L)->frealloc; + lua_unlock(L); + return f; +} + + +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { + lua_lock(L); + G(L)->ud = ud; + G(L)->frealloc = f; + lua_unlock(L); +} + + +LUA_API void *lua_newuserdata (lua_State *L, size_t size) { + Udata *u; + lua_lock(L); + luaC_checkGC(L); + u = luaS_newudata(L, size, getcurrenv(L)); + setuvalue(L, L->top, u); + api_incr_top(L); + lua_unlock(L); + return u + 1; +} + + + + +static const char *aux_upvalue (StkId fi, int n, TValue **val) { + Closure *f; + if (!ttisfunction(fi)) return NULL; + f = clvalue(fi); + if (f->c.isC) { + if (!(1 <= n && n <= f->c.nupvalues)) return NULL; + *val = &f->c.upvalue[n-1]; + return ""; + } + else { + Proto *p = f->l.p; + if (!(1 <= n && n <= p->sizeupvalues)) return NULL; + *val = f->l.upvals[n-1]->v; + return getstr(p->upvalues[n-1]); + } +} + + +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val; + lua_lock(L); + name = aux_upvalue(index2adr(L, funcindex), n, &val); + if (name) { + setobj2s(L, L->top, val); + api_incr_top(L); + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val; + StkId fi; + lua_lock(L); + fi = index2adr(L, funcindex); + api_checknelems(L, 1); + name = aux_upvalue(fi, n, &val); + if (name) { + L->top--; + setobj(L, val, L->top); + luaC_barrier(L, clvalue(fi), L->top); + } + lua_unlock(L); + return name; +} + diff --git a/ext/lua-5.1.5/src/lapi.h b/ext/lua-5.1.5/src/lapi.h new file mode 100644 index 000000000..2c3fab244 --- /dev/null +++ b/ext/lua-5.1.5/src/lapi.h @@ -0,0 +1,16 @@ +/* +** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "lobject.h" + + +LUAI_FUNC void luaA_pushobject (lua_State *L, const TValue *o); + +#endif diff --git a/ext/lua-5.1.5/src/lauxlib.c b/ext/lua-5.1.5/src/lauxlib.c new file mode 100644 index 000000000..10f14e2c0 --- /dev/null +++ b/ext/lua-5.1.5/src/lauxlib.c @@ -0,0 +1,652 @@ +/* +** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include +#include +#include + + +/* This file uses only the official API of Lua. +** Any function declared here could be written as an application function. +*/ + +#define lauxlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" + + +#define FREELIST_REF 0 /* free list of references */ + + +/* convert a stack index to positive */ +#define abs_index(L, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \ + lua_gettop(L) + (i) + 1) + + +/* +** {====================================================== +** Error-report functions +** ======================================================= +*/ + + +LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) { + lua_Debug ar; + if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ + return luaL_error(L, "bad argument #%d (%s)", narg, extramsg); + lua_getinfo(L, "n", &ar); + if (strcmp(ar.namewhat, "method") == 0) { + narg--; /* do not count `self' */ + if (narg == 0) /* error is in the self argument itself? */ + return luaL_error(L, "calling " LUA_QS " on bad self (%s)", + ar.name, extramsg); + } + if (ar.name == NULL) + ar.name = "?"; + return luaL_error(L, "bad argument #%d to " LUA_QS " (%s)", + narg, ar.name, extramsg); +} + + +LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) { + const char *msg = lua_pushfstring(L, "%s expected, got %s", + tname, luaL_typename(L, narg)); + return luaL_argerror(L, narg, msg); +} + + +static void tag_error (lua_State *L, int narg, int tag) { + luaL_typerror(L, narg, lua_typename(L, tag)); +} + + +LUALIB_API void luaL_where (lua_State *L, int level) { + lua_Debug ar; + if (lua_getstack(L, level, &ar)) { /* check function at level */ + lua_getinfo(L, "Sl", &ar); /* get info about it */ + if (ar.currentline > 0) { /* is there info? */ + lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); + return; + } + } + lua_pushliteral(L, ""); /* else, no information available... */ +} + + +LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { + va_list argp; + va_start(argp, fmt); + luaL_where(L, 1); + lua_pushvfstring(L, fmt, argp); + va_end(argp); + lua_concat(L, 2); + return lua_error(L); +} + +/* }====================================================== */ + + +LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def, + const char *const lst[]) { + const char *name = (def) ? luaL_optstring(L, narg, def) : + luaL_checkstring(L, narg); + int i; + for (i=0; lst[i]; i++) + if (strcmp(lst[i], name) == 0) + return i; + return luaL_argerror(L, narg, + lua_pushfstring(L, "invalid option " LUA_QS, name)); +} + + +LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { + lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get registry.name */ + if (!lua_isnil(L, -1)) /* name already in use? */ + return 0; /* leave previous value on top, but return 0 */ + lua_pop(L, 1); + lua_newtable(L); /* create metatable */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ + return 1; +} + + +LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); + if (p != NULL) { /* value is a userdata? */ + if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ + lua_getfield(L, LUA_REGISTRYINDEX, tname); /* get correct metatable */ + if (lua_rawequal(L, -1, -2)) { /* does it have the correct mt? */ + lua_pop(L, 2); /* remove both metatables */ + return p; + } + } + } + luaL_typerror(L, ud, tname); /* else error */ + return NULL; /* to avoid warnings */ +} + + +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { + if (!lua_checkstack(L, space)) + luaL_error(L, "stack overflow (%s)", mes); +} + + +LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) { + if (lua_type(L, narg) != t) + tag_error(L, narg, t); +} + + +LUALIB_API void luaL_checkany (lua_State *L, int narg) { + if (lua_type(L, narg) == LUA_TNONE) + luaL_argerror(L, narg, "value expected"); +} + + +LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) { + const char *s = lua_tolstring(L, narg, len); + if (!s) tag_error(L, narg, LUA_TSTRING); + return s; +} + + +LUALIB_API const char *luaL_optlstring (lua_State *L, int narg, + const char *def, size_t *len) { + if (lua_isnoneornil(L, narg)) { + if (len) + *len = (def ? strlen(def) : 0); + return def; + } + else return luaL_checklstring(L, narg, len); +} + + +LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) { + lua_Number d = lua_tonumber(L, narg); + if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ + tag_error(L, narg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) { + return luaL_opt(L, luaL_checknumber, narg, def); +} + + +LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int narg) { + lua_Integer d = lua_tointeger(L, narg); + if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ + tag_error(L, narg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int narg, + lua_Integer def) { + return luaL_opt(L, luaL_checkinteger, narg, def); +} + + +LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { + if (!lua_getmetatable(L, obj)) /* no metatable? */ + return 0; + lua_pushstring(L, event); + lua_rawget(L, -2); + if (lua_isnil(L, -1)) { + lua_pop(L, 2); /* remove metatable and metafield */ + return 0; + } + else { + lua_remove(L, -2); /* remove only metatable */ + return 1; + } +} + + +LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { + obj = abs_index(L, obj); + if (!luaL_getmetafield(L, obj, event)) /* no metafield? */ + return 0; + lua_pushvalue(L, obj); + lua_call(L, 1, 1); + return 1; +} + + +LUALIB_API void (luaL_register) (lua_State *L, const char *libname, + const luaL_Reg *l) { + luaI_openlib(L, libname, l, 0); +} + + +static int libsize (const luaL_Reg *l) { + int size = 0; + for (; l->name; l++) size++; + return size; +} + + +LUALIB_API void luaI_openlib (lua_State *L, const char *libname, + const luaL_Reg *l, int nup) { + if (libname) { + int size = libsize(l); + /* check whether lib already exists */ + luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); + lua_getfield(L, -1, libname); /* get _LOADED[libname] */ + if (!lua_istable(L, -1)) { /* not found? */ + lua_pop(L, 1); /* remove previous result */ + /* try global variable (and create one if it does not exist) */ + if (luaL_findtable(L, LUA_GLOBALSINDEX, libname, size) != NULL) + luaL_error(L, "name conflict for module " LUA_QS, libname); + lua_pushvalue(L, -1); + lua_setfield(L, -3, libname); /* _LOADED[libname] = new table */ + } + lua_remove(L, -2); /* remove _LOADED table */ + lua_insert(L, -(nup+1)); /* move library table to below upvalues */ + } + for (; l->name; l++) { + int i; + for (i=0; ifunc, nup); + lua_setfield(L, -(nup+2), l->name); + } + lua_pop(L, nup); /* remove upvalues */ +} + + + +/* +** {====================================================== +** getn-setn: size for arrays +** ======================================================= +*/ + +#if defined(LUA_COMPAT_GETN) + +static int checkint (lua_State *L, int topop) { + int n = (lua_type(L, -1) == LUA_TNUMBER) ? lua_tointeger(L, -1) : -1; + lua_pop(L, topop); + return n; +} + + +static void getsizes (lua_State *L) { + lua_getfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); + if (lua_isnil(L, -1)) { /* no `size' table? */ + lua_pop(L, 1); /* remove nil */ + lua_newtable(L); /* create it */ + lua_pushvalue(L, -1); /* `size' will be its own metatable */ + lua_setmetatable(L, -2); + lua_pushliteral(L, "kv"); + lua_setfield(L, -2, "__mode"); /* metatable(N).__mode = "kv" */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, "LUA_SIZES"); /* store in register */ + } +} + + +LUALIB_API void luaL_setn (lua_State *L, int t, int n) { + t = abs_index(L, t); + lua_pushliteral(L, "n"); + lua_rawget(L, t); + if (checkint(L, 1) >= 0) { /* is there a numeric field `n'? */ + lua_pushliteral(L, "n"); /* use it */ + lua_pushinteger(L, n); + lua_rawset(L, t); + } + else { /* use `sizes' */ + getsizes(L); + lua_pushvalue(L, t); + lua_pushinteger(L, n); + lua_rawset(L, -3); /* sizes[t] = n */ + lua_pop(L, 1); /* remove `sizes' */ + } +} + + +LUALIB_API int luaL_getn (lua_State *L, int t) { + int n; + t = abs_index(L, t); + lua_pushliteral(L, "n"); /* try t.n */ + lua_rawget(L, t); + if ((n = checkint(L, 1)) >= 0) return n; + getsizes(L); /* else try sizes[t] */ + lua_pushvalue(L, t); + lua_rawget(L, -2); + if ((n = checkint(L, 2)) >= 0) return n; + return (int)lua_objlen(L, t); +} + +#endif + +/* }====================================================== */ + + + +LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, const char *p, + const char *r) { + const char *wild; + size_t l = strlen(p); + luaL_Buffer b; + luaL_buffinit(L, &b); + while ((wild = strstr(s, p)) != NULL) { + luaL_addlstring(&b, s, wild - s); /* push prefix */ + luaL_addstring(&b, r); /* push replacement in place of pattern */ + s = wild + l; /* continue after `p' */ + } + luaL_addstring(&b, s); /* push last suffix */ + luaL_pushresult(&b); + return lua_tostring(L, -1); +} + + +LUALIB_API const char *luaL_findtable (lua_State *L, int idx, + const char *fname, int szhint) { + const char *e; + lua_pushvalue(L, idx); + do { + e = strchr(fname, '.'); + if (e == NULL) e = fname + strlen(fname); + lua_pushlstring(L, fname, e - fname); + lua_rawget(L, -2); + if (lua_isnil(L, -1)) { /* no such field? */ + lua_pop(L, 1); /* remove this nil */ + lua_createtable(L, 0, (*e == '.' ? 1 : szhint)); /* new table for field */ + lua_pushlstring(L, fname, e - fname); + lua_pushvalue(L, -2); + lua_settable(L, -4); /* set new table into field */ + } + else if (!lua_istable(L, -1)) { /* field has a non-table value? */ + lua_pop(L, 2); /* remove table and value */ + return fname; /* return problematic part of the name */ + } + lua_remove(L, -2); /* remove previous table */ + fname = e + 1; + } while (*e == '.'); + return NULL; +} + + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + + +#define bufflen(B) ((B)->p - (B)->buffer) +#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) + +#define LIMIT (LUA_MINSTACK/2) + + +static int emptybuffer (luaL_Buffer *B) { + size_t l = bufflen(B); + if (l == 0) return 0; /* put nothing on stack */ + else { + lua_pushlstring(B->L, B->buffer, l); + B->p = B->buffer; + B->lvl++; + return 1; + } +} + + +static void adjuststack (luaL_Buffer *B) { + if (B->lvl > 1) { + lua_State *L = B->L; + int toget = 1; /* number of levels to concat */ + size_t toplen = lua_strlen(L, -1); + do { + size_t l = lua_strlen(L, -(toget+1)); + if (B->lvl - toget + 1 >= LIMIT || toplen > l) { + toplen += l; + toget++; + } + else break; + } while (toget < B->lvl); + lua_concat(L, toget); + B->lvl = B->lvl - toget + 1; + } +} + + +LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { + if (emptybuffer(B)) + adjuststack(B); + return B->buffer; +} + + +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { + while (l--) + luaL_addchar(B, *s++); +} + + +LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { + luaL_addlstring(B, s, strlen(s)); +} + + +LUALIB_API void luaL_pushresult (luaL_Buffer *B) { + emptybuffer(B); + lua_concat(B->L, B->lvl); + B->lvl = 1; +} + + +LUALIB_API void luaL_addvalue (luaL_Buffer *B) { + lua_State *L = B->L; + size_t vl; + const char *s = lua_tolstring(L, -1, &vl); + if (vl <= bufffree(B)) { /* fit into buffer? */ + memcpy(B->p, s, vl); /* put it there */ + B->p += vl; + lua_pop(L, 1); /* remove from stack */ + } + else { + if (emptybuffer(B)) + lua_insert(L, -2); /* put buffer before new value */ + B->lvl++; /* add new value into B stack */ + adjuststack(B); + } +} + + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { + B->L = L; + B->p = B->buffer; + B->lvl = 0; +} + +/* }====================================================== */ + + +LUALIB_API int luaL_ref (lua_State *L, int t) { + int ref; + t = abs_index(L, t); + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* remove from stack */ + return LUA_REFNIL; /* `nil' has a unique fixed reference */ + } + lua_rawgeti(L, t, FREELIST_REF); /* get first free element */ + ref = (int)lua_tointeger(L, -1); /* ref = t[FREELIST_REF] */ + lua_pop(L, 1); /* remove it from stack */ + if (ref != 0) { /* any free element? */ + lua_rawgeti(L, t, ref); /* remove it from list */ + lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ + } + else { /* no free elements */ + ref = (int)lua_objlen(L, t); + ref++; /* create new reference */ + } + lua_rawseti(L, t, ref); + return ref; +} + + +LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { + if (ref >= 0) { + t = abs_index(L, t); + lua_rawgeti(L, t, FREELIST_REF); + lua_rawseti(L, t, ref); /* t[ref] = t[FREELIST_REF] */ + lua_pushinteger(L, ref); + lua_rawseti(L, t, FREELIST_REF); /* t[FREELIST_REF] = ref */ + } +} + + + +/* +** {====================================================== +** Load functions +** ======================================================= +*/ + +typedef struct LoadF { + int extraline; + FILE *f; + char buff[LUAL_BUFFERSIZE]; +} LoadF; + + +static const char *getF (lua_State *L, void *ud, size_t *size) { + LoadF *lf = (LoadF *)ud; + (void)L; + if (lf->extraline) { + lf->extraline = 0; + *size = 1; + return "\n"; + } + if (feof(lf->f)) return NULL; + *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); + return (*size > 0) ? lf->buff : NULL; +} + + +static int errfile (lua_State *L, const char *what, int fnameindex) { + const char *serr = strerror(errno); + const char *filename = lua_tostring(L, fnameindex) + 1; + lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); + lua_remove(L, fnameindex); + return LUA_ERRFILE; +} + + +LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { + LoadF lf; + int status, readstatus; + int c; + int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ + lf.extraline = 0; + if (filename == NULL) { + lua_pushliteral(L, "=stdin"); + lf.f = stdin; + } + else { + lua_pushfstring(L, "@%s", filename); + lf.f = fopen(filename, "r"); + if (lf.f == NULL) return errfile(L, "open", fnameindex); + } + c = getc(lf.f); + if (c == '#') { /* Unix exec. file? */ + lf.extraline = 1; + while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ + if (c == '\n') c = getc(lf.f); + } + if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ + lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ + if (lf.f == NULL) return errfile(L, "reopen", fnameindex); + /* skip eventual `#!...' */ + while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; + lf.extraline = 0; + } + ungetc(c, lf.f); + status = lua_load(L, getF, &lf, lua_tostring(L, -1)); + readstatus = ferror(lf.f); + if (filename) fclose(lf.f); /* close file (even in case of errors) */ + if (readstatus) { + lua_settop(L, fnameindex); /* ignore results from `lua_load' */ + return errfile(L, "read", fnameindex); + } + lua_remove(L, fnameindex); + return status; +} + + +typedef struct LoadS { + const char *s; + size_t size; +} LoadS; + + +static const char *getS (lua_State *L, void *ud, size_t *size) { + LoadS *ls = (LoadS *)ud; + (void)L; + if (ls->size == 0) return NULL; + *size = ls->size; + ls->size = 0; + return ls->s; +} + + +LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size, + const char *name) { + LoadS ls; + ls.s = buff; + ls.size = size; + return lua_load(L, getS, &ls, name); +} + + +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s) { + return luaL_loadbuffer(L, s, strlen(s), s); +} + + + +/* }====================================================== */ + + +static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { + (void)ud; + (void)osize; + if (nsize == 0) { + free(ptr); + return NULL; + } + else + return realloc(ptr, nsize); +} + + +static int panic (lua_State *L) { + (void)L; /* to avoid warnings */ + fprintf(stderr, "PANIC: unprotected error in call to Lua API (%s)\n", + lua_tostring(L, -1)); + return 0; +} + + +LUALIB_API lua_State *luaL_newstate (void) { + lua_State *L = lua_newstate(l_alloc, NULL); + if (L) lua_atpanic(L, &panic); + return L; +} + diff --git a/lua/lauxlib.h b/ext/lua-5.1.5/src/lauxlib.h similarity index 75% rename from lua/lauxlib.h rename to ext/lua-5.1.5/src/lauxlib.h index 56ec253ce..34258235d 100644 --- a/lua/lauxlib.h +++ b/ext/lua-5.1.5/src/lauxlib.h @@ -1,5 +1,5 @@ /* -** $Id: lauxlib.h,v 1.88 2006/04/12 20:31:15 roberto Exp $ +** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $ ** Auxiliary functions for building Lua libraries ** See Copyright Notice in lua.h */ @@ -19,8 +19,8 @@ LUALIB_API int (luaL_getn) (lua_State *L, int t); LUALIB_API void (luaL_setn) (lua_State *L, int t, int n); #else -#define luaL_getn(L,i) ((int)lua_objlen(L, i)) -#define luaL_setn(L,i,j) ((void)0) /* no op! */ +#define luaL_getn(L,i) ((int)lua_objlen(L, i)) +#define luaL_setn(L,i,j) ((void)0) /* no op! */ #endif #if defined(LUA_COMPAT_OPENLIB) @@ -29,64 +29,64 @@ LUALIB_API void (luaL_setn) (lua_State *L, int t, int n); /* extra error code for `luaL_load' */ -#define LUA_ERRFILE (LUA_ERRERR+1) +#define LUA_ERRFILE (LUA_ERRERR+1) typedef struct luaL_Reg { - const char *name; - lua_CFunction func; + const char *name; + lua_CFunction func; } luaL_Reg; LUALIB_API void (luaI_openlib) (lua_State *L, const char *libname, - const luaL_Reg *l, int nup); + const luaL_Reg *l, int nup); LUALIB_API void (luaL_register) (lua_State *L, const char *libname, - const luaL_Reg *l); + const luaL_Reg *l); LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); LUALIB_API int (luaL_typerror) (lua_State *L, int narg, const char *tname); LUALIB_API int (luaL_argerror) (lua_State *L, int numarg, const char *extramsg); LUALIB_API const char *(luaL_checklstring) (lua_State *L, int numArg, - size_t *l); + size_t *l); LUALIB_API const char *(luaL_optlstring) (lua_State *L, int numArg, - const char *def, size_t *l); + const char *def, size_t *l); LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int numArg); LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int nArg, lua_Number def); LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int numArg); LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int nArg, - lua_Integer def); + lua_Integer def); LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); LUALIB_API void (luaL_checktype) (lua_State *L, int narg, int t); LUALIB_API void (luaL_checkany) (lua_State *L, int narg); -LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); LUALIB_API void (luaL_where) (lua_State *L, int lvl); LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); LUALIB_API int (luaL_checkoption) (lua_State *L, int narg, const char *def, - const char *const lst[]); + const char *const lst[]); LUALIB_API int (luaL_ref) (lua_State *L, int t); LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename); LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz, - const char *name); + const char *name); LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); LUALIB_API lua_State *(luaL_newstate) (void); LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, - const char *r); + const char *r); LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, - const char *fname, int szhint); + const char *fname, int szhint); @@ -127,15 +127,15 @@ LUALIB_API const char *(luaL_findtable) (lua_State *L, int idx, typedef struct luaL_Buffer { - char *p; /* current position in buffer */ - int lvl; /* number of strings in the stack (level) */ - lua_State *L; - char buffer[LUAL_BUFFERSIZE]; + char *p; /* current position in buffer */ + int lvl; /* number of strings in the stack (level) */ + lua_State *L; + char buffer[LUAL_BUFFERSIZE]; } luaL_Buffer; #define luaL_addchar(B,c) \ - ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ - (*(B)->p++ = (char)(c))) + ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ + (*(B)->p++ = (char)(c))) /* compatibility only */ #define luaL_putchar(B,c) luaL_addchar(B,c) @@ -156,15 +156,15 @@ LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); /* compatibility with ref system */ /* pre-defined references */ -#define LUA_NOREF (-2) -#define LUA_REFNIL (-1) +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) #define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ - (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) + (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) -#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) +#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) -#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) +#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, (ref)) #define luaL_reg luaL_Reg diff --git a/ext/lua-5.1.5/src/lbaselib.c b/ext/lua-5.1.5/src/lbaselib.c new file mode 100644 index 000000000..2ab550bd4 --- /dev/null +++ b/ext/lua-5.1.5/src/lbaselib.c @@ -0,0 +1,653 @@ +/* +** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $ +** Basic library +** See Copyright Notice in lua.h +*/ + + + +#include +#include +#include +#include + +#define lbaselib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + + +/* +** If your system does not support `stdout', you can just remove this function. +** If you need, you can define your own `print' function, following this +** model but changing `fputs' to put the strings at a proper place +** (a console window or a log file, for instance). +*/ +static int luaB_print (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + lua_getglobal(L, "tostring"); + for (i=1; i<=n; i++) { + const char *s; + lua_pushvalue(L, -1); /* function to be called */ + lua_pushvalue(L, i); /* value to print */ + lua_call(L, 1, 1); + s = lua_tostring(L, -1); /* get result */ + if (s == NULL) + return luaL_error(L, LUA_QL("tostring") " must return a string to " + LUA_QL("print")); + if (i>1) fputs("\t", stdout); + fputs(s, stdout); + lua_pop(L, 1); /* pop result */ + } + fputs("\n", stdout); + return 0; +} + + +static int luaB_tonumber (lua_State *L) { + int base = luaL_optint(L, 2, 10); + if (base == 10) { /* standard conversion */ + luaL_checkany(L, 1); + if (lua_isnumber(L, 1)) { + lua_pushnumber(L, lua_tonumber(L, 1)); + return 1; + } + } + else { + const char *s1 = luaL_checkstring(L, 1); + char *s2; + unsigned long n; + luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); + n = strtoul(s1, &s2, base); + if (s1 != s2) { /* at least one valid digit? */ + while (isspace((unsigned char)(*s2))) s2++; /* skip trailing spaces */ + if (*s2 == '\0') { /* no invalid trailing characters? */ + lua_pushnumber(L, (lua_Number)n); + return 1; + } + } + } + lua_pushnil(L); /* else not a number */ + return 1; +} + + +static int luaB_error (lua_State *L) { + int level = luaL_optint(L, 2, 1); + lua_settop(L, 1); + if (lua_isstring(L, 1) && level > 0) { /* add extra information? */ + luaL_where(L, level); + lua_pushvalue(L, 1); + lua_concat(L, 2); + } + return lua_error(L); +} + + +static int luaB_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); + return 1; /* no metatable */ + } + luaL_getmetafield(L, 1, "__metatable"); + return 1; /* returns either __metatable field (if present) or metatable */ +} + + +static int luaB_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, + "nil or table expected"); + if (luaL_getmetafield(L, 1, "__metatable")) + luaL_error(L, "cannot change a protected metatable"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; +} + + +static void getfunc (lua_State *L, int opt) { + if (lua_isfunction(L, 1)) lua_pushvalue(L, 1); + else { + lua_Debug ar; + int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1); + luaL_argcheck(L, level >= 0, 1, "level must be non-negative"); + if (lua_getstack(L, level, &ar) == 0) + luaL_argerror(L, 1, "invalid level"); + lua_getinfo(L, "f", &ar); + if (lua_isnil(L, -1)) + luaL_error(L, "no function environment for tail call at level %d", + level); + } +} + + +static int luaB_getfenv (lua_State *L) { + getfunc(L, 1); + if (lua_iscfunction(L, -1)) /* is a C function? */ + lua_pushvalue(L, LUA_GLOBALSINDEX); /* return the thread's global env. */ + else + lua_getfenv(L, -1); + return 1; +} + + +static int luaB_setfenv (lua_State *L) { + luaL_checktype(L, 2, LUA_TTABLE); + getfunc(L, 0); + lua_pushvalue(L, 2); + if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) { + /* change environment of current thread */ + lua_pushthread(L); + lua_insert(L, -2); + lua_setfenv(L, -2); + return 0; + } + else if (lua_iscfunction(L, -2) || lua_setfenv(L, -2) == 0) + luaL_error(L, + LUA_QL("setfenv") " cannot change environment of given object"); + return 1; +} + + +static int luaB_rawequal (lua_State *L) { + luaL_checkany(L, 1); + luaL_checkany(L, 2); + lua_pushboolean(L, lua_rawequal(L, 1, 2)); + return 1; +} + + +static int luaB_rawget (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_rawget(L, 1); + return 1; +} + +static int luaB_rawset (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + luaL_checkany(L, 3); + lua_settop(L, 3); + lua_rawset(L, 1); + return 1; +} + + +static int luaB_gcinfo (lua_State *L) { + lua_pushinteger(L, lua_getgccount(L)); + return 1; +} + + +static int luaB_collectgarbage (lua_State *L) { + static const char *const opts[] = {"stop", "restart", "collect", + "count", "step", "setpause", "setstepmul", NULL}; + static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, + LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL}; + int o = luaL_checkoption(L, 1, "collect", opts); + int ex = luaL_optint(L, 2, 0); + int res = lua_gc(L, optsnum[o], ex); + switch (optsnum[o]) { + case LUA_GCCOUNT: { + int b = lua_gc(L, LUA_GCCOUNTB, 0); + lua_pushnumber(L, res + ((lua_Number)b/1024)); + return 1; + } + case LUA_GCSTEP: { + lua_pushboolean(L, res); + return 1; + } + default: { + lua_pushnumber(L, res); + return 1; + } + } +} + + +static int luaB_type (lua_State *L) { + luaL_checkany(L, 1); + lua_pushstring(L, luaL_typename(L, 1)); + return 1; +} + + +static int luaB_next (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 2); /* create a 2nd argument if there isn't one */ + if (lua_next(L, 1)) + return 2; + else { + lua_pushnil(L); + return 1; + } +} + + +static int luaB_pairs (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ + lua_pushvalue(L, 1); /* state, */ + lua_pushnil(L); /* and initial value */ + return 3; +} + + +static int ipairsaux (lua_State *L) { + int i = luaL_checkint(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + i++; /* next value */ + lua_pushinteger(L, i); + lua_rawgeti(L, 1, i); + return (lua_isnil(L, -1)) ? 0 : 2; +} + + +static int luaB_ipairs (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushvalue(L, lua_upvalueindex(1)); /* return generator, */ + lua_pushvalue(L, 1); /* state, */ + lua_pushinteger(L, 0); /* and initial value */ + return 3; +} + + +static int load_aux (lua_State *L, int status) { + if (status == 0) /* OK? */ + return 1; + else { + lua_pushnil(L); + lua_insert(L, -2); /* put before error message */ + return 2; /* return nil plus error message */ + } +} + + +static int luaB_loadstring (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + const char *chunkname = luaL_optstring(L, 2, s); + return load_aux(L, luaL_loadbuffer(L, s, l, chunkname)); +} + + +static int luaB_loadfile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + return load_aux(L, luaL_loadfile(L, fname)); +} + + +/* +** Reader for generic `load' function: `lua_load' uses the +** stack for internal stuff, so the reader cannot change the +** stack top. Instead, it keeps its resulting string in a +** reserved slot inside the stack. +*/ +static const char *generic_reader (lua_State *L, void *ud, size_t *size) { + (void)ud; /* to avoid warnings */ + luaL_checkstack(L, 2, "too many nested functions"); + lua_pushvalue(L, 1); /* get function */ + lua_call(L, 0, 1); /* call it */ + if (lua_isnil(L, -1)) { + *size = 0; + return NULL; + } + else if (lua_isstring(L, -1)) { + lua_replace(L, 3); /* save string in a reserved stack slot */ + return lua_tolstring(L, 3, size); + } + else luaL_error(L, "reader function must return a string"); + return NULL; /* to avoid warnings */ +} + + +static int luaB_load (lua_State *L) { + int status; + const char *cname = luaL_optstring(L, 2, "=(load)"); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, 3); /* function, eventual name, plus one reserved slot */ + status = lua_load(L, generic_reader, NULL, cname); + return load_aux(L, status); +} + + +static int luaB_dofile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + int n = lua_gettop(L); + if (luaL_loadfile(L, fname) != 0) lua_error(L); + lua_call(L, 0, LUA_MULTRET); + return lua_gettop(L) - n; +} + + +static int luaB_assert (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_toboolean(L, 1)) + return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!")); + return lua_gettop(L); +} + + +static int luaB_unpack (lua_State *L) { + int i, e, n; + luaL_checktype(L, 1, LUA_TTABLE); + i = luaL_optint(L, 2, 1); + e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1)); + if (i > e) return 0; /* empty range */ + n = e - i + 1; /* number of elements */ + if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */ + return luaL_error(L, "too many results to unpack"); + lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */ + while (i++ < e) /* push arg[i + 1...e] */ + lua_rawgeti(L, 1, i); + return n; +} + + +static int luaB_select (lua_State *L) { + int n = lua_gettop(L); + if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { + lua_pushinteger(L, n-1); + return 1; + } + else { + int i = luaL_checkint(L, 1); + if (i < 0) i = n + i; + else if (i > n) i = n; + luaL_argcheck(L, 1 <= i, 1, "index out of range"); + return n - i; + } +} + + +static int luaB_pcall (lua_State *L) { + int status; + luaL_checkany(L, 1); + status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0); + lua_pushboolean(L, (status == 0)); + lua_insert(L, 1); + return lua_gettop(L); /* return status + all results */ +} + + +static int luaB_xpcall (lua_State *L) { + int status; + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_insert(L, 1); /* put error function under function to be called */ + status = lua_pcall(L, 0, LUA_MULTRET, 1); + lua_pushboolean(L, (status == 0)); + lua_replace(L, 1); + return lua_gettop(L); /* return status + all results */ +} + + +static int luaB_tostring (lua_State *L) { + luaL_checkany(L, 1); + if (luaL_callmeta(L, 1, "__tostring")) /* is there a metafield? */ + return 1; /* use its value */ + switch (lua_type(L, 1)) { + case LUA_TNUMBER: + lua_pushstring(L, lua_tostring(L, 1)); + break; + case LUA_TSTRING: + lua_pushvalue(L, 1); + break; + case LUA_TBOOLEAN: + lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false")); + break; + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + default: + lua_pushfstring(L, "%s: %p", luaL_typename(L, 1), lua_topointer(L, 1)); + break; + } + return 1; +} + + +static int luaB_newproxy (lua_State *L) { + lua_settop(L, 1); + lua_newuserdata(L, 0); /* create proxy */ + if (lua_toboolean(L, 1) == 0) + return 1; /* no metatable */ + else if (lua_isboolean(L, 1)) { + lua_newtable(L); /* create a new metatable `m' ... */ + lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */ + lua_pushboolean(L, 1); + lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */ + } + else { + int validproxy = 0; /* to check if weaktable[metatable(u)] == true */ + if (lua_getmetatable(L, 1)) { + lua_rawget(L, lua_upvalueindex(1)); + validproxy = lua_toboolean(L, -1); + lua_pop(L, 1); /* remove value */ + } + luaL_argcheck(L, validproxy, 1, "boolean or proxy expected"); + lua_getmetatable(L, 1); /* metatable is valid; get it */ + } + lua_setmetatable(L, 2); + return 1; +} + + +static const luaL_Reg base_funcs[] = { + {"assert", luaB_assert}, + {"collectgarbage", luaB_collectgarbage}, + {"dofile", luaB_dofile}, + {"error", luaB_error}, + {"gcinfo", luaB_gcinfo}, + {"getfenv", luaB_getfenv}, + {"getmetatable", luaB_getmetatable}, + {"loadfile", luaB_loadfile}, + {"load", luaB_load}, + {"loadstring", luaB_loadstring}, + {"next", luaB_next}, + {"pcall", luaB_pcall}, + {"print", luaB_print}, + {"rawequal", luaB_rawequal}, + {"rawget", luaB_rawget}, + {"rawset", luaB_rawset}, + {"select", luaB_select}, + {"setfenv", luaB_setfenv}, + {"setmetatable", luaB_setmetatable}, + {"tonumber", luaB_tonumber}, + {"tostring", luaB_tostring}, + {"type", luaB_type}, + {"unpack", luaB_unpack}, + {"xpcall", luaB_xpcall}, + {NULL, NULL} +}; + + +/* +** {====================================================== +** Coroutine library +** ======================================================= +*/ + +#define CO_RUN 0 /* running */ +#define CO_SUS 1 /* suspended */ +#define CO_NOR 2 /* 'normal' (it resumed another coroutine) */ +#define CO_DEAD 3 + +static const char *const statnames[] = + {"running", "suspended", "normal", "dead"}; + +static int costatus (lua_State *L, lua_State *co) { + if (L == co) return CO_RUN; + switch (lua_status(co)) { + case LUA_YIELD: + return CO_SUS; + case 0: { + lua_Debug ar; + if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */ + return CO_NOR; /* it is running */ + else if (lua_gettop(co) == 0) + return CO_DEAD; + else + return CO_SUS; /* initial state */ + } + default: /* some error occured */ + return CO_DEAD; + } +} + + +static int luaB_costatus (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + luaL_argcheck(L, co, 1, "coroutine expected"); + lua_pushstring(L, statnames[costatus(L, co)]); + return 1; +} + + +static int auxresume (lua_State *L, lua_State *co, int narg) { + int status = costatus(L, co); + if (!lua_checkstack(co, narg)) + luaL_error(L, "too many arguments to resume"); + if (status != CO_SUS) { + lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]); + return -1; /* error flag */ + } + lua_xmove(L, co, narg); + lua_setlevel(L, co); + status = lua_resume(co, narg); + if (status == 0 || status == LUA_YIELD) { + int nres = lua_gettop(co); + if (!lua_checkstack(L, nres + 1)) + luaL_error(L, "too many results to resume"); + lua_xmove(co, L, nres); /* move yielded values */ + return nres; + } + else { + lua_xmove(co, L, 1); /* move error message */ + return -1; /* error flag */ + } +} + + +static int luaB_coresume (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + int r; + luaL_argcheck(L, co, 1, "coroutine expected"); + r = auxresume(L, co, lua_gettop(L) - 1); + if (r < 0) { + lua_pushboolean(L, 0); + lua_insert(L, -2); + return 2; /* return false + error message */ + } + else { + lua_pushboolean(L, 1); + lua_insert(L, -(r + 1)); + return r + 1; /* return true + `resume' returns */ + } +} + + +static int luaB_auxwrap (lua_State *L) { + lua_State *co = lua_tothread(L, lua_upvalueindex(1)); + int r = auxresume(L, co, lua_gettop(L)); + if (r < 0) { + if (lua_isstring(L, -1)) { /* error object is a string? */ + luaL_where(L, 1); /* add extra info */ + lua_insert(L, -2); + lua_concat(L, 2); + } + lua_error(L); /* propagate error */ + } + return r; +} + + +static int luaB_cocreate (lua_State *L) { + lua_State *NL = lua_newthread(L); + luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, + "Lua function expected"); + lua_pushvalue(L, 1); /* move function to top */ + lua_xmove(L, NL, 1); /* move function from L to NL */ + return 1; +} + + +static int luaB_cowrap (lua_State *L) { + luaB_cocreate(L); + lua_pushcclosure(L, luaB_auxwrap, 1); + return 1; +} + + +static int luaB_yield (lua_State *L) { + return lua_yield(L, lua_gettop(L)); +} + + +static int luaB_corunning (lua_State *L) { + if (lua_pushthread(L)) + lua_pushnil(L); /* main thread is not a coroutine */ + return 1; +} + + +static const luaL_Reg co_funcs[] = { + {"create", luaB_cocreate}, + {"resume", luaB_coresume}, + {"running", luaB_corunning}, + {"status", luaB_costatus}, + {"wrap", luaB_cowrap}, + {"yield", luaB_yield}, + {NULL, NULL} +}; + +/* }====================================================== */ + + +static void auxopen (lua_State *L, const char *name, + lua_CFunction f, lua_CFunction u) { + lua_pushcfunction(L, u); + lua_pushcclosure(L, f, 1); + lua_setfield(L, -2, name); +} + + +static void base_open (lua_State *L) { + /* set global _G */ + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setglobal(L, "_G"); + /* open lib into global table */ + luaL_register(L, "_G", base_funcs); + lua_pushliteral(L, LUA_VERSION); + lua_setglobal(L, "_VERSION"); /* set global _VERSION */ + /* `ipairs' and `pairs' need auxiliary functions as upvalues */ + auxopen(L, "ipairs", luaB_ipairs, ipairsaux); + auxopen(L, "pairs", luaB_pairs, luaB_next); + /* `newproxy' needs a weaktable as upvalue */ + lua_createtable(L, 0, 1); /* new table `w' */ + lua_pushvalue(L, -1); /* `w' will be its own metatable */ + lua_setmetatable(L, -2); + lua_pushliteral(L, "kv"); + lua_setfield(L, -2, "__mode"); /* metatable(w).__mode = "kv" */ + lua_pushcclosure(L, luaB_newproxy, 1); + lua_setglobal(L, "newproxy"); /* set global `newproxy' */ +} + + +LUALIB_API int luaopen_base (lua_State *L) { + base_open(L); + luaL_register(L, LUA_COLIBNAME, co_funcs); + return 2; +} + diff --git a/ext/lua-5.1.5/src/lcode.c b/ext/lua-5.1.5/src/lcode.c new file mode 100644 index 000000000..679cb9cfd --- /dev/null +++ b/ext/lua-5.1.5/src/lcode.c @@ -0,0 +1,831 @@ +/* +** $Id: lcode.c,v 2.25.1.5 2011/01/31 14:53:16 roberto Exp $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + + +#include + +#define lcode_c +#define LUA_CORE + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "ltable.h" + + +#define hasjumps(e) ((e)->t != (e)->f) + + +static int isnumeral(expdesc *e) { + return (e->k == VKNUM && e->t == NO_JUMP && e->f == NO_JUMP); +} + + +void luaK_nil (FuncState *fs, int from, int n) { + Instruction *previous; + if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ + if (fs->pc == 0) { /* function start? */ + if (from >= fs->nactvar) + return; /* positions are already clean */ + } + else { + previous = &fs->f->code[fs->pc-1]; + if (GET_OPCODE(*previous) == OP_LOADNIL) { + int pfrom = GETARG_A(*previous); + int pto = GETARG_B(*previous); + if (pfrom <= from && from <= pto+1) { /* can connect both? */ + if (from+n-1 > pto) + SETARG_B(*previous, from+n-1); + return; + } + } + } + } + luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0); /* else no optimization */ +} + + +int luaK_jump (FuncState *fs) { + int jpc = fs->jpc; /* save list of jumps to here */ + int j; + fs->jpc = NO_JUMP; + j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP); + luaK_concat(fs, &j, jpc); /* keep them on hold */ + return j; +} + + +void luaK_ret (FuncState *fs, int first, int nret) { + luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); +} + + +static int condjump (FuncState *fs, OpCode op, int A, int B, int C) { + luaK_codeABC(fs, op, A, B, C); + return luaK_jump(fs); +} + + +static void fixjump (FuncState *fs, int pc, int dest) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest-(pc+1); + lua_assert(dest != NO_JUMP); + if (abs(offset) > MAXARG_sBx) + luaX_syntaxerror(fs->ls, "control structure too long"); + SETARG_sBx(*jmp, offset); +} + + +/* +** returns current `pc' and marks it as a jump target (to avoid wrong +** optimizations with consecutive instructions not in the same basic block). +*/ +int luaK_getlabel (FuncState *fs) { + fs->lasttarget = fs->pc; + return fs->pc; +} + + +static int getjump (FuncState *fs, int pc) { + int offset = GETARG_sBx(fs->f->code[pc]); + if (offset == NO_JUMP) /* point to itself represents end of list */ + return NO_JUMP; /* end of list */ + else + return (pc+1)+offset; /* turn offset into absolute position */ +} + + +static Instruction *getjumpcontrol (FuncState *fs, int pc) { + Instruction *pi = &fs->f->code[pc]; + if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) + return pi-1; + else + return pi; +} + + +/* +** check whether list has any jump that do not produce a value +** (or produce an inverted value) +*/ +static int need_value (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) { + Instruction i = *getjumpcontrol(fs, list); + if (GET_OPCODE(i) != OP_TESTSET) return 1; + } + return 0; /* not found */ +} + + +static int patchtestreg (FuncState *fs, int node, int reg) { + Instruction *i = getjumpcontrol(fs, node); + if (GET_OPCODE(*i) != OP_TESTSET) + return 0; /* cannot patch other instructions */ + if (reg != NO_REG && reg != GETARG_B(*i)) + SETARG_A(*i, reg); + else /* no register to put value or register already has the value */ + *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i)); + + return 1; +} + + +static void removevalues (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) + patchtestreg(fs, list, NO_REG); +} + + +static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, + int dtarget) { + while (list != NO_JUMP) { + int next = getjump(fs, list); + if (patchtestreg(fs, list, reg)) + fixjump(fs, list, vtarget); + else + fixjump(fs, list, dtarget); /* jump to default target */ + list = next; + } +} + + +static void dischargejpc (FuncState *fs) { + patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc); + fs->jpc = NO_JUMP; +} + + +void luaK_patchlist (FuncState *fs, int list, int target) { + if (target == fs->pc) + luaK_patchtohere(fs, list); + else { + lua_assert(target < fs->pc); + patchlistaux(fs, list, target, NO_REG, target); + } +} + + +void luaK_patchtohere (FuncState *fs, int list) { + luaK_getlabel(fs); + luaK_concat(fs, &fs->jpc, list); +} + + +void luaK_concat (FuncState *fs, int *l1, int l2) { + if (l2 == NO_JUMP) return; + else if (*l1 == NO_JUMP) + *l1 = l2; + else { + int list = *l1; + int next; + while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ + list = next; + fixjump(fs, list, l2); + } +} + + +void luaK_checkstack (FuncState *fs, int n) { + int newstack = fs->freereg + n; + if (newstack > fs->f->maxstacksize) { + if (newstack >= MAXSTACK) + luaX_syntaxerror(fs->ls, "function or expression too complex"); + fs->f->maxstacksize = cast_byte(newstack); + } +} + + +void luaK_reserveregs (FuncState *fs, int n) { + luaK_checkstack(fs, n); + fs->freereg += n; +} + + +static void freereg (FuncState *fs, int reg) { + if (!ISK(reg) && reg >= fs->nactvar) { + fs->freereg--; + lua_assert(reg == fs->freereg); + } +} + + +static void freeexp (FuncState *fs, expdesc *e) { + if (e->k == VNONRELOC) + freereg(fs, e->u.s.info); +} + + +static int addk (FuncState *fs, TValue *k, TValue *v) { + lua_State *L = fs->L; + TValue *idx = luaH_set(L, fs->h, k); + Proto *f = fs->f; + int oldsize = f->sizek; + if (ttisnumber(idx)) { + lua_assert(luaO_rawequalObj(&fs->f->k[cast_int(nvalue(idx))], v)); + return cast_int(nvalue(idx)); + } + else { /* constant not found; create a new entry */ + setnvalue(idx, cast_num(fs->nk)); + luaM_growvector(L, f->k, fs->nk, f->sizek, TValue, + MAXARG_Bx, "constant table overflow"); + while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); + setobj(L, &f->k[fs->nk], v); + luaC_barrier(L, f, v); + return fs->nk++; + } +} + + +int luaK_stringK (FuncState *fs, TString *s) { + TValue o; + setsvalue(fs->L, &o, s); + return addk(fs, &o, &o); +} + + +int luaK_numberK (FuncState *fs, lua_Number r) { + TValue o; + setnvalue(&o, r); + return addk(fs, &o, &o); +} + + +static int boolK (FuncState *fs, int b) { + TValue o; + setbvalue(&o, b); + return addk(fs, &o, &o); +} + + +static int nilK (FuncState *fs) { + TValue k, v; + setnilvalue(&v); + /* cannot use nil as key; instead use table itself to represent nil */ + sethvalue(fs->L, &k, fs->h); + return addk(fs, &k, &v); +} + + +void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { + if (e->k == VCALL) { /* expression is an open function call? */ + SETARG_C(getcode(fs, e), nresults+1); + } + else if (e->k == VVARARG) { + SETARG_B(getcode(fs, e), nresults+1); + SETARG_A(getcode(fs, e), fs->freereg); + luaK_reserveregs(fs, 1); + } +} + + +void luaK_setoneret (FuncState *fs, expdesc *e) { + if (e->k == VCALL) { /* expression is an open function call? */ + e->k = VNONRELOC; + e->u.s.info = GETARG_A(getcode(fs, e)); + } + else if (e->k == VVARARG) { + SETARG_B(getcode(fs, e), 2); + e->k = VRELOCABLE; /* can relocate its simple result */ + } +} + + +void luaK_dischargevars (FuncState *fs, expdesc *e) { + switch (e->k) { + case VLOCAL: { + e->k = VNONRELOC; + break; + } + case VUPVAL: { + e->u.s.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.s.info, 0); + e->k = VRELOCABLE; + break; + } + case VGLOBAL: { + e->u.s.info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->u.s.info); + e->k = VRELOCABLE; + break; + } + case VINDEXED: { + freereg(fs, e->u.s.aux); + freereg(fs, e->u.s.info); + e->u.s.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.s.info, e->u.s.aux); + e->k = VRELOCABLE; + break; + } + case VVARARG: + case VCALL: { + luaK_setoneret(fs, e); + break; + } + default: break; /* there is one value available (somewhere) */ + } +} + + +static int code_label (FuncState *fs, int A, int b, int jump) { + luaK_getlabel(fs); /* those instructions may be jump targets */ + return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); +} + + +static void discharge2reg (FuncState *fs, expdesc *e, int reg) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: { + luaK_nil(fs, reg, 1); + break; + } + case VFALSE: case VTRUE: { + luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); + break; + } + case VK: { + luaK_codeABx(fs, OP_LOADK, reg, e->u.s.info); + break; + } + case VKNUM: { + luaK_codeABx(fs, OP_LOADK, reg, luaK_numberK(fs, e->u.nval)); + break; + } + case VRELOCABLE: { + Instruction *pc = &getcode(fs, e); + SETARG_A(*pc, reg); + break; + } + case VNONRELOC: { + if (reg != e->u.s.info) + luaK_codeABC(fs, OP_MOVE, reg, e->u.s.info, 0); + break; + } + default: { + lua_assert(e->k == VVOID || e->k == VJMP); + return; /* nothing to do... */ + } + } + e->u.s.info = reg; + e->k = VNONRELOC; +} + + +static void discharge2anyreg (FuncState *fs, expdesc *e) { + if (e->k != VNONRELOC) { + luaK_reserveregs(fs, 1); + discharge2reg(fs, e, fs->freereg-1); + } +} + + +static void exp2reg (FuncState *fs, expdesc *e, int reg) { + discharge2reg(fs, e, reg); + if (e->k == VJMP) + luaK_concat(fs, &e->t, e->u.s.info); /* put this jump in `t' list */ + if (hasjumps(e)) { + int final; /* position after whole expression */ + int p_f = NO_JUMP; /* position of an eventual LOAD false */ + int p_t = NO_JUMP; /* position of an eventual LOAD true */ + if (need_value(fs, e->t) || need_value(fs, e->f)) { + int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); + p_f = code_label(fs, reg, 0, 1); + p_t = code_label(fs, reg, 1, 0); + luaK_patchtohere(fs, fj); + } + final = luaK_getlabel(fs); + patchlistaux(fs, e->f, final, reg, p_f); + patchlistaux(fs, e->t, final, reg, p_t); + } + e->f = e->t = NO_JUMP; + e->u.s.info = reg; + e->k = VNONRELOC; +} + + +void luaK_exp2nextreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + freeexp(fs, e); + luaK_reserveregs(fs, 1); + exp2reg(fs, e, fs->freereg - 1); +} + + +int luaK_exp2anyreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + if (e->k == VNONRELOC) { + if (!hasjumps(e)) return e->u.s.info; /* exp is already in a register */ + if (e->u.s.info >= fs->nactvar) { /* reg. is not a local? */ + exp2reg(fs, e, e->u.s.info); /* put value on it */ + return e->u.s.info; + } + } + luaK_exp2nextreg(fs, e); /* default */ + return e->u.s.info; +} + + +void luaK_exp2val (FuncState *fs, expdesc *e) { + if (hasjumps(e)) + luaK_exp2anyreg(fs, e); + else + luaK_dischargevars(fs, e); +} + + +int luaK_exp2RK (FuncState *fs, expdesc *e) { + luaK_exp2val(fs, e); + switch (e->k) { + case VKNUM: + case VTRUE: + case VFALSE: + case VNIL: { + if (fs->nk <= MAXINDEXRK) { /* constant fit in RK operand? */ + e->u.s.info = (e->k == VNIL) ? nilK(fs) : + (e->k == VKNUM) ? luaK_numberK(fs, e->u.nval) : + boolK(fs, (e->k == VTRUE)); + e->k = VK; + return RKASK(e->u.s.info); + } + else break; + } + case VK: { + if (e->u.s.info <= MAXINDEXRK) /* constant fit in argC? */ + return RKASK(e->u.s.info); + else break; + } + default: break; + } + /* not a constant in the right range: put it in a register */ + return luaK_exp2anyreg(fs, e); +} + + +void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { + switch (var->k) { + case VLOCAL: { + freeexp(fs, ex); + exp2reg(fs, ex, var->u.s.info); + return; + } + case VUPVAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABC(fs, OP_SETUPVAL, e, var->u.s.info, 0); + break; + } + case VGLOBAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABx(fs, OP_SETGLOBAL, e, var->u.s.info); + break; + } + case VINDEXED: { + int e = luaK_exp2RK(fs, ex); + luaK_codeABC(fs, OP_SETTABLE, var->u.s.info, var->u.s.aux, e); + break; + } + default: { + lua_assert(0); /* invalid var kind to store */ + break; + } + } + freeexp(fs, ex); +} + + +void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { + int func; + luaK_exp2anyreg(fs, e); + freeexp(fs, e); + func = fs->freereg; + luaK_reserveregs(fs, 2); + luaK_codeABC(fs, OP_SELF, func, e->u.s.info, luaK_exp2RK(fs, key)); + freeexp(fs, key); + e->u.s.info = func; + e->k = VNONRELOC; +} + + +static void invertjump (FuncState *fs, expdesc *e) { + Instruction *pc = getjumpcontrol(fs, e->u.s.info); + lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && + GET_OPCODE(*pc) != OP_TEST); + SETARG_A(*pc, !(GETARG_A(*pc))); +} + + +static int jumponcond (FuncState *fs, expdesc *e, int cond) { + if (e->k == VRELOCABLE) { + Instruction ie = getcode(fs, e); + if (GET_OPCODE(ie) == OP_NOT) { + fs->pc--; /* remove previous OP_NOT */ + return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond); + } + /* else go through */ + } + discharge2anyreg(fs, e); + freeexp(fs, e); + return condjump(fs, OP_TESTSET, NO_REG, e->u.s.info, cond); +} + + +void luaK_goiftrue (FuncState *fs, expdesc *e) { + int pc; /* pc of last jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VK: case VKNUM: case VTRUE: { + pc = NO_JUMP; /* always true; do nothing */ + break; + } + case VJMP: { + invertjump(fs, e); + pc = e->u.s.info; + break; + } + default: { + pc = jumponcond(fs, e, 0); + break; + } + } + luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */ + luaK_patchtohere(fs, e->t); + e->t = NO_JUMP; +} + + +static void luaK_goiffalse (FuncState *fs, expdesc *e) { + int pc; /* pc of last jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: case VFALSE: { + pc = NO_JUMP; /* always false; do nothing */ + break; + } + case VJMP: { + pc = e->u.s.info; + break; + } + default: { + pc = jumponcond(fs, e, 1); + break; + } + } + luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */ + luaK_patchtohere(fs, e->f); + e->f = NO_JUMP; +} + + +static void codenot (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: case VFALSE: { + e->k = VTRUE; + break; + } + case VK: case VKNUM: case VTRUE: { + e->k = VFALSE; + break; + } + case VJMP: { + invertjump(fs, e); + break; + } + case VRELOCABLE: + case VNONRELOC: { + discharge2anyreg(fs, e); + freeexp(fs, e); + e->u.s.info = luaK_codeABC(fs, OP_NOT, 0, e->u.s.info, 0); + e->k = VRELOCABLE; + break; + } + default: { + lua_assert(0); /* cannot happen */ + break; + } + } + /* interchange true and false lists */ + { int temp = e->f; e->f = e->t; e->t = temp; } + removevalues(fs, e->f); + removevalues(fs, e->t); +} + + +void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + t->u.s.aux = luaK_exp2RK(fs, k); + t->k = VINDEXED; +} + + +static int constfolding (OpCode op, expdesc *e1, expdesc *e2) { + lua_Number v1, v2, r; + if (!isnumeral(e1) || !isnumeral(e2)) return 0; + v1 = e1->u.nval; + v2 = e2->u.nval; + switch (op) { + case OP_ADD: r = luai_numadd(v1, v2); break; + case OP_SUB: r = luai_numsub(v1, v2); break; + case OP_MUL: r = luai_nummul(v1, v2); break; + case OP_DIV: + if (v2 == 0) return 0; /* do not attempt to divide by 0 */ + r = luai_numdiv(v1, v2); break; + case OP_MOD: + if (v2 == 0) return 0; /* do not attempt to divide by 0 */ + r = luai_nummod(v1, v2); break; + case OP_POW: r = luai_numpow(v1, v2); break; + case OP_UNM: r = luai_numunm(v1); break; + case OP_LEN: return 0; /* no constant folding for 'len' */ + default: lua_assert(0); r = 0; break; + } + if (luai_numisnan(r)) return 0; /* do not attempt to produce NaN */ + e1->u.nval = r; + return 1; +} + + +static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { + if (constfolding(op, e1, e2)) + return; + else { + int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; + int o1 = luaK_exp2RK(fs, e1); + if (o1 > o2) { + freeexp(fs, e1); + freeexp(fs, e2); + } + else { + freeexp(fs, e2); + freeexp(fs, e1); + } + e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2); + e1->k = VRELOCABLE; + } +} + + +static void codecomp (FuncState *fs, OpCode op, int cond, expdesc *e1, + expdesc *e2) { + int o1 = luaK_exp2RK(fs, e1); + int o2 = luaK_exp2RK(fs, e2); + freeexp(fs, e2); + freeexp(fs, e1); + if (cond == 0 && op != OP_EQ) { + int temp; /* exchange args to replace by `<' or `<=' */ + temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */ + cond = 1; + } + e1->u.s.info = condjump(fs, op, cond, o1, o2); + e1->k = VJMP; +} + + +void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) { + expdesc e2; + e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; + switch (op) { + case OPR_MINUS: { + if (!isnumeral(e)) + luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */ + codearith(fs, OP_UNM, e, &e2); + break; + } + case OPR_NOT: codenot(fs, e); break; + case OPR_LEN: { + luaK_exp2anyreg(fs, e); /* cannot operate on constants */ + codearith(fs, OP_LEN, e, &e2); + break; + } + default: lua_assert(0); + } +} + + +void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { + switch (op) { + case OPR_AND: { + luaK_goiftrue(fs, v); + break; + } + case OPR_OR: { + luaK_goiffalse(fs, v); + break; + } + case OPR_CONCAT: { + luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ + break; + } + case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: + case OPR_MOD: case OPR_POW: { + if (!isnumeral(v)) luaK_exp2RK(fs, v); + break; + } + default: { + luaK_exp2RK(fs, v); + break; + } + } +} + + +void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { + switch (op) { + case OPR_AND: { + lua_assert(e1->t == NO_JUMP); /* list must be closed */ + luaK_dischargevars(fs, e2); + luaK_concat(fs, &e2->f, e1->f); + *e1 = *e2; + break; + } + case OPR_OR: { + lua_assert(e1->f == NO_JUMP); /* list must be closed */ + luaK_dischargevars(fs, e2); + luaK_concat(fs, &e2->t, e1->t); + *e1 = *e2; + break; + } + case OPR_CONCAT: { + luaK_exp2val(fs, e2); + if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) { + lua_assert(e1->u.s.info == GETARG_B(getcode(fs, e2))-1); + freeexp(fs, e1); + SETARG_B(getcode(fs, e2), e1->u.s.info); + e1->k = VRELOCABLE; e1->u.s.info = e2->u.s.info; + } + else { + luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ + codearith(fs, OP_CONCAT, e1, e2); + } + break; + } + case OPR_ADD: codearith(fs, OP_ADD, e1, e2); break; + case OPR_SUB: codearith(fs, OP_SUB, e1, e2); break; + case OPR_MUL: codearith(fs, OP_MUL, e1, e2); break; + case OPR_DIV: codearith(fs, OP_DIV, e1, e2); break; + case OPR_MOD: codearith(fs, OP_MOD, e1, e2); break; + case OPR_POW: codearith(fs, OP_POW, e1, e2); break; + case OPR_EQ: codecomp(fs, OP_EQ, 1, e1, e2); break; + case OPR_NE: codecomp(fs, OP_EQ, 0, e1, e2); break; + case OPR_LT: codecomp(fs, OP_LT, 1, e1, e2); break; + case OPR_LE: codecomp(fs, OP_LE, 1, e1, e2); break; + case OPR_GT: codecomp(fs, OP_LT, 0, e1, e2); break; + case OPR_GE: codecomp(fs, OP_LE, 0, e1, e2); break; + default: lua_assert(0); + } +} + + +void luaK_fixline (FuncState *fs, int line) { + fs->f->lineinfo[fs->pc - 1] = line; +} + + +static int luaK_code (FuncState *fs, Instruction i, int line) { + Proto *f = fs->f; + dischargejpc(fs); /* `pc' will change */ + /* put new instruction in code array */ + luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, + MAX_INT, "code size overflow"); + f->code[fs->pc] = i; + /* save corresponding line information */ + luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int, + MAX_INT, "code size overflow"); + f->lineinfo[fs->pc] = line; + return fs->pc++; +} + + +int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { + lua_assert(getOpMode(o) == iABC); + lua_assert(getBMode(o) != OpArgN || b == 0); + lua_assert(getCMode(o) != OpArgN || c == 0); + return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline); +} + + +int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { + lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); + lua_assert(getCMode(o) == OpArgN); + return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline); +} + + +void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { + int c = (nelems - 1)/LFIELDS_PER_FLUSH + 1; + int b = (tostore == LUA_MULTRET) ? 0 : tostore; + lua_assert(tostore != 0); + if (c <= MAXARG_C) + luaK_codeABC(fs, OP_SETLIST, base, b, c); + else { + luaK_codeABC(fs, OP_SETLIST, base, b, 0); + luaK_code(fs, cast(Instruction, c), fs->ls->lastline); + } + fs->freereg = base + 1; /* free registers with list values */ +} + diff --git a/ext/lua-5.1.5/src/lcode.h b/ext/lua-5.1.5/src/lcode.h new file mode 100644 index 000000000..b941c6072 --- /dev/null +++ b/ext/lua-5.1.5/src/lcode.h @@ -0,0 +1,76 @@ +/* +** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lcode_h +#define lcode_h + +#include "llex.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" + + +/* +** Marks the end of a patch list. It is an invalid value both as an absolute +** address, and as a list link (would link an element to itself). +*/ +#define NO_JUMP (-1) + + +/* +** grep "ORDER OPR" if you change these enums +*/ +typedef enum BinOpr { + OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, + OPR_CONCAT, + OPR_NE, OPR_EQ, + OPR_LT, OPR_LE, OPR_GT, OPR_GE, + OPR_AND, OPR_OR, + OPR_NOBINOPR +} BinOpr; + + +typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; + + +#define getcode(fs,e) ((fs)->f->code[(e)->u.s.info]) + +#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) + +#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) + +LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); +LUAI_FUNC int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); +LUAI_FUNC void luaK_fixline (FuncState *fs, int line); +LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); +LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); +LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); +LUAI_FUNC int luaK_stringK (FuncState *fs, TString *s); +LUAI_FUNC int luaK_numberK (FuncState *fs, lua_Number r); +LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2RK (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_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); +LUAI_FUNC int luaK_jump (FuncState *fs); +LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); +LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); +LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); +LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); +LUAI_FUNC int luaK_getlabel (FuncState *fs); +LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v); +LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); +LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2); +LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); + + +#endif diff --git a/ext/lua-5.1.5/src/ldblib.c b/ext/lua-5.1.5/src/ldblib.c new file mode 100644 index 000000000..2027eda59 --- /dev/null +++ b/ext/lua-5.1.5/src/ldblib.c @@ -0,0 +1,398 @@ +/* +** $Id: ldblib.c,v 1.104.1.4 2009/08/04 18:50:18 roberto Exp $ +** Interface from Lua to its debug API +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#define ldblib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + +static int db_getregistry (lua_State *L) { + lua_pushvalue(L, LUA_REGISTRYINDEX); + return 1; +} + + +static int db_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); /* no metatable */ + } + return 1; +} + + +static int db_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, + "nil or table expected"); + lua_settop(L, 2); + lua_pushboolean(L, lua_setmetatable(L, 1)); + return 1; +} + + +static int db_getfenv (lua_State *L) { + luaL_checkany(L, 1); + lua_getfenv(L, 1); + return 1; +} + + +static int db_setfenv (lua_State *L) { + luaL_checktype(L, 2, LUA_TTABLE); + lua_settop(L, 2); + if (lua_setfenv(L, 1) == 0) + luaL_error(L, LUA_QL("setfenv") + " cannot change environment of given object"); + return 1; +} + + +static void settabss (lua_State *L, const char *i, const char *v) { + lua_pushstring(L, v); + lua_setfield(L, -2, i); +} + + +static void settabsi (lua_State *L, const char *i, int v) { + lua_pushinteger(L, v); + lua_setfield(L, -2, i); +} + + +static lua_State *getthread (lua_State *L, int *arg) { + if (lua_isthread(L, 1)) { + *arg = 1; + return lua_tothread(L, 1); + } + else { + *arg = 0; + return L; + } +} + + +static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { + if (L == L1) { + lua_pushvalue(L, -2); + lua_remove(L, -3); + } + else + lua_xmove(L1, L, 1); + lua_setfield(L, -2, fname); +} + + +static int db_getinfo (lua_State *L) { + lua_Debug ar; + int arg; + lua_State *L1 = getthread(L, &arg); + const char *options = luaL_optstring(L, arg+2, "flnSu"); + if (lua_isnumber(L, arg+1)) { + if (!lua_getstack(L1, (int)lua_tointeger(L, arg+1), &ar)) { + lua_pushnil(L); /* level out of range */ + return 1; + } + } + else if (lua_isfunction(L, arg+1)) { + lua_pushfstring(L, ">%s", options); + options = lua_tostring(L, -1); + lua_pushvalue(L, arg+1); + lua_xmove(L, L1, 1); + } + else + return luaL_argerror(L, arg+1, "function or level expected"); + if (!lua_getinfo(L1, options, &ar)) + return luaL_argerror(L, arg+2, "invalid option"); + lua_createtable(L, 0, 2); + if (strchr(options, 'S')) { + settabss(L, "source", ar.source); + settabss(L, "short_src", ar.short_src); + settabsi(L, "linedefined", ar.linedefined); + settabsi(L, "lastlinedefined", ar.lastlinedefined); + settabss(L, "what", ar.what); + } + if (strchr(options, 'l')) + settabsi(L, "currentline", ar.currentline); + if (strchr(options, 'u')) + settabsi(L, "nups", ar.nups); + if (strchr(options, 'n')) { + settabss(L, "name", ar.name); + settabss(L, "namewhat", ar.namewhat); + } + if (strchr(options, 'L')) + treatstackoption(L, L1, "activelines"); + if (strchr(options, 'f')) + treatstackoption(L, L1, "func"); + return 1; /* return table */ +} + + +static int db_getlocal (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + const char *name; + if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + name = lua_getlocal(L1, &ar, luaL_checkint(L, arg+2)); + if (name) { + lua_xmove(L1, L, 1); + lua_pushstring(L, name); + lua_pushvalue(L, -2); + return 2; + } + else { + lua_pushnil(L); + return 1; + } +} + + +static int db_setlocal (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + if (!lua_getstack(L1, luaL_checkint(L, arg+1), &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + luaL_checkany(L, arg+3); + lua_settop(L, arg+3); + lua_xmove(L, L1, 1); + lua_pushstring(L, lua_setlocal(L1, &ar, luaL_checkint(L, arg+2))); + return 1; +} + + +static int auxupvalue (lua_State *L, int get) { + const char *name; + int n = luaL_checkint(L, 2); + luaL_checktype(L, 1, LUA_TFUNCTION); + if (lua_iscfunction(L, 1)) return 0; /* cannot touch C upvalues from Lua */ + name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); + if (name == NULL) return 0; + lua_pushstring(L, name); + lua_insert(L, -(get+1)); + return get + 1; +} + + +static int db_getupvalue (lua_State *L) { + return auxupvalue(L, 1); +} + + +static int db_setupvalue (lua_State *L) { + luaL_checkany(L, 3); + return auxupvalue(L, 0); +} + + + +static const char KEY_HOOK = 'h'; + + +static void hookf (lua_State *L, lua_Debug *ar) { + static const char *const hooknames[] = + {"call", "return", "line", "count", "tail return"}; + lua_pushlightuserdata(L, (void *)&KEY_HOOK); + lua_rawget(L, LUA_REGISTRYINDEX); + lua_pushlightuserdata(L, L); + lua_rawget(L, -2); + if (lua_isfunction(L, -1)) { + lua_pushstring(L, hooknames[(int)ar->event]); + if (ar->currentline >= 0) + lua_pushinteger(L, ar->currentline); + else lua_pushnil(L); + lua_assert(lua_getinfo(L, "lS", ar)); + lua_call(L, 2, 0); + } +} + + +static int makemask (const char *smask, int count) { + 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; + return mask; +} + + +static char *unmakemask (int mask, char *smask) { + int i = 0; + if (mask & LUA_MASKCALL) smask[i++] = 'c'; + if (mask & LUA_MASKRET) smask[i++] = 'r'; + if (mask & LUA_MASKLINE) smask[i++] = 'l'; + smask[i] = '\0'; + return smask; +} + + +static void gethooktable (lua_State *L) { + lua_pushlightuserdata(L, (void *)&KEY_HOOK); + lua_rawget(L, LUA_REGISTRYINDEX); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + lua_createtable(L, 0, 1); + lua_pushlightuserdata(L, (void *)&KEY_HOOK); + lua_pushvalue(L, -2); + lua_rawset(L, LUA_REGISTRYINDEX); + } +} + + +static int db_sethook (lua_State *L) { + int arg, mask, count; + lua_Hook func; + lua_State *L1 = getthread(L, &arg); + if (lua_isnoneornil(L, arg+1)) { + lua_settop(L, arg+1); + func = NULL; mask = 0; count = 0; /* turn off hooks */ + } + else { + const char *smask = luaL_checkstring(L, arg+2); + luaL_checktype(L, arg+1, LUA_TFUNCTION); + count = luaL_optint(L, arg+3, 0); + func = hookf; mask = makemask(smask, count); + } + gethooktable(L); + lua_pushlightuserdata(L, L1); + lua_pushvalue(L, arg+1); + lua_rawset(L, -3); /* set new hook */ + lua_pop(L, 1); /* remove hook table */ + lua_sethook(L1, func, mask, count); /* set hooks */ + return 0; +} + + +static int db_gethook (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + char buff[5]; + int mask = lua_gethookmask(L1); + lua_Hook hook = lua_gethook(L1); + if (hook != NULL && hook != hookf) /* external hook? */ + lua_pushliteral(L, "external hook"); + else { + gethooktable(L); + lua_pushlightuserdata(L, L1); + lua_rawget(L, -2); /* get hook */ + lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); + lua_pushinteger(L, lua_gethookcount(L1)); + return 3; +} + + +static int db_debug (lua_State *L) { + for (;;) { + char buffer[250]; + fputs("lua_debug> ", stderr); + if (fgets(buffer, sizeof(buffer), stdin) == 0 || + strcmp(buffer, "cont\n") == 0) + return 0; + if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || + lua_pcall(L, 0, 0, 0)) { + fputs(lua_tostring(L, -1), stderr); + fputs("\n", stderr); + } + lua_settop(L, 0); /* remove eventual returns */ + } +} + + +#define LEVELS1 12 /* size of the first part of the stack */ +#define LEVELS2 10 /* size of the second part of the stack */ + +static int db_errorfb (lua_State *L) { + int level; + int firstpart = 1; /* still before eventual `...' */ + int arg; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + if (lua_isnumber(L, arg+2)) { + level = (int)lua_tointeger(L, arg+2); + lua_pop(L, 1); + } + else + level = (L == L1) ? 1 : 0; /* level 0 may be this own function */ + if (lua_gettop(L) == arg) + lua_pushliteral(L, ""); + else if (!lua_isstring(L, arg+1)) return 1; /* message is not a string */ + else lua_pushliteral(L, "\n"); + lua_pushliteral(L, "stack traceback:"); + while (lua_getstack(L1, level++, &ar)) { + if (level > LEVELS1 && firstpart) { + /* no more than `LEVELS2' more levels? */ + if (!lua_getstack(L1, level+LEVELS2, &ar)) + level--; /* keep going */ + else { + lua_pushliteral(L, "\n\t..."); /* too many levels */ + while (lua_getstack(L1, level+LEVELS2, &ar)) /* find last levels */ + level++; + } + firstpart = 0; + continue; + } + lua_pushliteral(L, "\n\t"); + lua_getinfo(L1, "Snl", &ar); + lua_pushfstring(L, "%s:", ar.short_src); + if (ar.currentline > 0) + lua_pushfstring(L, "%d:", ar.currentline); + if (*ar.namewhat != '\0') /* is there a name? */ + lua_pushfstring(L, " in function " LUA_QS, ar.name); + else { + if (*ar.what == 'm') /* main? */ + lua_pushfstring(L, " in main chunk"); + else if (*ar.what == 'C' || *ar.what == 't') + lua_pushliteral(L, " ?"); /* C function or tail call */ + else + lua_pushfstring(L, " in function <%s:%d>", + ar.short_src, ar.linedefined); + } + lua_concat(L, lua_gettop(L) - arg); + } + lua_concat(L, lua_gettop(L) - arg); + return 1; +} + + +static const luaL_Reg dblib[] = { + {"debug", db_debug}, + {"getfenv", db_getfenv}, + {"gethook", db_gethook}, + {"getinfo", db_getinfo}, + {"getlocal", db_getlocal}, + {"getregistry", db_getregistry}, + {"getmetatable", db_getmetatable}, + {"getupvalue", db_getupvalue}, + {"setfenv", db_setfenv}, + {"sethook", db_sethook}, + {"setlocal", db_setlocal}, + {"setmetatable", db_setmetatable}, + {"setupvalue", db_setupvalue}, + {"traceback", db_errorfb}, + {NULL, NULL} +}; + + +LUALIB_API int luaopen_debug (lua_State *L) { + luaL_register(L, LUA_DBLIBNAME, dblib); + return 1; +} + diff --git a/ext/lua-5.1.5/src/ldebug.c b/ext/lua-5.1.5/src/ldebug.c new file mode 100644 index 000000000..50ad3d380 --- /dev/null +++ b/ext/lua-5.1.5/src/ldebug.c @@ -0,0 +1,638 @@ +/* +** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $ +** Debug Interface +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + + +#define ldebug_c +#define LUA_CORE + +#include "lua.h" + +#include "lapi.h" +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); + + +static int currentpc (lua_State *L, CallInfo *ci) { + if (!isLua(ci)) return -1; /* function is not a Lua function? */ + if (ci == L->ci) + ci->savedpc = L->savedpc; + return pcRel(ci->savedpc, ci_func(ci)->l.p); +} + + +static int currentline (lua_State *L, CallInfo *ci) { + int pc = currentpc(L, ci); + if (pc < 0) + return -1; /* only active lua functions have current-line information */ + else + return getline(ci_func(ci)->l.p, pc); +} + + +/* +** this function can be called asynchronous (e.g. during a signal) +*/ +LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { + if (func == NULL || mask == 0) { /* turn off hooks? */ + mask = 0; + func = NULL; + } + L->hook = func; + L->basehookcount = count; + resethookcount(L); + L->hookmask = cast_byte(mask); + return 1; +} + + +LUA_API lua_Hook lua_gethook (lua_State *L) { + return L->hook; +} + + +LUA_API int lua_gethookmask (lua_State *L) { + return L->hookmask; +} + + +LUA_API int lua_gethookcount (lua_State *L) { + return L->basehookcount; +} + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { + int status; + CallInfo *ci; + lua_lock(L); + for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { + level--; + if (f_isLua(ci)) /* Lua function? */ + level -= ci->tailcalls; /* skip lost tail calls */ + } + if (level == 0 && ci > L->base_ci) { /* level found? */ + status = 1; + ar->i_ci = cast_int(ci - L->base_ci); + } + else if (level < 0) { /* level is of a lost tail call? */ + status = 1; + ar->i_ci = 0; + } + else status = 0; /* no such level */ + lua_unlock(L); + return status; +} + + +static Proto *getluaproto (CallInfo *ci) { + return (isLua(ci) ? ci_func(ci)->l.p : NULL); +} + + +static const char *findlocal (lua_State *L, CallInfo *ci, int n) { + const char *name; + Proto *fp = getluaproto(ci); + if (fp && (name = luaF_getlocalname(fp, n, currentpc(L, ci))) != NULL) + return name; /* is a local variable in a Lua function */ + else { + StkId limit = (ci == L->ci) ? L->top : (ci+1)->func; + if (limit - ci->base >= n && n > 0) /* is 'n' inside 'ci' stack? */ + return "(*temporary)"; + else + return NULL; + } +} + + +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { + CallInfo *ci = L->base_ci + ar->i_ci; + const char *name = findlocal(L, ci, n); + lua_lock(L); + if (name) + luaA_pushobject(L, ci->base + (n - 1)); + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + CallInfo *ci = L->base_ci + ar->i_ci; + const char *name = findlocal(L, ci, n); + lua_lock(L); + if (name) + setobjs2s(L, ci->base + (n - 1), L->top - 1); + L->top--; /* pop value */ + lua_unlock(L); + return name; +} + + +static void funcinfo (lua_Debug *ar, Closure *cl) { + if (cl->c.isC) { + ar->source = "=[C]"; + ar->linedefined = -1; + ar->lastlinedefined = -1; + ar->what = "C"; + } + else { + ar->source = getstr(cl->l.p->source); + ar->linedefined = cl->l.p->linedefined; + ar->lastlinedefined = cl->l.p->lastlinedefined; + ar->what = (ar->linedefined == 0) ? "main" : "Lua"; + } + luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); +} + + +static void info_tailcall (lua_Debug *ar) { + ar->name = ar->namewhat = ""; + ar->what = "tail"; + ar->lastlinedefined = ar->linedefined = ar->currentline = -1; + ar->source = "=(tail call)"; + luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); + ar->nups = 0; +} + + +static void collectvalidlines (lua_State *L, Closure *f) { + if (f == NULL || f->c.isC) { + setnilvalue(L->top); + } + else { + Table *t = luaH_new(L, 0, 0); + int *lineinfo = f->l.p->lineinfo; + int i; + for (i=0; il.p->sizelineinfo; i++) + setbvalue(luaH_setnum(L, t, lineinfo[i]), 1); + sethvalue(L, L->top, t); + } + incr_top(L); +} + + +static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, + Closure *f, CallInfo *ci) { + int status = 1; + if (f == NULL) { + info_tailcall(ar); + return status; + } + for (; *what; what++) { + switch (*what) { + case 'S': { + funcinfo(ar, f); + break; + } + case 'l': { + ar->currentline = (ci) ? currentline(L, ci) : -1; + break; + } + case 'u': { + ar->nups = f->c.nupvalues; + break; + } + case 'n': { + ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL; + if (ar->namewhat == NULL) { + ar->namewhat = ""; /* not found */ + ar->name = NULL; + } + break; + } + case 'L': + case 'f': /* handled by lua_getinfo */ + break; + default: status = 0; /* invalid option */ + } + } + return status; +} + + +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { + int status; + Closure *f = NULL; + CallInfo *ci = NULL; + lua_lock(L); + if (*what == '>') { + StkId func = L->top - 1; + luai_apicheck(L, ttisfunction(func)); + what++; /* skip the '>' */ + f = clvalue(func); + L->top--; /* pop function */ + } + else if (ar->i_ci != 0) { /* no tail call? */ + ci = L->base_ci + ar->i_ci; + lua_assert(ttisfunction(ci->func)); + f = clvalue(ci->func); + } + status = auxgetinfo(L, what, ar, f, ci); + if (strchr(what, 'f')) { + if (f == NULL) setnilvalue(L->top); + else setclvalue(L, L->top, f); + incr_top(L); + } + if (strchr(what, 'L')) + collectvalidlines(L, f); + lua_unlock(L); + return status; +} + + +/* +** {====================================================== +** Symbolic Execution and code checker +** ======================================================= +*/ + +#define check(x) if (!(x)) return 0; + +#define checkjump(pt,pc) check(0 <= pc && pc < pt->sizecode) + +#define checkreg(pt,reg) check((reg) < (pt)->maxstacksize) + + + +static int precheck (const Proto *pt) { + check(pt->maxstacksize <= MAXSTACK); + check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); + check(!(pt->is_vararg & VARARG_NEEDSARG) || + (pt->is_vararg & VARARG_HASARG)); + check(pt->sizeupvalues <= pt->nups); + check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); + check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); + return 1; +} + + +#define checkopenop(pt,pc) luaG_checkopenop((pt)->code[(pc)+1]) + +int luaG_checkopenop (Instruction i) { + switch (GET_OPCODE(i)) { + case OP_CALL: + case OP_TAILCALL: + case OP_RETURN: + case OP_SETLIST: { + check(GETARG_B(i) == 0); + return 1; + } + default: return 0; /* invalid instruction after an open call */ + } +} + + +static int checkArgMode (const Proto *pt, int r, enum OpArgMask mode) { + switch (mode) { + case OpArgN: check(r == 0); break; + case OpArgU: break; + case OpArgR: checkreg(pt, r); break; + case OpArgK: + check(ISK(r) ? INDEXK(r) < pt->sizek : r < pt->maxstacksize); + break; + } + return 1; +} + + +static Instruction symbexec (const Proto *pt, int lastpc, int reg) { + int pc; + int last; /* stores position of last instruction that changed `reg' */ + last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */ + check(precheck(pt)); + for (pc = 0; pc < lastpc; pc++) { + Instruction i = pt->code[pc]; + OpCode op = GET_OPCODE(i); + int a = GETARG_A(i); + int b = 0; + int c = 0; + check(op < NUM_OPCODES); + checkreg(pt, a); + switch (getOpMode(op)) { + case iABC: { + b = GETARG_B(i); + c = GETARG_C(i); + check(checkArgMode(pt, b, getBMode(op))); + check(checkArgMode(pt, c, getCMode(op))); + break; + } + case iABx: { + b = GETARG_Bx(i); + if (getBMode(op) == OpArgK) check(b < pt->sizek); + break; + } + case iAsBx: { + b = GETARG_sBx(i); + if (getBMode(op) == OpArgR) { + int dest = pc+1+b; + check(0 <= dest && dest < pt->sizecode); + if (dest > 0) { + int j; + /* check that it does not jump to a setlist count; this + is tricky, because the count from a previous setlist may + have the same value of an invalid setlist; so, we must + go all the way back to the first of them (if any) */ + for (j = 0; j < dest; j++) { + Instruction d = pt->code[dest-1-j]; + if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break; + } + /* if 'j' is even, previous value is not a setlist (even if + it looks like one) */ + check((j&1) == 0); + } + } + break; + } + } + if (testAMode(op)) { + if (a == reg) last = pc; /* change register `a' */ + } + if (testTMode(op)) { + check(pc+2 < pt->sizecode); /* check skip */ + check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); + } + switch (op) { + case OP_LOADBOOL: { + if (c == 1) { /* does it jump? */ + check(pc+2 < pt->sizecode); /* check its jump */ + check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST || + GETARG_C(pt->code[pc+1]) != 0); + } + break; + } + case OP_LOADNIL: { + if (a <= reg && reg <= b) + last = pc; /* set registers from `a' to `b' */ + break; + } + case OP_GETUPVAL: + case OP_SETUPVAL: { + check(b < pt->nups); + break; + } + case OP_GETGLOBAL: + case OP_SETGLOBAL: { + check(ttisstring(&pt->k[b])); + break; + } + case OP_SELF: { + checkreg(pt, a+1); + if (reg == a+1) last = pc; + break; + } + case OP_CONCAT: { + check(b < c); /* at least two operands */ + break; + } + case OP_TFORLOOP: { + check(c >= 1); /* at least one result (control variable) */ + checkreg(pt, a+2+c); /* space for results */ + if (reg >= a+2) last = pc; /* affect all regs above its base */ + break; + } + case OP_FORLOOP: + case OP_FORPREP: + checkreg(pt, a+3); + /* go through */ + case OP_JMP: { + int dest = pc+1+b; + /* not full check and jump is forward and do not skip `lastpc'? */ + if (reg != NO_REG && pc < dest && dest <= lastpc) + pc += b; /* do the jump */ + break; + } + case OP_CALL: + case OP_TAILCALL: { + if (b != 0) { + checkreg(pt, a+b-1); + } + c--; /* c = num. returns */ + if (c == LUA_MULTRET) { + check(checkopenop(pt, pc)); + } + else if (c != 0) + checkreg(pt, a+c-1); + if (reg >= a) last = pc; /* affect all registers above base */ + break; + } + case OP_RETURN: { + b--; /* b = num. returns */ + if (b > 0) checkreg(pt, a+b-1); + break; + } + case OP_SETLIST: { + if (b > 0) checkreg(pt, a + b); + if (c == 0) { + pc++; + check(pc < pt->sizecode - 1); + } + break; + } + case OP_CLOSURE: { + int nup, j; + check(b < pt->sizep); + nup = pt->p[b]->nups; + check(pc + nup < pt->sizecode); + for (j = 1; j <= nup; j++) { + OpCode op1 = GET_OPCODE(pt->code[pc + j]); + check(op1 == OP_GETUPVAL || op1 == OP_MOVE); + } + if (reg != NO_REG) /* tracing? */ + pc += nup; /* do not 'execute' these pseudo-instructions */ + break; + } + case OP_VARARG: { + check((pt->is_vararg & VARARG_ISVARARG) && + !(pt->is_vararg & VARARG_NEEDSARG)); + b--; + if (b == LUA_MULTRET) check(checkopenop(pt, pc)); + checkreg(pt, a+b-1); + break; + } + default: break; + } + } + return pt->code[last]; +} + +#undef check +#undef checkjump +#undef checkreg + +/* }====================================================== */ + + +int luaG_checkcode (const Proto *pt) { + return (symbexec(pt, pt->sizecode, NO_REG) != 0); +} + + +static const char *kname (Proto *p, int c) { + if (ISK(c) && ttisstring(&p->k[INDEXK(c)])) + return svalue(&p->k[INDEXK(c)]); + else + return "?"; +} + + +static const char *getobjname (lua_State *L, CallInfo *ci, int stackpos, + const char **name) { + if (isLua(ci)) { /* a Lua function? */ + Proto *p = ci_func(ci)->l.p; + int pc = currentpc(L, ci); + Instruction i; + *name = luaF_getlocalname(p, stackpos+1, pc); + if (*name) /* is a local? */ + return "local"; + i = symbexec(p, pc, stackpos); /* try symbolic execution */ + lua_assert(pc != -1); + switch (GET_OPCODE(i)) { + case OP_GETGLOBAL: { + int g = GETARG_Bx(i); /* global index */ + lua_assert(ttisstring(&p->k[g])); + *name = svalue(&p->k[g]); + return "global"; + } + case OP_MOVE: { + int a = GETARG_A(i); + int b = GETARG_B(i); /* move from `b' to `a' */ + if (b < a) + return getobjname(L, ci, b, name); /* get name for `b' */ + break; + } + case OP_GETTABLE: { + int k = GETARG_C(i); /* key index */ + *name = kname(p, k); + return "field"; + } + case OP_GETUPVAL: { + int u = GETARG_B(i); /* upvalue index */ + *name = p->upvalues ? getstr(p->upvalues[u]) : "?"; + return "upvalue"; + } + case OP_SELF: { + int k = GETARG_C(i); /* key index */ + *name = kname(p, k); + return "method"; + } + default: break; + } + } + return NULL; /* no useful name found */ +} + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { + Instruction i; + if ((isLua(ci) && ci->tailcalls > 0) || !isLua(ci - 1)) + return NULL; /* calling function is not Lua (or is unknown) */ + ci--; /* calling function */ + i = ci_func(ci)->l.p->code[currentpc(L, ci)]; + if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL || + GET_OPCODE(i) == OP_TFORLOOP) + return getobjname(L, ci, GETARG_A(i), name); + else + return NULL; /* no useful name can be found */ +} + + +/* only ANSI way to check whether a pointer points to an array */ +static int isinstack (CallInfo *ci, const TValue *o) { + StkId p; + for (p = ci->base; p < ci->top; p++) + if (o == p) return 1; + return 0; +} + + +void luaG_typeerror (lua_State *L, const TValue *o, const char *op) { + const char *name = NULL; + const char *t = luaT_typenames[ttype(o)]; + const char *kind = (isinstack(L->ci, o)) ? + getobjname(L, L->ci, cast_int(o - L->base), &name) : + NULL; + if (kind) + luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)", + op, kind, name, t); + else + luaG_runerror(L, "attempt to %s a %s value", op, t); +} + + +void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { + if (ttisstring(p1) || ttisnumber(p1)) p1 = p2; + lua_assert(!ttisstring(p1) && !ttisnumber(p1)); + luaG_typeerror(L, p1, "concatenate"); +} + + +void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) { + TValue temp; + if (luaV_tonumber(p1, &temp) == NULL) + p2 = p1; /* first operand is wrong */ + luaG_typeerror(L, p2, "perform arithmetic on"); +} + + +int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { + const char *t1 = luaT_typenames[ttype(p1)]; + const char *t2 = luaT_typenames[ttype(p2)]; + if (t1[2] == t2[2]) + luaG_runerror(L, "attempt to compare two %s values", t1); + else + luaG_runerror(L, "attempt to compare %s with %s", t1, t2); + return 0; +} + + +static void addinfo (lua_State *L, const char *msg) { + CallInfo *ci = L->ci; + if (isLua(ci)) { /* is Lua code? */ + char buff[LUA_IDSIZE]; /* add file:line information */ + int line = currentline(L, ci); + luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE); + luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); + } +} + + +void luaG_errormsg (lua_State *L) { + if (L->errfunc != 0) { /* is there an error handling function? */ + StkId errfunc = restorestack(L, L->errfunc); + if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR); + setobjs2s(L, L->top, L->top - 1); /* move argument */ + setobjs2s(L, L->top - 1, errfunc); /* push function */ + incr_top(L); + luaD_call(L, L->top - 2, 1); /* call it */ + } + luaD_throw(L, LUA_ERRRUN); +} + + +void luaG_runerror (lua_State *L, const char *fmt, ...) { + va_list argp; + va_start(argp, fmt); + addinfo(L, luaO_pushvfstring(L, fmt, argp)); + va_end(argp); + luaG_errormsg(L); +} + diff --git a/ext/lua-5.1.5/src/ldebug.h b/ext/lua-5.1.5/src/ldebug.h new file mode 100644 index 000000000..ba28a9724 --- /dev/null +++ b/ext/lua-5.1.5/src/ldebug.h @@ -0,0 +1,33 @@ +/* +** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions from Debug Interface module +** See Copyright Notice in lua.h +*/ + +#ifndef ldebug_h +#define ldebug_h + + +#include "lstate.h" + + +#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1) + +#define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0) + +#define resethookcount(L) (L->hookcount = L->basehookcount) + + +LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o, + const char *opname); +LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2); +LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...); +LUAI_FUNC void luaG_errormsg (lua_State *L); +LUAI_FUNC int luaG_checkcode (const Proto *pt); +LUAI_FUNC int luaG_checkopenop (Instruction i); + +#endif diff --git a/ext/lua-5.1.5/src/ldo.c b/ext/lua-5.1.5/src/ldo.c new file mode 100644 index 000000000..d1bf786cb --- /dev/null +++ b/ext/lua-5.1.5/src/ldo.c @@ -0,0 +1,519 @@ +/* +** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 roberto Exp $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#define ldo_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" +#include "lzio.h" + + + + +/* +** {====================================================== +** Error-recovery functions +** ======================================================= +*/ + + +/* 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: { + setsvalue2s(L, oldtop, luaS_newliteral(L, MEMERRMSG)); + break; + } + case LUA_ERRERR: { + setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); + break; + } + case LUA_ERRSYNTAX: + case LUA_ERRRUN: { + setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ + break; + } + } + L->top = oldtop + 1; +} + + +static void restore_stack_limit (lua_State *L) { + lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); + if (L->size_ci > LUAI_MAXCALLS) { /* there was an overflow? */ + int inuse = cast_int(L->ci - L->base_ci); + if (inuse + 1 < LUAI_MAXCALLS) /* can `undo' overflow? */ + luaD_reallocCI(L, LUAI_MAXCALLS); + } +} + + +static void resetstack (lua_State *L, int status) { + L->ci = L->base_ci; + L->base = L->ci->base; + luaF_close(L, L->base); /* close eventual pending closures */ + luaD_seterrorobj(L, status, L->base); + L->nCcalls = L->baseCcalls; + L->allowhook = 1; + restore_stack_limit(L); + L->errfunc = 0; + L->errorJmp = NULL; +} + + +void luaD_throw (lua_State *L, int errcode) { + if (L->errorJmp) { + L->errorJmp->status = errcode; + LUAI_THROW(L, L->errorJmp); + } + else { + L->status = cast_byte(errcode); + if (G(L)->panic) { + resetstack(L, errcode); + lua_unlock(L); + G(L)->panic(L); + } + exit(EXIT_FAILURE); + } +} + + +int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { + struct lua_longjmp lj; + lj.status = 0; + lj.previous = L->errorJmp; /* chain new error handler */ + L->errorJmp = &lj; + LUAI_TRY(L, &lj, + (*f)(L, ud); + ); + L->errorJmp = lj.previous; /* restore old error handler */ + return lj.status; +} + +/* }====================================================== */ + + +static void correctstack (lua_State *L, TValue *oldstack) { + CallInfo *ci; + GCObject *up; + L->top = (L->top - oldstack) + L->stack; + for (up = L->openupval; up != NULL; up = up->gch.next) + gco2uv(up)->v = (gco2uv(up)->v - oldstack) + L->stack; + for (ci = L->base_ci; ci <= L->ci; ci++) { + ci->top = (ci->top - oldstack) + L->stack; + ci->base = (ci->base - oldstack) + L->stack; + ci->func = (ci->func - oldstack) + L->stack; + } + L->base = (L->base - oldstack) + L->stack; +} + + +void luaD_reallocstack (lua_State *L, int newsize) { + TValue *oldstack = L->stack; + int realsize = newsize + 1 + EXTRA_STACK; + lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK - 1); + luaM_reallocvector(L, L->stack, L->stacksize, realsize, TValue); + L->stacksize = realsize; + L->stack_last = L->stack+newsize; + correctstack(L, oldstack); +} + + +void luaD_reallocCI (lua_State *L, int newsize) { + CallInfo *oldci = L->base_ci; + luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo); + L->size_ci = newsize; + L->ci = (L->ci - oldci) + L->base_ci; + L->end_ci = L->base_ci + L->size_ci - 1; +} + + +void luaD_growstack (lua_State *L, int n) { + if (n <= L->stacksize) /* double size is enough? */ + luaD_reallocstack(L, 2*L->stacksize); + else + luaD_reallocstack(L, L->stacksize + n); +} + + +static CallInfo *growCI (lua_State *L) { + if (L->size_ci > LUAI_MAXCALLS) /* overflow while handling overflow? */ + luaD_throw(L, LUA_ERRERR); + else { + luaD_reallocCI(L, 2*L->size_ci); + if (L->size_ci > LUAI_MAXCALLS) + luaG_runerror(L, "stack overflow"); + } + return ++L->ci; +} + + +void luaD_callhook (lua_State *L, int event, int line) { + lua_Hook hook = L->hook; + if (hook && L->allowhook) { + ptrdiff_t top = savestack(L, L->top); + ptrdiff_t ci_top = savestack(L, L->ci->top); + lua_Debug ar; + ar.event = event; + ar.currentline = line; + if (event == LUA_HOOKTAILRET) + ar.i_ci = 0; /* tail call; no debug information about it */ + else + ar.i_ci = cast_int(L->ci - L->base_ci); + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + L->ci->top = L->top + LUA_MINSTACK; + lua_assert(L->ci->top <= L->stack_last); + L->allowhook = 0; /* cannot call hooks inside a hook */ + lua_unlock(L); + (*hook)(L, &ar); + lua_lock(L); + lua_assert(!L->allowhook); + L->allowhook = 1; + L->ci->top = restorestack(L, ci_top); + L->top = restorestack(L, top); + } +} + + +static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { + int i; + int nfixargs = p->numparams; + Table *htab = NULL; + StkId base, fixed; + for (; actual < nfixargs; ++actual) + setnilvalue(L->top++); +#if defined(LUA_COMPAT_VARARG) + if (p->is_vararg & VARARG_NEEDSARG) { /* compat. with old-style vararg? */ + int nvar = actual - nfixargs; /* number of extra arguments */ + lua_assert(p->is_vararg & VARARG_HASARG); + luaC_checkGC(L); + luaD_checkstack(L, p->maxstacksize); + htab = luaH_new(L, nvar, 1); /* create `arg' table */ + for (i=0; itop - nvar + i); + /* store counter in field `n' */ + setnvalue(luaH_setstr(L, htab, luaS_newliteral(L, "n")), cast_num(nvar)); + } +#endif + /* move fixed parameters to final position */ + fixed = L->top - actual; /* first fixed argument */ + base = L->top; /* final position of first argument */ + for (i=0; itop++, fixed+i); + setnilvalue(fixed+i); + } + /* add `arg' parameter */ + if (htab) { + sethvalue(L, L->top++, htab); + lua_assert(iswhite(obj2gco(htab))); + } + return base; +} + + +static StkId tryfuncTM (lua_State *L, StkId func) { + const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL); + StkId p; + ptrdiff_t funcr = savestack(L, func); + if (!ttisfunction(tm)) + luaG_typeerror(L, func, "call"); + /* Open a hole inside the stack at `func' */ + for (p = L->top; p > func; p--) setobjs2s(L, p, p-1); + incr_top(L); + func = restorestack(L, funcr); /* previous call may change stack */ + setobj2s(L, func, tm); /* tag method is the new function to be called */ + return func; +} + + + +#define inc_ci(L) \ + ((L->ci == L->end_ci) ? growCI(L) : \ + (condhardstacktests(luaD_reallocCI(L, L->size_ci)), ++L->ci)) + + +int luaD_precall (lua_State *L, StkId func, int nresults) { + LClosure *cl; + ptrdiff_t funcr; + if (!ttisfunction(func)) /* `func' is not a function? */ + func = tryfuncTM(L, func); /* check the `function' tag method */ + funcr = savestack(L, func); + cl = &clvalue(func)->l; + L->ci->savedpc = L->savedpc; + if (!cl->isC) { /* Lua function? prepare its call */ + CallInfo *ci; + StkId st, base; + Proto *p = cl->p; + luaD_checkstack(L, p->maxstacksize); + func = restorestack(L, funcr); + if (!p->is_vararg) { /* no varargs? */ + base = func + 1; + if (L->top > base + p->numparams) + L->top = base + p->numparams; + } + else { /* vararg function */ + int nargs = cast_int(L->top - func) - 1; + base = adjust_varargs(L, p, nargs); + func = restorestack(L, funcr); /* previous call may change the stack */ + } + ci = inc_ci(L); /* now `enter' new function */ + ci->func = func; + L->base = ci->base = base; + ci->top = L->base + p->maxstacksize; + lua_assert(ci->top <= L->stack_last); + L->savedpc = p->code; /* starting point */ + ci->tailcalls = 0; + ci->nresults = nresults; + for (st = L->top; st < ci->top; st++) + setnilvalue(st); + L->top = ci->top; + if (L->hookmask & LUA_MASKCALL) { + L->savedpc++; /* hooks assume 'pc' is already incremented */ + luaD_callhook(L, LUA_HOOKCALL, -1); + L->savedpc--; /* correct 'pc' */ + } + return PCRLUA; + } + else { /* if is a C function, call it */ + CallInfo *ci; + int n; + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + ci = inc_ci(L); /* now `enter' new function */ + ci->func = restorestack(L, funcr); + L->base = ci->base = ci->func + 1; + ci->top = L->top + LUA_MINSTACK; + lua_assert(ci->top <= L->stack_last); + ci->nresults = nresults; + if (L->hookmask & LUA_MASKCALL) + luaD_callhook(L, LUA_HOOKCALL, -1); + lua_unlock(L); + n = (*curr_func(L)->c.f)(L); /* do the actual call */ + lua_lock(L); + if (n < 0) /* yielding? */ + return PCRYIELD; + else { + luaD_poscall(L, L->top - n); + return PCRC; + } + } +} + + +static StkId callrethooks (lua_State *L, StkId firstResult) { + ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ + luaD_callhook(L, LUA_HOOKRET, -1); + if (f_isLua(L->ci)) { /* Lua function? */ + while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */ + luaD_callhook(L, LUA_HOOKTAILRET, -1); + } + return restorestack(L, fr); +} + + +int luaD_poscall (lua_State *L, StkId firstResult) { + StkId res; + int wanted, i; + CallInfo *ci; + if (L->hookmask & LUA_MASKRET) + firstResult = callrethooks(L, firstResult); + ci = L->ci--; + res = ci->func; /* res == final position of 1st result */ + wanted = ci->nresults; + L->base = (ci - 1)->base; /* restore base */ + L->savedpc = (ci - 1)->savedpc; /* restore savedpc */ + /* move results to correct place */ + for (i = wanted; i != 0 && firstResult < L->top; i--) + setobjs2s(L, res++, firstResult++); + while (i-- > 0) + setnilvalue(res++); + L->top = res; + return (wanted - LUA_MULTRET); /* 0 iff wanted == LUA_MULTRET */ +} + + +/* +** Call a function (C or Lua). The function to be called is at *func. +** The arguments are on the stack, right after the function. +** When returns, all the results are on the stack, starting at the original +** function position. +*/ +void luaD_call (lua_State *L, StkId func, int nResults) { + if (++L->nCcalls >= LUAI_MAXCCALLS) { + if (L->nCcalls == LUAI_MAXCCALLS) + luaG_runerror(L, "C stack overflow"); + else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3))) + luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ + } + if (luaD_precall(L, func, nResults) == PCRLUA) /* is a Lua function? */ + luaV_execute(L, 1); /* call it */ + L->nCcalls--; + luaC_checkGC(L); +} + + +static void resume (lua_State *L, void *ud) { + StkId firstArg = cast(StkId, ud); + CallInfo *ci = L->ci; + if (L->status == 0) { /* start coroutine? */ + lua_assert(ci == L->base_ci && firstArg > L->base); + if (luaD_precall(L, firstArg - 1, LUA_MULTRET) != PCRLUA) + return; + } + else { /* resuming from previous yield */ + lua_assert(L->status == LUA_YIELD); + L->status = 0; + if (!f_isLua(ci)) { /* `common' yield? */ + /* finish interrupted execution of `OP_CALL' */ + lua_assert(GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_CALL || + GET_OPCODE(*((ci-1)->savedpc - 1)) == OP_TAILCALL); + if (luaD_poscall(L, firstArg)) /* complete it... */ + L->top = L->ci->top; /* and correct top if not multiple results */ + } + else /* yielded inside a hook: just continue its execution */ + L->base = L->ci->base; + } + luaV_execute(L, cast_int(L->ci - L->base_ci)); +} + + +static int resume_error (lua_State *L, const char *msg) { + L->top = L->ci->base; + setsvalue2s(L, L->top, luaS_new(L, msg)); + incr_top(L); + lua_unlock(L); + return LUA_ERRRUN; +} + + +LUA_API int lua_resume (lua_State *L, int nargs) { + int status; + lua_lock(L); + if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci)) + return resume_error(L, "cannot resume non-suspended coroutine"); + if (L->nCcalls >= LUAI_MAXCCALLS) + return resume_error(L, "C stack overflow"); + luai_userstateresume(L, nargs); + lua_assert(L->errfunc == 0); + L->baseCcalls = ++L->nCcalls; + status = luaD_rawrunprotected(L, resume, L->top - nargs); + if (status != 0) { /* error? */ + L->status = cast_byte(status); /* mark thread as `dead' */ + luaD_seterrorobj(L, status, L->top); + L->ci->top = L->top; + } + else { + lua_assert(L->nCcalls == L->baseCcalls); + status = L->status; + } + --L->nCcalls; + lua_unlock(L); + return status; +} + + +LUA_API int lua_yield (lua_State *L, int nresults) { + luai_userstateyield(L, nresults); + lua_lock(L); + if (L->nCcalls > L->baseCcalls) + luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); + L->base = L->top - nresults; /* protect stack slots below */ + L->status = LUA_YIELD; + lua_unlock(L); + return -1; +} + + +int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t old_top, ptrdiff_t ef) { + int status; + unsigned short oldnCcalls = L->nCcalls; + ptrdiff_t old_ci = saveci(L, L->ci); + lu_byte old_allowhooks = L->allowhook; + ptrdiff_t old_errfunc = L->errfunc; + L->errfunc = ef; + status = luaD_rawrunprotected(L, func, u); + if (status != 0) { /* an error occurred? */ + StkId oldtop = restorestack(L, old_top); + luaF_close(L, oldtop); /* close eventual pending closures */ + luaD_seterrorobj(L, status, oldtop); + L->nCcalls = oldnCcalls; + L->ci = restoreci(L, old_ci); + L->base = L->ci->base; + L->savedpc = L->ci->savedpc; + L->allowhook = old_allowhooks; + restore_stack_limit(L); + } + L->errfunc = old_errfunc; + return status; +} + + + +/* +** Execute a protected parser. +*/ +struct SParser { /* data to `f_parser' */ + ZIO *z; + Mbuffer buff; /* buffer to be used by the scanner */ + const char *name; +}; + +static void f_parser (lua_State *L, void *ud) { + int i; + Proto *tf; + Closure *cl; + struct SParser *p = cast(struct SParser *, ud); + int c = luaZ_lookahead(p->z); + luaC_checkGC(L); + tf = ((c == LUA_SIGNATURE[0]) ? luaU_undump : luaY_parser)(L, p->z, + &p->buff, p->name); + cl = luaF_newLclosure(L, tf->nups, hvalue(gt(L))); + cl->l.p = tf; + for (i = 0; i < tf->nups; i++) /* initialize eventual upvalues */ + cl->l.upvals[i] = luaF_newupval(L); + setclvalue(L, L->top, cl); + incr_top(L); +} + + +int luaD_protectedparser (lua_State *L, ZIO *z, const char *name) { + struct SParser p; + int status; + p.z = z; p.name = name; + luaZ_initbuffer(L, &p.buff); + status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); + luaZ_freebuffer(L, &p.buff); + return status; +} + + diff --git a/ext/lua-5.1.5/src/ldo.h b/ext/lua-5.1.5/src/ldo.h new file mode 100644 index 000000000..98fddac59 --- /dev/null +++ b/ext/lua-5.1.5/src/ldo.h @@ -0,0 +1,57 @@ +/* +** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#ifndef ldo_h +#define ldo_h + + +#include "lobject.h" +#include "lstate.h" +#include "lzio.h" + + +#define luaD_checkstack(L,n) \ + if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TValue)) \ + luaD_growstack(L, n); \ + else condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); + + +#define incr_top(L) {luaD_checkstack(L,1); L->top++;} + +#define savestack(L,p) ((char *)(p) - (char *)L->stack) +#define restorestack(L,n) ((TValue *)((char *)L->stack + (n))) + +#define saveci(L,p) ((char *)(p) - (char *)L->base_ci) +#define restoreci(L,n) ((CallInfo *)((char *)L->base_ci + (n))) + + +/* results from luaD_precall */ +#define PCRLUA 0 /* initiated a call to a Lua function */ +#define PCRC 1 /* did a call to a C function */ +#define PCRYIELD 2 /* C funtion yielded */ + + +/* type of protected functions, to be ran by `runprotected' */ +typedef void (*Pfunc) (lua_State *L, void *ud); + +LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name); +LUAI_FUNC void luaD_callhook (lua_State *L, int event, int line); +LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults); +LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); +LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t oldtop, ptrdiff_t ef); +LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult); +LUAI_FUNC void luaD_reallocCI (lua_State *L, int newsize); +LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); +LUAI_FUNC void luaD_growstack (lua_State *L, int n); + +LUAI_FUNC void luaD_throw (lua_State *L, int errcode); +LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); + +LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); + +#endif + diff --git a/ext/lua-5.1.5/src/ldump.c b/ext/lua-5.1.5/src/ldump.c new file mode 100644 index 000000000..c9d3d4870 --- /dev/null +++ b/ext/lua-5.1.5/src/ldump.c @@ -0,0 +1,164 @@ +/* +** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ +** save precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#include + +#define ldump_c +#define LUA_CORE + +#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; + +#define DumpMem(b,n,size,D) DumpBlock(b,(n)*(size),D) +#define DumpVar(x,D) DumpMem(&x,1,sizeof(x),D) + +static void DumpBlock(const void* b, size_t size, DumpState* D) +{ + if (D->status==0) + { + lua_unlock(D->L); + D->status=(*D->writer)(D->L,b,size,D->data); + lua_lock(D->L); + } +} + +static void DumpChar(int y, DumpState* D) +{ + char x=(char)y; + DumpVar(x,D); +} + +static void DumpInt(int x, DumpState* D) +{ + DumpVar(x,D); +} + +static void DumpNumber(lua_Number x, DumpState* D) +{ + DumpVar(x,D); +} + +static void DumpVector(const void* b, int n, size_t size, DumpState* D) +{ + DumpInt(n,D); + DumpMem(b,n,size,D); +} + +static void DumpString(const TString* s, DumpState* D) +{ + if (s==NULL || getstr(s)==NULL) + { + size_t size=0; + DumpVar(size,D); + } + else + { + size_t size=s->tsv.len+1; /* include trailing '\0' */ + DumpVar(size,D); + DumpBlock(getstr(s),size,D); + } +} + +#define DumpCode(f,D) DumpVector(f->code,f->sizecode,sizeof(Instruction),D) + +static void DumpFunction(const Proto* f, const TString* p, DumpState* D); + +static void DumpConstants(const Proto* f, DumpState* D) +{ + int i,n=f->sizek; + DumpInt(n,D); + for (i=0; ik[i]; + DumpChar(ttype(o),D); + switch (ttype(o)) + { + case LUA_TNIL: + break; + case LUA_TBOOLEAN: + DumpChar(bvalue(o),D); + break; + case LUA_TNUMBER: + DumpNumber(nvalue(o),D); + break; + case LUA_TSTRING: + DumpString(rawtsvalue(o),D); + break; + default: + lua_assert(0); /* cannot happen */ + break; + } + } + n=f->sizep; + DumpInt(n,D); + for (i=0; ip[i],f->source,D); +} + +static void DumpDebug(const Proto* f, DumpState* D) +{ + int i,n; + n= (D->strip) ? 0 : f->sizelineinfo; + DumpVector(f->lineinfo,n,sizeof(int),D); + n= (D->strip) ? 0 : f->sizelocvars; + DumpInt(n,D); + for (i=0; ilocvars[i].varname,D); + DumpInt(f->locvars[i].startpc,D); + DumpInt(f->locvars[i].endpc,D); + } + n= (D->strip) ? 0 : f->sizeupvalues; + DumpInt(n,D); + for (i=0; iupvalues[i],D); +} + +static void DumpFunction(const Proto* f, const TString* p, DumpState* D) +{ + DumpString((f->source==p || D->strip) ? NULL : f->source,D); + DumpInt(f->linedefined,D); + DumpInt(f->lastlinedefined,D); + DumpChar(f->nups,D); + DumpChar(f->numparams,D); + DumpChar(f->is_vararg,D); + DumpChar(f->maxstacksize,D); + DumpCode(f,D); + DumpConstants(f,D); + DumpDebug(f,D); +} + +static void DumpHeader(DumpState* D) +{ + char h[LUAC_HEADERSIZE]; + luaU_header(h); + DumpBlock(h,LUAC_HEADERSIZE,D); +} + +/* +** 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); + DumpFunction(f,NULL,&D); + return D.status; +} diff --git a/ext/lua-5.1.5/src/lfunc.c b/ext/lua-5.1.5/src/lfunc.c new file mode 100644 index 000000000..813e88f58 --- /dev/null +++ b/ext/lua-5.1.5/src/lfunc.c @@ -0,0 +1,174 @@ +/* +** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + + +#include + +#define lfunc_c +#define LUA_CORE + +#include "lua.h" + +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e) { + Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); + luaC_link(L, obj2gco(c), LUA_TFUNCTION); + c->c.isC = 1; + c->c.env = e; + c->c.nupvalues = cast_byte(nelems); + return c; +} + + +Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e) { + Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems))); + luaC_link(L, obj2gco(c), LUA_TFUNCTION); + c->l.isC = 0; + c->l.env = e; + c->l.nupvalues = cast_byte(nelems); + while (nelems--) c->l.upvals[nelems] = NULL; + return c; +} + + +UpVal *luaF_newupval (lua_State *L) { + UpVal *uv = luaM_new(L, UpVal); + luaC_link(L, obj2gco(uv), LUA_TUPVAL); + uv->v = &uv->u.value; + setnilvalue(uv->v); + return uv; +} + + +UpVal *luaF_findupval (lua_State *L, StkId level) { + global_State *g = G(L); + GCObject **pp = &L->openupval; + UpVal *p; + UpVal *uv; + while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) { + lua_assert(p->v != &p->u.value); + if (p->v == level) { /* found a corresponding upvalue? */ + if (isdead(g, obj2gco(p))) /* is it dead? */ + changewhite(obj2gco(p)); /* ressurect it */ + return p; + } + pp = &p->next; + } + uv = luaM_new(L, UpVal); /* not found: create a new one */ + uv->tt = LUA_TUPVAL; + uv->marked = luaC_white(g); + uv->v = level; /* current value lives in the stack */ + uv->next = *pp; /* chain it in the proper position */ + *pp = obj2gco(uv); + uv->u.l.prev = &g->uvhead; /* double link it in `uvhead' list */ + uv->u.l.next = g->uvhead.u.l.next; + uv->u.l.next->u.l.prev = uv; + g->uvhead.u.l.next = uv; + lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); + return uv; +} + + +static void unlinkupval (UpVal *uv) { + lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); + uv->u.l.next->u.l.prev = uv->u.l.prev; /* remove from `uvhead' list */ + uv->u.l.prev->u.l.next = uv->u.l.next; +} + + +void luaF_freeupval (lua_State *L, UpVal *uv) { + if (uv->v != &uv->u.value) /* is it open? */ + unlinkupval(uv); /* remove from open list */ + luaM_free(L, uv); /* free upvalue */ +} + + +void luaF_close (lua_State *L, StkId level) { + UpVal *uv; + global_State *g = G(L); + while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) { + GCObject *o = obj2gco(uv); + lua_assert(!isblack(o) && uv->v != &uv->u.value); + L->openupval = uv->next; /* remove from `open' list */ + if (isdead(g, o)) + luaF_freeupval(L, uv); /* free upvalue */ + else { + unlinkupval(uv); + setobj(L, &uv->u.value, uv->v); + uv->v = &uv->u.value; /* now current value lives here */ + luaC_linkupval(L, uv); /* link upvalue into `gcroot' list */ + } + } +} + + +Proto *luaF_newproto (lua_State *L) { + Proto *f = luaM_new(L, Proto); + luaC_link(L, obj2gco(f), LUA_TPROTO); + f->k = NULL; + f->sizek = 0; + f->p = NULL; + f->sizep = 0; + f->code = NULL; + f->sizecode = 0; + f->sizelineinfo = 0; + f->sizeupvalues = 0; + f->nups = 0; + f->upvalues = NULL; + f->numparams = 0; + f->is_vararg = 0; + f->maxstacksize = 0; + f->lineinfo = NULL; + f->sizelocvars = 0; + f->locvars = NULL; + f->linedefined = 0; + f->lastlinedefined = 0; + f->source = NULL; + return f; +} + + +void luaF_freeproto (lua_State *L, Proto *f) { + luaM_freearray(L, f->code, f->sizecode, Instruction); + luaM_freearray(L, f->p, f->sizep, Proto *); + luaM_freearray(L, f->k, f->sizek, TValue); + luaM_freearray(L, f->lineinfo, f->sizelineinfo, int); + luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); + luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *); + luaM_free(L, f); +} + + +void luaF_freeclosure (lua_State *L, Closure *c) { + int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) : + sizeLclosure(c->l.nupvalues); + luaM_freemem(L, c, size); +} + + +/* +** Look for n-th local variable at line `line' in function `func'. +** Returns NULL if not found. +*/ +const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { + int i; + for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { + if (pc < f->locvars[i].endpc) { /* is variable active? */ + local_number--; + if (local_number == 0) + return getstr(f->locvars[i].varname); + } + } + return NULL; /* not found */ +} + diff --git a/ext/lua-5.1.5/src/lfunc.h b/ext/lua-5.1.5/src/lfunc.h new file mode 100644 index 000000000..a68cf5151 --- /dev/null +++ b/ext/lua-5.1.5/src/lfunc.h @@ -0,0 +1,34 @@ +/* +** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#ifndef lfunc_h +#define lfunc_h + + +#include "lobject.h" + + +#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ + cast(int, sizeof(TValue)*((n)-1))) + +#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ + cast(int, sizeof(TValue *)*((n)-1))) + + +LUAI_FUNC Proto *luaF_newproto (lua_State *L); +LUAI_FUNC Closure *luaF_newCclosure (lua_State *L, int nelems, Table *e); +LUAI_FUNC Closure *luaF_newLclosure (lua_State *L, int nelems, Table *e); +LUAI_FUNC UpVal *luaF_newupval (lua_State *L); +LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); +LUAI_FUNC void luaF_close (lua_State *L, StkId level); +LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); +LUAI_FUNC void luaF_freeclosure (lua_State *L, Closure *c); +LUAI_FUNC void luaF_freeupval (lua_State *L, UpVal *uv); +LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, + int pc); + + +#endif diff --git a/ext/lua-5.1.5/src/lgc.c b/ext/lua-5.1.5/src/lgc.c new file mode 100644 index 000000000..e909c79a9 --- /dev/null +++ b/ext/lua-5.1.5/src/lgc.c @@ -0,0 +1,710 @@ +/* +** $Id: lgc.c,v 2.38.1.2 2011/03/18 18:05:38 roberto Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#include + +#define lgc_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +#define GCSTEPSIZE 1024u +#define GCSWEEPMAX 40 +#define GCSWEEPCOST 10 +#define GCFINALIZECOST 100 + + +#define maskmarks cast_byte(~(bitmask(BLACKBIT)|WHITEBITS)) + +#define makewhite(g,x) \ + ((x)->gch.marked = cast_byte(((x)->gch.marked & maskmarks) | luaC_white(g))) + +#define white2gray(x) reset2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) +#define black2gray(x) resetbit((x)->gch.marked, BLACKBIT) + +#define stringmark(s) reset2bits((s)->tsv.marked, WHITE0BIT, WHITE1BIT) + + +#define isfinalized(u) testbit((u)->marked, FINALIZEDBIT) +#define markfinalized(u) l_setbit((u)->marked, FINALIZEDBIT) + + +#define KEYWEAK bitmask(KEYWEAKBIT) +#define VALUEWEAK bitmask(VALUEWEAKBIT) + + + +#define markvalue(g,o) { checkconsistency(o); \ + if (iscollectable(o) && iswhite(gcvalue(o))) reallymarkobject(g,gcvalue(o)); } + +#define markobject(g,t) { if (iswhite(obj2gco(t))) \ + reallymarkobject(g, obj2gco(t)); } + + +#define setthreshold(g) (g->GCthreshold = (g->estimate/100) * g->gcpause) + + +static void removeentry (Node *n) { + lua_assert(ttisnil(gval(n))); + if (iscollectable(gkey(n))) + setttype(gkey(n), LUA_TDEADKEY); /* dead key; remove it */ +} + + +static void reallymarkobject (global_State *g, GCObject *o) { + lua_assert(iswhite(o) && !isdead(g, o)); + white2gray(o); + switch (o->gch.tt) { + case LUA_TSTRING: { + return; + } + case LUA_TUSERDATA: { + Table *mt = gco2u(o)->metatable; + gray2black(o); /* udata are never gray */ + if (mt) markobject(g, mt); + markobject(g, gco2u(o)->env); + return; + } + case LUA_TUPVAL: { + UpVal *uv = gco2uv(o); + markvalue(g, uv->v); + if (uv->v == &uv->u.value) /* closed? */ + gray2black(o); /* open upvalues are never black */ + return; + } + case LUA_TFUNCTION: { + gco2cl(o)->c.gclist = g->gray; + g->gray = o; + break; + } + case LUA_TTABLE: { + gco2h(o)->gclist = g->gray; + g->gray = o; + break; + } + case LUA_TTHREAD: { + gco2th(o)->gclist = g->gray; + g->gray = o; + break; + } + case LUA_TPROTO: { + gco2p(o)->gclist = g->gray; + g->gray = o; + break; + } + default: lua_assert(0); + } +} + + +static void marktmu (global_State *g) { + GCObject *u = g->tmudata; + if (u) { + do { + u = u->gch.next; + makewhite(g, u); /* may be marked, if left from previous GC */ + reallymarkobject(g, u); + } while (u != g->tmudata); + } +} + + +/* move `dead' udata that need finalization to list `tmudata' */ +size_t luaC_separateudata (lua_State *L, int all) { + global_State *g = G(L); + size_t deadmem = 0; + GCObject **p = &g->mainthread->next; + GCObject *curr; + while ((curr = *p) != NULL) { + if (!(iswhite(curr) || all) || isfinalized(gco2u(curr))) + p = &curr->gch.next; /* don't bother with them */ + else if (fasttm(L, gco2u(curr)->metatable, TM_GC) == NULL) { + markfinalized(gco2u(curr)); /* don't need finalization */ + p = &curr->gch.next; + } + else { /* must call its gc method */ + deadmem += sizeudata(gco2u(curr)); + markfinalized(gco2u(curr)); + *p = curr->gch.next; + /* link `curr' at the end of `tmudata' list */ + if (g->tmudata == NULL) /* list is empty? */ + g->tmudata = curr->gch.next = curr; /* creates a circular list */ + else { + curr->gch.next = g->tmudata->gch.next; + g->tmudata->gch.next = curr; + g->tmudata = curr; + } + } + } + return deadmem; +} + + +static int traversetable (global_State *g, Table *h) { + int i; + int weakkey = 0; + int weakvalue = 0; + const TValue *mode; + if (h->metatable) + markobject(g, h->metatable); + mode = gfasttm(g, h->metatable, TM_MODE); + if (mode && ttisstring(mode)) { /* is there a weak mode? */ + weakkey = (strchr(svalue(mode), 'k') != NULL); + weakvalue = (strchr(svalue(mode), 'v') != NULL); + if (weakkey || weakvalue) { /* is really weak? */ + h->marked &= ~(KEYWEAK | VALUEWEAK); /* clear bits */ + h->marked |= cast_byte((weakkey << KEYWEAKBIT) | + (weakvalue << VALUEWEAKBIT)); + h->gclist = g->weak; /* must be cleared after GC, ... */ + g->weak = obj2gco(h); /* ... so put in the appropriate list */ + } + } + if (weakkey && weakvalue) return 1; + if (!weakvalue) { + i = h->sizearray; + while (i--) + markvalue(g, &h->array[i]); + } + i = sizenode(h); + while (i--) { + Node *n = gnode(h, i); + lua_assert(ttype(gkey(n)) != LUA_TDEADKEY || ttisnil(gval(n))); + if (ttisnil(gval(n))) + removeentry(n); /* remove empty entries */ + else { + lua_assert(!ttisnil(gkey(n))); + if (!weakkey) markvalue(g, gkey(n)); + if (!weakvalue) markvalue(g, gval(n)); + } + } + return weakkey || weakvalue; +} + + +/* +** All marks are conditional because a GC may happen while the +** prototype is still being created +*/ +static void traverseproto (global_State *g, Proto *f) { + int i; + if (f->source) stringmark(f->source); + for (i=0; isizek; i++) /* mark literals */ + markvalue(g, &f->k[i]); + for (i=0; isizeupvalues; i++) { /* mark upvalue names */ + if (f->upvalues[i]) + stringmark(f->upvalues[i]); + } + for (i=0; isizep; i++) { /* mark nested protos */ + if (f->p[i]) + markobject(g, f->p[i]); + } + for (i=0; isizelocvars; i++) { /* mark local-variable names */ + if (f->locvars[i].varname) + stringmark(f->locvars[i].varname); + } +} + + + +static void traverseclosure (global_State *g, Closure *cl) { + markobject(g, cl->c.env); + if (cl->c.isC) { + int i; + for (i=0; ic.nupvalues; i++) /* mark its upvalues */ + markvalue(g, &cl->c.upvalue[i]); + } + else { + int i; + lua_assert(cl->l.nupvalues == cl->l.p->nups); + markobject(g, cl->l.p); + for (i=0; il.nupvalues; i++) /* mark its upvalues */ + markobject(g, cl->l.upvals[i]); + } +} + + +static void checkstacksizes (lua_State *L, StkId max) { + int ci_used = cast_int(L->ci - L->base_ci); /* number of `ci' in use */ + int s_used = cast_int(max - L->stack); /* part of stack in use */ + if (L->size_ci > LUAI_MAXCALLS) /* handling overflow? */ + return; /* do not touch the stacks */ + if (4*ci_used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci) + luaD_reallocCI(L, L->size_ci/2); /* still big enough... */ + condhardstacktests(luaD_reallocCI(L, ci_used + 1)); + if (4*s_used < L->stacksize && + 2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize) + luaD_reallocstack(L, L->stacksize/2); /* still big enough... */ + condhardstacktests(luaD_reallocstack(L, s_used)); +} + + +static void traversestack (global_State *g, lua_State *l) { + StkId o, lim; + CallInfo *ci; + markvalue(g, gt(l)); + lim = l->top; + for (ci = l->base_ci; ci <= l->ci; ci++) { + lua_assert(ci->top <= l->stack_last); + if (lim < ci->top) lim = ci->top; + } + for (o = l->stack; o < l->top; o++) + markvalue(g, o); + for (; o <= lim; o++) + setnilvalue(o); + checkstacksizes(l, lim); +} + + +/* +** traverse one gray object, turning it to black. +** Returns `quantity' traversed. +*/ +static l_mem propagatemark (global_State *g) { + GCObject *o = g->gray; + lua_assert(isgray(o)); + gray2black(o); + switch (o->gch.tt) { + case LUA_TTABLE: { + Table *h = gco2h(o); + g->gray = h->gclist; + if (traversetable(g, h)) /* table is weak? */ + black2gray(o); /* keep it gray */ + return sizeof(Table) + sizeof(TValue) * h->sizearray + + sizeof(Node) * sizenode(h); + } + case LUA_TFUNCTION: { + Closure *cl = gco2cl(o); + g->gray = cl->c.gclist; + traverseclosure(g, cl); + return (cl->c.isC) ? sizeCclosure(cl->c.nupvalues) : + sizeLclosure(cl->l.nupvalues); + } + case LUA_TTHREAD: { + lua_State *th = gco2th(o); + g->gray = th->gclist; + th->gclist = g->grayagain; + g->grayagain = o; + black2gray(o); + traversestack(g, th); + return sizeof(lua_State) + sizeof(TValue) * th->stacksize + + sizeof(CallInfo) * th->size_ci; + } + case LUA_TPROTO: { + Proto *p = gco2p(o); + g->gray = p->gclist; + traverseproto(g, p); + return sizeof(Proto) + sizeof(Instruction) * p->sizecode + + sizeof(Proto *) * p->sizep + + sizeof(TValue) * p->sizek + + sizeof(int) * p->sizelineinfo + + sizeof(LocVar) * p->sizelocvars + + sizeof(TString *) * p->sizeupvalues; + } + default: lua_assert(0); return 0; + } +} + + +static size_t propagateall (global_State *g) { + size_t m = 0; + while (g->gray) m += propagatemark(g); + return m; +} + + +/* +** The next function tells whether a key or value can be cleared from +** a weak table. Non-collectable objects are never removed from weak +** tables. Strings behave as `values', so are never removed too. for +** other objects: if really collected, cannot keep them; for userdata +** being finalized, keep them in keys, but not in values +*/ +static int iscleared (const TValue *o, int iskey) { + if (!iscollectable(o)) return 0; + if (ttisstring(o)) { + stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */ + return 0; + } + return iswhite(gcvalue(o)) || + (ttisuserdata(o) && (!iskey && isfinalized(uvalue(o)))); +} + + +/* +** clear collected entries from weaktables +*/ +static void cleartable (GCObject *l) { + while (l) { + Table *h = gco2h(l); + int i = h->sizearray; + lua_assert(testbit(h->marked, VALUEWEAKBIT) || + testbit(h->marked, KEYWEAKBIT)); + if (testbit(h->marked, VALUEWEAKBIT)) { + while (i--) { + TValue *o = &h->array[i]; + if (iscleared(o, 0)) /* value was collected? */ + setnilvalue(o); /* remove value */ + } + } + i = sizenode(h); + while (i--) { + Node *n = gnode(h, i); + if (!ttisnil(gval(n)) && /* non-empty entry? */ + (iscleared(key2tval(n), 1) || iscleared(gval(n), 0))) { + setnilvalue(gval(n)); /* remove value ... */ + removeentry(n); /* remove entry from table */ + } + } + l = h->gclist; + } +} + + +static void freeobj (lua_State *L, GCObject *o) { + switch (o->gch.tt) { + case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; + case LUA_TFUNCTION: luaF_freeclosure(L, gco2cl(o)); break; + case LUA_TUPVAL: luaF_freeupval(L, gco2uv(o)); break; + case LUA_TTABLE: luaH_free(L, gco2h(o)); break; + case LUA_TTHREAD: { + lua_assert(gco2th(o) != L && gco2th(o) != G(L)->mainthread); + luaE_freethread(L, gco2th(o)); + break; + } + case LUA_TSTRING: { + G(L)->strt.nuse--; + luaM_freemem(L, o, sizestring(gco2ts(o))); + break; + } + case LUA_TUSERDATA: { + luaM_freemem(L, o, sizeudata(gco2u(o))); + break; + } + default: lua_assert(0); + } +} + + + +#define sweepwholelist(L,p) sweeplist(L,p,MAX_LUMEM) + + +static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) { + GCObject *curr; + global_State *g = G(L); + int deadmask = otherwhite(g); + while ((curr = *p) != NULL && count-- > 0) { + if (curr->gch.tt == LUA_TTHREAD) /* sweep open upvalues of each thread */ + sweepwholelist(L, &gco2th(curr)->openupval); + if ((curr->gch.marked ^ WHITEBITS) & deadmask) { /* not dead? */ + lua_assert(!isdead(g, curr) || testbit(curr->gch.marked, FIXEDBIT)); + makewhite(g, curr); /* make it white (for next cycle) */ + p = &curr->gch.next; + } + else { /* must erase `curr' */ + lua_assert(isdead(g, curr) || deadmask == bitmask(SFIXEDBIT)); + *p = curr->gch.next; + if (curr == g->rootgc) /* is the first element of the list? */ + g->rootgc = curr->gch.next; /* adjust first */ + freeobj(L, curr); + } + } + return p; +} + + +static void checkSizes (lua_State *L) { + global_State *g = G(L); + /* check size of string hash */ + if (g->strt.nuse < cast(lu_int32, g->strt.size/4) && + g->strt.size > MINSTRTABSIZE*2) + luaS_resize(L, g->strt.size/2); /* table is too big */ + /* check size of buffer */ + if (luaZ_sizebuffer(&g->buff) > LUA_MINBUFFER*2) { /* buffer too big? */ + size_t newsize = luaZ_sizebuffer(&g->buff) / 2; + luaZ_resizebuffer(L, &g->buff, newsize); + } +} + + +static void GCTM (lua_State *L) { + global_State *g = G(L); + GCObject *o = g->tmudata->gch.next; /* get first element */ + Udata *udata = rawgco2u(o); + const TValue *tm; + /* remove udata from `tmudata' */ + if (o == g->tmudata) /* last element? */ + g->tmudata = NULL; + else + g->tmudata->gch.next = udata->uv.next; + udata->uv.next = g->mainthread->next; /* return it to `root' list */ + g->mainthread->next = o; + makewhite(g, o); + tm = fasttm(L, udata->uv.metatable, TM_GC); + if (tm != NULL) { + lu_byte oldah = L->allowhook; + lu_mem oldt = g->GCthreshold; + L->allowhook = 0; /* stop debug hooks during GC tag method */ + g->GCthreshold = 2*g->totalbytes; /* avoid GC steps */ + setobj2s(L, L->top, tm); + setuvalue(L, L->top+1, udata); + L->top += 2; + luaD_call(L, L->top - 2, 0); + L->allowhook = oldah; /* restore hooks */ + g->GCthreshold = oldt; /* restore threshold */ + } +} + + +/* +** Call all GC tag methods +*/ +void luaC_callGCTM (lua_State *L) { + while (G(L)->tmudata) + GCTM(L); +} + + +void luaC_freeall (lua_State *L) { + global_State *g = G(L); + int i; + g->currentwhite = WHITEBITS | bitmask(SFIXEDBIT); /* mask to collect all elements */ + sweepwholelist(L, &g->rootgc); + for (i = 0; i < g->strt.size; i++) /* free all string lists */ + sweepwholelist(L, &g->strt.hash[i]); +} + + +static void markmt (global_State *g) { + int i; + for (i=0; imt[i]) markobject(g, g->mt[i]); +} + + +/* mark root set */ +static void markroot (lua_State *L) { + global_State *g = G(L); + g->gray = NULL; + g->grayagain = NULL; + g->weak = NULL; + markobject(g, g->mainthread); + /* make global table be traversed before main stack */ + markvalue(g, gt(g->mainthread)); + markvalue(g, registry(L)); + markmt(g); + g->gcstate = GCSpropagate; +} + + +static void remarkupvals (global_State *g) { + UpVal *uv; + for (uv = g->uvhead.u.l.next; uv != &g->uvhead; uv = uv->u.l.next) { + lua_assert(uv->u.l.next->u.l.prev == uv && uv->u.l.prev->u.l.next == uv); + if (isgray(obj2gco(uv))) + markvalue(g, uv->v); + } +} + + +static void atomic (lua_State *L) { + global_State *g = G(L); + size_t udsize; /* total size of userdata to be finalized */ + /* remark occasional upvalues of (maybe) dead threads */ + remarkupvals(g); + /* traverse objects cautch by write barrier and by 'remarkupvals' */ + propagateall(g); + /* remark weak tables */ + g->gray = g->weak; + g->weak = NULL; + lua_assert(!iswhite(obj2gco(g->mainthread))); + markobject(g, L); /* mark running thread */ + markmt(g); /* mark basic metatables (again) */ + propagateall(g); + /* remark gray again */ + g->gray = g->grayagain; + g->grayagain = NULL; + propagateall(g); + udsize = luaC_separateudata(L, 0); /* separate userdata to be finalized */ + marktmu(g); /* mark `preserved' userdata */ + udsize += propagateall(g); /* remark, to propagate `preserveness' */ + cleartable(g->weak); /* remove collected objects from weak tables */ + /* flip current white */ + g->currentwhite = cast_byte(otherwhite(g)); + g->sweepstrgc = 0; + g->sweepgc = &g->rootgc; + g->gcstate = GCSsweepstring; + g->estimate = g->totalbytes - udsize; /* first estimate */ +} + + +static l_mem singlestep (lua_State *L) { + global_State *g = G(L); + /*lua_checkmemory(L);*/ + switch (g->gcstate) { + case GCSpause: { + markroot(L); /* start a new collection */ + return 0; + } + case GCSpropagate: { + if (g->gray) + return propagatemark(g); + else { /* no more `gray' objects */ + atomic(L); /* finish mark phase */ + return 0; + } + } + case GCSsweepstring: { + lu_mem old = g->totalbytes; + sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]); + if (g->sweepstrgc >= g->strt.size) /* nothing more to sweep? */ + g->gcstate = GCSsweep; /* end sweep-string phase */ + lua_assert(old >= g->totalbytes); + g->estimate -= old - g->totalbytes; + return GCSWEEPCOST; + } + case GCSsweep: { + lu_mem old = g->totalbytes; + g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); + if (*g->sweepgc == NULL) { /* nothing more to sweep? */ + checkSizes(L); + g->gcstate = GCSfinalize; /* end sweep phase */ + } + lua_assert(old >= g->totalbytes); + g->estimate -= old - g->totalbytes; + return GCSWEEPMAX*GCSWEEPCOST; + } + case GCSfinalize: { + if (g->tmudata) { + GCTM(L); + if (g->estimate > GCFINALIZECOST) + g->estimate -= GCFINALIZECOST; + return GCFINALIZECOST; + } + else { + g->gcstate = GCSpause; /* end collection */ + g->gcdept = 0; + return 0; + } + } + default: lua_assert(0); return 0; + } +} + + +void luaC_step (lua_State *L) { + global_State *g = G(L); + l_mem lim = (GCSTEPSIZE/100) * g->gcstepmul; + if (lim == 0) + lim = (MAX_LUMEM-1)/2; /* no limit */ + g->gcdept += g->totalbytes - g->GCthreshold; + do { + lim -= singlestep(L); + if (g->gcstate == GCSpause) + break; + } while (lim > 0); + if (g->gcstate != GCSpause) { + if (g->gcdept < GCSTEPSIZE) + g->GCthreshold = g->totalbytes + GCSTEPSIZE; /* - lim/g->gcstepmul;*/ + else { + g->gcdept -= GCSTEPSIZE; + g->GCthreshold = g->totalbytes; + } + } + else { + setthreshold(g); + } +} + + +void luaC_fullgc (lua_State *L) { + global_State *g = G(L); + if (g->gcstate <= GCSpropagate) { + /* reset sweep marks to sweep all elements (returning them to white) */ + g->sweepstrgc = 0; + g->sweepgc = &g->rootgc; + /* reset other collector lists */ + g->gray = NULL; + g->grayagain = NULL; + g->weak = NULL; + g->gcstate = GCSsweepstring; + } + lua_assert(g->gcstate != GCSpause && g->gcstate != GCSpropagate); + /* finish any pending sweep phase */ + while (g->gcstate != GCSfinalize) { + lua_assert(g->gcstate == GCSsweepstring || g->gcstate == GCSsweep); + singlestep(L); + } + markroot(L); + while (g->gcstate != GCSpause) { + singlestep(L); + } + setthreshold(g); +} + + +void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v) { + global_State *g = G(L); + lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); + lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); + lua_assert(ttype(&o->gch) != LUA_TTABLE); + /* must keep invariant? */ + if (g->gcstate == GCSpropagate) + reallymarkobject(g, v); /* restore invariant */ + else /* don't mind */ + makewhite(g, o); /* mark as white just to avoid other barriers */ +} + + +void luaC_barrierback (lua_State *L, Table *t) { + global_State *g = G(L); + GCObject *o = obj2gco(t); + lua_assert(isblack(o) && !isdead(g, o)); + lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); + black2gray(o); /* make table gray (again) */ + t->gclist = g->grayagain; + g->grayagain = o; +} + + +void luaC_link (lua_State *L, GCObject *o, lu_byte tt) { + global_State *g = G(L); + o->gch.next = g->rootgc; + g->rootgc = o; + o->gch.marked = luaC_white(g); + o->gch.tt = tt; +} + + +void luaC_linkupval (lua_State *L, UpVal *uv) { + global_State *g = G(L); + GCObject *o = obj2gco(uv); + o->gch.next = g->rootgc; /* link upvalue into `rootgc' list */ + g->rootgc = o; + if (isgray(o)) { + if (g->gcstate == GCSpropagate) { + gray2black(o); /* closed upvalues need barrier */ + luaC_barrier(L, uv, uv->v); + } + else { /* sweep phase: sweep it (turning it into white) */ + makewhite(g, o); + lua_assert(g->gcstate != GCSfinalize && g->gcstate != GCSpause); + } + } +} + diff --git a/ext/lua-5.1.5/src/lgc.h b/ext/lua-5.1.5/src/lgc.h new file mode 100644 index 000000000..5a8dc605b --- /dev/null +++ b/ext/lua-5.1.5/src/lgc.h @@ -0,0 +1,110 @@ +/* +** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#ifndef lgc_h +#define lgc_h + + +#include "lobject.h" + + +/* +** Possible states of the Garbage Collector +*/ +#define GCSpause 0 +#define GCSpropagate 1 +#define GCSsweepstring 2 +#define GCSsweep 3 +#define GCSfinalize 4 + + +/* +** some userful bit tricks +*/ +#define resetbits(x,m) ((x) &= cast(lu_byte, ~(m))) +#define setbits(x,m) ((x) |= (m)) +#define testbits(x,m) ((x) & (m)) +#define bitmask(b) (1<<(b)) +#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) +#define l_setbit(x,b) setbits(x, bitmask(b)) +#define resetbit(x,b) resetbits(x, bitmask(b)) +#define testbit(x,b) testbits(x, bitmask(b)) +#define set2bits(x,b1,b2) setbits(x, (bit2mask(b1, b2))) +#define reset2bits(x,b1,b2) resetbits(x, (bit2mask(b1, b2))) +#define test2bits(x,b1,b2) testbits(x, (bit2mask(b1, b2))) + + + +/* +** Layout for bit use in `marked' field: +** bit 0 - object is white (type 0) +** bit 1 - object is white (type 1) +** bit 2 - object is black +** bit 3 - for userdata: has been finalized +** bit 3 - for tables: has weak keys +** bit 4 - for tables: has weak values +** bit 5 - object is fixed (should not be collected) +** bit 6 - object is "super" fixed (only the main thread) +*/ + + +#define WHITE0BIT 0 +#define WHITE1BIT 1 +#define BLACKBIT 2 +#define FINALIZEDBIT 3 +#define KEYWEAKBIT 3 +#define VALUEWEAKBIT 4 +#define FIXEDBIT 5 +#define SFIXEDBIT 6 +#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) + + +#define iswhite(x) test2bits((x)->gch.marked, WHITE0BIT, WHITE1BIT) +#define isblack(x) testbit((x)->gch.marked, BLACKBIT) +#define isgray(x) (!isblack(x) && !iswhite(x)) + +#define otherwhite(g) (g->currentwhite ^ WHITEBITS) +#define isdead(g,v) ((v)->gch.marked & otherwhite(g) & WHITEBITS) + +#define changewhite(x) ((x)->gch.marked ^= WHITEBITS) +#define gray2black(x) l_setbit((x)->gch.marked, BLACKBIT) + +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + +#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) + + +#define luaC_checkGC(L) { \ + condhardstacktests(luaD_reallocstack(L, L->stacksize - EXTRA_STACK - 1)); \ + if (G(L)->totalbytes >= G(L)->GCthreshold) \ + luaC_step(L); } + + +#define luaC_barrier(L,p,v) { if (valiswhite(v) && isblack(obj2gco(p))) \ + luaC_barrierf(L,obj2gco(p),gcvalue(v)); } + +#define luaC_barriert(L,t,v) { if (valiswhite(v) && isblack(obj2gco(t))) \ + luaC_barrierback(L,t); } + +#define luaC_objbarrier(L,p,o) \ + { if (iswhite(obj2gco(o)) && isblack(obj2gco(p))) \ + luaC_barrierf(L,obj2gco(p),obj2gco(o)); } + +#define luaC_objbarriert(L,t,o) \ + { if (iswhite(obj2gco(o)) && isblack(obj2gco(t))) luaC_barrierback(L,t); } + +LUAI_FUNC size_t luaC_separateudata (lua_State *L, int all); +LUAI_FUNC void luaC_callGCTM (lua_State *L); +LUAI_FUNC void luaC_freeall (lua_State *L); +LUAI_FUNC void luaC_step (lua_State *L); +LUAI_FUNC void luaC_fullgc (lua_State *L); +LUAI_FUNC void luaC_link (lua_State *L, GCObject *o, lu_byte tt); +LUAI_FUNC void luaC_linkupval (lua_State *L, UpVal *uv); +LUAI_FUNC void luaC_barrierf (lua_State *L, GCObject *o, GCObject *v); +LUAI_FUNC void luaC_barrierback (lua_State *L, Table *t); + + +#endif diff --git a/ext/lua-5.1.5/src/linit.c b/ext/lua-5.1.5/src/linit.c new file mode 100644 index 000000000..c1f90dfab --- /dev/null +++ b/ext/lua-5.1.5/src/linit.c @@ -0,0 +1,38 @@ +/* +** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $ +** Initialization of libraries for lua.c +** See Copyright Notice in lua.h +*/ + + +#define linit_c +#define LUA_LIB + +#include "lua.h" + +#include "lualib.h" +#include "lauxlib.h" + + +static const luaL_Reg lualibs[] = { + {"", luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_DBLIBNAME, luaopen_debug}, + {NULL, NULL} +}; + + +LUALIB_API void luaL_openlibs (lua_State *L) { + const luaL_Reg *lib = lualibs; + for (; lib->func; lib++) { + lua_pushcfunction(L, lib->func); + lua_pushstring(L, lib->name); + lua_call(L, 1, 0); + } +} + diff --git a/ext/lua-5.1.5/src/liolib.c b/ext/lua-5.1.5/src/liolib.c new file mode 100644 index 000000000..649f9a595 --- /dev/null +++ b/ext/lua-5.1.5/src/liolib.c @@ -0,0 +1,556 @@ +/* +** $Id: liolib.c,v 2.73.1.4 2010/05/14 15:33:51 roberto Exp $ +** Standard I/O (and system) library +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + +#define liolib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + +#define IO_INPUT 1 +#define IO_OUTPUT 2 + + +static const char *const fnames[] = {"input", "output"}; + + +static int pushresult (lua_State *L, int i, const char *filename) { + int en = errno; /* calls to Lua API may change this value */ + if (i) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + if (filename) + lua_pushfstring(L, "%s: %s", filename, strerror(en)); + else + lua_pushfstring(L, "%s", strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + + +static void fileerror (lua_State *L, int arg, const char *filename) { + lua_pushfstring(L, "%s: %s", filename, strerror(errno)); + luaL_argerror(L, arg, lua_tostring(L, -1)); +} + + +#define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) + + +static int io_type (lua_State *L) { + void *ud; + luaL_checkany(L, 1); + ud = lua_touserdata(L, 1); + lua_getfield(L, LUA_REGISTRYINDEX, LUA_FILEHANDLE); + if (ud == NULL || !lua_getmetatable(L, 1) || !lua_rawequal(L, -2, -1)) + lua_pushnil(L); /* not a file */ + else if (*((FILE **)ud) == NULL) + lua_pushliteral(L, "closed file"); + else + lua_pushliteral(L, "file"); + return 1; +} + + +static FILE *tofile (lua_State *L) { + FILE **f = tofilep(L); + if (*f == NULL) + luaL_error(L, "attempt to use a closed file"); + return *f; +} + + + +/* +** When creating file handles, always creates a `closed' file handle +** before opening the actual file; so, if there is a memory error, the +** file is not left opened. +*/ +static FILE **newfile (lua_State *L) { + FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *)); + *pf = NULL; /* file handle is currently `closed' */ + luaL_getmetatable(L, LUA_FILEHANDLE); + lua_setmetatable(L, -2); + return pf; +} + + +/* +** function to (not) close the standard files stdin, stdout, and stderr +*/ +static int io_noclose (lua_State *L) { + lua_pushnil(L); + lua_pushliteral(L, "cannot close standard file"); + return 2; +} + + +/* +** function to close 'popen' files +*/ +static int io_pclose (lua_State *L) { + FILE **p = tofilep(L); + int ok = lua_pclose(L, *p); + *p = NULL; + return pushresult(L, ok, NULL); +} + + +/* +** function to close regular files +*/ +static int io_fclose (lua_State *L) { + FILE **p = tofilep(L); + int ok = (fclose(*p) == 0); + *p = NULL; + return pushresult(L, ok, NULL); +} + + +static int aux_close (lua_State *L) { + lua_getfenv(L, 1); + lua_getfield(L, -1, "__close"); + return (lua_tocfunction(L, -1))(L); +} + + +static int io_close (lua_State *L) { + if (lua_isnone(L, 1)) + lua_rawgeti(L, LUA_ENVIRONINDEX, IO_OUTPUT); + tofile(L); /* make sure argument is a file */ + return aux_close(L); +} + + +static int io_gc (lua_State *L) { + FILE *f = *tofilep(L); + /* ignore closed files */ + if (f != NULL) + aux_close(L); + return 0; +} + + +static int io_tostring (lua_State *L) { + FILE *f = *tofilep(L); + if (f == NULL) + lua_pushliteral(L, "file (closed)"); + else + lua_pushfstring(L, "file (%p)", f); + return 1; +} + + +static int io_open (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + FILE **pf = newfile(L); + *pf = fopen(filename, mode); + return (*pf == NULL) ? pushresult(L, 0, filename) : 1; +} + + +/* +** this function has a separated environment, which defines the +** correct __close for 'popen' files +*/ +static int io_popen (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + FILE **pf = newfile(L); + *pf = lua_popen(L, filename, mode); + return (*pf == NULL) ? pushresult(L, 0, filename) : 1; +} + + +static int io_tmpfile (lua_State *L) { + FILE **pf = newfile(L); + *pf = tmpfile(); + return (*pf == NULL) ? pushresult(L, 0, NULL) : 1; +} + + +static FILE *getiofile (lua_State *L, int findex) { + FILE *f; + lua_rawgeti(L, LUA_ENVIRONINDEX, findex); + f = *(FILE **)lua_touserdata(L, -1); + if (f == NULL) + luaL_error(L, "standard %s file is closed", fnames[findex - 1]); + return f; +} + + +static int g_iofile (lua_State *L, int f, const char *mode) { + if (!lua_isnoneornil(L, 1)) { + const char *filename = lua_tostring(L, 1); + if (filename) { + FILE **pf = newfile(L); + *pf = fopen(filename, mode); + if (*pf == NULL) + fileerror(L, 1, filename); + } + else { + tofile(L); /* check that it's a valid file handle */ + lua_pushvalue(L, 1); + } + lua_rawseti(L, LUA_ENVIRONINDEX, f); + } + /* return current value */ + lua_rawgeti(L, LUA_ENVIRONINDEX, f); + return 1; +} + + +static int io_input (lua_State *L) { + return g_iofile(L, IO_INPUT, "r"); +} + + +static int io_output (lua_State *L) { + return g_iofile(L, IO_OUTPUT, "w"); +} + + +static int io_readline (lua_State *L); + + +static void aux_lines (lua_State *L, int idx, int toclose) { + lua_pushvalue(L, idx); + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_pushcclosure(L, io_readline, 2); +} + + +static int f_lines (lua_State *L) { + tofile(L); /* check that it's a valid file handle */ + aux_lines(L, 1, 0); + return 1; +} + + +static int io_lines (lua_State *L) { + if (lua_isnoneornil(L, 1)) { /* no arguments? */ + /* will iterate over default input */ + lua_rawgeti(L, LUA_ENVIRONINDEX, IO_INPUT); + return f_lines(L); + } + else { + const char *filename = luaL_checkstring(L, 1); + FILE **pf = newfile(L); + *pf = fopen(filename, "r"); + if (*pf == NULL) + fileerror(L, 1, filename); + aux_lines(L, lua_gettop(L), 1); + return 1; + } +} + + +/* +** {====================================================== +** READ +** ======================================================= +*/ + + +static int read_number (lua_State *L, FILE *f) { + lua_Number d; + if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) { + lua_pushnumber(L, d); + return 1; + } + else { + lua_pushnil(L); /* "result" to be removed */ + return 0; /* read fails */ + } +} + + +static int test_eof (lua_State *L, FILE *f) { + int c = getc(f); + ungetc(c, f); + lua_pushlstring(L, NULL, 0); + return (c != EOF); +} + + +static int read_line (lua_State *L, FILE *f) { + luaL_Buffer b; + luaL_buffinit(L, &b); + for (;;) { + size_t l; + char *p = luaL_prepbuffer(&b); + if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ + luaL_pushresult(&b); /* close buffer */ + return (lua_objlen(L, -1) > 0); /* check whether read something */ + } + l = strlen(p); + if (l == 0 || p[l-1] != '\n') + luaL_addsize(&b, l); + else { + luaL_addsize(&b, l - 1); /* do not include `eol' */ + luaL_pushresult(&b); /* close buffer */ + return 1; /* read at least an `eol' */ + } + } +} + + +static int read_chars (lua_State *L, FILE *f, size_t n) { + size_t rlen; /* how much to read */ + size_t nr; /* number of chars actually read */ + luaL_Buffer b; + luaL_buffinit(L, &b); + rlen = LUAL_BUFFERSIZE; /* try to read that much each time */ + do { + char *p = luaL_prepbuffer(&b); + if (rlen > n) rlen = n; /* cannot read more than asked */ + nr = fread(p, sizeof(char), rlen, f); + luaL_addsize(&b, nr); + n -= nr; /* still have to read `n' chars */ + } while (n > 0 && nr == rlen); /* until end of count or eof */ + luaL_pushresult(&b); /* close buffer */ + return (n == 0 || lua_objlen(L, -1) > 0); +} + + +static int g_read (lua_State *L, FILE *f, int first) { + int nargs = lua_gettop(L) - 1; + int success; + int n; + clearerr(f); + if (nargs == 0) { /* no arguments? */ + success = read_line(L, f); + n = first+1; /* to return 1 result */ + } + else { /* ensure stack space for all results and for auxlib's buffer */ + luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); + success = 1; + for (n = first; nargs-- && success; n++) { + if (lua_type(L, n) == LUA_TNUMBER) { + size_t l = (size_t)lua_tointeger(L, n); + success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); + } + else { + const char *p = lua_tostring(L, n); + luaL_argcheck(L, p && p[0] == '*', n, "invalid option"); + switch (p[1]) { + case 'n': /* number */ + success = read_number(L, f); + break; + case 'l': /* line */ + success = read_line(L, f); + break; + case 'a': /* file */ + read_chars(L, f, ~((size_t)0)); /* read MAX_SIZE_T chars */ + success = 1; /* always success */ + break; + default: + return luaL_argerror(L, n, "invalid format"); + } + } + } + } + if (ferror(f)) + return pushresult(L, 0, NULL); + if (!success) { + lua_pop(L, 1); /* remove last result */ + lua_pushnil(L); /* push nil instead */ + } + return n - first; +} + + +static int io_read (lua_State *L) { + return g_read(L, getiofile(L, IO_INPUT), 1); +} + + +static int f_read (lua_State *L) { + return g_read(L, tofile(L), 2); +} + + +static int io_readline (lua_State *L) { + FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(1)); + int sucess; + if (f == NULL) /* file is already closed? */ + luaL_error(L, "file is already closed"); + sucess = read_line(L, f); + if (ferror(f)) + return luaL_error(L, "%s", strerror(errno)); + if (sucess) return 1; + else { /* EOF */ + if (lua_toboolean(L, lua_upvalueindex(2))) { /* generator created file? */ + lua_settop(L, 0); + lua_pushvalue(L, lua_upvalueindex(1)); + aux_close(L); /* close it */ + } + return 0; + } +} + +/* }====================================================== */ + + +static int g_write (lua_State *L, FILE *f, int arg) { + int nargs = lua_gettop(L) - 1; + int status = 1; + for (; nargs--; arg++) { + if (lua_type(L, arg) == LUA_TNUMBER) { + /* optimization: could be done exactly as for strings */ + status = status && + fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; + } + else { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + status = status && (fwrite(s, sizeof(char), l, f) == l); + } + } + return pushresult(L, status, NULL); +} + + +static int io_write (lua_State *L) { + return g_write(L, getiofile(L, IO_OUTPUT), 1); +} + + +static int f_write (lua_State *L) { + return g_write(L, tofile(L), 2); +} + + +static int f_seek (lua_State *L) { + static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; + static const char *const modenames[] = {"set", "cur", "end", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, "cur", modenames); + long offset = luaL_optlong(L, 3, 0); + op = fseek(f, offset, mode[op]); + if (op) + return pushresult(L, 0, NULL); /* error */ + else { + lua_pushinteger(L, ftell(f)); + return 1; + } +} + + +static int f_setvbuf (lua_State *L) { + static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; + static const char *const modenames[] = {"no", "full", "line", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, NULL, modenames); + lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); + int res = setvbuf(f, NULL, mode[op], sz); + return pushresult(L, res == 0, NULL); +} + + + +static int io_flush (lua_State *L) { + return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); +} + + +static int f_flush (lua_State *L) { + return pushresult(L, fflush(tofile(L)) == 0, NULL); +} + + +static const luaL_Reg iolib[] = { + {"close", io_close}, + {"flush", io_flush}, + {"input", io_input}, + {"lines", io_lines}, + {"open", io_open}, + {"output", io_output}, + {"popen", io_popen}, + {"read", io_read}, + {"tmpfile", io_tmpfile}, + {"type", io_type}, + {"write", io_write}, + {NULL, NULL} +}; + + +static const luaL_Reg flib[] = { + {"close", io_close}, + {"flush", f_flush}, + {"lines", f_lines}, + {"read", f_read}, + {"seek", f_seek}, + {"setvbuf", f_setvbuf}, + {"write", f_write}, + {"__gc", io_gc}, + {"__tostring", io_tostring}, + {NULL, NULL} +}; + + +static void createmeta (lua_State *L) { + luaL_newmetatable(L, LUA_FILEHANDLE); /* create metatable for file handles */ + lua_pushvalue(L, -1); /* push metatable */ + lua_setfield(L, -2, "__index"); /* metatable.__index = metatable */ + luaL_register(L, NULL, flib); /* file methods */ +} + + +static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) { + *newfile(L) = f; + if (k > 0) { + lua_pushvalue(L, -1); + lua_rawseti(L, LUA_ENVIRONINDEX, k); + } + lua_pushvalue(L, -2); /* copy environment */ + lua_setfenv(L, -2); /* set it */ + lua_setfield(L, -3, fname); +} + + +static void newfenv (lua_State *L, lua_CFunction cls) { + lua_createtable(L, 0, 1); + lua_pushcfunction(L, cls); + lua_setfield(L, -2, "__close"); +} + + +LUALIB_API int luaopen_io (lua_State *L) { + createmeta(L); + /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */ + newfenv(L, io_fclose); + lua_replace(L, LUA_ENVIRONINDEX); + /* open library */ + luaL_register(L, LUA_IOLIBNAME, iolib); + /* create (and set) default files */ + newfenv(L, io_noclose); /* close function for default files */ + createstdfile(L, stdin, IO_INPUT, "stdin"); + createstdfile(L, stdout, IO_OUTPUT, "stdout"); + createstdfile(L, stderr, 0, "stderr"); + lua_pop(L, 1); /* pop environment for default files */ + lua_getfield(L, -1, "popen"); + newfenv(L, io_pclose); /* create environment for 'popen' */ + lua_setfenv(L, -2); /* set fenv for 'popen' */ + lua_pop(L, 1); /* pop 'popen' */ + return 1; +} + diff --git a/ext/lua-5.1.5/src/llex.c b/ext/lua-5.1.5/src/llex.c new file mode 100644 index 000000000..88c6790c0 --- /dev/null +++ b/ext/lua-5.1.5/src/llex.c @@ -0,0 +1,463 @@ +/* +** $Id: llex.c,v 2.20.1.2 2009/11/23 14:58:22 roberto Exp $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#define llex_c +#define LUA_CORE + +#include "lua.h" + +#include "ldo.h" +#include "llex.h" +#include "lobject.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lzio.h" + + + +#define next(ls) (ls->current = zgetc(ls->z)) + + + + +#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') + + +/* ORDER RESERVED */ +const char *const luaX_tokens [] = { + "and", "break", "do", "else", "elseif", + "end", "false", "for", "function", "if", + "in", "local", "nil", "not", "or", "repeat", + "return", "then", "true", "until", "while", + "..", "...", "==", ">=", "<=", "~=", + "", "", "", "", + NULL +}; + + +#define save_and_next(ls) (save(ls, ls->current), next(ls)) + + +static void save (LexState *ls, int c) { + Mbuffer *b = ls->buff; + if (b->n + 1 > b->buffsize) { + size_t newsize; + if (b->buffsize >= MAX_SIZET/2) + luaX_lexerror(ls, "lexical element too long", 0); + newsize = b->buffsize * 2; + luaZ_resizebuffer(ls->L, b, newsize); + } + b->buffer[b->n++] = cast(char, c); +} + + +void luaX_init (lua_State *L) { + int i; + for (i=0; itsv.reserved = cast_byte(i+1); /* reserved word */ + } +} + + +#define MAXSRC 80 + + +const char *luaX_token2str (LexState *ls, int token) { + if (token < FIRST_RESERVED) { + lua_assert(token == cast(unsigned char, token)); + return (iscntrl(token)) ? luaO_pushfstring(ls->L, "char(%d)", token) : + luaO_pushfstring(ls->L, "%c", token); + } + else + return luaX_tokens[token-FIRST_RESERVED]; +} + + +static const char *txtToken (LexState *ls, int token) { + switch (token) { + case TK_NAME: + case TK_STRING: + case TK_NUMBER: + save(ls, '\0'); + return luaZ_buffer(ls->buff); + default: + return luaX_token2str(ls, token); + } +} + + +void luaX_lexerror (LexState *ls, const char *msg, int token) { + char buff[MAXSRC]; + luaO_chunkid(buff, getstr(ls->source), MAXSRC); + msg = luaO_pushfstring(ls->L, "%s:%d: %s", buff, ls->linenumber, msg); + if (token) + luaO_pushfstring(ls->L, "%s near " LUA_QS, msg, txtToken(ls, token)); + luaD_throw(ls->L, LUA_ERRSYNTAX); +} + + +void luaX_syntaxerror (LexState *ls, const char *msg) { + luaX_lexerror(ls, msg, ls->t.token); +} + + +TString *luaX_newstring (LexState *ls, const char *str, size_t l) { + lua_State *L = ls->L; + TString *ts = luaS_newlstr(L, str, l); + TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ + if (ttisnil(o)) { + setbvalue(o, 1); /* make sure `str' will not be collected */ + luaC_checkGC(L); + } + return ts; +} + + +static void inclinenumber (LexState *ls) { + int old = ls->current; + lua_assert(currIsNewline(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) + luaX_syntaxerror(ls, "chunk has too many lines"); +} + + +void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source) { + ls->decpoint = '.'; + ls->L = L; + ls->lookahead.token = TK_EOS; /* no look-ahead token */ + ls->z = z; + ls->fs = NULL; + ls->linenumber = 1; + ls->lastline = 1; + ls->source = source; + luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ + next(ls); /* read first char */ +} + + + +/* +** ======================================================= +** LEXICAL ANALYZER +** ======================================================= +*/ + + + +static int check_next (LexState *ls, const char *set) { + if (!strchr(set, ls->current)) + return 0; + save_and_next(ls); + return 1; +} + + +static void buffreplace (LexState *ls, char from, char to) { + size_t n = luaZ_bufflen(ls->buff); + char *p = luaZ_buffer(ls->buff); + while (n--) + if (p[n] == from) p[n] = to; +} + + +static void trydecpoint (LexState *ls, SemInfo *seminfo) { + /* format error: try to update decimal point separator */ + struct lconv *cv = localeconv(); + char old = ls->decpoint; + ls->decpoint = (cv ? cv->decimal_point[0] : '.'); + buffreplace(ls, old, ls->decpoint); /* try updated decimal separator */ + if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) { + /* format error with correct decimal point: no more options */ + buffreplace(ls, ls->decpoint, '.'); /* undo change (for error message) */ + luaX_lexerror(ls, "malformed number", TK_NUMBER); + } +} + + +/* LUA_NUMBER */ +static void read_numeral (LexState *ls, SemInfo *seminfo) { + lua_assert(isdigit(ls->current)); + do { + save_and_next(ls); + } while (isdigit(ls->current) || ls->current == '.'); + if (check_next(ls, "Ee")) /* `E'? */ + check_next(ls, "+-"); /* optional exponent sign */ + while (isalnum(ls->current) || ls->current == '_') + save_and_next(ls); + save(ls, '\0'); + buffreplace(ls, '.', ls->decpoint); /* follow locale for decimal point */ + if (!luaO_str2d(luaZ_buffer(ls->buff), &seminfo->r)) /* format error? */ + trydecpoint(ls, seminfo); /* try to update decimal point separator */ +} + + +static int skip_sep (LexState *ls) { + int count = 0; + int s = ls->current; + lua_assert(s == '[' || s == ']'); + save_and_next(ls); + while (ls->current == '=') { + save_and_next(ls); + count++; + } + return (ls->current == s) ? count : (-count) - 1; +} + + +static void read_long_string (LexState *ls, SemInfo *seminfo, int sep) { + int cont = 0; + (void)(cont); /* avoid warnings when `cont' is not used */ + save_and_next(ls); /* skip 2nd `[' */ + if (currIsNewline(ls)) /* string starts with a newline? */ + inclinenumber(ls); /* skip it */ + for (;;) { + switch (ls->current) { + case EOZ: + luaX_lexerror(ls, (seminfo) ? "unfinished long string" : + "unfinished long comment", TK_EOS); + break; /* to avoid warnings */ +#if defined(LUA_COMPAT_LSTR) + case '[': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd `[' */ + cont++; +#if LUA_COMPAT_LSTR == 1 + if (sep == 0) + luaX_lexerror(ls, "nesting of [[...]] is deprecated", '['); +#endif + } + break; + } +#endif + case ']': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd `]' */ +#if defined(LUA_COMPAT_LSTR) && LUA_COMPAT_LSTR == 2 + cont--; + if (sep == 0 && cont >= 0) break; +#endif + goto endloop; + } + break; + } + case '\n': + case '\r': { + save(ls, '\n'); + inclinenumber(ls); + if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ + break; + } + default: { + if (seminfo) save_and_next(ls); + else next(ls); + } + } + } endloop: + if (seminfo) + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + (2 + sep), + luaZ_bufflen(ls->buff) - 2*(2 + sep)); +} + + +static void read_string (LexState *ls, int del, SemInfo *seminfo) { + save_and_next(ls); + while (ls->current != del) { + switch (ls->current) { + case EOZ: + luaX_lexerror(ls, "unfinished string", TK_EOS); + continue; /* to avoid warnings */ + case '\n': + case '\r': + luaX_lexerror(ls, "unfinished string", TK_STRING); + continue; /* to avoid warnings */ + case '\\': { + int c; + next(ls); /* do not save the `\' */ + switch (ls->current) { + case 'a': c = '\a'; break; + case 'b': c = '\b'; break; + case 'f': c = '\f'; break; + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case 'v': c = '\v'; break; + case '\n': /* go through */ + case '\r': save(ls, '\n'); inclinenumber(ls); continue; + case EOZ: continue; /* will raise an error next loop */ + default: { + if (!isdigit(ls->current)) + save_and_next(ls); /* handles \\, \", \', and \? */ + else { /* \xxx */ + int i = 0; + c = 0; + do { + c = 10*c + (ls->current-'0'); + next(ls); + } while (++i<3 && isdigit(ls->current)); + if (c > UCHAR_MAX) + luaX_lexerror(ls, "escape sequence too large", TK_STRING); + save(ls, c); + } + continue; + } + } + save(ls, c); + next(ls); + continue; + } + default: + save_and_next(ls); + } + } + save_and_next(ls); /* skip delimiter */ + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, + luaZ_bufflen(ls->buff) - 2); +} + + +static int llex (LexState *ls, SemInfo *seminfo) { + luaZ_resetbuffer(ls->buff); + for (;;) { + switch (ls->current) { + case '\n': + case '\r': { + inclinenumber(ls); + continue; + } + case '-': { + next(ls); + if (ls->current != '-') return '-'; + /* else is a comment */ + next(ls); + if (ls->current == '[') { + int sep = skip_sep(ls); + luaZ_resetbuffer(ls->buff); /* `skip_sep' may dirty the buffer */ + if (sep >= 0) { + read_long_string(ls, NULL, sep); /* long comment */ + luaZ_resetbuffer(ls->buff); + continue; + } + } + /* else short comment */ + while (!currIsNewline(ls) && ls->current != EOZ) + next(ls); + continue; + } + case '[': { + int sep = skip_sep(ls); + if (sep >= 0) { + read_long_string(ls, seminfo, sep); + return TK_STRING; + } + else if (sep == -1) return '['; + else luaX_lexerror(ls, "invalid long string delimiter", TK_STRING); + } + case '=': { + next(ls); + if (ls->current != '=') return '='; + else { next(ls); return TK_EQ; } + } + case '<': { + next(ls); + if (ls->current != '=') return '<'; + else { next(ls); return TK_LE; } + } + case '>': { + next(ls); + if (ls->current != '=') return '>'; + else { next(ls); return TK_GE; } + } + case '~': { + next(ls); + if (ls->current != '=') return '~'; + else { next(ls); return TK_NE; } + } + case '"': + case '\'': { + read_string(ls, ls->current, seminfo); + return TK_STRING; + } + case '.': { + save_and_next(ls); + if (check_next(ls, ".")) { + if (check_next(ls, ".")) + return TK_DOTS; /* ... */ + else return TK_CONCAT; /* .. */ + } + else if (!isdigit(ls->current)) return '.'; + else { + read_numeral(ls, seminfo); + return TK_NUMBER; + } + } + case EOZ: { + return TK_EOS; + } + default: { + if (isspace(ls->current)) { + lua_assert(!currIsNewline(ls)); + next(ls); + continue; + } + else if (isdigit(ls->current)) { + read_numeral(ls, seminfo); + return TK_NUMBER; + } + else if (isalpha(ls->current) || ls->current == '_') { + /* identifier or reserved word */ + TString *ts; + do { + save_and_next(ls); + } while (isalnum(ls->current) || ls->current == '_'); + ts = luaX_newstring(ls, luaZ_buffer(ls->buff), + luaZ_bufflen(ls->buff)); + if (ts->tsv.reserved > 0) /* reserved word? */ + return ts->tsv.reserved - 1 + FIRST_RESERVED; + else { + seminfo->ts = ts; + return TK_NAME; + } + } + else { + int c = ls->current; + next(ls); + return c; /* single-char tokens (+ - / ...) */ + } + } + } + } +} + + +void luaX_next (LexState *ls) { + ls->lastline = ls->linenumber; + if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ + ls->t = ls->lookahead; /* use this one */ + ls->lookahead.token = TK_EOS; /* and discharge it */ + } + else + ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ +} + + +void luaX_lookahead (LexState *ls) { + lua_assert(ls->lookahead.token == TK_EOS); + ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); +} + diff --git a/ext/lua-5.1.5/src/llex.h b/ext/lua-5.1.5/src/llex.h new file mode 100644 index 000000000..a9201cee4 --- /dev/null +++ b/ext/lua-5.1.5/src/llex.h @@ -0,0 +1,81 @@ +/* +** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#ifndef llex_h +#define llex_h + +#include "lobject.h" +#include "lzio.h" + + +#define FIRST_RESERVED 257 + +/* maximum length of a reserved word */ +#define TOKEN_LEN (sizeof("function")/sizeof(char)) + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER RESERVED" +*/ +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_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_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, + TK_NAME, TK_STRING, TK_EOS +}; + +/* number of reserved words */ +#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) + + +/* array with token `names' */ +LUAI_DATA const char *const luaX_tokens []; + + +typedef union { + lua_Number r; + TString *ts; +} SemInfo; /* semantics information */ + + +typedef struct Token { + int token; + SemInfo seminfo; +} Token; + + +typedef struct LexState { + int current; /* current character (charint) */ + int linenumber; /* input line counter */ + int lastline; /* line of last token `consumed' */ + Token t; /* current token */ + Token lookahead; /* look ahead token */ + struct FuncState *fs; /* `FuncState' is private to the parser */ + struct lua_State *L; + ZIO *z; /* input stream */ + Mbuffer *buff; /* buffer for tokens */ + TString *source; /* current source name */ + char decpoint; /* locale decimal point */ +} LexState; + + +LUAI_FUNC void luaX_init (lua_State *L); +LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, + TString *source); +LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); +LUAI_FUNC void luaX_next (LexState *ls); +LUAI_FUNC void luaX_lookahead (LexState *ls); +LUAI_FUNC void luaX_lexerror (LexState *ls, const char *msg, int token); +LUAI_FUNC void luaX_syntaxerror (LexState *ls, const char *s); +LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); + + +#endif diff --git a/ext/lua-5.1.5/src/llimits.h b/ext/lua-5.1.5/src/llimits.h new file mode 100644 index 000000000..ca8dcb722 --- /dev/null +++ b/ext/lua-5.1.5/src/llimits.h @@ -0,0 +1,128 @@ +/* +** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $ +** Limits, basic types, and some other `installation-dependent' definitions +** See Copyright Notice in lua.h +*/ + +#ifndef llimits_h +#define llimits_h + + +#include +#include + + +#include "lua.h" + + +typedef LUAI_UINT32 lu_int32; + +typedef LUAI_UMEM lu_mem; + +typedef LUAI_MEM l_mem; + + + +/* chars used as small naturals (so that `char' is reserved for characters) */ +typedef unsigned char lu_byte; + + +#define MAX_SIZET ((size_t)(~(size_t)0)-2) + +#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2) + + +#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ + +/* +** conversion of pointer to integer +** this is for hashing only; there is no problem if the integer +** cannot hold the whole pointer value +*/ +#define IntPoint(p) ((unsigned int)(lu_mem)(p)) + + + +/* type to ensure maximum alignment */ +typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; + + +/* result of a `usual argument conversion' over lua_Number */ +typedef LUAI_UACNUMBER l_uacNumber; + + +/* internal assertions for in-house debugging */ +#ifdef lua_assert + +#define check_exp(c,e) (lua_assert(c), (e)) +#define api_check(l,e) lua_assert(e) + +#else + +#define lua_assert(c) ((void)0) +#define check_exp(c,e) (e) +#define api_check luai_apicheck + +#endif + + +#ifndef UNUSED +#define UNUSED(x) ((void)(x)) /* to avoid warnings */ +#endif + + +#ifndef cast +#define cast(t, exp) ((t)(exp)) +#endif + +#define cast_byte(i) cast(lu_byte, (i)) +#define cast_num(i) cast(lua_Number, (i)) +#define cast_int(i) cast(int, (i)) + + + +/* +** type for virtual-machine instructions +** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +*/ +typedef lu_int32 Instruction; + + + +/* maximum stack for a Lua function */ +#define MAXSTACK 250 + + + +/* minimum size for the string table (must be power of 2) */ +#ifndef MINSTRTABSIZE +#define MINSTRTABSIZE 32 +#endif + + +/* minimum size for string buffer */ +#ifndef LUA_MINBUFFER +#define LUA_MINBUFFER 32 +#endif + + +#ifndef lua_lock +#define lua_lock(L) ((void) 0) +#define lua_unlock(L) ((void) 0) +#endif + +#ifndef luai_threadyield +#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} +#endif + + +/* +** macro to control inclusion of some hard tests on stack reallocation +*/ +#ifndef HARDSTACKTESTS +#define condhardstacktests(x) ((void)0) +#else +#define condhardstacktests(x) x +#endif + +#endif diff --git a/ext/lua-5.1.5/src/lmathlib.c b/ext/lua-5.1.5/src/lmathlib.c new file mode 100644 index 000000000..441fbf736 --- /dev/null +++ b/ext/lua-5.1.5/src/lmathlib.c @@ -0,0 +1,263 @@ +/* +** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $ +** Standard mathematical library +** See Copyright Notice in lua.h +*/ + + +#include +#include + +#define lmathlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#undef PI +#define PI (3.14159265358979323846) +#define RADIANS_PER_DEGREE (PI/180.0) + + + +static int math_abs (lua_State *L) { + lua_pushnumber(L, fabs(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sin (lua_State *L) { + lua_pushnumber(L, sin(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sinh (lua_State *L) { + lua_pushnumber(L, sinh(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cos (lua_State *L) { + lua_pushnumber(L, cos(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cosh (lua_State *L) { + lua_pushnumber(L, cosh(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tan (lua_State *L) { + lua_pushnumber(L, tan(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tanh (lua_State *L) { + lua_pushnumber(L, tanh(luaL_checknumber(L, 1))); + return 1; +} + +static int math_asin (lua_State *L) { + lua_pushnumber(L, asin(luaL_checknumber(L, 1))); + return 1; +} + +static int math_acos (lua_State *L) { + lua_pushnumber(L, acos(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan (lua_State *L) { + lua_pushnumber(L, atan(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan2 (lua_State *L) { + lua_pushnumber(L, atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); + return 1; +} + +static int math_ceil (lua_State *L) { + lua_pushnumber(L, ceil(luaL_checknumber(L, 1))); + return 1; +} + +static int math_floor (lua_State *L) { + lua_pushnumber(L, floor(luaL_checknumber(L, 1))); + return 1; +} + +static int math_fmod (lua_State *L) { + lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); + return 1; +} + +static int math_modf (lua_State *L) { + double ip; + double fp = modf(luaL_checknumber(L, 1), &ip); + lua_pushnumber(L, ip); + lua_pushnumber(L, fp); + return 2; +} + +static int math_sqrt (lua_State *L) { + lua_pushnumber(L, sqrt(luaL_checknumber(L, 1))); + return 1; +} + +static int math_pow (lua_State *L) { + lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); + return 1; +} + +static int math_log (lua_State *L) { + lua_pushnumber(L, log(luaL_checknumber(L, 1))); + return 1; +} + +static int math_log10 (lua_State *L) { + lua_pushnumber(L, log10(luaL_checknumber(L, 1))); + return 1; +} + +static int math_exp (lua_State *L) { + lua_pushnumber(L, exp(luaL_checknumber(L, 1))); + return 1; +} + +static int math_deg (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE); + return 1; +} + +static int math_rad (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE); + return 1; +} + +static int math_frexp (lua_State *L) { + int e; + lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e)); + lua_pushinteger(L, e); + return 2; +} + +static int math_ldexp (lua_State *L) { + lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2))); + return 1; +} + + + +static int math_min (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + lua_Number dmin = luaL_checknumber(L, 1); + int i; + for (i=2; i<=n; i++) { + lua_Number d = luaL_checknumber(L, i); + if (d < dmin) + dmin = d; + } + lua_pushnumber(L, dmin); + return 1; +} + + +static int math_max (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + lua_Number dmax = luaL_checknumber(L, 1); + int i; + for (i=2; i<=n; i++) { + lua_Number d = luaL_checknumber(L, i); + if (d > dmax) + dmax = d; + } + lua_pushnumber(L, dmax); + return 1; +} + + +static int math_random (lua_State *L) { + /* the `%' avoids the (rare) case of r==1, and is needed also because on + some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */ + lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX; + switch (lua_gettop(L)) { /* check number of arguments */ + case 0: { /* no arguments */ + lua_pushnumber(L, r); /* Number between 0 and 1 */ + break; + } + case 1: { /* only upper limit */ + int u = luaL_checkint(L, 1); + luaL_argcheck(L, 1<=u, 1, "interval is empty"); + lua_pushnumber(L, floor(r*u)+1); /* int between 1 and `u' */ + break; + } + case 2: { /* lower and upper limits */ + int l = luaL_checkint(L, 1); + int u = luaL_checkint(L, 2); + luaL_argcheck(L, l<=u, 2, "interval is empty"); + lua_pushnumber(L, floor(r*(u-l+1))+l); /* int between `l' and `u' */ + break; + } + default: return luaL_error(L, "wrong number of arguments"); + } + return 1; +} + + +static int math_randomseed (lua_State *L) { + srand(luaL_checkint(L, 1)); + return 0; +} + + +static const luaL_Reg mathlib[] = { + {"abs", math_abs}, + {"acos", math_acos}, + {"asin", math_asin}, + {"atan2", math_atan2}, + {"atan", math_atan}, + {"ceil", math_ceil}, + {"cosh", math_cosh}, + {"cos", math_cos}, + {"deg", math_deg}, + {"exp", math_exp}, + {"floor", math_floor}, + {"fmod", math_fmod}, + {"frexp", math_frexp}, + {"ldexp", math_ldexp}, + {"log10", math_log10}, + {"log", math_log}, + {"max", math_max}, + {"min", math_min}, + {"modf", math_modf}, + {"pow", math_pow}, + {"rad", math_rad}, + {"random", math_random}, + {"randomseed", math_randomseed}, + {"sinh", math_sinh}, + {"sin", math_sin}, + {"sqrt", math_sqrt}, + {"tanh", math_tanh}, + {"tan", math_tan}, + {NULL, NULL} +}; + + +/* +** Open math library +*/ +LUALIB_API int luaopen_math (lua_State *L) { + luaL_register(L, LUA_MATHLIBNAME, mathlib); + lua_pushnumber(L, PI); + lua_setfield(L, -2, "pi"); + lua_pushnumber(L, HUGE_VAL); + lua_setfield(L, -2, "huge"); +#if defined(LUA_COMPAT_MOD) + lua_getfield(L, -1, "fmod"); + lua_setfield(L, -2, "mod"); +#endif + return 1; +} + diff --git a/ext/lua-5.1.5/src/lmem.c b/ext/lua-5.1.5/src/lmem.c new file mode 100644 index 000000000..ae7d8c965 --- /dev/null +++ b/ext/lua-5.1.5/src/lmem.c @@ -0,0 +1,86 @@ +/* +** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + + +#include + +#define lmem_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +/* +** About the realloc function: +** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); +** (`osize' is the old size, `nsize' is the new size) +** +** Lua ensures that (ptr == NULL) iff (osize == 0). +** +** * frealloc(ud, NULL, 0, x) creates a new block of size `x' +** +** * frealloc(ud, p, x, 0) frees the block `p' +** (in this specific case, frealloc must return NULL). +** particularly, frealloc(ud, NULL, 0, 0) does nothing +** (which is equivalent to free(NULL) in ANSI C) +** +** frealloc returns NULL if it cannot create or reallocate the area +** (any reallocation to an equal or smaller size cannot fail!) +*/ + + + +#define MINSIZEARRAY 4 + + +void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems, + int limit, const char *errormsg) { + void *newblock; + int newsize; + if (*size >= limit/2) { /* cannot double it? */ + if (*size >= limit) /* cannot grow even a little? */ + luaG_runerror(L, errormsg); + newsize = limit; /* still have at least one free place */ + } + else { + newsize = (*size)*2; + if (newsize < MINSIZEARRAY) + newsize = MINSIZEARRAY; /* minimum size */ + } + newblock = luaM_reallocv(L, block, *size, newsize, size_elems); + *size = newsize; /* update only when everything else is OK */ + return newblock; +} + + +void *luaM_toobig (lua_State *L) { + luaG_runerror(L, "memory allocation error: block too big"); + return NULL; /* to avoid warnings */ +} + + + +/* +** generic allocation routine. +*/ +void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + block = (*g->frealloc)(g->ud, block, osize, nsize); + if (block == NULL && nsize > 0) + luaD_throw(L, LUA_ERRMEM); + lua_assert((nsize == 0) == (block == NULL)); + g->totalbytes = (g->totalbytes - osize) + nsize; + return block; +} + diff --git a/ext/lua-5.1.5/src/lmem.h b/ext/lua-5.1.5/src/lmem.h new file mode 100644 index 000000000..7c2dcb322 --- /dev/null +++ b/ext/lua-5.1.5/src/lmem.h @@ -0,0 +1,49 @@ +/* +** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#ifndef lmem_h +#define lmem_h + + +#include + +#include "llimits.h" +#include "lua.h" + +#define MEMERRMSG "not enough memory" + + +#define luaM_reallocv(L,b,on,n,e) \ + ((cast(size_t, (n)+1) <= MAX_SIZET/(e)) ? /* +1 to avoid warnings */ \ + luaM_realloc_(L, (b), (on)*(e), (n)*(e)) : \ + luaM_toobig(L)) + +#define luaM_freemem(L, b, s) luaM_realloc_(L, (b), (s), 0) +#define luaM_free(L, b) luaM_realloc_(L, (b), sizeof(*(b)), 0) +#define luaM_freearray(L, b, n, t) luaM_reallocv(L, (b), n, 0, sizeof(t)) + +#define luaM_malloc(L,t) luaM_realloc_(L, NULL, 0, (t)) +#define luaM_new(L,t) cast(t *, luaM_malloc(L, sizeof(t))) +#define luaM_newvector(L,n,t) \ + cast(t *, luaM_reallocv(L, NULL, 0, n, sizeof(t))) + +#define luaM_growvector(L,v,nelems,size,t,limit,e) \ + if ((nelems)+1 > (size)) \ + ((v)=cast(t *, luaM_growaux_(L,v,&(size),sizeof(t),limit,e))) + +#define luaM_reallocvector(L, v,oldn,n,t) \ + ((v)=cast(t *, luaM_reallocv(L, v, oldn, n, sizeof(t)))) + + +LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void *luaM_toobig (lua_State *L); +LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size, + size_t size_elem, int limit, + const char *errormsg); + +#endif + diff --git a/ext/lua-5.1.5/src/loadlib.c b/ext/lua-5.1.5/src/loadlib.c new file mode 100644 index 000000000..6158c5353 --- /dev/null +++ b/ext/lua-5.1.5/src/loadlib.c @@ -0,0 +1,666 @@ +/* +** $Id: loadlib.c,v 1.52.1.4 2009/09/09 13:17:16 roberto Exp $ +** Dynamic library loader for Lua +** See Copyright Notice in lua.h +** +** This module contains an implementation of loadlib for Unix systems +** that have dlfcn, an implementation for Darwin (Mac OS X), an +** implementation for Windows, and a stub for other systems. +*/ + + +#include +#include + + +#define loadlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* prefix for open functions in C libraries */ +#define LUA_POF "luaopen_" + +/* separator for open functions in C libraries */ +#define LUA_OFSEP "_" + + +#define LIBPREFIX "LOADLIB: " + +#define POF LUA_POF +#define LIB_FAIL "open" + + +/* error codes for ll_loadfunc */ +#define ERRLIB 1 +#define ERRFUNC 2 + +#define setprogdir(L) ((void)0) + + +static void ll_unloadlib (void *lib); +static void *ll_load (lua_State *L, const char *path); +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym); + + + +#if defined(LUA_DL_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. +** ========================================================================= +*/ + +#include + +static void ll_unloadlib (void *lib) { + dlclose(lib); +} + + +static void *ll_load (lua_State *L, const char *path) { + void *lib = dlopen(path, RTLD_NOW); + if (lib == NULL) lua_pushstring(L, dlerror()); + return lib; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)dlsym(lib, sym); + if (f == NULL) lua_pushstring(L, dlerror()); + return f; +} + +/* }====================================================== */ + + + +#elif defined(LUA_DL_DLL) +/* +** {====================================================================== +** This is an implementation of loadlib for Windows using native functions. +** ======================================================================= +*/ + +#include + + +#undef setprogdir + +static void setprogdir (lua_State *L) { + char buff[MAX_PATH + 1]; + char *lb; + DWORD nsize = sizeof(buff)/sizeof(char); + DWORD n = GetModuleFileNameA(NULL, buff, nsize); + if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) + luaL_error(L, "unable to get ModuleFileName"); + else { + *lb = '\0'; + luaL_gsub(L, lua_tostring(L, -1), LUA_EXECDIR, buff); + lua_remove(L, -2); /* remove original string */ + } +} + + +static void pusherror (lua_State *L) { + int error = GetLastError(); + char buffer[128]; + if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, buffer, sizeof(buffer), NULL)) + lua_pushstring(L, buffer); + else + lua_pushfstring(L, "system error %d\n", error); +} + +static void ll_unloadlib (void *lib) { + FreeLibrary((HINSTANCE)lib); +} + + +static void *ll_load (lua_State *L, const char *path) { + HINSTANCE lib = LoadLibraryA(path); + if (lib == NULL) pusherror(L); + return lib; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)GetProcAddress((HINSTANCE)lib, sym); + if (f == NULL) pusherror(L); + return f; +} + +/* }====================================================== */ + + + +#elif defined(LUA_DL_DYLD) +/* +** {====================================================================== +** Native Mac OS X / Darwin Implementation +** ======================================================================= +*/ + +#include + + +/* Mac appends a `_' before C function names */ +#undef POF +#define POF "_" LUA_POF + + +static void pusherror (lua_State *L) { + const char *err_str; + const char *err_file; + NSLinkEditErrors err; + int err_num; + NSLinkEditError(&err, &err_num, &err_file, &err_str); + lua_pushstring(L, err_str); +} + + +static const char *errorfromcode (NSObjectFileImageReturnCode ret) { + switch (ret) { + case NSObjectFileImageInappropriateFile: + return "file is not a bundle"; + case NSObjectFileImageArch: + return "library is for wrong CPU type"; + case NSObjectFileImageFormat: + return "bad format"; + case NSObjectFileImageAccess: + return "cannot access file"; + case NSObjectFileImageFailure: + default: + return "unable to load library"; + } +} + + +static void ll_unloadlib (void *lib) { + NSUnLinkModule((NSModule)lib, NSUNLINKMODULE_OPTION_RESET_LAZY_REFERENCES); +} + + +static void *ll_load (lua_State *L, const char *path) { + NSObjectFileImage img; + NSObjectFileImageReturnCode ret; + /* this would be a rare case, but prevents crashing if it happens */ + if(!_dyld_present()) { + lua_pushliteral(L, "dyld not present"); + return NULL; + } + ret = NSCreateObjectFileImageFromFile(path, &img); + if (ret == NSObjectFileImageSuccess) { + NSModule mod = NSLinkModule(img, path, NSLINKMODULE_OPTION_PRIVATE | + NSLINKMODULE_OPTION_RETURN_ON_ERROR); + NSDestroyObjectFileImage(img); + if (mod == NULL) pusherror(L); + return mod; + } + lua_pushstring(L, errorfromcode(ret)); + return NULL; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + NSSymbol nss = NSLookupSymbolInModule((NSModule)lib, sym); + if (nss == NULL) { + lua_pushfstring(L, "symbol " LUA_QS " not found", sym); + return NULL; + } + return (lua_CFunction)NSAddressOfSymbol(nss); +} + +/* }====================================================== */ + + + +#else +/* +** {====================================================== +** Fallback for other systems +** ======================================================= +*/ + +#undef LIB_FAIL +#define LIB_FAIL "absent" + + +#define DLMSG "dynamic libraries not enabled; check your Lua installation" + + +static void ll_unloadlib (void *lib) { + (void)lib; /* to avoid warnings */ +} + + +static void *ll_load (lua_State *L, const char *path) { + (void)path; /* to avoid warnings */ + lua_pushliteral(L, DLMSG); + return NULL; +} + + +static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { + (void)lib; (void)sym; /* to avoid warnings */ + lua_pushliteral(L, DLMSG); + return NULL; +} + +/* }====================================================== */ +#endif + + + +static void **ll_register (lua_State *L, const char *path) { + void **plib; + lua_pushfstring(L, "%s%s", LIBPREFIX, path); + lua_gettable(L, LUA_REGISTRYINDEX); /* check library in registry? */ + if (!lua_isnil(L, -1)) /* is there an entry? */ + plib = (void **)lua_touserdata(L, -1); + else { /* no entry yet; create one */ + lua_pop(L, 1); + plib = (void **)lua_newuserdata(L, sizeof(const void *)); + *plib = NULL; + luaL_getmetatable(L, "_LOADLIB"); + lua_setmetatable(L, -2); + lua_pushfstring(L, "%s%s", LIBPREFIX, path); + lua_pushvalue(L, -2); + lua_settable(L, LUA_REGISTRYINDEX); + } + return plib; +} + + +/* +** __gc tag method: calls library's `ll_unloadlib' function with the lib +** handle +*/ +static int gctm (lua_State *L) { + void **lib = (void **)luaL_checkudata(L, 1, "_LOADLIB"); + if (*lib) ll_unloadlib(*lib); + *lib = NULL; /* mark library as closed */ + return 0; +} + + +static int ll_loadfunc (lua_State *L, const char *path, const char *sym) { + void **reg = ll_register(L, path); + if (*reg == NULL) *reg = ll_load(L, path); + if (*reg == NULL) + return ERRLIB; /* unable to load library */ + else { + lua_CFunction f = ll_sym(L, *reg, sym); + if (f == NULL) + return ERRFUNC; /* unable to find function */ + lua_pushcfunction(L, f); + return 0; /* return function */ + } +} + + +static int ll_loadlib (lua_State *L) { + const char *path = luaL_checkstring(L, 1); + const char *init = luaL_checkstring(L, 2); + int stat = ll_loadfunc(L, path, init); + if (stat == 0) /* no errors? */ + return 1; /* return the loaded function */ + else { /* error; error message is on stack top */ + lua_pushnil(L); + lua_insert(L, -2); + lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); + return 3; /* return nil, error message, and where */ + } +} + + + +/* +** {====================================================== +** 'require' function +** ======================================================= +*/ + + +static int readable (const char *filename) { + FILE *f = fopen(filename, "r"); /* try to open file */ + if (f == NULL) return 0; /* open failed */ + fclose(f); + return 1; +} + + +static const char *pushnexttemplate (lua_State *L, const char *path) { + const char *l; + while (*path == *LUA_PATHSEP) path++; /* skip separators */ + if (*path == '\0') return NULL; /* no more templates */ + l = strchr(path, *LUA_PATHSEP); /* find next separator */ + if (l == NULL) l = path + strlen(path); + lua_pushlstring(L, path, l - path); /* template */ + return l; +} + + +static const char *findfile (lua_State *L, const char *name, + const char *pname) { + const char *path; + name = luaL_gsub(L, name, ".", LUA_DIRSEP); + lua_getfield(L, LUA_ENVIRONINDEX, pname); + path = lua_tostring(L, -1); + if (path == NULL) + luaL_error(L, LUA_QL("package.%s") " must be a string", pname); + lua_pushliteral(L, ""); /* error accumulator */ + while ((path = pushnexttemplate(L, path)) != NULL) { + const char *filename; + filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name); + lua_remove(L, -2); /* remove path template */ + if (readable(filename)) /* does file exist and is readable? */ + return filename; /* return that file name */ + lua_pushfstring(L, "\n\tno file " LUA_QS, filename); + lua_remove(L, -2); /* remove file name */ + lua_concat(L, 2); /* add entry to possible error message */ + } + return NULL; /* not found */ +} + + +static void loaderror (lua_State *L, const char *filename) { + luaL_error(L, "error loading module " LUA_QS " from file " LUA_QS ":\n\t%s", + lua_tostring(L, 1), filename, lua_tostring(L, -1)); +} + + +static int loader_Lua (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + filename = findfile(L, name, "path"); + if (filename == NULL) return 1; /* library not found in this path */ + if (luaL_loadfile(L, filename) != 0) + loaderror(L, filename); + return 1; /* library loaded successfully */ +} + + +static const char *mkfuncname (lua_State *L, const char *modname) { + const char *funcname; + const char *mark = strchr(modname, *LUA_IGMARK); + if (mark) modname = mark + 1; + funcname = luaL_gsub(L, modname, ".", LUA_OFSEP); + funcname = lua_pushfstring(L, POF"%s", funcname); + lua_remove(L, -2); /* remove 'gsub' result */ + return funcname; +} + + +static int loader_C (lua_State *L) { + const char *funcname; + const char *name = luaL_checkstring(L, 1); + const char *filename = findfile(L, name, "cpath"); + if (filename == NULL) return 1; /* library not found in this path */ + funcname = mkfuncname(L, name); + if (ll_loadfunc(L, filename, funcname) != 0) + loaderror(L, filename); + return 1; /* library loaded successfully */ +} + + +static int loader_Croot (lua_State *L) { + const char *funcname; + const char *filename; + const char *name = luaL_checkstring(L, 1); + const char *p = strchr(name, '.'); + int stat; + if (p == NULL) return 0; /* is root */ + lua_pushlstring(L, name, p - name); + filename = findfile(L, lua_tostring(L, -1), "cpath"); + if (filename == NULL) return 1; /* root not found */ + funcname = mkfuncname(L, name); + if ((stat = ll_loadfunc(L, filename, funcname)) != 0) { + if (stat != ERRFUNC) loaderror(L, filename); /* real error */ + lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, + name, filename); + return 1; /* function not found */ + } + return 1; +} + + +static int loader_preload (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_getfield(L, LUA_ENVIRONINDEX, "preload"); + if (!lua_istable(L, -1)) + luaL_error(L, LUA_QL("package.preload") " must be a table"); + lua_getfield(L, -1, name); + if (lua_isnil(L, -1)) /* not found? */ + lua_pushfstring(L, "\n\tno field package.preload['%s']", name); + return 1; +} + + +static const int sentinel_ = 0; +#define sentinel ((void *)&sentinel_) + + +static int ll_require (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + int i; + lua_settop(L, 1); /* _LOADED table will be at index 2 */ + lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_getfield(L, 2, name); + if (lua_toboolean(L, -1)) { /* is it there? */ + if (lua_touserdata(L, -1) == sentinel) /* check loops */ + luaL_error(L, "loop or previous error loading module " LUA_QS, name); + return 1; /* package is already loaded */ + } + /* else must load it; iterate over available loaders */ + lua_getfield(L, LUA_ENVIRONINDEX, "loaders"); + if (!lua_istable(L, -1)) + luaL_error(L, LUA_QL("package.loaders") " must be a table"); + lua_pushliteral(L, ""); /* error message accumulator */ + for (i=1; ; i++) { + lua_rawgeti(L, -2, i); /* get a loader */ + if (lua_isnil(L, -1)) + luaL_error(L, "module " LUA_QS " not found:%s", + name, lua_tostring(L, -2)); + lua_pushstring(L, name); + lua_call(L, 1, 1); /* call it */ + if (lua_isfunction(L, -1)) /* did it find module? */ + break; /* module loaded successfully */ + else if (lua_isstring(L, -1)) /* loader returned error message? */ + lua_concat(L, 2); /* accumulate it */ + else + lua_pop(L, 1); + } + lua_pushlightuserdata(L, sentinel); + lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */ + lua_pushstring(L, name); /* pass name as argument to module */ + lua_call(L, 1, 1); /* run loaded module */ + if (!lua_isnil(L, -1)) /* non-nil return? */ + lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ + lua_getfield(L, 2, name); + if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */ + lua_pushboolean(L, 1); /* use true as result */ + lua_pushvalue(L, -1); /* extra copy to be returned */ + lua_setfield(L, 2, name); /* _LOADED[name] = true */ + } + return 1; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** 'module' function +** ======================================================= +*/ + + +static void setfenv (lua_State *L) { + lua_Debug ar; + if (lua_getstack(L, 1, &ar) == 0 || + lua_getinfo(L, "f", &ar) == 0 || /* get calling function */ + lua_iscfunction(L, -1)) + luaL_error(L, LUA_QL("module") " not called from a Lua function"); + lua_pushvalue(L, -2); + lua_setfenv(L, -2); + lua_pop(L, 1); +} + + +static void dooptions (lua_State *L, int n) { + int i; + for (i = 2; i <= n; i++) { + lua_pushvalue(L, i); /* get option (a function) */ + lua_pushvalue(L, -2); /* module */ + lua_call(L, 1, 0); + } +} + + +static void modinit (lua_State *L, const char *modname) { + const char *dot; + lua_pushvalue(L, -1); + lua_setfield(L, -2, "_M"); /* module._M = module */ + lua_pushstring(L, modname); + lua_setfield(L, -2, "_NAME"); + dot = strrchr(modname, '.'); /* look for last dot in module name */ + if (dot == NULL) dot = modname; + else dot++; + /* set _PACKAGE as package name (full module name minus last part) */ + lua_pushlstring(L, modname, dot - modname); + lua_setfield(L, -2, "_PACKAGE"); +} + + +static int ll_module (lua_State *L) { + const char *modname = luaL_checkstring(L, 1); + int loaded = lua_gettop(L) + 1; /* index of _LOADED table */ + lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_getfield(L, loaded, modname); /* get _LOADED[modname] */ + if (!lua_istable(L, -1)) { /* not found? */ + lua_pop(L, 1); /* remove previous result */ + /* try global variable (and create one if it does not exist) */ + if (luaL_findtable(L, LUA_GLOBALSINDEX, modname, 1) != NULL) + return luaL_error(L, "name conflict for module " LUA_QS, modname); + lua_pushvalue(L, -1); + lua_setfield(L, loaded, modname); /* _LOADED[modname] = new table */ + } + /* check whether table already has a _NAME field */ + lua_getfield(L, -1, "_NAME"); + if (!lua_isnil(L, -1)) /* is table an initialized module? */ + lua_pop(L, 1); + else { /* no; initialize it */ + lua_pop(L, 1); + modinit(L, modname); + } + lua_pushvalue(L, -1); + setfenv(L); + dooptions(L, loaded - 1); + return 0; +} + + +static int ll_seeall (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + if (!lua_getmetatable(L, 1)) { + lua_createtable(L, 0, 1); /* create new metatable */ + lua_pushvalue(L, -1); + lua_setmetatable(L, 1); + } + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setfield(L, -2, "__index"); /* mt.__index = _G */ + return 0; +} + + +/* }====================================================== */ + + + +/* auxiliary mark (for internal use) */ +#define AUXMARK "\1" + +static void setpath (lua_State *L, const char *fieldname, const char *envname, + const char *def) { + const char *path = getenv(envname); + if (path == NULL) /* no environment variable? */ + lua_pushstring(L, def); /* use default */ + else { + /* replace ";;" by ";AUXMARK;" and then AUXMARK by default path */ + path = luaL_gsub(L, path, LUA_PATHSEP LUA_PATHSEP, + LUA_PATHSEP AUXMARK LUA_PATHSEP); + luaL_gsub(L, path, AUXMARK, def); + lua_remove(L, -2); + } + setprogdir(L); + lua_setfield(L, -2, fieldname); +} + + +static const luaL_Reg pk_funcs[] = { + {"loadlib", ll_loadlib}, + {"seeall", ll_seeall}, + {NULL, NULL} +}; + + +static const luaL_Reg ll_funcs[] = { + {"module", ll_module}, + {"require", ll_require}, + {NULL, NULL} +}; + + +static const lua_CFunction loaders[] = + {loader_preload, loader_Lua, loader_C, loader_Croot, NULL}; + + +LUALIB_API int luaopen_package (lua_State *L) { + int i; + /* create new type _LOADLIB */ + luaL_newmetatable(L, "_LOADLIB"); + lua_pushcfunction(L, gctm); + lua_setfield(L, -2, "__gc"); + /* create `package' table */ + luaL_register(L, LUA_LOADLIBNAME, pk_funcs); +#if defined(LUA_COMPAT_LOADLIB) + lua_getfield(L, -1, "loadlib"); + lua_setfield(L, LUA_GLOBALSINDEX, "loadlib"); +#endif + lua_pushvalue(L, -1); + lua_replace(L, LUA_ENVIRONINDEX); + /* create `loaders' table */ + lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0); + /* fill it with pre-defined loaders */ + for (i=0; loaders[i] != NULL; i++) { + lua_pushcfunction(L, loaders[i]); + lua_rawseti(L, -2, i+1); + } + lua_setfield(L, -2, "loaders"); /* put it in field `loaders' */ + setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT); /* set field `path' */ + setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */ + /* store config information */ + lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" + LUA_EXECDIR "\n" LUA_IGMARK); + lua_setfield(L, -2, "config"); + /* set field `loaded' */ + luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2); + lua_setfield(L, -2, "loaded"); + /* set field `preload' */ + lua_newtable(L); + lua_setfield(L, -2, "preload"); + lua_pushvalue(L, LUA_GLOBALSINDEX); + luaL_register(L, NULL, ll_funcs); /* open lib into global table */ + lua_pop(L, 1); + return 1; /* return 'package' table */ +} + diff --git a/ext/lua-5.1.5/src/lobject.c b/ext/lua-5.1.5/src/lobject.c new file mode 100644 index 000000000..4ff50732a --- /dev/null +++ b/ext/lua-5.1.5/src/lobject.c @@ -0,0 +1,214 @@ +/* +** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $ +** Some generic functions over Lua objects +** See Copyright Notice in lua.h +*/ + +#include +#include +#include +#include +#include + +#define lobject_c +#define LUA_CORE + +#include "lua.h" + +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "lvm.h" + + + +const TValue luaO_nilobject_ = {{NULL}, LUA_TNIL}; + + +/* +** converts an integer to a "floating point byte", represented as +** (eeeeexxx), where the real value is (1xxx) * 2^(eeeee - 1) if +** eeeee != 0 and (xxx) otherwise. +*/ +int luaO_int2fb (unsigned int x) { + int e = 0; /* expoent */ + while (x >= 16) { + x = (x+1) >> 1; + e++; + } + if (x < 8) return x; + else return ((e+1) << 3) | (cast_int(x) - 8); +} + + +/* converts back */ +int luaO_fb2int (int x) { + int e = (x >> 3) & 31; + if (e == 0) return x; + else return ((x & 7)+8) << (e - 1); +} + + +int luaO_log2 (unsigned int x) { + static const lu_byte log_2[256] = { + 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, + 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, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + }; + int l = -1; + while (x >= 256) { l += 8; x >>= 8; } + return l + log_2[x]; + +} + + +int luaO_rawequalObj (const TValue *t1, const TValue *t2) { + if (ttype(t1) != ttype(t2)) return 0; + else switch (ttype(t1)) { + case LUA_TNIL: + return 1; + case LUA_TNUMBER: + return luai_numeq(nvalue(t1), nvalue(t2)); + case LUA_TBOOLEAN: + return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */ + case LUA_TLIGHTUSERDATA: + return pvalue(t1) == pvalue(t2); + default: + lua_assert(iscollectable(t1)); + return gcvalue(t1) == gcvalue(t2); + } +} + + +int luaO_str2d (const char *s, lua_Number *result) { + char *endptr; + *result = lua_str2number(s, &endptr); + if (endptr == s) return 0; /* conversion failed */ + if (*endptr == 'x' || *endptr == 'X') /* maybe an hexadecimal constant? */ + *result = cast_num(strtoul(s, &endptr, 16)); + if (*endptr == '\0') return 1; /* most common case */ + while (isspace(cast(unsigned char, *endptr))) endptr++; + if (*endptr != '\0') return 0; /* invalid trailing characters? */ + return 1; +} + + + +static void pushstr (lua_State *L, const char *str) { + setsvalue2s(L, L->top, luaS_new(L, str)); + incr_top(L); +} + + +/* this function handles only `%d', `%c', %f, %p, and `%s' formats */ +const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { + int n = 1; + pushstr(L, ""); + for (;;) { + const char *e = strchr(fmt, '%'); + if (e == NULL) break; + setsvalue2s(L, L->top, luaS_newlstr(L, fmt, e-fmt)); + incr_top(L); + switch (*(e+1)) { + case 's': { + const char *s = va_arg(argp, char *); + if (s == NULL) s = "(null)"; + pushstr(L, s); + break; + } + case 'c': { + char buff[2]; + buff[0] = cast(char, va_arg(argp, int)); + buff[1] = '\0'; + pushstr(L, buff); + break; + } + case 'd': { + setnvalue(L->top, cast_num(va_arg(argp, int))); + incr_top(L); + break; + } + case 'f': { + setnvalue(L->top, cast_num(va_arg(argp, l_uacNumber))); + incr_top(L); + break; + } + case 'p': { + char buff[4*sizeof(void *) + 8]; /* should be enough space for a `%p' */ + sprintf(buff, "%p", va_arg(argp, void *)); + pushstr(L, buff); + break; + } + case '%': { + pushstr(L, "%"); + break; + } + default: { + char buff[3]; + buff[0] = '%'; + buff[1] = *(e+1); + buff[2] = '\0'; + pushstr(L, buff); + break; + } + } + n += 2; + fmt = e+2; + } + pushstr(L, fmt); + luaV_concat(L, n+1, cast_int(L->top - L->base) - 1); + L->top -= n; + return svalue(L->top - 1); +} + + +const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { + const char *msg; + va_list argp; + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + return msg; +} + + +void luaO_chunkid (char *out, const char *source, size_t bufflen) { + if (*source == '=') { + strncpy(out, source+1, bufflen); /* remove first char */ + out[bufflen-1] = '\0'; /* ensures null termination */ + } + else { /* out = "source", or "...source" */ + if (*source == '@') { + size_t l; + source++; /* skip the `@' */ + bufflen -= sizeof(" '...' "); + l = strlen(source); + strcpy(out, ""); + if (l > bufflen) { + source += (l-bufflen); /* get last part of file name */ + strcat(out, "..."); + } + strcat(out, source); + } + else { /* out = [string "string"] */ + size_t len = strcspn(source, "\n\r"); /* stop at first newline */ + bufflen -= sizeof(" [string \"...\"] "); + if (len > bufflen) len = bufflen; + strcpy(out, "[string \""); + if (source[len] != '\0') { /* must truncate? */ + strncat(out, source, len); + strcat(out, "..."); + } + else + strcat(out, source); + strcat(out, "\"]"); + } + } +} diff --git a/ext/lua-5.1.5/src/lobject.h b/ext/lua-5.1.5/src/lobject.h new file mode 100644 index 000000000..f1e447ef3 --- /dev/null +++ b/ext/lua-5.1.5/src/lobject.h @@ -0,0 +1,381 @@ +/* +** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $ +** Type definitions for Lua objects +** See Copyright Notice in lua.h +*/ + + +#ifndef lobject_h +#define lobject_h + + +#include + + +#include "llimits.h" +#include "lua.h" + + +/* tags for values visible from Lua */ +#define LAST_TAG LUA_TTHREAD + +#define NUM_TAGS (LAST_TAG+1) + + +/* +** Extra tags for non-values +*/ +#define LUA_TPROTO (LAST_TAG+1) +#define LUA_TUPVAL (LAST_TAG+2) +#define LUA_TDEADKEY (LAST_TAG+3) + + +/* +** Union of all collectable objects +*/ +typedef union GCObject GCObject; + + +/* +** Common Header for all collectable objects (in macro form, to be +** included in other objects) +*/ +#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked + + +/* +** Common header in struct form +*/ +typedef struct GCheader { + CommonHeader; +} GCheader; + + + + +/* +** Union of all Lua values +*/ +typedef union { + GCObject *gc; + void *p; + lua_Number n; + int b; +} Value; + + +/* +** Tagged Values +*/ + +#define TValuefields Value value; int tt + +typedef struct lua_TValue { + TValuefields; +} TValue; + + +/* Macros to test type */ +#define ttisnil(o) (ttype(o) == LUA_TNIL) +#define ttisnumber(o) (ttype(o) == LUA_TNUMBER) +#define ttisstring(o) (ttype(o) == LUA_TSTRING) +#define ttistable(o) (ttype(o) == LUA_TTABLE) +#define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) +#define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN) +#define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA) +#define ttisthread(o) (ttype(o) == LUA_TTHREAD) +#define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA) + +/* Macros to access values */ +#define ttype(o) ((o)->tt) +#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc) +#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p) +#define nvalue(o) check_exp(ttisnumber(o), (o)->value.n) +#define rawtsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts) +#define tsvalue(o) (&rawtsvalue(o)->tsv) +#define rawuvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u) +#define uvalue(o) (&rawuvalue(o)->uv) +#define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl) +#define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h) +#define bvalue(o) check_exp(ttisboolean(o), (o)->value.b) +#define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th) + +#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) + +/* +** for internal debug only +*/ +#define checkconsistency(obj) \ + lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt)) + +#define checkliveness(g,obj) \ + lua_assert(!iscollectable(obj) || \ + ((ttype(obj) == (obj)->value.gc->gch.tt) && !isdead(g, (obj)->value.gc))) + + +/* Macros to set values */ +#define setnilvalue(obj) ((obj)->tt=LUA_TNIL) + +#define setnvalue(obj,x) \ + { TValue *i_o=(obj); i_o->value.n=(x); i_o->tt=LUA_TNUMBER; } + +#define setpvalue(obj,x) \ + { TValue *i_o=(obj); i_o->value.p=(x); i_o->tt=LUA_TLIGHTUSERDATA; } + +#define setbvalue(obj,x) \ + { TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=LUA_TBOOLEAN; } + +#define setsvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TSTRING; \ + checkliveness(G(L),i_o); } + +#define setuvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TUSERDATA; \ + checkliveness(G(L),i_o); } + +#define setthvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTHREAD; \ + checkliveness(G(L),i_o); } + +#define setclvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TFUNCTION; \ + checkliveness(G(L),i_o); } + +#define sethvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TTABLE; \ + checkliveness(G(L),i_o); } + +#define setptvalue(L,obj,x) \ + { TValue *i_o=(obj); \ + i_o->value.gc=cast(GCObject *, (x)); i_o->tt=LUA_TPROTO; \ + checkliveness(G(L),i_o); } + + + + +#define setobj(L,obj1,obj2) \ + { const TValue *o2=(obj2); TValue *o1=(obj1); \ + o1->value = o2->value; o1->tt=o2->tt; \ + checkliveness(G(L),o1); } + + +/* +** different types of sets, according to destination +*/ + +/* from stack to (same) stack */ +#define setobjs2s setobj +/* to stack (not from same stack) */ +#define setobj2s setobj +#define setsvalue2s setsvalue +#define sethvalue2s sethvalue +#define setptvalue2s setptvalue +/* from table to same table */ +#define setobjt2t setobj +/* to table */ +#define setobj2t setobj +/* to new object */ +#define setobj2n setobj +#define setsvalue2n setsvalue + +#define setttype(obj, tt) (ttype(obj) = (tt)) + + +#define iscollectable(o) (ttype(o) >= LUA_TSTRING) + + + +typedef TValue *StkId; /* index to stack elements */ + + +/* +** String headers for string table +*/ +typedef union TString { + L_Umaxalign dummy; /* ensures maximum alignment for strings */ + struct { + CommonHeader; + lu_byte reserved; + unsigned int hash; + size_t len; + } tsv; +} TString; + + +#define getstr(ts) cast(const char *, (ts) + 1) +#define svalue(o) getstr(rawtsvalue(o)) + + + +typedef union Udata { + L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ + struct { + CommonHeader; + struct Table *metatable; + struct Table *env; + size_t len; + } uv; +} Udata; + + + + +/* +** Function Prototypes +*/ +typedef struct Proto { + CommonHeader; + TValue *k; /* constants used by the function */ + Instruction *code; + struct Proto **p; /* functions defined inside the function */ + int *lineinfo; /* map from opcodes to source lines */ + struct LocVar *locvars; /* information about local variables */ + TString **upvalues; /* upvalue names */ + TString *source; + int sizeupvalues; + int sizek; /* size of `k' */ + int sizecode; + int sizelineinfo; + int sizep; /* size of `p' */ + int sizelocvars; + int linedefined; + int lastlinedefined; + GCObject *gclist; + lu_byte nups; /* number of upvalues */ + lu_byte numparams; + lu_byte is_vararg; + lu_byte maxstacksize; +} Proto; + + +/* masks for new-style vararg */ +#define VARARG_HASARG 1 +#define VARARG_ISVARARG 2 +#define VARARG_NEEDSARG 4 + + +typedef struct LocVar { + TString *varname; + int startpc; /* first point where variable is active */ + int endpc; /* first point where variable is dead */ +} LocVar; + + + +/* +** Upvalues +*/ + +typedef struct UpVal { + CommonHeader; + TValue *v; /* points to stack or to its own value */ + union { + TValue value; /* the value (when closed) */ + struct { /* double linked list (when open) */ + struct UpVal *prev; + struct UpVal *next; + } l; + } u; +} UpVal; + + +/* +** Closures +*/ + +#define ClosureHeader \ + CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \ + struct Table *env + +typedef struct CClosure { + ClosureHeader; + lua_CFunction f; + TValue upvalue[1]; +} CClosure; + + +typedef struct LClosure { + ClosureHeader; + struct Proto *p; + UpVal *upvals[1]; +} LClosure; + + +typedef union Closure { + CClosure c; + LClosure l; +} Closure; + + +#define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC) +#define isLfunction(o) (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC) + + +/* +** Tables +*/ + +typedef union TKey { + struct { + TValuefields; + struct Node *next; /* for chaining */ + } nk; + TValue tvk; +} TKey; + + +typedef struct Node { + TValue i_val; + TKey i_key; +} Node; + + +typedef struct Table { + CommonHeader; + lu_byte flags; /* 1<

lsizenode)) + + +#define luaO_nilobject (&luaO_nilobject_) + +LUAI_DATA const TValue luaO_nilobject_; + +#define ceillog2(x) (luaO_log2((x)-1) + 1) + +LUAI_FUNC int luaO_log2 (unsigned int x); +LUAI_FUNC int luaO_int2fb (unsigned int x); +LUAI_FUNC int luaO_fb2int (int x); +LUAI_FUNC int luaO_rawequalObj (const TValue *t1, const TValue *t2); +LUAI_FUNC int luaO_str2d (const char *s, lua_Number *result); +LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, + va_list argp); +LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); +LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t len); + + +#endif + diff --git a/ext/lua-5.1.5/src/lopcodes.c b/ext/lua-5.1.5/src/lopcodes.c new file mode 100644 index 000000000..4cc745230 --- /dev/null +++ b/ext/lua-5.1.5/src/lopcodes.c @@ -0,0 +1,102 @@ +/* +** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $ +** See Copyright Notice in lua.h +*/ + + +#define lopcodes_c +#define LUA_CORE + + +#include "lopcodes.h" + + +/* ORDER OP */ + +const char *const luaP_opnames[NUM_OPCODES+1] = { + "MOVE", + "LOADK", + "LOADBOOL", + "LOADNIL", + "GETUPVAL", + "GETGLOBAL", + "GETTABLE", + "SETGLOBAL", + "SETUPVAL", + "SETTABLE", + "NEWTABLE", + "SELF", + "ADD", + "SUB", + "MUL", + "DIV", + "MOD", + "POW", + "UNM", + "NOT", + "LEN", + "CONCAT", + "JMP", + "EQ", + "LT", + "LE", + "TEST", + "TESTSET", + "CALL", + "TAILCALL", + "RETURN", + "FORLOOP", + "FORPREP", + "TFORLOOP", + "SETLIST", + "CLOSE", + "CLOSURE", + "VARARG", + NULL +}; + + +#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m)) + +const lu_byte luaP_opmodes[NUM_OPCODES] = { +/* T A B C mode opcode */ + opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_MOVE */ + ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_LOADK */ + ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ + ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LOADNIL */ + ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ + ,opmode(0, 1, OpArgK, OpArgN, iABx) /* OP_GETGLOBAL */ + ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETTABLE */ + ,opmode(0, 0, OpArgK, OpArgN, iABx) /* OP_SETGLOBAL */ + ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_SETUPVAL */ + ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABLE */ + ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_NEWTABLE */ + ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_SELF */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_ADD */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SUB */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MUL */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_MOD */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */ + ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ + ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_NOT */ + ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_LEN */ + ,opmode(0, 1, OpArgR, OpArgR, iABC) /* OP_CONCAT */ + ,opmode(0, 0, OpArgR, OpArgN, iAsBx) /* OP_JMP */ + ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_EQ */ + ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LT */ + ,opmode(1, 0, OpArgK, OpArgK, iABC) /* OP_LE */ + ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TEST */ + ,opmode(1, 1, OpArgR, OpArgU, iABC) /* OP_TESTSET */ + ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_CALL */ + ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_TAILCALL */ + ,opmode(0, 0, OpArgU, OpArgN, iABC) /* OP_RETURN */ + ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORLOOP */ + ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_FORPREP */ + ,opmode(1, 0, OpArgN, OpArgU, iABC) /* OP_TFORLOOP */ + ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */ + ,opmode(0, 0, OpArgN, OpArgN, iABC) /* OP_CLOSE */ + ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */ + ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */ +}; + diff --git a/ext/lua-5.1.5/src/lopcodes.h b/ext/lua-5.1.5/src/lopcodes.h new file mode 100644 index 000000000..41224d6ee --- /dev/null +++ b/ext/lua-5.1.5/src/lopcodes.h @@ -0,0 +1,268 @@ +/* +** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lopcodes_h +#define lopcodes_h + +#include "llimits.h" + + +/*=========================================================================== + We assume that instructions are unsigned numbers. + All instructions have an opcode in the first 6 bits. + Instructions can have the following fields: + `A' : 8 bits + `B' : 9 bits + `C' : 9 bits + `Bx' : 18 bits (`B' and `C' together) + `sBx' : signed Bx + + A signed argument is represented in excess K; that is, the number + value is the unsigned value minus K. K is exactly the maximum value + for that argument (so that -max is represented by 0, and +max is + represented by 2*max), which is half the maximum for the corresponding + unsigned argument. +===========================================================================*/ + + +enum OpMode {iABC, iABx, iAsBx}; /* basic instruction format */ + + +/* +** size and position of opcode arguments. +*/ +#define SIZE_C 9 +#define SIZE_B 9 +#define SIZE_Bx (SIZE_C + SIZE_B) +#define SIZE_A 8 + +#define SIZE_OP 6 + +#define POS_OP 0 +#define POS_A (POS_OP + SIZE_OP) +#define POS_C (POS_A + SIZE_A) +#define POS_B (POS_C + SIZE_C) +#define POS_Bx POS_C + + +/* +** limits for opcode arguments. +** we use (signed) int to manipulate most arguments, +** so they must fit in LUAI_BITSINT-1 bits (-1 for sign) +*/ +#if SIZE_Bx < LUAI_BITSINT-1 +#define MAXARG_Bx ((1<>1) /* `sBx' is signed */ +#else +#define MAXARG_Bx MAX_INT +#define MAXARG_sBx MAX_INT +#endif + + +#define MAXARG_A ((1<>POS_OP) & MASK1(SIZE_OP,0))) +#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ + ((cast(Instruction, o)<>POS_A) & MASK1(SIZE_A,0))) +#define SETARG_A(i,u) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ + ((cast(Instruction, u)<>POS_B) & MASK1(SIZE_B,0))) +#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ + ((cast(Instruction, b)<>POS_C) & MASK1(SIZE_C,0))) +#define SETARG_C(i,b) ((i) = (((i)&MASK0(SIZE_C,POS_C)) | \ + ((cast(Instruction, b)<>POS_Bx) & MASK1(SIZE_Bx,0))) +#define SETARG_Bx(i,b) ((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \ + ((cast(Instruction, b)< C) then pc++ */ +OP_TESTSET,/* A B C if (R(B) <=> C) then R(A) := R(B) else pc++ */ + +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 return R(A)(R(A+1), ... ,R(A+B-1)) */ +OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */ + +OP_FORLOOP,/* A sBx R(A)+=R(A+2); + if R(A) =) R(A)*/ +OP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n)) */ + +OP_VARARG/* A B R(A), R(A+1), ..., R(A+B-1) = vararg */ +} OpCode; + + +#define NUM_OPCODES (cast(int, OP_VARARG) + 1) + + + +/*=========================================================================== + Notes: + (*) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1, + and can be 0: OP_CALL then sets `top' to last_result+1, so + next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'. + + (*) In OP_VARARG, if (B == 0) then use actual number of varargs and + set top (like in OP_CALL with C == 0). + + (*) In OP_RETURN, if (B == 0) then return up to `top' + + (*) In OP_SETLIST, if (B == 0) then B = `top'; + if (C == 0) then next `instruction' is real C + + (*) For comparisons, A specifies what condition the test should accept + (true or false). + + (*) All `skips' (pc++) assume that next instruction is a jump +===========================================================================*/ + + +/* +** masks for instruction properties. The format is: +** bits 0-1: op mode +** bits 2-3: C arg mode +** bits 4-5: B arg mode +** bit 6: instruction set register A +** bit 7: operator is a test +*/ + +enum OpArgMask { + OpArgN, /* argument is not used */ + OpArgU, /* argument is used */ + OpArgR, /* argument is a register or a jump offset */ + OpArgK /* argument is a constant or register/constant */ +}; + +LUAI_DATA const lu_byte luaP_opmodes[NUM_OPCODES]; + +#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 3)) +#define getBMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 4) & 3)) +#define getCMode(m) (cast(enum OpArgMask, (luaP_opmodes[m] >> 2) & 3)) +#define testAMode(m) (luaP_opmodes[m] & (1 << 6)) +#define testTMode(m) (luaP_opmodes[m] & (1 << 7)) + + +LUAI_DATA const char *const luaP_opnames[NUM_OPCODES+1]; /* opcode names */ + + +/* number of list items to accumulate before a SETLIST instruction */ +#define LFIELDS_PER_FLUSH 50 + + +#endif diff --git a/ext/lua-5.1.5/src/loslib.c b/ext/lua-5.1.5/src/loslib.c new file mode 100644 index 000000000..da06a572a --- /dev/null +++ b/ext/lua-5.1.5/src/loslib.c @@ -0,0 +1,243 @@ +/* +** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $ +** Standard Operating System library +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include +#include + +#define loslib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static int os_pushresult (lua_State *L, int i, const char *filename) { + int en = errno; /* calls to Lua API may change this value */ + if (i) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + lua_pushfstring(L, "%s: %s", filename, strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + + +static int os_execute (lua_State *L) { + lua_pushinteger(L, system(luaL_optstring(L, 1, NULL))); + return 1; +} + + +static int os_remove (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + return os_pushresult(L, remove(filename) == 0, filename); +} + + +static int os_rename (lua_State *L) { + const char *fromname = luaL_checkstring(L, 1); + const char *toname = luaL_checkstring(L, 2); + return os_pushresult(L, rename(fromname, toname) == 0, fromname); +} + + +static int os_tmpname (lua_State *L) { + char buff[LUA_TMPNAMBUFSIZE]; + int err; + lua_tmpnam(buff, err); + if (err) + return luaL_error(L, "unable to generate a unique filename"); + lua_pushstring(L, buff); + return 1; +} + + +static int os_getenv (lua_State *L) { + lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ + return 1; +} + + +static int os_clock (lua_State *L) { + lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); + return 1; +} + + +/* +** {====================================================== +** Time/Date operations +** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, +** wday=%w+1, yday=%j, isdst=? } +** ======================================================= +*/ + +static void setfield (lua_State *L, const char *key, int value) { + lua_pushinteger(L, value); + lua_setfield(L, -2, key); +} + +static void setboolfield (lua_State *L, const char *key, int value) { + if (value < 0) /* undefined? */ + return; /* does not set field */ + lua_pushboolean(L, value); + lua_setfield(L, -2, key); +} + +static int getboolfield (lua_State *L, const char *key) { + int res; + lua_getfield(L, -1, key); + res = lua_isnil(L, -1) ? -1 : lua_toboolean(L, -1); + lua_pop(L, 1); + return res; +} + + +static int getfield (lua_State *L, const char *key, int d) { + int res; + lua_getfield(L, -1, key); + if (lua_isnumber(L, -1)) + res = (int)lua_tointeger(L, -1); + else { + if (d < 0) + return luaL_error(L, "field " LUA_QS " missing in date table", key); + res = d; + } + lua_pop(L, 1); + return res; +} + + +static int os_date (lua_State *L) { + const char *s = luaL_optstring(L, 1, "%c"); + time_t t = luaL_opt(L, (time_t)luaL_checknumber, 2, time(NULL)); + struct tm *stm; + if (*s == '!') { /* UTC? */ + stm = gmtime(&t); + s++; /* skip `!' */ + } + else + stm = localtime(&t); + if (stm == NULL) /* invalid date? */ + lua_pushnil(L); + else if (strcmp(s, "*t") == 0) { + lua_createtable(L, 0, 9); /* 9 = number of fields */ + setfield(L, "sec", stm->tm_sec); + setfield(L, "min", stm->tm_min); + setfield(L, "hour", stm->tm_hour); + setfield(L, "day", stm->tm_mday); + setfield(L, "month", stm->tm_mon+1); + setfield(L, "year", stm->tm_year+1900); + setfield(L, "wday", stm->tm_wday+1); + setfield(L, "yday", stm->tm_yday+1); + setboolfield(L, "isdst", stm->tm_isdst); + } + else { + char cc[3]; + luaL_Buffer b; + cc[0] = '%'; cc[2] = '\0'; + luaL_buffinit(L, &b); + for (; *s; s++) { + if (*s != '%' || *(s + 1) == '\0') /* no conversion specifier? */ + luaL_addchar(&b, *s); + else { + size_t reslen; + char buff[200]; /* should be big enough for any conversion result */ + cc[1] = *(++s); + reslen = strftime(buff, sizeof(buff), cc, stm); + luaL_addlstring(&b, buff, reslen); + } + } + luaL_pushresult(&b); + } + return 1; +} + + +static int os_time (lua_State *L) { + time_t t; + if (lua_isnoneornil(L, 1)) /* called without args? */ + t = time(NULL); /* get current time */ + else { + struct tm ts; + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 1); /* make sure table is at the top */ + ts.tm_sec = getfield(L, "sec", 0); + ts.tm_min = getfield(L, "min", 0); + ts.tm_hour = getfield(L, "hour", 12); + ts.tm_mday = getfield(L, "day", -1); + ts.tm_mon = getfield(L, "month", -1) - 1; + ts.tm_year = getfield(L, "year", -1) - 1900; + ts.tm_isdst = getboolfield(L, "isdst"); + t = mktime(&ts); + } + if (t == (time_t)(-1)) + lua_pushnil(L); + else + lua_pushnumber(L, (lua_Number)t); + return 1; +} + + +static int os_difftime (lua_State *L) { + lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), + (time_t)(luaL_optnumber(L, 2, 0)))); + return 1; +} + +/* }====================================================== */ + + +static int os_setlocale (lua_State *L) { + static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, + LC_NUMERIC, LC_TIME}; + static const char *const catnames[] = {"all", "collate", "ctype", "monetary", + "numeric", "time", NULL}; + const char *l = luaL_optstring(L, 1, NULL); + int op = luaL_checkoption(L, 2, "all", catnames); + lua_pushstring(L, setlocale(cat[op], l)); + return 1; +} + + +static int os_exit (lua_State *L) { + exit(luaL_optint(L, 1, EXIT_SUCCESS)); +} + +static const luaL_Reg syslib[] = { + {"clock", os_clock}, + {"date", os_date}, + {"difftime", os_difftime}, + {"execute", os_execute}, + {"exit", os_exit}, + {"getenv", os_getenv}, + {"remove", os_remove}, + {"rename", os_rename}, + {"setlocale", os_setlocale}, + {"time", os_time}, + {"tmpname", os_tmpname}, + {NULL, NULL} +}; + +/* }====================================================== */ + + + +LUALIB_API int luaopen_os (lua_State *L) { + luaL_register(L, LUA_OSLIBNAME, syslib); + return 1; +} + diff --git a/ext/lua-5.1.5/src/lparser.c b/ext/lua-5.1.5/src/lparser.c new file mode 100644 index 000000000..dda7488dc --- /dev/null +++ b/ext/lua-5.1.5/src/lparser.c @@ -0,0 +1,1339 @@ +/* +** $Id: lparser.c,v 2.42.1.4 2011/10/21 19:31:42 roberto Exp $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + + +#include + +#define lparser_c +#define LUA_CORE + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" + + + +#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) + +#define getlocvar(fs, i) ((fs)->f->locvars[(fs)->actvar[i]]) + +#define luaY_checklimit(fs,v,l,m) if ((v)>(l)) errorlimit(fs,l,m) + + +/* +** nodes for block list (list of active blocks) +*/ +typedef struct BlockCnt { + struct BlockCnt *previous; /* chain */ + int breaklist; /* list of jumps out of this loop */ + lu_byte nactvar; /* # active locals outside the breakable structure */ + lu_byte upval; /* true if some variable in the block is an upvalue */ + lu_byte isbreakable; /* true if `block' is a loop */ +} BlockCnt; + + + +/* +** prototypes for recursive non-terminal functions +*/ +static void chunk (LexState *ls); +static void expr (LexState *ls, expdesc *v); + + +static void anchor_token (LexState *ls) { + if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { + TString *ts = ls->t.seminfo.ts; + luaX_newstring(ls, getstr(ts), ts->tsv.len); + } +} + + +static void error_expected (LexState *ls, int token) { + luaX_syntaxerror(ls, + luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token))); +} + + +static void errorlimit (FuncState *fs, int limit, const char *what) { + const char *msg = (fs->f->linedefined == 0) ? + luaO_pushfstring(fs->L, "main function has more than %d %s", limit, what) : + luaO_pushfstring(fs->L, "function at line %d has more than %d %s", + fs->f->linedefined, limit, what); + luaX_lexerror(fs->ls, msg, 0); +} + + +static int testnext (LexState *ls, int c) { + if (ls->t.token == c) { + luaX_next(ls); + return 1; + } + else return 0; +} + + +static void check (LexState *ls, int c) { + if (ls->t.token != c) + error_expected(ls, c); +} + +static void checknext (LexState *ls, int c) { + check(ls, c); + luaX_next(ls); +} + + +#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } + + + +static void check_match (LexState *ls, int what, int who, int where) { + if (!testnext(ls, what)) { + if (where == ls->linenumber) + error_expected(ls, what); + else { + luaX_syntaxerror(ls, luaO_pushfstring(ls->L, + LUA_QS " expected (to close " LUA_QS " at line %d)", + luaX_token2str(ls, what), luaX_token2str(ls, who), where)); + } + } +} + + +static TString *str_checkname (LexState *ls) { + TString *ts; + check(ls, TK_NAME); + ts = ls->t.seminfo.ts; + luaX_next(ls); + return ts; +} + + +static void init_exp (expdesc *e, expkind k, int i) { + e->f = e->t = NO_JUMP; + e->k = k; + e->u.s.info = i; +} + + +static void codestring (LexState *ls, expdesc *e, TString *s) { + init_exp(e, VK, luaK_stringK(ls->fs, s)); +} + + +static void checkname(LexState *ls, expdesc *e) { + codestring(ls, e, str_checkname(ls)); +} + + +static int registerlocalvar (LexState *ls, TString *varname) { + FuncState *fs = ls->fs; + Proto *f = fs->f; + int oldsize = f->sizelocvars; + luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, + LocVar, SHRT_MAX, "too many local variables"); + while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL; + f->locvars[fs->nlocvars].varname = varname; + luaC_objbarrier(ls->L, f, varname); + return fs->nlocvars++; +} + + +#define new_localvarliteral(ls,v,n) \ + new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n) + + +static void new_localvar (LexState *ls, TString *name, int n) { + FuncState *fs = ls->fs; + luaY_checklimit(fs, fs->nactvar+n+1, LUAI_MAXVARS, "local variables"); + fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name)); +} + + +static void adjustlocalvars (LexState *ls, int nvars) { + FuncState *fs = ls->fs; + fs->nactvar = cast_byte(fs->nactvar + nvars); + for (; nvars; nvars--) { + getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc; + } +} + + +static void removevars (LexState *ls, int tolevel) { + FuncState *fs = ls->fs; + while (fs->nactvar > tolevel) + getlocvar(fs, --fs->nactvar).endpc = fs->pc; +} + + +static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { + int i; + Proto *f = fs->f; + int oldsize = f->sizeupvalues; + for (i=0; inups; i++) { + if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info) { + lua_assert(f->upvalues[i] == name); + return i; + } + } + /* new one */ + luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues"); + luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues, + TString *, MAX_INT, ""); + while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL; + f->upvalues[f->nups] = name; + luaC_objbarrier(fs->L, f, name); + lua_assert(v->k == VLOCAL || v->k == VUPVAL); + fs->upvalues[f->nups].k = cast_byte(v->k); + fs->upvalues[f->nups].info = cast_byte(v->u.s.info); + return f->nups++; +} + + +static int searchvar (FuncState *fs, TString *n) { + int i; + for (i=fs->nactvar-1; i >= 0; i--) { + if (n == getlocvar(fs, i).varname) + return i; + } + return -1; /* not found */ +} + + +static void markupval (FuncState *fs, int level) { + BlockCnt *bl = fs->bl; + while (bl && bl->nactvar > level) bl = bl->previous; + if (bl) bl->upval = 1; +} + + +static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { + if (fs == NULL) { /* no more levels? */ + init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ + return VGLOBAL; + } + else { + int v = searchvar(fs, n); /* look up at current level */ + if (v >= 0) { + init_exp(var, VLOCAL, v); + if (!base) + markupval(fs, v); /* local will be used as an upval */ + return VLOCAL; + } + else { /* not found at current level; try upper one */ + if (singlevaraux(fs->prev, n, var, 0) == VGLOBAL) + return VGLOBAL; + var->u.s.info = indexupvalue(fs, n, var); /* else was LOCAL or UPVAL */ + var->k = VUPVAL; /* upvalue in this level */ + return VUPVAL; + } + } +} + + +static void singlevar (LexState *ls, expdesc *var) { + TString *varname = str_checkname(ls); + FuncState *fs = ls->fs; + if (singlevaraux(fs, varname, var, 1) == VGLOBAL) + var->u.s.info = luaK_stringK(fs, varname); /* info points to global name */ +} + + +static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { + FuncState *fs = ls->fs; + int extra = nvars - nexps; + if (hasmultret(e->k)) { + extra++; /* includes call itself */ + if (extra < 0) extra = 0; + luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ + if (extra > 1) luaK_reserveregs(fs, extra-1); + } + else { + if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */ + if (extra > 0) { + int reg = fs->freereg; + luaK_reserveregs(fs, extra); + luaK_nil(fs, reg, extra); + } + } +} + + +static void enterlevel (LexState *ls) { + if (++ls->L->nCcalls > LUAI_MAXCCALLS) + luaX_lexerror(ls, "chunk has too many syntax levels", 0); +} + + +#define leavelevel(ls) ((ls)->L->nCcalls--) + + +static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isbreakable) { + bl->breaklist = NO_JUMP; + bl->isbreakable = isbreakable; + bl->nactvar = fs->nactvar; + bl->upval = 0; + bl->previous = fs->bl; + fs->bl = bl; + lua_assert(fs->freereg == fs->nactvar); +} + + +static void leaveblock (FuncState *fs) { + BlockCnt *bl = fs->bl; + fs->bl = bl->previous; + removevars(fs->ls, bl->nactvar); + if (bl->upval) + luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); + /* a block either controls scope or breaks (never both) */ + lua_assert(!bl->isbreakable || !bl->upval); + lua_assert(bl->nactvar == fs->nactvar); + fs->freereg = fs->nactvar; /* free registers */ + luaK_patchtohere(fs, bl->breaklist); +} + + +static void pushclosure (LexState *ls, FuncState *func, expdesc *v) { + FuncState *fs = ls->fs; + Proto *f = fs->f; + int oldsize = f->sizep; + int i; + luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, + MAXARG_Bx, "constant table overflow"); + while (oldsize < f->sizep) f->p[oldsize++] = NULL; + f->p[fs->np++] = func->f; + luaC_objbarrier(ls->L, f, func->f); + init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); + for (i=0; if->nups; i++) { + OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; + luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0); + } +} + + +static void open_func (LexState *ls, FuncState *fs) { + lua_State *L = ls->L; + Proto *f = luaF_newproto(L); + fs->f = f; + fs->prev = ls->fs; /* linked list of funcstates */ + fs->ls = ls; + fs->L = L; + ls->fs = fs; + fs->pc = 0; + fs->lasttarget = -1; + fs->jpc = NO_JUMP; + fs->freereg = 0; + fs->nk = 0; + fs->np = 0; + fs->nlocvars = 0; + fs->nactvar = 0; + fs->bl = NULL; + f->source = ls->source; + f->maxstacksize = 2; /* registers 0/1 are always valid */ + fs->h = luaH_new(L, 0, 0); + /* anchor table of constants and prototype (to avoid being collected) */ + sethvalue2s(L, L->top, fs->h); + incr_top(L); + setptvalue2s(L, L->top, f); + incr_top(L); +} + + +static void close_func (LexState *ls) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; + removevars(ls, 0); + luaK_ret(fs, 0, 0); /* final return */ + luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); + f->sizecode = fs->pc; + luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); + f->sizelineinfo = fs->pc; + luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); + f->sizek = fs->nk; + luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); + f->sizep = fs->np; + luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); + f->sizelocvars = fs->nlocvars; + luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); + f->sizeupvalues = f->nups; + lua_assert(luaG_checkcode(f)); + lua_assert(fs->bl == NULL); + ls->fs = fs->prev; + /* last token read was anchored in defunct function; must reanchor it */ + if (fs) anchor_token(ls); + L->top -= 2; /* remove table and prototype from the stack */ +} + + +Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { + struct LexState lexstate; + struct FuncState funcstate; + lexstate.buff = buff; + luaX_setinput(L, &lexstate, z, luaS_new(L, name)); + open_func(&lexstate, &funcstate); + funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ + luaX_next(&lexstate); /* read first token */ + chunk(&lexstate); + check(&lexstate, TK_EOS); + close_func(&lexstate); + lua_assert(funcstate.prev == NULL); + lua_assert(funcstate.f->nups == 0); + lua_assert(lexstate.fs == NULL); + return funcstate.f; +} + + + +/*============================================================*/ +/* GRAMMAR RULES */ +/*============================================================*/ + + +static void field (LexState *ls, expdesc *v) { + /* field -> ['.' | ':'] NAME */ + FuncState *fs = ls->fs; + expdesc key; + luaK_exp2anyreg(fs, v); + luaX_next(ls); /* skip the dot or colon */ + checkname(ls, &key); + luaK_indexed(fs, v, &key); +} + + +static void yindex (LexState *ls, expdesc *v) { + /* index -> '[' expr ']' */ + luaX_next(ls); /* skip the '[' */ + expr(ls, v); + luaK_exp2val(ls->fs, v); + checknext(ls, ']'); +} + + +/* +** {====================================================================== +** Rules for Constructors +** ======================================================================= +*/ + + +struct ConsControl { + expdesc v; /* last list item read */ + expdesc *t; /* table descriptor */ + int nh; /* total number of `record' elements */ + int na; /* total number of array elements */ + int tostore; /* number of array elements pending to be stored */ +}; + + +static void recfield (LexState *ls, struct ConsControl *cc) { + /* recfield -> (NAME | `['exp1`]') = exp1 */ + FuncState *fs = ls->fs; + int reg = ls->fs->freereg; + expdesc key, val; + int rkkey; + if (ls->t.token == TK_NAME) { + luaY_checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); + checkname(ls, &key); + } + else /* ls->t.token == '[' */ + yindex(ls, &key); + cc->nh++; + checknext(ls, '='); + rkkey = luaK_exp2RK(fs, &key); + expr(ls, &val); + luaK_codeABC(fs, OP_SETTABLE, cc->t->u.s.info, rkkey, luaK_exp2RK(fs, &val)); + fs->freereg = reg; /* free registers */ +} + + +static void closelistfield (FuncState *fs, struct ConsControl *cc) { + if (cc->v.k == VVOID) return; /* there is no list item */ + luaK_exp2nextreg(fs, &cc->v); + cc->v.k = VVOID; + if (cc->tostore == LFIELDS_PER_FLUSH) { + luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); /* flush */ + cc->tostore = 0; /* no more items pending */ + } +} + + +static void lastlistfield (FuncState *fs, struct ConsControl *cc) { + if (cc->tostore == 0) return; + if (hasmultret(cc->v.k)) { + luaK_setmultret(fs, &cc->v); + luaK_setlist(fs, cc->t->u.s.info, cc->na, LUA_MULTRET); + cc->na--; /* do not count last expression (unknown number of elements) */ + } + else { + if (cc->v.k != VVOID) + luaK_exp2nextreg(fs, &cc->v); + luaK_setlist(fs, cc->t->u.s.info, cc->na, cc->tostore); + } +} + + +static void listfield (LexState *ls, struct ConsControl *cc) { + expr(ls, &cc->v); + luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); + cc->na++; + cc->tostore++; +} + + +static void constructor (LexState *ls, expdesc *t) { + /* constructor -> ?? */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + struct ConsControl cc; + cc.na = cc.nh = cc.tostore = 0; + cc.t = t; + init_exp(t, VRELOCABLE, pc); + init_exp(&cc.v, VVOID, 0); /* no value (yet) */ + luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ + checknext(ls, '{'); + do { + lua_assert(cc.v.k == VVOID || cc.tostore > 0); + if (ls->t.token == '}') break; + closelistfield(fs, &cc); + switch(ls->t.token) { + case TK_NAME: { /* may be listfields or recfields */ + luaX_lookahead(ls); + if (ls->lookahead.token != '=') /* expression? */ + listfield(ls, &cc); + else + recfield(ls, &cc); + break; + } + case '[': { /* constructor_item -> recfield */ + recfield(ls, &cc); + break; + } + default: { /* constructor_part -> listfield */ + listfield(ls, &cc); + break; + } + } + } while (testnext(ls, ',') || testnext(ls, ';')); + check_match(ls, '}', '{', line); + lastlistfield(fs, &cc); + SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ + SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */ +} + +/* }====================================================================== */ + + + +static void parlist (LexState *ls) { + /* parlist -> [ param { `,' param } ] */ + FuncState *fs = ls->fs; + Proto *f = fs->f; + int nparams = 0; + f->is_vararg = 0; + if (ls->t.token != ')') { /* is `parlist' not empty? */ + do { + switch (ls->t.token) { + case TK_NAME: { /* param -> NAME */ + new_localvar(ls, str_checkname(ls), nparams++); + break; + } + case TK_DOTS: { /* param -> `...' */ + luaX_next(ls); +#if defined(LUA_COMPAT_VARARG) + /* use `arg' as default name */ + new_localvarliteral(ls, "arg", nparams++); + f->is_vararg = VARARG_HASARG | VARARG_NEEDSARG; +#endif + f->is_vararg |= VARARG_ISVARARG; + break; + } + default: luaX_syntaxerror(ls, " or " LUA_QL("...") " expected"); + } + } while (!f->is_vararg && testnext(ls, ',')); + } + adjustlocalvars(ls, nparams); + f->numparams = cast_byte(fs->nactvar - (f->is_vararg & VARARG_HASARG)); + luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ +} + + +static void body (LexState *ls, expdesc *e, int needself, int line) { + /* body -> `(' parlist `)' chunk END */ + FuncState new_fs; + open_func(ls, &new_fs); + new_fs.f->linedefined = line; + checknext(ls, '('); + if (needself) { + new_localvarliteral(ls, "self", 0); + adjustlocalvars(ls, 1); + } + parlist(ls); + checknext(ls, ')'); + chunk(ls); + new_fs.f->lastlinedefined = ls->linenumber; + check_match(ls, TK_END, TK_FUNCTION, line); + close_func(ls); + pushclosure(ls, &new_fs, e); +} + + +static int explist1 (LexState *ls, expdesc *v) { + /* explist1 -> expr { `,' expr } */ + int n = 1; /* at least one expression */ + expr(ls, v); + while (testnext(ls, ',')) { + luaK_exp2nextreg(ls->fs, v); + expr(ls, v); + n++; + } + return n; +} + + +static void funcargs (LexState *ls, expdesc *f) { + FuncState *fs = ls->fs; + expdesc args; + int base, nparams; + int line = ls->linenumber; + switch (ls->t.token) { + case '(': { /* funcargs -> `(' [ explist1 ] `)' */ + if (line != ls->lastline) + luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); + luaX_next(ls); + if (ls->t.token == ')') /* arg list is empty? */ + args.k = VVOID; + else { + explist1(ls, &args); + luaK_setmultret(fs, &args); + } + check_match(ls, ')', '(', line); + break; + } + case '{': { /* funcargs -> constructor */ + constructor(ls, &args); + break; + } + case TK_STRING: { /* funcargs -> STRING */ + codestring(ls, &args, ls->t.seminfo.ts); + luaX_next(ls); /* must use `seminfo' before `next' */ + break; + } + default: { + luaX_syntaxerror(ls, "function arguments expected"); + return; + } + } + lua_assert(f->k == VNONRELOC); + base = f->u.s.info; /* base register for call */ + if (hasmultret(args.k)) + nparams = LUA_MULTRET; /* open call */ + else { + if (args.k != VVOID) + luaK_exp2nextreg(fs, &args); /* close last argument */ + nparams = fs->freereg - (base+1); + } + init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); + luaK_fixline(fs, line); + fs->freereg = base+1; /* call remove function and arguments and leaves + (unless changed) one result */ +} + + + + +/* +** {====================================================================== +** Expression parsing +** ======================================================================= +*/ + + +static void prefixexp (LexState *ls, expdesc *v) { + /* prefixexp -> NAME | '(' expr ')' */ + switch (ls->t.token) { + case '(': { + int line = ls->linenumber; + luaX_next(ls); + expr(ls, v); + check_match(ls, ')', '(', line); + luaK_dischargevars(ls->fs, v); + return; + } + case TK_NAME: { + singlevar(ls, v); + return; + } + default: { + luaX_syntaxerror(ls, "unexpected symbol"); + return; + } + } +} + + +static void primaryexp (LexState *ls, expdesc *v) { + /* primaryexp -> + prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */ + FuncState *fs = ls->fs; + prefixexp(ls, v); + for (;;) { + switch (ls->t.token) { + case '.': { /* field */ + field(ls, v); + break; + } + case '[': { /* `[' exp1 `]' */ + expdesc key; + luaK_exp2anyreg(fs, v); + yindex(ls, &key); + luaK_indexed(fs, v, &key); + break; + } + case ':': { /* `:' NAME funcargs */ + expdesc key; + luaX_next(ls); + checkname(ls, &key); + luaK_self(fs, v, &key); + funcargs(ls, v); + break; + } + case '(': case TK_STRING: case '{': { /* funcargs */ + luaK_exp2nextreg(fs, v); + funcargs(ls, v); + break; + } + default: return; + } + } +} + + +static void simpleexp (LexState *ls, expdesc *v) { + /* simpleexp -> NUMBER | STRING | NIL | true | false | ... | + constructor | FUNCTION body | primaryexp */ + switch (ls->t.token) { + case TK_NUMBER: { + init_exp(v, VKNUM, 0); + v->u.nval = ls->t.seminfo.r; + break; + } + case TK_STRING: { + codestring(ls, v, ls->t.seminfo.ts); + break; + } + case TK_NIL: { + init_exp(v, VNIL, 0); + break; + } + case TK_TRUE: { + init_exp(v, VTRUE, 0); + break; + } + case TK_FALSE: { + init_exp(v, VFALSE, 0); + break; + } + case TK_DOTS: { /* vararg */ + FuncState *fs = ls->fs; + check_condition(ls, fs->f->is_vararg, + "cannot use " LUA_QL("...") " outside a vararg function"); + fs->f->is_vararg &= ~VARARG_NEEDSARG; /* don't need 'arg' */ + init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0)); + break; + } + case '{': { /* constructor */ + constructor(ls, v); + return; + } + case TK_FUNCTION: { + luaX_next(ls); + body(ls, v, 0, ls->linenumber); + return; + } + default: { + primaryexp(ls, v); + return; + } + } + luaX_next(ls); +} + + +static UnOpr getunopr (int op) { + switch (op) { + case TK_NOT: return OPR_NOT; + case '-': return OPR_MINUS; + case '#': return OPR_LEN; + default: return OPR_NOUNOPR; + } +} + + +static BinOpr getbinopr (int op) { + switch (op) { + case '+': return OPR_ADD; + case '-': return OPR_SUB; + case '*': return OPR_MUL; + case '/': return OPR_DIV; + case '%': return OPR_MOD; + case '^': return OPR_POW; + case TK_CONCAT: return OPR_CONCAT; + case TK_NE: return OPR_NE; + case TK_EQ: return OPR_EQ; + case '<': return OPR_LT; + case TK_LE: return OPR_LE; + case '>': return OPR_GT; + case TK_GE: return OPR_GE; + case TK_AND: return OPR_AND; + case TK_OR: return OPR_OR; + default: return OPR_NOBINOPR; + } +} + + +static const struct { + lu_byte left; /* left priority for each binary operator */ + lu_byte right; /* right priority */ +} priority[] = { /* ORDER OPR */ + {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `/' `%' */ + {10, 9}, {5, 4}, /* power and concat (right associative) */ + {3, 3}, {3, 3}, /* equality and inequality */ + {3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */ + {2, 2}, {1, 1} /* logical (and/or) */ +}; + +#define UNARY_PRIORITY 8 /* priority for unary operators */ + + +/* +** subexpr -> (simpleexp | unop subexpr) { binop subexpr } +** where `binop' is any binary operator with a priority higher than `limit' +*/ +static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) { + BinOpr op; + UnOpr uop; + enterlevel(ls); + uop = getunopr(ls->t.token); + if (uop != OPR_NOUNOPR) { + luaX_next(ls); + subexpr(ls, v, UNARY_PRIORITY); + luaK_prefix(ls->fs, uop, v); + } + else simpleexp(ls, v); + /* expand while operators have priorities higher than `limit' */ + op = getbinopr(ls->t.token); + while (op != OPR_NOBINOPR && priority[op].left > limit) { + expdesc v2; + BinOpr nextop; + luaX_next(ls); + luaK_infix(ls->fs, op, v); + /* read sub-expression with higher priority */ + nextop = subexpr(ls, &v2, priority[op].right); + luaK_posfix(ls->fs, op, v, &v2); + op = nextop; + } + leavelevel(ls); + return op; /* return first untreated operator */ +} + + +static void expr (LexState *ls, expdesc *v) { + subexpr(ls, v, 0); +} + +/* }==================================================================== */ + + + +/* +** {====================================================================== +** Rules for Statements +** ======================================================================= +*/ + + +static int block_follow (int token) { + switch (token) { + case TK_ELSE: case TK_ELSEIF: case TK_END: + case TK_UNTIL: case TK_EOS: + return 1; + default: return 0; + } +} + + +static void block (LexState *ls) { + /* block -> chunk */ + FuncState *fs = ls->fs; + BlockCnt bl; + enterblock(fs, &bl, 0); + chunk(ls); + lua_assert(bl.breaklist == NO_JUMP); + leaveblock(fs); +} + + +/* +** structure to chain all variables in the left-hand side of an +** assignment +*/ +struct LHS_assign { + struct LHS_assign *prev; + expdesc v; /* variable (global, local, upvalue, or indexed) */ +}; + + +/* +** check whether, in an assignment to a local variable, the local variable +** is needed in a previous assignment (to a table). If so, save original +** local value in a safe place and use this safe copy in the previous +** assignment. +*/ +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 */ + int conflict = 0; + for (; lh; lh = lh->prev) { + if (lh->v.k == VINDEXED) { + if (lh->v.u.s.info == v->u.s.info) { /* conflict? */ + conflict = 1; + lh->v.u.s.info = extra; /* previous assignment will use safe copy */ + } + if (lh->v.u.s.aux == v->u.s.info) { /* conflict? */ + conflict = 1; + lh->v.u.s.aux = extra; /* previous assignment will use safe copy */ + } + } + } + if (conflict) { + luaK_codeABC(fs, OP_MOVE, fs->freereg, v->u.s.info, 0); /* make copy */ + luaK_reserveregs(fs, 1); + } +} + + +static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { + expdesc e; + check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, + "syntax error"); + if (testnext(ls, ',')) { /* assignment -> `,' primaryexp assignment */ + struct LHS_assign nv; + nv.prev = lh; + primaryexp(ls, &nv.v); + if (nv.v.k == VLOCAL) + check_conflict(ls, lh, &nv.v); + luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls, + "variables in assignment"); + assignment(ls, &nv, nvars+1); + } + else { /* assignment -> `=' explist1 */ + int nexps; + checknext(ls, '='); + nexps = explist1(ls, &e); + if (nexps != nvars) { + adjust_assign(ls, nvars, nexps, &e); + if (nexps > nvars) + ls->fs->freereg -= nexps - nvars; /* remove extra values */ + } + else { + luaK_setoneret(ls->fs, &e); /* close last expression */ + luaK_storevar(ls->fs, &lh->v, &e); + return; /* avoid default */ + } + } + init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ + luaK_storevar(ls->fs, &lh->v, &e); +} + + +static int cond (LexState *ls) { + /* cond -> exp */ + expdesc v; + expr(ls, &v); /* read condition */ + if (v.k == VNIL) v.k = VFALSE; /* `falses' are all equal here */ + luaK_goiftrue(ls->fs, &v); + return v.f; +} + + +static void breakstat (LexState *ls) { + FuncState *fs = ls->fs; + BlockCnt *bl = fs->bl; + int upval = 0; + while (bl && !bl->isbreakable) { + upval |= bl->upval; + bl = bl->previous; + } + if (!bl) + luaX_syntaxerror(ls, "no loop to break"); + if (upval) + luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); + luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); +} + + +static void whilestat (LexState *ls, int line) { + /* whilestat -> WHILE cond DO block END */ + FuncState *fs = ls->fs; + int whileinit; + int condexit; + BlockCnt bl; + luaX_next(ls); /* skip WHILE */ + whileinit = luaK_getlabel(fs); + condexit = cond(ls); + enterblock(fs, &bl, 1); + checknext(ls, TK_DO); + block(ls); + luaK_patchlist(fs, luaK_jump(fs), whileinit); + check_match(ls, TK_END, TK_WHILE, line); + leaveblock(fs); + luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ +} + + +static void repeatstat (LexState *ls, int line) { + /* repeatstat -> REPEAT block UNTIL cond */ + int condexit; + FuncState *fs = ls->fs; + int repeat_init = luaK_getlabel(fs); + BlockCnt bl1, bl2; + enterblock(fs, &bl1, 1); /* loop block */ + enterblock(fs, &bl2, 0); /* scope block */ + luaX_next(ls); /* skip REPEAT */ + chunk(ls); + check_match(ls, TK_UNTIL, TK_REPEAT, line); + condexit = cond(ls); /* read condition (inside scope block) */ + if (!bl2.upval) { /* no upvalues? */ + leaveblock(fs); /* finish scope */ + luaK_patchlist(ls->fs, condexit, repeat_init); /* close the loop */ + } + else { /* complete semantics when there are upvalues */ + breakstat(ls); /* if condition then break */ + luaK_patchtohere(ls->fs, condexit); /* else... */ + leaveblock(fs); /* finish scope... */ + luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init); /* and repeat */ + } + leaveblock(fs); /* finish loop */ +} + + +static int exp1 (LexState *ls) { + expdesc e; + int k; + expr(ls, &e); + k = e.k; + luaK_exp2nextreg(ls->fs, &e); + return k; +} + + +static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { + /* forbody -> DO block */ + BlockCnt bl; + FuncState *fs = ls->fs; + int prep, endfor; + adjustlocalvars(ls, 3); /* control variables */ + checknext(ls, TK_DO); + prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs); + enterblock(fs, &bl, 0); /* scope for declared variables */ + adjustlocalvars(ls, nvars); + luaK_reserveregs(fs, nvars); + block(ls); + leaveblock(fs); /* end of scope for declared variables */ + luaK_patchtohere(fs, prep); + endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) : + luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars); + luaK_fixline(fs, line); /* pretend that `OP_FOR' starts the loop */ + luaK_patchlist(fs, (isnum ? endfor : luaK_jump(fs)), prep + 1); +} + + +static void fornum (LexState *ls, TString *varname, int line) { + /* fornum -> NAME = exp1,exp1[,exp1] forbody */ + FuncState *fs = ls->fs; + int base = fs->freereg; + new_localvarliteral(ls, "(for index)", 0); + new_localvarliteral(ls, "(for limit)", 1); + new_localvarliteral(ls, "(for step)", 2); + new_localvar(ls, varname, 3); + checknext(ls, '='); + exp1(ls); /* initial value */ + checknext(ls, ','); + exp1(ls); /* limit */ + if (testnext(ls, ',')) + exp1(ls); /* optional step */ + else { /* default step = 1 */ + luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1)); + luaK_reserveregs(fs, 1); + } + forbody(ls, base, line, 1, 1); +} + + +static void forlist (LexState *ls, TString *indexname) { + /* forlist -> NAME {,NAME} IN explist1 forbody */ + FuncState *fs = ls->fs; + expdesc e; + int nvars = 0; + int line; + int base = fs->freereg; + /* create control variables */ + new_localvarliteral(ls, "(for generator)", nvars++); + new_localvarliteral(ls, "(for state)", nvars++); + new_localvarliteral(ls, "(for control)", nvars++); + /* create declared variables */ + new_localvar(ls, indexname, nvars++); + while (testnext(ls, ',')) + new_localvar(ls, str_checkname(ls), nvars++); + checknext(ls, TK_IN); + line = ls->linenumber; + adjust_assign(ls, 3, explist1(ls, &e), &e); + luaK_checkstack(fs, 3); /* extra space to call generator */ + forbody(ls, base, line, nvars - 3, 0); +} + + +static void forstat (LexState *ls, int line) { + /* forstat -> FOR (fornum | forlist) END */ + FuncState *fs = ls->fs; + TString *varname; + BlockCnt bl; + enterblock(fs, &bl, 1); /* scope for loop and control variables */ + luaX_next(ls); /* skip `for' */ + varname = str_checkname(ls); /* first variable name */ + switch (ls->t.token) { + case '=': fornum(ls, varname, line); break; + case ',': case TK_IN: forlist(ls, varname); break; + default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); + } + check_match(ls, TK_END, TK_FOR, line); + leaveblock(fs); /* loop scope (`break' jumps to this point) */ +} + + +static int test_then_block (LexState *ls) { + /* test_then_block -> [IF | ELSEIF] cond THEN block */ + int condexit; + luaX_next(ls); /* skip IF or ELSEIF */ + condexit = cond(ls); + checknext(ls, TK_THEN); + block(ls); /* `then' part */ + return condexit; +} + + +static void ifstat (LexState *ls, int line) { + /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ + FuncState *fs = ls->fs; + int flist; + int escapelist = NO_JUMP; + flist = test_then_block(ls); /* IF cond THEN block */ + while (ls->t.token == TK_ELSEIF) { + luaK_concat(fs, &escapelist, luaK_jump(fs)); + luaK_patchtohere(fs, flist); + flist = test_then_block(ls); /* ELSEIF cond THEN block */ + } + if (ls->t.token == TK_ELSE) { + luaK_concat(fs, &escapelist, luaK_jump(fs)); + luaK_patchtohere(fs, flist); + luaX_next(ls); /* skip ELSE (after patch, for correct line info) */ + block(ls); /* `else' part */ + } + else + luaK_concat(fs, &escapelist, flist); + luaK_patchtohere(fs, escapelist); + check_match(ls, TK_END, TK_IF, line); +} + + +static void localfunc (LexState *ls) { + expdesc v, b; + FuncState *fs = ls->fs; + new_localvar(ls, str_checkname(ls), 0); + init_exp(&v, VLOCAL, fs->freereg); + luaK_reserveregs(fs, 1); + adjustlocalvars(ls, 1); + body(ls, &b, 0, ls->linenumber); + luaK_storevar(fs, &v, &b); + /* debug information will only see the variable after this point! */ + getlocvar(fs, fs->nactvar - 1).startpc = fs->pc; +} + + +static void localstat (LexState *ls) { + /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */ + int nvars = 0; + int nexps; + expdesc e; + do { + new_localvar(ls, str_checkname(ls), nvars++); + } while (testnext(ls, ',')); + if (testnext(ls, '=')) + nexps = explist1(ls, &e); + else { + e.k = VVOID; + nexps = 0; + } + adjust_assign(ls, nvars, nexps, &e); + adjustlocalvars(ls, nvars); +} + + +static int funcname (LexState *ls, expdesc *v) { + /* funcname -> NAME {field} [`:' NAME] */ + int needself = 0; + singlevar(ls, v); + while (ls->t.token == '.') + field(ls, v); + if (ls->t.token == ':') { + needself = 1; + field(ls, v); + } + return needself; +} + + +static void funcstat (LexState *ls, int line) { + /* funcstat -> FUNCTION funcname body */ + int needself; + expdesc v, b; + luaX_next(ls); /* skip FUNCTION */ + needself = funcname(ls, &v); + body(ls, &b, needself, line); + luaK_storevar(ls->fs, &v, &b); + luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ +} + + +static void exprstat (LexState *ls) { + /* stat -> func | assignment */ + FuncState *fs = ls->fs; + struct LHS_assign v; + primaryexp(ls, &v.v); + if (v.v.k == VCALL) /* stat -> func */ + SETARG_C(getcode(fs, &v.v), 1); /* call statement uses no results */ + else { /* stat -> assignment */ + v.prev = NULL; + assignment(ls, &v, 1); + } +} + + +static void retstat (LexState *ls) { + /* stat -> RETURN explist */ + FuncState *fs = ls->fs; + expdesc e; + int first, nret; /* registers with returned values */ + luaX_next(ls); /* skip RETURN */ + if (block_follow(ls->t.token) || ls->t.token == ';') + first = nret = 0; /* return no values */ + else { + nret = explist1(ls, &e); /* optional return values */ + if (hasmultret(e.k)) { + luaK_setmultret(fs, &e); + if (e.k == VCALL && nret == 1) { /* tail call? */ + SET_OPCODE(getcode(fs,&e), OP_TAILCALL); + lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); + } + first = fs->nactvar; + nret = LUA_MULTRET; /* return all values */ + } + else { + if (nret == 1) /* only one single value? */ + first = luaK_exp2anyreg(fs, &e); + else { + luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ + first = fs->nactvar; /* return all `active' values */ + lua_assert(nret == fs->freereg - first); + } + } + } + luaK_ret(fs, first, nret); +} + + +static int statement (LexState *ls) { + int line = ls->linenumber; /* may be needed for error messages */ + switch (ls->t.token) { + case TK_IF: { /* stat -> ifstat */ + ifstat(ls, line); + return 0; + } + case TK_WHILE: { /* stat -> whilestat */ + whilestat(ls, line); + return 0; + } + case TK_DO: { /* stat -> DO block END */ + luaX_next(ls); /* skip DO */ + block(ls); + check_match(ls, TK_END, TK_DO, line); + return 0; + } + case TK_FOR: { /* stat -> forstat */ + forstat(ls, line); + return 0; + } + case TK_REPEAT: { /* stat -> repeatstat */ + repeatstat(ls, line); + return 0; + } + case TK_FUNCTION: { + funcstat(ls, line); /* stat -> funcstat */ + return 0; + } + case TK_LOCAL: { /* stat -> localstat */ + luaX_next(ls); /* skip LOCAL */ + if (testnext(ls, TK_FUNCTION)) /* local function? */ + localfunc(ls); + else + localstat(ls); + return 0; + } + case TK_RETURN: { /* stat -> retstat */ + retstat(ls); + return 1; /* must be last statement */ + } + case TK_BREAK: { /* stat -> breakstat */ + luaX_next(ls); /* skip BREAK */ + breakstat(ls); + return 1; /* must be last statement */ + } + default: { + exprstat(ls); + return 0; /* to avoid warnings */ + } + } +} + + +static void chunk (LexState *ls) { + /* chunk -> { stat [`;'] } */ + int islast = 0; + enterlevel(ls); + while (!islast && !block_follow(ls->t.token)) { + islast = statement(ls); + testnext(ls, ';'); + lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && + ls->fs->freereg >= ls->fs->nactvar); + ls->fs->freereg = ls->fs->nactvar; /* free registers */ + } + leavelevel(ls); +} + +/* }====================================================================== */ diff --git a/ext/lua-5.1.5/src/lparser.h b/ext/lua-5.1.5/src/lparser.h new file mode 100644 index 000000000..18836afd1 --- /dev/null +++ b/ext/lua-5.1.5/src/lparser.h @@ -0,0 +1,82 @@ +/* +** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#ifndef lparser_h +#define lparser_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* +** Expression descriptor +*/ + +typedef enum { + VVOID, /* no value */ + VNIL, + VTRUE, + VFALSE, + VK, /* info = index of constant in `k' */ + VKNUM, /* nval = numerical value */ + VLOCAL, /* info = local register */ + VUPVAL, /* info = index of upvalue in `upvalues' */ + VGLOBAL, /* info = index of table; aux = index of global name in `k' */ + VINDEXED, /* info = table register; aux = index register (or `k') */ + VJMP, /* info = instruction pc */ + VRELOCABLE, /* info = instruction pc */ + VNONRELOC, /* info = result register */ + VCALL, /* info = instruction pc */ + VVARARG /* info = instruction pc */ +} expkind; + +typedef struct expdesc { + expkind k; + union { + struct { int info, aux; } s; + lua_Number nval; + } u; + int t; /* patch list of `exit when true' */ + int f; /* patch list of `exit when false' */ +} expdesc; + + +typedef struct upvaldesc { + lu_byte k; + lu_byte info; +} upvaldesc; + + +struct BlockCnt; /* defined in lparser.c */ + + +/* state needed to generate code for a given function */ +typedef struct FuncState { + Proto *f; /* current function header */ + Table *h; /* table to find (and reuse) elements in `k' */ + struct FuncState *prev; /* enclosing function */ + struct LexState *ls; /* lexical state */ + struct lua_State *L; /* copy of the Lua state */ + struct BlockCnt *bl; /* chain of current blocks */ + int pc; /* next position to code (equivalent to `ncode') */ + int lasttarget; /* `pc' of last `jump target' */ + int jpc; /* list of pending jumps to `pc' */ + int freereg; /* first free register */ + int nk; /* number of elements in `k' */ + int np; /* number of elements in `p' */ + short nlocvars; /* number of elements in `locvars' */ + lu_byte nactvar; /* number of active local variables */ + upvaldesc upvalues[LUAI_MAXUPVALUES]; /* upvalues */ + unsigned short actvar[LUAI_MAXVARS]; /* declared-variable stack */ +} FuncState; + + +LUAI_FUNC Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + const char *name); + + +#endif diff --git a/ext/lua-5.1.5/src/lstate.c b/ext/lua-5.1.5/src/lstate.c new file mode 100644 index 000000000..4313b83a0 --- /dev/null +++ b/ext/lua-5.1.5/src/lstate.c @@ -0,0 +1,214 @@ +/* +** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $ +** Global State +** See Copyright Notice in lua.h +*/ + + +#include + +#define lstate_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +#define state_size(x) (sizeof(x) + LUAI_EXTRASPACE) +#define fromstate(l) (cast(lu_byte *, (l)) - LUAI_EXTRASPACE) +#define tostate(l) (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE)) + + +/* +** Main thread combines a thread state and the global state +*/ +typedef struct LG { + lua_State l; + global_State g; +} LG; + + + +static void stack_init (lua_State *L1, lua_State *L) { + /* initialize CallInfo array */ + L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo); + L1->ci = L1->base_ci; + L1->size_ci = BASIC_CI_SIZE; + L1->end_ci = L1->base_ci + L1->size_ci - 1; + /* initialize stack array */ + L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); + L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; + L1->top = L1->stack; + L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; + /* initialize first ci */ + L1->ci->func = L1->top; + setnilvalue(L1->top++); /* `function' entry for this `ci' */ + L1->base = L1->ci->base = L1->top; + L1->ci->top = L1->top + LUA_MINSTACK; +} + + +static void freestack (lua_State *L, lua_State *L1) { + luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo); + luaM_freearray(L, L1->stack, L1->stacksize, TValue); +} + + +/* +** open parts that may cause memory-allocation errors +*/ +static void f_luaopen (lua_State *L, void *ud) { + global_State *g = G(L); + UNUSED(ud); + stack_init(L, L); /* init stack */ + sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ + sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ + luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ + luaT_init(L); + luaX_init(L); + luaS_fix(luaS_newliteral(L, MEMERRMSG)); + g->GCthreshold = 4*g->totalbytes; +} + + +static void preinit_state (lua_State *L, global_State *g) { + G(L) = g; + L->stack = NULL; + L->stacksize = 0; + L->errorJmp = NULL; + L->hook = NULL; + L->hookmask = 0; + L->basehookcount = 0; + L->allowhook = 1; + resethookcount(L); + L->openupval = NULL; + L->size_ci = 0; + L->nCcalls = L->baseCcalls = 0; + L->status = 0; + L->base_ci = L->ci = NULL; + L->savedpc = NULL; + L->errfunc = 0; + setnilvalue(gt(L)); +} + + +static void close_state (lua_State *L) { + global_State *g = G(L); + luaF_close(L, L->stack); /* close all upvalues for this thread */ + luaC_freeall(L); /* collect all objects */ + lua_assert(g->rootgc == obj2gco(L)); + lua_assert(g->strt.nuse == 0); + luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); + luaZ_freebuffer(L, &g->buff); + freestack(L, L); + lua_assert(g->totalbytes == sizeof(LG)); + (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0); +} + + +lua_State *luaE_newthread (lua_State *L) { + lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State))); + luaC_link(L, obj2gco(L1), LUA_TTHREAD); + preinit_state(L1, G(L)); + stack_init(L1, L); /* init stack */ + setobj2n(L, gt(L1), gt(L)); /* share table of globals */ + L1->hookmask = L->hookmask; + L1->basehookcount = L->basehookcount; + L1->hook = L->hook; + resethookcount(L1); + lua_assert(iswhite(obj2gco(L1))); + return L1; +} + + +void luaE_freethread (lua_State *L, lua_State *L1) { + luaF_close(L1, L1->stack); /* close all upvalues for this thread */ + lua_assert(L1->openupval == NULL); + luai_userstatefree(L1); + freestack(L, L1); + luaM_freemem(L, fromstate(L1), state_size(lua_State)); +} + + +LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { + int i; + lua_State *L; + global_State *g; + void *l = (*f)(ud, NULL, 0, state_size(LG)); + if (l == NULL) return NULL; + L = tostate(l); + g = &((LG *)L)->g; + L->next = NULL; + L->tt = LUA_TTHREAD; + g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); + L->marked = luaC_white(g); + set2bits(L->marked, FIXEDBIT, SFIXEDBIT); + preinit_state(L, g); + g->frealloc = f; + g->ud = ud; + g->mainthread = L; + g->uvhead.u.l.prev = &g->uvhead; + g->uvhead.u.l.next = &g->uvhead; + g->GCthreshold = 0; /* mark it as unfinished state */ + g->strt.size = 0; + g->strt.nuse = 0; + g->strt.hash = NULL; + setnilvalue(registry(L)); + luaZ_initbuffer(L, &g->buff); + g->panic = NULL; + g->gcstate = GCSpause; + g->rootgc = obj2gco(L); + g->sweepstrgc = 0; + g->sweepgc = &g->rootgc; + g->gray = NULL; + g->grayagain = NULL; + g->weak = NULL; + g->tmudata = NULL; + g->totalbytes = sizeof(LG); + g->gcpause = LUAI_GCPAUSE; + g->gcstepmul = LUAI_GCMUL; + g->gcdept = 0; + for (i=0; imt[i] = NULL; + if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) { + /* memory allocation error: free partial state */ + close_state(L); + L = NULL; + } + else + luai_userstateopen(L); + return L; +} + + +static void callallgcTM (lua_State *L, void *ud) { + UNUSED(ud); + luaC_callGCTM(L); /* call GC metamethods for all udata */ +} + + +LUA_API void lua_close (lua_State *L) { + L = G(L)->mainthread; /* only the main thread can be closed */ + lua_lock(L); + luaF_close(L, L->stack); /* close all upvalues for this thread */ + luaC_separateudata(L, 1); /* separate udata that have GC metamethods */ + L->errfunc = 0; /* no error function during GC metamethods */ + do { /* repeat until no more errors */ + L->ci = L->base_ci; + L->base = L->top = L->ci->base; + L->nCcalls = L->baseCcalls = 0; + } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); + lua_assert(G(L)->tmudata == NULL); + luai_userstateclose(L); + close_state(L); +} + diff --git a/ext/lua-5.1.5/src/lstate.h b/ext/lua-5.1.5/src/lstate.h new file mode 100644 index 000000000..3bc575b6b --- /dev/null +++ b/ext/lua-5.1.5/src/lstate.h @@ -0,0 +1,169 @@ +/* +** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $ +** Global State +** See Copyright Notice in lua.h +*/ + +#ifndef lstate_h +#define lstate_h + +#include "lua.h" + +#include "lobject.h" +#include "ltm.h" +#include "lzio.h" + + + +struct lua_longjmp; /* defined in ldo.c */ + + +/* table of globals */ +#define gt(L) (&L->l_gt) + +/* registry */ +#define registry(L) (&G(L)->l_registry) + + +/* extra stack space to handle TM calls and some other extras */ +#define EXTRA_STACK 5 + + +#define BASIC_CI_SIZE 8 + +#define BASIC_STACK_SIZE (2*LUA_MINSTACK) + + + +typedef struct stringtable { + GCObject **hash; + lu_int32 nuse; /* number of elements */ + int size; +} stringtable; + + +/* +** informations about a call +*/ +typedef struct CallInfo { + StkId base; /* base for this function */ + StkId func; /* function index in the stack */ + StkId top; /* top for this function */ + const Instruction *savedpc; + int nresults; /* expected number of results from this function */ + int tailcalls; /* number of tail calls lost under this entry */ +} CallInfo; + + + +#define curr_func(L) (clvalue(L->ci->func)) +#define ci_func(ci) (clvalue((ci)->func)) +#define f_isLua(ci) (!ci_func(ci)->c.isC) +#define isLua(ci) (ttisfunction((ci)->func) && f_isLua(ci)) + + +/* +** `global state', shared by all threads of this state +*/ +typedef struct global_State { + stringtable strt; /* hash table for strings */ + lua_Alloc frealloc; /* function to reallocate memory */ + void *ud; /* auxiliary data to `frealloc' */ + lu_byte currentwhite; + lu_byte gcstate; /* state of garbage collector */ + int sweepstrgc; /* position of sweep in `strt' */ + GCObject *rootgc; /* list of all collectable objects */ + GCObject **sweepgc; /* position of sweep in `rootgc' */ + GCObject *gray; /* list of gray objects */ + GCObject *grayagain; /* list of objects to be traversed atomically */ + GCObject *weak; /* list of weak tables (to be cleared) */ + GCObject *tmudata; /* last element of list of userdata to be GC */ + Mbuffer buff; /* temporary buffer for string concatentation */ + lu_mem GCthreshold; + lu_mem totalbytes; /* number of bytes currently allocated */ + lu_mem estimate; /* an estimate of number of bytes actually in use */ + lu_mem gcdept; /* how much GC is `behind schedule' */ + int gcpause; /* size of pause between successive GCs */ + int gcstepmul; /* GC `granularity' */ + lua_CFunction panic; /* to be called in unprotected errors */ + TValue l_registry; + struct lua_State *mainthread; + UpVal uvhead; /* head of double-linked list of all open upvalues */ + struct Table *mt[NUM_TAGS]; /* metatables for basic types */ + TString *tmname[TM_N]; /* array with tag-method names */ +} global_State; + + +/* +** `per thread' state +*/ +struct lua_State { + CommonHeader; + lu_byte status; + StkId top; /* first free slot in the stack */ + StkId base; /* base of current function */ + global_State *l_G; + CallInfo *ci; /* call info for current function */ + const Instruction *savedpc; /* `savedpc' of current function */ + StkId stack_last; /* last free slot in the stack */ + StkId stack; /* stack base */ + CallInfo *end_ci; /* points after end of ci array*/ + CallInfo *base_ci; /* array of CallInfo's */ + int stacksize; + int size_ci; /* size of array `base_ci' */ + unsigned short nCcalls; /* number of nested C calls */ + unsigned short baseCcalls; /* nested C calls when resuming coroutine */ + lu_byte hookmask; + lu_byte allowhook; + int basehookcount; + int hookcount; + lua_Hook hook; + TValue l_gt; /* table of globals */ + TValue env; /* temporary place for environments */ + GCObject *openupval; /* list of open upvalues in this stack */ + GCObject *gclist; + struct lua_longjmp *errorJmp; /* current error recover point */ + ptrdiff_t errfunc; /* current error handling function (stack index) */ +}; + + +#define G(L) (L->l_G) + + +/* +** Union of all collectable objects +*/ +union GCObject { + GCheader gch; + union TString ts; + union Udata u; + union Closure cl; + struct Table h; + struct Proto p; + struct UpVal uv; + struct lua_State th; /* thread */ +}; + + +/* macros to convert a GCObject into a specific value */ +#define rawgco2ts(o) check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts)) +#define gco2ts(o) (&rawgco2ts(o)->tsv) +#define rawgco2u(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) +#define gco2u(o) (&rawgco2u(o)->uv) +#define gco2cl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl)) +#define gco2h(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) +#define gco2p(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) +#define gco2uv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) +#define ngcotouv(o) \ + check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv)) +#define gco2th(o) check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th)) + +/* macro to convert any Lua object into a GCObject */ +#define obj2gco(v) (cast(GCObject *, (v))) + + +LUAI_FUNC lua_State *luaE_newthread (lua_State *L); +LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); + +#endif + diff --git a/ext/lua-5.1.5/src/lstring.c b/ext/lua-5.1.5/src/lstring.c new file mode 100644 index 000000000..49113151c --- /dev/null +++ b/ext/lua-5.1.5/src/lstring.c @@ -0,0 +1,111 @@ +/* +** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $ +** String table (keeps all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + + +#include + +#define lstring_c +#define LUA_CORE + +#include "lua.h" + +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" + + + +void luaS_resize (lua_State *L, int newsize) { + GCObject **newhash; + stringtable *tb; + int i; + if (G(L)->gcstate == GCSsweepstring) + return; /* cannot resize during GC traverse */ + newhash = luaM_newvector(L, newsize, GCObject *); + tb = &G(L)->strt; + for (i=0; isize; i++) { + GCObject *p = tb->hash[i]; + while (p) { /* for each node in the list */ + GCObject *next = p->gch.next; /* save next */ + unsigned int h = gco2ts(p)->hash; + int h1 = lmod(h, newsize); /* new position */ + lua_assert(cast_int(h%newsize) == lmod(h, newsize)); + p->gch.next = newhash[h1]; /* chain it */ + newhash[h1] = p; + p = next; + } + } + luaM_freearray(L, tb->hash, tb->size, TString *); + tb->size = newsize; + tb->hash = newhash; +} + + +static TString *newlstr (lua_State *L, const char *str, size_t l, + unsigned int h) { + TString *ts; + stringtable *tb; + if (l+1 > (MAX_SIZET - sizeof(TString))/sizeof(char)) + luaM_toobig(L); + ts = cast(TString *, luaM_malloc(L, (l+1)*sizeof(char)+sizeof(TString))); + ts->tsv.len = l; + ts->tsv.hash = h; + ts->tsv.marked = luaC_white(G(L)); + ts->tsv.tt = LUA_TSTRING; + ts->tsv.reserved = 0; + memcpy(ts+1, str, l*sizeof(char)); + ((char *)(ts+1))[l] = '\0'; /* ending 0 */ + tb = &G(L)->strt; + h = lmod(h, tb->size); + ts->tsv.next = tb->hash[h]; /* chain new entry */ + tb->hash[h] = obj2gco(ts); + tb->nuse++; + if (tb->nuse > cast(lu_int32, tb->size) && tb->size <= MAX_INT/2) + luaS_resize(L, tb->size*2); /* too crowded */ + return ts; +} + + +TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { + GCObject *o; + unsigned int h = cast(unsigned int, l); /* seed */ + size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ + size_t l1; + for (l1=l; l1>=step; l1-=step) /* compute hash */ + h = h ^ ((h<<5)+(h>>2)+cast(unsigned char, str[l1-1])); + for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; + o != NULL; + o = o->gch.next) { + TString *ts = rawgco2ts(o); + if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) { + /* string may be dead */ + if (isdead(G(L), o)) changewhite(o); + return ts; + } + } + return newlstr(L, str, l, h); /* not found */ +} + + +Udata *luaS_newudata (lua_State *L, size_t s, Table *e) { + Udata *u; + if (s > MAX_SIZET - sizeof(Udata)) + luaM_toobig(L); + u = cast(Udata *, luaM_malloc(L, s + sizeof(Udata))); + u->uv.marked = luaC_white(G(L)); /* is not finalized */ + u->uv.tt = LUA_TUSERDATA; + u->uv.len = s; + u->uv.metatable = NULL; + u->uv.env = e; + /* chain it on udata list (after main thread) */ + u->uv.next = G(L)->mainthread->next; + G(L)->mainthread->next = obj2gco(u); + return u; +} + diff --git a/ext/lua-5.1.5/src/lstring.h b/ext/lua-5.1.5/src/lstring.h new file mode 100644 index 000000000..73a2ff8b3 --- /dev/null +++ b/ext/lua-5.1.5/src/lstring.h @@ -0,0 +1,31 @@ +/* +** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $ +** String table (keep all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#ifndef lstring_h +#define lstring_h + + +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" + + +#define sizestring(s) (sizeof(union TString)+((s)->len+1)*sizeof(char)) + +#define sizeudata(u) (sizeof(union Udata)+(u)->len) + +#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s))) +#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ + (sizeof(s)/sizeof(char))-1)) + +#define luaS_fix(s) l_setbit((s)->tsv.marked, FIXEDBIT) + +LUAI_FUNC void luaS_resize (lua_State *L, int newsize); +LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, Table *e); +LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); + + +#endif diff --git a/ext/lua-5.1.5/src/lstrlib.c b/ext/lua-5.1.5/src/lstrlib.c new file mode 100644 index 000000000..7a03489be --- /dev/null +++ b/ext/lua-5.1.5/src/lstrlib.c @@ -0,0 +1,871 @@ +/* +** $Id: lstrlib.c,v 1.132.1.5 2010/05/14 15:34:19 roberto Exp $ +** Standard library for string operations and pattern-matching +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include +#include + +#define lstrlib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* macro to `unsign' a character */ +#define uchar(c) ((unsigned char)(c)) + + + +static int str_len (lua_State *L) { + size_t l; + luaL_checklstring(L, 1, &l); + lua_pushinteger(L, l); + return 1; +} + + +static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) { + /* relative string position: negative means back from end */ + if (pos < 0) pos += (ptrdiff_t)len + 1; + return (pos >= 0) ? pos : 0; +} + + +static int str_sub (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + ptrdiff_t start = posrelat(luaL_checkinteger(L, 2), l); + ptrdiff_t end = posrelat(luaL_optinteger(L, 3, -1), l); + if (start < 1) start = 1; + if (end > (ptrdiff_t)l) end = (ptrdiff_t)l; + if (start <= end) + lua_pushlstring(L, s+start-1, end-start+1); + else lua_pushliteral(L, ""); + return 1; +} + + +static int str_reverse (lua_State *L) { + size_t l; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + luaL_buffinit(L, &b); + while (l--) luaL_addchar(&b, s[l]); + luaL_pushresult(&b); + return 1; +} + + +static int str_lower (lua_State *L) { + size_t l; + size_t i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + luaL_buffinit(L, &b); + for (i=0; i 0) + luaL_addlstring(&b, s, l); + luaL_pushresult(&b); + return 1; +} + + +static int str_byte (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + ptrdiff_t posi = posrelat(luaL_optinteger(L, 2, 1), l); + ptrdiff_t pose = posrelat(luaL_optinteger(L, 3, posi), l); + int n, i; + if (posi <= 0) posi = 1; + if ((size_t)pose > l) pose = l; + if (posi > pose) return 0; /* empty interval; return no values */ + n = (int)(pose - posi + 1); + if (posi + n <= pose) /* overflow? */ + luaL_error(L, "string slice too long"); + luaL_checkstack(L, n, "string slice too long"); + for (i=0; i= ms->level || ms->capture[l].len == CAP_UNFINISHED) + return luaL_error(ms->L, "invalid capture index"); + return l; +} + + +static int capture_to_close (MatchState *ms) { + int level = ms->level; + for (level--; level>=0; level--) + if (ms->capture[level].len == CAP_UNFINISHED) return level; + return luaL_error(ms->L, "invalid pattern capture"); +} + + +static const char *classend (MatchState *ms, const char *p) { + switch (*p++) { + case L_ESC: { + if (*p == '\0') + luaL_error(ms->L, "malformed pattern (ends with " LUA_QL("%%") ")"); + return p+1; + } + case '[': { + if (*p == '^') p++; + do { /* look for a `]' */ + if (*p == '\0') + luaL_error(ms->L, "malformed pattern (missing " LUA_QL("]") ")"); + if (*(p++) == L_ESC && *p != '\0') + p++; /* skip escapes (e.g. `%]') */ + } while (*p != ']'); + return p+1; + } + default: { + return p; + } + } +} + + +static int match_class (int c, int cl) { + int res; + switch (tolower(cl)) { + case 'a' : res = isalpha(c); break; + case 'c' : res = iscntrl(c); break; + case 'd' : res = isdigit(c); break; + case 'l' : res = islower(c); break; + case 'p' : res = ispunct(c); break; + case 's' : res = isspace(c); break; + case 'u' : res = isupper(c); break; + case 'w' : res = isalnum(c); break; + case 'x' : res = isxdigit(c); break; + case 'z' : res = (c == 0); break; + default: return (cl == c); + } + return (islower(cl) ? res : !res); +} + + +static int matchbracketclass (int c, const char *p, const char *ec) { + int sig = 1; + if (*(p+1) == '^') { + sig = 0; + p++; /* skip the `^' */ + } + while (++p < ec) { + if (*p == L_ESC) { + p++; + if (match_class(c, uchar(*p))) + return sig; + } + else if ((*(p+1) == '-') && (p+2 < ec)) { + p+=2; + if (uchar(*(p-2)) <= c && c <= uchar(*p)) + return sig; + } + else if (uchar(*p) == c) return sig; + } + return !sig; +} + + +static int singlematch (int c, const char *p, const char *ep) { + switch (*p) { + case '.': return 1; /* matches any char */ + case L_ESC: return match_class(c, uchar(*(p+1))); + case '[': return matchbracketclass(c, p, ep-1); + default: return (uchar(*p) == c); + } +} + + +static const char *match (MatchState *ms, const char *s, const char *p); + + +static const char *matchbalance (MatchState *ms, const char *s, + const char *p) { + if (*p == 0 || *(p+1) == 0) + luaL_error(ms->L, "unbalanced pattern"); + if (*s != *p) return NULL; + else { + int b = *p; + int e = *(p+1); + int cont = 1; + while (++s < ms->src_end) { + if (*s == e) { + if (--cont == 0) return s+1; + } + else if (*s == b) cont++; + } + } + return NULL; /* string ends out of balance */ +} + + +static const char *max_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + ptrdiff_t i = 0; /* counts maximum expand for item */ + while ((s+i)src_end && singlematch(uchar(*(s+i)), p, ep)) + i++; + /* keeps trying to match with the maximum repetitions */ + while (i>=0) { + const char *res = match(ms, (s+i), ep+1); + if (res) return res; + i--; /* else didn't match; reduce 1 repetition to try again */ + } + return NULL; +} + + +static const char *min_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + for (;;) { + const char *res = match(ms, s, ep+1); + if (res != NULL) + return res; + else if (ssrc_end && singlematch(uchar(*s), p, ep)) + s++; /* try with one more repetition */ + else return NULL; + } +} + + +static const char *start_capture (MatchState *ms, const char *s, + const char *p, int what) { + const char *res; + int level = ms->level; + if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); + ms->capture[level].init = s; + ms->capture[level].len = what; + ms->level = level+1; + if ((res=match(ms, s, p)) == NULL) /* match failed? */ + ms->level--; /* undo capture */ + return res; +} + + +static const char *end_capture (MatchState *ms, const char *s, + const char *p) { + int l = capture_to_close(ms); + const char *res; + ms->capture[l].len = s - ms->capture[l].init; /* close capture */ + if ((res = match(ms, s, p)) == NULL) /* match failed? */ + ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ + return res; +} + + +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; + if ((size_t)(ms->src_end-s) >= len && + memcmp(ms->capture[l].init, s, len) == 0) + return s+len; + else return NULL; +} + + +static const char *match (MatchState *ms, const char *s, const char *p) { + init: /* using goto's to optimize tail recursion */ + switch (*p) { + case '(': { /* start capture */ + if (*(p+1) == ')') /* position capture? */ + return start_capture(ms, s, p+2, CAP_POSITION); + else + return start_capture(ms, s, p+1, CAP_UNFINISHED); + } + case ')': { /* end capture */ + return end_capture(ms, s, p+1); + } + case L_ESC: { + switch (*(p+1)) { + case 'b': { /* balanced string? */ + s = matchbalance(ms, s, p+2); + if (s == NULL) return NULL; + p+=4; goto init; /* else return match(ms, s, p+4); */ + } + case 'f': { /* frontier? */ + const char *ep; char previous; + p += 2; + if (*p != '[') + luaL_error(ms->L, "missing " LUA_QL("[") " after " + LUA_QL("%%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)) return NULL; + p=ep; goto init; /* else return match(ms, s, ep); */ + } + default: { + if (isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */ + s = match_capture(ms, s, uchar(*(p+1))); + if (s == NULL) return NULL; + p+=2; goto init; /* else return match(ms, s, p+2) */ + } + goto dflt; /* case default */ + } + } + } + case '\0': { /* end of pattern */ + return s; /* match succeeded */ + } + case '$': { + if (*(p+1) == '\0') /* is the `$' the last char in pattern? */ + return (s == ms->src_end) ? s : NULL; /* check end of string */ + else goto dflt; + } + default: dflt: { /* it is a pattern item */ + const char *ep = classend(ms, p); /* points to what is next */ + int m = ssrc_end && singlematch(uchar(*s), p, ep); + switch (*ep) { + case '?': { /* optional */ + const char *res; + if (m && ((res=match(ms, s+1, ep+1)) != NULL)) + return res; + p=ep+1; goto init; /* else return match(ms, s, ep+1); */ + } + case '*': { /* 0 or more repetitions */ + return max_expand(ms, s, p, ep); + } + case '+': { /* 1 or more repetitions */ + return (m ? max_expand(ms, s+1, p, ep) : NULL); + } + case '-': { /* 0 or more repetitions (minimum) */ + return min_expand(ms, s, p, ep); + } + default: { + if (!m) return NULL; + s++; p=ep; goto init; /* else return match(ms, s+1, ep); */ + } + } + } + } +} + + + +static const char *lmemfind (const char *s1, size_t l1, + const char *s2, size_t l2) { + if (l2 == 0) return s1; /* empty strings are everywhere */ + else if (l2 > l1) return NULL; /* avoids a negative `l1' */ + else { + const char *init; /* to search for a `*s2' inside `s1' */ + l2--; /* 1st char will be checked by `memchr' */ + l1 = l1-l2; /* `s2' cannot be found after that */ + while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { + init++; /* 1st char is already checked */ + if (memcmp(init, s2+1, l2) == 0) + return init-1; + else { /* correct `l1' and `s1' to try again */ + l1 -= init-s1; + s1 = init; + } + } + return NULL; /* not found */ + } +} + + +static void push_onecapture (MatchState *ms, int i, const char *s, + const char *e) { + if (i >= ms->level) { + if (i == 0) /* ms->level == 0, too */ + lua_pushlstring(ms->L, s, e - s); /* add whole match */ + else + luaL_error(ms->L, "invalid capture index"); + } + else { + ptrdiff_t l = ms->capture[i].len; + if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture"); + if (l == CAP_POSITION) + lua_pushinteger(ms->L, ms->capture[i].init - ms->src_init + 1); + else + lua_pushlstring(ms->L, ms->capture[i].init, l); + } +} + + +static int push_captures (MatchState *ms, const char *s, const char *e) { + int i; + int nlevels = (ms->level == 0 && s) ? 1 : ms->level; + luaL_checkstack(ms->L, nlevels, "too many captures"); + for (i = 0; i < nlevels; i++) + push_onecapture(ms, i, s, e); + return nlevels; /* number of strings pushed */ +} + + +static int str_find_aux (lua_State *L, int find) { + size_t l1, l2; + const char *s = luaL_checklstring(L, 1, &l1); + const char *p = luaL_checklstring(L, 2, &l2); + ptrdiff_t init = posrelat(luaL_optinteger(L, 3, 1), l1) - 1; + if (init < 0) init = 0; + else if ((size_t)(init) > l1) init = (ptrdiff_t)l1; + if (find && (lua_toboolean(L, 4) || /* explicit request? */ + strpbrk(p, SPECIALS) == NULL)) { /* or no special characters? */ + /* do a plain search */ + const char *s2 = lmemfind(s+init, l1-init, p, l2); + if (s2) { + lua_pushinteger(L, s2-s+1); + lua_pushinteger(L, s2-s+l2); + return 2; + } + } + else { + MatchState ms; + int anchor = (*p == '^') ? (p++, 1) : 0; + const char *s1=s+init; + ms.L = L; + ms.src_init = s; + ms.src_end = s+l1; + do { + const char *res; + ms.level = 0; + if ((res=match(&ms, s1, p)) != NULL) { + if (find) { + lua_pushinteger(L, s1-s+1); /* start */ + lua_pushinteger(L, res-s); /* end */ + return push_captures(&ms, NULL, 0) + 2; + } + else + return push_captures(&ms, s1, res); + } + } while (s1++ < ms.src_end && !anchor); + } + lua_pushnil(L); /* not found */ + return 1; +} + + +static int str_find (lua_State *L) { + return str_find_aux(L, 1); +} + + +static int str_match (lua_State *L) { + return str_find_aux(L, 0); +} + + +static int gmatch_aux (lua_State *L) { + MatchState ms; + size_t ls; + const char *s = lua_tolstring(L, lua_upvalueindex(1), &ls); + const char *p = lua_tostring(L, lua_upvalueindex(2)); + const char *src; + ms.L = L; + ms.src_init = s; + ms.src_end = s+ls; + for (src = s + (size_t)lua_tointeger(L, lua_upvalueindex(3)); + src <= ms.src_end; + src++) { + const char *e; + ms.level = 0; + if ((e = match(&ms, src, p)) != NULL) { + lua_Integer newstart = e-s; + if (e == src) newstart++; /* empty match? go at least one position */ + lua_pushinteger(L, newstart); + lua_replace(L, lua_upvalueindex(3)); + return push_captures(&ms, src, e); + } + } + return 0; /* not found */ +} + + +static int gmatch (lua_State *L) { + luaL_checkstring(L, 1); + luaL_checkstring(L, 2); + lua_settop(L, 2); + lua_pushinteger(L, 0); + lua_pushcclosure(L, gmatch_aux, 3); + return 1; +} + + +static int gfind_nodef (lua_State *L) { + return luaL_error(L, LUA_QL("string.gfind") " was renamed to " + LUA_QL("string.gmatch")); +} + + +static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + size_t l, i; + const char *news = lua_tolstring(ms->L, 3, &l); + for (i = 0; i < l; i++) { + if (news[i] != L_ESC) + luaL_addchar(b, news[i]); + else { + i++; /* skip ESC */ + if (!isdigit(uchar(news[i]))) + luaL_addchar(b, news[i]); + else if (news[i] == '0') + luaL_addlstring(b, s, e - s); + else { + push_onecapture(ms, news[i] - '1', s, e); + luaL_addvalue(b); /* add capture to accumulated result */ + } + } + } +} + + +static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + lua_State *L = ms->L; + switch (lua_type(L, 3)) { + case LUA_TNUMBER: + case LUA_TSTRING: { + add_s(ms, b, s, e); + return; + } + case LUA_TFUNCTION: { + int n; + lua_pushvalue(L, 3); + n = push_captures(ms, s, e); + lua_call(L, n, 1); + break; + } + case LUA_TTABLE: { + push_onecapture(ms, 0, s, e); + lua_gettable(L, 3); + break; + } + } + if (!lua_toboolean(L, -1)) { /* nil or false? */ + lua_pop(L, 1); + lua_pushlstring(L, s, e - s); /* keep original text */ + } + else if (!lua_isstring(L, -1)) + luaL_error(L, "invalid replacement value (a %s)", luaL_typename(L, -1)); + luaL_addvalue(b); /* add result to accumulator */ +} + + +static int str_gsub (lua_State *L) { + size_t srcl; + const char *src = luaL_checklstring(L, 1, &srcl); + const char *p = luaL_checkstring(L, 2); + int tr = lua_type(L, 3); + int max_s = luaL_optint(L, 4, srcl+1); + int anchor = (*p == '^') ? (p++, 1) : 0; + int n = 0; + MatchState ms; + luaL_Buffer b; + luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || + tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, + "string/function/table expected"); + luaL_buffinit(L, &b); + ms.L = L; + ms.src_init = src; + ms.src_end = src+srcl; + while (n < max_s) { + const char *e; + ms.level = 0; + e = match(&ms, src, p); + if (e) { + n++; + add_value(&ms, &b, src, e); + } + if (e && e>src) /* non empty match? */ + src = e; /* skip it */ + else if (src < ms.src_end) + luaL_addchar(&b, *src++); + else break; + if (anchor) break; + } + luaL_addlstring(&b, src, ms.src_end-src); + luaL_pushresult(&b); + lua_pushinteger(L, n); /* number of substitutions */ + return 2; +} + +/* }====================================================== */ + + +/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ +#define MAX_ITEM 512 +/* valid flags in a format specification */ +#define FLAGS "-+ #0" +/* +** maximum size of each format specification (such as '%-099.99d') +** (+10 accounts for %99.99x plus margin of error) +*/ +#define MAX_FORMAT (sizeof(FLAGS) + sizeof(LUA_INTFRMLEN) + 10) + + +static void addquoted (lua_State *L, luaL_Buffer *b, int arg) { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + luaL_addchar(b, '"'); + while (l--) { + switch (*s) { + case '"': case '\\': case '\n': { + luaL_addchar(b, '\\'); + luaL_addchar(b, *s); + break; + } + case '\r': { + luaL_addlstring(b, "\\r", 2); + break; + } + case '\0': { + luaL_addlstring(b, "\\000", 4); + break; + } + default: { + luaL_addchar(b, *s); + break; + } + } + s++; + } + luaL_addchar(b, '"'); +} + +static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { + const char *p = strfrmt; + while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */ + if ((size_t)(p - strfrmt) >= sizeof(FLAGS)) + luaL_error(L, "invalid format (repeated flags)"); + if (isdigit(uchar(*p))) p++; /* skip width */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + if (*p == '.') { + p++; + if (isdigit(uchar(*p))) p++; /* skip precision */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + } + if (isdigit(uchar(*p))) + luaL_error(L, "invalid format (width or precision too long)"); + *(form++) = '%'; + strncpy(form, strfrmt, p - strfrmt + 1); + form += p - strfrmt + 1; + *form = '\0'; + return p; +} + + +static void addintlen (char *form) { + size_t l = strlen(form); + char spec = form[l - 1]; + strcpy(form + l - 1, LUA_INTFRMLEN); + form[l + sizeof(LUA_INTFRMLEN) - 2] = spec; + form[l + sizeof(LUA_INTFRMLEN) - 1] = '\0'; +} + + +static int str_format (lua_State *L) { + int top = lua_gettop(L); + int arg = 1; + size_t sfl; + const char *strfrmt = luaL_checklstring(L, arg, &sfl); + const char *strfrmt_end = strfrmt+sfl; + luaL_Buffer b; + luaL_buffinit(L, &b); + while (strfrmt < strfrmt_end) { + if (*strfrmt != L_ESC) + luaL_addchar(&b, *strfrmt++); + else if (*++strfrmt == L_ESC) + luaL_addchar(&b, *strfrmt++); /* %% */ + else { /* format item */ + char form[MAX_FORMAT]; /* to store the format (`%...') */ + char buff[MAX_ITEM]; /* to store the formatted item */ + if (++arg > top) + luaL_argerror(L, arg, "no value"); + strfrmt = scanformat(L, strfrmt, form); + switch (*strfrmt++) { + case 'c': { + sprintf(buff, form, (int)luaL_checknumber(L, arg)); + break; + } + case 'd': case 'i': { + addintlen(form); + sprintf(buff, form, (LUA_INTFRM_T)luaL_checknumber(L, arg)); + break; + } + case 'o': case 'u': case 'x': case 'X': { + addintlen(form); + sprintf(buff, form, (unsigned LUA_INTFRM_T)luaL_checknumber(L, arg)); + break; + } + case 'e': case 'E': case 'f': + case 'g': case 'G': { + sprintf(buff, form, (double)luaL_checknumber(L, arg)); + break; + } + case 'q': { + addquoted(L, &b, arg); + continue; /* skip the 'addsize' at the end */ + } + case 's': { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + if (!strchr(form, '.') && l >= 100) { + /* no precision and string is too long to be formatted; + keep original string */ + lua_pushvalue(L, arg); + luaL_addvalue(&b); + continue; /* skip the `addsize' at the end */ + } + else { + sprintf(buff, form, s); + break; + } + } + default: { /* also treat cases `pnLlh' */ + return luaL_error(L, "invalid option " LUA_QL("%%%c") " to " + LUA_QL("format"), *(strfrmt - 1)); + } + } + luaL_addlstring(&b, buff, strlen(buff)); + } + } + luaL_pushresult(&b); + return 1; +} + + +static const luaL_Reg strlib[] = { + {"byte", str_byte}, + {"char", str_char}, + {"dump", str_dump}, + {"find", str_find}, + {"format", str_format}, + {"gfind", gfind_nodef}, + {"gmatch", gmatch}, + {"gsub", str_gsub}, + {"len", str_len}, + {"lower", str_lower}, + {"match", str_match}, + {"rep", str_rep}, + {"reverse", str_reverse}, + {"sub", str_sub}, + {"upper", str_upper}, + {NULL, NULL} +}; + + +static void createmetatable (lua_State *L) { + lua_createtable(L, 0, 1); /* create metatable for strings */ + lua_pushliteral(L, ""); /* dummy string */ + lua_pushvalue(L, -2); + lua_setmetatable(L, -2); /* set string metatable */ + lua_pop(L, 1); /* pop dummy string */ + lua_pushvalue(L, -2); /* string library... */ + lua_setfield(L, -2, "__index"); /* ...is the __index metamethod */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** Open string library +*/ +LUALIB_API int luaopen_string (lua_State *L) { + luaL_register(L, LUA_STRLIBNAME, strlib); +#if defined(LUA_COMPAT_GFIND) + lua_getfield(L, -1, "gmatch"); + lua_setfield(L, -2, "gfind"); +#endif + createmetatable(L); + return 1; +} + diff --git a/ext/lua-5.1.5/src/ltable.c b/ext/lua-5.1.5/src/ltable.c new file mode 100644 index 000000000..ec84f4fab --- /dev/null +++ b/ext/lua-5.1.5/src/ltable.c @@ -0,0 +1,588 @@ +/* +** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $ +** Lua tables (hash) +** See Copyright Notice in lua.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 at +** least half the slots between 0 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 + +#define ltable_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "ltable.h" + + +/* +** max size of array part is 2^MAXBITS +*/ +#if LUAI_BITSINT > 26 +#define MAXBITS 26 +#else +#define MAXBITS (LUAI_BITSINT-2) +#endif + +#define MAXASIZE (1 << MAXBITS) + + +#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) + +#define hashstr(t,str) hashpow2(t, (str)->tsv.hash) +#define hashboolean(t,p) hashpow2(t, p) + + +/* +** for some types, it is better to avoid modulus by power of 2, as +** they tend to have many 2 factors. +*/ +#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) + + +#define hashpointer(t,p) hashmod(t, IntPoint(p)) + + +/* +** number of ints inside a lua_Number +*/ +#define numints cast_int(sizeof(lua_Number)/sizeof(int)) + + + +#define dummynode (&dummynode_) + +static const Node dummynode_ = { + {{NULL}, LUA_TNIL}, /* value */ + {{{NULL}, LUA_TNIL, NULL}} /* key */ +}; + + +/* +** hash for lua_Numbers +*/ +static Node *hashnum (const Table *t, lua_Number n) { + unsigned int a[numints]; + int i; + if (luai_numeq(n, 0)) /* avoid problems with -0 */ + return gnode(t, 0); + memcpy(a, &n, sizeof(a)); + for (i = 1; i < numints; i++) a[0] += a[i]; + return hashmod(t, a[0]); +} + + + +/* +** returns the `main' position of an element in a table (that is, the index +** of its hash value) +*/ +static Node *mainposition (const Table *t, const TValue *key) { + switch (ttype(key)) { + case LUA_TNUMBER: + return hashnum(t, nvalue(key)); + case LUA_TSTRING: + return hashstr(t, rawtsvalue(key)); + case LUA_TBOOLEAN: + return hashboolean(t, bvalue(key)); + case LUA_TLIGHTUSERDATA: + return hashpointer(t, pvalue(key)); + default: + return hashpointer(t, gcvalue(key)); + } +} + + +/* +** returns the index for `key' if `key' is an appropriate key to live in +** the array part of the table, -1 otherwise. +*/ +static int arrayindex (const TValue *key) { + if (ttisnumber(key)) { + lua_Number n = nvalue(key); + int k; + lua_number2int(k, n); + if (luai_numeq(cast_num(k), n)) + return k; + } + return -1; /* `key' did not match some condition */ +} + + +/* +** 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 signalled by -1. +*/ +static int findindex (lua_State *L, Table *t, StkId key) { + int i; + if (ttisnil(key)) return -1; /* first iteration */ + i = arrayindex(key); + if (0 < i && i <= t->sizearray) /* is `key' inside array part? */ + return i-1; /* yes; that's the index (corrected to C) */ + else { + Node *n = mainposition(t, key); + do { /* check whether `key' is somewhere in the chain */ + /* key may be dead already, but it is ok to use it in `next' */ + if (luaO_rawequalObj(key2tval(n), key) || + (ttype(gkey(n)) == LUA_TDEADKEY && iscollectable(key) && + gcvalue(gkey(n)) == gcvalue(key))) { + i = cast_int(n - gnode(t, 0)); /* key index in hash table */ + /* hash elements are numbered after array ones */ + return i + t->sizearray; + } + else n = gnext(n); + } while (n); + luaG_runerror(L, "invalid key to " LUA_QL("next")); /* key not found */ + return 0; /* to avoid warnings */ + } +} + + +int luaH_next (lua_State *L, Table *t, StkId key) { + int i = findindex(L, t, key); /* find original element */ + for (i++; i < t->sizearray; i++) { /* try first array part */ + if (!ttisnil(&t->array[i])) { /* a non-nil value? */ + setnvalue(key, cast_num(i+1)); + setobj2s(L, key+1, &t->array[i]); + return 1; + } + } + for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */ + if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ + setobj2s(L, key, key2tval(gnode(t, i))); + setobj2s(L, key+1, gval(gnode(t, i))); + return 1; + } + } + return 0; /* no more elements */ +} + + +/* +** {============================================================= +** Rehash +** ============================================================== +*/ + + +static int computesizes (int nums[], int *narray) { + int i; + int twotoi; /* 2^i */ + int a = 0; /* number of elements smaller than 2^i */ + int na = 0; /* number of elements to go to array part */ + int n = 0; /* optimal size for array part */ + for (i = 0, twotoi = 1; twotoi/2 < *narray; i++, twotoi *= 2) { + if (nums[i] > 0) { + a += nums[i]; + if (a > twotoi/2) { /* more than half elements present? */ + n = twotoi; /* optimal size (till now) */ + na = a; /* all elements smaller than n will go to array part */ + } + } + if (a == *narray) break; /* all elements already counted */ + } + *narray = n; + lua_assert(*narray/2 <= na && na <= *narray); + return na; +} + + +static int countint (const TValue *key, int *nums) { + int k = arrayindex(key); + if (0 < k && k <= MAXASIZE) { /* is `key' an appropriate array index? */ + nums[ceillog2(k)]++; /* count as such */ + return 1; + } + else + return 0; +} + + +static int numusearray (const Table *t, int *nums) { + int lg; + int ttlg; /* 2^lg */ + int ause = 0; /* summation of `nums' */ + int i = 1; /* count to traverse all array keys */ + for (lg=0, ttlg=1; lg<=MAXBITS; lg++, ttlg*=2) { /* for each slice */ + int lc = 0; /* counter */ + int lim = ttlg; + if (lim > t->sizearray) { + lim = t->sizearray; /* 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 (!ttisnil(&t->array[i-1])) + lc++; + } + nums[lg] += lc; + ause += lc; + } + return ause; +} + + +static int numusehash (const Table *t, int *nums, int *pnasize) { + int totaluse = 0; /* total number of elements */ + int ause = 0; /* summation of `nums' */ + int i = sizenode(t); + while (i--) { + Node *n = &t->node[i]; + if (!ttisnil(gval(n))) { + ause += countint(key2tval(n), nums); + totaluse++; + } + } + *pnasize += ause; + return totaluse; +} + + +static void setarrayvector (lua_State *L, Table *t, int size) { + int i; + luaM_reallocvector(L, t->array, t->sizearray, size, TValue); + for (i=t->sizearray; iarray[i]); + t->sizearray = size; +} + + +static void setnodevector (lua_State *L, Table *t, int size) { + int lsize; + if (size == 0) { /* no elements to hash part? */ + t->node = cast(Node *, dummynode); /* use common `dummynode' */ + lsize = 0; + } + else { + int i; + lsize = ceillog2(size); + if (lsize > MAXBITS) + luaG_runerror(L, "table overflow"); + size = twoto(lsize); + t->node = luaM_newvector(L, size, Node); + for (i=0; ilsizenode = cast_byte(lsize); + t->lastfree = gnode(t, size); /* all positions are free */ +} + + +static void resize (lua_State *L, Table *t, int nasize, int nhsize) { + int i; + int oldasize = t->sizearray; + int oldhsize = t->lsizenode; + Node *nold = t->node; /* save old hash ... */ + if (nasize > oldasize) /* array part must grow? */ + setarrayvector(L, t, nasize); + /* create new hash part with appropriate size */ + setnodevector(L, t, nhsize); + if (nasize < oldasize) { /* array part must shrink? */ + t->sizearray = nasize; + /* re-insert elements from vanishing slice */ + for (i=nasize; iarray[i])) + setobjt2t(L, luaH_setnum(L, t, i+1), &t->array[i]); + } + /* shrink array */ + luaM_reallocvector(L, t->array, oldasize, nasize, TValue); + } + /* re-insert elements from hash part */ + for (i = twoto(oldhsize) - 1; i >= 0; i--) { + Node *old = nold+i; + if (!ttisnil(gval(old))) + setobjt2t(L, luaH_set(L, t, key2tval(old)), gval(old)); + } + if (nold != dummynode) + luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */ +} + + +void luaH_resizearray (lua_State *L, Table *t, int nasize) { + int nsize = (t->node == dummynode) ? 0 : sizenode(t); + resize(L, t, nasize, nsize); +} + + +static void rehash (lua_State *L, Table *t, const TValue *ek) { + int nasize, na; + int nums[MAXBITS+1]; /* nums[i] = number of keys between 2^(i-1) and 2^i */ + int i; + int totaluse; + for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* reset counts */ + nasize = numusearray(t, nums); /* count keys in array part */ + totaluse = nasize; /* all those keys are integer keys */ + totaluse += numusehash(t, nums, &nasize); /* count keys in hash part */ + /* count extra key */ + nasize += countint(ek, nums); + totaluse++; + /* compute new size for array part */ + na = computesizes(nums, &nasize); + /* resize the table to new computed sizes */ + resize(L, t, nasize, totaluse - na); +} + + + +/* +** }============================================================= +*/ + + +Table *luaH_new (lua_State *L, int narray, int nhash) { + Table *t = luaM_new(L, Table); + luaC_link(L, obj2gco(t), LUA_TTABLE); + t->metatable = NULL; + t->flags = cast_byte(~0); + /* temporary values (kept only if some malloc fails) */ + t->array = NULL; + t->sizearray = 0; + t->lsizenode = 0; + t->node = cast(Node *, dummynode); + setarrayvector(L, t, narray); + setnodevector(L, t, nhash); + return t; +} + + +void luaH_free (lua_State *L, Table *t) { + if (t->node != dummynode) + luaM_freearray(L, t->node, sizenode(t), Node); + luaM_freearray(L, t->array, t->sizearray, TValue); + luaM_free(L, t); +} + + +static Node *getfreepos (Table *t) { + while (t->lastfree-- > t->node) { + if (ttisnil(gkey(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 TValue *newkey (lua_State *L, Table *t, const TValue *key) { + Node *mp = mainposition(t, key); + if (!ttisnil(gval(mp)) || mp == dummynode) { + Node *othern; + Node *n = getfreepos(t); /* get a free place */ + if (n == NULL) { /* cannot find a free place? */ + rehash(L, t, key); /* grow table */ + return luaH_set(L, t, key); /* re-insert key into grown table */ + } + lua_assert(n != dummynode); + othern = mainposition(t, key2tval(mp)); + if (othern != mp) { /* is colliding node out of its main position? */ + /* yes; move colliding node into free position */ + while (gnext(othern) != mp) othern = gnext(othern); /* find previous */ + gnext(othern) = n; /* redo the chain with `n' in place of `mp' */ + *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + gnext(mp) = NULL; /* now `mp' is free */ + setnilvalue(gval(mp)); + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + gnext(n) = gnext(mp); /* chain new position */ + gnext(mp) = n; + mp = n; + } + } + gkey(mp)->value = key->value; gkey(mp)->tt = key->tt; + luaC_barriert(L, t, key); + lua_assert(ttisnil(gval(mp))); + return gval(mp); +} + + +/* +** search function for integers +*/ +const TValue *luaH_getnum (Table *t, int key) { + /* (1 <= key && key <= t->sizearray) */ + if (cast(unsigned int, key-1) < cast(unsigned int, t->sizearray)) + return &t->array[key-1]; + else { + lua_Number nk = cast_num(key); + Node *n = hashnum(t, nk); + do { /* check whether `key' is somewhere in the chain */ + if (ttisnumber(gkey(n)) && luai_numeq(nvalue(gkey(n)), nk)) + return gval(n); /* that's it */ + else n = gnext(n); + } while (n); + return luaO_nilobject; + } +} + + +/* +** search function for strings +*/ +const TValue *luaH_getstr (Table *t, TString *key) { + Node *n = hashstr(t, key); + do { /* check whether `key' is somewhere in the chain */ + if (ttisstring(gkey(n)) && rawtsvalue(gkey(n)) == key) + return gval(n); /* that's it */ + else n = gnext(n); + } while (n); + return luaO_nilobject; +} + + +/* +** main search function +*/ +const TValue *luaH_get (Table *t, const TValue *key) { + switch (ttype(key)) { + case LUA_TNIL: return luaO_nilobject; + case LUA_TSTRING: return luaH_getstr(t, rawtsvalue(key)); + case LUA_TNUMBER: { + int k; + lua_Number n = nvalue(key); + lua_number2int(k, n); + if (luai_numeq(cast_num(k), nvalue(key))) /* index is int? */ + return luaH_getnum(t, k); /* use specialized version */ + /* else go through */ + } + default: { + Node *n = mainposition(t, key); + do { /* check whether `key' is somewhere in the chain */ + if (luaO_rawequalObj(key2tval(n), key)) + return gval(n); /* that's it */ + else n = gnext(n); + } while (n); + return luaO_nilobject; + } + } +} + + +TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { + const TValue *p = luaH_get(t, key); + t->flags = 0; + if (p != luaO_nilobject) + return cast(TValue *, p); + else { + if (ttisnil(key)) luaG_runerror(L, "table index is nil"); + else if (ttisnumber(key) && luai_numisnan(nvalue(key))) + luaG_runerror(L, "table index is NaN"); + return newkey(L, t, key); + } +} + + +TValue *luaH_setnum (lua_State *L, Table *t, int key) { + const TValue *p = luaH_getnum(t, key); + if (p != luaO_nilobject) + return cast(TValue *, p); + else { + TValue k; + setnvalue(&k, cast_num(key)); + return newkey(L, t, &k); + } +} + + +TValue *luaH_setstr (lua_State *L, Table *t, TString *key) { + const TValue *p = luaH_getstr(t, key); + if (p != luaO_nilobject) + return cast(TValue *, p); + else { + TValue k; + setsvalue(L, &k, key); + return newkey(L, t, &k); + } +} + + +static int unbound_search (Table *t, unsigned int j) { + unsigned int i = j; /* i is zero or a present index */ + j++; + /* find `i' and `j' such that i is present and j is not */ + while (!ttisnil(luaH_getnum(t, j))) { + i = j; + j *= 2; + if (j > cast(unsigned int, MAX_INT)) { /* overflow? */ + /* table was built with bad purposes: resort to linear search */ + i = 1; + while (!ttisnil(luaH_getnum(t, i))) i++; + return i - 1; + } + } + /* now do a binary search between them */ + while (j - i > 1) { + unsigned int m = (i+j)/2; + if (ttisnil(luaH_getnum(t, m))) 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 non-nil and t[i+1] is nil (and 0 if t[1] is nil). +*/ +int luaH_getn (Table *t) { + unsigned int j = t->sizearray; + if (j > 0 && ttisnil(&t->array[j - 1])) { + /* there is a boundary in the array part: (binary) search for it */ + unsigned int i = 0; + while (j - i > 1) { + unsigned int m = (i+j)/2; + if (ttisnil(&t->array[m - 1])) j = m; + else i = m; + } + return i; + } + /* else must find a boundary in hash part */ + else if (t->node == dummynode) /* hash part is empty? */ + return j; /* that is easy... */ + else return unbound_search(t, j); +} + + + +#if defined(LUA_DEBUG) + +Node *luaH_mainposition (const Table *t, const TValue *key) { + return mainposition(t, key); +} + +int luaH_isdummy (Node *n) { return n == dummynode; } + +#endif diff --git a/ext/lua-5.1.5/src/ltable.h b/ext/lua-5.1.5/src/ltable.h new file mode 100644 index 000000000..f5b9d5ead --- /dev/null +++ b/ext/lua-5.1.5/src/ltable.h @@ -0,0 +1,40 @@ +/* +** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $ +** 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 gkey(n) (&(n)->i_key.nk) +#define gval(n) (&(n)->i_val) +#define gnext(n) ((n)->i_key.nk.next) + +#define key2tval(n) (&(n)->i_key.tvk) + + +LUAI_FUNC const TValue *luaH_getnum (Table *t, int key); +LUAI_FUNC TValue *luaH_setnum (lua_State *L, Table *t, int key); +LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); +LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key); +LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); +LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key); +LUAI_FUNC Table *luaH_new (lua_State *L, int narray, int lnhash); +LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, 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 int luaH_getn (Table *t); + + +#if defined(LUA_DEBUG) +LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); +LUAI_FUNC int luaH_isdummy (Node *n); +#endif + + +#endif diff --git a/ext/lua-5.1.5/src/ltablib.c b/ext/lua-5.1.5/src/ltablib.c new file mode 100644 index 000000000..b6d9cb4ac --- /dev/null +++ b/ext/lua-5.1.5/src/ltablib.c @@ -0,0 +1,287 @@ +/* +** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $ +** Library for Table Manipulation +** See Copyright Notice in lua.h +*/ + + +#include + +#define ltablib_c +#define LUA_LIB + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n)) + + +static int foreachi (lua_State *L) { + int i; + int n = aux_getn(L, 1); + luaL_checktype(L, 2, LUA_TFUNCTION); + for (i=1; i <= n; i++) { + lua_pushvalue(L, 2); /* function */ + lua_pushinteger(L, i); /* 1st argument */ + lua_rawgeti(L, 1, i); /* 2nd argument */ + lua_call(L, 2, 1); + if (!lua_isnil(L, -1)) + return 1; + lua_pop(L, 1); /* remove nil result */ + } + return 0; +} + + +static int foreach (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checktype(L, 2, LUA_TFUNCTION); + lua_pushnil(L); /* first key */ + while (lua_next(L, 1)) { + lua_pushvalue(L, 2); /* function */ + lua_pushvalue(L, -3); /* key */ + lua_pushvalue(L, -3); /* value */ + lua_call(L, 2, 1); + if (!lua_isnil(L, -1)) + return 1; + lua_pop(L, 2); /* remove value and result */ + } + return 0; +} + + +static int maxn (lua_State *L) { + lua_Number max = 0; + luaL_checktype(L, 1, LUA_TTABLE); + lua_pushnil(L); /* first key */ + while (lua_next(L, 1)) { + lua_pop(L, 1); /* remove value */ + if (lua_type(L, -1) == LUA_TNUMBER) { + lua_Number v = lua_tonumber(L, -1); + if (v > max) max = v; + } + } + lua_pushnumber(L, max); + return 1; +} + + +static int getn (lua_State *L) { + lua_pushinteger(L, aux_getn(L, 1)); + return 1; +} + + +static int setn (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); +#ifndef luaL_setn + luaL_setn(L, 1, luaL_checkint(L, 2)); +#else + luaL_error(L, LUA_QL("setn") " is obsolete"); +#endif + lua_pushvalue(L, 1); + return 1; +} + + +static int tinsert (lua_State *L) { + int e = aux_getn(L, 1) + 1; /* first empty element */ + int pos; /* where to insert new element */ + switch (lua_gettop(L)) { + case 2: { /* called with only 2 arguments */ + pos = e; /* insert new element at the end */ + break; + } + case 3: { + int i; + pos = luaL_checkint(L, 2); /* 2nd argument is the position */ + if (pos > e) e = pos; /* `grow' array if necessary */ + for (i = e; i > pos; i--) { /* move up elements */ + lua_rawgeti(L, 1, i-1); + lua_rawseti(L, 1, i); /* t[i] = t[i-1] */ + } + break; + } + default: { + return luaL_error(L, "wrong number of arguments to " LUA_QL("insert")); + } + } + luaL_setn(L, 1, e); /* new size */ + lua_rawseti(L, 1, pos); /* t[pos] = v */ + return 0; +} + + +static int tremove (lua_State *L) { + int e = aux_getn(L, 1); + int pos = luaL_optint(L, 2, e); + if (!(1 <= pos && pos <= e)) /* position is outside bounds? */ + return 0; /* nothing to remove */ + luaL_setn(L, 1, e - 1); /* t.n = n-1 */ + lua_rawgeti(L, 1, pos); /* result = t[pos] */ + for ( ;pos= P */ + while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (i>u) luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[i] */ + } + /* repeat --j until a[j] <= P */ + while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { + if (j + +#define ltm_c +#define LUA_CORE + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + + +const char *const luaT_typenames[] = { + "nil", "boolean", "userdata", "number", + "string", "table", "function", "userdata", "thread", + "proto", "upval" +}; + + +void luaT_init (lua_State *L) { + static const char *const luaT_eventname[] = { /* ORDER TM */ + "__index", "__newindex", + "__gc", "__mode", "__eq", + "__add", "__sub", "__mul", "__div", "__mod", + "__pow", "__unm", "__len", "__lt", "__le", + "__concat", "__call" + }; + int i; + for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); + luaS_fix(G(L)->tmname[i]); /* never collect these names */ + } +} + + +/* +** function to be used with macro "fasttm": optimized for absence of +** tag methods +*/ +const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { + const TValue *tm = luaH_getstr(events, ename); + lua_assert(event <= TM_EQ); + if (ttisnil(tm)) { /* no tag method? */ + events->flags |= cast_byte(1u<metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(o)->metatable; + break; + default: + mt = G(L)->mt[ttype(o)]; + } + return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); +} + diff --git a/ext/lua-5.1.5/src/ltm.h b/ext/lua-5.1.5/src/ltm.h new file mode 100644 index 000000000..64343b781 --- /dev/null +++ b/ext/lua-5.1.5/src/ltm.h @@ -0,0 +1,54 @@ +/* +** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#ifndef ltm_h +#define ltm_h + + +#include "lobject.h" + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER TM" +*/ +typedef enum { + TM_INDEX, + TM_NEWINDEX, + TM_GC, + TM_MODE, + TM_EQ, /* last tag method with `fast' access */ + TM_ADD, + TM_SUB, + TM_MUL, + TM_DIV, + TM_MOD, + TM_POW, + TM_UNM, + TM_LEN, + TM_LT, + TM_LE, + TM_CONCAT, + TM_CALL, + TM_N /* number of elements in the enum */ +} TMS; + + + +#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ + ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) + +#define fasttm(l,et,e) gfasttm(G(l), et, e) + +LUAI_DATA const char *const luaT_typenames[]; + + +LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); +LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, + TMS event); +LUAI_FUNC void luaT_init (lua_State *L); + +#endif diff --git a/ext/lua-5.1.5/src/lua.c b/ext/lua-5.1.5/src/lua.c new file mode 100644 index 000000000..3a4660932 --- /dev/null +++ b/ext/lua-5.1.5/src/lua.c @@ -0,0 +1,392 @@ +/* +** $Id: lua.c,v 1.160.1.2 2007/12/28 15:32:23 roberto Exp $ +** Lua stand-alone interpreter +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include +#include + +#define lua_c + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + +static lua_State *globalL = NULL; + +static const char *progname = LUA_PROGNAME; + + + +static void lstop (lua_State *L, lua_Debug *ar) { + (void)ar; /* unused arg. */ + lua_sethook(L, NULL, 0, 0); + luaL_error(L, "interrupted!"); +} + + +static void laction (int i) { + signal(i, SIG_DFL); /* if another SIGINT happens before lstop, + terminate process (default action) */ + lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); +} + + +static void print_usage (void) { + fprintf(stderr, + "usage: %s [options] [script [args]].\n" + "Available options are:\n" + " -e stat execute string " LUA_QL("stat") "\n" + " -l name require library " LUA_QL("name") "\n" + " -i enter interactive mode after executing " LUA_QL("script") "\n" + " -v show version information\n" + " -- stop handling options\n" + " - execute stdin and stop handling options\n" + , + progname); + fflush(stderr); +} + + +static void l_message (const char *pname, const char *msg) { + if (pname) fprintf(stderr, "%s: ", pname); + fprintf(stderr, "%s\n", msg); + fflush(stderr); +} + + +static int report (lua_State *L, int status) { + if (status && !lua_isnil(L, -1)) { + const char *msg = lua_tostring(L, -1); + if (msg == NULL) msg = "(error object is not a string)"; + l_message(progname, msg); + lua_pop(L, 1); + } + return status; +} + + +static int traceback (lua_State *L) { + if (!lua_isstring(L, 1)) /* 'message' not a string? */ + return 1; /* keep it intact */ + lua_getfield(L, LUA_GLOBALSINDEX, "debug"); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + return 1; + } + lua_getfield(L, -1, "traceback"); + if (!lua_isfunction(L, -1)) { + lua_pop(L, 2); + return 1; + } + lua_pushvalue(L, 1); /* pass error message */ + lua_pushinteger(L, 2); /* skip this function and traceback */ + lua_call(L, 2, 1); /* call debug.traceback */ + return 1; +} + + +static int docall (lua_State *L, int narg, int clear) { + int status; + int base = lua_gettop(L) - narg; /* function index */ + lua_pushcfunction(L, traceback); /* push traceback function */ + lua_insert(L, base); /* put it under chunk and args */ + signal(SIGINT, laction); + status = lua_pcall(L, narg, (clear ? 0 : LUA_MULTRET), base); + signal(SIGINT, SIG_DFL); + lua_remove(L, base); /* remove traceback function */ + /* force a complete garbage collection in case of errors */ + if (status != 0) lua_gc(L, LUA_GCCOLLECT, 0); + return status; +} + + +static void print_version (void) { + l_message(NULL, LUA_RELEASE " " LUA_COPYRIGHT); +} + + +static int getargs (lua_State *L, char **argv, int n) { + int narg; + int i; + int argc = 0; + while (argv[argc]) argc++; /* count total number of arguments */ + narg = argc - (n + 1); /* number of arguments to the script */ + luaL_checkstack(L, narg + 3, "too many arguments to script"); + for (i=n+1; i < argc; i++) + lua_pushstring(L, argv[i]); + lua_createtable(L, narg, n + 1); + for (i=0; i < argc; i++) { + lua_pushstring(L, argv[i]); + lua_rawseti(L, -2, i - n); + } + return narg; +} + + +static int dofile (lua_State *L, const char *name) { + int status = luaL_loadfile(L, name) || docall(L, 0, 1); + return report(L, status); +} + + +static int dostring (lua_State *L, const char *s, const char *name) { + int status = luaL_loadbuffer(L, s, strlen(s), name) || docall(L, 0, 1); + return report(L, status); +} + + +static int dolibrary (lua_State *L, const char *name) { + lua_getglobal(L, "require"); + lua_pushstring(L, name); + return report(L, docall(L, 1, 1)); +} + + +static const char *get_prompt (lua_State *L, int firstline) { + const char *p; + lua_getfield(L, LUA_GLOBALSINDEX, firstline ? "_PROMPT" : "_PROMPT2"); + p = lua_tostring(L, -1); + if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2); + lua_pop(L, 1); /* remove global */ + return p; +} + + +static int incomplete (lua_State *L, int status) { + if (status == LUA_ERRSYNTAX) { + size_t lmsg; + const char *msg = lua_tolstring(L, -1, &lmsg); + const char *tp = msg + lmsg - (sizeof(LUA_QL("")) - 1); + if (strstr(msg, LUA_QL("")) == tp) { + lua_pop(L, 1); + return 1; + } + } + return 0; /* else... */ +} + + +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); + if (lua_readline(L, b, prmt) == 0) + return 0; /* no input */ + l = strlen(b); + if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ + b[l-1] = '\0'; /* remove it */ + if (firstline && b[0] == '=') /* first line starts with `=' ? */ + lua_pushfstring(L, "return %s", b+1); /* change it to `return' */ + else + lua_pushstring(L, b); + lua_freeline(L, b); + return 1; +} + + +static int loadline (lua_State *L) { + int status; + lua_settop(L, 0); + if (!pushline(L, 1)) + return -1; /* no input */ + for (;;) { /* repeat until gets a complete line */ + status = luaL_loadbuffer(L, lua_tostring(L, 1), lua_strlen(L, 1), "=stdin"); + if (!incomplete(L, status)) break; /* cannot try to add lines? */ + if (!pushline(L, 0)) /* no more input? */ + return -1; + lua_pushliteral(L, "\n"); /* add a new line... */ + lua_insert(L, -2); /* ...between the two lines */ + lua_concat(L, 3); /* join them */ + } + lua_saveline(L, 1); + lua_remove(L, 1); /* remove line */ + return status; +} + + +static void dotty (lua_State *L) { + int status; + const char *oldprogname = progname; + progname = NULL; + while ((status = loadline(L)) != -1) { + if (status == 0) status = docall(L, 0, 0); + report(L, status); + if (status == 0 && lua_gettop(L) > 0) { /* any result to print? */ + lua_getglobal(L, "print"); + lua_insert(L, 1); + if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) + l_message(progname, lua_pushfstring(L, + "error calling " LUA_QL("print") " (%s)", + lua_tostring(L, -1))); + } + } + lua_settop(L, 0); /* clear stack */ + fputs("\n", stdout); + fflush(stdout); + progname = oldprogname; +} + + +static int handle_script (lua_State *L, char **argv, int n) { + int status; + const char *fname; + int narg = getargs(L, argv, n); /* collect arguments */ + lua_setglobal(L, "arg"); + fname = argv[n]; + if (strcmp(fname, "-") == 0 && strcmp(argv[n-1], "--") != 0) + fname = NULL; /* stdin */ + status = luaL_loadfile(L, fname); + lua_insert(L, -(narg+1)); + if (status == 0) + status = docall(L, narg, 0); + else + lua_pop(L, narg); + return report(L, status); +} + + +/* check that argument has no extra characters at the end */ +#define notail(x) {if ((x)[2] != '\0') return -1;} + + +static int collectargs (char **argv, int *pi, int *pv, int *pe) { + int i; + for (i = 1; argv[i] != NULL; i++) { + if (argv[i][0] != '-') /* not an option? */ + return i; + switch (argv[i][1]) { /* option */ + case '-': + notail(argv[i]); + return (argv[i+1] != NULL ? i+1 : 0); + case '\0': + return i; + case 'i': + notail(argv[i]); + *pi = 1; /* go through */ + case 'v': + notail(argv[i]); + *pv = 1; + break; + case 'e': + *pe = 1; /* go through */ + case 'l': + if (argv[i][2] == '\0') { + i++; + if (argv[i] == NULL) return -1; + } + break; + default: return -1; /* invalid option */ + } + } + return 0; +} + + +static int runargs (lua_State *L, char **argv, int n) { + int i; + for (i = 1; i < n; i++) { + if (argv[i] == NULL) continue; + lua_assert(argv[i][0] == '-'); + switch (argv[i][1]) { /* option */ + case 'e': { + const char *chunk = argv[i] + 2; + if (*chunk == '\0') chunk = argv[++i]; + lua_assert(chunk != NULL); + if (dostring(L, chunk, "=(command line)") != 0) + return 1; + break; + } + case 'l': { + const char *filename = argv[i] + 2; + if (*filename == '\0') filename = argv[++i]; + lua_assert(filename != NULL); + if (dolibrary(L, filename)) + return 1; /* stop if file fails */ + break; + } + default: break; + } + } + return 0; +} + + +static int handle_luainit (lua_State *L) { + const char *init = getenv(LUA_INIT); + if (init == NULL) return 0; /* status OK */ + else if (init[0] == '@') + return dofile(L, init+1); + else + return dostring(L, init, "=" LUA_INIT); +} + + +struct Smain { + int argc; + char **argv; + int status; +}; + + +static int pmain (lua_State *L) { + struct Smain *s = (struct Smain *)lua_touserdata(L, 1); + char **argv = s->argv; + int script; + int has_i = 0, has_v = 0, has_e = 0; + globalL = L; + if (argv[0] && argv[0][0]) progname = argv[0]; + lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */ + luaL_openlibs(L); /* open libraries */ + lua_gc(L, LUA_GCRESTART, 0); + s->status = handle_luainit(L); + if (s->status != 0) return 0; + script = collectargs(argv, &has_i, &has_v, &has_e); + if (script < 0) { /* invalid args? */ + print_usage(); + s->status = 1; + return 0; + } + if (has_v) print_version(); + s->status = runargs(L, argv, (script > 0) ? script : s->argc); + if (s->status != 0) return 0; + if (script) + s->status = handle_script(L, argv, script); + if (s->status != 0) return 0; + if (has_i) + dotty(L); + else if (script == 0 && !has_e && !has_v) { + if (lua_stdin_is_tty()) { + print_version(); + dotty(L); + } + else dofile(L, NULL); /* executes stdin as a file */ + } + return 0; +} + + +int main (int argc, char **argv) { + int status; + struct Smain s; + lua_State *L = lua_open(); /* create state */ + if (L == NULL) { + l_message(argv[0], "cannot create state: not enough memory"); + return EXIT_FAILURE; + } + s.argc = argc; + s.argv = argv; + status = lua_cpcall(L, &pmain, &s); + report(L, status); + lua_close(L); + return (status || s.status) ? EXIT_FAILURE : EXIT_SUCCESS; +} + diff --git a/lua/lua.h b/ext/lua-5.1.5/src/lua.h similarity index 60% rename from lua/lua.h rename to ext/lua-5.1.5/src/lua.h index bdf9dc522..a4b73e743 100644 --- a/lua/lua.h +++ b/ext/lua-5.1.5/src/lua.h @@ -1,5 +1,5 @@ /* -** $Id: lua.h,v 1.218a 2006/06/02 15:34:00 roberto Exp $ +** $Id: lua.h,v 1.218.1.7 2012/01/13 20:36:20 roberto Exp $ ** Lua - An Extensible Extension Language ** Lua.org, PUC-Rio, Brazil (http://www.lua.org) ** See Copyright Notice at the end of this file @@ -17,9 +17,9 @@ #define LUA_VERSION "Lua 5.1" -#define LUA_RELEASE "Lua 5.1.2" +#define LUA_RELEASE "Lua 5.1.5" #define LUA_VERSION_NUM 501 -#define LUA_COPYRIGHT "Copyright (C) 1994-2007 Lua.org, PUC-Rio" +#define LUA_COPYRIGHT "Copyright (C) 1994-2012 Lua.org, PUC-Rio" #define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" @@ -108,7 +108,7 @@ typedef LUA_INTEGER lua_Integer; ** state manipulation */ LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); -LUA_API void (lua_close) (lua_State *L); +LUA_API void (lua_close) (lua_State *L); LUA_API lua_State *(lua_newthread) (lua_State *L); LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); @@ -117,92 +117,92 @@ LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); /* ** basic stack manipulation */ -LUA_API int (lua_gettop) (lua_State *L); -LUA_API void (lua_settop) (lua_State *L, int idx); -LUA_API void (lua_pushvalue) (lua_State *L, int idx); -LUA_API void (lua_remove) (lua_State *L, int idx); -LUA_API void (lua_insert) (lua_State *L, int idx); -LUA_API void (lua_replace) (lua_State *L, int idx); -LUA_API int (lua_checkstack) (lua_State *L, int sz); +LUA_API int (lua_gettop) (lua_State *L); +LUA_API void (lua_settop) (lua_State *L, int idx); +LUA_API void (lua_pushvalue) (lua_State *L, int idx); +LUA_API void (lua_remove) (lua_State *L, int idx); +LUA_API void (lua_insert) (lua_State *L, int idx); +LUA_API void (lua_replace) (lua_State *L, int idx); +LUA_API int (lua_checkstack) (lua_State *L, int sz); -LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); /* -** access functions (stack->C) +** access functions (stack -> C) */ -LUA_API int (lua_isnumber) (lua_State *L, int idx); -LUA_API int (lua_isstring) (lua_State *L, int idx); -LUA_API int (lua_iscfunction) (lua_State *L, int idx); -LUA_API int (lua_isuserdata) (lua_State *L, int idx); -LUA_API int (lua_type) (lua_State *L, int idx); -LUA_API const char *(lua_typename) (lua_State *L, int tp); +LUA_API int (lua_isnumber) (lua_State *L, int idx); +LUA_API int (lua_isstring) (lua_State *L, int idx); +LUA_API int (lua_iscfunction) (lua_State *L, int idx); +LUA_API int (lua_isuserdata) (lua_State *L, int idx); +LUA_API int (lua_type) (lua_State *L, int idx); +LUA_API const char *(lua_typename) (lua_State *L, int tp); -LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); -LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_equal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_lessthan) (lua_State *L, int idx1, int idx2); -LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); -LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); -LUA_API int (lua_toboolean) (lua_State *L, int idx); -LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); -LUA_API size_t (lua_objlen) (lua_State *L, int idx); -LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); -LUA_API void *(lua_touserdata) (lua_State *L, int idx); -LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); -LUA_API const void *(lua_topointer) (lua_State *L, int idx); +LUA_API lua_Number (lua_tonumber) (lua_State *L, int idx); +LUA_API lua_Integer (lua_tointeger) (lua_State *L, int idx); +LUA_API int (lua_toboolean) (lua_State *L, int idx); +LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); +LUA_API size_t (lua_objlen) (lua_State *L, int idx); +LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); +LUA_API void *(lua_touserdata) (lua_State *L, int idx); +LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); +LUA_API const void *(lua_topointer) (lua_State *L, int idx); /* -** push functions (C->stack) +** push functions (C -> stack) */ -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 void (lua_pushlstring) (lua_State *L, const char *s, size_t l); -LUA_API void (lua_pushstring) (lua_State *L, const char *s); +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 void (lua_pushlstring) (lua_State *L, const char *s, size_t l); +LUA_API void (lua_pushstring) (lua_State *L, const char *s); LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, - va_list argp); + va_list argp); LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); -LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); -LUA_API void (lua_pushboolean) (lua_State *L, int b); -LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); -LUA_API int (lua_pushthread) (lua_State *L); +LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +LUA_API void (lua_pushboolean) (lua_State *L, int b); +LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); +LUA_API int (lua_pushthread) (lua_State *L); /* -** get functions (Lua->stack) +** get functions (Lua -> stack) */ -LUA_API void (lua_gettable) (lua_State *L, int idx); -LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawget) (lua_State *L, int idx); -LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); -LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); +LUA_API void (lua_gettable) (lua_State *L, int idx); +LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawget) (lua_State *L, int idx); +LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n); +LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz); -LUA_API int (lua_getmetatable) (lua_State *L, int objindex); -LUA_API void (lua_getfenv) (lua_State *L, int idx); +LUA_API int (lua_getmetatable) (lua_State *L, int objindex); +LUA_API void (lua_getfenv) (lua_State *L, int idx); /* -** set functions (stack->Lua) +** set functions (stack -> Lua) */ -LUA_API void (lua_settable) (lua_State *L, int idx); -LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); -LUA_API void (lua_rawset) (lua_State *L, int idx); -LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); -LUA_API int (lua_setmetatable) (lua_State *L, int objindex); -LUA_API int (lua_setfenv) (lua_State *L, int idx); +LUA_API void (lua_settable) (lua_State *L, int idx); +LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, int n); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API int (lua_setfenv) (lua_State *L, int idx); /* ** `load' and `call' functions (load and run Lua code) */ -LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); -LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); -LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); -LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, - const char *chunkname); +LUA_API void (lua_call) (lua_State *L, int nargs, int nresults); +LUA_API int (lua_pcall) (lua_State *L, int nargs, int nresults, int errfunc); +LUA_API int (lua_cpcall) (lua_State *L, lua_CFunction func, void *ud); +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname); LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); @@ -210,9 +210,9 @@ LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); /* ** coroutine functions */ -LUA_API int (lua_yield) (lua_State *L, int nresults); -LUA_API int (lua_resume) (lua_State *L, int narg); -LUA_API int (lua_status) (lua_State *L); +LUA_API int (lua_yield) (lua_State *L, int nresults); +LUA_API int (lua_resume) (lua_State *L, int narg); +LUA_API int (lua_status) (lua_State *L); /* ** garbage-collection function and options @@ -234,11 +234,11 @@ LUA_API int (lua_gc) (lua_State *L, int what, int data); ** miscellaneous functions */ -LUA_API int (lua_error) (lua_State *L); +LUA_API int (lua_error) (lua_State *L); -LUA_API int (lua_next) (lua_State *L, int idx); +LUA_API int (lua_next) (lua_State *L, int idx); -LUA_API void (lua_concat) (lua_State *L, int n); +LUA_API void (lua_concat) (lua_State *L, int n); LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); @@ -294,6 +294,9 @@ LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); #define lua_Chunkwriter lua_Writer +/* hack */ +LUA_API void lua_setlevel (lua_State *from, lua_State *to); + /* ** {====================================================================== @@ -320,7 +323,7 @@ LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud); #define LUA_MASKLINE (1 << LUA_HOOKLINE) #define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) -typedef struct lua_Debug lua_Debug; /* activation record */ +typedef struct lua_Debug lua_Debug; /* activation record */ /* Functions to be called by the debuger in specific events */ @@ -341,25 +344,25 @@ LUA_API int lua_gethookcount (lua_State *L); struct lua_Debug { - int event; - const char *name; /* (n) */ - const char *namewhat; /* (n) `global', `local', `field', `method' */ - const char *what; /* (S) `Lua', `C', `main', `tail' */ - const char *source; /* (S) */ - int currentline; /* (l) */ - int nups; /* (u) number of upvalues */ - int linedefined; /* (S) */ - int lastlinedefined; /* (S) */ - char short_src[LUA_IDSIZE]; /* (S) */ - /* private part */ - int i_ci; /* active function */ + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) `global', `local', `field', `method' */ + const char *what; /* (S) `Lua', `C', `main', `tail' */ + const char *source; /* (S) */ + int currentline; /* (l) */ + int nups; /* (u) number of upvalues */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + int i_ci; /* active function */ }; /* }====================================================================== */ /****************************************************************************** -* Copyright (C) 1994-2007 Lua.org, PUC-Rio. All rights reserved. +* Copyright (C) 1994-2012 Lua.org, PUC-Rio. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the diff --git a/ext/lua-5.1.5/src/luac.c b/ext/lua-5.1.5/src/luac.c new file mode 100644 index 000000000..d07017391 --- /dev/null +++ b/ext/lua-5.1.5/src/luac.c @@ -0,0 +1,200 @@ +/* +** $Id: luac.c,v 1.54 2006/06/02 17:37:11 lhf Exp $ +** Lua compiler (saves bytecodes to files; also list bytecodes) +** See Copyright Notice in lua.h +*/ + +#include +#include +#include +#include + +#define luac_c +#define LUA_CORE + +#include "lua.h" +#include "lauxlib.h" + +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstring.h" +#include "lundump.h" + +#define PROGNAME "luac" /* default program name */ +#define OUTPUT PROGNAME ".out" /* default output file */ + +static int listing=0; /* list bytecodes? */ +static int dumping=1; /* dump bytecodes? */ +static int stripping=0; /* strip debug information? */ +static char Output[]={ OUTPUT }; /* default output file name */ +static const char* output=Output; /* actual output file name */ +static const char* progname=PROGNAME; /* actual program name */ + +static void fatal(const char* message) +{ + fprintf(stderr,"%s: %s\n",progname,message); + exit(EXIT_FAILURE); +} + +static void cannot(const char* what) +{ + fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); + exit(EXIT_FAILURE); +} + +static void usage(const char* message) +{ + if (*message=='-') + fprintf(stderr,"%s: unrecognized option " LUA_QS "\n",progname,message); + else + fprintf(stderr,"%s: %s\n",progname,message); + fprintf(stderr, + "usage: %s [options] [filenames].\n" + "Available options are:\n" + " - process stdin\n" + " -l list\n" + " -o name output to file " LUA_QL("name") " (default is \"%s\")\n" + " -p parse only\n" + " -s strip debug information\n" + " -v show version information\n" + " -- stop handling options\n", + progname,Output); + exit(EXIT_FAILURE); +} + +#define IS(s) (strcmp(argv[i],s)==0) + +static int doargs(int argc, char* argv[]) +{ + int i; + int version=0; + if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; + for (i=1; itop+(i))->l.p) + +static const Proto* combine(lua_State* L, int n) +{ + if (n==1) + return toproto(L,-1); + else + { + int i,pc; + Proto* f=luaF_newproto(L); + setptvalue2s(L,L->top,f); incr_top(L); + f->source=luaS_newliteral(L,"=(" PROGNAME ")"); + f->maxstacksize=1; + pc=2*n+1; + f->code=luaM_newvector(L,pc,Instruction); + f->sizecode=pc; + f->p=luaM_newvector(L,n,Proto*); + f->sizep=n; + pc=0; + for (i=0; ip[i]=toproto(L,i-n-1); + f->code[pc++]=CREATE_ABx(OP_CLOSURE,0,i); + f->code[pc++]=CREATE_ABC(OP_CALL,0,1,1); + } + f->code[pc++]=CREATE_ABC(OP_RETURN,0,1,0); + return f; + } +} + +static int writer(lua_State* L, const void* p, size_t size, void* u) +{ + UNUSED(L); + return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); +} + +struct Smain { + int argc; + char** argv; +}; + +static int pmain(lua_State* L) +{ + struct Smain* s = (struct Smain*)lua_touserdata(L, 1); + int argc=s->argc; + char** argv=s->argv; + const Proto* f; + int i; + if (!lua_checkstack(L,argc)) fatal("too many input files"); + for (i=0; i1); + if (dumping) + { + FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); + if (D==NULL) cannot("open"); + lua_lock(L); + luaU_dump(L,f,writer,D,stripping); + lua_unlock(L); + if (ferror(D)) cannot("write"); + if (fclose(D)) cannot("close"); + } + return 0; +} + +int main(int argc, char* argv[]) +{ + lua_State* L; + struct Smain s; + int i=doargs(argc,argv); + argc-=i; argv+=i; + if (argc<=0) usage("no input files given"); + L=lua_open(); + if (L==NULL) fatal("not enough memory for state"); + s.argc=argc; + s.argv=argv; + if (lua_cpcall(L,pmain,&s)!=0) fatal(lua_tostring(L,-1)); + lua_close(L); + return EXIT_SUCCESS; +} diff --git a/lua/luaconf.h b/ext/lua-5.1.5/src/luaconf.h similarity index 92% rename from lua/luaconf.h rename to ext/lua-5.1.5/src/luaconf.h index c86bba9e4..e2cb26163 100644 --- a/lua/luaconf.h +++ b/ext/lua-5.1.5/src/luaconf.h @@ -1,5 +1,5 @@ /* -** $Id: luaconf.h,v 1.82a 2006/04/10 18:27:23 roberto Exp $ +** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $ ** Configuration file for Lua ** See Copyright Notice in lua.h */ @@ -66,8 +66,8 @@ @* checks for initialization code. ** CHANGE them if you want different names. */ -#define LUA_PATH "LUA_PATH" -#define LUA_CPATH "LUA_CPATH" +#define LUA_PATH "LUA_PATH" +#define LUA_CPATH "LUA_CPATH" #define LUA_INIT "LUA_INIT" @@ -87,21 +87,21 @@ */ #define LUA_LDIR "!\\lua\\" #define LUA_CDIR "!\\" -#define LUA_PATH_DEFAULT \ - ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" +#define LUA_PATH_DEFAULT \ + ".\\?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua" #define LUA_CPATH_DEFAULT \ - ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" + ".\\?.dll;" LUA_CDIR"?.dll;" LUA_CDIR"loadall.dll" #else #define LUA_ROOT "/usr/local/" #define LUA_LDIR LUA_ROOT "share/lua/5.1/" #define LUA_CDIR LUA_ROOT "lib/lua/5.1/" -#define LUA_PATH_DEFAULT \ - "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ - LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" +#define LUA_PATH_DEFAULT \ + "./?.lua;" LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua" #define LUA_CPATH_DEFAULT \ - "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" + "./?.so;" LUA_CDIR"?.so;" LUA_CDIR"loadall.so" #endif @@ -183,7 +183,7 @@ #define LUAI_DATA /* empty */ #elif defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ - defined(__ELF__) + defined(__ELF__) #define LUAI_FUNC __attribute__((visibility("hidden"))) extern #define LUAI_DATA LUAI_FUNC @@ -232,7 +232,7 @@ #include #define lua_stdin_is_tty() _isatty(_fileno(stdin)) #else -#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ +#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ #endif @@ -276,13 +276,13 @@ #include #define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) #define lua_saveline(L,idx) \ - if (lua_strlen(L,idx) > 0) /* non-empty line? */ \ - add_history(lua_tostring(L, idx)); /* add it to history */ + if (lua_strlen(L,idx) > 0) /* non-empty line? */ \ + add_history(lua_tostring(L, idx)); /* add it to history */ #define lua_freeline(L,b) ((void)L, free(b)) #else #define lua_readline(L,b,p) \ - ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ - fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ + ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ + fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ #define lua_saveline(L,idx) { (void)L; (void)idx; } #define lua_freeline(L,b) { (void)L; (void)b; } #endif @@ -299,7 +299,7 @@ ** mean larger pauses which mean slower collection.) You can also change ** this value dynamically. */ -#define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ +#define LUAI_GCPAUSE 200 /* 200% (wait memory to double before next GC) */ /* @@ -376,9 +376,9 @@ */ #if defined(LUA_USE_APICHECK) #include -#define luai_apicheck(L,object) { (void)L; assert(object); } +#define luai_apicheck(L,o) { (void)L; assert(o); } #else -#define luai_apicheck(L,object) { (void)L; } +#define luai_apicheck(L,o) { (void)L; } #endif @@ -440,9 +440,10 @@ @* can use. ** CHANGE it if you need lots of (Lua) stack space for your C ** functions. This limit is arbitrary; its only purpose is to stop C -** functions to consume unlimited stack space. +** functions to consume unlimited stack space. (must be smaller than +** -LUA_REGISTRYINDEX) */ -#define LUAI_MAXCSTACK 2048 +#define LUAI_MAXCSTACK 8000 @@ -554,21 +555,21 @@ /* On a Pentium, resort to a trick */ #if defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) && !defined(__SSE2__) && \ - (defined(__i386) || defined (_M_IX86) || defined(__i386__)) + (defined(__i386) || defined (_M_IX86) || defined(__i386__)) /* On a Microsoft compiler, use assembler */ #if defined(_MSC_VER) -#define lua_number2int(i,d) __asm fld d __asm fistp i +#define lua_number2int(i,d) __asm fld d __asm fistp i #define lua_number2integer(i,n) lua_number2int(i, n) /* the next trick should work on any Pentium, but sometimes clashes - with a DirectX idiosyncrasy */ + with a DirectX idiosyncrasy */ #else union luai_Cast { double l_d; long l_l; }; #define lua_number2int(i,d) \ - { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } + { volatile union luai_Cast u; u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; } #define lua_number2integer(i,n) lua_number2int(i, n) #endif @@ -607,7 +608,7 @@ union luai_Cast { double l_d; long l_l; }; #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 */ +#define luai_jmpbuf int /* dummy variable */ #elif defined(LUA_USE_ULONGJMP) /* in Unix, try _longjmp/_setjmp (more efficient) */ @@ -637,7 +638,7 @@ union luai_Cast { double l_d; long l_l; }; @* temporary name. @@ LUA_TMPNAMBUFSIZE is the maximum size of a name created by lua_tmpnam. ** CHANGE them if you have an alternative to tmpnam (which is considered -** insecure) or if you want the original tmpnam anyway. By default, Lua +** insecure) or if you want the original tmpnam anyway. By default, Lua ** uses tmpnam except when POSIX is available, where it uses mkstemp. */ #if defined(loslib_c) || defined(luaall_c) @@ -666,7 +667,7 @@ union luai_Cast { double l_d; long l_l; }; */ #if defined(LUA_USE_POPEN) -#define lua_popen(L,c,m) ((void)L, popen(c,m)) +#define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m)) #define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) #elif defined(LUA_WIN) @@ -676,7 +677,7 @@ union luai_Cast { double l_d; long l_l; }; #else -#define lua_popen(L,c,m) ((void)((void)c, m), \ +#define lua_popen(L,c,m) ((void)((void)c, m), \ luaL_error(L, LUA_QL("popen") " not supported"), (FILE*)0) #define lua_pclose(L,file) ((void)((void)L, file), 0) @@ -688,9 +689,9 @@ union luai_Cast { double l_d; long l_l; }; ** dynamic-library system for your platform (either Windows' DLL, Mac's ** dyld, or Unix's dlopen). If your system is some kind of Unix, there ** is a good chance that it has dlopen, so LUA_DL_DLOPEN will work for -** it. To use dlopen you also need to adapt the src/Makefile (probably +** it. To use dlopen you also need to adapt the src/Makefile (probably ** adding -ldl to the linker options), so Lua does not select it -** automatically. (When you change the makefile to add -ldl, you must +** automatically. (When you change the makefile to add -ldl, you must ** also add -DLUA_USE_DLOPEN.) ** If you do not want any kind of dynamic library, undefine all these ** options. diff --git a/lua/lualib.h b/ext/lua-5.1.5/src/lualib.h similarity index 93% rename from lua/lualib.h rename to ext/lua-5.1.5/src/lualib.h index 0c76232c0..469417f67 100644 --- a/lua/lualib.h +++ b/ext/lua-5.1.5/src/lualib.h @@ -1,5 +1,5 @@ /* -** $Id: lualib.h,v 1.36 2005/12/27 17:12:00 roberto Exp $ +** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $ ** Lua standard libraries ** See Copyright Notice in lua.h */ diff --git a/ext/lua-5.1.5/src/lundump.c b/ext/lua-5.1.5/src/lundump.c new file mode 100644 index 000000000..8010a4579 --- /dev/null +++ b/ext/lua-5.1.5/src/lundump.c @@ -0,0 +1,227 @@ +/* +** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#include + +#define lundump_c +#define LUA_CORE + +#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" + +typedef struct { + lua_State* L; + ZIO* Z; + Mbuffer* b; + const char* name; +} LoadState; + +#ifdef LUAC_TRUST_BINARIES +#define IF(c,s) +#define error(S,s) +#else +#define IF(c,s) if (c) error(S,s) + +static void error(LoadState* S, const char* why) +{ + luaO_pushfstring(S->L,"%s: %s in precompiled chunk",S->name,why); + luaD_throw(S->L,LUA_ERRSYNTAX); +} +#endif + +#define LoadMem(S,b,n,size) LoadBlock(S,b,(n)*(size)) +#define LoadByte(S) (lu_byte)LoadChar(S) +#define LoadVar(S,x) LoadMem(S,&x,1,sizeof(x)) +#define LoadVector(S,b,n,size) LoadMem(S,b,n,size) + +static void LoadBlock(LoadState* S, void* b, size_t size) +{ + size_t r=luaZ_read(S->Z,b,size); + IF (r!=0, "unexpected end"); +} + +static int LoadChar(LoadState* S) +{ + char x; + LoadVar(S,x); + return x; +} + +static int LoadInt(LoadState* S) +{ + int x; + LoadVar(S,x); + IF (x<0, "bad integer"); + return x; +} + +static lua_Number LoadNumber(LoadState* S) +{ + lua_Number x; + LoadVar(S,x); + return x; +} + +static TString* LoadString(LoadState* S) +{ + size_t size; + LoadVar(S,size); + if (size==0) + return NULL; + else + { + char* s=luaZ_openspace(S->L,S->b,size); + LoadBlock(S,s,size); + return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ + } +} + +static void LoadCode(LoadState* S, Proto* f) +{ + int n=LoadInt(S); + f->code=luaM_newvector(S->L,n,Instruction); + f->sizecode=n; + LoadVector(S,f->code,n,sizeof(Instruction)); +} + +static Proto* LoadFunction(LoadState* S, TString* p); + +static void LoadConstants(LoadState* S, Proto* f) +{ + int i,n; + n=LoadInt(S); + f->k=luaM_newvector(S->L,n,TValue); + f->sizek=n; + for (i=0; ik[i]); + for (i=0; ik[i]; + int t=LoadChar(S); + switch (t) + { + case LUA_TNIL: + setnilvalue(o); + break; + case LUA_TBOOLEAN: + setbvalue(o,LoadChar(S)!=0); + break; + case LUA_TNUMBER: + setnvalue(o,LoadNumber(S)); + break; + case LUA_TSTRING: + setsvalue2n(S->L,o,LoadString(S)); + break; + default: + error(S,"bad constant"); + break; + } + } + n=LoadInt(S); + f->p=luaM_newvector(S->L,n,Proto*); + f->sizep=n; + for (i=0; ip[i]=NULL; + for (i=0; ip[i]=LoadFunction(S,f->source); +} + +static void LoadDebug(LoadState* S, Proto* f) +{ + int i,n; + n=LoadInt(S); + f->lineinfo=luaM_newvector(S->L,n,int); + f->sizelineinfo=n; + LoadVector(S,f->lineinfo,n,sizeof(int)); + n=LoadInt(S); + f->locvars=luaM_newvector(S->L,n,LocVar); + f->sizelocvars=n; + for (i=0; ilocvars[i].varname=NULL; + for (i=0; ilocvars[i].varname=LoadString(S); + f->locvars[i].startpc=LoadInt(S); + f->locvars[i].endpc=LoadInt(S); + } + n=LoadInt(S); + f->upvalues=luaM_newvector(S->L,n,TString*); + f->sizeupvalues=n; + for (i=0; iupvalues[i]=NULL; + for (i=0; iupvalues[i]=LoadString(S); +} + +static Proto* LoadFunction(LoadState* S, TString* p) +{ + Proto* f; + if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep"); + f=luaF_newproto(S->L); + setptvalue2s(S->L,S->L->top,f); incr_top(S->L); + f->source=LoadString(S); if (f->source==NULL) f->source=p; + f->linedefined=LoadInt(S); + f->lastlinedefined=LoadInt(S); + f->nups=LoadByte(S); + f->numparams=LoadByte(S); + f->is_vararg=LoadByte(S); + f->maxstacksize=LoadByte(S); + LoadCode(S,f); + LoadConstants(S,f); + LoadDebug(S,f); + IF (!luaG_checkcode(f), "bad code"); + S->L->top--; + S->L->nCcalls--; + return f; +} + +static void LoadHeader(LoadState* S) +{ + char h[LUAC_HEADERSIZE]; + char s[LUAC_HEADERSIZE]; + luaU_header(h); + LoadBlock(S,s,LUAC_HEADERSIZE); + IF (memcmp(h,s,LUAC_HEADERSIZE)!=0, "bad header"); +} + +/* +** load precompiled chunk +*/ +Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) +{ + LoadState S; + 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; + S.b=buff; + LoadHeader(&S); + return LoadFunction(&S,luaS_newliteral(L,"=?")); +} + +/* +* make header +*/ +void luaU_header (char* h) +{ + int x=1; + memcpy(h,LUA_SIGNATURE,sizeof(LUA_SIGNATURE)-1); + h+=sizeof(LUA_SIGNATURE)-1; + *h++=(char)LUAC_VERSION; + *h++=(char)LUAC_FORMAT; + *h++=(char)*(char*)&x; /* endianness */ + *h++=(char)sizeof(int); + *h++=(char)sizeof(size_t); + *h++=(char)sizeof(Instruction); + *h++=(char)sizeof(lua_Number); + *h++=(char)(((lua_Number)0.5)==0); /* is lua_Number integral? */ +} diff --git a/ext/lua-5.1.5/src/lundump.h b/ext/lua-5.1.5/src/lundump.h new file mode 100644 index 000000000..c80189dbf --- /dev/null +++ b/ext/lua-5.1.5/src/lundump.h @@ -0,0 +1,36 @@ +/* +** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#ifndef lundump_h +#define lundump_h + +#include "lobject.h" +#include "lzio.h" + +/* load one chunk; from lundump.c */ +LUAI_FUNC Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name); + +/* make header; from lundump.c */ +LUAI_FUNC void luaU_header (char* h); + +/* dump one chunk; from ldump.c */ +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip); + +#ifdef luac_c +/* print one chunk; from print.c */ +LUAI_FUNC void luaU_print (const Proto* f, int full); +#endif + +/* for header of binary files -- this is Lua 5.1 */ +#define LUAC_VERSION 0x51 + +/* for header of binary files -- this is the official format */ +#define LUAC_FORMAT 0 + +/* size of header of binary files */ +#define LUAC_HEADERSIZE 12 + +#endif diff --git a/ext/lua-5.1.5/src/lvm.c b/ext/lua-5.1.5/src/lvm.c new file mode 100644 index 000000000..e0a0cd852 --- /dev/null +++ b/ext/lua-5.1.5/src/lvm.c @@ -0,0 +1,767 @@ +/* +** $Id: lvm.c,v 2.63.1.5 2011/08/17 20:43:11 roberto Exp $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + + +#include +#include +#include + +#define lvm_c +#define LUA_CORE + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + + +/* limit for table tag-method chains (to avoid loops) */ +#define MAXTAGLOOP 100 + + +const TValue *luaV_tonumber (const TValue *obj, TValue *n) { + lua_Number num; + if (ttisnumber(obj)) return obj; + if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) { + setnvalue(n, num); + return n; + } + else + return NULL; +} + + +int luaV_tostring (lua_State *L, StkId obj) { + if (!ttisnumber(obj)) + return 0; + else { + char s[LUAI_MAXNUMBER2STR]; + lua_Number n = nvalue(obj); + lua_number2str(s, n); + setsvalue2s(L, obj, luaS_new(L, s)); + return 1; + } +} + + +static void traceexec (lua_State *L, const Instruction *pc) { + lu_byte mask = L->hookmask; + const Instruction *oldpc = L->savedpc; + L->savedpc = pc; + if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) { + resethookcount(L); + luaD_callhook(L, LUA_HOOKCOUNT, -1); + } + if (mask & LUA_MASKLINE) { + Proto *p = ci_func(L->ci)->l.p; + int npc = pcRel(pc, p); + int newline = getline(p, npc); + /* call linehook when enter a new function, when jump back (loop), + or when enter a new line */ + if (npc == 0 || pc <= oldpc || newline != getline(p, pcRel(oldpc, p))) + luaD_callhook(L, LUA_HOOKLINE, newline); + } +} + + +static void callTMres (lua_State *L, StkId res, const TValue *f, + const TValue *p1, const TValue *p2) { + ptrdiff_t result = savestack(L, res); + setobj2s(L, L->top, f); /* push function */ + setobj2s(L, L->top+1, p1); /* 1st argument */ + setobj2s(L, L->top+2, p2); /* 2nd argument */ + luaD_checkstack(L, 3); + L->top += 3; + luaD_call(L, L->top - 3, 1); + res = restorestack(L, result); + L->top--; + setobjs2s(L, res, L->top); +} + + + +static void callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3) { + setobj2s(L, L->top, f); /* push function */ + setobj2s(L, L->top+1, p1); /* 1st argument */ + setobj2s(L, L->top+2, p2); /* 2nd argument */ + setobj2s(L, L->top+3, p3); /* 3th argument */ + luaD_checkstack(L, 4); + L->top += 4; + luaD_call(L, L->top - 4, 0); +} + + +void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { + int loop; + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; + if (ttistable(t)) { /* `t' is a table? */ + Table *h = hvalue(t); + const TValue *res = luaH_get(h, key); /* do a primitive get */ + if (!ttisnil(res) || /* result is no nil? */ + (tm = fasttm(L, h->metatable, TM_INDEX)) == NULL) { /* or no TM? */ + setobj2s(L, val, res); + return; + } + /* else will try the tag method */ + } + else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) + luaG_typeerror(L, t, "index"); + if (ttisfunction(tm)) { + callTMres(L, val, tm, t, key); + return; + } + t = tm; /* else repeat with `tm' */ + } + luaG_runerror(L, "loop in gettable"); +} + + +void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { + int loop; + TValue temp; + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; + if (ttistable(t)) { /* `t' is a table? */ + Table *h = hvalue(t); + TValue *oldval = luaH_set(L, h, key); /* do a primitive set */ + if (!ttisnil(oldval) || /* result is no nil? */ + (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ + setobj2t(L, oldval, val); + h->flags = 0; + luaC_barriert(L, h, val); + return; + } + /* else will try the tag method */ + } + else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) + luaG_typeerror(L, t, "index"); + if (ttisfunction(tm)) { + callTM(L, tm, t, key, val); + return; + } + /* else repeat with `tm' */ + setobj(L, &temp, tm); /* avoid pointing inside table (may rehash) */ + t = &temp; + } + luaG_runerror(L, "loop in settable"); +} + + +static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ + if (ttisnil(tm)) + tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ + if (ttisnil(tm)) return 0; + callTMres(L, res, tm, p1, p2); + return 1; +} + + +static const TValue *get_compTM (lua_State *L, Table *mt1, Table *mt2, + TMS event) { + const TValue *tm1 = fasttm(L, mt1, event); + const TValue *tm2; + if (tm1 == NULL) return NULL; /* no metamethod */ + if (mt1 == mt2) return tm1; /* same metatables => same metamethods */ + tm2 = fasttm(L, mt2, event); + if (tm2 == NULL) return NULL; /* no metamethod */ + if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */ + return tm1; + return NULL; +} + + +static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, + TMS event) { + const TValue *tm1 = luaT_gettmbyobj(L, p1, event); + const TValue *tm2; + if (ttisnil(tm1)) return -1; /* no metamethod? */ + tm2 = luaT_gettmbyobj(L, p2, event); + if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ + return -1; + callTMres(L, L->top, tm1, p1, p2); + return !l_isfalse(L->top); +} + + +static int l_strcmp (const TString *ls, const TString *rs) { + const char *l = getstr(ls); + size_t ll = ls->tsv.len; + const char *r = getstr(rs); + size_t lr = rs->tsv.len; + for (;;) { + int temp = strcoll(l, r); + if (temp != 0) return temp; + else { /* strings are equal up to a `\0' */ + size_t len = strlen(l); /* index of first `\0' in both strings */ + if (len == lr) /* r is finished? */ + return (len == ll) ? 0 : 1; + else if (len == ll) /* l is finished? */ + return -1; /* l is smaller than r (because r is not finished) */ + /* both strings longer than `len'; go on comparing (after the `\0') */ + len++; + l += len; ll -= len; r += len; lr -= len; + } + } +} + + +int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { + int res; + if (ttype(l) != ttype(r)) + return luaG_ordererror(L, l, r); + else if (ttisnumber(l)) + return luai_numlt(nvalue(l), nvalue(r)); + else if (ttisstring(l)) + return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; + else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) + return res; + return luaG_ordererror(L, l, r); +} + + +static int lessequal (lua_State *L, const TValue *l, const TValue *r) { + int res; + if (ttype(l) != ttype(r)) + return luaG_ordererror(L, l, r); + else if (ttisnumber(l)) + return luai_numle(nvalue(l), nvalue(r)); + else if (ttisstring(l)) + return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; + else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ + return res; + else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */ + return !res; + return luaG_ordererror(L, l, r); +} + + +int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { + const TValue *tm; + lua_assert(ttype(t1) == ttype(t2)); + switch (ttype(t1)) { + case LUA_TNIL: return 1; + case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2)); + case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ + case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); + case LUA_TUSERDATA: { + if (uvalue(t1) == uvalue(t2)) return 1; + tm = get_compTM(L, uvalue(t1)->metatable, uvalue(t2)->metatable, + TM_EQ); + break; /* will try TM */ + } + case LUA_TTABLE: { + if (hvalue(t1) == hvalue(t2)) return 1; + tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + default: return gcvalue(t1) == gcvalue(t2); + } + if (tm == NULL) return 0; /* no TM? */ + callTMres(L, L->top, tm, t1, t2); /* call TM */ + return !l_isfalse(L->top); +} + + +void luaV_concat (lua_State *L, int total, int last) { + do { + StkId top = L->base + last + 1; + int n = 2; /* number of elements handled in this pass (at least 2) */ + if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) { + if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) + luaG_concaterror(L, top-2, top-1); + } else if (tsvalue(top-1)->len == 0) /* second op is empty? */ + (void)tostring(L, top - 2); /* result is first op (as string) */ + else { + /* at least two string values; get as many as possible */ + size_t tl = tsvalue(top-1)->len; + char *buffer; + int i; + /* collect total length */ + for (n = 1; n < total && tostring(L, top-n-1); n++) { + size_t l = tsvalue(top-n-1)->len; + if (l >= MAX_SIZET - tl) luaG_runerror(L, "string length overflow"); + tl += l; + } + buffer = luaZ_openspace(L, &G(L)->buff, tl); + tl = 0; + for (i=n; i>0; i--) { /* concat all strings */ + size_t l = tsvalue(top-i)->len; + memcpy(buffer+tl, svalue(top-i), l); + tl += l; + } + setsvalue2s(L, top-n, luaS_newlstr(L, buffer, tl)); + } + total -= n-1; /* got `n' strings to create 1 new */ + last -= n-1; + } while (total > 1); /* repeat until only 1 result left */ +} + + +static void Arith (lua_State *L, StkId ra, const TValue *rb, + const TValue *rc, TMS op) { + TValue tempb, tempc; + const TValue *b, *c; + if ((b = luaV_tonumber(rb, &tempb)) != NULL && + (c = luaV_tonumber(rc, &tempc)) != NULL) { + lua_Number nb = nvalue(b), nc = nvalue(c); + switch (op) { + case TM_ADD: setnvalue(ra, luai_numadd(nb, nc)); break; + case TM_SUB: setnvalue(ra, luai_numsub(nb, nc)); break; + case TM_MUL: setnvalue(ra, luai_nummul(nb, nc)); break; + case TM_DIV: setnvalue(ra, luai_numdiv(nb, nc)); break; + case TM_MOD: setnvalue(ra, luai_nummod(nb, nc)); break; + case TM_POW: setnvalue(ra, luai_numpow(nb, nc)); break; + case TM_UNM: setnvalue(ra, luai_numunm(nb)); break; + default: lua_assert(0); break; + } + } + else if (!call_binTM(L, rb, rc, ra, op)) + luaG_aritherror(L, rb, rc); +} + + + +/* +** some macros for common tasks in `luaV_execute' +*/ + +#define runtime_check(L, c) { if (!(c)) break; } + +#define RA(i) (base+GETARG_A(i)) +/* to be used after possible stack reallocation */ +#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) +#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) +#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ + ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) +#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ + ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) +#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i)) + + +#define dojump(L,pc,i) {(pc) += (i); luai_threadyield(L);} + + +#define Protect(x) { L->savedpc = pc; {x;}; base = L->base; } + + +#define arith_op(op,tm) { \ + TValue *rb = RKB(i); \ + TValue *rc = RKC(i); \ + if (ttisnumber(rb) && ttisnumber(rc)) { \ + lua_Number nb = nvalue(rb), nc = nvalue(rc); \ + setnvalue(ra, op(nb, nc)); \ + } \ + else \ + Protect(Arith(L, ra, rb, rc, tm)); \ + } + + + +void luaV_execute (lua_State *L, int nexeccalls) { + LClosure *cl; + StkId base; + TValue *k; + const Instruction *pc; + reentry: /* entry point */ + lua_assert(isLua(L->ci)); + pc = L->savedpc; + cl = &clvalue(L->ci->func)->l; + base = L->base; + k = cl->p->k; + /* main loop of interpreter */ + for (;;) { + const Instruction i = *pc++; + StkId ra; + if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && + (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { + traceexec(L, pc); + if (L->status == LUA_YIELD) { /* did hook yield? */ + L->savedpc = pc - 1; + return; + } + base = L->base; + } + /* warning!! several calls may realloc the stack and invalidate `ra' */ + ra = RA(i); + lua_assert(base == L->base && L->base == L->ci->base); + lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); + lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); + switch (GET_OPCODE(i)) { + case OP_MOVE: { + setobjs2s(L, ra, RB(i)); + continue; + } + case OP_LOADK: { + setobj2s(L, ra, KBx(i)); + continue; + } + case OP_LOADBOOL: { + setbvalue(ra, GETARG_B(i)); + if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ + continue; + } + case OP_LOADNIL: { + TValue *rb = RB(i); + do { + setnilvalue(rb--); + } while (rb >= ra); + continue; + } + case OP_GETUPVAL: { + int b = GETARG_B(i); + setobj2s(L, ra, cl->upvals[b]->v); + continue; + } + case OP_GETGLOBAL: { + TValue g; + TValue *rb = KBx(i); + sethvalue(L, &g, cl->env); + lua_assert(ttisstring(rb)); + Protect(luaV_gettable(L, &g, rb, ra)); + continue; + } + case OP_GETTABLE: { + Protect(luaV_gettable(L, RB(i), RKC(i), ra)); + continue; + } + case OP_SETGLOBAL: { + TValue g; + sethvalue(L, &g, cl->env); + lua_assert(ttisstring(KBx(i))); + Protect(luaV_settable(L, &g, KBx(i), ra)); + continue; + } + case OP_SETUPVAL: { + UpVal *uv = cl->upvals[GETARG_B(i)]; + setobj(L, uv->v, ra); + luaC_barrier(L, uv, ra); + continue; + } + case OP_SETTABLE: { + Protect(luaV_settable(L, ra, RKB(i), RKC(i))); + continue; + } + case OP_NEWTABLE: { + int b = GETARG_B(i); + int c = GETARG_C(i); + sethvalue(L, ra, luaH_new(L, luaO_fb2int(b), luaO_fb2int(c))); + Protect(luaC_checkGC(L)); + continue; + } + case OP_SELF: { + StkId rb = RB(i); + setobjs2s(L, ra+1, rb); + Protect(luaV_gettable(L, rb, RKC(i), ra)); + continue; + } + case OP_ADD: { + arith_op(luai_numadd, TM_ADD); + continue; + } + case OP_SUB: { + arith_op(luai_numsub, TM_SUB); + continue; + } + case OP_MUL: { + arith_op(luai_nummul, TM_MUL); + continue; + } + case OP_DIV: { + arith_op(luai_numdiv, TM_DIV); + continue; + } + case OP_MOD: { + arith_op(luai_nummod, TM_MOD); + continue; + } + case OP_POW: { + arith_op(luai_numpow, TM_POW); + continue; + } + case OP_UNM: { + TValue *rb = RB(i); + if (ttisnumber(rb)) { + lua_Number nb = nvalue(rb); + setnvalue(ra, luai_numunm(nb)); + } + else { + Protect(Arith(L, ra, rb, rb, TM_UNM)); + } + continue; + } + case OP_NOT: { + int res = l_isfalse(RB(i)); /* next assignment may change this value */ + setbvalue(ra, res); + continue; + } + case OP_LEN: { + const TValue *rb = RB(i); + switch (ttype(rb)) { + case LUA_TTABLE: { + setnvalue(ra, cast_num(luaH_getn(hvalue(rb)))); + break; + } + case LUA_TSTRING: { + setnvalue(ra, cast_num(tsvalue(rb)->len)); + break; + } + default: { /* try metamethod */ + Protect( + if (!call_binTM(L, rb, luaO_nilobject, ra, TM_LEN)) + luaG_typeerror(L, rb, "get length of"); + ) + } + } + continue; + } + case OP_CONCAT: { + int b = GETARG_B(i); + int c = GETARG_C(i); + Protect(luaV_concat(L, c-b+1, c); luaC_checkGC(L)); + setobjs2s(L, RA(i), base+b); + continue; + } + case OP_JMP: { + dojump(L, pc, GETARG_sBx(i)); + continue; + } + case OP_EQ: { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + Protect( + if (equalobj(L, rb, rc) == GETARG_A(i)) + dojump(L, pc, GETARG_sBx(*pc)); + ) + pc++; + continue; + } + case OP_LT: { + Protect( + if (luaV_lessthan(L, RKB(i), RKC(i)) == GETARG_A(i)) + dojump(L, pc, GETARG_sBx(*pc)); + ) + pc++; + continue; + } + case OP_LE: { + Protect( + if (lessequal(L, RKB(i), RKC(i)) == GETARG_A(i)) + dojump(L, pc, GETARG_sBx(*pc)); + ) + pc++; + continue; + } + case OP_TEST: { + if (l_isfalse(ra) != GETARG_C(i)) + dojump(L, pc, GETARG_sBx(*pc)); + pc++; + continue; + } + case OP_TESTSET: { + TValue *rb = RB(i); + if (l_isfalse(rb) != GETARG_C(i)) { + setobjs2s(L, ra, rb); + dojump(L, pc, GETARG_sBx(*pc)); + } + pc++; + continue; + } + case OP_CALL: { + int b = GETARG_B(i); + int nresults = GETARG_C(i) - 1; + if (b != 0) L->top = ra+b; /* else previous instruction set top */ + L->savedpc = pc; + switch (luaD_precall(L, ra, nresults)) { + case PCRLUA: { + nexeccalls++; + goto reentry; /* restart luaV_execute over new Lua function */ + } + case PCRC: { + /* it was a C function (`precall' called it); adjust results */ + if (nresults >= 0) L->top = L->ci->top; + base = L->base; + continue; + } + default: { + return; /* yield */ + } + } + } + case OP_TAILCALL: { + int b = GETARG_B(i); + if (b != 0) L->top = ra+b; /* else previous instruction set top */ + L->savedpc = pc; + lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); + switch (luaD_precall(L, ra, LUA_MULTRET)) { + case PCRLUA: { + /* tail call: put new frame in place of previous one */ + CallInfo *ci = L->ci - 1; /* previous frame */ + int aux; + StkId func = ci->func; + StkId pfunc = (ci+1)->func; /* previous function index */ + if (L->openupval) luaF_close(L, ci->base); + L->base = ci->base = ci->func + ((ci+1)->base - pfunc); + for (aux = 0; pfunc+aux < L->top; aux++) /* move frame down */ + setobjs2s(L, func+aux, pfunc+aux); + ci->top = L->top = func+aux; /* correct top */ + lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); + ci->savedpc = L->savedpc; + ci->tailcalls++; /* one more call lost */ + L->ci--; /* remove new frame */ + goto reentry; + } + case PCRC: { /* it was a C function (`precall' called it) */ + base = L->base; + continue; + } + default: { + return; /* yield */ + } + } + } + case OP_RETURN: { + int b = GETARG_B(i); + if (b != 0) L->top = ra+b-1; + if (L->openupval) luaF_close(L, base); + L->savedpc = pc; + b = luaD_poscall(L, ra); + if (--nexeccalls == 0) /* was previous function running `here'? */ + return; /* no: return */ + else { /* yes: continue its execution */ + if (b) L->top = L->ci->top; + lua_assert(isLua(L->ci)); + lua_assert(GET_OPCODE(*((L->ci)->savedpc - 1)) == OP_CALL); + goto reentry; + } + } + case OP_FORLOOP: { + lua_Number step = nvalue(ra+2); + lua_Number idx = luai_numadd(nvalue(ra), step); /* increment index */ + lua_Number limit = nvalue(ra+1); + if (luai_numlt(0, step) ? luai_numle(idx, limit) + : luai_numle(limit, idx)) { + dojump(L, pc, GETARG_sBx(i)); /* jump back */ + setnvalue(ra, idx); /* update internal index... */ + setnvalue(ra+3, idx); /* ...and external index */ + } + continue; + } + case OP_FORPREP: { + const TValue *init = ra; + const TValue *plimit = ra+1; + const TValue *pstep = ra+2; + L->savedpc = pc; /* next steps may throw errors */ + if (!tonumber(init, ra)) + luaG_runerror(L, LUA_QL("for") " initial value must be a number"); + else if (!tonumber(plimit, ra+1)) + luaG_runerror(L, LUA_QL("for") " limit must be a number"); + else if (!tonumber(pstep, ra+2)) + luaG_runerror(L, LUA_QL("for") " step must be a number"); + setnvalue(ra, luai_numsub(nvalue(ra), nvalue(pstep))); + dojump(L, pc, GETARG_sBx(i)); + continue; + } + case OP_TFORLOOP: { + StkId cb = ra + 3; /* call base */ + setobjs2s(L, cb+2, ra+2); + setobjs2s(L, cb+1, ra+1); + setobjs2s(L, cb, ra); + L->top = cb+3; /* func. + 2 args (state and index) */ + Protect(luaD_call(L, cb, GETARG_C(i))); + L->top = L->ci->top; + cb = RA(i) + 3; /* previous call may change the stack */ + if (!ttisnil(cb)) { /* continue loop? */ + setobjs2s(L, cb-1, cb); /* save control variable */ + dojump(L, pc, GETARG_sBx(*pc)); /* jump back */ + } + pc++; + continue; + } + case OP_SETLIST: { + int n = GETARG_B(i); + int c = GETARG_C(i); + int last; + Table *h; + if (n == 0) { + n = cast_int(L->top - ra) - 1; + L->top = L->ci->top; + } + if (c == 0) c = cast_int(*pc++); + runtime_check(L, ttistable(ra)); + h = hvalue(ra); + last = ((c-1)*LFIELDS_PER_FLUSH) + n; + if (last > h->sizearray) /* needs more space? */ + luaH_resizearray(L, h, last); /* pre-alloc it at once */ + for (; n > 0; n--) { + TValue *val = ra+n; + setobj2t(L, luaH_setnum(L, h, last--), val); + luaC_barriert(L, h, val); + } + continue; + } + case OP_CLOSE: { + luaF_close(L, ra); + continue; + } + case OP_CLOSURE: { + Proto *p; + Closure *ncl; + int nup, j; + p = cl->p->p[GETARG_Bx(i)]; + nup = p->nups; + ncl = luaF_newLclosure(L, nup, cl->env); + ncl->l.p = p; + for (j=0; jl.upvals[j] = cl->upvals[GETARG_B(*pc)]; + else { + lua_assert(GET_OPCODE(*pc) == OP_MOVE); + ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc)); + } + } + setclvalue(L, ra, ncl); + Protect(luaC_checkGC(L)); + continue; + } + case OP_VARARG: { + int b = GETARG_B(i) - 1; + int j; + CallInfo *ci = L->ci; + int n = cast_int(ci->base - ci->func) - cl->p->numparams - 1; + if (b == LUA_MULTRET) { + Protect(luaD_checkstack(L, n)); + ra = RA(i); /* previous call may change the stack */ + b = n; + L->top = ra + n; + } + for (j = 0; j < b; j++) { + if (j < n) { + setobjs2s(L, ra + j, ci->base - n + j); + } + else { + setnilvalue(ra + j); + } + } + continue; + } + } + } +} + diff --git a/ext/lua-5.1.5/src/lvm.h b/ext/lua-5.1.5/src/lvm.h new file mode 100644 index 000000000..bfe4f5678 --- /dev/null +++ b/ext/lua-5.1.5/src/lvm.h @@ -0,0 +1,36 @@ +/* +** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lvm_h +#define lvm_h + + +#include "ldo.h" +#include "lobject.h" +#include "ltm.h" + + +#define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o))) + +#define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \ + (((o) = luaV_tonumber(o,n)) != NULL)) + +#define equalobj(L,o1,o2) \ + (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) + + +LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2); +LUAI_FUNC const TValue *luaV_tonumber (const TValue *obj, TValue *n); +LUAI_FUNC int luaV_tostring (lua_State *L, StkId obj); +LUAI_FUNC void luaV_gettable (lua_State *L, const TValue *t, TValue *key, + StkId val); +LUAI_FUNC void luaV_settable (lua_State *L, const TValue *t, TValue *key, + StkId val); +LUAI_FUNC void luaV_execute (lua_State *L, int nexeccalls); +LUAI_FUNC void luaV_concat (lua_State *L, int total, int last); + +#endif diff --git a/ext/lua-5.1.5/src/lzio.c b/ext/lua-5.1.5/src/lzio.c new file mode 100644 index 000000000..293edd59b --- /dev/null +++ b/ext/lua-5.1.5/src/lzio.c @@ -0,0 +1,82 @@ +/* +** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $ +** a generic input stream interface +** See Copyright Notice in lua.h +*/ + + +#include + +#define lzio_c +#define LUA_CORE + +#include "lua.h" + +#include "llimits.h" +#include "lmem.h" +#include "lstate.h" +#include "lzio.h" + + +int luaZ_fill (ZIO *z) { + size_t size; + lua_State *L = z->L; + const char *buff; + lua_unlock(L); + buff = z->reader(L, z->data, &size); + lua_lock(L); + if (buff == NULL || size == 0) return EOZ; + z->n = size - 1; + z->p = buff; + return char2int(*(z->p++)); +} + + +int luaZ_lookahead (ZIO *z) { + if (z->n == 0) { + if (luaZ_fill(z) == EOZ) + return EOZ; + else { + z->n++; /* luaZ_fill removed first byte; put back it */ + z->p--; + } + } + return char2int(*z->p); +} + + +void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { + z->L = L; + z->reader = reader; + z->data = data; + z->n = 0; + z->p = NULL; +} + + +/* --------------------------------------------------------------- read --- */ +size_t luaZ_read (ZIO *z, void *b, size_t n) { + while (n) { + size_t m; + if (luaZ_lookahead(z) == EOZ) + return n; /* 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; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} + +/* ------------------------------------------------------------------------ */ +char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) { + if (n > buff->buffsize) { + if (n < LUA_MINBUFFER) n = LUA_MINBUFFER; + luaZ_resizebuffer(L, buff, n); + } + return buff->buffer; +} + + diff --git a/ext/lua-5.1.5/src/lzio.h b/ext/lua-5.1.5/src/lzio.h new file mode 100644 index 000000000..51d695d8c --- /dev/null +++ b/ext/lua-5.1.5/src/lzio.h @@ -0,0 +1,67 @@ +/* +** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + + +#ifndef lzio_h +#define lzio_h + +#include "lua.h" + +#include "lmem.h" + + +#define EOZ (-1) /* end of stream */ + +typedef struct Zio ZIO; + +#define char2int(c) cast(int, cast(unsigned char, (c))) + +#define zgetc(z) (((z)->n--)>0 ? char2int(*(z)->p++) : luaZ_fill(z)) + +typedef struct Mbuffer { + char *buffer; + size_t n; + size_t buffsize; +} Mbuffer; + +#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) + +#define luaZ_buffer(buff) ((buff)->buffer) +#define luaZ_sizebuffer(buff) ((buff)->buffsize) +#define luaZ_bufflen(buff) ((buff)->n) + +#define luaZ_resetbuffer(buff) ((buff)->n = 0) + + +#define luaZ_resizebuffer(L, buff, size) \ + (luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \ + (buff)->buffsize = size) + +#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) + + +LUAI_FUNC char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n); +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 int luaZ_lookahead (ZIO *z); + + + +/* --------- Private Part ------------------ */ + +struct Zio { + size_t n; /* bytes still unread */ + const char *p; /* current position in buffer */ + lua_Reader reader; + void* data; /* additional data */ + lua_State *L; /* Lua state (for reader) */ +}; + + +LUAI_FUNC int luaZ_fill (ZIO *z); + +#endif diff --git a/ext/lua-5.1.5/src/print.c b/ext/lua-5.1.5/src/print.c new file mode 100644 index 000000000..e240cfc3c --- /dev/null +++ b/ext/lua-5.1.5/src/print.c @@ -0,0 +1,227 @@ +/* +** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $ +** print bytecodes +** See Copyright Notice in lua.h +*/ + +#include +#include + +#define luac_c +#define LUA_CORE + +#include "ldebug.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lundump.h" + +#define PrintFunction luaU_print + +#define Sizeof(x) ((int)sizeof(x)) +#define VOID(p) ((const void*)(p)) + +static void PrintString(const TString* ts) +{ + const char* s=getstr(ts); + size_t i,n=ts->tsv.len; + putchar('"'); + for (i=0; ik[i]; + switch (ttype(o)) + { + case LUA_TNIL: + printf("nil"); + break; + case LUA_TBOOLEAN: + printf(bvalue(o) ? "true" : "false"); + break; + case LUA_TNUMBER: + printf(LUA_NUMBER_FMT,nvalue(o)); + break; + case LUA_TSTRING: + PrintString(rawtsvalue(o)); + break; + default: /* cannot happen */ + printf("? type=%d",ttype(o)); + break; + } +} + +static void PrintCode(const Proto* f) +{ + const Instruction* code=f->code; + int pc,n=f->sizecode; + for (pc=0; pc0) printf("[%d]\t",line); else printf("[-]\t"); + printf("%-9s\t",luaP_opnames[o]); + switch (getOpMode(o)) + { + case iABC: + printf("%d",a); + if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b); + if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c); + break; + case iABx: + if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx); + break; + case iAsBx: + if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx); + break; + } + switch (o) + { + case OP_LOADK: + printf("\t; "); PrintConstant(f,bx); + break; + case OP_GETUPVAL: + case OP_SETUPVAL: + printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-"); + break; + case OP_GETGLOBAL: + case OP_SETGLOBAL: + printf("\t; %s",svalue(&f->k[bx])); + break; + case OP_GETTABLE: + case OP_SELF: + if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } + break; + case OP_SETTABLE: + case OP_ADD: + case OP_SUB: + case OP_MUL: + case OP_DIV: + case OP_POW: + case OP_EQ: + case OP_LT: + case OP_LE: + if (ISK(b) || ISK(c)) + { + printf("\t; "); + if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); + printf(" "); + if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); + } + break; + case OP_JMP: + case OP_FORLOOP: + case OP_FORPREP: + printf("\t; to %d",sbx+pc+2); + break; + case OP_CLOSURE: + printf("\t; %p",VOID(f->p[bx])); + break; + case OP_SETLIST: + if (c==0) printf("\t; %d",(int)code[++pc]); + else printf("\t; %d",c); + break; + default: + break; + } + printf("\n"); + } +} + +#define SS(x) (x==1)?"":"s" +#define S(x) x,SS(x) + +static void PrintHeader(const Proto* f) +{ + const char* s=getstr(f->source); + if (*s=='@' || *s=='=') + s++; + else if (*s==LUA_SIGNATURE[0]) + s="(bstring)"; + else + s="(string)"; + printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n", + (f->linedefined==0)?"main":"function",s, + f->linedefined,f->lastlinedefined, + S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f)); + printf("%d%s param%s, %d slot%s, %d upvalue%s, ", + f->numparams,f->is_vararg?"+":"",SS(f->numparams), + S(f->maxstacksize),S(f->nups)); + printf("%d local%s, %d constant%s, %d function%s\n", + S(f->sizelocvars),S(f->sizek),S(f->sizep)); +} + +static void PrintConstants(const Proto* f) +{ + int i,n=f->sizek; + printf("constants (%d) for %p:\n",n,VOID(f)); + for (i=0; isizelocvars; + printf("locals (%d) for %p:\n",n,VOID(f)); + for (i=0; ilocvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); + } +} + +static void PrintUpvalues(const Proto* f) +{ + int i,n=f->sizeupvalues; + printf("upvalues (%d) for %p:\n",n,VOID(f)); + if (f->upvalues==NULL) return; + for (i=0; iupvalues[i])); + } +} + +void PrintFunction(const Proto* f, int full) +{ + int i,n=f->sizep; + PrintHeader(f); + PrintCode(f); + if (full) + { + PrintConstants(f); + PrintLocals(f); + PrintUpvalues(f); + } + for (i=0; ip[i],full); +} diff --git a/ext/lua-5.1.5/test/README b/ext/lua-5.1.5/test/README new file mode 100644 index 000000000..0c7f38bc2 --- /dev/null +++ b/ext/lua-5.1.5/test/README @@ -0,0 +1,26 @@ +These are simple tests for Lua. Some of them contain useful code. +They are meant to be run to make sure Lua is built correctly and also +to be read, to see how Lua programs look. + +Here is a one-line summary of each program: + + bisect.lua bisection method for solving non-linear equations + cf.lua temperature conversion table (celsius to farenheit) + echo.lua echo command line arguments + env.lua environment variables as automatic global variables + factorial.lua factorial without recursion + fib.lua fibonacci function with cache + fibfor.lua fibonacci numbers with coroutines and generators + globals.lua report global variable usage + hello.lua the first program in every language + life.lua Conway's Game of Life + luac.lua bare-bones luac + printf.lua an implementation of printf + readonly.lua make global variables readonly + sieve.lua the sieve of of Eratosthenes programmed with coroutines + sort.lua two implementations of a sort function + table.lua make table, grouping all data for the same item + trace-calls.lua trace calls + trace-globals.lua trace assigments to global variables + xd.lua hex dump + diff --git a/ext/lua-5.1.5/test/bisect.lua b/ext/lua-5.1.5/test/bisect.lua new file mode 100644 index 000000000..f91e69bfb --- /dev/null +++ b/ext/lua-5.1.5/test/bisect.lua @@ -0,0 +1,27 @@ +-- bisection method for solving non-linear equations + +delta=1e-6 -- tolerance + +function bisect(f,a,b,fa,fb) + local c=(a+b)/2 + io.write(n," c=",c," a=",a," b=",b,"\n") + if c==a or c==b or math.abs(a-b) posted to lua-l +-- modified to use ANSI terminal escape sequences +-- modified to use for instead of while + +local write=io.write + +ALIVE="¥" DEAD="þ" +ALIVE="O" DEAD="-" + +function delay() -- NOTE: SYSTEM-DEPENDENT, adjust as necessary + for i=1,10000 do end + -- local i=os.clock()+1 while(os.clock() 0 do + local xm1,x,xp1,xi=self.w-1,self.w,1,self.w + while xi > 0 do + local sum = self[ym1][xm1] + self[ym1][x] + self[ym1][xp1] + + self[y][xm1] + self[y][xp1] + + self[yp1][xm1] + self[yp1][x] + self[yp1][xp1] + next[y][x] = ((sum==2) and self[y][x]) or ((sum==3) and 1) or 0 + xm1,x,xp1,xi = x,xp1,xp1+1,xi-1 + end + ym1,y,yp1,yi = y,yp1,yp1+1,yi-1 + end +end + +-- output the array to screen +function _CELLS:draw() + local out="" -- accumulate to reduce flicker + for y=1,self.h do + for x=1,self.w do + out=out..(((self[y][x]>0) and ALIVE) or DEAD) + end + out=out.."\n" + end + write(out) +end + +-- constructor +function CELLS(w,h) + local c = ARRAY2D(w,h) + c.spawn = _CELLS.spawn + c.evolve = _CELLS.evolve + c.draw = _CELLS.draw + return c +end + +-- +-- shapes suitable for use with spawn() above +-- +HEART = { 1,0,1,1,0,1,1,1,1; w=3,h=3 } +GLIDER = { 0,0,1,1,0,1,0,1,1; w=3,h=3 } +EXPLODE = { 0,1,0,1,1,1,1,0,1,0,1,0; w=3,h=4 } +FISH = { 0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,0,0,1,0; w=5,h=4 } +BUTTERFLY = { 1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,0,1,1,0,0,0,1; w=5,h=5 } + +-- the main routine +function LIFE(w,h) + -- create two arrays + local thisgen = CELLS(w,h) + local nextgen = CELLS(w,h) + + -- create some life + -- about 1000 generations of fun, then a glider steady-state + thisgen:spawn(GLIDER,5,4) + thisgen:spawn(EXPLODE,25,10) + thisgen:spawn(FISH,4,12) + + -- run until break + local gen=1 + write("\027[2J") -- ANSI clear screen + while 1 do + thisgen:evolve(nextgen) + thisgen,nextgen = nextgen,thisgen + write("\027[H") -- ANSI home cursor + thisgen:draw() + write("Life - generation ",gen,"\n") + gen=gen+1 + if gen>2000 then break end + --delay() -- no delay + end +end + +LIFE(40,20) diff --git a/ext/lua-5.1.5/test/luac.lua b/ext/lua-5.1.5/test/luac.lua new file mode 100644 index 000000000..96a0a97ce --- /dev/null +++ b/ext/lua-5.1.5/test/luac.lua @@ -0,0 +1,7 @@ +-- bare-bones luac in Lua +-- usage: lua luac.lua file.lua + +assert(arg[1]~=nil and arg[2]==nil,"usage: lua luac.lua file.lua") +f=assert(io.open("luac.out","wb")) +assert(f:write(string.dump(assert(loadfile(arg[1]))))) +assert(f:close()) diff --git a/ext/lua-5.1.5/test/printf.lua b/ext/lua-5.1.5/test/printf.lua new file mode 100644 index 000000000..58c63ff51 --- /dev/null +++ b/ext/lua-5.1.5/test/printf.lua @@ -0,0 +1,7 @@ +-- an implementation of printf + +function printf(...) + io.write(string.format(...)) +end + +printf("Hello %s from %s on %s\n",os.getenv"USER" or "there",_VERSION,os.date()) diff --git a/ext/lua-5.1.5/test/readonly.lua b/ext/lua-5.1.5/test/readonly.lua new file mode 100644 index 000000000..85c0b4e01 --- /dev/null +++ b/ext/lua-5.1.5/test/readonly.lua @@ -0,0 +1,12 @@ +-- make global variables readonly + +local f=function (t,i) error("cannot redefine global variable `"..i.."'",2) end +local g={} +local G=getfenv() +setmetatable(g,{__index=G,__newindex=f}) +setfenv(1,g) + +-- an example +rawset(g,"x",3) +x=2 +y=1 -- cannot redefine `y' diff --git a/ext/lua-5.1.5/test/sieve.lua b/ext/lua-5.1.5/test/sieve.lua new file mode 100644 index 000000000..0871bb212 --- /dev/null +++ b/ext/lua-5.1.5/test/sieve.lua @@ -0,0 +1,29 @@ +-- the sieve of of Eratosthenes programmed with coroutines +-- typical usage: lua -e N=1000 sieve.lua | column + +-- generate all the numbers from 2 to n +function gen (n) + return coroutine.wrap(function () + for i=2,n do coroutine.yield(i) end + end) +end + +-- filter the numbers generated by `g', removing multiples of `p' +function filter (p, g) + return coroutine.wrap(function () + while 1 do + local n = g() + if n == nil then return end + if math.mod(n, p) ~= 0 then coroutine.yield(n) end + end + end) +end + +N=N or 1000 -- from command line +x = gen(N) -- generate primes up to N +while 1 do + local n = x() -- pick a number until done + if n == nil then break end + print(n) -- must be a prime number + x = filter(n, x) -- now remove its multiples +end diff --git a/ext/lua-5.1.5/test/sort.lua b/ext/lua-5.1.5/test/sort.lua new file mode 100644 index 000000000..0bcb15f83 --- /dev/null +++ b/ext/lua-5.1.5/test/sort.lua @@ -0,0 +1,66 @@ +-- two implementations of a sort function +-- this is an example only. Lua has now a built-in function "sort" + +-- extracted from Programming Pearls, page 110 +function qsort(x,l,u,f) + if ly end) + show("after reverse selection sort",x) + qsort(x,1,n,function (x,y) return x>> ",string.rep(" ",level)) + if t~=nil and t.currentline>=0 then io.write(t.short_src,":",t.currentline," ") end + t=debug.getinfo(2) + if event=="call" then + level=level+1 + else + level=level-1 if level<0 then level=0 end + end + if t.what=="main" then + if event=="call" then + io.write("begin ",t.short_src) + else + io.write("end ",t.short_src) + end + elseif t.what=="Lua" then +-- table.foreach(t,print) + io.write(event," ",t.name or "(Lua)"," <",t.linedefined,":",t.short_src,">") + else + io.write(event," ",t.name or "(C)"," [",t.what,"] ") + end + io.write("\n") +end + +debug.sethook(hook,"cr") +level=0 diff --git a/ext/lua-5.1.5/test/trace-globals.lua b/ext/lua-5.1.5/test/trace-globals.lua new file mode 100644 index 000000000..295e670ca --- /dev/null +++ b/ext/lua-5.1.5/test/trace-globals.lua @@ -0,0 +1,38 @@ +-- trace assigments to global variables + +do + -- a tostring that quotes strings. note the use of the original tostring. + local _tostring=tostring + local tostring=function(a) + if type(a)=="string" then + return string.format("%q",a) + else + return _tostring(a) + end + end + + local log=function (name,old,new) + local t=debug.getinfo(3,"Sl") + local line=t.currentline + io.write(t.short_src) + if line>=0 then io.write(":",line) end + io.write(": ",name," is now ",tostring(new)," (was ",tostring(old),")","\n") + end + + local g={} + local set=function (t,name,value) + log(name,g[name],value) + g[name]=value + end + setmetatable(getfenv(),{__index=g,__newindex=set}) +end + +-- an example + +a=1 +b=2 +a=10 +b=20 +b=nil +b=200 +print(a,b,c) diff --git a/ext/lua-5.1.5/test/xd.lua b/ext/lua-5.1.5/test/xd.lua new file mode 100644 index 000000000..ebc3effc0 --- /dev/null +++ b/ext/lua-5.1.5/test/xd.lua @@ -0,0 +1,14 @@ +-- hex dump +-- usage: lua xd.lua < file + +local offset=0 +while true do + local s=io.read(16) + if s==nil then return end + io.write(string.format("%08X ",offset)) + string.gsub(s,"(.)", + function (c) io.write(string.format("%02X ",string.byte(c))) end) + io.write(string.rep(" ",3*(16-string.len(s)))) + io.write(" ",string.gsub(s,"%c","."),"\n") + offset=offset+16 +end diff --git a/lua/CMakeLists.txt b/lua/CMakeLists.txt index 9e8f21b6c..458de9967 100644 --- a/lua/CMakeLists.txt +++ b/lua/CMakeLists.txt @@ -10,3 +10,4 @@ add_library(Lua "lwstring.cpp" ) target_include_directories(Lua PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_libraries(Lua PUBLIC lua51) diff --git a/lua51.lib b/lua51.lib deleted file mode 100644 index 94eb9343e5333f06a03407f746e5e550f4353242..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456476 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

(>TPVODDfOfp`B&=+z+p?|?HxPgd9uq@#B} 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 diff --git a/lua51.vc9.lib b/lua51.vc9.lib deleted file mode 100644 index 6a84909e4cb862cf55636db695a5069323a9c37e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 482002 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%0DahQ%BY3(F%l zWmVDgDx87=qhspX`o2|N;YE3i7Olo9Bwg#m;i7PnwuoHu{wwt(lPe6Px%#m^6$k3{ zcWoNzHBV=mTV7jMTV35C4o<-tH|BXP0*hl@y4G~bqkB@F#xt+H28Rws<Qd$WnUjm$KiM$iEalL=Gk}%O_$}ZuAOI;^!N9vsKoksq7dxU z88xt=yaWe6MaxRU^f)RNqpWOZf%&`kHC?gw zU9pZ>$4b1P*WbJDI**}Q)`PrtPduJWXD3kb@C(~oV+7M)iJ$D zm2p~6L%1&5*oYI6a9WczQp7`A78OFqqQZ_vg{dQ~gbu7iBxMXyCP&2?eXSJ{OqDkD z30Y>yb>V15q_QkpQW=(3gH&KRE=Ji6a;OOsHcA0T#u-2HWVPdo@vCECt1=2Blo;#l zG>+ObA~C<5RjstP06WP$FZRS6KErgN(rZy^w7#Ui zuC81b51!B@&W+j#LY*6>kd5JJU8E#h6~%#GEJ*??!b?75YPDGOmAQ%!^F|f3yxQ`z zXcXtxg;m30%YFmOxJsLarWU14@D0O;>WTT2$(8Tcj6zcvuBpe-I+ZB>R$d`xsLrxv zi^GVFM4*l4tWL=gSpg-Yz$hj1&@FsyIDoQ_Sg7NlKq)JUD$qO}0f+veyfnN;WfJ=f zp3=0^-d-5LW#wMI2}NtQk=yy`XK)@+b*(r+t5==J){gOc3?&sOLB(KJvmNIF8g0YC z2Bf{y_$6r(s<7-RQUbG-z3Qy5I?=qS)=nvLH9W}^&+rt7R`KjA72P^4mRS*FeH)D=N5f?m4eW#JtwWIH7oJjyO1aT+v?hYn>+0D{sI!vf zm!Gx@5#u3SX6vk)0OWt?IwQ2w@^E!yO-V^(c_b_jX_E(jncs{mVJgn5d6mC9(I)qU zBNG9wF%c{eOqr$bSf9~+8)dO794)P^F0ZS=NqM6FbfXZePX^8AOLj6UT)DhpXl^4~ z^_W>i3d<@RD{%5-g(xD63h-TAX2xfRS ze(&W3Dl zwv>!5uvDX2mShvihL6>>lXV)_VdZ1#!|JBkk|4{B(l9SlQ`t~aT8TD-n`~vsD%;SH zv0N(q%v?^o_7rfOX6`%%93jRw6eHwR;S!fP1$j)z&8L9l zMC@Nq0msSIXOnPQVf(}y5V6VsbHM#ZVL7=9r#QDM41OH*OJRNlH1+9bpZTxAr4azf zc<`Jhl#%}x_L*-+dK$F<9{bEVm-C-C&n(uOG}t9rtEpjl-zM(Umu(M@>s!~cri&Tz z-{+=5lr&L1MNlk~lLf`~z4HadVsxIM_}=p)g38AI96?ROeWIX3xN`+STAJX>tY4df z`*=ak!kug2($FziD&+^XTy~L$j=5qcKc!^_@@sc<38V!JATT?!H#SFpcdbR`=Z>(O zDGBU+H@+f_WW*m2#2*d8z{kt5WWeIe@cm*%QBsWaY+OOHck2>CF=o7&I#w9z@Hs67 z2n!79+W*{saW;<0j!Bm;q&ZikShuZJttqdaKhs!wk~>@Jix}D7&f!ntM$2Ic)}FlY zk9h+bDg9{LWy%jRl6QsTprIHQAGQtF+T7{4{_R(WA7vU4&xw(8c7c*^v>fKSwaPZ* z%b%$<{Ak)O$`3J8&Q}#DIX-OkEjiBBx`&i6Vx*jBUFEPQSbFxw6CW6UaHyQ}MU0g5 zH&;0<)z<2B)uPYMH~e7thA3giZgq;dNO6+W#d_lPn2!loVax9x_?sAKY2osl*HeW% zYq8}xc)-3~E;EZgBzX5`dnd%Y@AZUnXU_fN%%`5WR`eQF6f(4s3V*p7DTA{niL=GQ zv9DdSC2+2aW{6M|@WEJ$;g)O})u^hlGE!DvU0&4~7Hn&*C!nJFRLBA>X4RC`;-qMD zM**EH9rLQoDr@Q@)%6&SaRp=)7!9$KDGn;fvCmkBvMuY38Wg4;tqG89%#EbfmDN== zG(@Vyf;}owqs3R?`Lzudl~~hk466sD;45)bfDy~wvW93wX-O5Aki^UsnyhPQ1VpZj zu_I3Rwk;Sbb%-a9LGYaUxp{I_DDUPda=x7#3gzYI&YL$6f9K9Gk{&pUyj;8B>YVE1 zld<^%8BLdJ6!|D?iQT!3B5z~~w>dG2v=v-FVka|6Ejt@fx6#eTz+I}aETO4Rk$egK za$vGqE8rLfH+kEExmn@d-(HnS$dF! zhD#;y8xZhWV5&2PICP)x@^%4ptHQaZ_X+s_A~0)I3&aM~Eq>Plqbr=7ynliJTY;I* zaRnSZDK~kIz_crzo4h{w?*`_e!ks97M}Ya@B=X*bJU>Q1Z*v3$ccS=B!2XYExai#C zcO1{=05e^VPfl3=bYMQGaBlL>g}nQK*=xhO>F+6Ees061Dlc;(?+t|kDV&?Ui5MSV z$T1?ETm1fvXSoU^fVjEIn~ITVK1ZK$Zt^~jXO{u-T;oRi)LPjw#|Eh2tyt&2iF<}1VB=R_5{v|MXa;yt?qWFCan0*T8 z7QYZ=JPpiY8_q3$e+4FuGXyv{d5iEY6PN~tJ5l^r0@HsIc?FQS9hh(0aBlH?1em96 zxK!o28}eQP<}y|kxD(aiE?@=}&Mm#gkg*e(M{GE^_&o~DOEz4p_+5*DegVuCoRh(w zs6YAvFh5Z^xAl`jRH+k3N*#=+^+i-63{t8T5h|=8U z_25}%2wO36(VeJ%+#W(b!bRs6zdStqRtQ@baM2Ox7QZ7QwD-8^+~l!Z_$Ld9d2^F@ z0dR8^)=l12NGUo+c~=A1dlGqVkhd9_muxt<`27NycWgM8KaBGJSFHBzfgbAqdscha zbpF$8Jy?O;n(f=3ejuF9@#iouF>>W!!*O~ktqo*kJ{0i{u1@nhz@_S;xX@-q<*`J_1XK`sR#d5wLnFfs&+@&5vP`1m5CX1HSEN z>e^^;Ly@eaNMN9VVu@_bNi+l!TXIOZ<|JCO64);E(Ji?!RybLowA>ee+9y05PiRQARWdOv$dG-{y@y9e|Y!`s2e#n^;p>N z8#oWeus-r+gebldZqI?{~h#UKnK7D>CBmWO*NN997y48`c3BC4FU2efp1? zu`j*}0UPvR?)y!eK9ChZ9P<9T5h>CJGUGc?X`=@sqS79&MD9+~2F?@Qv-OCqd1o-5 zQPX}iFj?BbBx+>)M17v9iD$qhc6N(lAev#{E<|PS%7xWm;Uja`G>}Ld%#>a^JRPx; zm17C05U!xcfy#xr{K68peADl@4K(be?+9tJbUhLpT#@zx zib2ti89U}R=f8c}KlC~JLTU9rCKNVNH4jW1j`}icNoD-8tl}Lrw*L&VEQ;jp$ktmX z#TR~5i;dNv(lc%t>`40{TpY>Seu%OQcFaIAjxT&f8}dC8GbOU5Wtb(cvUo?q_Jf2k z*l{7uUN>aN7Y4N0nfmiX8DsSEdzPf>V+UXVVE5v*%J|-l;vEaNzuG>0DdH+q&B3{( z7=M;cI;5QKgj&nhBN?ixGc$j1hhJ-Mjm^z}dvHg(wz+p`M|OOtXcf~(L(zVwSHurw z6(2&#%h7%s&8;ace?$nGKC~gIik{K5nvl$g8q%RVU-5g}e+?m+y{lMbaZpiLn$&ia z0wHXf@-Li7Q!a>fZDs_PUG*Kg`;Pl=7zs5X>kjU0)f<8{8)iKGwXc5l;&(;Q|%kIWj9);5cuxIP#^e$|f5QHb_s z!(|ARQI+PP=Lrfo)3O>ybsW}<^9)hUc1C^M&(>Fog=I&-*q z|CaHe)T;u;Z*3Z*zZKt`UA%wuQGH9O_|KbiR1NY=DJY0pRzZwEo>jah(En=jU$wKxdT9g`i;=PCwY9Z^{v!Jv!a^-uL6jeVI40 zdoX+X?3SiPS&mTw(fn~-@cy0#RO3mHu!_I z9-o4zNVypmJ+eS=nSrN6zFWMJ0-(K-TyJESHO?4Qw73i^$#LdUiA&nMX4@1L z7J*o{gJSic`Uz?e;m$rdsJ(%E1eagfgR2nK5!_1!brknUqhh_wcHd7e2lHO(a&s3rNFM)Ms-}Zn$b|9S% zUjE+UJ=JN)_IU@!$B(BE97SvH(+1u;wl5HSLs(i8D&VRK9dnFsF)np>$*#9EZ)Eyl zTU30weyk!b3w>Iw4xLh!?9tMP?#-bu*{kVwxdHTS#ZPaaHW1J?Hs*)V)w9r69^3C7 z7#DvpeIVo5{y+?a%>aF&yLlX4-H$|R`5gu;>+}!zy_qI@$*lMvLf!)nX!NyMRIkd0 z(D8az)_|W$JM2GJlI9(l#tQoM_B=DN>CV8i8Q57xS7fX3%uz1JD0k}Xvys4E(?#dD zY`IVdmwf0vS{g@tS_`gpl-8&(zW;;x-~3zFjpW?Q2Udk2{zpg*vPNordNiX)i|-%5 z#PpgqtVdz#F}^?B&SOAsj)P40yMFP`a}B7VHW~LWLCwOwQ&6n)9fD$sY!?(;h2?_U zXi{52ae^j~Qe7#iLEKjh>PFn@%P;J0tq|1BxUUt|CvjgTDBQ$xs{CuXWgu*0)69pK z2ZgQLY<+(G&t7DD_t2^wjiWsMi7Je|ChdB1bIafkUtr)YFoQjRA8J{<#Au~6Fq+ML z=!y6ry}O={jo;H89DLoIb9~%$yIayQMmSz z`&fb)ZNL@OuEU-2lhukTqVsB*f6^09eChi>6Mx<7-M{bnn4*Yp)5Q3DVKmVD zWCLyXr+Q>z{CIeCVXJ=p`9BObdgAZ>eGA4S1+CE~1|}=9V_|zDQUH@|qMD&6`J0-F>%qJinKkgoM^o69rqkY(-_90>E0&h0h{!OEd7>8;d6;&4iLLa zZwxo>X)Ag>Ql#mv<=z((tzkVYfe{$n_3?Vtmssr6!+}HzdhGxP*@+pbap@2gj|4(s zp=j^@mFn6#D208!-EBpQ#_+QC;)b7Wfc_Q=UN1#L^H7{pe;@bu}4Mi|n z@vXU9EK45|N<_@#+j6ymKeY|B;$DkO$_Rm?Gpw!+f@c55gCLQytteiRNztaqBf&Bu zD1QWTE7}p*akhR2o&~?J@~sl=;vIqQZ_%VQJ6KtOW}6fUamFqGdbDv~{@sPkI0veA z=)0V&{FpD8bU$=%4A+`fDZog<7ypB2;B}PI;mJT*!^Z;rqC>O9DW%30gmf)`FXoR~ zi3n!BGZK+mdSs&-A{tizprwuRtr+s0rHAE^XPj+#RS6BQ70*_T_Gbw2Jsz3hX&XKl z!O6&2qrxVW$MVStNqw_TlFlo#?i2U{6}0HzW9=I1+gkkB*hQbj+#`M9T$UA=DZjos zSp3(4gV4mq@MdYESjxtIj3^SH1|{Z@wBZH`{Dvun|N zi7B_5Yrk{21L;J58*^<;xb&Ko^-RsR-#I)7#hb%QPPvDcda}{1q578PCUBUKW76Hk zN%y8)5%NGnt|m;?M^3t)kbkUb3kMo99p0nyonoNTI!n$3^~UnSEkQ3@rkOvTiFgcE zPC8JTP1PqVLyuQZ7?WtMVoQ4EFmr}^5ENsQ5gHeIcVhR8q0^{ z*XL-laqVsTW6R$H#IzoYerVKW!%v7_r>9sL`AkJ0eUl=s^aFrcHiR_ z6TEsw`OE{J3Z(tvagYL!^&$A`nW1cx0-LA^(Q@eNP3mkNc=IjOo6Bdu>}jSy+L>EE zj7e%mZfueaqoOK)eAQ-ueDCKILNvS5<-@xxCL}8AWc(QA(T>@1FD`kEB&%6a%yLQu z#d<;=1w}_M+bUK-NqrF%^C771!(BF(jLVmB`L!ds-ysr- z0F-pTv-tN5xNOa<9$DHtv~bWnGLZIT93Zq4BlVe)uqRTd4~w+VJU+N%f)<;%Yh))T zyr9sE)m_Fn9qe<@w=<5_WeFB^BXPE zcFCQlq9F^;^^6sqM>}0K$zK7DK142AZplKRo-H^BZKz>VB9fhG2${_(n!Yi3>WgJ@ zI4Ua&e-Hdw#9YMobc?SI{5e&0hVu~~l@io0$6aOta3an4`yE_LXjK-5RRN66 z-`5wbdwwwooMDYk3X3y$uZPQ?O!Mq1 z4JB4sEWvcAAuN^{47|l%-kf1&fawhDw4|_D|Gl0kaA(Z-ymKz*69`zi73%NlA}o6< z&cG9=>y(_CB$;JaeyGkkZ$Fapb4&6d zICSGp{V>m@Gjiu%g8__FV`t)tGxYIEp`Rr%Z{p5$ExGm!zqdmFH*o0AN=jD{T&Lu- zk|a+M81|MdC3i0?3|W$g!J(TVB%@Zcnrgok9D6-wS3o&dJ>6#K6yS$guQ4$kdWj9i zCMS<|@C{rdK917MS&TCk6OvMKw!m-#;K5ZpKZFF4qI*I9(auiNPd1)7C7+!nnca=o zGgry@_4f*zEXlu8TxD?8X8PbG!WYYx5sPHQq>QcC^JgXF+&8}RcME;k;3ma+lJI4h zd~Q;l&l8wWyo^Wt>i(`Se3}Ll8`MLn%SKDPN^oS|mj}2KqX9F97-o)` z>Qk~DQ5j~LO^nE8j-)Nj*$h-TC8v--2(&O$Mq@E#{Q z{7DaP#BQ;OXRtLx4W=_FVXXulYO3PG%`4R3+*J~3OMOA63EL&O+ z4&78U^j)rDD6|Gqv39=4%Fva>{846aif$tF)Z zX7GBtac8Uk%?mE=x8nQ&1B08HBzYFNPRTQqv~h{RaCSv8KVDw+fF=2RO7bO1l4mDL zz9dO93Oz#SJeU2&`%{a)ss#O52_Et_Npdc@&N$CWlFZJ<>)}j|8@$!#%$49)D^@OD~ z`4C%=577HNHh1;oBVK9xL4Hn*?+-fH;=^d;;l}>H7z|bzKg~~aJJ)t~t`py5Z|c4l zHthMqLb;4YU#I*|+rcWUwuGq15WTTu4L>kOq&0l8u6~N|A-XrokF@cjxgb;|5lX!g zO1lWOLJU7*Yt4_+s{}(liwJUHBR(>>{WjA8VG^MdxoJxmzT?FQ&IpsqYcf+--;OWL zS9Y%vQkoC}CR+R`Z#Tc+C=;aU-k9_<5x7VU6WHI^2f4^H&>}|A*(QA9(hD;HUHJN3 z_^^?*@3IEw00e(!M}L2JS3hh8*nh6%*YJ{qFOBV_O!Bxn^Yc@GdF=Ad2);m{8xoG+ zjAV;%MxH~197ZXmOZCmjOKdjm&gGktPqQJ}^;*J5l^r0TVlkyqh2o`vJ5xPWIuL z4!88u*y{y0T&nnCfTvxgFqB8wz~zGn`}5YdA9&_w+)vnes@FO*MO-D zFlHyt-xa`YR5-W%T>%-_0`v1zkoOKSAD%?s9gr8m^2lAd=$IV0^!^SQ!-$_-{5Wpp zfMyXcx)YU`CSW=h&P`r5WLU=Pgh~#%BpNdG$FY>pc|EfV z?}Bh=;S1uj+Fh@fE?QX@U-^C^qZ!*q5#-RqI|=3KW}1AJDne5v4*W)F2uVvs@X9$I zJ2l4-`R3PRV`Ei# z&!it6ct=J-zPNil>>G!D#EC2L^?4Td5@TImpP0x>_=g&|Cb01T36`5gRWMPKmAHvC z-)3V$KJ%gWVCF;5V}rxHFW&fK?5*~}KYH8XdD$=I@gGG5q5))uV|^vAGMxnV7~^B}>E z!FQS78=psHV$&EM#$7)rag`Yx5gFrMc-G-u^Z9uFieTa@Bs!pfByo;@l`nCnPhS#< zCKd-;5>)|F=CO5~5gNF0*>b$ASdJLUM0^4ilO)SG`vbZ$+Bl5hrI`SfZ&{Oi>hfP{ zQpeh(P>(g=Sx;(Dv;`7vGZJ|B+*Xii%Sg1%O0?xB+H!WcRVCUc?QW~y-Bz=^tv1mX zOtdXXv}GsS7AD%liMEiaZ7jhuHZ1d2NnC+nbjDf0oVQBlW?(m_-jE^Q<#_k@Xx_ci z#j0+%6yR;O_XY4?FkaZ`4cK6dO&|My?OVJ=!LWI+AvnrwWWi7{tVi&UH9T5C4mR+5 zpM=mS4GGANI#UC=(5Y2l8Bdv>5|e5+sXmj6o7Bfm3WUa9k8X^XA<7l!nkcDw;WfC8 zn-xpaW7)D%!)d%Ioz}~^tYNivG5Gng_^Y!pDL?NvE;_cW= znI*S1Rx=zpv{<5=a_04a`(0QVabS|?fBm~(vgUopkeKhnq(UYFBb~vSY%m1IzJ5jD z&RM71`!crSlwT7GeQ1Tw6$v`NFLTakIc#-Gc6&d?)|-;se%yPhCAkzFI=-KBN@fq{ zlLwsPxPEd)9SSHZy2bJjYVByrEMiW{Zf~QEmiaHQ{s_xLhU5+p3Gy zvfH~SHqVrI+I;UvEy){{WWIZHYU7L~$!_nS?go;2zTxO=!nv50NwV!(G^OofA3%T-5lT$M5nNzac+aIGfIe*<-VN3GUN;2R6I3;H% zNtSPaegQt`>JeH(E3>abl+jL@oV|})+Ys0~J63QU3mP!ArhX5=sKf@jwxB}diy1qZ zlH{_54AcG$u~N$*B9inv`nNM8SVijX!{P^RxN39e&;N(4Qxp^y+EyCQ7Ap;(K}8cY zCTJ?vO2gMhYpxW}KQ1c`y+*UDps7|G_?FD4Rs|HybtZKIaB~#a18}OD?F{gXPElS5 zaMzqfUI_B8J4Jb)1MX|5An&`UDDOXj`|U~O)gpd>I7NAvqC2TM$x6sh$Xlu~Acb?A zdGqL?-<(8VAu{T1V5YFcfn$3n==Fxxo{gfnrrcWvae_536-cPX4(IarMc zUj@c6NX{bbmX6t{;e8)2IyZS$cvc0>Cl&5Q@*V`{M<Rh0{@)5h;p{xL*DJ4H(gh=;o4T&0n84Efd#fwW@JapTa|tX=$AC!7&xp!mGPH^BYK zqf-kt^J5DnTI9p!407UPYNXZF1%l(l1CW6bG`qfihQ1*OGE~Iaq)DBP5q~C&h&Ag+ z;%^*}9|<1K~?4DTw&b2)2m4WynPplw*XiV%3Py>y6`XLC@4oB$wwe;8UjV`jHC7_?NL~rr+ z1cu6ULea$|FC4yrfIaE10mu}`hqK~XZ}4R9TFLKbnJUEassemi%tSd9KFKOx`6Iht z*)a(U(5pgNLeYJXw5WZa;(LSlx4(e}8vVD+hZBe^)dzEdP~{v!EylOr*m*9rn4z`C zeEB1Xz54aJBJ|}!s4073fivik6*NlMxn_kK3jPoxwIxlay5l=C@U?jUE0DN+0VN_O z*+_}0A)lckSy7OV?)(vMr1nY8idfWV>q|3z*tSlu4kg%PVj%OE=$az(wiqi!6Mr$i{IaVRPJEss9tJzJ~S&S>Vo|u{^OD# zDqjp5D>L|#0n>7>g9P=;P;q%qcFZrLGbVqp5G_(uxezt&M5S4vTEj^1iHZkNdm5{D z<2xq1>OD~XBon!6h*385QT3kAjIk5y;a3OvLwW~le59GQTM;UZpEg%@I z5onT+WZg|}{-aQT#*i<^SVi@_y=25G3f(V{G(BhZB!=3V^&wpLWeR49b4u&B z95h47g-M-X{cNQrIa6`D9ORVDv9?pP+j3Ay$$0v@?|er}ZZF61sCokx4~>qN901oT z*=;!}L;-N#`)@%R6q$ry#ugAR2RY+>>dQeKK+tuqeGsclhU96IsWvCu^~@2mGtO?y zK^y_leShh$^_FBV64CuLTah`v;izgwT)*Fv%!N)mxfPjI9dF8EnZh>tk;_4B<|!xg z-ji=xa=2VbmzAW|@!&eso`pK&+@dd+gV;oIvU2y8pGRAQAHsF0zh@>%=AxWa@|j7J z+4x8+s+2sqm17FmZQY@=rIfxaf4CgLLszDt+L2e7S_wcM3 z(oOQ97>VxNfUPwfcm{-Z%mhK@T`LE$cZFmG?>lkA22P~muPU5(pse{fx35({{;~5R zuv*mIz6!FmISX=JZR^daW8Yrym{emGHj-m;(yO%H}4I7EgJE zE1g?9SP@5nxt4QII95G3c^?Pn3kv5Z?;`lWADHJ)LEdkH`RhsKy#sk8z`QL7GosmY zi{EMJCC^norCa>CXM7qk-E3pw*nJ9lqskTaaG$~uN9R^v{uQ|IDXd$#EC>65p|w>y zHcF|&WrMv%VThx13wJwkH!G}LxQpTcHelXVxD(~?`@o#WiUQ{*k3+KwzQ((^1}7Al-u{OTbi0?emQLEg83*>@6o93DLlOn^NwoLl{1_0Clo0mRKM-xdMa zsIYG7cmfZu1ZJ`tt+H!!)AMz}=nCg1ZxH@(1!e-b0KmDmFRYG>6-EGYb4$mmSa@YS zP7AN^Dw!wB-wEfU4a7y~mX0ss*&JYAP&mFBOx0d-2As`hJ)3h&$K}8^D6Ct!A3)9( zz$`sa3N*_>ih8sin41;OO(i-|Wu(!srbLE`CiMT^8!z5R$~&jtxAcY>l>|FBa8d z1i(iCbR5;vd9~BoF^OJ+R#=Y2k5q}J){R5W54R+u8;2@>fNeVmDp(z~ME%2u_!nzX zShbp@*JtSifyFH&%^7<0!+OOB;3rx(wsA3*Lh2t*RBZ%XFmm9JX%5l`*G!lQ@?p1- zwoaNZ-CUect1V9o&XCD-j9lKW)?hWBIbTD1H{M zsknk-ZE1?2nsH~ave&*66rEuPbTVjLgl5PHReCP_>Q}!yZp&0yeH+Ty>3tGA#k?M=aO>SwG6n=`$fBY-T zCjMT6i%W;ScatlYF4wZs#$YT1!hE~-X5RP%JQ>_kq-EatZBTjxY$^p2gY8XvTL1=M z@&4rfneWYfOTRhiMm$HXf>>Id5r5A&Fb->rG4Qm*ADJ1Mp+AwN8w3%9X@;3k-|$}8 zLj&R1=@&m9-0mL=YD*6L;(LQOn?YE@Z{X5nFpbzHDBdl!2{nRsNf__s2EWHpPr&l9 zx6fwI?Hnd}uSlT^E3*ujvx`5k^2;F6`}9Z>8QVT+6Hhc*|NSm15S zeCWz*n7i7Z6Z${gy$gI))ww>rCzA{VL^9|oQ6ml*6a^IsAQ&{0+vJ{1xFjk_3=l36 z2!CK+g{(BX*r>9Mb0@_+HtrqL0YORGvTWT$Ww|vj@uC-_H z&CEc~ch2wseZR9{ue^J$XT9t8uIsGz?xMGf-{%JO?Pr?^9Kk_l{(cG=HI3aLS0XOado)cmgi277IPFv0lLDXzFlu^Z8o2H_jxn} zs<|2*rS*`4M!5&ft^VF?JPYQxc#lh`Vdf>Ug&Ux*t?Zs?w%O#zF;H^=tcoAq@;J^$ z2btbZkMyUi8G%hfbiSfrsK8F~T2$C0`7cpd9mh}nT!Ln19+>hZep6X)XTV zTcJSAZ{BjO=SuUI4|;CRHs|)->fev*K;P959kHJH^Sj={+1f^bZ*u^J-*fT)Qa@Kb zZPzcx=J7xjWEf9Sme)LP5)@?*6n>=;<|qF*2WIu76-xtf1Y->L_B5B1>-h5tf=@BRqv$Tgr{m?~{IE-ow z6hFD?4JeVEf)VCeU>klofWyQezaT;RXHC+c53 zz^POno}lzRwV-^`$g9NdM%YT~aC~PiUYz};(kvB$o2WBw?Hua#w3x?KMWfvzma)ji z_FH{M{NkgLIax7uQg9CTHV^eggS#G!oq-_PR&NQF*K@MsFCn2`D01Y$M_CTax2+U~ z*W|H2l&n-GYYCkV`W5_48Y>hgtudt)+H48--g>BKYtY15WvCM@>DiiV&VL6@0rj1a zBkq?j(!))0#J}-;^C|NZ^LWqYW@mO!7tblqVSMQF?|KDad?im&R>Y~fXW zaN9o-bpV=o{7b`&2Tn&~m>|_O?*v7YW#mcqvwKHUBS9#Bon!8WbfRs1Vz)oM^Rf8x zDFc>}_l($ICG!jRHjVyY1Q3i3Vzk^&)`y!jVDYe;W<9VmTRe5Dzgxw1Gi`{pr@Hi^EAzXYKVLA#&wbWckz?Oc4%}36B2h9=cH!IXR#xm7u;TIuyfAtW9C*D6dmLrte8kld6>uthe z>z1LX%wuMx8t2=qqgpFf(F?qbuvvaKn$uQ&^Tb8HtAn3VC2lyI{za~dXx!VL|3LDPt~;2Oyx`a^d!Ma3%Pm1fKA#3MnS zh?PApGdT$UmlH#c!Lgpm2DvN3d2CQLI{1ZZhixa6dkr+wTj1{|JX*G)_779evzWdf z40$aZIz5TK+4G06Gl7IxK)@RVcSU@OTdsjVYb|aq0kiBHNDrDor$-@w#Z}sNJnH+1 zj36l2zWJ*TCBrZp#I{BGcD%E+rd=g<;qS~*<&5hB$pW`3>V$@uhy*c*2ujY$CMbtx zRDNmq;PJ^P6K@b-xk4Ml?ceT|YrB{>`)h&n0&5o@)rUgOpih3e&uxX8aov?;ve=Su z9^z1C^faST*ez|}jH^O8$&t6~PYAuhyaw9k%InOhFc&U<9Ai=A)Z+eazTWJS(Lt~G zfZYPjts(D++i$Bi;^Xr6)YYK>=SFrZJ_kEKC%)coZkCJ{l< z?7WzMn}?8ds3(uBqZ5PB1(y$b>)D*$Gr4CyzPYfV4)J@R#mHvX<@Pk@qiPF^p21+l zOFfPL#l_YBji>8AAD2+rg;)E#|A~>uqn2v1U?P&A-8q!(UUTvOfzmEFtchQm zeF9@HV#CA-6Aj$u!mrvp_Hu5Bq#|uhK32G{sS{@S=!cFAB~$CoeK#!BZLn4IDG#M-BHQ6j<25{z;ZK9s*`!`>h#^i%AQPQK ziM}JQj4T|S&TDis`{C3lb{=s_2o}w_K!qmNjAgPPnrC_8E~P7ey#Mg|-pB1$qb~8N z++2mEsQO@^tMUcHu?$m5{xaNjl6OaZ^E|Qqo%l+HG@!|`+@CUt6!_8sSEadpP*=I( zmC(71XEtZruVpWovN!6eP?^1ADm57r*}S0TuBAR<3M>RTf!&fazg?FDixJtLr9QXI z*+|JZ@%ZHPwVZndjUw2pLRpQoTynQ{lIryFXbseGgUF$F1 z7~hD`C$8vN5nA5W-4&0mS>FMq(%#6w*1Y0hL37E(!-EC-;1Y{ucjH`hX>iI?thBer zu;K}#A`5ZihZ_EH=B)+GsDhrBn9A=V}D%3GLpYIr*!4=0{{Lt$dqvlSmUixX`J;J|% zX6dnXq+~b^FECqTttc{xn}13KC(N)o4B;qGpm{amMhh0(ArkmY&PotjIGqNjWhiF5 zb10-TY7~tqxMgUc5r)lZgT_MGYD)ry%sX@N*J}isLgV{*{=Yt(!@~6AS#-fogZ3nZ zt3n!eor|iW_*N}0%%Sr`;lz5OVnLZb|Ni28ssi|q-zdZoBZ{)vq07|>E{)aPqlQjm zLclmVOIdkN*S@Rn81<~pxmCLoW2@jg4{wSy(kxRz)(BnPXKEO;`{Y9E2_vpNy`Cko z*~8u(eH+!K2Nxp&7aDafjMNusiIH45&Zn?+y&m?BG{4%q@nxIO*Oen`Aap_sN5aRQ zLVwDsjZuQRmNuT?`15{XbN(S*Xhwmv2%GVUa)52QJneFEo*ChE-yQp?l-Rif_Ifx@ zk^k?1QZvVn{S~;-sBii@IiChsH)r*AUguBuV+3FSx=8SzTVD8v6ohRb13+1o* zOXO+A&N&W^I!{E3a~)-v9%sAY#K!AUDZ)NvWb6B?q=@G6N*ZDmqT9uXe%n%9dQx0I zlXM{;XHMCxx^tR(zUfTCQ0Ce4|NUR~e8tY`S2X7{jgZuWVSFbU*NHi0|6zYqJZSbh zdVq&@C}LDjf9vMs_z`TJ@L}y+kkm_Z?7_UAX3cHhmyW~1LjOq<`3BSMEDcT$+@+D9 zB6a5ohTAP<^Yy zipv*MT)ypcaZ18O@N}m+lPWa6-liPo9$Mw4Ad=cW3ad|c%a(eS3{8c0Vk!0+a zEPUW{aprw8Lb*#dlLEr4fMjp;vFSRr|cWu=}A>dNMTbd z8!4G}ub1z()AN|-JX@v5FC-WUmE4UC}jTYt$c^<%#s5^DF_H+9F?^SU-p26sSZ9uw5L zZbK0i*>!by!%?f;lf;UqK&O&Emv*}ouAnD%`k_Zqd1d$DWXCQ3)m>dUvHV{dR}x>+S3cXnh zi%9KG&^AkCRa@+q4INVaRte8+YKWB9R79)7%!3_+){waD7FMSy_3P&E8C^H3R93WY z=-S8-ROiQii8jTRv9!rgAv!|Ti7UQ}ig03i50{tB%E(bygB7g2 zD%@CFT3r#1Hlkv=e^fF{RaD6=>>!oQO>QBT%;FxBYJW(UBT>n=q>KOZIWzxD`VFSf zo;}k(+ukZ?+rNde{4CwCraRmIT`a3yCe7LQ`v6!w#)UG{oo#2g@3+Qe4bODu@Jirn zHI~Usceb+}?hA*>?_S`(eF}aYN`E*^et!V&Z>QkL$?WlA^5YzSELR9HnexjC$GI9K zKv*s?GTOF!_zd?B;Ae!^u>B zE5PppVD8j7P7KnW?WD+mNn=2Y$#k~!e&8O`*i7-3g2P^5)F;!_gd|hFjl&+034`GtYK4VeGXIPy=IU%J1gF(AdH%P-~S?P1`U zo}m<6AncqPGZGPb?9Bx5&}7O-FZ|8{=Gz*_xnd?ccodjtPr+{~!v8^IK#Ix4?<(vI zHQ=Gils-V1{5QvgzXG!fZWvmmDTt``|be9|n&7&h5j%G2X;5aOAf;9WG73 z@d@DmMPoD7?-#-E-+-y$E*DI)KGN`O1ZJrNm#&-(!DF??2t!zzorCpGt0|n;O^4cOyzPXn0yMDvnPOn;W&{gAEm%FYg{INl>5cN z?9jNA^=n@R=KC7wLAZ3~+z5|{ff;cD05BY`Go|l`!1QZeCVt;U_+J9EffWdo96!>? z!M_6YBaO?%kM;I5V5%nxyNu&6leJT06f*tz%Z==Br^BU5UmtK!X>6wSu|9rJ3<;P_ z^QK(*1vN&1url>SA>gKIY^Hd*F>)m^-5Te`dpdbO3+|uL7?5Hz#rrMb_GoOTc$>kY z516r78`1diq>Go`MT5o=N0YAqn*jG4)8W$8$KAl)r?FQ0LjOzd;&8swWT<_}6<02a zc6Y7nZeO6ZBj0^7#M2bsQd^N!;T1 z#V0}QF^}6Ujh|aw7L5DM`T0H3Tqr>f=i*q@l(JlWWV(6)=S~M$%QI*>3`aN|Yty_Y zCwYxe;Z+luQc7Mp3V%yB*_kywo}6uF@4zQWg?YJyF-cA@!5p_6c0Ci5)3Cc9i)R-- zR`d*xFW_u@1-t@1(Rn@5@Lkn&9-`C;A1-HUveh5C!Xszza95~85KJ}=gV6A|HHFCA z6P_awt~qHe2&WDflX+>GOi&1D>P5P;%`#+f>jf=l_vF^%eK((FZpPv0n(f3gak*fE9uhKd0gE007tnufnp2Yxer zgM2sJTrhc2OK)zNcQ6WiXFe{eFc0COkkb{b7zY z(An0P)FzZWfL3bG4<+`ZB?N>7n@s$fc$|L4qS@xE<1nQ7g9^m{h>mtH$?20T{b3E~4sIHf7ncGw+4 z!7@0gFe*$-IIoj)mm`eb(Yo#Ly|-z>?&{i>*1SENYx4H|J@JOe`)=NzXWEM2Ub<~A zKWB@t-g;t}=k2Mko?BhG?Lsp;&8(hU{B$gP*E4bSOSsK}A)sRS2Z>io=8cd0RM)C| z>7|U!VJHdGN^n6a@oGupc)^x46UWDI%}E@e7$1%L**^5{!E^hc*eS@dv?J27(dZze5-hF$`z36BHIO$kc zSA1a02&4@i>2Z4usCT50k@gr zzkvhLQ}g!J)D<7j>*bKK`_r&+$>BZo$;7MPDZkF!`6S*Ghdp^a|BoW#%li+FxpZjA zV{CtInt5dVd!cwUy0$=X#nm2MzPtN&z@X@@;Py>;yXSX!D|%*E-`2@YSMQb`ADDUO z^GMP5_b0{!D8s&OM%-VP_*-`IQ(Iog)vv;%dp+@a$iP%G-JL*qD$?t*V6;n-l{B#hu?b+nH3LbQxwjM#c^?~s87lX3Ds$w7XKbu7I#m+{guIQ3HKxL zorGLa%VW^o-+w5(|F7c`uXxR0>%xxh0b|}9oJ!v;cv&7_KD-2XKk0LLF$u(<82Bjh z{snn=UW*BM-X2M{zBo+nWKeV%hDUE}Rxu8j=Jj67P)M3pscPE!F%6?%UqOR-mafn41Nrv7&3798w`&8Dxj)F;(_9T)pm$zYF^2EF-mk*@=g5Om{M?p_BGUCcvP};} zFL5k8hGX4%yS4xlN%UtIzrFPht7KvojA!ub-DS1+XXWj@7LfZ{o-v4%qDJeR7vTQ9DsY?9YP6my^^! zP zVm_RWnXG}!hXZOxIssVja{08*b8CQY-V%s&um~2f;hec9zo#MB#I+_|%Yz<0ZT$jl=v| z7>R0e15f%xHKgM1>haN=F3a1)`Z9(JDF%jlp#PAs|M0j;ESlm2x96FQ@R1%w{e0fe zPV{n^>hgme_#;_dJb;_P=#^0bX3!6jF2IrRy@Bg{0@~Z^vCSt{%s7OPust3t^tJ+M z?>!r>x1j&fI5YcB`NqffJz17NJa9jTDYG3Ki*-i}cSbuvU`H4n)1@DRl8#u(s=ZB;r{@Q)O)b>Deg~R1uK3E z?E3<^vh+_(*6fK|p@g-qJ_((8v*K%X6BPtuNNaVAxhaUAIon#CUaJ?U%?r$Z=I@lq z-VEKUXaEP}r2f`=ck39`k(BLFkEiovSkBM&#_C7p8>HK~v)TE79PFitgXwpW!sScWb zo5wgqYWz{q$$OG948rSi4JPD0me_`y>Z7fjSGYaGt3K67aI-D?4zKiAALEsNxQ(M8 zlz`bJ*Uho6z@0p~tKP=T>dxz4>Uuh^QzrUeN#2vn?aWHv2U{v@(`S$%buFbsC?@-9 zq1bmTUl7S}Z+Z09t*79ID#zN03vnu}4p`r0Ql)K`Zm?~D1#l3Lx>U&`P!~(dLkX1C z`DPh8QcP^nSe{AmTOcd_q8Bhb&!uPa`|)z=bpBtgE1?f!X+Cs~EWUOCNzdQyxpE+H zCp&am-sSzgFVXjt#IcJvb>;2(1YFVaewKgCC-stH@VeqbTr`6U3iDABKrCpX#QVSy z|6ZN9r)oq`B!6%gKOk1MvX#-H>3OCU0pJ#EzHFn1c_yjpWd*`MBl0YIBi2-vT~$TMYnn`!nfg37oXL-xdiWOEgb=+ z+$iKq&?y0b!sCT@TdA};mvD2G+3hd>^~SME zMM!afEX4b_zwZ7g1iWB@x*29AJ%AmlYX_!O<>Jy9J~Mz_I?D%}c(GqYu5%a6=O@M{ ztILR%Z@z?MeDC7%i4G->uRgh4#l{*mmcjn2P`ASV2OdoKU@KpTvVut)(K&`LnzZqv z(ByWK_&RXB<6@^i1320~;Gz0aii1~w`tJy6)%`%{5tj-%P%edyPUOof8SdL0X4tdw z4B_#Kb{&Qc8q2%ZFUOaU*Wu?+(3NcCrseeVhAYRHM!5UjAwZ zh$c5fv0lI)1)R7kr1TDq0Ob?aL@MqLxHR6?y)M+=y(YFA(}gw5L(m6HGY3yL9dUKIOI91+47BT>Pl9!8WWqr zjK(VK(>miyh=IBm)_h` zcRGCBoHKptZ3U2&{waT2jy}+%IdZ;Aa|TKSoE>LtIOKRe9L{M<4i-*S;rX_W77Q`u zsa8Kiq?9U;A-PkS`o*}j1XBu|+@8sr`U^XSAjO;|oJl^R9AJk|kd1M0bH}9=c{|%6 zOW5nFhwZ^rzb1<2L5hZx4VwHE&Kxn^oHJdIV~KL6@X|edx7eH^fMR$(&Rx!&gn2zy zzjAQg_#vxIp?_9~A_lF%Q9EqY_JzWN&xV)Uq1Zvw5Tj~`Yg=VPC-C8ZiG2lgU%|o` ztT0$|>QKbEV;?V}*qhM=UysePLpAGA#JF4T`EYTUVd_P|kYK{F$^C=J2C?3-5^t@L zLq_O?GMpfxtn{qQ`WS+!oMYV6!HIF_VxokyB>c5A_8qW8S(iJBafiAbRbmdhC~7iW*e z<&`@lropAb;^If_$ zyey6BGr)Rh(ggvGX7I3#yWTmgao5hJDYbLCVAxZ!whskXVroK)rcHCc9JS--%u;c4 zzC499^XK(YR>|)tp<`z#s_jPk%qHBDm;4<4GfUU*SLa>w@->ETrH0X^(?g6qJ*;ha zdQz_jq9}o3UxiqS)s1mgYl@@F7Fv=Xg^2P}1%6y!rMQpRoCiLW`s!M))v; z@)M2X0|}>q8{9Rfi`2yomgefDi?cVrk{H+8VP=XPA{)SPhX5>$>o>N3#;*4Zb$W`8 z&BYtaPnrW`qaT#zyyKuCoFnqlpt|@5R@7Rtth$S0Q9V!eT<+dfs$8!02 z(nUBsP9ByblsgwCDY+;U%$=~&VHuC#@}J+b%je%T=Q2q%yp4xlana=wmy5IB%i-&e zy(}g63c*}R8_(OhSy-lcK+!y;6Kc_|T5-Lt zIY$te-M9P&IEIojZaVwQzdBtg{Kmsh7d8U<)g&28+75)-<|D1L$LS(%hZ~5JLXIFa z$ht7;;w)9J@Z33#q~x?(FyDmDS!2EV!!>qJKhim^MoyJPjb_Dbrlj~eEle6z8ZuN*R57cYg6*oD3}X1w?l)|n{4!6&ABlpUjQM6xv*(sU-;}! zD>a7kTOEoRcR5Gl;x6aLl=L(UM*4qHTmI!!-FABZsW~^Nq-VZ_Itw<Eh%7en!J^dt*_ai_33C4~zG!*u%aTs|@UoSni-&3R!;3KvNzuBT|ueEY4v zR%&o7QHLVNEeS1f@p>jO2+WUHpZ`NU)V(?sG4671g^N2E3ndr7MToZLaok*AAKS1z zNkZ$r`g%F9iK{E;ILzFJ50R(5tZUz>?lD`w%b|l7x0W?t-(Tk^%;W9)Gv_PUK(9VO zXl~sjZVWe;*F~$!D$Bzqh2=GP>XN5L@ltDFX^t=!2`jTSD;C9#Z>4P;;u}}vgf*_> zt3)6N+M9ROWq8tx1B%Ma>LL}@74_lzc)N;2`^>DWu5GMsj5dXN`q7TQscre{`1%{y ztguo(y(&^&9xZFA!nJ8pFkmq#tE+8lzEmM77_O+PY^)q-F(p~oF_3_mm`ks0f@(#KSIsvgnyH_=It$?U(yk*@o-YJ(N zkG6GfSO;enkq)<YRzJ173gwE% z(yE5K@|wD^{sG?QJFBv$tg50RS{9a{_;TVrdeATM1nX{8EHY`P{PVXrwICRD%qbM>due@y`nUnWf%U z#r)T_I6%0ol>UQt8}W%bygF|5Clv<>Dya^ED3!pQtrWJk$2TK8(hjWVqh6Gr0c2$P zYJBoe7^Nt3D6a@tmsUj@qL5RUVg;2ioxNElbJY7B$#6}(mG4>n1t@HlQdw=dx~jaP zrlPhYEi-qp4qX>W*h0}T!P-cQnEI8cyBlBY({<1gu8-E0HdW&1hU70mHjAn@`BBED zHKMF4T+>uvT3_GP5Y|84KvhKYw;QNfaC8MNZLu!s##q*2l~q?aKJe$}*A%X3gcw#t zPADw>i%GIn_@j#TBBG(QP+k_UsH|`zDGp5g+F+*JWb->le_$7rkcU+F!Y95X-_@!e7^_tw=q23Im55z)F zA)F?I28G~QC&)0u2EM-MSOL(N^Zy^5hzm>$pNPZa!1(DfaHj$H=rC|2fqP~cIIe+T z7$)wI!@w~ggTufvA4i9Q-90=T6gx zfn$DW4+BSjWy8R6(o{VR9QRZjhJho$g~Pyo0=R2|JFKys(}j(2*tvHMC)t-Q3gV~+ z9vU{wOgB9j0n_2YrMo#g72&&p`I5$QS(J(2!@xXt3VvJ%{RWuxu)jdVa!+@&kaO{C zHHJ8vOg9?4fZL|A%x}7U(7OlLR~)!Z`M4jLha9+c{J0ad7Z~22r(r#&%g0Q(U(U=p zOs0G+2X3RrX39rC_}mW6XEly1l1%yd4loZ7gWmu!FARg<-+&o91-~gs&&YAu@xnuM zvh-C0bB)Gj%5NojECc4-8ka0*$Eu6*aEN&xn8T;w#~ty10Q32C7)pI?JYBt=3%{T9 z$1{gX*Z(m+&kqB~e(2?4;Mni}Wf(Zd`;TGbjtv9H^nExC9OE6yEp~@VS1zoNF~h(y z-toi0aooRT7&!L3Glzl81Fm=&IBpr#4g<%2tT7!fjhylehbuHTliVKxzxBW@)k}Vs zXF56M{{KhTwg70FO#RDP{P;Qn4^5_cpMl>LU_R71mQ$ww<$sT?hh(xJ>-2fw{(kOE+#!MfhbJLw+=w z_}v5CS5Cq2I)uL;n5;>{O6KR8_^kxyW{t~~-{-()J1{L5Dt;%Ezc+#TK;ts;dlhVa z7eUh&9-2(;2pj6gos$KUv@*4$&jR;Njm;EqB|N?l%sUq=cH}SRa>9Bh3+~%5Nk%C| zy8e_?`#Xk#V|)1YFmRO1FQmhzX-D4#?g5R>l;7)+kzW9F_N9^qQAnFEzg~F%_%emD z>~#6%v}(^VaFmZ<4g<$&^Y4d&%LeYvVd9Pq6Zg(Aa4eT&!@#kA-ya5!^5VH1mcyhg zXV&NGDY*0+xy}IY0*%ci2OQQe1%|&G(J)_``h(TLY(9Y>wif;v9Hj0y}wHVN@pnBcE4k*>v%JNVGt8t-0@^VZz{mmd%;7w&SersVwp$goqm z8jnx3vvcX^!`C3x!ED@Q05wb8xb~eP6qjj~Y@Zy!|u=(ItCv2{EeDVdC z*M#CUiYq1cd7o86-2j_8@X7T99x_)SLuOZ^K8E}op*FxCBUB9bLZLRp=2n$Y?s5KE zsO_-*LhXconefAT^z79~4h{`jw{ZRH0vN+q;bHu06N7&dL=5w$uSZ#5uCo5(Ts^Ky z+Fwl-c1s7ijB3IYlpnDhh2ku^K`2;q@ScCIn@cP!D-QcM6z)HqnK+gc3y4VC*QAm+ zrmS=%?*ZgHQm_O(gHra3L8*%dEcu`ui)s~$lG7p-Yj%-P>!GEht2-oZGSsno19nuQ zKANUhY&+E~eYpyd-RU`@NLlpD@Tel?cuHdxX**~uyE#_Al7Ew*2P;6~p72dPoj=yt zIy^x+f~4}oMe|y5<813jJU+=O3omF~q&t&~pn*d^AGI9nwpVrFW7#*a>F!#;4!kl(t+}~leMtW(hk&B@f`6@=qO^{{R}T--kyksKJ3q3nuLTD<;KcCYn`^K)3I$6x z#`xDNfNszy=W;6$r{Z#paIu6S@dz%R_~WPJeLt^vs821ybzuJpycy;`xkG4+#dbKV z`k6w1huH>tgi(AXUT9^m^Fy6uDiU}k5VhQKr(*yS>dTC{a0dsMCj~*ZEtbfgc!EX< zwkjLW*FGk0S0&v*7?reOtn%6gnpa=eevPi`i_q%(U0YgD$p0C=*BoD9)rg9Luc}WPXp1`qQ3$4o?v0bA-KIe8{ShyjX zrV6)LMd8$RtP+oeI@d}{c>C;JaGsowGZNYvcfg=wBVB?CTc3m#q3h017b#+ymOhrr zo%PA!V-Z|+qK8;uxbxV#@+6*_Dp!iZ5)buZafmz6iyab>jR*$t_@wJqt!*max8n)Q zEw#Pk%P#*H;>Hg6=R&Q4{hvZ@g8eh0IDDyr<4d3(5w~x_R-7LK^&fbA!hvr=;{faj zg?bvcYJ4w)QVs3zp!SIGhp->O<1={M=||$m>sCJ$w@W~&uIzG9KM=PoK&ggXmh`Ox z^*!-zO8WBCNvZ>D1NCp>yDI6+&nPM1TS0wWeD6s5_JUIJehSn##P^Fy-=Ba|VX2Mm zYvS9V^nD@e`wFP9i0`4KZx&XGit`9iEKQ%m5AdiQ@xwdH_k2*F7hj$PSH2~nJ}Yh& zpx7NjWf-VWiCcTpZ8IoUM>{}$Tzu~Wr3T(FCw=)FeQZq^hMMls+K!t$*4iU2y^MDF z!d1>d@Ymx_tJ`CS{HVV^zG0)G&%wytRlL@=Z;bJ6MF)DUNApG*As~L-e`SLo_(ryhf~zFNvqO5vTjaj)hm)sYV|;3AWOHpC@zT> zSeh#EHT59AM_GgcKrz%HtItb3Le&uuq0FV5c5>8%S$*MV^aZK`OLwljht)DtW^Tot z68;)bP^P!4ow7YXfyZYohppH(NM<)&l?pSt9vrJFMuctKq;o^$Y6mB+dIuq$u#@#F{T{pLYb-jMmSs=O{|9XPf$8URb{M9RVg5hXYe>{;5T?5VYDVEw?0U#o^;p~7ff_x*+qSA18h+c z=@BA_gX#u1+625`)#ZYF{rG^qH4h0uZ$R5X4&qSh8w+Y3o}gSXeo3h5uwN8v4(u0% zq5!MZ&j}T?$I2wg!})S~fBokD)Fey#_j&TCXajlNWp;5_s}d>*-qJ5u}<$ zqEfA7<#fEO^fT2e{TG5#=`RMQN}H)x>2C&Qr~d}L(OBvKGiaUu)pS=mkQJ*UTXdfE zio=>qCLWoL*=D?nY6k-52s4-Cll3invkDV-f7`CUEoUdi#*cYua+wKjDvB+qMQ(Q= z*s$=`hQr@LDRmit6^fZwZp^fDy9^Y2!k{Q*C+G@$H2DmQd^?8-%(e z=>|fSNAa)q?cO&*L)n6w^0ss?Z!J2?S+8h15N%zZ-N`8(bQ)zj=Aw9o>NMyk*b2&T z?t=4|AwK$I8DR!_U#ecn1%Z7(#z)(PPk67xV8kmUF&g9Nn80%h{Lh=`KCG z7x()?tu2Km6F$eHKATL8<9J4>HAhNK+Etg&6@HP`Iyybp+}~euO6|_eNCM61=Oh9C!Ex<+SmTP_X2i%=~Mak3eux z@#`-rI~u&KKr^qvT(f{(ecOV1NGKXYMM8U8u;_)sIh{std6v~_@Ei4NiPmW(2E5kf z```j-RG7yENl%FeV12@#UmjMaZ4Ebid3Rl89(M^ zS>{Iz)O4xUJg7^Ljp*#F$R~Ds=V=bf!`L%;zJT;dZIz<+7Ypa2zM})4*r8CWG3JM}7I7OO~J!#{20))q_%nzX;S=xcQ95pvH(V=Siv>)`C*i5Cf$e%@$C1 z;t9$Eita&Kka2+&lu=%FUmO=75#Nr@_{!V*_O&6|Y=)EZDjsIRqrXkfebo`hjyK^T zQ$E(!&cY9XVEdVczecP1GboUR1U#p@w?to9X~-D*4V*3|B#M$NSp6QUp=UYqh5o>2 z@HXgEN>&~wh_kicZxoW;9k_CA{G6T7#7^HG^<3HPiH}M2WhMHvc0Ln-y{K<6=iI); z!67o~wZcU`yZzyvP+uzbk8i(YQkJjh+8F+@{Sk;plT&xR$1WUtjw$7)Msh|UWs)7~ zN61dC)ym~Q^js8LuL>nc^O+;ef%10Erh=inMW>RQ_7(MsB^N=7HkP9G`4-Umz4)SV*X!f;taWQ0C!O_M?;pJqY)p@iy#p1;_TN zTH+|YE6!JfQWZZ68hzzAg%FOou4`Yv;$j2GcVnXroce7OkE=sqfW0gP3FEKF7%vSs zAMb3q8@@(gX}D`C2|p>^j`!AIz}sk*PtNN`ptkkIDc^F!{Co_$K<=p-GU~tF+huKQ zsX_59tN;6`#XO{g1qMeJ^%egk?=yYoq2!ofygxotZ;cHW^fq~P_bFVUhziN+#8F!q zD@1Om+DlRIti}0@tVIFz7Uk{arNhd^hq+rfiYm_7TF7O7wDV<@)!>qOgimPu9Q23inF{o`><_UN25Y#-wmWOyy126#P+WsE=9S0B&x^&* zLExEeK4E7-w1mNcD|P5yReV$SC#Pn)%%@$RD5$($KY+%_R3H+zC3S7I!O>$*LUL7) z$(jFlJV6oYp9{sF@IQs>f~^Fd1J`_1M$q^qsAf<;8LoICFDU8^RnvF?zN$a{1*itW zakx@$PlNgyo}h6oNwIsY72G+n74AY%3U^hKq9Vg8JU(L?Y=v73szThjb)+`0wty-X zH*Ot0B(Z%O)Yanlg{0f}K^2SJ14*}ipyr6%uaa)uCYmK~e@(i*2Wp16apYBL83{_2 z(CMJKH5N3e*jMFaM$)%9={p~k>M}yOX}V^8D7p7DPxSI#Esngs6Ot=CZVYu&8BpG5 z0BbB*zt$Kv68|r|>@q_xc7&2Yt8$hC!=n%d`0FvwmNs!2QmB5T5wRD`n)fL6{jz*4 zM-ZQ!pSfHpb}ZLO=0M1gdi)CqF|EQh{C`tBlH=qG2Uq(p?&4=BV2cj97L%?2663y& zMjx+-KOE6`2alk;w?Y*vM}ru5s2pNFr)mEyt~4>oSfL`?l^Ay@t}48qk=p;<*3a*> zLviIpLyS8VM>qQ(dt=+G6?Ui|27w{Q9m)?EJJby$Dr)Ue-)0aPV%(vaHoG)xm;B*7 zb|^Mv8e-g`M#04{joXgSLJ?S{@n;5sA;ukwWp3ZMED0TJu|tj4B1MclRIY?#8faEl z{3LFNqEOQi;||4|vP+}?sdu~WQ0%5?h;fG+0~b5gS8w>-eRilDbtq!oq4HdzemLiW zAK9Vq(xHfPhhodJZ}m@nX*_;>v&!&WIutSPP-7(&^Gnmc?Z*%VE7V>ciWqmO)8S&r zHU8e?eRilfbSPrnq0W#{lxmvO7GEB=LvatCh8TA!_BOUQhwFcQ^B?R`maZ0J+@a2t zP*z+)v-ep$)Rj6eV%(v)UF7wA0`>$v15fYZIHS!X9ZE3bM(rDH*~+DD1y8i7pJbJb z^A^K6;JluE*esqWm*?!Vd%asU=W#|zCipnhuU!ndAcc<8Yvka*#X2tKF7DZanMxba z_jcUB#*XXrn)BJoxW40x3jvHhDJ}Bcnv?bv}9f}wgNvoTW zqvX#6#+}o1Q*t_9FqA9iFKgL7kUA@;?V9uWWKP#*jO+ZAxW=c%6%q_L11aST4}QGU zj_X#@FzRX)FT@nMLAE*Gb4OoXqy#6l^# zxIi$JYVxlhPu=hyP&9`$=L?d#urxIoa8c=z1}JE{IAcdOpAh>6DX~uyO#0XZY}zoB zlChtoT~zGOxGn_FozqM@r_d=&%I6(E?7}w;KxH4&>ssxg<@zFmo z{-+&Rh2~5xRH}emTyY_Q(e83_=JXQyx^tRIQ`I+7L0161Y1Q-9cI@jkXRWEqA&1gm zdDvIb%sXrKTvbwhyG4g0#@%CI3Kv^j+-bR^95aXS>rlkFLtQ4JtWodL@ZW!C$Mv`l zMT|QXXR!9{YvhAp>9s?>r9%(4J3D0nUL z#zi_5G44<^B$Sn}tc{IbcBnEPiWqk&{vcw<_1s4nI%cpPIutSPQ0y_3B!Dp9x#SWc ztrTw8p@?yZnkAvE6wd2>@@_lS{W=se?ohKO)F{|AzkB<_y>_U_btq!op(uU!%wg0Q zulkrB>MuGJF)Gy~d?2+^E@viPLML#Z1Dw~xIT+0!?%ndV#Rb}RbtqyKp9U8nhPW=p zWsS?ldG8m^0C8#YGQKnjzn$b`x#VzRAtuB!bd0AQx!gTTs%AP2MZg?^9l+D{*537YPZH9c=Oz2G zOWkof`W9|Mdp(?6(k%P;k{hh_VG*xG5uTfC)%u?87Gxv%G57=?tt2vh@XpW^b1 z6qhGmF3uV(0|$2sOH)dtTrk(brf9TX|GO{PDSSn9E|(NKIaj1`E>GcHDVQ5zlg(}S z{o|)L=f7#rl_{Jf5{lB~!9!D-!nq2rUXKZz{nX5BvoKJ zpUYw~lzEz<%f*>f42>t0VO2_cY6L?h)4XYPZHt}yDVlRlN=|E2IM<|bt`p2u*ffnl zo&61)^DND|E`@VFu7D2ySyD8MHRq;eT&rAh5fe*s+2wL^rY8!#JMT>?>1h_stFS3&g+Kl3 zJ$8CNuQ^j&lbU^f!xa|-7<*hU&fa)Fe7&AA1i}32+moKM`YglPuR{@|r0y*jABK3( z<>JiO0{FV~l}X1Fe|BIB>OTylFz_N~wBArzDEV@xc@g|=eUZBl{p~#~ebD%%LlL9W ze3^Dpl0epTT`o?}Xa?XsmLQmSCO?3Qp5lTnVI7JX_pG25F7}AFbk>`HwnN>nLlL7m zeK8sPiG0|n*}G3aA6xdU6$WPybtqyKpI^K9z}a}g<>IW1YlSmq$0}W=smi&Zz?S9p za8veTQ1^X#$~!jtEzS8lsS9`;$CGh|PAHAV!bdN(j2G8_`UWe-SUa%k!Vu#w!zFO> zdd{RL%=tC{hQZS+`H4CdG44>;!^NI8{bkH2zGa7M)1ioQhvMkw^_&iy=3~=tde9Da zmkvdYJ5(E7>{(OKYhU`%4)s$ViWqmO8(g8bw7&hi9qOPCMT|RCyDQWa%N|A(v`XWs z4n>SR)G`TWmHbz)Ui6|JDli(JFvPe+Er*LOy)VB1BZt&Y(V>WOhgu<_td>%FFTYN2 zrLbOyB1XAw(k`kEI$Inje~8_ZO1!{We0J$j#3;A>+As#st=b})YQ~P z%1Xny?U7E|R%5uKytK5YqOy*NYFN~rBy_vPhbOd&^4Bq)z(Fc zv2MV*BAQdxPzgPC71czf$wN~Od`lzZ&D(OWz*kgN)>oF6N*Yr$SYA_AQ&v+hL3y#x z6?9fr1XWN`-4qrna``ocp+2j&vZ@KyN4;^g)TKKYW>!s8LuEs4WjTIZ!sR@d-^}XT zXnCZfDH`VCW|!CO`o^Y6ZAD{4I1SI4O$`xLIjTe{p%YDWb(Pn)RW~)&870i2=;sQT zOfQkQmErK*@LU5M#nh%|m9J9KN0oi@Z5YctSw*%#E>Ni#XAO!=z0yV3zWx>o?i4{g z__D69wH@v2l|w27E-`Ag!!d(;Xa-y5*5g$bu4WUcX>1H58PEgPT{25Rn>sjRx(H9piK>`{&>F%f8~M|;?*~- z!pR&ZqtfM}lEI9%FWac}q)Ei`nL0@li(TujqYrUw6g&E?Ss&{_IT)<2*y`?%_7%!6 z)@8k+7TaU;gQ-6AE?hUS>w>N@A-g*it?FDZkm~kcRv&I`XlksluPzN+zuc;Fl{45U zma7gm6Fo$AX(fb}VO+x603C^q_0_eJNZ4`8-vyb2W>OPrh}49wv;QvdnP?-WwN(|h z;_db-t7vR&tSF6yc~8LQ)evr~ud1x9t3~5dYBW>Y(af5rXnnK_HOor{uF$CEvZ|`4 z+NMZT_=L*_E*x5UQzTMR*C4G_Uq^5u=Ax}uR7Joic`?D|Kf9^24qa?beOO&rP@Zim zI{(_1vr=(;n0JSDu}8zv+DK_teM5CvUvfZI$t?%Xg@B}$DTUt(QrEy3a|#mUk? zsCgDeD;w)e%PK{sWs_4YqGo1mSOmAEEYfq$Mu*8NYp~PM9Yc?*onv#|N zq`!(X`O0Eszpa~T`zG+RTmITLt5(P2h7e2sj95J4E?ipa)0)b9xp~(L~jcGVtm!8{!C~+cf@kEo-AdNR7xKvvQfrzS4+kai39DTHaV$S5X!w zKT990m9GdU7?HB-imG~eLl^EWOU4A;pjxihZ(4{XIrUdYsZX;ZT8<{7!iqLsjA78B z>jIXQhs)W=l%kVNi6yB^)XBQ2yrR6cp}Y!}q*bfBd@JfIYpXG}vGuRAoOGUwY8pz* zE6Y)uIQrvC#|#Wg^<_2HNbl^DD_mZ)YU^vFb&(p3%k-Kl|D17_m4(Y|t7~d&ORK}u zd0~!VX=k7USg9!0f9bwaCnrT=FF~k&YeGVeyIMlo&g$FLENXbGycIHIz<64deZ!#()%)NfXd_f%}=pW{Q`~t$io( z%ao6&fqV57{J72=940?MHXicz=0m3RO$5J*z*IPJnbOw?%u)v~T{&}KVl^<2I&hiz zJqgSo9JqA+ZUw)?z)(9P4fBzS-#TEZ9g!wee(!+aoxo5_A-gNKXyR_8e@gcR4&f}_r@vsvEMi{On#%!LH~w_CR2W2hTkM$ykrcMgGbWm__dDi ztgcxa!*`lY<=g<=^%|QgUe?B@{5Aly-GNKTZwL7824*xnYM7Iy z?@VAOIdJLtT>~DMYm6|2l_`C90(b8z_?094*MNE5fy>12ufTldz@lVA z3x>Z03cnNNls~9&H`QsvfpFNlpHDxw-wnWR*Vs&Q%3)*o3H&nUim&5Hxe*p~=LLzjBP2 z0PWa#XimoON?>XoxODZ4qdUezU|!X@lZ|gfz?@3s=I6lg?1`ukJTx9Wndn+VJdjbps&__05j2h1u5E)&0-fZ5@|rQ^34{7hip&^Yf& z(wAL`U%>IuWJ({K<9J|-9k@*Cs|03|1D7s+jHnHmwn-AL{9>7j-yksWYh0%ET@E%m z==5i@{PyrH_~Qt^sDnMZyl3Ju>r~IvI6`hbB|{_?vSCn0qzuWcBd? zFpr*sA1^;X3CwG3crg4KD^q?WmtYQqhbB|{Ho}i5mwuyh*?7;y?|ooKQ($2-@#Am) zX9BZA<4%^}JAnDrDfn^Pavv~zH11^W?Qvj!e+qsdfZyxDyrK_RjK+JW{5Ilu>!o;T zGUfM8_^k$J;bj7|$D=g!#9smPqQ+(7_b}MJ0nAq^*f7a)Aq~H$fq7NqGVx>m4g#~3 z9Y4&;>SGHqcWYcGeqR8O&jEA!bYXYW{C*pl2Q@Aezk9%@ADE^Yir>lV<3E9ULgO;= z>jRtL0dsGW;&&SUWUAk@XX00SJT#g3h2U2N%mN246Tj<$S?9o|>t7Cm-zH$%W`Te? zS$n$^n0qxYQ~Ev*9$y1y+H7HW()w)#W~s(y;`c9Lvl}Xfp8&qXXy#=7}p6j?=76_2Hd|dnc-+90+(YTZK zFB^c_egZ#ias98*AbU5;q0vx>c2-=uB--7zs=IyNI(#^42{!g-wM}oE*|tEmNo^E| z%cd`Z(nL+R;eySQ`5pKbb7RMnwfvmce_MfUVopx{jKpI@bE^aK(Q~VVai6Ff7%1u+ zV0B_e<}!Y~;nw3B=KS0#{nahzk=EXMyT4Ghcgo(YhK4-G*0E-J?rMgxu0s0FydC@K z)&Itr9j^{S42u5Vb4AI<{Y()^y%0!cADHW~^d%~^N=3YcZNX7*kEhsIpW)Fh4##l55Z z26`*}9tozGLlT4*GmgvT$2}6VH~X$FK{NV6Z}kU>*Gi7wLB#f0mf0`cDiiSLqmwaF zY}*QfgyNaj#Ct=r8q;sylH0qY&`7-J>CL_u3^xeFH%g9vj6t@We~)LGN6ayaS4*}Z zKR14!X*iM_8`--s%L7L7KG6nbY0bF+A?*ZQPex+Yg)+{ecX@QR&pKGpx1amA0v&gy^FS9D;< zt9`7%13hCzNR|$ma2gtVU}(oHrX`?eYVhsTb#0o*yUQ+F%l6Ejk(2lE4@ZjrgR z5E?d)Bt9C7buakQ_ExjfFvGdM^By47yFc-fXUkag8Y!zkmhAjAU6JMkrpG*(_+!cT z_s@-=V;+?e0{GPH~o4Ep46;gok9&3&$x)u38dvjoGn zc(g*?(O0c&$7^g_Xk$fh_Y^UOyVgSE!_viV*IzrZ5V5eNgQ8wfwK)^-W5f-X@l!mk zkZi*zIp$c1HWSH@uBI47%}B_)zaQ8i34!yFD0Cq%hzCm-v2BZ^1~@=<30hk0YTWGi zo1+rP(dc@z1{Ro0@Onmz*_~?!@9F=`m>qwSHi<@ZTJOS96!KWM`S{>#l2a%ZDg`%A zFjQRCIvTJ3i;N>K=>3cp=0c8_7Uu1#uJbM_3=}`Vb^MO^--9>gr$v?C{AB6*?z*N9 zyxD%L@F;~Bs!Xikx2QxAr#rekHg2R!L3T#Gn!UDTGXf|@(fpfbsK&xj9e$ua_x@p{lBjPJ1C;-mBSG|wpByTv1|uuTkW~NXY}H02hK!@c05Ys z&2pib?;G&=j1JiBQI$fIB|>40!cTipYAio{hj7rPd*#}$P4L5~fbg&#d5jSvs@x=? zMv?%Mkl&kI*ppodD%cFY8o5lXmc`%zi=JR5;1__Rcb3dDF;4_7Y+fRp?84|vOEBae zAX9Sk!aK={4bkRAVIn85=Cls9a5^C|OmvdPIK0>_&c_>Bcr=S{&}0!ZtFxg}BhZsu zI3F50vXPPkco|F)C$pMep)@d?9XldFahe?q4jl#ihpfc0)8ZGHWquja$C|adaLz63 ze{D=ra7S2?NE{mzZ!l~9D1hu1bDDW`Zg1{AX#Ig!b8e*njd45vJT$b; zD0;VNx;fvEQMU&EpERR|{jd3o#&&vkyv9*%`dCXM{Fsd}8EjFi0(O9+Vad{L!6UsH zxFwFC7N3ZOWt-Lh{jw~Rq1DXY-GA7J(GXAw{6OOPnD`{g$VfA4C1EVOX{2n&;{bVj z#_kv8>H~NYwU+!V^BVkR3J~L1v{nw@waCE^OcJ{@6UY(rR6Kq z??q4bj1|e60A@ZshEXoIZG8-+$V1}locLN!0~-VJ6>}Sd@itBjuj8z65od+bmm>a` zP)RR^S?a+=-#ae_3!xQz)5f8~UF7$2|MPt>9sa{BM<1!Ub;3(al>&HZW*K<-@Zg_b zer)j7=l^PXk9z6gO9zYk#Pj&zfuzT6e}4Hml%Ks+P$;tVVtt_>quh&_91MP4Tn6uZ z>EQFP41VsVgEIZV%U=-_`Is#BQ<^XkpU2}9onc=D6*Rs9n`>>Qgz8@LJplW2Lj4N% zXN7tS_Gg6pEo`m^ea1o9Tvz)epxFEx|1`$-kMe@<3_B7_V4RHRTrUl$E z;i}Xpy7W{x%6YtUy9JbT<1!|+am}qA?!NR(0MKNKLN=wa7&%9e)BoDY(F+TM9Pj;R zBp2Hn5`ow zt}UM5_JiK*JjK7<_8rt`e(#d$L&d+}+Sgk@eW?G{ag*3xVmXmVe#Ho37e5;)jn^0} z-SmHe);c~>9IfWokZuK#kLJ~9Z6DeueMqaQfoj1lCM55W;8244@dnNV1I7MQP$hVj z&@fsWk3khhhS7&dgvKc?YzXLk$DtTTKh>Oge7r*jCnA8IZVrGnUL!|j@KMks4Awqa zw6OB=*ZjK@3$jD&v@|LrQ^;G!d`+Iud`+|RH4VDokS{y>s}Pk+NCPN4hl}w>gQAoi za(F@xF}kuxVs}(sFu%7t)NEC6uFRWk1}r)n35~x`;(=~nNOP_^BGLCA28z5p_rbA6 zj}}Y!kI2Pq+knj3tNd1O$3f_`tyug^F(2GNVstv-7yxt91DkS@^4!GZL+|!;GRDdA zh8e}b-s1H{3o-pn>za#MX7haL+w)mGgRaQIFgbzrFKruOzkW)?dDIJde4^-575s9% zE9yZ|?0WQW+pG_VF}X1~vH^ zl5DPkln8oztEqo9aeQ>%oqORsR4Cm|rzfcnJGbXH|9&q;VW8--#IdZr&-8a1%}I^O zXqYy@T;QMYP{A3neO@Z}t9gTpH|jtY*eG+1*_>;Z`^_i0myvr%Z}uH(KV!Pz0V?+w zAB*L68eo#t%jZbMuqvJ`D5gy>*uQ z+QcKd=7NBEW3c$yyq*7vkclUU%zadnD6k6~*cB>3r`*$0z=_D8eCD&wJ08ypLz$g$V9$08^R=Ex0fzbcJD$igwi}C-7q)?# zds{+aG#LnV-VwF3M!#*Y#|&>vVW_odeSukSsq;n0Rv5)Hyj829Ogs|8P>oI=%FD0s zDG&6N2Yc#tgA%Q~0c1}V+XbLhhg}BhLOenFl#-%W=?Xb0Hu46qhN zu7Y|>jr?UGhmC_RN$5@x6)EPjE(b1hhtKWbLxMw>g6UtTLn z6z3vMi~a8oSZQjRQT%&puWWBA<6#I{%9oO<2BqY^1(Yh)n?R{P<@Ti8=aX*qVTlEe z2SBm^3ChZPobY=E?`H}1I;b;+Vl7btstRMbRPDr6)p#6S88RV$;DwQ`aY?digNHy1hJChGsg-n)lK zRh{j_dzdf;j1Y8?D2RguIV0zzn#tsxOp<{BQ9(i=2_%LjhKZt8L<3eFv9@Z}s#ROH zS`Y2px3*Soi-MxnYCW}DwY9H3plH?BQ~O%;-S@NB+K22J$aQ_c@1NiGE!Zn-KkHu4 zde*a!d+j~Xk{x!Xwm3*?EL)C{8p~P{Qp(zekWwlF*3am{1+8ouUucjSb7R2~J#*Cx z2&?U^OH)tDOQxfH#`V?Y&3$p_>m#nkQ|jo{bITKL$7$Qpm?-zw>xmG9+aU(-vg|r} zQP4KV9*uM4r3%+AVL9B8Q*>Akk5e>?Xa-=0=}r_;)sr&Ds$5-L>@Qz(6vlSb^btSV zPN?oRnD-8zXwS$8N88f@CYXam>*l`B24byF?5+)K>&vM!PTGmxrIExc%-Is(yDx8l znN05(uzf9>?LG)M$QjDVgXs*AL)K)3rb}opLVIw9WxL}t3Dv-7p~7P7zd&dm@KtC# zLenJe4uqyk=yHUV`Rywank+N~WQ&S_%_K1iF?_LzwZ%uan#x58Ap~Uejek)SGV9T%FtsAJnhGg>9C2QoS0DQY zd~n775U2fvaeER!Sh&iWfH>!m!i;0TERiWc*jJmMT7_di_^^1indrhYTk%0Pg%v_g z?k-NYkL{{aD@snix}9b3#hb#kj>jNo!3}~Y0Z@7zg^;q(JQkrMDL0p2s&!Fws#~=q zbRVv;Y(37B&~@-t=r)96l9r=Hp@i;6C@LYQE0E9+5mHv35soc`zP&#FLM`HT($d z3@l5eJ~Q>Zs|d?)Dgkemb6FT%VW|hDl_>62=oN&VQCrf3GRPWw6#iH>qN$bj_GyOo zE@Sf)9;@hMQWs}`wqFVd*|CiN7X)0DM)qxUmOihdFsNERqj+S?=;ZL!uTuw7kC}BC z_IYv>&^@+?Q7dLqozoyC8U~Thl2Zbd@GP1Nv1>Xb`qywrhha*JQ76UdeJ}5|zk_uI zFBtIZD!cc9RacKS-&kCHgO$yNWU{FDKp;5P)>jF9?q| zd3zbpsbZF>ZmlLFVeitxjO!V;xGJ}2@Zzd)a+uR-u*l3_)^?PsE|uyOWUnULa)hY* zu+@MNn|#>f;H+Y=v11XiZo?JA6|_dl;B&f^6~)9vHT=95@0f#*!navj&UW%%Af+q4 z10K@oUHuBpTjKc==1Bc@&S1QUNscFzgju>NQ2%s&WSHK`5W_(x2k}i1I3%x%H%N$M zHRqME#kq`QsT!-lz+Kqd2wzqC1$Kz4X^^y+BeYIJS0c1tLRTZyD4}Z+S}P$0NS>G4Yn~BD z^Oa_4Ha4>GHZz6A_-KATgAMK%cIB#31F0LQQ8u9O2WT7@qp zNVMhXD5OIX(Wgw*vbG~VQ7fFNzX$gRqW8%g=|H5!8r%?nc^&3AU1fx}yO+U)mVkv6?^UA*9w9?KX|? zKNRgJ2=O5~Ebs04kP?=YZd7|8hZr>!EVe@{>`@vLTwUSgwR$Aor2JL5<;P^DDLR8)E}!AG4AdEoTV@HjKM1aw65&ki3kSm9DK#Z z6M)rM9?NCzk7)znBj{$3EBnMs&3xkKq9rWsNux8Jf16~6pTBSJn%UYkbZf8G*T>js z3v5u#oHYy4n&SRtGO5A99{66Te|1zxDoYg%@afX)+`mYs6hYhO?$d=)Y#ER@ol!^7 zia;Ls@0l3mwcdo6IiR^Y^FA0ThEF-3nEEDm8p*k#rFCmt&*m-!k%pYyeJ=hY7%<-B?2`10aob}(=jeCGAVF)uH0^s@sLy5YW3uqM5nhx<5l z^%M+n8YO4zM}w9-oH=RI<@z{t-_OfA*T2Y@-F1oOf^C(cgoWnlO#|UN|eDcdVrs@iZGxMW6#>aUy zs9w&;_&B3815*y4oU1N>{The!Q=ri0fwQ-591E(KbDod$ae`R{pS}Bq|IYv1;mn0S z-EoSu>-Um;EDi=HNUUXjH_)|Rr6=L9no5jUp0S{KUN9^# z-3QyIyyxPKuP#X)@8itA@8vw+$C(-q2A~3oS^H)))&U}OV^h=Fpwdkc&J4|Fl(>j! z&yojYhvFWM^FdapSTMfkJD0XOHCU_p5W`x)OI;u5lua?1>ud^hcaPx{!NFV73BHn^ zBp8;LY#x2$ufI?s+*r43&L>&@Ib%@h$N3~5=gER0f3k_sYyH^a`~%H-vXAo=ALq$F z&Qk@$c11Q{>s<7<3N_F^TNOxfQ^DEWqNaiB)y7mG=jnnWlANEoDf?y385Y|#W1J=0 zpEEb6yqu@|IL{Q!C7Sc(%WlL#%RK0Qt^+f{*;|7rBi74#rjPS1!JJM;aCiOeYj-)E zpVORY`8dx8*2{U8kMkVC6u~E(VXu6KAyYH7{-6VMz}c(kxjxQwe4Nppkoy7noR6QL zx(jO(!}(num?xa`<27?B#}9Ea72bV=!qE5K6fO^~@46{mG+Nu-l=&<(2L;8)-7A^g zIb{epaHgJCH!8l30TGnL?2nO(i?TbQ(TaV$PC&@Gg_+~WpkC2!kU z=;KT!1Oqq0=Q{Pi#~;EtZaAwC!SEq9IHPU2=C37^%FG3Serm(5j-IDzd5H1$f~Arw z7rx11u}>cEzyt%V2VyQB|KcSMdX?r(JNI7Br%Ea}XTLT2(*(nDiJbpzjruyYtB(0=R!&4mO1L<923kp;Zx>II^O<~!+E>r z9P@EzPxs0k^KoVi4hC2wWV8C}@_Hi!paW3|8E)|R!d-sHSb{wUryH0a1 z^>HpktXJkzALnwxtfr6as9{Snu^Y~}YR={0>>bA{e4NXDoGS&xwG;V0{boKgFr3Y) zP?g~9ZFQVUyfRn%IL8G;W_*g6e&u?IV>myeWsVDHj7W1h+PsR3sbqxYU?aP#Hid(Y zJkQt^4oz~tw@r~zl&cS$!a+v9JF+Qr$mk7?@oKCZRByTBzH;$}O)$WDjiq^_F1E%g z*YmnuH7J*tbFGhajgNCeFgaiwMrh6I^ST_)uWQZ;;S7yYVe+9IQ>i(Hlt*yc6wwd+ zkWCT&fUQFj{j73RWZogrPQ~FAD_j?4Hd#}L#CS`(jFdnweCmfT;VbEKP=f(MBJ}%j z@5e&Vpx@OcT`nbckLq=j%FTJXkMjz_91Ui}5Gr{8*rOEZ2CSy%=(YL^A7>1R{bcrA zTc?hK0d#5E6)FAt2lqNMf1zbw1^yI1inkXufa;Zbtxx84g83PI zu0V#JcqbHZWUkOMuM?Twy`WK2xqHDnALsRgVOu4ei}wFyr^9)L=DZ%9y)tj`abEA^ z+$5MA;Zx6_G|&2_!+D+N+$1uaF^V$`Q#qshDQ?PK+*lmUY>a4rx|<@S&2~)*as@k^ z$*#63Zv8Za>eYOcuM{nUxe7j8@73RbJ?WI9Q(xewk8_t`ZiCNJV(I@r`cH@RcQofNpEk~sRBml_ z`8anA=6mqjm#aQK?L>$34>ad);cVIuF6lpDN4K_tu%TzaoO~V@Prp#fB zV=oYSq^%NkgH3VQ#THP#8te9ziw!>*h+@j)nk9L0DIQQvT|A=8l{Dp=1BmrEL^G9B zu0OdcQm!}M6e-v5+!QI-3vLP(VLjuf$U5qWZVF~8JR7(v@+5wNhr-d3ub6EKXH#f? z6ys1h0P&+KheCnw#pO^aP@{)JfmjzdW)217YdTWAvqKLlo>f88r}=XQQve?Gw03Sjmk*(=?z=X??^Uo^&A!ui$`O{wejLw z*tFN?GYaP0_A_9AxU;ihJ}qcC)`zS39;UrlO!~+!Cx?p%3R!yofD0ggV zROZETLp$rrw!1ceTvQw_FDoyvs)U7U^V@rM6oB*VdtDUy{e4uk#SinFyYU0;=8X^n z85K3GZ|v@F#V@kuwz^?scjtMKslk|ij#Wfq#k#t(yfQ{@$q%{ha~#Z1xgAZF^GpP6 z?XgmkXD_Vp@ajtIoa6(X~7ak^kLLp zUWQRQTaqoE?M*NOgDhZtzdbsupVJxO+5l00`aWqN&!=xe2AyN$pl} zZeuqTz&smtqqC#rp~Pt~b8vo#v@Xep4=o)q9_^+0AZUX+M%MyFtuKhm7hHyD;xlh z@|6z&NBOD;fExzfiUHuVfm=HO9P@1%Aa3&ja4c_f0Jx#Roj*X_r31imHJ%y(j(WLa z066O9wgKY4H$dD21He%)4-Npw{_%?e;`R*y$9ntK0C0SEdwu{o^85V&a4hd12Y_S! z9vA?Q_4~;HaID||3;;(xXK}06<-|U3zwwIvh7ABW0=SU_z>!~M065miqygZl=Q#tw zvEG&r07tz<2Y_RJlnxMAGXNarTQvY&0!!f4z}-6z3E;|bMXhMm{jC(~&)_;|JnX!l z$U9{(TI>z>tKVsedqZOc2rpeb7zFx|2?nA5X2K0khjV@N#MFG6JOa2e8q1Y^I=ho2 z5it>%1^G;+b|=!6gZ1%{#t0Ce*v;-&-lIU@2PVvyA-%8jm=cv82GIO=6a3GBL58S>X*Pge;9t( zA^mH>bZ`R&j`L1B{mldYLyaMhE}dT3-|{(lxLhVX_0xenMPoCSm-{xQz?`dbhbr&4 zfqCFC{J78Y5HRlyfZs@L5Rb=2mq|YEWlRI6N#pE(nWlcf3CvxG;THkF9|H3mjpO*5 zsebe~zl{TCxyBtzz6*f4;xPR3!S7mN9@4l&wX0`=dE+qr_&)Kkz?{Yo1$U_O zb^)_p<1&@^H1N0rn5Q)EQ04uQ7*-%$CVm$pZWu6^X-i*Q@{L&#+a-#<@;~ohOyzmWy-f2abaK@H7GHlHb9<=-zXiZ-*EqWzY3k!iV19cTejkJ1Tfn?5 zZza_EOX=!^`RrQ)&*jp!7mgFp3;;(xJU;*&$FWxifa5&+`*gT8die`*pJ;5RdV3lC z`hauUyXl$l@ zPel5sfO%KrIG7UE^9PL!9zwn^fXOKa04`H`KSJCwzziu7m^B`M()ACvw`J_aE|;!1nxSG%~T)x;CCx9do_;p zSi1V)dgY+TASfHjuTHo0Y{A*WO?b)K-P6&*H_%(v zDc3z6U5y*gwvy*}HCxF}^`096eeOD56K}=|@#^Sr+_W@zoNGb+<_$@!TO9(9Klr+U zcg^SYAg8Ww9Qti3=6tVf@dRznmqEF2X~miINairdjWFN1LC%&}A3rp83UEVbJ9FIF z*uB1SW3$zW_wqO?9pY?BHg|3ALFt;4U5$8k4?Q$@S?UCForpR~HWJQ5mIvb4bU7Te z%W*jt!o_a?|GV@WxCrEsd~9}sggB&~C!rkpNeOW|bdH3=@H-@w2mfpdMd5Ff5N8qf z8~1XAnuQjJe;g_$Bp+h07upK=n}l{cLVTDF$w#$6me4x*Yb4YJpC3wxgg+M#A*&t! zK?$)vtdbC={JDg-!mpFih4AB&b~{1|q3wY0Si<1LY)EYJlnCx>-1C7YBqqeC3hf5m zb4(0bH^b)-14Gtr2(hFgu?+K73Ed69P(t^?=R6vcpHp$&8IlhThY0N<+;fc{vL1zh zq|o*tv`A?C;P(pcDTMfJ8nT{+{|^cM20r&1LSi>zzl2_e&pjh$-2B@TdJFz^3H=%V zH-+B;gr*4XJ@^xZ_8~$i3GHL}$|}R>j1}4!@V_p&Z1@qO@xy;ESwmJXLVTDAiD5S` zheBddE-az3h&_NSWJTcfVFaJ8A;cfF!4d-eh|s1Z^dF(kfyAZkxSIBw@eo8{W zfPXozurdUD}BhP}utc0^yB9mkWnS`wpE~3;cLuws{x!E`@_7|}N zt1GQ-Slb|_1svM5FQ>O}SkGd+CUlKJpF8)A*s&K$O%%=_FuKdxUG^E&M{7KFs5?6i zcnwOudg0*SzWi;uqHU8C@~MZpqHv;4RS+yJ!MX~lOJ7}`TsPt;*{M@0>axDy!J^*I zJ;~8m(+p4)wls1^{3Lg|CilEcDz-LyX6$Ou&waf(KX>Q*7lq#7tV1)mZV?;SK13ym zkVbBph;)d#hhUFXodxX{v|886%i$nOGLc0R~ z9YVVu{&ywxCj9S6=pFdq#}&4|gnz4q;K6-Z$OTTMvnLtpY>9L?c3{S);~P^>s{v~m zAHFRPHQJCn3^^OcLiwrB4=~=ThOtoKxSf65j>_; zKy2^6O?zQft=&R{O&;lBat_*tRI^i`@9eustJqN~#)_{A~ z5%cYD1WyyK-JKnqn{m!ki_{)!aYJK!d!#WLX>UHaxjizm3BM)5XS9v&txbw#sR)@q z);C8wIy+``G;eH7ww~LJOt8(0iz|zOtOt|@eY@96JvypIO(aLDiC$tb1?Vp7U<@T2 zJYT`3rq=f*I&UDX%2pbs&+r3HI<+N|@<`RKa^G)-5<9ITHVCvAF z_u>lUx9B*3 z6jw+Vwx0{F7XD`vs)zrngj(P$HTBrEOAz`5S4gID)ix&S2g^yQdUr>6w+>7t8&Sa> z5uB2Vt_=>3yG{pQPTh2PW zodaKKfErY^GZ9iPs@sn3Md)~N3CZvN)cOh}xCCcSS$hq_UvowcAB&CtO{>#?b$RV# zN76QPHDKp~8HEPid;dX$ef8k%xjvy;h!yRG!D+UX5#9 z5UNl$SoUOD=FniR zZaoEIH6oQQhRl^F*&9A1SK&ns(}9t=sBm1yUM^2j*$JnEr#`pUj3rKfVwt^YnvMx= zsP4OG=yv7IZ#fOB!JQ%Ic-2!4C(bhD6^5N5yw#Ub6d@&JIYN$%r{j+D;Ydd|T#Fkz zrmb1dGojs`@*vF+-KNv4L!Aks@~0lECI86?srUv@kE)+#THh!To353fnf`s@;Ea@L$!I!%ng%nwe z0@#f1jBLj5fg&B)$;F!AtRA<3g*vm5e}no#XgRX5JFK2Q%mf@lJ2Ow0da}atKcZh# z^m)*snISSZvb}tM+aP5biIA#ewl>wXCnEGUTwxhNDNsmE?XE*8Y?UKMwSWXdss)@n znLFcCaIZEq`PcM%Za3Ozte_>@55}e_Fd6;o0j9utGN@$xQ6#Ia&$JO!IvAFnwpX1v zpoAWcWNN!8f{<#W9Q7Z>6_)d?R3%4ouW$&6ITHRwXW|suXAN6%tn@ zs%^2t)arueQT>i1$u^WjRhXJ*xVpGVXl)3o+2t#C=qiLRM6BAVR?4%x8DAo`C%14b zPQM%i+PaM%9L|U3%q_dUXqIw%*1h=21ZAPiR)1HJK@V(iPLe=(B2q{%?s!_wuJcQJw zR*sNT3ZD-zlVWd1=uRT=Xo=tc`FE=>L?m56pZUy9^?pqp(xQO&0Gm~=Cx^LDW2^Dn z$MiuIW@T8LIi9K_j7R87f z5j%h6Az?=*>%1OqC)^qS?5Ws1W;jgD6T6GDa}Q@Gt7owMvD4bfpvYk=$?Vg)7}#qR zJ8iCa7|YeGf%In-IXiyCAqFighU8qQ`w$Atixt&?7a{guiH#wonsNm~YEix#A+>5{ z16G6Mc?f+^Qfx!$4hii`)jJZK@ zZy|KM(Abggme2u&u9pzEJ-#oY4-vXYLKC+viA?OW_`_oLOI!8x+Xl1!4%TzUR8AzejMxCna8qicX zI|Cv0Fy4gFQ@FxnEbMU!?SilN3%-t!;(QZAD&M;i`l(dS4-ryh-y;aAv`-?W_|ZCN zb0hXyy1C7|_56ruFZE^M=uC(HvDBD%FLiM;zrAPV+&%p^PEFs+>OEj3XYde+usogg zgGrV2qwy?sQ@65vx-BfL{eCc&1BjdOyvc{J-nYJ-`)u!?Ae*Xe-e%$NUvP!wCFEZb z!W$|0e5)6hSF(zBI%q1i38A-eg{_Ni8WpX^xZ7*7>OEixW!zy!~*!{9$9QsyDFAEA&HK}c2P6oi#nqan#zGU7 zgO_Pf^{w8E^Bp9){-e(yQ|r_`blT+6(2HppCXuejS9ezh?4ypkW8N?KI(NbpR<%PR zhEf9818VWZmE&uotbBwn$E8laP%2uC``=1z0YW#30+%85l7!d@UX)M+LN7=tX~*tB zNHv115mLEvi2V(4A=#)=xluccU%CaB`Cv!wd#bz0#4QoK%ABVkSlYn1JsoOcrqhA9 z#W7sD!Ll&>H3YyQDhsm#wmNi|a(xs`>O-u+#IDBkz*xfoBBW<~c@-?S&~ zcADF;yEHJ6R;pAs53DGsI(S44Zk3>^6~@E|OhHT;&4M4}yTN6pp43M>s;)N*LZ||qfRHM{41^xSrH()Qsf3E* ztD?ja`ian1!dFjK2w08u;7n28Rz<;%NVaa)m`?0hcUVn_u$iw{Olp?O-Nf_`4I_-| zIIbQQHls&2pzn#kou%@LpuLYPY|Vs!5V0X^0YYj-DMUz3Kdcwkfa5)l_QSV#C^-Wd zI`hnWz$uOqO2jo?-K>>{APuo$*<+v*@Hq%*{}38EQc5~A;qW64y+lyV?B!U_S~<8# z)eje0pW94E3k!z{zxwbnK?m?WIqN}};(d-QEJEEXA+qW()PIB@4ii=)VFto^DCQtK zoS(AX*{90iI~WX9`B)b!#O4%4|6dP^m`^xYGxwLQe8?f&3? z8y>}Nf&O44tp|AsSiqT^%U$cG0~DxjP)6>)d|f5#-4~VGR824kjK)I=Au;5n6g3vK zOL2v)@pdc~N3+JNNgppMIMk?R?_z|G6B_%c;!=eWw^c)O*08D!F0#4l8IoSAXf2?P zmb4vq+8%_|H(p;sNZ~F;h+D=XnQIhnH)uTVB_tbWDqprGHnOmMM4?K_r=F*Xm9rgr zM0?2kCGM5<`w$u~v}X}gTwX$mE3lBff>pWw0kk6o_l}M0Xg*KYa{P(_7H+Jw&$YT5 zTVbxJRsCsLRkFOUqPE6j51&7Cw$)IEwD@95e8=O7HoD(PeuW9tIb2A!}9$V z=SqC>1)t`l)q{_!Cug2xF8TD}OlLny@{9g|c4!ReYp-*gyW!SWFc8v!w_m*XW2Z}I zX(}-=Eb9940b_yzc5=EYSN{DyCsjmf$}pcd74g9U#~ZrW+QVpsD7?6(`Y$owRFut0 z^~~~DG5DEOT)of{<4wg}oK#=^^;OMIDz<4lV!WxcL2=5J{n~Srom70@pd-ecifb|_ zuYX@N`GAw^J|=-9#+!j80CBH`Otc%4oiR(tGzhspjfb#CTJ2wc(5#1#7bQJE@lI zRK$2w<#|%Qa@h|skehOK=m0U^RL4pxGujNPs={DlQW-<<#CTKjAvG9aU!c3^lg6D+ zsylRYV!Wxwfa0{?`@4hZIjNr1sfh8W;ymrN!>wmczyN6^{F4q4<4whvDZzkghhO=0 zeyNj6KFmivG2T>s+H>0Be=T|tQ>w{}M&Id(@urf+mp%5jo_XDPCsjw2Av7;mZx zpg4KGap&t8T1={+>r}*eQ{_u4(>5M`xqY6K>i0SoG2T=YC6(zZSAFon$4;s*bSh%J zsZNqqruDw_W{#`%jzK%2BgUI*5-5)5$6f!gJx*Tpbt+=KsW4q36=x{AUTXy!m(j*D zor)N5swtp2shZb(7X*{4Q>P-vn`)}0GUX~b{iX#@s@*yjG2T?uBvk@qSQ$dIpQ-#1 zf3*9aP9+$j{R)%_LJs9aP@*2n7ocQ=pMx0!q4I2s+c?v7qzne0fzMgt$RC~bEw00q z8>x#j9XYDXJl+%z6mKbJAW1O59O>5fz?LBp%1zO!i1DVH2}&?va914o;NMQFW}S){ zh1ixc_me$*Djs?K1(OEm9ds&U6rbUj=uPJ4dj>W!H6 zjMgJM6)}po$mU}xWj@L(o6r+dMNdCN!n$fhuNcU@qxgMQp~G23FrxqHfd!PLR$IR3`*f4R)5i~rS}=i7BL zgdlN7!lQhYaX!ja55+AZhLU~~&i6^UP%uUCDf{CS*8RqjaFOP`(3Y^uo0scZW|8pW z>X$C{#W5YGw$QV6Dq@u8FY)qm{V;VgFkY?tk1ARsm@V*!;kqDs`|li?uhE>B*fQVc z&C4Y-rV!+n51+2F^G_Jqlze#N)~Sf`_KQ_K!`f>@?fVuU$a2PLr~`pEL_V4F=d->Hg9D z)q_Spn6=XK5Tj&HdL?veEDDS>_Ktt{d+3y=?3d_N#CSDUD5=E9&@E`Y7EEwj9 z$_b>sSxPt@$e8yt!vO%8BzV zbD#R#gBT=C?vpgvEFiJ zI&dihBx`?L;gYwUyw1>^6Lz^;JbBTkcEd&)evp=Wc58JRXx`j29fI^7AdkTHg9}RT zcXB^Z=e1mNcegRltxg+j?RpbakZI3X>Quxi+8rL5-4d=4KJMAvf0)ur!OVcqdcS4m z?%Ny*f1)|BwDt3tCod$hUhq)dxvxU3S3fI#BY(YMI7cw|r+@YD-#WSfQFE@hbALBu zUZ?x=s`uq}hF~~fFt54axc(w1ua7n7GgMu;#>_K)oX_xaUM-j?e75J~Q!jkvaF&V( zb+uiJBiIzg^>0yYK=o>DwJ)!;1jDh8r6~FFCn$OVA-X)x`7B>4)*{x+`79sj2EpXR zXS*uA@9t+D&J#7~1|R2jlFHr28ho4^1;aX`ewy!_hvCr3e6r@;D4Y>(MKwkBI8v5* zDDF149c5=4wrkGKl9#)`w@9jq@aZ0!`z1QA>F-zTRKzISuRIbm#qT^6H|LFr4F--Q2<|sO z`YXzAI3Lidi1ChWn?Uhuwb@tFR>82%WaByztV6>wb$YyBGPl}Voop7-pdc^T>Z?uo zkO$pO-Opl4Wh9)VQxW5p@N7`L61MszY!?jYBR-Vee8*}GNJhdlH0O4a(A}ao`#5Jh z2&fduA-L|I{cTJ{hI5PNtPcWmm9$eht929BvkzR0CBG@@7M+S1uYS5Dm3fN1^9SR5 zoK#=asfbaWey%C1@3_l#j_`5!Q~xnU-GaFdK3ngk=N@&n-e)!EZly6-xwc5EG4SbT zm0y3Ckp^#abSh$$gtT2A|8rc<|I(wTJ|3V1a$zz9>=<?qT_Ybb^1&pPPDPBj)nUW8pFBOjR<~6!Y#VHK&1U#1!u}j_rsf}Kz!2+?$xP?QMBK9_%OvEJrwsy zvJJ7p0LOT`c`JU3rH$eIp-x4N9FHuIjo08#$?WEHF{sY|>bw6vr^MkiOh51uPWDq_4X{8CBf9wjdHwT)iEybOONu2Yxqf|3IW(Ve3?_e$Gv zYjp==otfy8#9NO#@@&_sh*356pr>5q{G^BC9wl}PXSd9~KAA5Q%sudj;yU8|wrP&c zztfyA6PXch{V8K!s8p1~o!4c)ye=1v83CRNZuo|i*ZZ3D+mqK%#@zXm;frS!or)N5AG}IZ9S@)G$7dw| z=%o6sPDPBj&3_FPuf|e7ja@Am&IoKj_nuz4%F);eDiQ8#r7_n?`*l#goUitAM&kgc z5kA*I%?HnW!QnhkbN+^pGe<5j=WqBpUn>|s^>DPkw&0ux9nRA==WBhne4V5^20q=- z4wM3EYI&(nMU0}Ittoo^ag`m-x1WU9`XszwFelQ-b$8(dO^$>YXwKJ*gow7jnlY~% z$idSqulMD3qhLnEr{wRA+O)>W>qgD_Mmw)NGv@UzUtTx*^1?I>c~~yy_0tV=?sW3{ zq2_#(uTF3FalXmN`4+)UqL1sfr-FMF=LVeq)(Hc5Ai@+;MDNb+$ykbS1LxJ)Exx>N z70gHQ$K%So<098M_MGN?t15+S-nmUuv6s+A9vabR+6v^=scu7zx98ptinA(sCiN+n z0Ms4b=Qff+NP8>bsyg^ZPF@T8x3vLBF3BQ z4oStHM0a^|GzcbDrA|eRHx()#c^Pet+gVo^Q z95CqTH0OJ)NWXG@Us4T&PxpHCg+@o7H*_juyz<-&inp!aBl3KK6#8Jr`8X4>tfD%e zh>A@}bqJu2n^#j>TwGC79gosdq$g@Yab-n$Ni~j?RQ4mik%@Royu7HSDylv<_ePe- zYHDi=%c9EEq$h4(EEX%SiPcs`X@JrbwVWu@~V=A06bBPVl_3T@iMdvrlmnpPjpQ*UKXz{NuV@t zgQ6bH!lH^YG>xKiLi}1TDK0E4uYw|#@lj9G`Bha#71d=WQL#wsiCR!wQ&U`4RE&l$ zc1k^wiD*$(X$dNq=XAQwmwHeO%BoAy!b)qR%BZO)G9IlejFnVYRVCOsw5?MQVo_~P zX+>d4jR3>~swaA0QBAC-v@nkD-R$l8^DAnrOR6hNiXdE1hqtm8R+d*(78S-yjo==h z3(J57$AUCAxcg4qQHc$*Nz5u0vhM5BwNi>(4e z(18w(!lAEQnj82&6z7a`!0Kq+%+qT(bQ+>$pzP1`)kVC)bA)aY^jTeAUKFb=j20}i zJM^N0`7}FFFkhJ>ESTRY2kXKZVZr>U8DM9ZKwE{S6;;uK1**XEZUogrtFn5eon4lw zEs=qwV4(&zv~KQdfNSksFG9)zqWBSHyEcd`Txjr0MRfIS*`&|mRViD#dXnl`S$P*M z27e_D+A(uxI0k;&T(3lti5%#vj+mV{yTxva)!2ytcYJ%4)!YvprB*XA9Iuqil{&;_BRAPXR@up3Uo<)iJI8 zd{u<{q>pXd195+zfFbseM4N6kACsWp)K|?5jD0INorceNrtBS$63>Ms?aF zvd&7AT13mbPOGD}RmIiSrLlO_WrEKsuAfhg=l^Y`4W&S+u;kqN1t--3;}t4p0`mcLnp!k2M_uwL- zQd=D_j%xdDIH8(0-5lY_3O#wl*>*dNM{CLoON(OV#ZiUTopU{!94x&REHKVp5z%>4AZZL@d|DI)nVcJ(ac#7sv3j015*L?5 z6BT7;)iDk#I<5d?O8+V~8r3>9TqMWV4l!sgVfK~eCK^UTd(V7EbgaQl-KtKQO#gIO z5j@d?M!D=L6P5_bVn>)TbfOG#+d|p;mA>a4#*L_RTjuv0Yh*N$lfc=LJ3AyJj94@` zZnJiEOo`#Zu7P4fT!3~chI7dIlHbR9NADIC|0XZXnxwlH3OdxHQ8By2qE4; z!up<;7Ckn_aVmP!J$S_gA!f)ahDxArH#Xyx@74{hC0MaB4Wg(tT9K$Jj29Piie!wt zW2KpDbc^V2?rN9u*io6cYg9#RDifuN;#duqo9L~yiGxldMsb`hwm2O_i7w@oLKq1b zR+hwKrA37`(SrQqnu7eI3Mv7AE8S_e?R6G9)}T$U>z+NQxT>hCqN1i442nv1jyeuA zMQu%WX=Nf-uGciEb%-Z6SOAYXd0-xJH`!Q&HaB88#iJ#~v7*}2@@jX1`7{FaBs?d+ zV7_}fFRjFN=)By+Twpu41ym`t;d;ZrI9d^}Evqby7h-^d6_Cu68k(GIlD31f25m%N zu{TQ!rE&Ji7TvOSjthz^;&=cmj%mHkEtpRQ>V=ZXi%GqcJx$M)WMW#QW-_-TURYgT zQd2I2e|}-1Ju%FW7ba?J;$=~>xS;f`6U~d)7FNcJtBRwv!{Af_#!f6gIKi045y#|G znkY;p$}wu15;+NC4fc=8j2f$=wO9_uVkKA_DB}TYN|K+PrJIr()I*~>R6t4%p0M7p zc2O`kb8&~$3?#}G=HgM`n!Jmn=x6b=SUDG~`d990vrKlHK^0?x{`ItB5|7pv#!D(= zRi2LJX=f^hqXzVOIcY(O*qoHPN(sDmb0-XuI=u0OP#7;uRN0ff<|S2+X6(rAu1j?C zqIe=+R$S&0%Kj0!YX1GjqJ~_Oq2KmwmGdDeCnNRA5JtMPXi0fxVO3dGSv1~*b+4J~ z(y9=ZWOS&x*{mDbPB(05@7&VUZANZ&I)y0635tOF01Bf!wcb*zd)dR&(k&`4PE?i_ zm&fotseZrcY0?W~iL%nFI3BLmuNpm(bBb$9D=`dJN6+>?QO{456qXbf*A_)(67eKj zP+eA0!e_Rqnmjy_ixSoGqOvkPpqgJxdZHJW#j7wpS5zoP&M%lZTg9`KaWt2Wt#}Bt zCy6;VSTj_XRTV`W${ZX^FM2S|XK{H=6?%FpAJa_hmR2(C z-U1g9!P&EBEm#2BoY{*P&X=fl!{UK%YuuXrigvt)Ytp+`Gn=|$R#jWj#fH-!Tz}SE zQV1$HEZ1z5)fo~uZSOeB+^N4&D>vr;V4BojxS~hn6DM4B+yqN^-VDW=5hlWMI0q`~ zemTMzZVt}$;c#BEYb%yGZvHJuhjVTC5y$Pm#lTf)Eagad{?shc>wxLiIBx%CI=AUw zU>-RPztu?p1Tc|N2*8DKW#YF6n0AfJB;RzTKNpzqXdKI*PR|r;kH#P%n6lFsT9XyA_xp z9ERUi@cS7sZ@X}ru) z)jwv9#n^+3E)zdCr%H_xAiPZStp~3AF#P!1;X+_e(r=HCI0V0Ifw@EDGRe0R=^p?l zI1T~0!MHNXHy@Z1jmyMu9n#kV^8<~u+jGD1p7r!=jX_Xcrg80g;Qpwwnet^jcn6rt zCn#Qaz4gnNQ)QFJC?w|(%tvYZTMuwMH8xYe|3<{ufY~)(apND+U%z~**OyK-IjX;s zZyMaI1He&#Zw>&*@%WDe!10CQ+XKL{KHnVxj{M$FhfAa9kAcgYfCO-v^vvoXt}z0H zm#Ljj2kw-^@Z;Fu4#V#>q`w20{}}+kPk{;LBLQ5d@=ifqE-;HV z?ojeo19R44_{{*njlf*1aap)e*G}hv{;0+vC@xd~_&ac4YHX%*aK6l*h|eu?(b@T? zX$PkRvq|GJ@#_PRZeY$iN!W>H_jKi8dl@oGVT_-yzfrFf2Y@5LNdv&K-Ioji$9&@h zz;RhslMa_ge@(z8H8zv}7J}b4U>?-C!MIPSKdw9frZEVL%hV437q}x>(QujaWxE;$ zOqs^n<8zvF^a69uVfbAEezyQKi5&&beojflF9pm^8kb4F1bEyD%qJQ*1oxT7m!(+5 zRN_l=Ng+S-_yZiKQJdy0JuYyqZybU zjmyN3>%WVE`K`tsY8-kOn13IJUpM$=;o;|8J^;aG<4UI&(x22A;^?Be(X{jQbHM#U zV>6Y5(Ffp#IS|4fsvMJnS)_59_%(t@44Cg~oL!DI?eCw!1ZPUN8QTlxI}(`18h0r9 zs)0G{F#N_q@QuJ+da}xw&sFL4%yI2RPKGX*Zk%NKqUmsH%3BWH=^C3!f3(}b9+>a( zfdy_Du1x*y2n-%$IDo)q;&%_?CIa)E#vN*06C>}!O?jF6TNwK;`MBsZ<;%yDnZT60 zaGA=n9GLYk9G_>f)$@PFxw}_E4~hRX=k8)J^#91QyZw$1gSEdd9%a!bXMAa^e`2LJ zS+ILWe%A6$tY>AI4~H}4D+9Lq3BafKvmm{;pFvxX0Y1bfk#=prL%%qYhveKA?$9U$ zu$*L-F-Ja@gsnLIT%j$8f27bF;bZ>-vF-44aD}XH_(O$u349f6!IJaDrX>-pjyScE z$HqBG&Q(?L)g$;^ZJ>E%PX3!09k7 z)_gf}D}#cQCA0`W7cgNf3ZKhGrC=^FmB6bJq8ns|INXX^yCD|pKAY_%+qPH&HCPnI zAv#08$r+NbsuA1XqpduiZZe|nKc>RuJP?C&%x1IEoPtZ8UAR<2)W;GDaUxN=I~5_N zyEsCNB^I7_COtSKFEy(wHfQ%`BcNlkVS6e==N)O=WZj(%1=zxtX`{l@pL&8Y)T#+Q zht;5M3#i=QD#8_(gKe3UIxa%hUm5OWLW3tq0`qUs%8~jjM0f~}Q&}8H4()v`JKDS0 z>iKLh5$sfMSB@K{ado0>ZoM%HdLcW0_U@aAZkt)JPYvb45j$V+8JXI@I}x}dJG$fP zo_|eyeD~NzI6~rsmBtdRIqJ=>9vt)0Q{bwP?Mr8h#nNOJ8d=0PmF;8jg{jcV2Xl>~ zPDs%E`QV;$UUs{`5*V>#MPFZ^I%{^Xt1YDV^Q2ih>_;h&4Zjvw$f|;`#*aFLR5M^_ zP|ctXA=M0aAf&p`l?bU6*CM3&-HcETuCN%?R%w5Rd)07$hmhiefEe@U-z+Of`d&4{ zsDRM4CwmX%^aS?SCsL)^ySL@kCk_yXwjzoOlxFQZtzj=mOqDw$$<^&v;AV)mGS!ZL zD^~0l_hfB5t1fj`c70o4o#vN~gTunV{1TeleTO`<)~lFQbyn(yX}^t8z5gC|QD`w> z=MD?NFRfkr(S@(AvKfd#)1C~JWHqc_d)8hyRCWwyr&@*RtC0}_tBW37z#7bv$~ps= z9uIZFljHi8yRS5B)vnXD$h6grF@_nb!c%TCQKOe$IDx$yZX1MsU1|*ur+qycr#^Dk z0d1+!?yJ~Cs+K<1JwY^{9P8D$H{UB(TB+fekL(MTpv^xnt%yUL5`u$-BLp80=y0kJ zr!cDt7wUCIes=2dRlB4z6zfah!FkrvP_!Mt>a$+voSBwq;{x%uN_u)T!Yp z)7aD>roDE_UaAt=E`8~|$&ostZ~ z0=8?M7BfuE>o86UUcL8dNYR5UEC+y}E1@X-$r4%vUsVHDlN1`!PK9j89i2JyXA8n= zq=SrEyAwIP%CmRn?vG{>Bx7S9LvS*L;_p{*K@Vt0IlFr~rpx(XdUUsC-MuCla1Biu z=tjCmrnO>K9%nXbOY#N@h;1x;EY7)|SZ@FZNvqzr`S~1>p~z zppK^CQYT+3jaA~lS7^)OUn(JLQN^B(kcy=)FOk@b?a70o%H{HYtOU!EOGnV)Dc{?_}ci(gt{Y0=MMqCT7h0yzF&8`ASzMK+R%O*M z-^A9jds{XpY&|35%(vcsxpQA!`kP&WF?%MUp7xFbr)zM9WX`x+LgnzO#*jSVS=Ks) z>5OE2Y=G)CQ!AkYFl%ql%0jEntBWSwD=+&zf$0yi46FAB;j@N9vOMOrqzq82e#B9e z(|JhNifU2Kv2!u5u%$l#qbYwm35DIovic7VH-I+8y5zlFXyJAOa2WB9e2xQkshji1 z;_s@|kL9nHjR%}(mF+Z%rS{QHABiv{D^fpWsRJS-qc6=$VSN zVO9;QD$kJnM(p?rNWGsA>p4KZEYt8YBX)ipbY!#Rn@qAIKMyqqr}c`#ipOT6kFFQ; z0mdPtcaA^~buO8_iNcg@=bjNe*J9T6Bt*+hT`A?)4>_0YqiXhggiQ|a{d`Q%dn^d^ z6M^meH3LEdPhQiNuu3g*K>H~ghqXRr;B+=zm3Neu9H$)SqKzbrq$s-e;J9{)ceNh0 z91&bRm4V%Q=1J>0I80bzWJx`NGO;dsl9#t!Ly)a{e&cFL^~Yj_eu*n2eNPR_b+~_2 zXlvm=BB2N1KP;gK;r~=ZPrzqQhOA$~XX^^fLCpUxv_HUC&Gc=Aekine;omQzFX7)O zp&)8cr5%lsdI~H>=pKoseaaq$!q#ep*w0`m9ih90)`8IXgth~ryCifSLX#!-CWKUn zx&tBAp?DOM;`dX8?vxadBBZ+3;|M94pGHV^tyk^P2M8(o7L-+J$uo}b9N2W^H@sFWa9{i<9I-~ z50{)%%khrA0*xrV94#tKwg7g;^LadXSQ>|#$1(fJkjs=IQHD|%xy{0b)`2Cg;{P;BYxQcU!qQ6}@Xej}B=gEaUfHS@F59&tKYRem(D`!LqRH*0x>a5r-krQo!yWS) zWDSEZ)FJJnfm}|sC{DKBLoi71MQ+&%d+5%VHUBF}rflxNEFrR)LJuxW{jpxcUtycY z1JdkenUYp@rrteKJF6UIH4I5qGho%QsfOf$B-QLE;Qn=?;WuCvMN4=voqYzpeET11 z?TGMG#t2TW!>4SK!bF8U7?ZF2AX~Y$evdzxxb*&ts7{|gm(1Nni0aeqy-%*)%VM!e zAz35+1);DsJ91Gc3H@1U@T6|}7b_*vFuPj+!{#}Wck$WwLa9UN^aP%AGZ9MPTJN5h zP^k_5cZM*$WqXFV;{34~j(^6CccZoBE*aT#+>RHMM_rK!ELj%l8Q!~RQ14@dcD&g0 z=ec_h4#v?)ul6Cc>AmgwTLZ`w?WtZ>k14r7PlAwU=tIneEl?!&OraR*wj;8a3)Qsy zRO1ml3YU7i`2wMk^y;xftAMZib3H=;lGwB0t6i*CggzA-N0@&~h+~&Z`*Va;+UF4Z zP-5AP-j@(7NZ~$1Na5BuHbu<$l#vM&o7i+FP24g`ZKxDr3U6=6uYeQ{$4C;7FNj-I zJieLT)Y)WpSUxuPeoP;-Iu2J*j(@=WZG`n>huXMOy4G6+e1@6qu7iX_b|nM>cjQu@V6tR^7#?SZaHU4Hau8Erz{9 zGGe(Waz~_jtEF2gInv2C2DvENSm#PM%CBUj2ppP}Q(c8a669E^A1*J<&oir@_WXP~ zV-pkhskTyhh|kF@-Ftsun%N)2Eh3L{ZCc=AlSf49#HMH~U47jt8nk^D&+!}q;b?I; zEL(4<;4Ul&`nXzSpsI@*Yk(ha8`r3XF=C_P+=kfVnya7P!kvSmdx zLi9i_WV@RQdKVWIY(|#hzOUXuAmAssU6pgJz$$Kh7O5PHL9C;JC zqciR27+c;P*|4+s<*>2T*E2%t*lftDF)LQz@B@89f}D>>1WnQ!#{;rYaF~G<7=e=z`V}WNJ;ws3{yQI|GHt!x#|8^Xn`$-(ylw?LH^K!F*&P z#_fMidv4bVC~xl5@&~}Ygso|>R;zVZ(wfAm4l~cv%9|`gU~S>+XK${^&wcIhXk%}_ z^T)S7-B)};Y5kk8n)!g6)pP31nb8Aod2eD((I9J*T*xp7d56Uu`Ai8d1x+cq7$K!# zZXzlgpRARFsYs>ZbqF~M#*Mgc_-b7FvaKd;mGn*Txx4wDT{5;>7z0YD z6{wU|hmfPJM%>Y17ff2?sfSb&TjHUW#PnVznGqqTl;qwjyfA<4&i6;`;B&>?*Hil! zpMb6OJ=sOQi?EfhkCt)`T^Phg3Yhf|!#q~84O_1#VR&Q4Nx@B4wC zj|flIX00^md~x?9f4O0}KO2(}xb^(J_vyZAzqVfsqOD=`oUN(`N>ZmZvcIagNmC_M z4qsI-+r64vnh{bsw)HAWyA>g|sOd#WZJu*Oox@hxx*ooIVB&HqDYTd1D;%3exm4ii z2&ojDcvNou0bT?@q-|+$-H?pn_n#4*8`aa^ENdaF0Y4@xE@6+w`*WnBGaK+_xaXEe z9{Sr;;kWmhsk7w)Hyz5XlgM0CPHd3)W1fKs9&V2HjPNx;NV}=md_AHpmcoF z$wpmfp_KNUfZV-D0n7HT20^Z6=+slZC7U8cEc|e1bJxt)rlDJVtv);u1g&UGb7OMm ztXW8?Dem9ikQxl^f$w$tJ7SLLGSdYEH+uoNbN}XsQUn9L;19z!w`?Vzp~#yqOZ|Z? z5#i;2k4cLAH#Ecs)%skgQu*^{yrvL?1`D@He0u%)36{9^`; z)A@}vzH~~_t~uveq950H?(FBmfa;Af%s6WC3zn{9bwDqoWh_wj{^N`ia`EMrFvlk$ z9}a_oGvQOu%}?I_TSvlun)3*e5Yg7}Jb97wwvWQiOyx{n^m!<59da%0m2iYlLT;J_ z1FPV(WlpHSA2a((FXy9uoJR@fFYsC4PoCY39U`Ns1zP4&cDYJDr9c8}g-v1W zaF^>C#Cmfd<;$J3O)xMSKJ)y=H;zKrH@UCZoJS*fZ@HlQew;`9I3Ft*j(lwM1ylHy zpyAx9IUg&W5p7*)mx49uE`{tkd5i%b>&uIqGr_=Y_+%5`cN(6sOz_+)d0>$NM->5X^S?93{?J_4}_loS)I0 zCkSUmTff&7%clI*LuuIDym>>{`Gmstubq6*ygHoVlV_q}*c$2j-n!wtjy#{}ye9fM zp9HLz^F$x#NrL%4e2(u=yz<+N9nM*7&~TINat+rMr=(+il&KzyyM?p&dF7eplV^%x zR>J3uefK}#UFyiQP;;JQ%TtswFSa*tUQ>K|q4NNUYV!)Waef zx(TQ=MP|1=Crc{MEOhf{odkkuqL*oTh*7jhJ>_DGXFU{monjd6C-Y37%p9+R0lvi> zkI*Ye)^2p_)ErI7L(rfN*Q#KSq+%ldd9hCVsZ{@&mZ9L|$9=hJ+g+4sHL@E?X16%5Bxavt>Jax4KTb3=OrUXFEcK+uYU zv+72RO*1E!QC7K!;?`IpV!gRXedUS?hNBs)^ylCIIIeT=YV2s0y!q9x$$f=4FV_fA zBz)M%>1vL+{!SyGWo^)@i1D_TVo5xb?$%!<&1FFZVLR^uZs2tG;9gmc{{u==N*QWs;Y>@024p7%(lox?%R$9c}zp zry|BXCR9i&RStahJ@pT#JEh(;qB<2Z-c$e~mFeAI&%PAd znw)p(RK$2wp>ZIU!A&XM_Pk_TNoAg4|N8L5XqZNxBehD1QM4kXB*n)i;WFWq z3*WSeTAzf=1;c(paenmQd6zlpWt#JHaQ2RM90k2)_aCaYLNHgrABO9LSHF+WWaL<* zIj<0z5p8Yul!BD6cqneob4BOPeTA=Fs{}(WkpRPE&#-B4J75gaNtIJM*-P9kx`P8Y1@wPGUEqLWQ-6szg zn!r#hvbplwzrEtf^MdBQ+E>ywKF*nr*`iL^(%u~M-1`paKWols`8cojan5wiRyUB@ zxMB~#|B}P`6U~{&Y^fGLgdlOGxW}<|pgKE>3S)Z8D4mKJMVsN_L-bOcLX5j5G$Pik zdH<1K>jk6M-q?ls(Z>BwDM~cw^*;S@((-a%@2k@$!B7UWx!~Ndyz6jYsW~_KI5+z^ zH~BcX2*$`9$-m&64(CmpbBmAjMjz)EALmVi;kzJ?IE^>ohou&7#GS7>ZxYTVeN|H| zm6xlhv?A7-FZ%Xx_=BlG%QALj@{|e6x%|^q zAQlzvbTkLr(b8$Gsm-Y>FRZRCf;sKFv^HpAr`a(RJ0Q!k#=^8nncfDmn8rKT7=lzP zfIU0EfnaS059Z=jlE(HPZ6eiYE)hmrjqzufB~_Hx;h~M<%1;GN`C}!~qF4+D^jkzuOdaZlM8<NYe(Yv?_&DxTb6iZU-zU0YOGj-Ji$y7kbY8OWF3I@{S*#YKrkS$RpcTY)rv zZh4|OUQ<>JBhC3Gg}R+{oY3(LDoVQGGe?%|U-nuCa3}i*Z~-_j(UTgw;jD zA7k#_urGpCh4HEwvM;WYFVb~tX?;E$#3Y#Jr%DMe$^*C2T6eRfL9uvm*E(!^mz37R z5+%kt`C6KTqU(EU*!HAl_k#JYFw4sxrv}+L4ZEVhB=w-vm{d>M(lI?zX{^K7M$2le zt14>?%cJ-l7WT`#H}-69#<>D)M#WS&h_u%W%h+Nu7zVNt=s)0SZOyJNOH@>s7gtkT z2~R!7YNPRznzHJeVi|&+g#gwLoMFM`Pd#F4XloiHeMHR8asQQrClgsRqQkeRW z7ga`eQ`3UQ%A!T(IOC!m2Z>}ZXPSbkF@;92Jx29m0Uif!)YRgP2&ERse*3I~`S@g4 zN?;5uOHGi6GLM~X+^EktP~64xaZgiYve6!1n$PKJ)B`GP``ZR~rOgT4Hp8u_3!2^6 zWkusDE-$I7sVd9`%?E$BmNTIn=;o_FoKi zoAgde>@iVD{Ia7%9~z(u%^i62s5o;BwT;!9s;$M`SXoh67RT`=`1*-fJUiJM84yv*s*{IL@{SJKv!(WZQ(Dw|MSsiK0!|o2}zv6Se_cnR~e4 zgL8kE!uvhAl6efdTpF9OHz0c6u`UdPQQCxct@IhY8`rZwTr}$bzJj=IxX!>r^mkm0 z!cn|Twov{A%ttO=$DOG6HHNa$W#V@Vc6j5s=rWaeB;r9jm=bVQ;>cKF!#G~nac4~VD`Ik>B_<8 z#2vr)HSSRDDiFcjBV2TuAo~bHCwV5$wp0=UrxgQxSJGFsEwV zq4+HWrtvWRCV=1Bz+C0RWoidE0CTqsm#!TYfZvaR`AFlqUz3U7gcI@gB`&%Eu5|pk zSAQxnS83d#`0WAaH;3UD1;5_|a~ul}cPM^wVAg0{Ci&)qM+-1FYTO{)r|ZAm5W8Pv z5EPfmw%&ulJ)yCg@{NMS^T3Q?gN3v6P1CL>05ezPGVz-P9;X6>Z~4U$m#N-5fZ684 zrK`6Nq`w@PPc<&<5d6kX#Ci%BT_*Xs+qejrJ2Z~{K9hW30yF$1a?8w*%_I+)B`#bh ze#OA7aN*LGm(gqC?Qr2T@w*C`Z@X~m_;KlXH!zR6aGCf$1I+6#TsnT#-(P@P#)^jH zo^2+6v{U+o#$~FHqmll3jUhj}O#J=_xPSaV-Cb*VRn?i^hjS7(5aEDPqK#upQ;UL; zn@Wu6i9k4VJqePapfQF3!9XB6hl>Rw9zc&ne`fLQowe6~*ZY0ze%Xg_4Zz3resG+8v}yWD zTy%x>Bi}h1BS72=>6Zj<@c?`Y#J>iZ2Q;p~_Vy4kPYl4f9DL6Ja~=m`xc>NN19OGO z6-sXvIFUSDLxpalf_e0=L;D<@LLi(}3jMf+d;#P=n0&s}|_}IV9K2E+4;5HAy$8K~dFyGL) z{_^if!2EImz9ry$37E;_;em_dDwN)OU|KY;Q2t$j_}2pS6^-jpzej-i=>UAy;QM!A zO3sD{u0OsCU?yl>A^j5IxB!^zj)QMEF!v0=*9g9^0rOD+S1A8%G|n-Cm@fx#ef9S&{s)2i4~^?D|NacjhXe3k1-`-O;Me@P==!TKSzvD0xI*b& z0gf*M6PqA({qoUP?j(&X#J37G7XtIu!1{d=n7tZTNWU9F z^KZahG)eLGR~`+(T%&P?_@;uU1DG!daE0p2gTVYKfa|Niu>X4!m{$Y1LVSmS`JVu; zFTT~_E5hWsixXtH{_4xEz}%;Ch0@FM@*BX!xuAmUFaIimnWAxp_$cloVAdT6-wt5* z48WHF-@U;6PUF1v=B-z$_lFt-ued_%)nmYoI9Fi`rGxe06kzHDxI*Q&1ej|BxW3A5 z2>3D@qa+s|7q$YodjP(-L2?%`x16WghT%^k{oV&===lm)D7|sKE(NACfGfmT1*Y2K^Gj-`X&o>75DO zB8@GSFP#22=kXQFmmR?E8Gw)d!M(@H_b_lz4#3v{zUP3c0ed z%ZE=7|1WHmJ4pUK*HGyNOH*B)E4o@%ug15@rTF-CZu7+EDa{KzGhMB1-4akWaVdU{ zpuPMLaZ4N8I@)lm_R@})we3}Sho6{VIMN!!pY@FZ`H+nf@9(_!)~?R(&gJQfu?=Td zEWn4Z)$P~OOwn}wN8|Pm95HBB&ds!3AXc!>t(sUh1#i}F>S|xH5>cj~SuwG?ddk_8 zCQO)0L{(?kit!bxMbpo2Xz#4399mhMfmx%j?h7g!swysR>&kSubhNMTZe6))e8t?V ziey#AvbKu4_7$17_O7;NofT(PG*wkhhxXl!yr^OB1r-}MY^XxA$&4^-$75Sha_UR= z9fWbTK}Tw8?XFc1v%2(7qt))MgYhC-Yxhoj3s32}(+=~`+43%Zx^ro%Qy+6iJ;Imc zo*ePeC4+08?0Ib8tKb@G_d2!l>|@9_-1XnRG^&v?- z`o@kLc4U&JHOaA=n3G6?GUnJ$ZAmW?Cux}bXCyp;(+DkWo;tO#pfV{p!Rd?s0eHqwbg_{(lxL7gPc=^_6Y=js;=R=5IKPWiP7EvGK-Bxlql6J0}G8#UVG zEmVgU%3S0?t!)FJtz)5(X%end$pg-0RSr#okIpsM%Q-W&Q3X7%wq)PYm}oLwP-<~Q zFULs1*)R|Q>w%lkby6j$nbBvfQ+D_1k8)6Jy4BfeADBfYtVqgsHkL%+tKMjLz1|FL z^jTDxUc|`mi${{S2$@49oSQWl!Y^5)EXO;)e2s6jkHu?H?w{C|JaQ-sYZ*>FH_}PP za%d{`Wx0AA@4*R3*B_AfBg&jS>$*xYYY5#Su^eMrd^Ux^yl~Ak>nnH7KGLLwROc>m zHpOz+#hgucZc|zIjd=F;c+E2#{sEaW}V3NZCq_T z#)h9c*{Lh7sT-Ra&ZT0&2;Tvnat%AvnJ*m!py;+^>_fszZmB{$QqfXJH-Fqos%T|U!b!v&YkR6FJ*?hqbtTM9RCl%^ zrbijAng^eN0yYzdZHsl~d`PnTQ5>Gc!U+GmY|Zd1HczkYM!PsO+_A3TSZt+>AC3Ug z3uBPJevHp;Av%|bb;IY$z8RM!f-0ImX;(>Qy|V5iMoN(6$K$=iOOKy#Oz9e2ejmWv zgI*GM{D%Zwz63u9(BK6tkCz9eo(4X@r6h#iZz*?$q^W9{v|+|4o_#NpDS~;gg3X#$jLxmqUxYts z9n*0;eYEUY`Xavu!w}txEJ4(o;sZhirndennq*hW|(D_Z4v#W38QpQui316wjAyuVdF?`>Uw@Yz< zP<&V8{w?t>!~N^xTZ#K#@!@85@CN6ONneBCud!||D$bPX?iw?}xY=2c5e~mpzh|;I zNjv-cp!D$U>qXM#IhfFt^}^P&-;I)l(?UA8emnxdsgJEG@*d$fArYa8$i}keFI>!s+ z{NX1Ob{X!Ei;u;od@QynB$6`}4SZwMoJVvqgB22O=hJ3~hn3!zBjx!tbWv?#`j7DU#|>VXu#5j)-0o3Z zZ{~C7mzs}4a%Va1u?4wRvXGcLq@c;yn#gSnh5hCW7h;7aVTxK#G+ zfsYP{H;v-ozu@xP!{q0xvAzTm8^DM?`*S0`O8ZX)!?~6AUHH9tT$ScVA|Bs*QQW5C zM)@EZ#an)2QOg(*UAuO~9s8aA(h|o2OXs%42s|P#w9;eF>^oBLuR$hfejT8dTk*)k`dkQkW~0*Eco7 z+~Nc_Lfr<+Rqik0%!D;tDRMS^szI_(q?s|L(h@u|a@0}=U$_<0XCfW0CADQeq*)#V z3m?qovG&PN`Y2D1-lz1EPOHs*$bs#A$CHw`wo)SUmsc#|GEYo3p6J~3%0`Qrf2dz8 z0*z6T*{{(WvdX*!p6J|D$WH4!QAz9_W#1@DV?jPBUBX`MmYX;$J5+*=tV``fMVRuS z8T~Y)PF<<9bGF_fqkLJv1T&Tr`Q4Y!tx2@0*hhA97%xs&XJ3z`r|=d>wE;C_s(f@T zCzWIsek>U%Om7tn#Zc6jl%QELJ93fy+$YmY-r!ta#`dkte0x{@k%sKPgI-gqvk#(@ z29w4Xt}N-2a2#)NF0nEh%+cZ>X)f8<;{CK3>>3noF>|4Vuhms}3bvTZUUFTN!@31; zwJ~H3+coQ;d&r{GbOgH_3*OEpV@}giY%QTQ9w8O_-0I}f&8IqvBkv@zD>Bmg*!DR^ z>7m|fNZeF7=o%eX4Y~sHXe6}M;-sWneDGK+c!R@2S>^*%1L|=pijH173TFe=V^1RHkkx=hfcG+PDgc2_jFmirbQ?^0k;{o_<&W=WqQ+zUKz2NjI-saU;#B%F*^ ze&qb2dyyMC?ixnNT8x#WL=Tzc>MEQk!C6XOooCRvsCoIg{TMH8ysW2X;kZ7&A-B1* zLJydwNJ=x(f(=WgWgXM9&K7&Z65s@FS)xWzJB}y8`p3N8+H0pvT3xgNB%VCLy^BS%o#&L2venCC=%1r6yHZ z!slmPU}g(#EbD5~i6_-?0*_U8E>;O|2^!S6RK+T*fv4eME@9V8Pwwu`mG^Q|%gDvj z6Z?tgeg^f5;vZd`7EmhfcRc2UML%XZgp7r}N*WtZ(eiU#Phgs8;@L||IgQVk_HtjY zQ>1+gz7F`*2_)BwkJEU|O5ox^6tjw`fVD~_bFUJgdeFhkX5|>Q`puk*JTAcs7%AlJ z-9506vZP7(a_=uA?Bwz*E1$68q_|N>M?91$?q$#r-r(>?+;uL*<_8)~3%lb@Xvjwg zkGSzW0JvKV2bvGmB|gM-8r`E)HzQY<(1+XU3K&z5&ej?G4iEMG+x~P6*{dJfPtTvR z@8HmyeH(`0OVl&D#>Am$Zfl}?eqzHM_n^wy^;=J}a9~zlqNZ-f`qx!l>2qAx6!NMJ z54rg%Dzo)6sfT!OybRCTr;jP%tvZ1P|CHlR4yiA;YT(-epR(vY2~VZg^SIw6Z(oA% zM)7g-xl?=x;oC00|AH?oKIX&?;(HUmZQ?ru-}T~y$9kJLICrAjgE!K-#@q_ae!j0A+hb0V2K+#W*WHsl{eK=c|Q@p zdqhFb5x)puv9%OF=D*4ns~cXrLDnE?MPCrDQ8PGla^EiIq_7FcPgaRIR*O7j3g4~b zmHY=2L1esq86r=5CAg8`^NEq1>5q!w1->vZwGAh}67RC-Mjf&fh%{6{uX~Y+G^w8Lu-P}0hq151-r+Vh|Tl(CH{V>T6 zoq+~hnteawtc`D;Qqx%3bB;6PR(xf}m;qgGr7ozvqn(LPlbxI7tc&Hk^fDb2pZHbH z`~uw^SfE}AQeSCzGT<(s*iWh%42RM_l(w05>|GnvAA?q#w~Tmb-Qb!Rdoufe52c6N z+|;uUjiJKp;+vbP@Dzx;Is@XFLX}Lo#I>(%Uv#?>+5Z2 zf&10aUV;ho5O=1gKm2*qIvfJlPujR~?N52Q-Ad=C@`sYj|2s4AcPVj!d+@*6vPncE zyY$;Vhadck59H#2ju@DSNw;lG%d=jAM7H7y%3JrG){9LP`slc?Nf)y!B&IszN`(ne z;6LYZGz}Yr!Ptthpe%N((TMv~i+3+S;a*?XI89qDvVuPwW4jD97aPpBV8&>UMQ?1L z;4^d2h|UIc*fb7@;V^R{BkQd|GFOVaz7F;2qf4qk0VC^+b%ptB@)51)Agh zdmrBE%UY>JOAKbNC&J9833JYgqH2E zhV&EhCMRd=IuC-E=*! z0`U`~{2b#FBFucU!CWSoTHMKZ-j}zaQMt^|AcU^WVCIk-W-c?B`Q11gN#RbuNAF(N z;WKkWKzFLa%tc(7`Ba0sTrdye&OYkY?|lb5W3JAxA%w16nCbf)Z{plij=5kZJ@B*C z(}0Ucm~V71^wfOY(sczNM|3P=!hHgFj>0;Z8#;5r6pe5Tk2D?2*3I*Eo}rmfSNa5c z$O?(Y_M#zHA@k(S6V~bn4xjTYAH7gV`?$f(elM(ZA@k(S4Kn|w;&gO=t{zuvk8hrw zYbDnqe*(E$iQuSb{cLObkB}hM0`a3`9gCQ7u5wBf*3dLq&e>oz!nmZ_^22)qeH3Sw zbZ1xwqRmLZEJ9+oxMkj1rNG{QS` zSUR!VL5Ho+y!P{^uOvBz21XGVYWz}Rh|InAEPWrJdx-s?s5*EUwPNvL+d_Si7PTB86uAb3=Vu z(=_uGkrixB=SnOaci*{c%+VfVl(*G=B_Y8%5*I094W}3yo-de$#Kksh>EiGD8m`vN z=PL~Zz1CEN`Fw+!A4{SUw!{do^NP>G@Jt__dw4~)!OSl?VV$cDW^M{ZBWrNy=P{ z8cx?VBVBCQ(a0FwnR72(aTvq0n}?5S4KJ2-1#>JRv4W%3#RhY&VAyYyulLN|>wV^D zHFK@Oe2KwaYcNk23}+@}KJk@d==SKNdsQ<}H<(didATv&V4f)$mNFWs_2}XBPkrXY znt7%$yQQ22jJS<(uR^B2PXvvAWQ_*P1 zT4cy-5)5bKbTzN<+~UjnzGiMRQo&v_Toz3R^W}nZ>*|YB)_3~MPiW@L4dyEh=F1J{ zC4w1)JKb&jBYS=3S2XhygLx^iVVw(^=;qv*IsZiYn6LQEf7Z-bdO80;I>gNRs|;C% zjCM;}fd0c@$~X<`yp%l{&;s z#WjYk7Naa$1yikMExzQWKv`62=2lNuO+i`93|Xy)tTw?Uw5&Hj_5N#qx{{i?&69O` zL0Rm1!g<(c$XX#7wx9^EJI|bq#VCDrt(tj-$O?|;EAckWyux5^7Yvc)yKMK>@A}Lc z&D?GwU>W?Rxn*_@iv^U zPDA=S!ANey*SP+^Z~D?-(9Ft2H(p!6FDR=^c!DE{GTI&7r|lNZ{k-FvaQWb4zO2KV zx!cIYw87kMq#`4j8*yh%xMy!q!e@3*PRba}m{#WHPsU*0AegDRM{unl9sRb?JiG`& za2te~zA_!6N+;M-HsWo#EH)UjHVK9!2xV3N_x;Ew`kI$F^M3)shyN@KS>d_gbqEbJ zZ!(xaEf}f8@RjFMzx7k`39a*|y;M{cOvPqH)~5|w7*L^)JKMSL@eRNBQZe04#ug(L zTMgzd26K;KCgaXhe){F7YyDJQpmpw%R0MPWdWjXRnLP&cHo+u#$Mvu0@Bf9*T&J10 z2{T?>sZjnfWO*ngxDvksZ~Y@>!iV0h)3JyNuPd_>E2#4}L+9;+ackyZhrYSP*ZCIB zyxr6J&aj4o89t)r)t~K#tet`xf;-)TNhvgohX2Zftq8-XdSQ0g!jDRbUN^Ba$bVEIkF2CPG|T^4^+G02KnUldeh8P@ zNiPH*Yi}rjxJKjZm}Gt|3OhR#G6hc+!H`L0eqM)!+i4D=;oP{%$PG+<1DGWrP8sdz z^P^hBn$e4E?E*fWu3HRQ zy9LvYJG=RpZ<>H5kt^$U&AeM=1>4SNB$kWA0~}jE-QRR9VpLd3vAn>oBCj>wimy4a?eN$oiaM=HpJ?S3hxIjW4T7 zGk*@U!gc;GgZXm?^XCQQj@`F)S1t3ImucqD8~O7EgZc9Y^WB1Zkat|)>3IO^Q+v9! zX1?2C{%5=m=f>T_yd5#5S889z|AUM38kV(foYb;RS>j&Myr#VaW*6F8)6H^fXKSXb z3;$(GoM7S9EpKbbjl#>itIlI1C){(9yQOO&ej)x2d1TkrF)d z0Ok^A()@nld3tkqx^1oE3mk?ahhKE+@Zh-{!2>98xJ5@xtFq%iz4@A!uCDgBE_LX{ ztmdxFny?Z2WMcaCSu^L%oV6ga1{V4`%8OO~!2enHjhW{kP2w4lmvcyzVS1$IGVih5 zHEce0_RLFD$>}K(qAbe$2fVa*w=U1DX-&6xu2D($O~iw(5vOAWEWX2jyn8kRUg9Za z*`7yd_;&9Xc#jKURYPik|FW@J{7^={ffbAH^vV{cLSu92F`z;rqxB&(_4x;Sq&u(a z?1YgIoxboHAxvN}NvLccZ3>y>A+lbiyj;pN>JOGc4Z_n}IaEZ|aVa@ebCpz@zz=3= z=vWcvDg%Oc{TH%+GQf`?)R^$lAvX(DO$nZRBOyjWD^CN-bg9}}M=8^TArdK+b)p%q znS_g-!NJtC(X?FCp?Djai~b{@g6G$?Y(Rh{OtM=gQJrL?j%QJ&kXfzXArqO4%EnC~th0`TO>=o!+an_AK7oo4CJVem4 z%xcw(Eo%0>=<-@nsyfZfGaVh6L#j3_$7awwOPzVKx_gCsvxdJ~;tLjn_BP|_hSnBO zhrW)KYIHF|k1|59*V(EM=0P?EA5plWswPcAAGFbu+1Q*}t85;)RH0{Zxz9uY7vvcy A7XSbN