From 3c679995f57ba19b5615d1bc577da0159588f2cb Mon Sep 17 00:00:00 2001 From: walter Date: Thu, 22 Sep 2016 08:04:16 -0400 Subject: [PATCH] Initial import --- lua-5.3.3/Makefile | 114 + lua-5.3.3/README | 6 + lua-5.3.3/doc/contents.html | 618 ++ lua-5.3.3/doc/index.css | 21 + lua-5.3.3/doc/logo.gif | Bin 0 -> 4232 bytes lua-5.3.3/doc/lua.1 | 111 + lua-5.3.3/doc/lua.css | 164 + lua-5.3.3/doc/luac.1 | 118 + lua-5.3.3/doc/manual.css | 21 + lua-5.3.3/doc/manual.html | 10910 ++++++++++++++++++++++++ lua-5.3.3/doc/osi-certified-72x60.png | Bin 0 -> 3774 bytes lua-5.3.3/doc/readme.html | 365 + lua-5.3.3/src/Makefile | 197 + lua-5.3.3/src/lapi.c | 1298 +++ lua-5.3.3/src/lapi.h | 24 + lua-5.3.3/src/lauxlib.c | 1035 +++ lua-5.3.3/src/lauxlib.h | 256 + lua-5.3.3/src/lbaselib.c | 498 ++ lua-5.3.3/src/lbitlib.c | 233 + lua-5.3.3/src/lcode.c | 1199 +++ lua-5.3.3/src/lcode.h | 88 + lua-5.3.3/src/lcorolib.c | 168 + lua-5.3.3/src/lctype.c | 55 + lua-5.3.3/src/lctype.h | 95 + lua-5.3.3/src/ldblib.c | 456 + lua-5.3.3/src/ldebug.c | 679 ++ lua-5.3.3/src/ldebug.h | 39 + lua-5.3.3/src/ldo.c | 800 ++ lua-5.3.3/src/ldo.h | 58 + lua-5.3.3/src/ldump.c | 215 + lua-5.3.3/src/lfunc.c | 151 + lua-5.3.3/src/lfunc.h | 61 + lua-5.3.3/src/lgc.c | 1176 +++ lua-5.3.3/src/lgc.h | 147 + lua-5.3.3/src/linit.c | 68 + lua-5.3.3/src/liolib.c | 768 ++ lua-5.3.3/src/llex.c | 565 ++ lua-5.3.3/src/llex.h | 85 + lua-5.3.3/src/llimits.h | 323 + lua-5.3.3/src/lmathlib.c | 407 + lua-5.3.3/src/lmem.c | 100 + lua-5.3.3/src/lmem.h | 69 + lua-5.3.3/src/loadlib.c | 787 ++ lua-5.3.3/src/lobject.c | 521 ++ lua-5.3.3/src/lobject.h | 549 ++ lua-5.3.3/src/lopcodes.c | 124 + lua-5.3.3/src/lopcodes.h | 295 + lua-5.3.3/src/loslib.c | 403 + lua-5.3.3/src/lparser.c | 1652 ++++ lua-5.3.3/src/lparser.h | 133 + lua-5.3.3/src/lprefix.h | 45 + lua-5.3.3/src/lstate.c | 347 + lua-5.3.3/src/lstate.h | 234 + lua-5.3.3/src/lstring.c | 248 + lua-5.3.3/src/lstring.h | 49 + lua-5.3.3/src/lstrlib.c | 1582 ++++ lua-5.3.3/src/ltable.c | 669 ++ lua-5.3.3/src/ltable.h | 58 + lua-5.3.3/src/ltablib.c | 450 + lua-5.3.3/src/ltm.c | 165 + lua-5.3.3/src/ltm.h | 76 + lua-5.3.3/src/lua.c | 609 ++ lua-5.3.3/src/lua.h | 486 ++ lua-5.3.3/src/lua.hpp | 9 + lua-5.3.3/src/luac.c | 449 + lua-5.3.3/src/luaconf.h | 767 ++ lua-5.3.3/src/lualib.h | 58 + lua-5.3.3/src/lundump.c | 279 + lua-5.3.3/src/lundump.h | 32 + lua-5.3.3/src/lutf8lib.c | 256 + lua-5.3.3/src/lvm.c | 1322 +++ lua-5.3.3/src/lvm.h | 113 + lua-5.3.3/src/lzio.c | 68 + lua-5.3.3/src/lzio.h | 66 + orig_sources/lua-5.3.3.tar.gz | Bin 0 -> 294290 bytes 75 files changed, 36662 insertions(+) create mode 100644 lua-5.3.3/Makefile create mode 100644 lua-5.3.3/README create mode 100644 lua-5.3.3/doc/contents.html create mode 100644 lua-5.3.3/doc/index.css create mode 100644 lua-5.3.3/doc/logo.gif create mode 100644 lua-5.3.3/doc/lua.1 create mode 100644 lua-5.3.3/doc/lua.css create mode 100644 lua-5.3.3/doc/luac.1 create mode 100644 lua-5.3.3/doc/manual.css create mode 100644 lua-5.3.3/doc/manual.html create mode 100644 lua-5.3.3/doc/osi-certified-72x60.png create mode 100644 lua-5.3.3/doc/readme.html create mode 100644 lua-5.3.3/src/Makefile create mode 100644 lua-5.3.3/src/lapi.c create mode 100644 lua-5.3.3/src/lapi.h create mode 100644 lua-5.3.3/src/lauxlib.c create mode 100644 lua-5.3.3/src/lauxlib.h create mode 100644 lua-5.3.3/src/lbaselib.c create mode 100644 lua-5.3.3/src/lbitlib.c create mode 100644 lua-5.3.3/src/lcode.c create mode 100644 lua-5.3.3/src/lcode.h create mode 100644 lua-5.3.3/src/lcorolib.c create mode 100644 lua-5.3.3/src/lctype.c create mode 100644 lua-5.3.3/src/lctype.h create mode 100644 lua-5.3.3/src/ldblib.c create mode 100644 lua-5.3.3/src/ldebug.c create mode 100644 lua-5.3.3/src/ldebug.h create mode 100644 lua-5.3.3/src/ldo.c create mode 100644 lua-5.3.3/src/ldo.h create mode 100644 lua-5.3.3/src/ldump.c create mode 100644 lua-5.3.3/src/lfunc.c create mode 100644 lua-5.3.3/src/lfunc.h create mode 100644 lua-5.3.3/src/lgc.c create mode 100644 lua-5.3.3/src/lgc.h create mode 100644 lua-5.3.3/src/linit.c create mode 100644 lua-5.3.3/src/liolib.c create mode 100644 lua-5.3.3/src/llex.c create mode 100644 lua-5.3.3/src/llex.h create mode 100644 lua-5.3.3/src/llimits.h create mode 100644 lua-5.3.3/src/lmathlib.c create mode 100644 lua-5.3.3/src/lmem.c create mode 100644 lua-5.3.3/src/lmem.h create mode 100644 lua-5.3.3/src/loadlib.c create mode 100644 lua-5.3.3/src/lobject.c create mode 100644 lua-5.3.3/src/lobject.h create mode 100644 lua-5.3.3/src/lopcodes.c create mode 100644 lua-5.3.3/src/lopcodes.h create mode 100644 lua-5.3.3/src/loslib.c create mode 100644 lua-5.3.3/src/lparser.c create mode 100644 lua-5.3.3/src/lparser.h create mode 100644 lua-5.3.3/src/lprefix.h create mode 100644 lua-5.3.3/src/lstate.c create mode 100644 lua-5.3.3/src/lstate.h create mode 100644 lua-5.3.3/src/lstring.c create mode 100644 lua-5.3.3/src/lstring.h create mode 100644 lua-5.3.3/src/lstrlib.c create mode 100644 lua-5.3.3/src/ltable.c create mode 100644 lua-5.3.3/src/ltable.h create mode 100644 lua-5.3.3/src/ltablib.c create mode 100644 lua-5.3.3/src/ltm.c create mode 100644 lua-5.3.3/src/ltm.h create mode 100644 lua-5.3.3/src/lua.c create mode 100644 lua-5.3.3/src/lua.h create mode 100644 lua-5.3.3/src/lua.hpp create mode 100644 lua-5.3.3/src/luac.c create mode 100644 lua-5.3.3/src/luaconf.h create mode 100644 lua-5.3.3/src/lualib.h create mode 100644 lua-5.3.3/src/lundump.c create mode 100644 lua-5.3.3/src/lundump.h create mode 100644 lua-5.3.3/src/lutf8lib.c create mode 100644 lua-5.3.3/src/lvm.c create mode 100644 lua-5.3.3/src/lvm.h create mode 100644 lua-5.3.3/src/lzio.c create mode 100644 lua-5.3.3/src/lzio.h create mode 100644 orig_sources/lua-5.3.3.tar.gz diff --git a/lua-5.3.3/Makefile b/lua-5.3.3/Makefile new file mode 100644 index 0000000..c795dd7 --- /dev/null +++ b/lua-5.3.3/Makefile @@ -0,0 +1,114 @@ +# Makefile for installing Lua +# See doc/readme.html for installation and customization instructions. + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= none + +# Where to install. The installation starts in the src and doc directories, +# so take care if INSTALL_TOP is not an absolute path. See the local target. +# You may want to make INSTALL_LMOD and INSTALL_CMOD consistent with +# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h. +INSTALL_TOP= /usr/local +INSTALL_BIN= $(INSTALL_TOP)/bin +INSTALL_INC= $(INSTALL_TOP)/include +INSTALL_LIB= $(INSTALL_TOP)/lib +INSTALL_MAN= $(INSTALL_TOP)/man/man1 +INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V +INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V + +# How to install. If your install program does not support "-p", then +# you may have to run ranlib on the installed liblua.a. +INSTALL= install -p +INSTALL_EXEC= $(INSTALL) -m 0755 +INSTALL_DATA= $(INSTALL) -m 0644 +# +# If you don't have "install" you can use "cp" instead. +# INSTALL= cp -p +# INSTALL_EXEC= $(INSTALL) +# INSTALL_DATA= $(INSTALL) + +# Other utilities. +MKDIR= mkdir -p +RM= rm -f + +# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= + +# Convenience platforms targets. +PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris + +# What to install. +TO_BIN= lua luac +TO_INC= lua.h luaconf.h lualib.h lauxlib.h lua.hpp +TO_LIB= liblua.a +TO_MAN= lua.1 luac.1 + +# Lua version and release. +V= 5.3 +R= $V.3 + +# Targets start here. +all: $(PLAT) + +$(PLATS) clean: + cd src && $(MAKE) $@ + +test: dummy + src/lua -v + +install: dummy + cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD) + cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN) + cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC) + cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB) + cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN) + +uninstall: + cd src && cd $(INSTALL_BIN) && $(RM) $(TO_BIN) + cd src && cd $(INSTALL_INC) && $(RM) $(TO_INC) + cd src && cd $(INSTALL_LIB) && $(RM) $(TO_LIB) + cd doc && cd $(INSTALL_MAN) && $(RM) $(TO_MAN) + +local: + $(MAKE) install INSTALL_TOP=../install + +none: + @echo "Please do 'make PLATFORM' where PLATFORM is one of these:" + @echo " $(PLATS)" + @echo "See doc/readme.html for complete instructions." + +# make may get confused with test/ and install/ +dummy: + +# echo config parameters +echo: + @cd src && $(MAKE) -s echo + @echo "PLAT= $(PLAT)" + @echo "V= $V" + @echo "R= $R" + @echo "TO_BIN= $(TO_BIN)" + @echo "TO_INC= $(TO_INC)" + @echo "TO_LIB= $(TO_LIB)" + @echo "TO_MAN= $(TO_MAN)" + @echo "INSTALL_TOP= $(INSTALL_TOP)" + @echo "INSTALL_BIN= $(INSTALL_BIN)" + @echo "INSTALL_INC= $(INSTALL_INC)" + @echo "INSTALL_LIB= $(INSTALL_LIB)" + @echo "INSTALL_MAN= $(INSTALL_MAN)" + @echo "INSTALL_LMOD= $(INSTALL_LMOD)" + @echo "INSTALL_CMOD= $(INSTALL_CMOD)" + @echo "INSTALL_EXEC= $(INSTALL_EXEC)" + @echo "INSTALL_DATA= $(INSTALL_DATA)" + +# echo pkg-config data +pc: + @echo "version=$R" + @echo "prefix=$(INSTALL_TOP)" + @echo "libdir=$(INSTALL_LIB)" + @echo "includedir=$(INSTALL_INC)" + +# 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/lua-5.3.3/README b/lua-5.3.3/README new file mode 100644 index 0000000..e84d9ac --- /dev/null +++ b/lua-5.3.3/README @@ -0,0 +1,6 @@ + +This is Lua 5.3.3, released on 30 May 2016. + +For installation instructions, license details, and +further information about Lua, see doc/readme.html. + diff --git a/lua-5.3.3/doc/contents.html b/lua-5.3.3/doc/contents.html new file mode 100644 index 0000000..ca0f568 --- /dev/null +++ b/lua-5.3.3/doc/contents.html @@ -0,0 +1,618 @@ + + + +Lua 5.3 Reference Manual - contents + + + + + + + +

+Lua +Lua 5.3 Reference Manual +

+ +

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

+ +

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

Contents

+ + +

Index

+ + + + + + + + + + + + + + diff --git a/lua-5.3.3/doc/index.css b/lua-5.3.3/doc/index.css new file mode 100644 index 0000000..c961835 --- /dev/null +++ b/lua-5.3.3/doc/index.css @@ -0,0 +1,21 @@ +ul { + list-style-type: none ; +} + +ul.contents { + padding: 0 ; +} + +table { + border: none ; + border-spacing: 0 ; + border-collapse: collapse ; +} + +td { + vertical-align: top ; + padding: 0 ; + text-align: left ; + line-height: 1.25 ; + width: 15% ; +} diff --git a/lua-5.3.3/doc/logo.gif b/lua-5.3.3/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/lua-5.3.3/doc/lua.1 b/lua-5.3.3/doc/lua.1 new file mode 100644 index 0000000..411531b --- /dev/null +++ b/lua-5.3.3/doc/lua.1 @@ -0,0 +1,111 @@ +.TH LUA 1 "$Date: 2014/12/10 15:55:45 $" +.SH NAME +lua \- Lua interpreter +.SH SYNOPSIS +.B lua +[ +.I options +] +[ +.I script +[ +.I args +] +] +.SH DESCRIPTION +.B lua +is the standalone Lua interpreter. +It loads and executes Lua programs, +either in textual source form or +in precompiled binary form. +(Precompiled binaries are output by +.BR luac , +the Lua compiler.) +.B lua +can be used as a batch interpreter and also interactively. +.LP +The given +.I options +are handled in order 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 no options or 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 the line contains an expression or list of expressions, +then the line is evaluated and the results are printed. +If a line does not contain a complete statement, +then a secondary prompt is displayed and +lines are read until a complete statement is formed or +a syntax error is found. +.LP +At the very start, +before even handling the command line, +.B lua +checks the contents of the environment variables +.B LUA_INIT_5_3 +or +.BR LUA_INIT , +in that order. +If the contents is of the form +.RI '@ filename ', +then +.I filename +is executed. +Otherwise, the string is assumed to be a Lua statement and is executed. +.SH OPTIONS +.TP +.BI \-e " stat" +execute statement +.IR stat . +.TP +.B \-i +enter interactive mode after executing +.IR script . +.TP +.BI \-l " name" +execute the equivalent of +.IB name =require(' name ') +before executing +.IR script . +.TP +.B \-v +show version information. +.TP +.B \-E +ignore environment variables. +.TP +.B \-\- +stop handling options. +.TP +.B \- +stop handling options and execute the standard input as a file. +.SH "SEE ALSO" +.BR luac (1) +.br +The documentation at lua.org, +especially section 7 of the reference manual. +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH AUTHORS +R. Ierusalimschy, +L. H. de Figueiredo, +W. Celes +.\" EOF diff --git a/lua-5.3.3/doc/lua.css b/lua-5.3.3/doc/lua.css new file mode 100644 index 0000000..5bedf7e --- /dev/null +++ b/lua-5.3.3/doc/lua.css @@ -0,0 +1,164 @@ +html { + background-color: #F8F8F8 ; +} + +body { + background-color: #FFFFFF ; + color: #000000 ; + font-family: Helvetica, Arial, sans-serif ; + text-align: justify ; + line-height: 1.25 ; + margin: 16px auto ; + padding: 32px ; + border: solid #a0a0a0 1px ; + border-radius: 20px ; + max-width: 70em ; + width: 90% ; +} + +h1, h2, h3, h4 { + color: #000080 ; + font-family: Verdana, Geneva, sans-serif ; + font-weight: normal ; + font-style: normal ; + text-align: left ; +} + +h1 { + font-size: 28pt ; +} + +h1 img { + vertical-align: text-bottom ; +} + +h2:before { + content: "\2756" ; + padding-right: 0.5em ; +} + +a { + text-decoration: none ; +} + +a:link { + color: #000080 ; +} + +a:link:hover, a:visited:hover { + background-color: #D0D0FF ; + color: #000080 ; + border-radius: 4px ; +} + +a:link:active, a:visited:active { + color: #FF0000 ; +} + +div.menubar { + padding-bottom: 0.5em ; +} + +p.menubar { + margin-left: 2.5em ; +} + +.menubar a:hover { + margin: -3px -3px -3px -3px ; + padding: 3px 3px 3px 3px ; + border-radius: 4px ; +} + +:target { + background-color: #F0F0F0 ; + margin: -8px ; + padding: 8px ; + border-radius: 8px ; + outline: none ; +} + +hr { + display: none ; +} + +table hr { + background-color: #a0a0a0 ; + color: #a0a0a0 ; + border: 0 ; + height: 1px ; + display: block ; +} + +.footer { + color: gray ; + font-size: x-small ; + text-transform: lowercase ; +} + +input[type=text] { + border: solid #a0a0a0 2px ; + border-radius: 2em ; + background-image: url('images/search.png') ; + background-repeat: no-repeat ; + background-position: 4px center ; + padding-left: 20px ; + height: 2em ; +} + +pre.session { + background-color: #F8F8F8 ; + padding: 1em ; + border-radius: 8px ; +} + +td.gutter { + width: 4% ; +} + +table.columns { + border: none ; + border-spacing: 0 ; + border-collapse: collapse ; +} + +table.columns td { + vertical-align: top ; + padding: 0 ; + padding-bottom: 1em ; + text-align: justify ; + line-height: 1.25 ; +} + +p.logos a:link:hover, p.logos a:visited:hover { + background-color: inherit ; +} + +table.book { + border: none ; + border-spacing: 0 ; + border-collapse: collapse ; +} + +table.book td { + padding: 0 ; + vertical-align: top ; +} + +table.book td.cover { + padding-right: 1em ; +} + +table.book img { + border: solid #000080 1px ; +} + +table.book span { + font-size: small ; + text-align: left ; + display: block ; + margin-top: 0.25em ; +} + +img { + background-color: white ; +} diff --git a/lua-5.3.3/doc/luac.1 b/lua-5.3.3/doc/luac.1 new file mode 100644 index 0000000..33a4ed0 --- /dev/null +++ b/lua-5.3.3/doc/luac.1 @@ -0,0 +1,118 @@ +.\" $Id: luac.man,v 1.29 2011/11/16 13:53:40 lhf Exp $ +.TH LUAC 1 "$Date: 2011/11/16 13:53:40 $" +.SH NAME +luac \- Lua compiler +.SH SYNOPSIS +.B luac +[ +.I options +] [ +.I filenames +] +.SH DESCRIPTION +.B luac +is the Lua compiler. +It translates programs written in the Lua programming language +into binary files containing precompiled chunks +that can be later loaded and executed. +.LP +The main advantages of precompiling chunks are: +faster loading, +protecting source code from accidental user changes, +and +off-line syntax checking. +Precompiling does not imply faster execution +because in Lua chunks are always compiled into bytecodes before being executed. +.B luac +simply allows those bytecodes to be saved in a file for later execution. +Precompiled chunks are not necessarily smaller than the corresponding source. +The main goal in precompiling is faster loading. +.LP +In the command line, +you can mix +text files containing Lua source and +binary files containing precompiled chunks. +.B luac +produces a single output file containing the combined bytecodes +for all files given. +Executing the combined file is equivalent to executing the given files. +By default, +the output file is named +.BR luac.out , +but you can change this with the +.B \-o +option. +.LP +Precompiled chunks are +.I not +portable across different architectures. +Moreover, +the internal format of precompiled chunks +is likely to change when a new version of Lua is released. +Make sure you save the source files of all Lua programs that you precompile. +.LP +.SH OPTIONS +.TP +.B \-l +produce a listing of the compiled bytecode for Lua's virtual machine. +Listing bytecodes is useful to learn about Lua's virtual machine. +If no files are given, then +.B luac +loads +.B luac.out +and lists its contents. +Use +.B \-l \-l +for a full listing. +.TP +.BI \-o " file" +output to +.IR file , +instead of the default +.BR luac.out . +(You can use +.B "'\-'" +for standard output, +but not on platforms that open standard output in text mode.) +The output file may be one of the given files because +all files are loaded before the output file is written. +Be careful not to overwrite precious files. +.TP +.B \-p +load files but do not generate any output file. +Used mainly for syntax checking and for testing precompiled chunks: +corrupted files will probably generate errors when loaded. +If no files are given, then +.B luac +loads +.B luac.out +and tests its contents. +No messages are displayed if the file loads without errors. +.TP +.B \-s +strip debug information before writing the output file. +This saves some space in very large chunks, +but if errors occur when running a stripped chunk, +then the error messages may not contain the full information they usually do. +In particular, +line numbers and names of local variables are lost. +.TP +.B \-v +show version information. +.TP +.B \-\- +stop handling options. +.TP +.B \- +stop handling options and process standard input. +.SH "SEE ALSO" +.BR lua (1) +.br +The documentation at lua.org. +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH AUTHORS +R. Ierusalimschy, +L. H. de Figueiredo, +W. Celes +.\" EOF diff --git a/lua-5.3.3/doc/manual.css b/lua-5.3.3/doc/manual.css new file mode 100644 index 0000000..aa0e677 --- /dev/null +++ b/lua-5.3.3/doc/manual.css @@ -0,0 +1,21 @@ +h3 code { + font-family: inherit ; + font-size: inherit ; +} + +pre, code { + font-size: 12pt ; +} + +span.apii { + color: gray ; + float: right ; + font-family: inherit ; + font-style: normal ; + font-size: small ; +} + +h2:before { + content: "" ; + padding-right: 0em ; +} diff --git a/lua-5.3.3/doc/manual.html b/lua-5.3.3/doc/manual.html new file mode 100644 index 0000000..5fb26b2 --- /dev/null +++ b/lua-5.3.3/doc/manual.html @@ -0,0 +1,10910 @@ + + + +Lua 5.3 Reference Manual + + + + + + + +

+Lua +Lua 5.3 Reference Manual +

+ +

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

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

+ + +

+ + + + + + +

1 – Introduction

+ +

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

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

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

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

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

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

2 – Basic Concepts

+ +

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

2.1 – Values and Types

+ +

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

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

+There are eight basic types in Lua: +nil, boolean, number, +string, function, userdata, +thread, and table. +The type nil has one single value, nil, +whose main property is to be different from any other value; +it usually represents the absence of a useful value. +The type boolean has two values, false and true. +Both nil and false make a condition false; +any other value makes it true. +The type number represents both +integer numbers and real (floating-point) numbers. +The type string represents immutable sequences of bytes. + +Lua is 8-bit clean: +strings can contain any 8-bit value, +including embedded zeros ('\0'). +Lua is also encoding-agnostic; +it makes no assumptions about the contents of a string. + + +

+The type number uses two internal representations, +or two subtypes, +one called integer and the other called float. +Lua has explicit rules about when each representation is used, +but it also converts between them automatically as needed (see §3.4.3). +Therefore, +the programmer may choose to mostly ignore the difference +between integers and floats +or to assume complete control over the representation of each number. +Standard Lua uses 64-bit integers and double-precision (64-bit) floats, +but you can also compile Lua so that it +uses 32-bit integers and/or single-precision (32-bit) floats. +The option with 32 bits for both integers and floats +is particularly attractive +for small machines and embedded systems. +(See macro LUA_32BITS in file luaconf.h.) + + +

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

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

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

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

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

+We use the term sequence to denote a table where +the set of all positive numeric keys is equal to {1..n} +for some non-negative integer n, +which is called the length of the sequence (see §3.4.7). + + +

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

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

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

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

2.2 – Environments and the Global Environment

+ +

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

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

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

+Lua keeps a distinguished environment called the global environment. +This value is kept at a special index in the C registry (see §4.5). +In Lua, the global variable _G is initialized with this same value. +(_G is never used internally.) + + +

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

2.3 – 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. +(When you use Lua standalone, +the lua application is the host program.) +Whenever an error occurs during +the compilation or execution of a Lua chunk, +control returns to the host, +which can take appropriate measures +(such as printing an error message). + + +

+Lua code can explicitly generate an error by calling the +error function. +If you need to catch errors in Lua, +you can use pcall or xpcall +to call a given function in protected mode. + + +

+Whenever there is an error, +an error object (also called an error message) +is propagated with information about the error. +Lua itself only generates errors whose error object is a string, +but programs may generate errors with +any value as the error object. +It is up to the Lua program or its host to handle such error objects. + + +

+When you use xpcall or lua_pcall, +you may give a message handler +to be called in case of errors. +This function is called with the original error object +and returns a new error object. +It is called before the error unwinds the stack, +so that it can gather more information about the error, +for instance by inspecting the stack and creating a stack traceback. +This message handler is still protected by the protected call; +so, an error inside the message handler +will call the message handler again. +If this loop goes on for too long, +Lua breaks it and returns an appropriate message. + + + + + +

2.4 – Metatables and Metamethods

+ +

+Every value in Lua can have a metatable. +This metatable is an ordinary Lua table +that defines the behavior of the original value +under certain 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" of the value's metatable. +If it finds one, +Lua calls this function to perform the addition. + + +

+The key for each event in a metatable is a string +with the event name prefixed by two underscores; +the corresponding values are called metamethods. +In the previous example, the key is "__add" +and the metamethod is the function that performs the addition. + + +

+You can query the metatable of any value +using the getmetatable function. +Lua queries metamethods in metatables using a raw access (see rawget). +So, to retrieve the metamethod for event ev in object o, +Lua does the equivalent to the following code: + +

+     rawget(getmetatable(o) or {}, "__ev")
+
+ +

+You can replace the metatable of tables +using the setmetatable function. +You cannot change the metatable of other types from Lua code +(except by using the debug library (§6.10)); +you should 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. +By default, a value has no metatable, +but the string library sets a metatable for the string type (see §6.4). + + +

+A metatable controls how an object behaves in +arithmetic operations, bitwise operations, +order comparisons, concatenation, length operation, calls, and indexing. +A metatable also can define a function to be called +when a userdata or a table is garbage collected (§2.5). + + +

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

+A detailed list of events controlled by metatables is given next. +Each operation is identified by its corresponding key. + + + +

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

    +Despite the name, +the metamethod for this event can be either a function or a table. +If it is a function, +it is called with table and key as arguments, +and the result of the call +(adjusted to one value) +is the result of the operation. +If it is a table, +the final result is the result of indexing this table with key. +(This indexing is regular, not raw, +and therefore can trigger another metamethod.) +

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

    +Like with indexing, +the metamethod for this event can be either a function or a table. +If it is a function, +it is called with table, key, and value as arguments. +If it is a table, +Lua does an indexing assignment to this table with the same key and value. +(This assignment is regular, not raw, +and therefore can trigger another metamethod.) + + +

    +Whenever there is a __newindex metamethod, +Lua does not perform the primitive assignment. +(If necessary, +the metamethod itself can call rawset +to do the assignment.) +

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

+It is a good practice to add all needed metamethods to a table +before setting it as a metatable of some object. +In particular, the __gc metamethod works only when this order +is followed (see §2.5.1). + + +

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

2.5 – Garbage Collection

+ +

+Lua performs automatic memory management. +This means that +you do not have to worry about allocating memory for new objects +or freeing it when the objects are no longer needed. +Lua manages memory automatically by running +a garbage collector to collect all dead objects +(that is, objects that are no longer accessible from Lua). +All memory used by Lua is subject to automatic management: +strings, tables, userdata, functions, threads, internal structures, 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 +(e.g., 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 garbage-collector 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. +You should not use values smaller than 100, +because they make the collector too slow and +can result in the collector never finishing a cycle. +The default is 200, +which means that the collector runs at "twice" +the speed of memory allocation. + + +

+If you set the step multiplier to a very large number +(larger than 10% of the maximum number of +bytes that the program may use), +the collector behaves like a stop-the-world collector. +If you then set the pause to 200, +the collector behaves as in old Lua versions, +doing a complete collection every time Lua doubles its +memory usage. + + +

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

2.5.1 – Garbage-Collection Metamethods

+ +

+You can set garbage-collector metamethods for tables +and, using the C API, +for full userdata (see §2.4). +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). + + +

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

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

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

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

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

2.5.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 that object. + + +

+A weak table can have weak keys, weak values, or both. +A table with weak values allows the collection of its values, +but prevents the collection of its keys. +A table with both weak keys and weak values allows the collection of +both keys and values. +In any case, if either the key or the value is collected, +the whole pair is removed from the table. +The weakness of a table is controlled by the +__mode field of its metatable. +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. + + +

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

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

+Only objects that have an explicit construction +are removed from weak tables. +Values, such as numbers and light C functions, +are not subject to garbage collection, +and therefore are not removed from weak tables +(unless their associated values are collected). +Although strings are subject to garbage collection, +they do not have an explicit construction, +and therefore are not removed from weak tables. + + +

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

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

2.6 – Coroutines

+ +

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

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

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

+A coroutine can terminate its execution in two ways: +normally, when its main function returns +(explicitly or implicitly, after the last instruction); +and abnormally, if there is an unprotected error. +In case of normal termination, +coroutine.resume returns true, +plus any values returned by the coroutine main function. +In case of errors, coroutine.resume returns false +plus an error object. + + +

+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 of how coroutines work, +consider the following code: + +

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

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

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

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

3 – The Language

+ +

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

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

3.1 – Lexical Conventions

+ +

+Lua is a free-form language. +It ignores spaces (including new lines) and comments +between lexical elements (tokens), +except as delimiters between names and keywords. + + +

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

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

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

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

+The following strings denote other tokens: + +

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

+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]). +A backslash followed by a real newline +results in a newline in the string. +The escape sequence '\z' skips the following span +of white-space characters, +including line breaks; +it is particularly useful to break and indent a long literal string +into multiple lines without adding the newlines and spaces +into the string contents. + + +

+Strings in Lua can contain any 8-bit value, including embedded zeros, +which can be specified as '\0'. +More generally, +we can specify any byte in a literal string by its numeric value. +This can be done +with the escape sequence \xXX, +where XX is a sequence of exactly two hexadecimal digits, +or with the escape sequence \ddd, +where ddd is a sequence of up to three decimal digits. +(Note that if a decimal escape sequence is to be followed by a digit, +it must be expressed using exactly three digits.) + + +

+The UTF-8 encoding of a Unicode character +can be inserted in a literal string with +the escape sequence \u{XXX} +(note the mandatory enclosing brackets), +where XXX is a sequence of one or more hexadecimal digits +representing the character code point. + + +

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

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

+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 numeric constant (or numeral) +can be written with an optional fractional part +and an optional decimal exponent, +marked by a letter 'e' or 'E'. +Lua also accepts hexadecimal constants, +which start with 0x or 0X. +Hexadecimal constants also accept an optional fractional part +plus an optional binary exponent, +marked by a letter 'p' or 'P'. +A numeric constant with a radix point or an exponent +denotes a float; +otherwise, +if its value fits in an integer, +it denotes an integer. +Examples of valid integer constants are + +

+     3   345   0xff   0xBEBADA
+

+Examples of valid float constants are + +

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

+A comment starts with a double hyphen (--) +anywhere outside a string. +If the text immediately after -- is not an opening long bracket, +the comment is a short comment, +which runs until the end of the line. +Otherwise, it is a long comment, +which runs until the corresponding closing long bracket. +Long comments are frequently used to disable code temporarily. + + + + + +

3.2 – Variables

+ +

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

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

+	var ::= Name
+

+Name denotes identifiers, as defined in §3.1. + + +

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

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

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

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

+The meaning of accesses to table fields can be changed via metatables. +An access to an indexed variable t[i] is equivalent to +a call gettable_event(t,i). +(See §2.4 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
+
+ +

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

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

3.3.1 – Blocks

+ +

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

+	block ::= {stat}
+

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

+	stat ::= ‘;’
+
+ +

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

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

+The grammar could see it in two ways: + +

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

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

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

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

+	stat ::= do block end
+

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

3.3.2 – Chunks

+ +

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

+	chunk ::= block
+
+ +

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

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

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

3.3.3 – Assignment

+ +

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

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

+Expressions are discussed in §3.4. + + +

+Before the assignment, +the list of values is adjusted to the length of +the list of variables. +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 §3.4). + + +

+The assignment statement first evaluates all its expressions +and only then the assignments are 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.4 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 name x = val +is equivalent to the assignment +_ENV.x = val (see §2.2). + + + + + +

3.3.4 – Control Structures

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

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

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

+The condition expression of a +control structure can return any value. +Both false and nil 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 goto statement transfers the program control to a label. +For syntactical reasons, +labels in Lua are considered statements too: + + + +

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

+A label is visible in the entire block where it is defined, +except +inside nested blocks where a label with the same name is defined and +inside nested functions. +A goto may jump to any visible label as long as it does not +enter into the scope of a local variable. + + +

+Labels and empty statements are called void statements, +as they perform no actions. + + +

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

+	stat ::= break
+

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

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

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

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

3.3.5 – For Statement

+ +

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

+The numerical for loop 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
+       var = var - step
+       while true do
+         var = var + step
+         if (step >= 0 and var > limit) or (step < 0 and var < limit) then
+           break
+         end
+         local v = var
+         block
+       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 and goto to exit a for loop. +
  • + +
  • +The loop variable v is local to the loop body. +If you need its value after the loop, +assign it to another variable before 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)
+         if var_1 == nil then break end
+         var = var_1
+         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. +
  • + +
+ + + + +

3.3.6 – Function Calls as Statements

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

+	stat ::= functioncall
+

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

3.3.7 – Local Declarations

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

+	stat ::= local namelist [‘=’ explist]
+

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

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

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

3.4 – Expressions

+ +

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

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

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

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

+Both function calls and vararg expressions can result in multiple values. +If a function call is used as a statement (see §3.3.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 expression is enclosed in parentheses). +In all other contexts, +Lua adjusts the result list to one element, +either discarding all values except the first one +or adding a single nil if there are no values. + + +

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

3.4.1 – Arithmetic Operators

+Lua supports the following arithmetic operators: + +

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

+With the exception of exponentiation and float division, +the arithmetic operators work as follows: +If both operands are integers, +the operation is performed over integers and the result is an integer. +Otherwise, if both operands are numbers +or strings that can be converted to +numbers (see §3.4.3), +then they are converted to floats, +the operation is performed following the usual rules +for floating-point arithmetic +(usually the IEEE 754 standard), +and the result is a float. + + +

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

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

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

+In case of overflows in integer arithmetic, +all operations wrap around, +according to the usual rules of two-complement arithmetic. +(In other words, +they return the unique representable integer +that is equal modulo 264 to the mathematical result.) + + + +

3.4.2 – Bitwise Operators

+Lua supports the following bitwise operators: + +

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

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

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

3.4.3 – Coercions and Conversions

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

+Lua also converts strings to numbers, +whenever a number is expected. + + +

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

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

+The conversion from strings to numbers goes as follows: +First, the string is converted to an integer or a float, +following its syntax and the rules of the Lua lexer. +(The string may have also leading and trailing spaces and a sign.) +Then, the resulting number (float or integer) +is converted to the type (float or integer) required by the context +(e.g., the operation that forced the conversion). + + +

+All conversions from strings to numbers +accept both a dot and the current locale mark +as the radix character. +(The Lua lexer, however, accepts only a dot.) + + +

+The conversion from numbers to strings uses a +non-specified human-readable format. +For complete control over how numbers are converted to strings, +use the format function from the string library +(see string.format). + + + + + +

3.4.4 – Relational Operators

+Lua supports the following relational operators: + +

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

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

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

+Tables, userdata, and threads +are compared by reference: +two objects are considered equal only if they are the same object. +Every time you create a new object +(a table, userdata, or thread), +this new object is different from any previously existing object. +Closures with the same reference are always equal. +Closures with any detectable difference +(different behavior, different definition) are always different. + + +

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

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

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

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

+Following the IEEE 754 standard, +NaN is considered neither smaller than, +nor equal to, nor greater than any value (including itself). + + + + + +

3.4.5 – Logical Operators

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

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

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

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

3.4.6 – 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 described in §3.4.3. +Otherwise, the __concat metamethod is called (see §2.4). + + + + + +

3.4.7 – The Length Operator

+ +

+The length operator is denoted by the unary prefix operator #. +The length of a string is its number of bytes +(that is, the usual meaning of string length when each +character is one byte). + + +

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

+Unless a __len metamethod is given, +the length of a table t is only defined if the +table is a sequence, +that is, +the set of its positive numeric keys is equal to {1..n} +for some non-negative integer n. +In that case, n is its length. +Note that a table like + +

+     {10, 20, nil, 40}
+

+is not a sequence, because it has the key 4 +but does not have the key 3. +(So, there is no n such that the set {1..n} is equal +to the set of positive numeric keys of that table.) +Note, however, that non-numeric keys do not interfere +with whether a table is a sequence. + + + + + +

3.4.8 – Precedence

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

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

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

3.4.9 – Table Constructors

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

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

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

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

+is equivalent to + +

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

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

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

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

3.4.10 – Function Calls

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

+	functioncall ::= prefixexp args
+

+In a function call, +first prefixexp and args are evaluated. +If the value of prefixexp has type function, +then this function is called +with the given arguments. +Otherwise, the prefixexp "call" metamethod is called, +having as first parameter the value of prefixexp, +followed by the original call arguments +(see §2.4). + + +

+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 ::= LiteralString
+

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

+A call of the form return functioncall 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
+
+ + + + +

3.4.11 – Function Definitions

+ +

+The syntax for function definition is + +

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

+The following syntactic sugar simplifies function definitions: + +

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

+The statement + +

+     function f () body end
+

+translates to + +

+     f = function () body end
+

+The statement + +

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

+translates to + +

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

+The statement + +

+     local function f () body end
+

+translates to + +

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

+not to + +

+     local f = function () body end
+

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

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

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

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

+When a function is called, +the list of arguments is adjusted to +the length of the list of parameters, +unless the function is a 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 §3.3.4). +If control reaches the end of a function +without encountering a return statement, +then the function returns with no results. + + +

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

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

3.5 – Visibility Rules

+ +

+ +Lua is a lexically scoped language. +The scope of a local variable begins at the first statement after +its declaration and lasts until the last non-void statement +of the innermost block that includes the declaration. +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. + + + + + +

4 – The Application Program Interface

+ +

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

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

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

4.1 – The Stack

+ +

+Lua uses a virtual stack to pass values to and from C. +Each element in this stack represents a Lua value +(nil, number, string, etc.). + + +

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

4.2 – Stack Size

+ +

+When you interact with the 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 ensure that the stack has enough space for pushing new elements. + + +

+Whenever Lua calls C, +it ensures that the stack has space for +at least LUA_MINSTACK extra slots. +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. + + +

+When you call a Lua function +without a fixed number of results (see lua_call), +Lua ensures that the stack has enough space for all results, +but it does not ensure any extra space. +So, before pushing anything in the stack after such a call +you should use lua_checkstack. + + + + + +

4.3 – Valid and Acceptable Indices

+ +

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

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

+Functions that do not need a specific mutable position, +but only a value (e.g., query functions), +can be called with acceptable indices. +An acceptable index can be any valid index, +but it also can be any positive index after the stack top +within the space allocated for the stack, +that is, indices up to the stack size. +(Note that 0 is never an acceptable index.) +Except when noted otherwise, +functions in the API work with acceptable indices. + + +

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

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

4.4 – C Closures

+ +

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

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

4.5 – Registry

+ +

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

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

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

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

4.6 – Error Handling in C

+ +

+Internally, Lua uses the C longjmp facility to handle errors. +(Lua will use exceptions if you compile it as C++; +search for LUAI_THROW in the source code for details.) +When Lua faces any error +(such as a memory allocation error, 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 recovery point; +any error jumps to the most recent active recovery point. + + +

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

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

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

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

4.7 – Handling Yields in C

+ +

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

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

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

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

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

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

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

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

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

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

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

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

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

4.8 – 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 raise errors: +'-' means the function never raises any error; +'m' means the function may raise out-of-memory errors +and errors running a __gc metamethod; +'e' means the function may raise any errors +(it can run arbitrary Lua code, +either directly or through metamethods); +'v' means the function may raise an error on purpose. + + + +


lua_absindex

+[-0, +0, –] +

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

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


lua_Alloc

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

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

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

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

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

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

+When nsize is not zero, +the allocator must behave like realloc. +The allocator returns NULL +if and only if it cannot fulfill the request. +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);
+     }
+

+Note that Standard C ensures +that free(NULL) has no effect and that +realloc(NULL,size) is equivalent to malloc(size). +This code assumes that realloc does not fail when shrinking a block. +(Although Standard C does not ensure this behavior, +it seems to be a safe assumption.) + + + + + +


lua_arith

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

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

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

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

+ + + + +

lua_atpanic

+[-0, +0, –] +

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

+Sets a new panic function and returns the old one (see §4.6). + + + + + +


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, +but it does not ensure any extra space in the stack. +The function results are pushed onto the stack in direct order +(the first result is pushed first), +so that after the call the last result is on the top of the stack. + + +

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

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


lua_callk

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

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

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


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 numeric arguments and returns their average and their sum: + +

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

lua_checkstack

+[-0, +0, –] +

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

+Ensures that the stack has space for at least n extra slots +(that is, that you can safely push up to n values into it). +It returns false if it cannot fulfill the request, +either because it would cause the stack +to be larger than a fixed maximum size +(typically at least several thousand elements) or +because it cannot allocate memory for the extra space. +This function never shrinks the stack; +if the stack already has space for the extra slots, +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 that create multiple states, +such as daemons or web servers, +will probably need to close states as soon as they are not needed. + + + + + +


lua_compare

+[-0, +0, e] +

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

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

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

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

lua_concat

+[-n, +1, e] +

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

+Concatenates the n values at the top of the stack, +pops them, and leaves the result 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 §3.4.6). + + + + + +


lua_copy

+[-0, +0, –] +

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

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


lua_createtable

+[-0, +1, m] +

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

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


lua_dump

+[-0, +0, –] +

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

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

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

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

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


lua_error

+[-1, +0, v] +

int lua_error (lua_State *L);
+ +

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


lua_gc

+[-0, +0, m] +

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. +
  • + +
  • LUA_GCSETPAUSE: +sets data as the new value +for the pause of the collector (see §2.5) +and returns the previous value of the pause. +
  • + +
  • LUA_GCSETSTEPMUL: +sets data as the new value for the step multiplier of +the collector (see §2.5) +and returns the previous value of the step multiplier. +
  • + +
  • LUA_GCISRUNNING: +returns a boolean that tells whether the collector is running +(i.e., not stopped). +
  • + +
+ +

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


lua_getallocf

+[-0, +0, –] +

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

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


lua_getfield

+[-0, +1, e] +

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

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

+Returns the type of the pushed value. + + + + + +


lua_getextraspace

+[-0, +0, –] +

void *lua_getextraspace (lua_State *L);
+ +

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

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

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


lua_getglobal

+[-0, +1, e] +

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

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


lua_geti

+[-0, +1, e] +

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

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

+Returns the type of the pushed value. + + + + + +


lua_getmetatable

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

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

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


lua_gettable

+[-1, +1, e] +

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

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

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

+Returns the type of the pushed value. + + + + + +


lua_gettop

+[-0, +0, –] +

int lua_gettop (lua_State *L);
+ +

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


lua_getuservalue

+[-0, +1, –] +

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

+Pushes onto the stack the Lua value associated with the userdata +at the given index. + + +

+Returns the type of the pushed value. + + + + + +


lua_insert

+[-1, +1, –] +

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

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


lua_Integer

+
typedef ... lua_Integer;
+ +

+The type of integers in Lua. + + +

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

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


lua_isboolean

+[-0, +0, –] +

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

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


lua_iscfunction

+[-0, +0, –] +

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

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


lua_isfunction

+[-0, +0, –] +

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

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


lua_isinteger

+[-0, +0, –] +

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

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


lua_islightuserdata

+[-0, +0, –] +

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

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


lua_isnil

+[-0, +0, –] +

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

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


lua_isnone

+[-0, +0, –] +

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

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


lua_isnoneornil

+[-0, +0, –] +

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

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


lua_isnumber

+[-0, +0, –] +

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

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


lua_isstring

+[-0, +0, –] +

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

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


lua_istable

+[-0, +0, –] +

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

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


lua_isthread

+[-0, +0, –] +

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

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


lua_isuserdata

+[-0, +0, –] +

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

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


lua_isyieldable

+[-0, +0, –] +

int lua_isyieldable (lua_State *L);
+ +

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


lua_KContext

+
typedef ... lua_KContext;
+ +

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


lua_KFunction

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

+Type for continuation functions (see §4.7). + + + + + +


lua_len

+[-0, +1, e] +

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

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


lua_load

+[-0, +1, –] +

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

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

+The return values of lua_load are: + +

    + +
  • LUA_OK: no errors;
  • + +
  • LUA_ERRSYNTAX: +syntax error during precompilation;
  • + +
  • LUA_ERRMEM: +memory allocation (out-of-memory) error;
  • + +
  • LUA_ERRGCMM: +error while running a __gc metamethod. +(This error has no relation with the chunk being loaded. +It is generated by the garbage collector.) +
  • + +
+ +

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

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

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

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

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


lua_newstate

+[-0, +0, –] +

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

+Creates a new thread running in a new, independent state. +Returns NULL if it cannot create the thread or 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 +passes to the allocator in every call. + + + + + +


lua_newtable

+[-0, +1, m] +

void lua_newtable (lua_State *L);
+ +

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


lua_newthread

+[-0, +1, m] +

lua_State *lua_newthread (lua_State *L);
+ +

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

+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. +The host program can freely use this 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 may change +the value at the given index; +this confuses the next call to lua_next. + + +

+See function next for the caveats of modifying +the table during its traversal. + + + + + +


lua_Number

+
typedef ... lua_Number;
+ +

+The type of floats in Lua. + + +

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


lua_numbertointeger

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

+Converts a Lua float to a Lua integer. +This macro assumes that n has an integral value. +If that value is within the range of Lua integers, +it is converted to an integer and assigned to *p. +The macro results in a boolean indicating whether the +conversion was successful. +(Note that this range test can be tricky to do +correctly without this macro, +due to roundings.) + + +

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


lua_pcall

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

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

+Calls a function in protected mode. + + +

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

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

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

+The lua_pcall function returns one of the following constants +(defined in lua.h): + +

    + +
  • LUA_OK (0): +success.
  • + +
  • LUA_ERRRUN: +a runtime error. +
  • + +
  • LUA_ERRMEM: +memory allocation error. +For such errors, Lua does not call the message handler. +
  • + +
  • LUA_ERRERR: +error while running the message handler. +
  • + +
  • LUA_ERRGCMM: +error while running a __gc metamethod. +(This error typically has no relation with the function being called.) +
  • + +
+ + + + +

lua_pcallk

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

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

+This function behaves exactly like lua_pcall, +but allows the called function to yield (see §4.7). + + + + + +


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 §4.4); +these values are then accessible to the function whenever it is called. +To associate values with a C function, +first these values must 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 will be +associated with the function. +lua_pushcclosure also pops these values from the stack. + + +

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

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


lua_pushcfunction

+[-0, +1, –] +

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

+Pushes a C function onto the stack. +This function 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 callable by Lua must +follow the correct protocol to receive its parameters +and return its results (see lua_CFunction). + + + + + +


lua_pushfstring

+[-0, +1, e] +

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 ISO 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 the character '%'), +'%s' (inserts a zero-terminated string, with no size restrictions), +'%f' (inserts a lua_Number), +'%I' (inserts a lua_Integer), +'%p' (inserts a pointer as a hexadecimal numeral), +'%d' (inserts an int), +'%c' (inserts an int as a one-byte character), and +'%U' (inserts a long int as a UTF-8 byte sequence). +
  • + +
+ +

+Unlike other push functions, +this function checks for the stack space it needs, +including the slot for its result. + + + + + +


lua_pushglobaltable

+[-0, +1, –] +

void lua_pushglobaltable (lua_State *L);
+ +

+Pushes the global environment onto the stack. + + + + + +


lua_pushinteger

+[-0, +1, –] +

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

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


lua_pushlightuserdata

+[-0, +1, –] +

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

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

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


lua_pushliteral

+[-0, +1, m] +

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

+This macro is equivalent to lua_pushstring, +but should be used only when s is a literal string. + + + + + +


lua_pushlstring

+[-0, +1, m] +

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

+Pushes the string pointed to by s with size len +onto the stack. +Lua 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 any binary data, +including embedded zeros. + + +

+Returns a pointer to the internal copy of the string. + + + + + +


lua_pushnil

+[-0, +1, –] +

void lua_pushnil (lua_State *L);
+ +

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


lua_pushnumber

+[-0, +1, –] +

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

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


lua_pushstring

+[-0, +1, m] +

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

+Pushes the zero-terminated string pointed to by s +onto the stack. +Lua 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. + + +

+Returns a pointer to the internal copy of the string. + + +

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


lua_pushthread

+[-0, +1, –] +

int lua_pushthread (lua_State *L);
+ +

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


lua_pushvalue

+[-0, +1, –] +

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

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


lua_pushvfstring

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


lua_rawget

+[-1, +1, –] +

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

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


lua_rawgeti

+[-0, +1, –] +

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

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

+Returns the type of the pushed value. + + + + + +


lua_rawgetp

+[-0, +1, –] +

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

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

+Returns the type of the pushed value. + + + + + +


lua_rawlen

+[-0, +0, –] +

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

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


lua_rawset

+[-2, +0, m] +

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

+Similar to lua_settable, but does a raw assignment +(i.e., without metamethods). + + + + + +


lua_rawseti

+[-1, +0, m] +

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

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

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


lua_rawsetp

+[-1, +0, m] +

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

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

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


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


lua_replace

+[-1, +0, –] +

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

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


lua_resume

+[-?, +?, –] +

int lua_resume (lua_State *L, lua_State *from, int nargs);
+ +

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

+To start a coroutine, +you push onto the thread stack the main function plus any arguments; +then you call lua_resume, +with nargs being the number of arguments. +This call returns when the coroutine suspends or finishes its execution. +When it returns, 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, +LUA_OK 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 object is on the top of the stack. + + +

+To resume a coroutine, +you remove any results from the last lua_yield, +put on its stack only the values to +be passed as results from yield, +and then call lua_resume. + + +

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


lua_rotate

+[-0, +0, –] +

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

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


lua_setallocf

+[-0, +0, –] +

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

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


lua_setfield

+[-1, +0, e] +

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

+Does the equivalent to t[k] = v, +where t is the value at the given index +and v is the value 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.4). + + + + + +


lua_setglobal

+[-1, +0, e] +

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

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


lua_seti

+[-1, +0, e] +

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

+Does the equivalent to t[n] = v, +where t is the value at the given index +and v is the value 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.4). + + + + + +


lua_setmetatable

+[-1, +0, –] +

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


lua_settop

+[-?, +?, –] +

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

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


lua_setuservalue

+[-1, +0, –] +

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

+Pops a value from the stack and sets it as +the new value associated to the userdata at the given index. + + + + + +


lua_State

+
typedef struct lua_State lua_State;
+ +

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

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


lua_status

+[-0, +0, –] +

int lua_status (lua_State *L);
+ +

+Returns the status of the thread L. + + +

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

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


lua_stringtonumber

+[-0, +1, –] +

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

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


lua_toboolean

+[-0, +0, –] +

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

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


lua_tocfunction

+[-0, +0, –] +

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

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


lua_tointeger

+[-0, +0, –] +

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

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


lua_tointegerx

+[-0, +0, –] +

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

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

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


lua_tolstring

+[-0, +0, m] +

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

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

+lua_tolstring returns a pointer +to a string inside the Lua state. +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 Lua value is removed from the stack. + + + + + +


lua_tonumber

+[-0, +0, –] +

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

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


lua_tonumberx

+[-0, +0, –] +

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

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

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


lua_topointer

+[-0, +0, –] +

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

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

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


lua_tostring

+[-0, +0, m] +

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

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


lua_tothread

+[-0, +0, –] +

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

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


lua_touserdata

+[-0, +0, –] +

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

+If the value at the given index is a full userdata, +returns its 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 valid index, +or LUA_TNONE for a non-valid (but acceptable) index. +The types returned by lua_type are coded by the following constants +defined in lua.h: +LUA_TNIL (0), +LUA_TNUMBER, +LUA_TBOOLEAN, +LUA_TSTRING, +LUA_TTABLE, +LUA_TFUNCTION, +LUA_TUSERDATA, +LUA_TTHREAD, +and +LUA_TLIGHTUSERDATA. + + + + + +


lua_typename

+[-0, +0, –] +

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

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


lua_Unsigned

+
typedef ... lua_Unsigned;
+ +

+The unsigned version of lua_Integer. + + + + + +


lua_upvalueindex

+[-0, +0, –] +

int lua_upvalueindex (int i);
+ +

+Returns the pseudo-index that represents the i-th upvalue of +the running function (see §4.4). + + + + + +


lua_version

+[-0, +0, –] +

const lua_Number *lua_version (lua_State *L);
+ +

+Returns the address of the version number +(a C static variable) +stored in the Lua core. +When called with a valid lua_State, +returns the address of the version used to create that state. +When called with NULL, +returns the address of the version running the call. + + + + + +


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

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


lua_yield

+[-?, +?, e] +

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

+This function is equivalent to lua_yieldk, +but it has no continuation (see §4.7). +Therefore, when the thread resumes, +it continues the function that called +the function calling lua_yield. + + + + + +


lua_yieldk

+[-?, +?, e] +

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

+Yields a coroutine (thread). + + +

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

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

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

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

4.9 – 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 linedefined;            /* (S) */
+  int lastlinedefined;        /* (S) */
+  unsigned char nups;         /* (u) number of upvalues */
+  unsigned char nparams;      /* (u) number of parameters */
+  char isvararg;              /* (u) */
+  char istailcall;            /* (t) */
+  char short_src[LUA_IDSIZE]; /* (S) */
+  /* private part */
+  other fields
+} lua_Debug;
+ +

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

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

    + +
  • source: +the name of the chunk that created the function. +If source starts with a '@', +it means that the function was defined in a file where +the file name follows the '@'. +If source starts with a '=', +the remainder of its contents describe the source in a user-dependent manner. +Otherwise, +the function was defined in a string where +source is that string. +
  • + +
  • short_src: +a "printable" version of source, to be used in error messages. +
  • + +
  • linedefined: +the line number where the definition of the function starts. +
  • + +
  • lastlinedefined: +the line number where the definition of the function ends. +
  • + +
  • what: +the string "Lua" if the function is a Lua function, +"C" if it is a C function, +"main" if it is the main part of a chunk. +
  • + +
  • currentline: +the current line where the given function is executing. +When no line information is available, +currentline is set to -1. +
  • + +
  • name: +a reasonable name for the given function. +Because functions in Lua are first-class values, +they do not have a fixed name: +some functions can be the value of multiple global variables, +while others can be stored only in a table field. +The lua_getinfo function checks how the function was +called to find a suitable name. +If it cannot find a name, +then name is set to NULL. +
  • + +
  • namewhat: +explains the name field. +The value of namewhat can be +"global", "local", "method", +"field", "upvalue", or "" (the empty string), +according to how the function was called. +(Lua uses the empty string when no other option seems to apply.) +
  • + +
  • istailcall: +true if this function invocation was called by a tail call. +In this case, the caller of this level is not in the stack. +
  • + +
  • nups: +the number of upvalues of the function. +
  • + +
  • nparams: +the number of fixed parameters of the function +(always 0 for C functions). +
  • + +
  • isvararg: +true if the function is a vararg function +(always true for C functions). +
  • + +
+ + + + +

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), e] +

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

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

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

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

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

+Each character in the string what +selects some fields of the structure ar to be filled or +a value to be pushed on the stack: + +

    + +
  • '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; +
  • + +
  • 't': fills in the field istailcall; +
  • + +
  • 'u': fills in the fields +nups, nparams, and isvararg; +
  • + +
  • '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.) + + +

    +If this option is given together with option 'f', +its table is pushed after the function. +

  • + +
+ +

+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, const lua_Debug *ar, int n);
+ +

+Gets information about a local variable of +a given activation record or a given function. + + +

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

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

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

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


lua_getstack

+[-0, +0, –] +

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

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

+This function fills parts of a lua_Debug structure with +an identification of the activation record +of the function executing at a given level. +Level 0 is the current running function, +whereas level n+1 is the function that has called level n +(except for tail calls, which do not count on the stack). +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 the n-th upvalue +of the closure at index funcindex. +It pushes the upvalue's value onto the stack +and returns its name. +Returns NULL (and pushes nothing) +when the index n is greater than the number of upvalues. + + +

+For C functions, this function uses the empty string "" +as a name for all upvalues. +(For Lua functions, +upvalues are the external local variables that the function uses, +and that are consequently included in its closure.) + + +

+Upvalues have no particular order, +as they are active through the whole function. +They are numbered in an arbitrary order. + + + + + +


lua_Hook

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

+Type for debugging hook functions. + + +

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

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

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

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

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


lua_sethook

+[-0, +0, –] +

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

+Sets the debugging hook function. + + +

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

    + +
  • The call hook: is called when the interpreter calls a function. +The hook is called just after Lua enters the new function, +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. +There is no standard way to access 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, const lua_Debug *ar, int n);
+ +

+Sets the value of a local variable of a given activation record. +It 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. + + +

+Parameters ar and n are as in function lua_getlocal. + + + + + +


lua_setupvalue

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

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

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

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

+Parameters funcindex and n are as in function lua_getupvalue. + + + + + +


lua_upvalueid

+[-0, +0, –] +

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

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

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

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


lua_upvaluejoin

+[-0, +0, –] +

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

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

5 – The Auxiliary Library

+ +

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

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

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

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

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

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

5.1 – Functions and Types

+ +

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


luaL_addchar

+[-?, +?, m] +

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

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


luaL_addlstring

+[-?, +?, m] +

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

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


luaL_addsize

+[-?, +?, –] +

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

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


luaL_addstring

+[-?, +?, m] +

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

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


luaL_addvalue

+[-1, +?, 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 arg,
+                    const char *extramsg);
+ +

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


luaL_argerror

+[-0, +0, v] +

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

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

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

+This function never returns. + + + + + +


luaL_Buffer

+
typedef struct luaL_Buffer luaL_Buffer;
+ +

+Type for a string buffer. + + +

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

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

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

    + +
  • First declare a variable b of type luaL_Buffer.
  • + +
  • Then initialize it and preallocate a space of +size sz with a call luaL_buffinitsize(L, &b, sz).
  • + +
  • Then copy the string into that space.
  • + +
  • +Finish by calling luaL_pushresultsize(&b, sz), +where sz is the total size of the resulting string +copied into that space. +
  • + +
+ +

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

+[-?, +?, m] +

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

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


luaL_callmeta

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

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

+Calls a metamethod. + + +

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


luaL_checkany

+[-0, +0, v] +

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

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


luaL_checkinteger

+[-0, +0, v] +

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

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


luaL_checklstring

+[-0, +0, v] +

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

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

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


luaL_checkoption

+[-0, +0, v] +

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

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

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

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


luaL_checkstack

+[-0, +0, v] +

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

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


luaL_checkstring

+[-0, +0, v] +

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

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

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


luaL_checktype

+[-0, +0, v] +

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

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


luaL_checkudata

+[-0, +0, v] +

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

+Checks whether the function argument arg is a userdata +of the type tname (see luaL_newmetatable) and +returns the userdata address (see lua_touserdata). + + + + + +


luaL_checkversion

+[-0, +0, v] +

void luaL_checkversion (lua_State *L);
+ +

+Checks whether the core running the call, +the core that created the Lua state, +and the code making the call are all using the same version of Lua. +Also checks whether the core running the call +and the core that created the Lua state +are using the same address space. + + + + + +


luaL_dofile

+[-0, +?, e] +

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


luaL_dostring

+[-0, +?, –] +

int luaL_dostring (lua_State *L, const char *str);
+ +

+Loads and runs the given string. +It is defined as the following macro: + +

+     (luaL_loadstring(L, str) || lua_pcall(L, 0, LUA_MULTRET, 0))
+

+It returns false if there are no errors +or true in case of errors. + + + + + +


luaL_error

+[-0, +0, v] +

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

+Raises an error. +The error message format is given by fmt +plus any extra arguments, +following the same rules of lua_pushfstring. +It also adds at the beginning of the message the file name and +the line number where the error occurred, +if this information is available. + + +

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


luaL_execresult

+[-0, +3, m] +

int luaL_execresult (lua_State *L, int stat);
+ +

+This function produces the return values for +process-related functions in the standard library +(os.execute and io.close). + + + + + +


luaL_fileresult

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

int luaL_fileresult (lua_State *L, int stat, const char *fname);
+ +

+This function produces the return values for +file-related functions in the standard library +(io.open, os.rename, file:seek, etc.). + + + + + +


luaL_getmetafield

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

int luaL_getmetafield (lua_State *L, int obj, const char *e);
+ +

+Pushes onto the stack the field e from the metatable +of the object at index obj and returns the type of pushed value. +If the object does not have a metatable, +or if the metatable does not have this field, +pushes nothing and returns LUA_TNIL. + + + + + +


luaL_getmetatable

+[-0, +1, m] +

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

+Pushes onto the stack the metatable associated with name tname +in the registry (see luaL_newmetatable) +(nil if there is no metatable associated with that name). +Returns the type of the pushed value. + + + + + +


luaL_getsubtable

+[-0, +1, e] +

int luaL_getsubtable (lua_State *L, int idx, const char *fname);
+ +

+Ensures that the value t[fname], +where t is the value at index idx, +is a table, +and pushes that table onto the stack. +Returns true if it finds a previous table there +and false if it creates a new table. + + + + + +


luaL_gsub

+[-0, +1, m] +

const char *luaL_gsub (lua_State *L,
+                       const char *s,
+                       const char *p,
+                       const char *r);
+ +

+Creates a copy of string s by replacing +any occurrence of the string p +with the string r. +Pushes the resulting string on the stack and returns it. + + + + + +


luaL_len

+[-0, +0, e] +

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

+Returns the "length" of the value at the given index +as a number; +it is equivalent to the '#' operator in Lua (see §3.4.7). +Raises an error if the result of the operation is not an integer. +(This case only can happen through metamethods.) + + + + + +


luaL_loadbuffer

+[-0, +1, –] +

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

+Equivalent to luaL_loadbufferx with mode equal to NULL. + + + + + +


luaL_loadbufferx

+[-0, +1, –] +

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

+Loads a buffer as a Lua chunk. +This function uses lua_load to load the chunk in the +buffer pointed to by buff with size sz. + + +

+This function returns the same results as lua_load. +name is the chunk name, +used for debug information and error messages. +The string mode works as in function lua_load. + + + + + +


luaL_loadfile

+[-0, +1, m] +

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

+Equivalent to luaL_loadfilex with mode equal to NULL. + + + + + +


luaL_loadfilex

+[-0, +1, m] +

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

+Loads a file as a Lua chunk. +This function uses lua_load to load the chunk in the file +named filename. +If filename is NULL, +then it loads from the standard input. +The first line in the file is ignored if it starts with a #. + + +

+The string mode works as in function lua_load. + + +

+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 or the file has a wrong mode. + + +

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


luaL_loadstring

+[-0, +1, –] +

int luaL_loadstring (lua_State *L, const char *s);
+ +

+Loads a string as a Lua chunk. +This function uses lua_load to load the chunk in +the zero-terminated string s. + + +

+This function returns the same results as lua_load. + + +

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


luaL_newlib

+[-0, +1, m] +

void luaL_newlib (lua_State *L, const luaL_Reg l[]);
+ +

+Creates a new table and registers there +the functions in list l. + + +

+It is implemented as the following macro: + +

+     (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
+

+The array l must be the actual array, +not a pointer to it. + + + + + +


luaL_newlibtable

+[-0, +1, m] +

void luaL_newlibtable (lua_State *L, const luaL_Reg l[]);
+ +

+Creates a new table with a size optimized +to store all entries in the array l +(but does not actually store them). +It is intended to be used in conjunction with luaL_setfuncs +(see luaL_newlib). + + +

+It is implemented as a macro. +The array l must be the actual array, +not a pointer to it. + + + + + +


luaL_newmetatable

+[-0, +1, m] +

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

+If the registry already has the key tname, +returns 0. +Otherwise, +creates a new table to be used as a metatable for userdata, +adds to this new table the pair __name = tname, +adds to the registry the pair [tname] = new table, +and returns 1. +(The entry __name is used by some error-reporting functions.) + + +

+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 §4.6) 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, e] +

void luaL_openlibs (lua_State *L);
+ +

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


luaL_opt

+[-0, +0, e] +

T luaL_opt (L, func, arg, dflt);
+ +

+This macro is defined as follows: + +

+     (lua_isnoneornil(L,(arg)) ? (dflt) : func(L,(arg)))
+

+In words, if the argument arg is nil or absent, +the macro results in the default dflt. +Otherwise, it results in the result of calling func +with the state L and the argument index arg as +parameters. +Note that it evaluates the expression dflt only if needed. + + + + + +


luaL_optinteger

+[-0, +0, v] +

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

+If the function argument arg is an integer +(or convertible to an integer), +returns this integer. +If this argument is absent or is nil, +returns d. +Otherwise, raises an error. + + + + + +


luaL_optlstring

+[-0, +0, v] +

const char *luaL_optlstring (lua_State *L,
+                             int arg,
+                             const char *d,
+                             size_t *l);
+ +

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

+If l is not NULL, +fills the position *l with the result's length. +If the result is NULL +(only possible when returning d and d == NULL), +its length is considered zero. + + + + + +


luaL_optnumber

+[-0, +0, v] +

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

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


luaL_optstring

+[-0, +0, v] +

const char *luaL_optstring (lua_State *L,
+                            int arg,
+                            const char *d);
+ +

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


luaL_prepbuffer

+[-?, +?, m] +

char *luaL_prepbuffer (luaL_Buffer *B);
+ +

+Equivalent to luaL_prepbuffsize +with the predefined size LUAL_BUFFERSIZE. + + + + + +


luaL_prepbuffsize

+[-?, +?, m] +

char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz);
+ +

+Returns an address to a space of size sz +where you can copy a string to be added to buffer B +(see luaL_Buffer). +After copying the string into this space you must call +luaL_addsize with the size of the string to actually add +it to the buffer. + + + + + +


luaL_pushresult

+[-?, +1, m] +

void luaL_pushresult (luaL_Buffer *B);
+ +

+Finishes the use of buffer B leaving the final string on +the top of the stack. + + + + + +


luaL_pushresultsize

+[-?, +1, m] +

void luaL_pushresultsize (luaL_Buffer *B, size_t sz);
+ +

+Equivalent to the sequence luaL_addsize, luaL_pushresult. + + + + + +


luaL_ref

+[-1, +0, m] +

int luaL_ref (lua_State *L, int t);
+ +

+Creates and returns a reference, +in the table at index t, +for the object 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_setfuncs. +name is the function name and func is a pointer to +the function. +Any array of luaL_Reg must end with a sentinel entry +in which both name and func are NULL. + + + + + +


luaL_requiref

+[-0, +1, e] +

void luaL_requiref (lua_State *L, const char *modname,
+                    lua_CFunction openf, int glb);
+ +

+If modname is not already present in package.loaded, +calls function openf with string modname as an argument +and sets the call result in package.loaded[modname], +as if that function has been called through require. + + +

+If glb is true, +also stores the module into global modname. + + +

+Leaves a copy of the module on the stack. + + + + + +


luaL_setfuncs

+[-nup, +0, m] +

void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
+ +

+Registers all functions in the array l +(see luaL_Reg) into the table on the top of the stack +(below optional upvalues, see next). + + +

+When nup is not zero, +all functions are created sharing nup upvalues, +which must be previously pushed on the stack +on top of the library table. +These values are popped from the stack after the registration. + + + + + +


luaL_setmetatable

+[-0, +0, –] +

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

+Sets the metatable of the object at the top of the stack +as the metatable associated with name tname +in the registry (see luaL_newmetatable). + + + + + +


luaL_Stream

+
typedef struct luaL_Stream {
+  FILE *f;
+  lua_CFunction closef;
+} luaL_Stream;
+ +

+The standard representation for file handles, +which is used by the standard I/O library. + + +

+A file handle is implemented as a full userdata, +with a metatable called LUA_FILEHANDLE +(where LUA_FILEHANDLE is a macro with the actual metatable's name). +The metatable is created by the I/O library +(see luaL_newmetatable). + + +

+This userdata must start with the structure luaL_Stream; +it can contain other data after this initial structure. +Field f points to the corresponding C stream +(or it can be NULL to indicate an incompletely created handle). +Field closef points to a Lua function +that will be called to close the stream +when the handle is closed or collected; +this function receives the file handle as its sole argument and +must return either true (in case of success) +or nil plus an error message (in case of error). +Once Lua calls this field, +it changes the field value to NULL +to signal that the handle is closed. + + + + + +


luaL_testudata

+[-0, +0, m] +

void *luaL_testudata (lua_State *L, int arg, const char *tname);
+ +

+This function works like luaL_checkudata, +except that, when the test fails, +it returns NULL instead of raising an error. + + + + + +


luaL_tolstring

+[-0, +1, e] +

const char *luaL_tolstring (lua_State *L, int idx, size_t *len);
+ +

+Converts any Lua value at the given index to a C string +in a reasonable format. +The resulting string is pushed onto the stack and also +returned by the function. +If len is not NULL, +the function also sets *len with the string length. + + +

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


luaL_traceback

+[-0, +1, m] +

void luaL_traceback (lua_State *L, lua_State *L1, const char *msg,
+                     int level);
+ +

+Creates and pushes a traceback of the stack L1. +If msg is not NULL it is appended +at the beginning of the traceback. +The level parameter tells at which level +to start the traceback. + + + + + +


luaL_typename

+[-0, +0, –] +

const char *luaL_typename (lua_State *L, int index);
+ +

+Returns the name of the type of the value at the given index. + + + + + +


luaL_unref

+[-0, +0, –] +

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

+Releases reference ref from the table at index t +(see luaL_ref). +The entry is removed from the table, +so that the referred object can be collected. +The reference ref is also freed to be used again. + + +

+If ref is LUA_NOREF or LUA_REFNIL, +luaL_unref does nothing. + + + + + +


luaL_where

+[-0, +1, m] +

void luaL_where (lua_State *L, int lvl);
+ +

+Pushes onto the stack a string identifying the current position +of the control at level lvl in the call stack. +Typically this string has the following format: + +

+     chunkname:currentline:
+

+Level 0 is the running function, +level 1 is the function that called the running function, +etc. + + +

+This function is used to build a prefix for error messages. + + + + + + + +

6 – 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 (§6.1);
  • + +
  • coroutine library (§6.2);
  • + +
  • package library (§6.3);
  • + +
  • string manipulation (§6.4);
  • + +
  • basic UTF-8 support (§6.5);
  • + +
  • table manipulation (§6.6);
  • + +
  • mathematical functions (§6.7) (sin, log, etc.);
  • + +
  • input and output (§6.8);
  • + +
  • operating system facilities (§6.9);
  • + +
  • debug facilities (§6.10).
  • + +

+Except for the basic and the package libraries, +each library provides all its functions as fields of a global table +or as methods of its objects. + + +

+To have access to these libraries, +the C host program should call the luaL_openlibs function, +which opens all standard libraries. +Alternatively, +the host program can open them individually by using +luaL_requiref to call +luaopen_base (for the basic library), +luaopen_package (for the package library), +luaopen_coroutine (for the coroutine library), +luaopen_string (for the string library), +luaopen_utf8 (for the UTF8 library), +luaopen_table (for the table library), +luaopen_math (for the mathematical library), +luaopen_io (for the I/O library), +luaopen_os (for the operating system library), +and luaopen_debug (for the debug library). +These functions are declared in lualib.h. + + + +

6.1 – Basic Functions

+ +

+The basic library provides core functions to Lua. +If you do not include this library in your application, +you should check carefully whether you need to provide +implementations for some of its facilities. + + +

+


assert (v [, message])

+ + +

+Calls error if +the value of its argument v is false (i.e., nil or false); +otherwise, returns all its arguments. +In case of error, +message is the error object; +when absent, it defaults to "assertion failed!" + + + + +

+


collectgarbage ([opt [, arg]])

+ + +

+This function is a generic interface to the garbage collector. +It performs different functions according to its first argument, opt: + +

    + +
  • "collect": +performs a full garbage-collection cycle. +This is the default option. +
  • + +
  • "stop": +stops automatic execution of the garbage collector. +The collector will run only when explicitly invoked, +until a call to restart it. +
  • + +
  • "restart": +restarts automatic execution of the garbage collector. +
  • + +
  • "count": +returns the total memory in use by Lua in Kbytes. +The value has a fractional part, +so that it multiplied by 1024 +gives the exact number of bytes in use by Lua +(except for overflows). +
  • + +
  • "step": +performs a garbage-collection step. +The step "size" is controlled by arg. +With a zero value, +the collector will perform one basic (indivisible) step. +For non-zero values, +the collector will perform as if that amount of memory +(in KBytes) had been allocated by Lua. +Returns true if the step finished a collection cycle. +
  • + +
  • "setpause": +sets arg as the new value for the pause of +the collector (see §2.5). +Returns the previous value for pause. +
  • + +
  • "setstepmul": +sets arg as the new value for the step multiplier of +the collector (see §2.5). +Returns the previous value for step. +
  • + +
  • "isrunning": +returns a boolean that tells whether the collector is running +(i.e., not stopped). +
  • + +
+ + + +

+


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 object. +Function error never returns. + + +

+Usually, error adds some information about the error position +at the beginning of the message, if the message is a string. +The level argument specifies how to get the error position. +With level 1 (the default), the error position is where the +error function was called. +Level 2 points the error to where the function +that called error was called; and so on. +Passing a level 0 avoids the addition of error position information +to the message. + + + + +

+


_G

+A global variable (not a function) that +holds the global environment (see §2.2). +Lua itself does not use this variable; +changing its value does not affect any environment, +nor vice versa. + + + + +

+


getmetatable (object)

+ + +

+If object does not have a metatable, returns nil. +Otherwise, +if the object's metatable has a __metatable field, +returns the associated value. +Otherwise, returns the metatable of the given object. + + + + +

+


ipairs (t)

+ + +

+Returns three values (an iterator function, the table t, and 0) +so that the construction + +

+     for i,v in ipairs(t) do body end
+

+will iterate over the key–value pairs +(1,t[1]), (2,t[2]), ..., +up to the first nil value. + + + + +

+


load (chunk [, chunkname [, mode [, env]]])

+ + +

+Loads a chunk. + + +

+If chunk is a string, the chunk is this string. +If chunk is a function, +load calls it repeatedly to get the chunk pieces. +Each call to chunk must return a string that concatenates +with previous results. +A return of an empty string, nil, or no value signals the end of the chunk. + + +

+If there are no syntactic errors, +returns the compiled chunk as a function; +otherwise, returns nil plus the error message. + + +

+If the resulting function has upvalues, +the first upvalue is set to the value of env, +if that parameter is given, +or to the value of the global environment. +Other upvalues are initialized with nil. +(When you load a main chunk, +the resulting function will always have exactly one upvalue, +the _ENV variable (see §2.2). +However, +when you load a binary chunk created from a function (see string.dump), +the resulting function can have an arbitrary number of upvalues.) +All upvalues are fresh, that is, +they are not shared with any other function. + + +

+chunkname is used as the name of the chunk for error messages +and debug information (see §4.9). +When absent, +it defaults to chunk, if chunk is a string, +or to "=(load)" otherwise. + + +

+The string mode controls whether the chunk can be text or binary +(that is, a precompiled chunk). +It may be the string "b" (only binary chunks), +"t" (only text chunks), +or "bt" (both binary and text). +The default is "bt". + + +

+Lua does not check the consistency of binary chunks. +Maliciously crafted binary chunks can crash +the interpreter. + + + + +

+


loadfile ([filename [, mode [, env]]])

+ + +

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

+


next (table [, index])

+ + +

+Allows a program to traverse all fields of a table. +Its first argument is a table and its second argument +is an index in this table. +next returns the next index of the table +and its associated value. +When called with nil as its second argument, +next returns an initial index +and its associated value. +When called with the last index, +or with nil in an empty table, +next returns nil. +If the second argument is absent, then it is interpreted as nil. +In particular, +you can use next(t) to check whether a table is empty. + + +

+The order in which the indices are enumerated is not specified, +even for numeric indices. +(To traverse a table in numerical order, +use a numerical for.) + + +

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

+ + +

+If t has a metamethod __pairs, +calls it with t as argument and returns the first three +results from the call. + + +

+Otherwise, +returns three values: the next function, the table t, and nil, +so that the construction + +

+     for k,v in pairs(t) do body end
+

+will iterate over all key–value pairs of table t. + + +

+See function next for the caveats of modifying +the table during its traversal. + + + + +

+


pcall (f [, arg1, ···])

+ + +

+Calls 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 each argument to a string. +print is not intended for formatted output, +but only as a quick way to show a value, +for instance for debugging. +For complete control over the output, +use string.format and io.write. + + + + +

+


rawequal (v1, v2)

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

+


rawget (table, index)

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

+


rawlen (v)

+Returns the length of the object v, +which must be a table or a string, +without invoking the __len metamethod. +Returns an integer. + + + + +

+


rawset (table, index, value)

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

+This function returns table. + + + + +

+


select (index, ···)

+ + +

+If index is a number, +returns all arguments after argument number index; +a negative number indexes from the end (-1 is the last argument). +Otherwise, index must be the string "#", +and select returns the total number of extra arguments it received. + + + + +

+


setmetatable (table, metatable)

+ + +

+Sets the metatable for the given table. +(To change the metatable of other types from Lua code, +you must use the debug library (§6.10).) +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])

+ + +

+When called with no base, +tonumber tries to convert its argument to a number. +If the argument is already a number or +a string convertible to a number, +then tonumber returns this number; +otherwise, it returns nil. + + +

+The conversion of strings can result in integers or floats, +according to the lexical conventions of Lua (see §3.1). +(The string may have leading and trailing spaces and a sign.) + + +

+When called with base, +then e must be a string to be interpreted as +an integer numeral in that base. +The base may be any integer between 2 and 36, inclusive. +In bases above 10, the letter 'A' (in either upper or lower case) +represents 10, 'B' represents 11, and so forth, +with 'Z' representing 35. +If the string e is not a valid numeral in the given base, +the function returns nil. + + + + +

+


tostring (v)

+Receives a value of any type and +converts it to a string in a human-readable format. +(For complete control of how numbers are converted, +use string.format.) + + +

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

+


type (v)

+Returns the type of its only argument, coded as a string. +The possible results of this function are +"nil" (a string, not the value nil), +"number", +"string", +"boolean", +"table", +"function", +"thread", +and "userdata". + + + + +

+


_VERSION

+ + +

+A global variable (not a function) that +holds a string containing the running Lua version. +The current value of this variable is "Lua 5.3". + + + + +

+


xpcall (f, msgh [, arg1, ···])

+ + +

+This function is similar to pcall, +except that it sets a new message handler msgh. + + + + + + + +

6.2 – Coroutine Manipulation

+ +

+This library comprises the operations to manipulate coroutines, +which come inside the table coroutine. +See §2.6 for a general description of coroutines. + + +

+


coroutine.create (f)

+ + +

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

+


coroutine.isyieldable ()

+ + +

+Returns true when the running coroutine can yield. + + +

+A running coroutine is yieldable if it is not the main thread and +it is not inside a non-yieldable C function. + + + + +

+


coroutine.resume (co [, val1, ···])

+ + +

+Starts or continues the execution of coroutine co. +The first time you resume a coroutine, +it starts running its body. +The values val1, ... are passed +as the arguments to the body function. +If the coroutine has yielded, +resume restarts it; +the values val1, ... are passed +as the results from the yield. + + +

+If the coroutine runs without any errors, +resume returns true plus any values passed to yield +(when the coroutine yields) or any values returned by the body function +(when the coroutine terminates). +If there is any error, +resume returns false plus the error message. + + + + +

+


coroutine.running ()

+ + +

+Returns the running coroutine plus a boolean, +true when the running coroutine is the main one. + + + + +

+


coroutine.status (co)

+ + +

+Returns the status of 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 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. +Any arguments to yield are passed as extra results to resume. + + + + + + + +

6.3 – Modules

+ +

+The package library provides basic +facilities for loading modules in Lua. +It exports one function directly in the global environment: +require. +Everything else is exported in a table package. + + +

+


require (modname)

+ + +

+Loads the given module. +The function starts by looking into the package.loaded table +to determine whether modname is already loaded. +If it is, then require returns the value stored +at package.loaded[modname]. +Otherwise, it tries to find a loader for the module. + + +

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

+First require queries package.preload[modname]. +If it has a value, +this value (which must be a function) is the loader. +Otherwise require searches for a Lua loader using the +path stored in package.path. +If that also fails, it searches for a C loader using the +path stored in package.cpath. +If that also fails, +it tries an all-in-one loader (see package.searchers). + + +

+Once a loader is found, +require calls the loader with two arguments: +modname and an extra value dependent on how it got the loader. +(If the loader came from a file, +this extra value is the file name.) +If the loader returns any non-nil value, +require assigns the returned value to package.loaded[modname]. +If the loader does not return a non-nil value and +has not assigned any value to package.loaded[modname], +then require assigns true to this entry. +In any case, require returns the +final value of package.loaded[modname]. + + +

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

+


package.config

+ + +

+A string describing some compile-time configurations for packages. +This string is a sequence of lines: + +

    + +
  • The first line is the directory separator string. +Default is '\' for Windows and '/' for all other systems.
  • + +
  • The second line is the character that separates templates in a path. +Default is ';'.
  • + +
  • The third line is the string that marks the +substitution points in a template. +Default is '?'.
  • + +
  • The fourth line is a string that, in a path in Windows, +is replaced by the executable's directory. +Default is '!'.
  • + +
  • The fifth line is a mark to ignore all text after it +when building the luaopen_ function name. +Default is '-'.
  • + +
+ + + +

+


package.cpath

+ + +

+The path used by require to search for a C loader. + + +

+Lua initializes the C path package.cpath in the same way +it initializes the Lua path package.path, +using the environment variable LUA_CPATH_5_3 +or the environment variable LUA_CPATH +or a default path defined in luaconf.h. + + + + +

+


package.loaded

+ + +

+A table used by require to control which +modules are already loaded. +When you require a module modname and +package.loaded[modname] is not false, +require simply returns the value stored there. + + +

+This variable is only a reference to the real table; +assignments to this variable do not change the +table used by require. + + + + +

+


package.loadlib (libname, funcname)

+ + +

+Dynamically links the host program with the C library libname. + + +

+If funcname is "*", +then it only links with the library, +making the symbols exported by the library +available to other dynamically linked libraries. +Otherwise, +it looks for a function funcname inside the library +and returns this function as a C function. +So, funcname must follow the lua_CFunction prototype +(see lua_CFunction). + + +

+This is a low-level function. +It completely bypasses the package and module system. +Unlike require, +it does not perform any path searching and +does not automatically adds extensions. +libname must be the complete file name of the C library, +including if necessary a path and an extension. +funcname must be the exact name exported by the C library +(which may depend on the C compiler and linker used). + + +

+This function is not supported by Standard 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_5_3 or +the environment variable LUA_PATH or +with a default path defined in luaconf.h, +if those environment variables are 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). + + +

+This variable is only a reference to the real table; +assignments to this variable do not change the +table used by require. + + + + +

+


package.searchers

+ + +

+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) +plus an extra value that will be passed to that 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 searcher functions. + + +

+The first searcher simply looks for a loader in the +package.preload table. + + +

+The second searcher looks for a loader as a Lua library, +using the path stored at package.path. +The search is done as described in function package.searchpath. + + +

+The third searcher looks for a loader as a C library, +using the path given by the variable package.cpath. +Again, +the search is done as described in function package.searchpath. +For instance, +if the C path is the string + +

+     "./?.so;./?.dll;/usr/local/?/init.so"
+

+the searcher for module foo +will try to open the files ./foo.so, ./foo.dll, +and /usr/local/foo/init.so, in that order. +Once it finds a C library, +this searcher first uses a dynamic link facility to link the +application with the library. +Then it tries to find a C function inside the library to +be used as the loader. +The name of this C function is the string "luaopen_" +concatenated with a copy of the module name where each dot +is replaced by an underscore. +Moreover, if the module name has a hyphen, +its suffix after (and including) the first hyphen is removed. +For instance, if the module name is a.b.c-v2.1, +the function name will be luaopen_a_b_c. + + +

+The fourth searcher tries an all-in-one loader. +It searches the C path for a library for +the root name of the given module. +For instance, when requiring a.b.c, +it will search for a C library for a. +If found, it looks into it for an open function for +the submodule; +in our example, that would be luaopen_a_b_c. +With this facility, a package can pack several C submodules +into one single library, +with each submodule keeping its original open function. + + +

+All searchers except the first one (preload) return as the extra value +the file name where the module was found, +as returned by package.searchpath. +The first searcher returns no extra value. + + + + +

+


package.searchpath (name, path [, sep [, rep]])

+ + +

+Searches for the given name in the given path. + + +

+A path is a string containing a sequence of +templates separated by semicolons. +For each template, +the function replaces each interrogation mark (if any) +in the template with a copy of name +wherein all occurrences of sep +(a dot, by default) +were replaced by rep +(the system's directory separator, by default), +and then tries to open the resulting file name. + + +

+For instance, if the path is the string + +

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

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

+Returns the resulting name of the first file that it can +open in read mode (after closing the file), +or nil plus an error message if none succeeds. +(This error message lists all file names it tried to open.) + + + + + + + +

6.4 – String Manipulation

+ +

+This library provides generic functions for string manipulation, +such as finding and extracting substrings, and pattern matching. +When indexing a string in Lua, the first character is at position 1 +(not at 0, as in C). +Indices are allowed to be negative and are interpreted as indexing backwards, +from the end of the string. +Thus, the last character is at position -1, and so on. + + +

+The string library provides all its functions inside the table +string. +It also sets a metatable for strings +where the __index field points to the string table. +Therefore, you can use the string functions in object-oriented style. +For instance, string.byte(s,i) +can be written as s:byte(i). + + +

+The string library assumes one-byte character encodings. + + +

+


string.byte (s [, i [, j]])

+Returns the internal numeric codes of the characters s[i], +s[i+1], ..., s[j]. +The default value for i is 1; +the default value for j is i. +These indices are corrected +following the same rules of function string.sub. + + +

+Numeric codes are not necessarily portable across platforms. + + + + +

+


string.char (···)

+Receives zero or more integers. +Returns a string with length equal to the number of arguments, +in which each character has the internal numeric code equal +to its corresponding argument. + + +

+Numeric codes are not necessarily portable across platforms. + + + + +

+


string.dump (function [, strip])

+ + +

+Returns a string containing a binary representation +(a binary chunk) +of the given function, +so that a later load on this string returns +a copy of the function (but with new upvalues). +If strip is a true value, +the binary representation may not include all debug information +about the function, +to save space. + + +

+Functions with upvalues have only their number of upvalues saved. +When (re)loaded, +those upvalues receive fresh instances containing nil. +(You can use the debug library to serialize +and reload the upvalues of a function +in a way adequate to your needs.) + + + + +

+


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

+ + +

+Looks for the first match of +pattern (see §6.4.1) in the string s. +If it finds a match, then find returns the indices of s +where this occurrence starts and ends; +otherwise, it returns nil. +A third, optional numeric 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 ISO C function sprintf. +The only differences are that the options/modifiers +*, h, L, l, n, +and p are not supported +and that there is an extra option, q. + + +

+The q option formats a string between double quotes, +using escape sequences when necessary to ensure that +it can safely be read back by the Lua interpreter. +For instance, the call + +

+     string.format('%q', 'a string with "quotes" and \n new line')
+

+may produce the string: + +

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

+Options +A, a, E, e, f, +G, and g all expect a number as argument. +Options c, d, +i, o, u, X, and x +expect an integer. +When Lua is compiled with a C89 compiler, +options A and a (hexadecimal floats) +do not support any modifier (flags, width, length). + + +

+Option s expects a string; +if its argument is not a string, +it is converted to one following the same rules of tostring. +If the option has any modifier (flags, width, length), +the string argument should not contain embedded zeros. + + + + +

+


string.gmatch (s, pattern)

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

+As an example, the following loop +will iterate over all the words from string s, +printing one per line: + +

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

+The next example collects all pairs key=value from the +given string into a table: + +

+     t = {}
+     s = "from=world, to=Lua"
+     for k, v in string.gmatch(s, "(%w+)=(%w+)") do
+       t[k] = v
+     end
+
+ +

+For this function, a caret '^' at the start of a pattern does not +work as an anchor, as this would prevent the iteration. + + + + +

+


string.gsub (s, pattern, repl [, n])

+Returns a copy of s +in which all (or the first n, if given) +occurrences of the pattern (see §6.4.1) have been +replaced by a replacement string specified by repl, +which can be a string, a table, or a function. +gsub also returns, as its second value, +the total number of matches that occurred. +The name gsub comes from Global SUBstitution. + + +

+If repl is a string, then its value is used for replacement. +The character % works as an escape character: +any sequence in repl of the form %d, +with d between 1 and 9, +stands for the value of the d-th captured substring. +The sequence %0 stands for the whole match. +The sequence %% stands for a single %. + + +

+If repl is a table, then the table is queried for every match, +using the first capture as the key. + + +

+If repl is a function, then this function is called every time a +match occurs, with all captured substrings passed as arguments, +in order. + + +

+In any case, +if the pattern specifies no captures, +then it behaves as if the whole pattern was inside a capture. + + +

+If the value returned by the table query or by the function call +is a string or a number, +then it is used as the replacement string; +otherwise, if it is false or nil, +then there is no replacement +(that is, the original match is kept in the string). + + +

+Here are some examples: + +

+     x = string.gsub("hello world", "(%w+)", "%1 %1")
+     --> x="hello hello world world"
+     
+     x = string.gsub("hello world", "%w+", "%0 %0", 1)
+     --> x="hello hello world"
+     
+     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
+     --> x="world hello Lua from"
+     
+     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
+     --> x="home = /home/roberto, user = roberto"
+     
+     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
+           return load(s)()
+         end)
+     --> x="4+5 = 9"
+     
+     local t = {name="lua", version="5.3"}
+     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
+     --> x="lua-5.3.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 (see §6.4.1) 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 numeric argument init specifies +where to start the search; +its default value is 1 and can be negative. + + + + +

+


string.pack (fmt, v1, v2, ···)

+ + +

+Returns a binary string containing the values v1, v2, etc. +packed (that is, serialized in binary form) +according to the format string fmt (see §6.4.2). + + + + +

+


string.packsize (fmt)

+ + +

+Returns the size of a string resulting from string.pack +with the given format. +The format string cannot have the variable-length options +'s' or 'z' (see §6.4.2). + + + + +

+


string.rep (s, n [, sep])

+Returns a string that is the concatenation of n copies of +the string s separated by the string sep. +The default value for sep is the empty string +(that is, no separator). +Returns the empty string if n is not positive. + + +

+(Note that it is very easy to exhaust the memory of your machine +with a single call to this function.) + + + + +

+


string.reverse (s)

+Returns a string that is the string s reversed. + + + + +

+


string.sub (s, i [, j])

+Returns the substring of s that +starts at i and continues until j; +i and j can be negative. +If j is absent, then it is assumed to be equal to -1 +(which is the same as the string length). +In particular, +the call string.sub(s,1,j) returns a prefix of s +with length j, +and string.sub(s, -i) returns a suffix of s +with length i. + + +

+If, after the translation of negative indices, +i is less than 1, +it is corrected to 1. +If j is greater than the string length, +it is corrected to that length. +If, after these corrections, +i is greater than j, +the function returns the empty string. + + + + +

+


string.unpack (fmt, s [, pos])

+ + +

+Returns the values packed in string s (see string.pack) +according to the format string fmt (see §6.4.2). +An optional pos marks where +to start reading in s (default is 1). +After the read values, +this function also returns the index of the first unread byte in s. + + + + +

+


string.upper (s)

+Receives a string and returns a copy of this string with all +lowercase letters changed to uppercase. +All other characters are left unchanged. +The definition of what a lowercase letter is depends on the current locale. + + + + + +

6.4.1 – Patterns

+ +

+Patterns in Lua are described by regular strings, +which are interpreted as patterns by the pattern-matching functions +string.find, +string.gmatch, +string.gsub, +and string.match. +This section describes the syntax and the meaning +(that is, what they match) of these strings. + + + +

Character Class:

+A character class is used to represent a set of characters. +The following combinations are allowed in describing a character class: + +

    + +
  • x: +(where x is not one of the magic characters +^$()%.[]*+-?) +represents the character x itself. +
  • + +
  • .: (a dot) represents all characters.
  • + +
  • %a: represents all letters.
  • + +
  • %c: represents all control characters.
  • + +
  • %d: represents all digits.
  • + +
  • %g: represents all printable characters except space.
  • + +
  • %l: represents all lowercase letters.
  • + +
  • %p: represents all punctuation characters.
  • + +
  • %s: represents all space characters.
  • + +
  • %u: represents all uppercase letters.
  • + +
  • %w: represents all alphanumeric characters.
  • + +
  • %x: represents all hexadecimal digits.
  • + +
  • %x: (where x is any non-alphanumeric character) +represents the character x. +This is the standard way to escape the magic characters. +Any non-alphanumeric character +(including all punctuation characters, even the non-magical) +can be preceded by a '%' +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, +in ascending order, with a '-'. +All classes %x described above can also be used as +components in set. +All other characters in set represent themselves. +For example, [%w_] (or [_%w]) +represents all alphanumeric characters plus the underscore, +[0-7] represents the octal digits, +and [0-7%l%-] represents the octal digits plus +the lowercase letters plus the '-' character. + + +

    +You can put a closing square bracket in a set +by positioning it as the first character in the set. +You can put an hyphen in a set +by positioning it as the first or the last character in the set. +(You can also use an escape for both cases.) + + +

    +The interaction between ranges and classes is not defined. +Therefore, patterns like [%a-z] or [a-%%] +have no meaning. +

  • + +
  • [^set]: +represents the complement of set, +where set is interpreted as above. +
  • + +

+For all classes represented by single letters (%a, %c, etc.), +the corresponding uppercase letter represents the complement of the class. +For instance, %S represents all non-space characters. + + +

+The definitions of letter, space, and other character groups +depend on the current locale. +In particular, the class [a-z] may not be equivalent to %l. + + + + + +

Pattern Item:

+A pattern item can be + +

    + +
  • +a single character class, +which matches any single character in the class; +
  • + +
  • +a single character class followed by '*', +which matches zero 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 one 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 zero 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 zero or one occurrence of a character in the class. +It always matches one occurrence if possible; +
  • + +
  • +%n, for n between 1 and 9; +such item matches a substring equal to the n-th captured string +(see below); +
  • + +
  • +%bxy, where x and y are two distinct characters; +such item matches strings that start with x, end with y, +and where the x and y are balanced. +This means that, if one reads the string from left to right, +counting +1 for an x and -1 for a y, +the ending y is the first y where the count reaches 0. +For instance, the item %b() matches expressions with +balanced parentheses. +
  • + +
  • +%f[set], a frontier pattern; +such item matches an empty string at any position such that +the next character belongs to set +and the previous character does not belong to set. +The set set is interpreted as previously described. +The beginning and the end of the subject are handled as if +they were the character '\0'. +
  • + +
+ + + + +

Pattern:

+A pattern is a sequence of pattern items. +A caret '^' at the beginning of a pattern anchors the match at the +beginning of the subject string. +A '$' at the end of a pattern anchors the match at the +end of the subject string. +At other positions, +'^' and '$' have no special meaning and represent themselves. + + + + + +

Captures:

+A pattern can contain sub-patterns enclosed in parentheses; +they describe captures. +When a match succeeds, the substrings of the subject string +that match captures are stored (captured) for future use. +Captures are numbered according to their left parentheses. +For instance, in the pattern "(a*(.)%w(%s*))", +the part of the string matching "a*(.)%w(%s*)" is +stored as the first capture (and therefore has number 1); +the character matching "." is captured with number 2, +and the part matching "%s*" has number 3. + + +

+As a special case, the 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. + + + + + + + +

6.4.2 – Format Strings for Pack and Unpack

+ +

+The first argument to string.pack, +string.packsize, and string.unpack +is a format string, +which describes the layout of the structure being created or read. + + +

+A format string is a sequence of conversion options. +The conversion options are as follows: + +

    +
  • <: sets little endian
  • +
  • >: sets big endian
  • +
  • =: sets native endian
  • +
  • ![n]: sets maximum alignment to n +(default is native alignment)
  • +
  • b: a signed byte (char)
  • +
  • B: an unsigned byte (char)
  • +
  • h: a signed short (native size)
  • +
  • H: an unsigned short (native size)
  • +
  • l: a signed long (native size)
  • +
  • L: an unsigned long (native size)
  • +
  • j: a lua_Integer
  • +
  • J: a lua_Unsigned
  • +
  • T: a size_t (native size)
  • +
  • i[n]: a signed int with n bytes +(default is native size)
  • +
  • I[n]: an unsigned int with n bytes +(default is native size)
  • +
  • f: a float (native size)
  • +
  • d: a double (native size)
  • +
  • n: a lua_Number
  • +
  • cn: a fixed-sized string with n bytes
  • +
  • z: a zero-terminated string
  • +
  • s[n]: a string preceded by its length +coded as an unsigned integer with n bytes +(default is a size_t)
  • +
  • x: one byte of padding
  • +
  • Xop: an empty item that aligns +according to option op +(which is otherwise ignored)
  • +
  • ' ': (empty space) ignored
  • +

+(A "[n]" means an optional integral numeral.) +Except for padding, spaces, and configurations +(options "xX <=>!"), +each option corresponds to an argument (in string.pack) +or a result (in string.unpack). + + +

+For options "!n", "sn", "in", and "In", +n can be any integer between 1 and 16. +All integral options check overflows; +string.pack checks whether the given value fits in the given size; +string.unpack checks whether the read value fits in a Lua integer. + + +

+Any format string starts as if prefixed by "!1=", +that is, +with maximum alignment of 1 (no alignment) +and native endianness. + + +

+Alignment works as follows: +For each option, +the format gets extra padding until the data starts +at an offset that is a multiple of the minimum between the +option size and the maximum alignment; +this minimum must be a power of 2. +Options "c" and "z" are not aligned; +option "s" follows the alignment of its starting integer. + + +

+All padding is filled with zeros by string.pack +(and ignored by string.unpack). + + + + + + + +

6.5 – UTF-8 Support

+ +

+This library provides basic support for UTF-8 encoding. +It provides all its functions inside the table utf8. +This library does not provide any support for Unicode other +than the handling of the encoding. +Any operation that needs the meaning of a character, +such as character classification, is outside its scope. + + +

+Unless stated otherwise, +all functions that expect a byte position as a parameter +assume that the given position is either the start of a byte sequence +or one plus the length of the subject string. +As in the string library, +negative indices count from the end of the string. + + +

+


utf8.char (···)

+Receives zero or more integers, +converts each one to its corresponding UTF-8 byte sequence +and returns a string with the concatenation of all these sequences. + + + + +

+


utf8.charpattern

+The pattern (a string, not a function) "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" +(see §6.4.1), +which matches exactly one UTF-8 byte sequence, +assuming that the subject is a valid UTF-8 string. + + + + +

+


utf8.codes (s)

+ + +

+Returns values so that the construction + +

+     for p, c in utf8.codes(s) do body end
+

+will iterate over all characters in string s, +with p being the position (in bytes) and c the code point +of each character. +It raises an error if it meets any invalid byte sequence. + + + + +

+


utf8.codepoint (s [, i [, j]])

+Returns the codepoints (as integers) from all characters in s +that start between byte position i and j (both included). +The default for i is 1 and for j is i. +It raises an error if it meets any invalid byte sequence. + + + + +

+


utf8.len (s [, i [, j]])

+Returns the number of UTF-8 characters in string s +that start between positions i and j (both inclusive). +The default for i is 1 and for j is -1. +If it finds any invalid byte sequence, +returns a false value plus the position of the first invalid byte. + + + + +

+


utf8.offset (s, n [, i])

+Returns the position (in bytes) where the encoding of the +n-th character of s +(counting from position i) starts. +A negative n gets characters before position i. +The default for i is 1 when n is non-negative +and #s + 1 otherwise, +so that utf8.offset(s, -n) gets the offset of the +n-th character from the end of the string. +If the specified character is neither in the subject +nor right after its end, +the function returns nil. + + +

+As a special case, +when n is 0 the function returns the start of the encoding +of the character that contains the i-th byte of s. + + +

+This function assumes that s is a valid UTF-8 string. + + + + + + + +

6.6 – Table Manipulation

+ +

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

+Remember that, whenever an operation needs the length of a table, +the table must be a proper sequence +or have a __len metamethod (see §3.4.7). +All functions ignore non-numeric keys +in the tables given as arguments. + + +

+


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

+ + +

+Given a list where all elements are strings or numbers, +returns the string list[i]..sep..list[i+1] ··· sep..list[j]. +The default value for sep is the empty string, +the default for i is 1, +and the default for j is #list. +If i is greater than j, returns the empty string. + + + + +

+


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

+ + +

+Inserts element value at position pos in list, +shifting up the elements +list[pos], list[pos+1], ···, list[#list]. +The default value for pos is #list+1, +so that a call table.insert(t,x) inserts x at the end +of list t. + + + + +

+


table.move (a1, f, e, t [,a2])

+ + +

+Moves elements from table a1 to table a2, +performing the equivalent to the following +multiple assignment: +a2[t],··· = a1[f],···,a1[e]. +The default for a2 is a1. +The destination range can overlap with the source range. +The number of elements to be moved must fit in a Lua integer. + + +

+Returns the destination table a2. + + + + +

+


table.pack (···)

+ + +

+Returns a new table with all parameters stored into keys 1, 2, etc. +and with a field "n" with the total number of parameters. +Note that the resulting table may not be a sequence. + + + + +

+


table.remove (list [, pos])

+ + +

+Removes from list the element at position pos, +returning the value of the removed element. +When pos is an integer between 1 and #list, +it shifts down the elements +list[pos+1], list[pos+2], ···, list[#list] +and erases element list[#list]; +The index pos can also be 0 when #list is 0, +or #list + 1; +in those cases, the function erases the element list[pos]. + + +

+The default value for pos is #list, +so that a call table.remove(l) removes the last element +of list l. + + + + +

+


table.sort (list [, comp])

+ + +

+Sorts list elements in a given order, in-place, +from list[1] to list[#list]. +If comp is given, +then it must be a function that receives two list elements +and returns true when the first element must come +before the second in the final order +(so that, after the sort, +i < j implies not comp(list[j],list[i])). +If comp is not given, +then the standard Lua operator < is used instead. + + +

+Note that the comp function must define +a strict partial order over the elements in the list; +that is, it must be asymmetric and transitive. +Otherwise, no valid sort may be possible. + + +

+The sort algorithm is not stable; +that is, elements not comparable by the given order +(e.g., equal elements) +may have their relative positions changed by the sort. + + + + +

+


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

+ + +

+Returns the elements from the given list. +This function is equivalent to + +

+     return list[i], list[i+1], ···, list[j]
+

+By default, i is 1 and j is #list. + + + + + + + +

6.7 – Mathematical Functions

+ +

+This library provides basic mathematical functions. +It provides all its functions and constants inside the table math. +Functions with the annotation "integer/float" give +integer results for integer arguments +and float results for float (or mixed) arguments. +Rounding functions +(math.ceil, math.floor, and math.modf) +return an integer when the result fits in the range of an integer, +or a float otherwise. + + +

+


math.abs (x)

+ + +

+Returns the absolute value of x. (integer/float) + + + + +

+


math.acos (x)

+ + +

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

+


math.asin (x)

+ + +

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

+


math.atan (y [, x])

+ + +

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

+The default value for x is 1, +so that the call math.atan(y) +returns the arc tangent of y. + + + + +

+


math.ceil (x)

+ + +

+Returns the smallest integral value larger than or equal to x. + + + + +

+


math.cos (x)

+ + +

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

+


math.deg (x)

+ + +

+Converts the angle x from radians to degrees. + + + + +

+


math.exp (x)

+ + +

+Returns the value ex +(where e is the base of natural logarithms). + + + + +

+


math.floor (x)

+ + +

+Returns the largest integral value 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. (integer/float) + + + + +

+


math.huge

+ + +

+The float value HUGE_VAL, +a value larger than any other numeric value. + + + + +

+


math.log (x [, base])

+ + +

+Returns the logarithm of x in the given base. +The default for base is e +(so that the function returns the natural logarithm of x). + + + + +

+


math.max (x, ···)

+ + +

+Returns the argument with the maximum value, +according to the Lua operator <. (integer/float) + + + + +

+


math.maxinteger

+An integer with the maximum value for an integer. + + + + +

+


math.min (x, ···)

+ + +

+Returns the argument with the minimum value, +according to the Lua operator <. (integer/float) + + + + +

+


math.mininteger

+An integer with the minimum value for an integer. + + + + +

+


math.modf (x)

+ + +

+Returns the integral part of x and the fractional part of x. +Its second result is always a float. + + + + +

+


math.pi

+ + +

+The value of π. + + + + +

+


math.rad (x)

+ + +

+Converts the angle x from degrees to radians. + + + + +

+


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

+ + +

+When called without arguments, +returns a pseudo-random float with uniform distribution +in the range [0,1). +When called with two integers m and n, +math.random returns a pseudo-random integer +with uniform distribution in the range [m, n]. +(The value n-m cannot be negative and must fit in a Lua integer.) +The call math.random(n) is equivalent to math.random(1,n). + + +

+This function is an interface to the underling +pseudo-random generator function provided by C. + + + + +

+


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

+ + +

+Returns the square root of x. +(You can also use the expression x^0.5 to compute this value.) + + + + +

+


math.tan (x)

+ + +

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

+


math.tointeger (x)

+ + +

+If the value x is convertible to an integer, +returns that integer. +Otherwise, returns nil. + + + + +

+


math.type (x)

+ + +

+Returns "integer" if x is an integer, +"float" if it is a float, +or nil if x is not a number. + + + + +

+


math.ult (m, n)

+ + +

+Returns a boolean, +true if integer m is below integer n when +they are compared as unsigned integers. + + + + + + + +

6.8 – Input and Output Facilities

+ +

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

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

+The table io also provides +three predefined file handles with their usual meanings from C: +io.stdin, io.stdout, and io.stderr. +The I/O library never closes these files. + + +

+Unless otherwise stated, +all I/O functions return 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. +On non-POSIX systems, +the computation of the error message and error code +in case of errors +may be not thread safe, +because they rely on the global C variable errno. + + +

+


io.close ([file])

+ + +

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

+


io.flush ()

+ + +

+Equivalent to io.output():flush(). + + + + +

+


io.input ([file])

+ + +

+When called with a file name, it opens the named file (in text mode), +and sets its handle as the default input file. +When called with a file handle, +it simply sets this file handle as the default input file. +When called without 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 +works like file:lines(···) over the opened file. +When the iterator function detects the end of file, +it returns no values (to finish the loop) and automatically closes the file. + + +

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

+In case of errors this function raises the error, +instead of returning an error code. + + + + +

+


io.open (filename [, mode])

+ + +

+This function opens a file, +in the mode specified in the string mode. +In case of success, +it returns a new file handle. + + +

+The mode string can be any of the following: + +

    +
  • "r": read mode (the default);
  • +
  • "w": write mode;
  • +
  • "a": append mode;
  • +
  • "r+": update mode, all previous data is preserved;
  • +
  • "w+": update mode, all previous data is erased;
  • +
  • "a+": append update mode, previous data is preserved, + writing is only allowed at the end of file.
  • +

+The mode string can also have a 'b' at the end, +which is needed in some systems to open the file in binary mode. + + + + +

+


io.output ([file])

+ + +

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

+


io.popen (prog [, mode])

+ + +

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

+Starts program prog in a separated process and returns +a file handle that you can use to read data from this program +(if mode is "r", the default) +or to write data to this program +(if mode is "w"). + + + + +

+


io.read (···)

+ + +

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

+


io.tmpfile ()

+ + +

+In case of success, +returns a handle for a temporary file. +This file is opened in update mode +and it is automatically removed when the program ends. + + + + +

+


io.type (obj)

+ + +

+Checks whether obj is a valid file handle. +Returns the string "file" if obj is an open file handle, +"closed file" if obj is a closed file handle, +or 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. + + +

+When closing a file handle created with io.popen, +file:close returns the same values +returned by os.execute. + + + + +

+


file:flush ()

+ + +

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

+


file:lines (···)

+ + +

+Returns an iterator function that, +each time it is called, +reads the file according to the given formats. +When no format is given, +uses "l" as a default. +As an example, the construction + +

+     for c in file:lines(1) do body end
+

+will iterate over all characters of the file, +starting at the current position. +Unlike io.lines, this function does not close the file +when the loop ends. + + +

+In case of errors this function raises the error, +instead of returning an error code. + + + + +

+


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. +(In this latter case, +the function does not read subsequent formats.) +When called without formats, +it uses a default format that reads the next line +(see below). + + +

+The available formats are + +

    + +
  • "n": +reads a numeral and returns it as a float or an integer, +following the lexical conventions of Lua. +(The numeral may have leading spaces and a sign.) +This format always reads the longest input sequence that +is a valid prefix for a numeral; +if that prefix does not form a valid numeral +(e.g., an empty string, "0x", or "3.4e-"), +it is discarded and the function returns nil. +
  • + +
  • "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. +
  • + +
  • "L": +reads the next line keeping the end-of-line character (if present), +returning nil on end of file. +
  • + +
  • number: +reads a string with up to this number of bytes, +returning nil on end of file. +If number is zero, +it reads nothing and returns an empty string, +or nil on end of file. +
  • + +

+The formats "l" and "L" should be used only for text files. + + + + +

+


file:seek ([whence [, offset]])

+ + +

+Sets and gets the file position, +measured from the beginning of the file, +to the position given by offset plus a base +specified by the string whence, as follows: + +

    +
  • "set": base is position 0 (beginning of the file);
  • +
  • "cur": base is current position;
  • +
  • "end": base is end of file;
  • +

+In case of success, seek returns the final file position, +measured in bytes from the beginning of the file. +If seek fails, it returns 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 file. +The arguments must be strings or numbers. + + +

+In case of success, this function returns file. +Otherwise it returns nil plus a string describing the error. + + + + + + + +

6.9 – Operating System Facilities

+ +

+This library is implemented through table os. + + +

+


os.clock ()

+ + +

+Returns an approximation of the amount in seconds of CPU time +used by the program. + + + + +

+


os.date ([format [, time]])

+ + +

+Returns a string or a table containing date and time, +formatted according to the given string format. + + +

+If the time argument is present, +this is the time to be formatted +(see the os.time function for a description of this value). +Otherwise, date formats the current time. + + +

+If format starts with '!', +then the date is formatted in Coordinated Universal Time. +After this optional character, +if format is the string "*t", +then date returns a table with the following fields: +year, month (1–12), day (1–31), +hour (0–23), min (0–59), sec (0–61), +wday (weekday, 1–7, Sunday is 1), +yday (day of the year, 1–366), +and isdst (daylight saving flag, a boolean). +This last field may be absent +if the information is not available. + + +

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

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

+On non-POSIX systems, +this function may be not thread safe +because of its reliance on C function gmtime and C function localtime. + + + + +

+


os.difftime (t2, t1)

+ + +

+Returns the difference, in seconds, +from time t1 to time t2 +(where the times are values returned by os.time). +In POSIX, Windows, and some other systems, +this value is exactly t2-t1. + + + + +

+


os.execute ([command])

+ + +

+This function is equivalent to the ISO C function system. +It passes command to be executed by an operating system shell. +Its first result is true +if the command terminated successfully, +or nil otherwise. +After this first result +the function returns a string plus a number, +as follows: + +

    + +
  • "exit": +the command terminated normally; +the following number is the exit status of the command. +
  • + +
  • "signal": +the command was terminated by a signal; +the following number is the signal that terminated the command. +
  • + +
+ +

+When called without a command, +os.execute returns a boolean that is true if a shell is available. + + + + +

+


os.exit ([code [, close]])

+ + +

+Calls the ISO C function exit to terminate the host program. +If code is true, +the returned status is EXIT_SUCCESS; +if code is false, +the returned status is EXIT_FAILURE; +if code is a number, +the returned status is this number. +The default value for code is true. + + +

+If the optional second argument close is true, +closes the Lua state before exiting. + + + + +

+


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 empty directory, on POSIX systems) +with the given name. +If this function fails, it returns nil, +plus a string describing the error and the error code. + + + + +

+


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 and the error code. + + + + +

+


os.setlocale (locale [, category])

+ + +

+Sets the current locale of the program. +locale is a system-dependent string specifying a locale; +category is an optional string describing which category to change: +"all", "collate", "ctype", +"monetary", "numeric", or "time"; +the default category is "all". +The function returns the name of the new locale, +or 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. + + +

+This function may be not thread safe +because of its reliance on C function setlocale. + + + + +

+


os.time ([table])

+ + +

+Returns the current time when called without arguments, +or a time representing the local date and time specified by the given table. +This table must have fields year, month, and day, +and may have fields +hour (default is 12), +min (default is 0), +sec (default is 0), +and isdst (default is nil). +Other fields are ignored. +For a description of these fields, see the os.date function. + + +

+The values in these fields do not need to be inside their valid ranges. +For instance, if sec is -10, +it means -10 seconds from the time specified by the other fields; +if hour is 1000, +it means +1000 hours from the time specified by the other fields. + + +

+The returned value is a number, whose meaning depends on your system. +In POSIX, Windows, and some other systems, +this number counts the number +of seconds since some given start time (the "epoch"). +In other systems, the meaning is not specified, +and the number returned by time can be used only as an argument to +os.date and os.difftime. + + + + +

+


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 POSIX systems, +this function also creates a file with that name, +to avoid security risks. +(Someone else might create the file with wrong permissions +in the time between getting the name and creating the file.) +You still have to open the file to use it +and to remove it (even if you do not use it). + + +

+When possible, +you may prefer to use io.tmpfile, +which automatically removes the file when the program ends. + + + + + + + +

6.10 – The Debug Library

+ +

+This library provides +the functionality of the debug interface (§4.9) to Lua programs. +You should exert care when using this library. +Several of its functions +violate basic assumptions about Lua code +(e.g., that variables local to a function +cannot be accessed from outside; +that userdata metatables cannot be changed by Lua code; +that Lua programs do not crash) +and therefore can compromise otherwise secure code. +Moreover, some functions in this library may be slow. + + +

+All functions in this library are provided +inside the debug table. +All functions that operate over a thread +have an optional first argument which is the +thread to operate over. +The default is always the current thread. + + +

+


debug.debug ()

+ + +

+Enters an interactive mode with the user, +running each string that the user enters. +Using simple commands and other debug facilities, +the user can inspect global and local variables, +change their values, evaluate expressions, and so on. +A line containing only the word cont finishes this function, +so that the caller continues its execution. + + +

+Note that commands for debug.debug are not lexically nested +within any function and so have no direct access to local variables. + + + + +

+


debug.gethook ([thread])

+ + +

+Returns the current hook settings of the thread, as three values: +the current hook function, the current hook mask, +and the current hook count +(as set by the debug.sethook function). + + + + +

+


debug.getinfo ([thread,] f [, what])

+ + +

+Returns a table with information about a function. +You can give the function directly +or you can give a number as the value of f, +which means the function running at level f of the call stack +of the given thread: +level 0 is the current function (getinfo itself); +level 1 is the function that called getinfo +(except for tail calls, which do not count on the stack); +and so on. +If f 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 name for the current function, +if a reasonable name can be found, +and the expression debug.getinfo(print) +returns a table with all available information +about the print function. + + + + +

+


debug.getlocal ([thread,] f, local)

+ + +

+This function returns the name and the value of the local variable +with index local of the function at level f of the stack. +This function accesses not only explicit local variables, +but also parameters, temporaries, etc. + + +

+The first parameter or local variable has index 1, and so on, +following the order that they are declared in the code, +counting only the variables that are active +in the current scope of the function. +Negative indices refer to vararg parameters; +-1 is the first vararg parameter. +The function returns nil if there is no variable with the given index, +and raises an error when called with a level out of range. +(You can call debug.getinfo to check whether the level is valid.) + + +

+Variable names starting with '(' (open parenthesis) +represent variables with no known names +(internal variables such as loop control variables, +and variables from chunks saved without debug information). + + +

+The parameter f may also be a function. +In that case, getlocal returns only the name of function parameters. + + + + +

+


debug.getmetatable (value)

+ + +

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

+


debug.getregistry ()

+ + +

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

+


debug.getupvalue (f, up)

+ + +

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

+Variable names starting with '(' (open parenthesis) +represent variables with no known names +(variables from chunks saved without debug information). + + + + +

+


debug.getuservalue (u)

+ + +

+Returns the Lua value associated to u. +If u is not a userdata, +returns nil. + + + + +

+


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 any combination of the following characters, +with the given meaning: + +

    +
  • 'c': the hook is called every time Lua calls a function;
  • +
  • 'r': the hook is called every time Lua returns from a function;
  • +
  • 'l': the hook is called every time Lua enters a new line of code.
  • +

+Moreover, +with a count different from zero, +the hook is called also after every count instructions. + + +

+When called without arguments, +debug.sethook turns off the hook. + + +

+When the hook is called, its first parameter is a string +describing the event that has triggered its call: +"call" (or "tail call"), +"return", +"line", and "count". +For line events, +the hook also gets the new line number as its second parameter. +Inside a hook, +you can call getinfo with level 2 to get more information about +the running function +(level 0 is the getinfo function, +and level 1 is the hook function). + + + + +

+


debug.setlocal ([thread,] level, local, value)

+ + +

+This function assigns the value value to the local variable +with index local of the function at level level of the stack. +The function returns 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. + + +

+See debug.getlocal for more information about +variable indices and names. + + + + +

+


debug.setmetatable (value, table)

+ + +

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

+


debug.setupvalue (f, up, value)

+ + +

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

+


debug.setuservalue (udata, value)

+ + +

+Sets the given value as +the Lua value associated to the given udata. +udata must be a full userdata. + + +

+Returns udata. + + + + +

+


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

+ + +

+If message is present but is neither a string nor nil, +this function returns message without further processing. +Otherwise, +it returns a string with a traceback of the call stack. +The optional message string is appended +at the beginning of the traceback. +An optional level number tells at which level +to start the traceback +(default is 1, the function calling traceback). + + + + +

+


debug.upvalueid (f, n)

+ + +

+Returns a unique identifier (as a light userdata) +for the upvalue numbered n +from the given function. + + +

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

+


debug.upvaluejoin (f1, n1, f2, n2)

+ + +

+Make the n1-th upvalue of the Lua closure f1 +refer to the n2-th upvalue of the Lua closure f2. + + + + + + + +

7 – Lua Standalone

+ +

+Although Lua has been designed as an extension language, +to be embedded in a host C program, +it is also frequently used as a standalone language. +An interpreter for Lua as a standalone language, +called simply lua, +is provided with the standard distribution. +The standalone interpreter includes +all standard libraries, 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;
  • +
  • -E: ignores environment variables;
  • +
  • --: stops handling options;
  • +
  • -: executes stdin as a file and stops handling options.
  • +

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

+When called without option -E, +the interpreter checks for an environment variable LUA_INIT_5_3 +(or LUA_INIT if the versioned name is not defined) +before running any argument. +If the variable content has the format @filename, +then lua executes the file. +Otherwise, lua executes the string itself. + + +

+When called with option -E, +besides ignoring LUA_INIT, +Lua also ignores +the values of LUA_PATH and LUA_CPATH, +setting the values of +package.path and package.cpath +with the default paths defined in luaconf.h. + + +

+All options are handled in order, except -i and -E. +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, +and finally run the file script.lua with no arguments. +(Here $ is the shell prompt. Your prompt may be different.) + + +

+Before running any code, +lua collects all command-line arguments +in a global table called arg. +The script name goes to index 0, +the first argument after the script name goes to index 1, +and so on. +Any arguments before the script name +(that is, the interpreter name plus its options) +go to negative indices. +For instance, in the call + +

+     $ lua -la b.lua t1 t2
+

+the table is like this: + +

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

+If there is no script in the call, +the interpreter name goes to index 0, +followed by the other arguments. +For instance, the call + +

+     $ lua -e "print(arg[1])"
+

+will print "-e". +If there is a script, +the script is called with parameters +arg[1], ···, arg[#arg]. +(Like all chunks in Lua, +the script is compiled as a vararg function.) + + +

+In interactive mode, +Lua repeatedly prompts and waits for a line. +After reading a line, +Lua first try to interpret the line as an expression. +If it succeeds, it prints its value. +Otherwise, it interprets the line as a statement. +If you write an incomplete statement, +the interpreter waits for its completion +by issuing a different prompt. + + +

+If the global variable _PROMPT contains a string, +then its value is used as the prompt. +Similarly, if the global variable _PROMPT2 contains a string, +its value is used as the secondary prompt +(issued during incomplete statements). + + +

+In case of unprotected errors in the script, +the interpreter reports the error to the standard error stream. +If the error object is not a string but +has a metamethod __tostring, +the interpreter calls this metamethod to produce the final message. +Otherwise, the interpreter converts the error object to a string +and adds a stack traceback to it. + + +

+When finishing normally, +the interpreter closes its main Lua state +(see lua_close). +The script can avoid this step by +calling os.exit to terminate. + + +

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

8 – Incompatibilities with the Previous Version

+ +

+Here we list the incompatibilities that you may find when moving a program +from Lua 5.2 to Lua 5.3. +You can avoid some incompatibilities by compiling Lua with +appropriate options (see file luaconf.h). +However, +all these compatibility options will be removed in the future. + + +

+Lua versions can always change the C API in ways that +do not imply source-code changes in a program, +such as the numeric values for constants +or the implementation of functions as macros. +Therefore, +you should not assume that binaries are compatible between +different Lua versions. +Always recompile clients of the Lua API when +using a new version. + + +

+Similarly, Lua versions can always change the internal representation +of precompiled chunks; +precompiled chunks are not compatible between different Lua versions. + + +

+The standard paths in the official distribution may +change between versions. + + + +

8.1 – Changes in the Language

+
    + +
  • +The main difference between Lua 5.2 and Lua 5.3 is the +introduction of an integer subtype for numbers. +Although this change should not affect "normal" computations, +some computations +(mainly those that involve some kind of overflow) +can give different results. + + +

    +You can fix these differences by forcing a number to be a float +(in Lua 5.2 all numbers were float), +in particular writing constants with an ending .0 +or using x = x + 0.0 to convert a variable. +(This recommendation is only for a quick fix +for an occasional incompatibility; +it is not a general guideline for good programming. +For good programming, +use floats where you need floats +and integers where you need integers.) +

  • + +
  • +The conversion of a float to a string now adds a .0 suffix +to the result if it looks like an integer. +(For instance, the float 2.0 will be printed as 2.0, +not as 2.) +You should always use an explicit format +when you need a specific format for numbers. + + +

    +(Formally this is not an incompatibility, +because Lua does not specify how numbers are formatted as strings, +but some programs assumed a specific format.) +

  • + +
  • +The generational mode for the garbage collector was removed. +(It was an experimental feature in Lua 5.2.) +
  • + +
+ + + + +

8.2 – Changes in the Libraries

+
    + +
  • +The bit32 library has been deprecated. +It is easy to require a compatible external library or, +better yet, to replace its functions with appropriate bitwise operations. +(Keep in mind that bit32 operates on 32-bit integers, +while the bitwise operators in Lua 5.3 operate on Lua integers, +which by default have 64 bits.) +
  • + +
  • +The Table library now respects metamethods +for setting and getting elements. +
  • + +
  • +The ipairs iterator now respects metamethods and +its __ipairs metamethod has been deprecated. +
  • + +
  • +Option names in io.read do not have a starting '*' anymore. +For compatibility, Lua will continue to accept (and ignore) this character. +
  • + +
  • +The following functions were deprecated in the mathematical library: +atan2, cosh, sinh, tanh, pow, +frexp, and ldexp. +You can replace math.pow(x,y) with x^y; +you can replace math.atan2 with math.atan, +which now accepts one or two parameters; +you can replace math.ldexp(x,exp) with x * 2.0^exp. +For the other operations, +you can either use an external library or +implement them in Lua. +
  • + +
  • +The searcher for C loaders used by require +changed the way it handles versioned names. +Now, the version should come after the module name +(as is usual in most other tools). +For compatibility, that searcher still tries the old format +if it cannot find an open function according to the new style. +(Lua 5.2 already worked that way, +but it did not document the change.) +
  • + +
  • +The call collectgarbage("count") now returns only one result. +(You can compute that second result from the fractional part +of the first result.) +
  • + +
+ + + + +

8.3 – Changes in the API

+ + +
    + +
  • +Continuation functions now receive as parameters what they needed +to get through lua_getctx, +so lua_getctx has been removed. +Adapt your code accordingly. +
  • + +
  • +Function lua_dump has an extra parameter, strip. +Use 0 as the value of this parameter to get the old behavior. +
  • + +
  • +Functions to inject/project unsigned integers +(lua_pushunsigned, lua_tounsigned, lua_tounsignedx, +luaL_checkunsigned, luaL_optunsigned) +were deprecated. +Use their signed equivalents with a type cast. +
  • + +
  • +Macros to project non-default integer types +(luaL_checkint, luaL_optint, luaL_checklong, luaL_optlong) +were deprecated. +Use their equivalent over lua_Integer with a type cast +(or, when possible, use lua_Integer in your code). +
  • + +
+ + + + +

9 – The Complete Syntax of Lua

+ +

+Here is the complete syntax of Lua in extended BNF. +As usual in extended BNF, +{A} means 0 or more As, +and [A] means an optional A. +(For operator precedences, see §3.4.8; +for a description of the terminals +Name, Numeral, +and LiteralString, see §3.1.) + + + + +

+
+	chunk ::= block
+
+	block ::= {stat} [retstat]
+
+	stat ::=  ‘;’ | 
+		 varlist ‘=’ explist | 
+		 functioncall | 
+		 label | 
+		 break | 
+		 goto Name | 
+		 do block end | 
+		 while exp do block end | 
+		 repeat block until exp | 
+		 if exp then block {elseif exp then block} [else block] end | 
+		 for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | 
+		 for namelist in explist do block end | 
+		 function funcname funcbody | 
+		 local function Name funcbody | 
+		 local namelist [‘=’ explist] 
+
+	retstat ::= return [explist] [‘;’]
+
+	label ::= ‘::’ Name ‘::’
+
+	funcname ::= Name {‘.’ Name} [‘:’ Name]
+
+	varlist ::= var {‘,’ var}
+
+	var ::=  Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 
+
+	namelist ::= Name {‘,’ Name}
+
+	explist ::= exp {‘,’ exp}
+
+	exp ::=  nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | 
+		 prefixexp | tableconstructor | exp binop exp | unop exp 
+
+	prefixexp ::= var | functioncall | ‘(’ exp ‘)’
+
+	functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 
+
+	args ::=  ‘(’ [explist] ‘)’ | tableconstructor | LiteralString 
+
+	functiondef ::= function funcbody
+
+	funcbody ::= ‘(’ [parlist] ‘)’ block end
+
+	parlist ::= namelist [‘,’ ‘...’] | ‘...’
+
+	tableconstructor ::= ‘{’ [fieldlist] ‘}’
+
+	fieldlist ::= field {fieldsep field} [fieldsep]
+
+	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
+
+	fieldsep ::= ‘,’ | ‘;’
+
+	binop ::=  ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘//’ | ‘^’ | ‘%’ | 
+		 ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ | 
+		 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | 
+		 and | or
+
+	unop ::= ‘-’ | not | ‘#’ | ‘~’
+
+
+ +

+ + + + + + + + +

+ + + + diff --git a/lua-5.3.3/doc/osi-certified-72x60.png b/lua-5.3.3/doc/osi-certified-72x60.png new file mode 100644 index 0000000000000000000000000000000000000000..07df5f6ee7a7a8b2108025dcd815f73f145a83af GIT binary patch literal 3774 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 + + +Lua 5.3 readme + + + + + + + +

+Lua +Welcome to Lua 5.3 +

+ + + +

About Lua

+

+Lua is a powerful, fast, lightweight, embeddable scripting language +developed by a +team +at +PUC-Rio, +the Pontifical Catholic University of Rio de Janeiro in Brazil. +Lua is +free software +used in many products and projects around the world. + +

+Lua's +official web site +provides complete information +about Lua, +including +an +executive summary +and +updated +documentation, +especially the +reference manual, +which may differ slightly from the +local copy +distributed in this package. + +

Installing Lua

+

+Lua is distributed in +source +form. +You need to build it before using it. +Building Lua should be straightforward +because +Lua is implemented in pure ANSI C and compiles unmodified in all known +platforms that have an ANSI C compiler. +Lua also compiles unmodified as C++. +The instructions given below for building Lua are for Unix-like platforms. +See also +instructions for other systems +and +customization options. + +

+If you don't have the time or the inclination to compile Lua yourself, +get a binary from +LuaBinaries. +Try also +LuaDist, +a multi-platform distribution of Lua that includes batteries. + +

Building Lua

+

+In most Unix-like platforms, simply do "make" with a suitable target. +Here are the details. + +

    +
  1. +Open a terminal window and move to +the top-level directory, which is named lua-5.3.x. +The Makefile there controls both the build process and the installation process. +

    +

  2. + Do "make" and see if your platform is listed. + The platforms currently supported are: +

    +

    + aix bsd c89 freebsd generic linux macosx mingw posix solaris +

    +

    + If your platform is listed, just do "make xxx", where xxx + is your platform name. +

    + If your platform is not listed, try the closest one or posix, generic, + c89, in this order. +

    +

  3. +The compilation takes only a few moments +and produces three files in the src directory: +lua (the interpreter), +luac (the compiler), +and liblua.a (the library). +

    +

  4. + To check that Lua has been built correctly, do "make test" + after building Lua. This will run the interpreter and print its version. +
+

+If you're running Linux and get compilation errors, +make sure you have installed the readline development package +(which is probably named libreadline-dev or readline-devel). +If you get link errors after that, +then try "make linux MYLIBS=-ltermcap". + +

Installing Lua

+

+ Once you have built Lua, you may want to install it in an official + place in your system. In this case, do "make install". The official + place and the way to install files are defined in the Makefile. You'll + probably need the right permissions to install files. + +

+ To build and install Lua in one step, do "make xxx install", + where xxx is your platform name. + +

+ To install Lua locally, do "make local". + This will create a directory install with subdirectories + bin, include, lib, man, share, + and install Lua as listed below. + + To install Lua locally, but in some other directory, do + "make install INSTALL_TOP=xxx", where xxx is your chosen directory. + The installation starts in the src and doc directories, + so take care if INSTALL_TOP is not an absolute path. + +

+
+ bin: +
+ lua luac +
+ include: +
+ lua.h luaconf.h lualib.h lauxlib.h lua.hpp +
+ lib: +
+ liblua.a +
+ man/man1: +
+ lua.1 luac.1 +
+ +

+ These are the only directories you need for development. + If you only want to run Lua programs, + you only need the files in bin and man. + The files in include and lib are needed for + embedding Lua in C or C++ programs. + +

Customization

+

+ Three kinds of things can be customized by editing a file: +

    +
  • Where and how to install Lua — edit Makefile. +
  • How to build Lua — edit src/Makefile. +
  • Lua features — edit src/luaconf.h. +
+ +

+ You don't actually need to edit the Makefiles because you may set the + relevant variables in the command line when invoking make. + Nevertheless, it's probably best to edit and save the Makefiles to + record the changes you've made. + +

+ On the other hand, if you need to customize some Lua features, you'll need + to edit src/luaconf.h before building and installing Lua. + The edited file will be the one installed, and + it will be used by any Lua clients that you build, to ensure consistency. + Further customization is available to experts by editing the Lua sources. + +

Building Lua on other systems

+

+ If you're not using the usual Unix tools, then the instructions for + building Lua depend on the compiler you use. You'll need to create + projects (or whatever your compiler uses) for building the library, + the interpreter, and the compiler, as follows: + +

+
+library: +
+lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c +lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c +ltm.c lundump.c lvm.c lzio.c +lauxlib.c lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c +lmathlib.c loslib.c lstrlib.c ltablib.c lutf8lib.c loadlib.c linit.c +
+interpreter: +
+ library, lua.c +
+compiler: +
+ library, luac.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. Moreover, to dynamically load + C libraries for Lua you'll need to know how to create dynamic libraries + and you'll need to make sure that the Lua API functions are accessible to + those dynamic libraries — but don't link the Lua library + into each dynamic library. For Unix, we recommend that the Lua library + be linked statically into the host program and its symbols exported for + dynamic linking; src/Makefile does this for the Lua interpreter. + For Windows, we recommend that the Lua library be a DLL. + In all cases, the compiler luac should be linked statically. + +

+ As mentioned above, you may edit src/luaconf.h to customize + some features before building Lua. + +

Changes since Lua 5.2

+

+Here are the main changes introduced in Lua 5.3. +The +reference manual +lists the +incompatibilities that had to be introduced. + +

Main changes

+
    +
  • integers (64-bit by default) +
  • official support for 32-bit numbers +
  • bitwise operators +
  • basic utf-8 support +
  • functions for packing and unpacking values + +
+ +Here are the other changes introduced in Lua 5.3: +

Language

+
    +
  • userdata can have any Lua value as uservalue +
  • floor division +
  • more flexible rules for some metamethods +
+ +

Libraries

+
    +
  • ipairs and the table library respect metamethods +
  • strip option in string.dump +
  • table library respects metamethods +
  • new function table.move +
  • new function string.pack +
  • new function string.unpack +
  • new function string.packsize +
+ +

C API

+
    +
  • simpler API for continuation functions in C +
  • lua_gettable and similar functions return type of resulted value +
  • strip option in lua_dump +
  • new function: lua_geti +
  • new function: lua_seti +
  • new function: lua_isyieldable +
  • new function: lua_numbertointeger +
  • new function: lua_rotate +
  • new function: lua_stringtonumber +
+ +

Lua standalone interpreter

+
    +
  • can be used as calculator; no need to prefix with '=' +
  • arg table available to all code +
+ +

License

+

+ +[osi certified] + +Lua is free software distributed under the terms of the +MIT license +reproduced below; +it may be used for any purpose, including commercial purposes, +at absolutely no cost without having to ask us. + +The only requirement is that if you do use Lua, +then you should give us credit by including the appropriate copyright notice somewhere in your product or its documentation. + +For details, see +this. + +

+Copyright © 1994–2016 Lua.org, PUC-Rio. + +

+Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +

+The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +

+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +

+

+ +

+ + + + diff --git a/lua-5.3.3/src/Makefile b/lua-5.3.3/src/Makefile new file mode 100644 index 0000000..d71c75c --- /dev/null +++ b/lua-5.3.3/src/Makefile @@ -0,0 +1,197 @@ +# Makefile for building Lua +# See ../doc/readme.html for installation and customization instructions. + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= none + +CC= gcc -std=gnu99 +CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS) $(MYCFLAGS) +LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS) +LIBS= -lm $(SYSLIBS) $(MYLIBS) + +AR= ar rcu +RANLIB= ranlib +RM= rm -f + +SYSCFLAGS= +SYSLDFLAGS= +SYSLIBS= + +MYCFLAGS= +MYLDFLAGS= +MYLIBS= +MYOBJS= + +# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= + +PLATS= aix bsd c89 freebsd generic linux macosx mingw posix solaris + +LUA_A= liblua.a +CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o \ + lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o \ + ltm.o lundump.o lvm.o lzio.o +LIB_O= lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \ + lmathlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o loadlib.o linit.o +BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS) + +LUA_T= lua +LUA_O= lua.o + +LUAC_T= luac +LUAC_O= luac.o + +ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O) +ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) +ALL_A= $(LUA_A) + +# Targets start here. +default: $(PLAT) + +all: $(ALL_T) + +o: $(ALL_O) + +a: $(ALL_A) + +$(LUA_A): $(BASE_O) + $(AR) $@ $(BASE_O) + $(RANLIB) $@ + +$(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + +$(LUAC_T): $(LUAC_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) + +clean: + $(RM) $(ALL_T) $(ALL_O) + +depend: + @$(CC) $(CFLAGS) -MM l*.c + +echo: + @echo "PLAT= $(PLAT)" + @echo "CC= $(CC)" + @echo "CFLAGS= $(CFLAGS)" + @echo "LDFLAGS= $(SYSLDFLAGS)" + @echo "LIBS= $(LIBS)" + @echo "AR= $(AR)" + @echo "RANLIB= $(RANLIB)" + @echo "RM= $(RM)" + +# Convenience targets for popular platforms +ALL= all + +none: + @echo "Please do 'make PLATFORM' where PLATFORM is one of these:" + @echo " $(PLATS)" + +aix: + $(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall" + +bsd: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E" + +c89: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89" + @echo '' + @echo '*** C89 does not guarantee 64-bit integers for Lua.' + @echo '' + + +freebsd: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -lreadline" + +generic: $(ALL) + +linux: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl -lreadline" + +macosx: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX" SYSLIBS="-lreadline" CC=cc + +mingw: + $(MAKE) "LUA_A=lua53.dll" "LUA_T=lua.exe" \ + "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ + "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe + $(MAKE) "LUAC_T=luac.exe" luac.exe + +posix: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX" + +solaris: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-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 lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ + ltable.h lundump.h lvm.h +lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h +lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lbitlib.o: lbitlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lgc.h lstring.h ltable.h lvm.h +lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h +ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ + ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h +ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ + lparser.h lstring.h ltable.h lundump.h lvm.h +ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ + ltm.h lzio.h lmem.h lundump.h +lfunc.o: lfunc.c lprefix.h lua.h luaconf.h lfunc.h lobject.h llimits.h \ + lgc.h lstate.h ltm.h lzio.h lmem.h +lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h +linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h +liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \ + lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \ + lstring.h ltable.h +lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h +loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ + ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ + lvm.h +lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h +loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lfunc.h lstring.h lgc.h ltable.h +lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ + lstring.h ltable.h +lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h +lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h ltable.h lvm.h +lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h lobject.h llimits.h \ + lstate.h ltm.h lzio.h lmem.h lundump.h ldebug.h lopcodes.h +lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ + lundump.h +lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ + ltable.h lvm.h +lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ + lobject.h ltm.h lzio.h + +# (end of Makefile) diff --git a/lua-5.3.3/src/lapi.c b/lua-5.3.3/src/lapi.c new file mode 100644 index 0000000..c9455a5 --- /dev/null +++ b/lua-5.3.3/src/lapi.c @@ -0,0 +1,1298 @@ +/* +** $Id: lapi.c,v 2.259 2016/02/29 14:27:14 roberto Exp $ +** Lua API +** See Copyright Notice in lua.h +*/ + +#define lapi_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#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[] = + "$LuaVersion: " LUA_COPYRIGHT " $" + "$LuaAuthors: " LUA_AUTHORS " $"; + + +/* value at a non-valid index */ +#define NONVALIDVALUE cast(TValue *, luaO_nilobject) + +/* corresponding test */ +#define isvalid(o) ((o) != luaO_nilobject) + +/* test for pseudo index */ +#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX) + +/* test for upvalue */ +#define isupvalue(i) ((i) < LUA_REGISTRYINDEX) + +/* test for valid but not pseudo index */ +#define isstackindex(i, o) (isvalid(o) && !ispseudo(i)) + +#define api_checkvalidindex(l,o) api_check(l, isvalid(o), "invalid index") + +#define api_checkstackindex(l, i, o) \ + api_check(l, isstackindex(i, o), "index not in the stack") + + +static TValue *index2addr (lua_State *L, int idx) { + CallInfo *ci = L->ci; + if (idx > 0) { + TValue *o = ci->func + idx; + api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index"); + if (o >= L->top) return NONVALIDVALUE; + else return o; + } + else if (!ispseudo(idx)) { /* negative index */ + api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index"); + return L->top + idx; + } + else if (idx == LUA_REGISTRYINDEX) + return &G(L)->l_registry; + else { /* upvalues */ + idx = LUA_REGISTRYINDEX - idx; + api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large"); + if (ttislcf(ci->func)) /* light C function? */ + return NONVALIDVALUE; /* it has no upvalues */ + else { + CClosure *func = clCvalue(ci->func); + return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE; + } + } +} + + +/* +** to be called by 'lua_checkstack' in protected mode, to grow stack +** capturing memory errors +*/ +static void growstack (lua_State *L, void *ud) { + int size = *(int *)ud; + luaD_growstack(L, size); +} + + +LUA_API int lua_checkstack (lua_State *L, int n) { + int res; + CallInfo *ci = L->ci; + lua_lock(L); + api_check(L, n >= 0, "negative 'n'"); + if (L->stack_last - L->top > n) /* stack large enough? */ + res = 1; /* yes; check is OK */ + else { /* no; need to grow stack */ + int inuse = cast_int(L->top - L->stack) + EXTRA_STACK; + if (inuse > LUAI_MAXSTACK - n) /* can grow without overflow? */ + res = 0; /* no */ + else /* try to grow stack */ + res = (luaD_rawrunprotected(L, &growstack, &n) == LUA_OK); + } + if (res && ci->top < L->top + n) + ci->top = L->top + n; /* adjust frame top */ + 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), "moving among independent states"); + api_check(from, to->ci->top - to->top >= n, "stack overflow"); + from->top -= n; + for (i = 0; i < n; i++) { + setobj2s(to, to->top, from->top + i); + to->top++; /* stack already checked by previous 'api_check' */ + } + lua_unlock(to); +} + + +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 const lua_Number *lua_version (lua_State *L) { + static const lua_Number version = LUA_VERSION_NUM; + if (L == NULL) return &version; + else return G(L)->version; +} + + + +/* +** basic stack manipulation +*/ + + +/* +** convert an acceptable stack index into an absolute index +*/ +LUA_API int lua_absindex (lua_State *L, int idx) { + return (idx > 0 || ispseudo(idx)) + ? idx + : cast_int(L->top - L->ci->func) + idx; +} + + +LUA_API int lua_gettop (lua_State *L) { + return cast_int(L->top - (L->ci->func + 1)); +} + + +LUA_API void lua_settop (lua_State *L, int idx) { + StkId func = L->ci->func; + lua_lock(L); + if (idx >= 0) { + api_check(L, idx <= L->stack_last - (func + 1), "new top too large"); + while (L->top < (func + 1) + idx) + setnilvalue(L->top++); + L->top = (func + 1) + idx; + } + else { + api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top"); + L->top += idx+1; /* 'subtract' index (index is negative) */ + } + lua_unlock(L); +} + + +/* +** Reverse the stack segment from 'from' to 'to' +** (auxiliary to 'lua_rotate') +*/ +static void reverse (lua_State *L, StkId from, StkId to) { + for (; from < to; from++, to--) { + TValue temp; + setobj(L, &temp, from); + setobjs2s(L, from, to); + setobj2s(L, to, &temp); + } +} + + +/* +** Let x = AB, where A is a prefix of length 'n'. Then, +** rotate x n == BA. But BA == (A^r . B^r)^r. +*/ +LUA_API void lua_rotate (lua_State *L, int idx, int n) { + StkId p, t, m; + lua_lock(L); + t = L->top - 1; /* end of stack segment being rotated */ + p = index2addr(L, idx); /* start of segment */ + api_checkstackindex(L, idx, p); + api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'"); + m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */ + reverse(L, p, m); /* reverse the prefix with length 'n' */ + reverse(L, m + 1, t); /* reverse the suffix */ + reverse(L, p, t); /* reverse the entire segment */ + lua_unlock(L); +} + + +LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) { + TValue *fr, *to; + lua_lock(L); + fr = index2addr(L, fromidx); + to = index2addr(L, toidx); + api_checkvalidindex(L, to); + setobj(L, to, fr); + if (isupvalue(toidx)) /* function upvalue? */ + luaC_barrier(L, clCvalue(L->ci->func), fr); + /* LUA_REGISTRYINDEX does not need gc barrier + (collector revisits it before finishing collection) */ + lua_unlock(L); +} + + +LUA_API void lua_pushvalue (lua_State *L, int idx) { + lua_lock(L); + setobj2s(L, L->top, index2addr(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 = index2addr(L, idx); + return (isvalid(o) ? ttnov(o) : LUA_TNONE); +} + + +LUA_API const char *lua_typename (lua_State *L, int t) { + UNUSED(L); + api_check(L, LUA_TNONE <= t && t < LUA_NUMTAGS, "invalid tag"); + return ttypename(t); +} + + +LUA_API int lua_iscfunction (lua_State *L, int idx) { + StkId o = index2addr(L, idx); + return (ttislcf(o) || (ttisCclosure(o))); +} + + +LUA_API int lua_isinteger (lua_State *L, int idx) { + StkId o = index2addr(L, idx); + return ttisinteger(o); +} + + +LUA_API int lua_isnumber (lua_State *L, int idx) { + lua_Number n; + const TValue *o = index2addr(L, idx); + return tonumber(o, &n); +} + + +LUA_API int lua_isstring (lua_State *L, int idx) { + const TValue *o = index2addr(L, idx); + return (ttisstring(o) || cvt2str(o)); +} + + +LUA_API int lua_isuserdata (lua_State *L, int idx) { + const TValue *o = index2addr(L, idx); + return (ttisfulluserdata(o) || ttislightuserdata(o)); +} + + +LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { + StkId o1 = index2addr(L, index1); + StkId o2 = index2addr(L, index2); + return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0; +} + + +LUA_API void lua_arith (lua_State *L, int op) { + lua_lock(L); + if (op != LUA_OPUNM && op != LUA_OPBNOT) + api_checknelems(L, 2); /* all other operations expect two operands */ + else { /* for unary operations, add fake 2nd operand */ + api_checknelems(L, 1); + setobjs2s(L, L->top, L->top - 1); + api_incr_top(L); + } + /* first operand at top - 2, second at top - 1; result go to top - 2 */ + luaO_arith(L, op, L->top - 2, L->top - 1, L->top - 2); + L->top--; /* remove second operand */ + lua_unlock(L); +} + + +LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) { + StkId o1, o2; + int i = 0; + lua_lock(L); /* may call tag method */ + o1 = index2addr(L, index1); + o2 = index2addr(L, index2); + if (isvalid(o1) && isvalid(o2)) { + switch (op) { + case LUA_OPEQ: i = luaV_equalobj(L, o1, o2); break; + case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break; + case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break; + default: api_check(L, 0, "invalid option"); + } + } + lua_unlock(L); + return i; +} + + +LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) { + size_t sz = luaO_str2num(s, L->top); + if (sz != 0) + api_incr_top(L); + return sz; +} + + +LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) { + lua_Number n; + const TValue *o = index2addr(L, idx); + int isnum = tonumber(o, &n); + if (!isnum) + n = 0; /* call to 'tonumber' may change 'n' even if it fails */ + if (pisnum) *pisnum = isnum; + return n; +} + + +LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) { + lua_Integer res; + const TValue *o = index2addr(L, idx); + int isnum = tointeger(o, &res); + if (!isnum) + res = 0; /* call to 'tointeger' may change 'n' even if it fails */ + if (pisnum) *pisnum = isnum; + return res; +} + + +LUA_API int lua_toboolean (lua_State *L, int idx) { + const TValue *o = index2addr(L, idx); + return !l_isfalse(o); +} + + +LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { + StkId o = index2addr(L, idx); + if (!ttisstring(o)) { + if (!cvt2str(o)) { /* not convertible? */ + if (len != NULL) *len = 0; + return NULL; + } + lua_lock(L); /* 'luaO_tostring' may create a new string */ + luaO_tostring(L, o); + luaC_checkGC(L); + o = index2addr(L, idx); /* previous call may reallocate the stack */ + lua_unlock(L); + } + if (len != NULL) + *len = vslen(o); + return svalue(o); +} + + +LUA_API size_t lua_rawlen (lua_State *L, int idx) { + StkId o = index2addr(L, idx); + switch (ttype(o)) { + case LUA_TSHRSTR: return tsvalue(o)->shrlen; + case LUA_TLNGSTR: return tsvalue(o)->u.lnglen; + case LUA_TUSERDATA: return uvalue(o)->len; + case LUA_TTABLE: return luaH_getn(hvalue(o)); + default: return 0; + } +} + + +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { + StkId o = index2addr(L, idx); + if (ttislcf(o)) return fvalue(o); + else if (ttisCclosure(o)) + return clCvalue(o)->f; + else return NULL; /* not a C function */ +} + + +LUA_API void *lua_touserdata (lua_State *L, int idx) { + StkId o = index2addr(L, idx); + switch (ttnov(o)) { + case LUA_TUSERDATA: return getudatamem(uvalue(o)); + case LUA_TLIGHTUSERDATA: return pvalue(o); + default: return NULL; + } +} + + +LUA_API lua_State *lua_tothread (lua_State *L, int idx) { + StkId o = index2addr(L, idx); + return (!ttisthread(o)) ? NULL : thvalue(o); +} + + +LUA_API const void *lua_topointer (lua_State *L, int idx) { + StkId o = index2addr(L, idx); + switch (ttype(o)) { + case LUA_TTABLE: return hvalue(o); + case LUA_TLCL: return clLvalue(o); + case LUA_TCCL: return clCvalue(o); + case LUA_TLCF: return cast(void *, cast(size_t, fvalue(o))); + case LUA_TTHREAD: return thvalue(o); + case LUA_TUSERDATA: return getudatamem(uvalue(o)); + case LUA_TLIGHTUSERDATA: return pvalue(o); + 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); + setfltvalue(L->top, n); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { + lua_lock(L); + setivalue(L->top, n); + api_incr_top(L); + lua_unlock(L); +} + + +/* +** Pushes on the stack a string with given length. Avoid using 's' when +** 'len' == 0 (as 's' can be NULL in that case), due to later use of +** 'memcmp' and 'memcpy'. +*/ +LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { + TString *ts; + lua_lock(L); + ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len); + setsvalue2s(L, L->top, ts); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getstr(ts); +} + + +LUA_API const char *lua_pushstring (lua_State *L, const char *s) { + lua_lock(L); + if (s == NULL) + setnilvalue(L->top); + else { + TString *ts; + ts = luaS_new(L, s); + setsvalue2s(L, L->top, ts); + s = getstr(ts); /* internal copy's address */ + } + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return s; +} + + +LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, + va_list argp) { + const char *ret; + lua_lock(L); + ret = luaO_pushvfstring(L, fmt, argp); + luaC_checkGC(L); + 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); + va_start(argp, fmt); + ret = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + luaC_checkGC(L); + lua_unlock(L); + return ret; +} + + +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { + lua_lock(L); + if (n == 0) { + setfvalue(L->top, fn); + } + else { + CClosure *cl; + api_checknelems(L, n); + api_check(L, n <= MAXUPVAL, "upvalue index too large"); + cl = luaF_newCclosure(L, n); + cl->f = fn; + L->top -= n; + while (n--) { + setobj2n(L, &cl->upvalue[n], L->top + n); + /* does not need barrier because closure is white */ + } + setclCvalue(L, L->top, cl); + } + api_incr_top(L); + luaC_checkGC(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) +*/ + + +static int auxgetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + if (luaV_fastget(L, t, str, slot, luaH_getstr)) { + setobj2s(L, L->top, slot); + api_incr_top(L); + } + else { + setsvalue2s(L, L->top, str); + api_incr_top(L); + luaV_finishget(L, t, L->top - 1, L->top - 1, slot); + } + lua_unlock(L); + return ttnov(L->top - 1); +} + + +LUA_API int lua_getglobal (lua_State *L, const char *name) { + Table *reg = hvalue(&G(L)->l_registry); + lua_lock(L); + return auxgetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name); +} + + +LUA_API int lua_gettable (lua_State *L, int idx) { + StkId t; + lua_lock(L); + t = index2addr(L, idx); + luaV_gettable(L, t, L->top - 1, L->top - 1); + lua_unlock(L); + return ttnov(L->top - 1); +} + + +LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { + lua_lock(L); + return auxgetstr(L, index2addr(L, idx), k); +} + + +LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { + StkId t; + const TValue *slot; + lua_lock(L); + t = index2addr(L, idx); + if (luaV_fastget(L, t, n, slot, luaH_getint)) { + setobj2s(L, L->top, slot); + api_incr_top(L); + } + else { + setivalue(L->top, n); + api_incr_top(L); + luaV_finishget(L, t, L->top - 1, L->top - 1, slot); + } + lua_unlock(L); + return ttnov(L->top - 1); +} + + +LUA_API int lua_rawget (lua_State *L, int idx) { + StkId t; + lua_lock(L); + t = index2addr(L, idx); + api_check(L, ttistable(t), "table expected"); + setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); + lua_unlock(L); + return ttnov(L->top - 1); +} + + +LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { + StkId t; + lua_lock(L); + t = index2addr(L, idx); + api_check(L, ttistable(t), "table expected"); + setobj2s(L, L->top, luaH_getint(hvalue(t), n)); + api_incr_top(L); + lua_unlock(L); + return ttnov(L->top - 1); +} + + +LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { + StkId t; + TValue k; + lua_lock(L); + t = index2addr(L, idx); + api_check(L, ttistable(t), "table expected"); + setpvalue(&k, cast(void *, p)); + setobj2s(L, L->top, luaH_get(hvalue(t), &k)); + api_incr_top(L); + lua_unlock(L); + return ttnov(L->top - 1); +} + + +LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { + Table *t; + lua_lock(L); + t = luaH_new(L); + sethvalue(L, L->top, t); + api_incr_top(L); + if (narray > 0 || nrec > 0) + luaH_resize(L, t, narray, nrec); + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API int lua_getmetatable (lua_State *L, int objindex) { + const TValue *obj; + Table *mt; + int res = 0; + lua_lock(L); + obj = index2addr(L, objindex); + switch (ttnov(obj)) { + case LUA_TTABLE: + mt = hvalue(obj)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(obj)->metatable; + break; + default: + mt = G(L)->mt[ttnov(obj)]; + break; + } + if (mt != NULL) { + sethvalue(L, L->top, mt); + api_incr_top(L); + res = 1; + } + lua_unlock(L); + return res; +} + + +LUA_API int lua_getuservalue (lua_State *L, int idx) { + StkId o; + lua_lock(L); + o = index2addr(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + getuservalue(L, uvalue(o), L->top); + api_incr_top(L); + lua_unlock(L); + return ttnov(L->top - 1); +} + + +/* +** set functions (stack -> Lua) +*/ + +/* +** t[k] = value at the top of the stack (where 'k' is a string) +*/ +static void auxsetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + api_checknelems(L, 1); + if (luaV_fastset(L, t, str, slot, luaH_getstr, L->top - 1)) + L->top--; /* pop value */ + else { + setsvalue2s(L, L->top, str); /* push 'str' (to make it a TValue) */ + api_incr_top(L); + luaV_finishset(L, t, L->top - 1, L->top - 2, slot); + L->top -= 2; /* pop value and key */ + } + lua_unlock(L); /* lock done by caller */ +} + + +LUA_API void lua_setglobal (lua_State *L, const char *name) { + Table *reg = hvalue(&G(L)->l_registry); + lua_lock(L); /* unlock done in 'auxsetstr' */ + auxsetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name); +} + + +LUA_API void lua_settable (lua_State *L, int idx) { + StkId t; + lua_lock(L); + api_checknelems(L, 2); + t = index2addr(L, idx); + 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) { + lua_lock(L); /* unlock done in 'auxsetstr' */ + auxsetstr(L, index2addr(L, idx), k); +} + + +LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { + StkId t; + const TValue *slot; + lua_lock(L); + api_checknelems(L, 1); + t = index2addr(L, idx); + if (luaV_fastset(L, t, n, slot, luaH_getint, L->top - 1)) + L->top--; /* pop value */ + else { + setivalue(L->top, n); + api_incr_top(L); + luaV_finishset(L, t, L->top - 1, L->top - 2, slot); + L->top -= 2; /* pop value and key */ + } + lua_unlock(L); +} + + +LUA_API void lua_rawset (lua_State *L, int idx) { + StkId o; + TValue *slot; + lua_lock(L); + api_checknelems(L, 2); + o = index2addr(L, idx); + api_check(L, ttistable(o), "table expected"); + slot = luaH_set(L, hvalue(o), L->top - 2); + setobj2t(L, slot, L->top - 1); + invalidateTMcache(hvalue(o)); + luaC_barrierback(L, hvalue(o), L->top-1); + L->top -= 2; + lua_unlock(L); +} + + +LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) { + StkId o; + lua_lock(L); + api_checknelems(L, 1); + o = index2addr(L, idx); + api_check(L, ttistable(o), "table expected"); + luaH_setint(L, hvalue(o), n, L->top - 1); + luaC_barrierback(L, hvalue(o), L->top-1); + L->top--; + lua_unlock(L); +} + + +LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { + StkId o; + TValue k, *slot; + lua_lock(L); + api_checknelems(L, 1); + o = index2addr(L, idx); + api_check(L, ttistable(o), "table expected"); + setpvalue(&k, cast(void *, p)); + slot = luaH_set(L, hvalue(o), &k); + setobj2t(L, slot, L->top - 1); + luaC_barrierback(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 = index2addr(L, objindex); + if (ttisnil(L->top - 1)) + mt = NULL; + else { + api_check(L, ttistable(L->top - 1), "table expected"); + mt = hvalue(L->top - 1); + } + switch (ttnov(obj)) { + case LUA_TTABLE: { + hvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, gcvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + case LUA_TUSERDATA: { + uvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, uvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + default: { + G(L)->mt[ttnov(obj)] = mt; + break; + } + } + L->top--; + lua_unlock(L); + return 1; +} + + +LUA_API void lua_setuservalue (lua_State *L, int idx) { + StkId o; + lua_lock(L); + api_checknelems(L, 1); + o = index2addr(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + setuservalue(L, uvalue(o), L->top - 1); + luaC_barrier(L, gcvalue(o), L->top - 1); + L->top--; + lua_unlock(L); +} + + +/* +** 'load' and 'call' functions (run Lua code) +*/ + + +#define checkresults(L,na,nr) \ + api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \ + "results from function overflow current stack size") + + +LUA_API void lua_callk (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k) { + StkId func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + func = L->top - (nargs+1); + if (k != NULL && L->nny == 0) { /* need to prepare continuation? */ + L->ci->u.c.k = k; /* save continuation */ + L->ci->u.c.ctx = ctx; /* save context */ + luaD_call(L, func, nresults); /* do the call */ + } + else /* no continuation or no yieldable */ + luaD_callnoyield(L, func, nresults); /* just do the call */ + 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_callnoyield(L, c->func, c->nresults); +} + + + +LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k) { + struct CallS c; + int status; + ptrdiff_t func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + if (errfunc == 0) + func = 0; + else { + StkId o = index2addr(L, errfunc); + api_checkstackindex(L, errfunc, o); + func = savestack(L, o); + } + c.func = L->top - (nargs+1); /* function to be called */ + if (k == NULL || L->nny > 0) { /* no continuation or no yieldable? */ + c.nresults = nresults; /* do a 'conventional' protected call */ + status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); + } + else { /* prepare continuation (call is already protected by 'resume') */ + CallInfo *ci = L->ci; + ci->u.c.k = k; /* save continuation */ + ci->u.c.ctx = ctx; /* save context */ + /* save information for error recovery */ + ci->extra = savestack(L, c.func); + ci->u.c.old_errfunc = L->errfunc; + L->errfunc = func; + setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ + ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ + luaD_call(L, c.func, nresults); /* do the call */ + ci->callstatus &= ~CIST_YPCALL; + L->errfunc = ci->u.c.old_errfunc; + status = LUA_OK; /* if it is here, there were no errors */ + } + adjustresults(L, nresults); + lua_unlock(L); + return status; +} + + +LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, + const char *chunkname, const char *mode) { + ZIO z; + int status; + lua_lock(L); + if (!chunkname) chunkname = "?"; + luaZ_init(L, &z, reader, data); + status = luaD_protectedparser(L, &z, chunkname, mode); + if (status == LUA_OK) { /* no errors? */ + LClosure *f = clLvalue(L->top - 1); /* get newly created function */ + if (f->nupvalues >= 1) { /* does it have an upvalue? */ + /* get global table from registry */ + Table *reg = hvalue(&G(L)->l_registry); + const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS); + /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ + setobj(L, f->upvals[0]->v, gt); + luaC_upvalbarrier(L, f->upvals[0]); + } + } + lua_unlock(L); + return status; +} + + +LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) { + int status; + TValue *o; + lua_lock(L); + api_checknelems(L, 1); + o = L->top - 1; + if (isLfunction(o)) + status = luaU_dump(L, getproto(o), writer, data, strip); + 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->gcrunning = 0; + break; + } + case LUA_GCRESTART: { + luaE_setdebt(g, 0); + g->gcrunning = 1; + break; + } + case LUA_GCCOLLECT: { + luaC_fullgc(L, 0); + break; + } + case LUA_GCCOUNT: { + /* GC values are expressed in Kbytes: #bytes/2^10 */ + res = cast_int(gettotalbytes(g) >> 10); + break; + } + case LUA_GCCOUNTB: { + res = cast_int(gettotalbytes(g) & 0x3ff); + break; + } + case LUA_GCSTEP: { + l_mem debt = 1; /* =1 to signal that it did an actual step */ + lu_byte oldrunning = g->gcrunning; + g->gcrunning = 1; /* allow GC to run */ + if (data == 0) { + luaE_setdebt(g, -GCSTEPSIZE); /* to do a "small" step */ + luaC_step(L); + } + else { /* add 'data' to total debt */ + debt = cast(l_mem, data) * 1024 + g->GCdebt; + luaE_setdebt(g, debt); + luaC_checkGC(L); + } + g->gcrunning = oldrunning; /* restore previous state */ + if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */ + res = 1; /* signal it */ + break; + } + case LUA_GCSETPAUSE: { + res = g->gcpause; + g->gcpause = data; + break; + } + case LUA_GCSETSTEPMUL: { + res = g->gcstepmul; + if (data < 40) data = 40; /* avoid ridiculous low values (and 0) */ + g->gcstepmul = data; + break; + } + case LUA_GCISRUNNING: { + res = g->gcrunning; + 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); + /* code unreachable; will unlock when control actually leaves the kernel */ + return 0; /* to avoid warnings */ +} + + +LUA_API int lua_next (lua_State *L, int idx) { + StkId t; + int more; + lua_lock(L); + t = index2addr(L, idx); + api_check(L, ttistable(t), "table expected"); + 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) { + luaV_concat(L, n); + } + 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 */ + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API void lua_len (lua_State *L, int idx) { + StkId t; + lua_lock(L); + t = index2addr(L, idx); + luaV_objlen(L, L->top, t); + api_incr_top(L); + 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); + u = luaS_newudata(L, size); + setuvalue(L, L->top, u); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getudatamem(u); +} + + + +static const char *aux_upvalue (StkId fi, int n, TValue **val, + CClosure **owner, UpVal **uv) { + switch (ttype(fi)) { + case LUA_TCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + if (!(1 <= n && n <= f->nupvalues)) return NULL; + *val = &f->upvalue[n-1]; + if (owner) *owner = f; + return ""; + } + case LUA_TLCL: { /* Lua closure */ + LClosure *f = clLvalue(fi); + TString *name; + Proto *p = f->p; + if (!(1 <= n && n <= p->sizeupvalues)) return NULL; + *val = f->upvals[n-1]->v; + if (uv) *uv = f->upvals[n - 1]; + name = p->upvalues[n-1].name; + return (name == NULL) ? "(*no name)" : getstr(name); + } + default: return NULL; /* not a closure */ + } +} + + +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val = NULL; /* to avoid warnings */ + lua_lock(L); + name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL, NULL); + 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 = NULL; /* to avoid warnings */ + CClosure *owner = NULL; + UpVal *uv = NULL; + StkId fi; + lua_lock(L); + fi = index2addr(L, funcindex); + api_checknelems(L, 1); + name = aux_upvalue(fi, n, &val, &owner, &uv); + if (name) { + L->top--; + setobj(L, val, L->top); + if (owner) { luaC_barrier(L, owner, L->top); } + else if (uv) { luaC_upvalbarrier(L, uv); } + } + lua_unlock(L); + return name; +} + + +static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) { + LClosure *f; + StkId fi = index2addr(L, fidx); + api_check(L, ttisLclosure(fi), "Lua function expected"); + f = clLvalue(fi); + api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index"); + if (pf) *pf = f; + return &f->upvals[n - 1]; /* get its upvalue pointer */ +} + + +LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) { + StkId fi = index2addr(L, fidx); + switch (ttype(fi)) { + case LUA_TLCL: { /* lua closure */ + return *getupvalref(L, fidx, n, NULL); + } + case LUA_TCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index"); + return &f->upvalue[n - 1]; + } + default: { + api_check(L, 0, "closure expected"); + return NULL; + } + } +} + + +LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1, + int fidx2, int n2) { + LClosure *f1; + UpVal **up1 = getupvalref(L, fidx1, n1, &f1); + UpVal **up2 = getupvalref(L, fidx2, n2, NULL); + luaC_upvdeccount(L, *up1); + *up1 = *up2; + (*up1)->refcount++; + if (upisopen(*up1)) (*up1)->u.open.touched = 1; + luaC_upvalbarrier(L, *up1); +} + + diff --git a/lua-5.3.3/src/lapi.h b/lua-5.3.3/src/lapi.h new file mode 100644 index 0000000..6d36dee --- /dev/null +++ b/lua-5.3.3/src/lapi.h @@ -0,0 +1,24 @@ +/* +** $Id: lapi.h,v 2.9 2015/03/06 19:49:50 roberto Exp $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "llimits.h" +#include "lstate.h" + +#define api_incr_top(L) {L->top++; api_check(L, L->top <= L->ci->top, \ + "stack overflow");} + +#define adjustresults(L,nres) \ + { if ((nres) == LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; } + +#define api_checknelems(L,n) api_check(L, (n) < (L->top - L->ci->func), \ + "not enough elements in the stack") + + +#endif diff --git a/lua-5.3.3/src/lauxlib.c b/lua-5.3.3/src/lauxlib.c new file mode 100644 index 0000000..bacf43b --- /dev/null +++ b/lua-5.3.3/src/lauxlib.c @@ -0,0 +1,1035 @@ +/* +** $Id: lauxlib.c,v 1.286 2016/01/08 15:33:09 roberto Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + +#define lauxlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#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. +*/ + +#include "lua.h" + +#include "lauxlib.h" + + +/* +** {====================================================== +** Traceback +** ======================================================= +*/ + + +#define LEVELS1 10 /* size of the first part of the stack */ +#define LEVELS2 11 /* size of the second part of the stack */ + + + +/* +** search for 'objidx' in table at index -1. +** return 1 + string at top if find a good name. +*/ +static int findfield (lua_State *L, int objidx, int level) { + if (level == 0 || !lua_istable(L, -1)) + return 0; /* not found */ + lua_pushnil(L); /* start 'next' loop */ + while (lua_next(L, -2)) { /* for each pair in table */ + if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ + if (lua_rawequal(L, objidx, -1)) { /* found object? */ + lua_pop(L, 1); /* remove value (but keep name) */ + return 1; + } + else if (findfield(L, objidx, level - 1)) { /* try recursively */ + lua_remove(L, -2); /* remove table (but keep name) */ + lua_pushliteral(L, "."); + lua_insert(L, -2); /* place '.' between the two names */ + lua_concat(L, 3); + return 1; + } + } + lua_pop(L, 1); /* remove value */ + } + return 0; /* not found */ +} + + +/* +** Search for a name for a function in all loaded modules +** (registry._LOADED). +*/ +static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { + int top = lua_gettop(L); + lua_getinfo(L, "f", ar); /* push function */ + lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); + if (findfield(L, top + 1, 2)) { + const char *name = lua_tostring(L, -1); + if (strncmp(name, "_G.", 3) == 0) { /* name start with '_G.'? */ + lua_pushstring(L, name + 3); /* push name without prefix */ + lua_remove(L, -2); /* remove original name */ + } + lua_copy(L, -1, top + 1); /* move name to proper place */ + lua_pop(L, 2); /* remove pushed values */ + return 1; + } + else { + lua_settop(L, top); /* remove function and global table */ + return 0; + } +} + + +static void pushfuncname (lua_State *L, lua_Debug *ar) { + if (pushglobalfuncname(L, ar)) { /* try first a global name */ + lua_pushfstring(L, "function '%s'", lua_tostring(L, -1)); + lua_remove(L, -2); /* remove name */ + } + else if (*ar->namewhat != '\0') /* is there a name from code? */ + lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name); /* use it */ + else if (*ar->what == 'm') /* main? */ + lua_pushliteral(L, "main chunk"); + else if (*ar->what != 'C') /* for Lua functions, use */ + lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined); + else /* nothing left... */ + lua_pushliteral(L, "?"); +} + + +static int lastlevel (lua_State *L) { + lua_Debug ar; + int li = 1, le = 1; + /* find an upper bound */ + while (lua_getstack(L, le, &ar)) { li = le; le *= 2; } + /* do a binary search */ + while (li < le) { + int m = (li + le)/2; + if (lua_getstack(L, m, &ar)) li = m + 1; + else le = m; + } + return le - 1; +} + + +LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, + const char *msg, int level) { + lua_Debug ar; + int top = lua_gettop(L); + int last = lastlevel(L1); + int n1 = (last - level > LEVELS1 + LEVELS2) ? LEVELS1 : -1; + if (msg) + lua_pushfstring(L, "%s\n", msg); + luaL_checkstack(L, 10, NULL); + lua_pushliteral(L, "stack traceback:"); + while (lua_getstack(L1, level++, &ar)) { + if (n1-- == 0) { /* too many levels? */ + lua_pushliteral(L, "\n\t..."); /* add a '...' */ + level = last - LEVELS2 + 1; /* and skip to last ones */ + } + else { + lua_getinfo(L1, "Slnt", &ar); + lua_pushfstring(L, "\n\t%s:", ar.short_src); + if (ar.currentline > 0) + lua_pushfstring(L, "%d:", ar.currentline); + lua_pushliteral(L, " in "); + pushfuncname(L, &ar); + if (ar.istailcall) + lua_pushliteral(L, "\n\t(...tail calls...)"); + lua_concat(L, lua_gettop(L) - top); + } + } + lua_concat(L, lua_gettop(L) - top); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Error-report functions +** ======================================================= +*/ + +LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { + lua_Debug ar; + if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ + return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); + lua_getinfo(L, "n", &ar); + if (strcmp(ar.namewhat, "method") == 0) { + arg--; /* do not count 'self' */ + if (arg == 0) /* error is in the self argument itself? */ + return luaL_error(L, "calling '%s' on bad self (%s)", + ar.name, extramsg); + } + if (ar.name == NULL) + ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; + return luaL_error(L, "bad argument #%d to '%s' (%s)", + arg, ar.name, extramsg); +} + + +static int typeerror (lua_State *L, int arg, const char *tname) { + const char *msg; + const char *typearg; /* name for the type of the actual argument */ + if (luaL_getmetafield(L, arg, "__name") == LUA_TSTRING) + typearg = lua_tostring(L, -1); /* use the given type name */ + else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA) + typearg = "light userdata"; /* special name for messages */ + else + typearg = luaL_typename(L, arg); /* standard name */ + msg = lua_pushfstring(L, "%s expected, got %s", tname, typearg); + return luaL_argerror(L, arg, msg); +} + + +static void tag_error (lua_State *L, int arg, int tag) { + typeerror(L, arg, lua_typename(L, tag)); +} + + +/* +** The use of 'lua_pushfstring' ensures this function does not +** need reserved stack space when called. +*/ +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_pushfstring(L, ""); /* else, no information available... */ +} + + +/* +** Again, the use of 'lua_pushvfstring' ensures this function does +** not need reserved stack space when called. (At worst, it generates +** an error with "stack overflow" instead of the given message.) +*/ +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_fileresult (lua_State *L, int stat, const char *fname) { + int en = errno; /* calls to Lua API may change this value */ + if (stat) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushnil(L); + if (fname) + lua_pushfstring(L, "%s: %s", fname, strerror(en)); + else + lua_pushstring(L, strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + + +#if !defined(l_inspectstat) /* { */ + +#if defined(LUA_USE_POSIX) + +#include + +/* +** use appropriate macros to interpret 'pclose' return status +*/ +#define l_inspectstat(stat,what) \ + if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \ + else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; } + +#else + +#define l_inspectstat(stat,what) /* no op */ + +#endif + +#endif /* } */ + + +LUALIB_API int luaL_execresult (lua_State *L, int stat) { + const char *what = "exit"; /* type of termination */ + if (stat == -1) /* error? */ + return luaL_fileresult(L, 0, NULL); + else { + l_inspectstat(stat, what); /* interpret result */ + if (*what == 'e' && stat == 0) /* successful termination? */ + lua_pushboolean(L, 1); + else + lua_pushnil(L); + lua_pushstring(L, what); + lua_pushinteger(L, stat); + return 3; /* return true/nil,what,code */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Userdata's metatable manipulation +** ======================================================= +*/ + +LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { + if (luaL_getmetatable(L, tname) != LUA_TNIL) /* name already in use? */ + return 0; /* leave previous value on top, but return 0 */ + lua_pop(L, 1); + lua_createtable(L, 0, 2); /* create metatable */ + lua_pushstring(L, tname); + lua_setfield(L, -2, "__name"); /* metatable.__name = tname */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ + return 1; +} + + +LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) { + luaL_getmetatable(L, tname); + lua_setmetatable(L, -2); +} + + +LUALIB_API void *luaL_testudata (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? */ + luaL_getmetatable(L, tname); /* get correct metatable */ + if (!lua_rawequal(L, -1, -2)) /* not the same? */ + p = NULL; /* value is a userdata with wrong metatable */ + lua_pop(L, 2); /* remove both metatables */ + return p; + } + } + return NULL; /* value is not a userdata with a metatable */ +} + + +LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = luaL_testudata(L, ud, tname); + if (p == NULL) typeerror(L, ud, tname); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Argument check functions +** ======================================================= +*/ + +LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def, + const char *const lst[]) { + const char *name = (def) ? luaL_optstring(L, arg, def) : + luaL_checkstring(L, arg); + int i; + for (i=0; lst[i]; i++) + if (strcmp(lst[i], name) == 0) + return i; + return luaL_argerror(L, arg, + lua_pushfstring(L, "invalid option '%s'", name)); +} + + +/* +** Ensures the stack has at least 'space' extra slots, raising an error +** if it cannot fulfill the request. (The error handling needs a few +** extra slots to format the error message. In case of an error without +** this extra space, Lua will generate the same 'stack overflow' error, +** but without 'msg'.) +*/ +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { + if (!lua_checkstack(L, space)) { + if (msg) + luaL_error(L, "stack overflow (%s)", msg); + else + luaL_error(L, "stack overflow"); + } +} + + +LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) { + if (lua_type(L, arg) != t) + tag_error(L, arg, t); +} + + +LUALIB_API void luaL_checkany (lua_State *L, int arg) { + if (lua_type(L, arg) == LUA_TNONE) + luaL_argerror(L, arg, "value expected"); +} + + +LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) { + const char *s = lua_tolstring(L, arg, len); + if (!s) tag_error(L, arg, LUA_TSTRING); + return s; +} + + +LUALIB_API const char *luaL_optlstring (lua_State *L, int arg, + const char *def, size_t *len) { + if (lua_isnoneornil(L, arg)) { + if (len) + *len = (def ? strlen(def) : 0); + return def; + } + else return luaL_checklstring(L, arg, len); +} + + +LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) { + int isnum; + lua_Number d = lua_tonumberx(L, arg, &isnum); + if (!isnum) + tag_error(L, arg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) { + return luaL_opt(L, luaL_checknumber, arg, def); +} + + +static void interror (lua_State *L, int arg) { + if (lua_isnumber(L, arg)) + luaL_argerror(L, arg, "number has no integer representation"); + else + tag_error(L, arg, LUA_TNUMBER); +} + + +LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) { + int isnum; + lua_Integer d = lua_tointegerx(L, arg, &isnum); + if (!isnum) { + interror(L, arg); + } + return d; +} + + +LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg, + lua_Integer def) { + return luaL_opt(L, luaL_checkinteger, arg, def); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +/* userdata to box arbitrary data */ +typedef struct UBox { + void *box; + size_t bsize; +} UBox; + + +static void *resizebox (lua_State *L, int idx, size_t newsize) { + void *ud; + lua_Alloc allocf = lua_getallocf(L, &ud); + UBox *box = (UBox *)lua_touserdata(L, idx); + void *temp = allocf(ud, box->box, box->bsize, newsize); + if (temp == NULL && newsize > 0) { /* allocation error? */ + resizebox(L, idx, 0); /* free buffer */ + luaL_error(L, "not enough memory for buffer allocation"); + } + box->box = temp; + box->bsize = newsize; + return temp; +} + + +static int boxgc (lua_State *L) { + resizebox(L, 1, 0); + return 0; +} + + +static void *newbox (lua_State *L, size_t newsize) { + UBox *box = (UBox *)lua_newuserdata(L, sizeof(UBox)); + box->box = NULL; + box->bsize = 0; + if (luaL_newmetatable(L, "LUABOX")) { /* creating metatable? */ + lua_pushcfunction(L, boxgc); + lua_setfield(L, -2, "__gc"); /* metatable.__gc = boxgc */ + } + lua_setmetatable(L, -2); + return resizebox(L, -1, newsize); +} + + +/* +** check whether buffer is using a userdata on the stack as a temporary +** buffer +*/ +#define buffonstack(B) ((B)->b != (B)->initb) + + +/* +** returns a pointer to a free area with at least 'sz' bytes +*/ +LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) { + lua_State *L = B->L; + if (B->size - B->n < sz) { /* not enough space? */ + char *newbuff; + size_t newsize = B->size * 2; /* double buffer size */ + if (newsize - B->n < sz) /* not big enough? */ + newsize = B->n + sz; + if (newsize < B->n || newsize - B->n < sz) + luaL_error(L, "buffer too large"); + /* create larger buffer */ + if (buffonstack(B)) + newbuff = (char *)resizebox(L, -1, newsize); + else { /* no buffer yet */ + newbuff = (char *)newbox(L, newsize); + memcpy(newbuff, B->b, B->n * sizeof(char)); /* copy original content */ + } + B->b = newbuff; + B->size = newsize; + } + return &B->b[B->n]; +} + + +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { + if (l > 0) { /* avoid 'memcpy' when 's' can be NULL */ + char *b = luaL_prepbuffsize(B, l); + memcpy(b, s, l * sizeof(char)); + luaL_addsize(B, l); + } +} + + +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) { + lua_State *L = B->L; + lua_pushlstring(L, B->b, B->n); + if (buffonstack(B)) { + resizebox(L, -2, 0); /* delete old buffer */ + lua_remove(L, -2); /* remove its header from the stack */ + } +} + + +LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) { + luaL_addsize(B, sz); + luaL_pushresult(B); +} + + +LUALIB_API void luaL_addvalue (luaL_Buffer *B) { + lua_State *L = B->L; + size_t l; + const char *s = lua_tolstring(L, -1, &l); + if (buffonstack(B)) + lua_insert(L, -2); /* put value below buffer */ + luaL_addlstring(B, s, l); + lua_remove(L, (buffonstack(B)) ? -2 : -1); /* remove value */ +} + + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { + B->L = L; + B->b = B->initb; + B->n = 0; + B->size = LUAL_BUFFERSIZE; +} + + +LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) { + luaL_buffinit(L, B); + return luaL_prepbuffsize(B, sz); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Reference system +** ======================================================= +*/ + +/* index of free-list header */ +#define freelist 0 + + +LUALIB_API int luaL_ref (lua_State *L, int t) { + int ref; + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* remove from stack */ + return LUA_REFNIL; /* 'nil' has a unique fixed reference */ + } + t = lua_absindex(L, t); + lua_rawgeti(L, t, freelist); /* get first free element */ + ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */ + 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); /* (t[freelist] = t[ref]) */ + } + else /* no free elements */ + ref = (int)lua_rawlen(L, t) + 1; /* get a 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 = lua_absindex(L, t); + lua_rawgeti(L, t, freelist); + lua_rawseti(L, t, ref); /* t[ref] = t[freelist] */ + lua_pushinteger(L, ref); + lua_rawseti(L, t, freelist); /* t[freelist] = ref */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Load functions +** ======================================================= +*/ + +typedef struct LoadF { + int n; /* number of pre-read characters */ + FILE *f; /* file being read */ + char buff[BUFSIZ]; /* area for reading file */ +} LoadF; + + +static const char *getF (lua_State *L, void *ud, size_t *size) { + LoadF *lf = (LoadF *)ud; + (void)L; /* not used */ + if (lf->n > 0) { /* are there pre-read characters to be read? */ + *size = lf->n; /* return them (chars already in buffer) */ + lf->n = 0; /* no more pre-read characters */ + } + else { /* read a block from file */ + /* 'fread' can return > 0 *and* set the EOF flag. If next call to + 'getF' called 'fread', it might still wait for user input. + The next check avoids this problem. */ + if (feof(lf->f)) return NULL; + *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); /* read block */ + } + return lf->buff; +} + + +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; +} + + +static int skipBOM (LoadF *lf) { + const char *p = "\xEF\xBB\xBF"; /* UTF-8 BOM mark */ + int c; + lf->n = 0; + do { + c = getc(lf->f); + if (c == EOF || c != *(const unsigned char *)p++) return c; + lf->buff[lf->n++] = c; /* to be read by the parser */ + } while (*p != '\0'); + lf->n = 0; /* prefix matched; discard it */ + return getc(lf->f); /* return next character */ +} + + +/* +** reads the first character of file 'f' and skips an optional BOM mark +** in its beginning plus its first line if it starts with '#'. Returns +** true if it skipped the first line. In any case, '*cp' has the +** first "valid" character of the file (after the optional BOM and +** a first-line comment). +*/ +static int skipcomment (LoadF *lf, int *cp) { + int c = *cp = skipBOM(lf); + if (c == '#') { /* first line is a comment (Unix exec. file)? */ + do { /* skip first line */ + c = getc(lf->f); + } while (c != EOF && c != '\n'); + *cp = getc(lf->f); /* skip end-of-line, if present */ + return 1; /* there was a comment */ + } + else return 0; /* no comment */ +} + + +LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename, + const char *mode) { + LoadF lf; + int status, readstatus; + int c; + int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ + 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); + } + if (skipcomment(&lf, &c)) /* read initial portion */ + lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */ + 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); + skipcomment(&lf, &c); /* re-read initial portion */ + } + if (c != EOF) + lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */ + status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode); + 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; /* not used */ + if (ls->size == 0) return NULL; + *size = ls->size; + ls->size = 0; + return ls->s; +} + + +LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size, + const char *name, const char *mode) { + LoadS ls; + ls.s = buff; + ls.size = size; + return lua_load(L, getS, &ls, name, mode); +} + + +LUALIB_API int luaL_loadstring (lua_State *L, const char *s) { + return luaL_loadbuffer(L, s, strlen(s), s); +} + +/* }====================================================== */ + + + +LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { + if (!lua_getmetatable(L, obj)) /* no metatable? */ + return LUA_TNIL; + else { + int tt; + lua_pushstring(L, event); + tt = lua_rawget(L, -2); + if (tt == LUA_TNIL) /* is metafield nil? */ + lua_pop(L, 2); /* remove metatable and metafield */ + else + lua_remove(L, -2); /* remove only metatable */ + return tt; /* return metafield type */ + } +} + + +LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { + obj = lua_absindex(L, obj); + if (luaL_getmetafield(L, obj, event) == LUA_TNIL) /* no metafield? */ + return 0; + lua_pushvalue(L, obj); + lua_call(L, 1, 1); + return 1; +} + + +LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) { + lua_Integer l; + int isnum; + lua_len(L, idx); + l = lua_tointegerx(L, -1, &isnum); + if (!isnum) + luaL_error(L, "object length is not an integer"); + lua_pop(L, 1); /* remove object */ + return l; +} + + +LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { + if (!luaL_callmeta(L, idx, "__tostring")) { /* no metafield? */ + switch (lua_type(L, idx)) { + case LUA_TNUMBER: { + if (lua_isinteger(L, idx)) + lua_pushfstring(L, "%I", lua_tointeger(L, idx)); + else + lua_pushfstring(L, "%f", lua_tonumber(L, idx)); + break; + } + case LUA_TSTRING: + lua_pushvalue(L, idx); + break; + case LUA_TBOOLEAN: + lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); + break; + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + default: + lua_pushfstring(L, "%s: %p", luaL_typename(L, idx), + lua_topointer(L, idx)); + break; + } + } + return lua_tolstring(L, -1, len); +} + + +/* +** {====================================================== +** Compatibility with 5.1 module functions +** ======================================================= +*/ +#if defined(LUA_COMPAT_MODULE) + +static const char *luaL_findtable (lua_State *L, int idx, + const char *fname, int szhint) { + const char *e; + if (idx) lua_pushvalue(L, idx); + do { + e = strchr(fname, '.'); + if (e == NULL) e = fname + strlen(fname); + lua_pushlstring(L, fname, e - fname); + if (lua_rawget(L, -2) == LUA_TNIL) { /* 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; +} + + +/* +** Count number of elements in a luaL_Reg list. +*/ +static int libsize (const luaL_Reg *l) { + int size = 0; + for (; l && l->name; l++) size++; + return size; +} + + +/* +** Find or create a module table with a given name. The function +** first looks at the _LOADED table and, if that fails, try a +** global variable with that name. In any case, leaves on the stack +** the module table. +*/ +LUALIB_API void luaL_pushmodule (lua_State *L, const char *modname, + int sizehint) { + luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1); /* get _LOADED table */ + if (lua_getfield(L, -1, modname) != LUA_TTABLE) { /* no _LOADED[modname]? */ + lua_pop(L, 1); /* remove previous result */ + /* try global variable (and create one if it does not exist) */ + lua_pushglobaltable(L); + if (luaL_findtable(L, 0, modname, sizehint) != NULL) + luaL_error(L, "name conflict for module '%s'", modname); + lua_pushvalue(L, -1); + lua_setfield(L, -3, modname); /* _LOADED[modname] = new table */ + } + lua_remove(L, -2); /* remove _LOADED table */ +} + + +LUALIB_API void luaL_openlib (lua_State *L, const char *libname, + const luaL_Reg *l, int nup) { + luaL_checkversion(L); + if (libname) { + luaL_pushmodule(L, libname, libsize(l)); /* get/create library table */ + lua_insert(L, -(nup + 1)); /* move library table to below upvalues */ + } + if (l) + luaL_setfuncs(L, l, nup); + else + lua_pop(L, nup); /* remove upvalues */ +} + +#endif +/* }====================================================== */ + +/* +** set functions from list 'l' into table at top - 'nup'; each +** function gets the 'nup' elements at the top as upvalues. +** Returns with only the table at the stack. +*/ +LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { + luaL_checkstack(L, nup, "too many upvalues"); + for (; l->name != NULL; l++) { /* fill the table with given functions */ + int i; + for (i = 0; i < nup; i++) /* copy upvalues to the top */ + lua_pushvalue(L, -nup); + lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ + lua_setfield(L, -(nup + 2), l->name); + } + lua_pop(L, nup); /* remove upvalues */ +} + + +/* +** ensure that stack[idx][fname] has a table and push that table +** into the stack +*/ +LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) { + if (lua_getfield(L, idx, fname) == LUA_TTABLE) + return 1; /* table already there */ + else { + lua_pop(L, 1); /* remove previous result */ + idx = lua_absindex(L, idx); + lua_newtable(L); + lua_pushvalue(L, -1); /* copy to be left at top */ + lua_setfield(L, idx, fname); /* assign new table to field */ + return 0; /* false, because did not find table there */ + } +} + + +/* +** Stripped-down 'require': After checking "loaded" table, calls 'openf' +** to open a module, registers the result in 'package.loaded' table and, +** if 'glb' is true, also registers the result in the global table. +** Leaves resulting module on the top. +*/ +LUALIB_API void luaL_requiref (lua_State *L, const char *modname, + lua_CFunction openf, int glb) { + luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_getfield(L, -1, modname); /* _LOADED[modname] */ + if (!lua_toboolean(L, -1)) { /* package not already loaded? */ + lua_pop(L, 1); /* remove field */ + lua_pushcfunction(L, openf); + lua_pushstring(L, modname); /* argument to open function */ + lua_call(L, 1, 1); /* call 'openf' to open module */ + lua_pushvalue(L, -1); /* make copy of module (call result) */ + lua_setfield(L, -3, modname); /* _LOADED[modname] = module */ + } + lua_remove(L, -2); /* remove _LOADED table */ + if (glb) { + lua_pushvalue(L, -1); /* copy of module */ + lua_setglobal(L, modname); /* _G[modname] = module */ + } +} + + +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); +} + + +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); +} + + +static int panic (lua_State *L) { + lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n", + lua_tostring(L, -1)); + return 0; /* return to Lua to abort */ +} + + +LUALIB_API lua_State *luaL_newstate (void) { + lua_State *L = lua_newstate(l_alloc, NULL); + if (L) lua_atpanic(L, &panic); + return L; +} + + +LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) { + const lua_Number *v = lua_version(L); + if (sz != LUAL_NUMSIZES) /* check numeric types */ + luaL_error(L, "core and library have incompatible numeric types"); + if (v != lua_version(NULL)) + luaL_error(L, "multiple Lua VMs detected"); + else if (*v != ver) + luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f", + ver, *v); +} + diff --git a/lua-5.3.3/src/lauxlib.h b/lua-5.3.3/src/lauxlib.h new file mode 100644 index 0000000..ddb7c22 --- /dev/null +++ b/lua-5.3.3/src/lauxlib.h @@ -0,0 +1,256 @@ +/* +** $Id: lauxlib.h,v 1.129 2015/11/23 11:29:43 roberto Exp $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include +#include + +#include "lua.h" + + + +/* extra error code for 'luaL_load' */ +#define LUA_ERRFILE (LUA_ERRERR+1) + + +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; + + +#define LUAL_NUMSIZES (sizeof(lua_Integer)*16 + sizeof(lua_Number)) + +LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz); +#define luaL_checkversion(L) \ + luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES) + +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 const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len); +LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg); +LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg, + size_t *l); +LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg, + const char *def, size_t *l); +LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg); +LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def); + +LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg); +LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg, + 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 arg, int t); +LUALIB_API void (luaL_checkany) (lua_State *L, int arg); + +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname); +LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, 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 arg, const char *def, + const char *const lst[]); + +LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); +LUALIB_API int (luaL_execresult) (lua_State *L, int stat); + +/* predefined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) + +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_loadfilex) (lua_State *L, const char *filename, + const char *mode); + +#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) + +LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, + const char *name, const char *mode); +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); + +LUALIB_API lua_State *(luaL_newstate) (void); + +LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); + +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, const char *p, + const char *r); + +LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); + +LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname); + +LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1, + const char *msg, int level); + +LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, + lua_CFunction openf, int glb); + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + + +#define luaL_newlibtable(L,l) \ + lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) + +#define luaL_newlib(L,l) \ + (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) + +#define luaL_argcheck(L, cond,arg,extramsg) \ + ((void)((cond) || luaL_argerror(L, (arg), (extramsg)))) +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) + +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +#define luaL_dofile(L, fn) \ + (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_dostring(L, s) \ + (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) + +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + +#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +typedef struct luaL_Buffer { + char *b; /* buffer address */ + size_t size; /* buffer size */ + size_t n; /* number of characters in buffer */ + lua_State *L; + char initb[LUAL_BUFFERSIZE]; /* initial buffer */ +} luaL_Buffer; + + +#define luaL_addchar(B,c) \ + ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \ + ((B)->b[(B)->n++] = (c))) + +#define luaL_addsize(B,s) ((B)->n += (s)) + +LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); +LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); +LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); +LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz); +LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); + +#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) + +/* }====================================================== */ + + + +/* +** {====================================================== +** File handles for IO library +** ======================================================= +*/ + +/* +** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and +** initial structure 'luaL_Stream' (it may contain other fields +** after that initial structure). +*/ + +#define LUA_FILEHANDLE "FILE*" + + +typedef struct luaL_Stream { + FILE *f; /* stream (NULL for incompletely created streams) */ + lua_CFunction closef; /* to close stream (NULL for closed streams) */ +} luaL_Stream; + +/* }====================================================== */ + + + +/* compatibility with old module system */ +#if defined(LUA_COMPAT_MODULE) + +LUALIB_API void (luaL_pushmodule) (lua_State *L, const char *modname, + int sizehint); +LUALIB_API void (luaL_openlib) (lua_State *L, const char *libname, + const luaL_Reg *l, int nup); + +#define luaL_register(L,n,l) (luaL_openlib(L,(n),(l),0)) + +#endif + + +/* +** {================================================================== +** "Abstraction Layer" for basic report of messages and errors +** =================================================================== +*/ + +/* print a string */ +#if !defined(lua_writestring) +#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) +#endif + +/* print a newline and flush the output */ +#if !defined(lua_writeline) +#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) +#endif + +/* print an error message */ +#if !defined(lua_writestringerror) +#define lua_writestringerror(s,p) \ + (fprintf(stderr, (s), (p)), fflush(stderr)) +#endif + +/* }================================================================== */ + + +/* +** {============================================================ +** Compatibility with deprecated conversions +** ============================================================= +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a)) +#define luaL_optunsigned(L,a,d) \ + ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d))) + +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) + +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) + +#endif +/* }============================================================ */ + + + +#endif + + diff --git a/lua-5.3.3/src/lbaselib.c b/lua-5.3.3/src/lbaselib.c new file mode 100644 index 0000000..d481c4e --- /dev/null +++ b/lua-5.3.3/src/lbaselib.c @@ -0,0 +1,498 @@ +/* +** $Id: lbaselib.c,v 1.313 2016/04/11 19:18:40 roberto Exp $ +** Basic library +** See Copyright Notice in lua.h +*/ + +#define lbaselib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +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; + size_t l; + lua_pushvalue(L, -1); /* function to be called */ + lua_pushvalue(L, i); /* value to print */ + lua_call(L, 1, 1); + s = lua_tolstring(L, -1, &l); /* get result */ + if (s == NULL) + return luaL_error(L, "'tostring' must return a string to 'print'"); + if (i>1) lua_writestring("\t", 1); + lua_writestring(s, l); + lua_pop(L, 1); /* pop result */ + } + lua_writeline(); + return 0; +} + + +#define SPACECHARS " \f\n\r\t\v" + +static const char *b_str2int (const char *s, int base, lua_Integer *pn) { + lua_Unsigned n = 0; + int neg = 0; + s += strspn(s, SPACECHARS); /* skip initial spaces */ + if (*s == '-') { s++; neg = 1; } /* handle signal */ + else if (*s == '+') s++; + if (!isalnum((unsigned char)*s)) /* no digit? */ + return NULL; + do { + int digit = (isdigit((unsigned char)*s)) ? *s - '0' + : (toupper((unsigned char)*s) - 'A') + 10; + if (digit >= base) return NULL; /* invalid numeral */ + n = n * base + digit; + s++; + } while (isalnum((unsigned char)*s)); + s += strspn(s, SPACECHARS); /* skip trailing spaces */ + *pn = (lua_Integer)((neg) ? (0u - n) : n); + return s; +} + + +static int luaB_tonumber (lua_State *L) { + if (lua_isnoneornil(L, 2)) { /* standard conversion? */ + luaL_checkany(L, 1); + if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */ + lua_settop(L, 1); /* yes; return it */ + return 1; + } + else { + size_t l; + const char *s = lua_tolstring(L, 1, &l); + if (s != NULL && lua_stringtonumber(L, s) == l + 1) + return 1; /* successful conversion to number */ + /* else not a number */ + } + } + else { + size_t l; + const char *s; + lua_Integer n = 0; /* to avoid warnings */ + lua_Integer base = luaL_checkinteger(L, 2); + luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */ + s = lua_tolstring(L, 1, &l); + luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); + if (b_str2int(s, (int)base, &n) == s + l) { + lua_pushinteger(L, n); + return 1; + } /* else not a number */ + } /* else not a number */ + lua_pushnil(L); /* not a number */ + return 1; +} + + +static int luaB_error (lua_State *L) { + int level = (int)luaL_optinteger(L, 2, 1); + lua_settop(L, 1); + if (lua_type(L, 1) == LUA_TSTRING && level > 0) { + luaL_where(L, level); /* add extra information */ + 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") != LUA_TNIL) + return luaL_error(L, "cannot change a protected metatable"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + 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_rawlen (lua_State *L) { + int t = lua_type(L, 1); + luaL_argcheck(L, t == LUA_TTABLE || t == LUA_TSTRING, 1, + "table or string expected"); + lua_pushinteger(L, lua_rawlen(L, 1)); + 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_collectgarbage (lua_State *L) { + static const char *const opts[] = {"stop", "restart", "collect", + "count", "step", "setpause", "setstepmul", + "isrunning", NULL}; + static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, + LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, + LUA_GCISRUNNING}; + int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; + int ex = (int)luaL_optinteger(L, 2, 0); + int res = lua_gc(L, o, ex); + switch (o) { + case LUA_GCCOUNT: { + int b = lua_gc(L, LUA_GCCOUNTB, 0); + lua_pushnumber(L, (lua_Number)res + ((lua_Number)b/1024)); + return 1; + } + case LUA_GCSTEP: case LUA_GCISRUNNING: { + lua_pushboolean(L, res); + return 1; + } + default: { + lua_pushinteger(L, res); + return 1; + } + } +} + + +static int luaB_type (lua_State *L) { + int t = lua_type(L, 1); + luaL_argcheck(L, t != LUA_TNONE, 1, "value expected"); + lua_pushstring(L, lua_typename(L, t)); + return 1; +} + + +static int pairsmeta (lua_State *L, const char *method, int iszero, + lua_CFunction iter) { + if (luaL_getmetafield(L, 1, method) == LUA_TNIL) { /* no metamethod? */ + luaL_checktype(L, 1, LUA_TTABLE); /* argument must be a table */ + lua_pushcfunction(L, iter); /* will return generator, */ + lua_pushvalue(L, 1); /* state, */ + if (iszero) lua_pushinteger(L, 0); /* and initial value */ + else lua_pushnil(L); + } + else { + lua_pushvalue(L, 1); /* argument 'self' to metamethod */ + lua_call(L, 1, 3); /* get 3 values from metamethod */ + } + return 3; +} + + +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) { + return pairsmeta(L, "__pairs", 0, luaB_next); +} + + +/* +** Traversal function for 'ipairs' +*/ +static int ipairsaux (lua_State *L) { + lua_Integer i = luaL_checkinteger(L, 2) + 1; + lua_pushinteger(L, i); + return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; +} + + +/* +** 'ipairs' function. Returns 'ipairsaux', given "table", 0. +** (The given "table" may not be a table.) +*/ +static int luaB_ipairs (lua_State *L) { +#if defined(LUA_COMPAT_IPAIRS) + return pairsmeta(L, "__ipairs", 1, ipairsaux); +#else + luaL_checkany(L, 1); + lua_pushcfunction(L, ipairsaux); /* iteration function */ + lua_pushvalue(L, 1); /* state */ + lua_pushinteger(L, 0); /* initial value */ + return 3; +#endif +} + + +static int load_aux (lua_State *L, int status, int envidx) { + if (status == LUA_OK) { + if (envidx != 0) { /* 'env' parameter? */ + lua_pushvalue(L, envidx); /* environment for loaded function */ + if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */ + lua_pop(L, 1); /* remove 'env' if not used by previous call */ + } + return 1; + } + else { /* error (message is on top of the stack) */ + lua_pushnil(L); + lua_insert(L, -2); /* put before error message */ + return 2; /* return nil plus error message */ + } +} + + +static int luaB_loadfile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + const char *mode = luaL_optstring(L, 2, NULL); + int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ + int status = luaL_loadfilex(L, fname, mode); + return load_aux(L, status, env); +} + + +/* +** {====================================================== +** Generic Read function +** ======================================================= +*/ + + +/* +** reserved slot, above all arguments, to hold a copy of the returned +** string to avoid it being collected while parsed. 'load' has four +** optional arguments (chunk, source name, mode, and environment). +*/ +#define RESERVEDSLOT 5 + + +/* +** 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); /* not used */ + 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)) { + lua_pop(L, 1); /* pop result */ + *size = 0; + return NULL; + } + else if (!lua_isstring(L, -1)) + luaL_error(L, "reader function must return a string"); + lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */ + return lua_tolstring(L, RESERVEDSLOT, size); +} + + +static int luaB_load (lua_State *L) { + int status; + size_t l; + const char *s = lua_tolstring(L, 1, &l); + const char *mode = luaL_optstring(L, 3, "bt"); + int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ + if (s != NULL) { /* loading a string? */ + const char *chunkname = luaL_optstring(L, 2, s); + status = luaL_loadbufferx(L, s, l, chunkname, mode); + } + else { /* loading from a reader function */ + const char *chunkname = luaL_optstring(L, 2, "=(load)"); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, RESERVEDSLOT); /* create reserved slot */ + status = lua_load(L, generic_reader, NULL, chunkname, mode); + } + return load_aux(L, status, env); +} + +/* }====================================================== */ + + +static int dofilecont (lua_State *L, int d1, lua_KContext d2) { + (void)d1; (void)d2; /* only to match 'lua_Kfunction' prototype */ + return lua_gettop(L) - 1; +} + + +static int luaB_dofile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + lua_settop(L, 1); + if (luaL_loadfile(L, fname) != LUA_OK) + return lua_error(L); + lua_callk(L, 0, LUA_MULTRET, 0, dofilecont); + return dofilecont(L, 0, 0); +} + + +static int luaB_assert (lua_State *L) { + if (lua_toboolean(L, 1)) /* condition is true? */ + return lua_gettop(L); /* return all arguments */ + else { /* error */ + luaL_checkany(L, 1); /* there must be a condition */ + lua_remove(L, 1); /* remove it */ + lua_pushliteral(L, "assertion failed!"); /* default message */ + lua_settop(L, 1); /* leave only message (default if no other one) */ + return luaB_error(L); /* call 'error' */ + } +} + + +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 { + lua_Integer i = luaL_checkinteger(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 - (int)i; + } +} + + +/* +** Continuation function for 'pcall' and 'xpcall'. Both functions +** already pushed a 'true' before doing the call, so in case of success +** 'finishpcall' only has to return everything in the stack minus +** 'extra' values (where 'extra' is exactly the number of items to be +** ignored). +*/ +static int finishpcall (lua_State *L, int status, lua_KContext extra) { + if (status != LUA_OK && status != LUA_YIELD) { /* error? */ + lua_pushboolean(L, 0); /* first result (false) */ + lua_pushvalue(L, -2); /* error message */ + return 2; /* return false, msg */ + } + else + return lua_gettop(L) - (int)extra; /* return all results */ +} + + +static int luaB_pcall (lua_State *L) { + int status; + luaL_checkany(L, 1); + lua_pushboolean(L, 1); /* first result if no errors */ + lua_insert(L, 1); /* put it in place */ + status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall); + return finishpcall(L, status, 0); +} + + +/* +** Do a protected call with error handling. After 'lua_rotate', the +** stack will have ; so, the function passes +** 2 to 'finishpcall' to skip the 2 first values when returning results. +*/ +static int luaB_xpcall (lua_State *L) { + int status; + int n = lua_gettop(L); + luaL_checktype(L, 2, LUA_TFUNCTION); /* check error function */ + lua_pushboolean(L, 1); /* first result */ + lua_pushvalue(L, 1); /* function */ + lua_rotate(L, 3, 2); /* move them below function's arguments */ + status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall); + return finishpcall(L, status, 2); +} + + +static int luaB_tostring (lua_State *L) { + luaL_checkany(L, 1); + luaL_tolstring(L, 1, NULL); + return 1; +} + + +static const luaL_Reg base_funcs[] = { + {"assert", luaB_assert}, + {"collectgarbage", luaB_collectgarbage}, + {"dofile", luaB_dofile}, + {"error", luaB_error}, + {"getmetatable", luaB_getmetatable}, + {"ipairs", luaB_ipairs}, + {"loadfile", luaB_loadfile}, + {"load", luaB_load}, +#if defined(LUA_COMPAT_LOADSTRING) + {"loadstring", luaB_load}, +#endif + {"next", luaB_next}, + {"pairs", luaB_pairs}, + {"pcall", luaB_pcall}, + {"print", luaB_print}, + {"rawequal", luaB_rawequal}, + {"rawlen", luaB_rawlen}, + {"rawget", luaB_rawget}, + {"rawset", luaB_rawset}, + {"select", luaB_select}, + {"setmetatable", luaB_setmetatable}, + {"tonumber", luaB_tonumber}, + {"tostring", luaB_tostring}, + {"type", luaB_type}, + {"xpcall", luaB_xpcall}, + /* placeholders */ + {"_G", NULL}, + {"_VERSION", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_base (lua_State *L) { + /* open lib into global table */ + lua_pushglobaltable(L); + luaL_setfuncs(L, base_funcs, 0); + /* set global _G */ + lua_pushvalue(L, -1); + lua_setfield(L, -2, "_G"); + /* set global _VERSION */ + lua_pushliteral(L, LUA_VERSION); + lua_setfield(L, -2, "_VERSION"); + return 1; +} + diff --git a/lua-5.3.3/src/lbitlib.c b/lua-5.3.3/src/lbitlib.c new file mode 100644 index 0000000..1cb1d5b --- /dev/null +++ b/lua-5.3.3/src/lbitlib.c @@ -0,0 +1,233 @@ +/* +** $Id: lbitlib.c,v 1.30 2015/11/11 19:08:09 roberto Exp $ +** Standard library for bitwise operations +** See Copyright Notice in lua.h +*/ + +#define lbitlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#if defined(LUA_COMPAT_BITLIB) /* { */ + + +#define pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n)) +#define checkunsigned(L,i) ((lua_Unsigned)luaL_checkinteger(L,i)) + + +/* number of bits to consider in a number */ +#if !defined(LUA_NBITS) +#define LUA_NBITS 32 +#endif + + +/* +** a lua_Unsigned with its first LUA_NBITS bits equal to 1. (Shift must +** be made in two parts to avoid problems when LUA_NBITS is equal to the +** number of bits in a lua_Unsigned.) +*/ +#define ALLONES (~(((~(lua_Unsigned)0) << (LUA_NBITS - 1)) << 1)) + + +/* macro to trim extra bits */ +#define trim(x) ((x) & ALLONES) + + +/* builds a number with 'n' ones (1 <= n <= LUA_NBITS) */ +#define mask(n) (~((ALLONES << 1) << ((n) - 1))) + + + +static lua_Unsigned andaux (lua_State *L) { + int i, n = lua_gettop(L); + lua_Unsigned r = ~(lua_Unsigned)0; + for (i = 1; i <= n; i++) + r &= checkunsigned(L, i); + return trim(r); +} + + +static int b_and (lua_State *L) { + lua_Unsigned r = andaux(L); + pushunsigned(L, r); + return 1; +} + + +static int b_test (lua_State *L) { + lua_Unsigned r = andaux(L); + lua_pushboolean(L, r != 0); + return 1; +} + + +static int b_or (lua_State *L) { + int i, n = lua_gettop(L); + lua_Unsigned r = 0; + for (i = 1; i <= n; i++) + r |= checkunsigned(L, i); + pushunsigned(L, trim(r)); + return 1; +} + + +static int b_xor (lua_State *L) { + int i, n = lua_gettop(L); + lua_Unsigned r = 0; + for (i = 1; i <= n; i++) + r ^= checkunsigned(L, i); + pushunsigned(L, trim(r)); + return 1; +} + + +static int b_not (lua_State *L) { + lua_Unsigned r = ~checkunsigned(L, 1); + pushunsigned(L, trim(r)); + return 1; +} + + +static int b_shift (lua_State *L, lua_Unsigned r, lua_Integer i) { + if (i < 0) { /* shift right? */ + i = -i; + r = trim(r); + if (i >= LUA_NBITS) r = 0; + else r >>= i; + } + else { /* shift left */ + if (i >= LUA_NBITS) r = 0; + else r <<= i; + r = trim(r); + } + pushunsigned(L, r); + return 1; +} + + +static int b_lshift (lua_State *L) { + return b_shift(L, checkunsigned(L, 1), luaL_checkinteger(L, 2)); +} + + +static int b_rshift (lua_State *L) { + return b_shift(L, checkunsigned(L, 1), -luaL_checkinteger(L, 2)); +} + + +static int b_arshift (lua_State *L) { + lua_Unsigned r = checkunsigned(L, 1); + lua_Integer i = luaL_checkinteger(L, 2); + if (i < 0 || !(r & ((lua_Unsigned)1 << (LUA_NBITS - 1)))) + return b_shift(L, r, -i); + else { /* arithmetic shift for 'negative' number */ + if (i >= LUA_NBITS) r = ALLONES; + else + r = trim((r >> i) | ~(trim(~(lua_Unsigned)0) >> i)); /* add signal bit */ + pushunsigned(L, r); + return 1; + } +} + + +static int b_rot (lua_State *L, lua_Integer d) { + lua_Unsigned r = checkunsigned(L, 1); + int i = d & (LUA_NBITS - 1); /* i = d % NBITS */ + r = trim(r); + if (i != 0) /* avoid undefined shift of LUA_NBITS when i == 0 */ + r = (r << i) | (r >> (LUA_NBITS - i)); + pushunsigned(L, trim(r)); + return 1; +} + + +static int b_lrot (lua_State *L) { + return b_rot(L, luaL_checkinteger(L, 2)); +} + + +static int b_rrot (lua_State *L) { + return b_rot(L, -luaL_checkinteger(L, 2)); +} + + +/* +** get field and width arguments for field-manipulation functions, +** checking whether they are valid. +** ('luaL_error' called without 'return' to avoid later warnings about +** 'width' being used uninitialized.) +*/ +static int fieldargs (lua_State *L, int farg, int *width) { + lua_Integer f = luaL_checkinteger(L, farg); + lua_Integer w = luaL_optinteger(L, farg + 1, 1); + luaL_argcheck(L, 0 <= f, farg, "field cannot be negative"); + luaL_argcheck(L, 0 < w, farg + 1, "width must be positive"); + if (f + w > LUA_NBITS) + luaL_error(L, "trying to access non-existent bits"); + *width = (int)w; + return (int)f; +} + + +static int b_extract (lua_State *L) { + int w; + lua_Unsigned r = trim(checkunsigned(L, 1)); + int f = fieldargs(L, 2, &w); + r = (r >> f) & mask(w); + pushunsigned(L, r); + return 1; +} + + +static int b_replace (lua_State *L) { + int w; + lua_Unsigned r = trim(checkunsigned(L, 1)); + lua_Unsigned v = trim(checkunsigned(L, 2)); + int f = fieldargs(L, 3, &w); + lua_Unsigned m = mask(w); + r = (r & ~(m << f)) | ((v & m) << f); + pushunsigned(L, r); + return 1; +} + + +static const luaL_Reg bitlib[] = { + {"arshift", b_arshift}, + {"band", b_and}, + {"bnot", b_not}, + {"bor", b_or}, + {"bxor", b_xor}, + {"btest", b_test}, + {"extract", b_extract}, + {"lrotate", b_lrot}, + {"lshift", b_lshift}, + {"replace", b_replace}, + {"rrotate", b_rrot}, + {"rshift", b_rshift}, + {NULL, NULL} +}; + + + +LUAMOD_API int luaopen_bit32 (lua_State *L) { + luaL_newlib(L, bitlib); + return 1; +} + + +#else /* }{ */ + + +LUAMOD_API int luaopen_bit32 (lua_State *L) { + return luaL_error(L, "library 'bit32' has been deprecated"); +} + +#endif /* } */ diff --git a/lua-5.3.3/src/lcode.c b/lua-5.3.3/src/lcode.c new file mode 100644 index 0000000..2cd0dd2 --- /dev/null +++ b/lua-5.3.3/src/lcode.c @@ -0,0 +1,1199 @@ +/* +** $Id: lcode.c,v 2.109 2016/05/13 19:09:21 roberto Exp $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#define lcode_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#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 "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* Maximum number of registers in a Lua function (must fit in 8 bits) */ +#define MAXREGS 255 + + +#define hasjumps(e) ((e)->t != (e)->f) + + +/* +** If expression is a numeric constant, fills 'v' with its value +** and returns 1. Otherwise, returns 0. +*/ +static int tonumeral(expdesc *e, TValue *v) { + if (hasjumps(e)) + return 0; /* not a numeral */ + switch (e->k) { + case VKINT: + if (v) setivalue(v, e->u.ival); + return 1; + case VKFLT: + if (v) setfltvalue(v, e->u.nval); + return 1; + default: return 0; + } +} + + +/* +** Create a OP_LOADNIL instruction, but try to optimize: if the previous +** instruction is also OP_LOADNIL and ranges are compatible, adjust +** range of previous instruction instead of emitting a new one. (For +** instance, 'local a; local b' will generate a single opcode.) +*/ +void luaK_nil (FuncState *fs, int from, int n) { + Instruction *previous; + int l = from + n - 1; /* last register to set nil */ + if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ + previous = &fs->f->code[fs->pc-1]; + if (GET_OPCODE(*previous) == OP_LOADNIL) { /* previous is LOADNIL? */ + int pfrom = GETARG_A(*previous); /* get previous range */ + int pl = pfrom + GETARG_B(*previous); + if ((pfrom <= from && from <= pl + 1) || + (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */ + if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */ + if (pl > l) l = pl; /* l = max(l, pl) */ + SETARG_A(*previous, from); + SETARG_B(*previous, l - from); + return; + } + } /* else go through */ + } + luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0); /* else no optimization */ +} + + +/* +** Gets the destination address of a jump instruction. Used to traverse +** a list of jumps. +*/ +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 */ +} + + +/* +** Fix jump instruction at position 'pc' to jump to 'dest'. +** (Jump addresses are relative in Lua) +*/ +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); +} + + +/* +** Concatenate jump-list 'l2' into jump-list 'l1' +*/ +void luaK_concat (FuncState *fs, int *l1, int l2) { + if (l2 == NO_JUMP) return; /* nothing to concatenate? */ + else if (*l1 == NO_JUMP) /* no original list? */ + *l1 = l2; /* 'l1' points to 'l2' */ + else { + int list = *l1; + int next; + while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ + list = next; + fixjump(fs, list, l2); /* last element links to 'l2' */ + } +} + + +/* +** Create a jump instruction and return its position, so its destination +** can be fixed later (with 'fixjump'). If there are jumps to +** this position (kept in 'jpc'), link them all together so that +** 'patchlistaux' will fix all them directly to the final destination. +*/ +int luaK_jump (FuncState *fs) { + int jpc = fs->jpc; /* save list of jumps to here */ + int j; + fs->jpc = NO_JUMP; /* no more jumps to here */ + j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP); + luaK_concat(fs, &j, jpc); /* keep them on hold */ + return j; +} + + +/* +** Code a 'return' instruction +*/ +void luaK_ret (FuncState *fs, int first, int nret) { + luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); +} + + +/* +** Code a "conditional jump", that is, a test or comparison opcode +** followed by a jump. Return jump position. +*/ +static int condjump (FuncState *fs, OpCode op, int A, int B, int C) { + luaK_codeABC(fs, op, A, B, C); + return luaK_jump(fs); +} + + +/* +** 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; +} + + +/* +** Returns the position of the instruction "controlling" a given +** jump (that is, its condition), or the jump itself if it is +** unconditional. +*/ +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; +} + + +/* +** Patch destination register for a TESTSET instruction. +** If instruction in position 'node' is not a TESTSET, return 0 ("fails"). +** Otherwise, if 'reg' is not 'NO_REG', set it as the destination +** register. Otherwise, change instruction to a simple 'TEST' (produces +** no register value) +*/ +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; + change instruction to simple test */ + *i = CREATE_ABC(OP_TEST, GETARG_B(*i), 0, GETARG_C(*i)); + } + return 1; +} + + +/* +** Traverse a list of tests ensuring no one produces a value +*/ +static void removevalues (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) + patchtestreg(fs, list, NO_REG); +} + + +/* +** Traverse a list of tests, patching their destination address and +** registers: tests producing values jump to 'vtarget' (and put their +** values in 'reg'), other tests jump to 'dtarget'. +*/ +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; + } +} + + +/* +** Ensure all pending jumps to current position are fixed (jumping +** to current position with no values) and reset list of pending +** jumps +*/ +static void dischargejpc (FuncState *fs) { + patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc); + fs->jpc = NO_JUMP; +} + + +/* +** Add elements in 'list' to list of pending jumps to "here" +** (current position) +*/ +void luaK_patchtohere (FuncState *fs, int list) { + luaK_getlabel(fs); /* mark "here" as a jump target */ + luaK_concat(fs, &fs->jpc, list); +} + + +/* +** Path all jumps in 'list' to jump to 'target'. +** (The assert means that we cannot fix a jump to a forward address +** because we only know addresses once code is generated.) +*/ +void luaK_patchlist (FuncState *fs, int list, int target) { + if (target == fs->pc) /* 'target' is current position? */ + luaK_patchtohere(fs, list); /* add list to pending jumps */ + else { + lua_assert(target < fs->pc); + patchlistaux(fs, list, target, NO_REG, target); + } +} + + +/* +** Path all jumps in 'list' to close upvalues up to given 'level' +** (The assertion checks that jumps either were closing nothing +** or were closing higher levels, from inner blocks.) +*/ +void luaK_patchclose (FuncState *fs, int list, int level) { + level++; /* argument is +1 to reserve 0 as non-op */ + for (; list != NO_JUMP; list = getjump(fs, list)) { + lua_assert(GET_OPCODE(fs->f->code[list]) == OP_JMP && + (GETARG_A(fs->f->code[list]) == 0 || + GETARG_A(fs->f->code[list]) >= level)); + SETARG_A(fs->f->code[list], level); + } +} + + +/* +** Emit instruction 'i', checking for array sizes and saving also its +** line information. Return 'i' position. +*/ +static int luaK_code (FuncState *fs, Instruction i) { + Proto *f = fs->f; + dischargejpc(fs); /* 'pc' will change */ + /* put new instruction in code array */ + luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction, + MAX_INT, "opcodes"); + f->code[fs->pc] = i; + /* save corresponding line information */ + luaM_growvector(fs->ls->L, f->lineinfo, fs->pc, f->sizelineinfo, int, + MAX_INT, "opcodes"); + f->lineinfo[fs->pc] = fs->ls->lastline; + return fs->pc++; +} + + +/* +** Format and emit an 'iABC' instruction. (Assertions check consistency +** of parameters versus opcode.) +*/ +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); + lua_assert(a <= MAXARG_A && b <= MAXARG_B && c <= MAXARG_C); + return luaK_code(fs, CREATE_ABC(o, a, b, c)); +} + + +/* +** Format and emit an 'iABx' instruction. +*/ +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); + lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, bc)); +} + + +/* +** Emit an "extra argument" instruction (format 'iAx') +*/ +static int codeextraarg (FuncState *fs, int a) { + lua_assert(a <= MAXARG_Ax); + return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a)); +} + + +/* +** Emit a "load constant" instruction, using either 'OP_LOADK' +** (if constant index 'k' fits in 18 bits) or an 'OP_LOADKX' +** instruction with "extra argument". +*/ +int luaK_codek (FuncState *fs, int reg, int k) { + if (k <= MAXARG_Bx) + return luaK_codeABx(fs, OP_LOADK, reg, k); + else { + int p = luaK_codeABx(fs, OP_LOADKX, reg, 0); + codeextraarg(fs, k); + return p; + } +} + + +/* +** Check register-stack level, keeping track of its maximum size +** in field 'maxstacksize' +*/ +void luaK_checkstack (FuncState *fs, int n) { + int newstack = fs->freereg + n; + if (newstack > fs->f->maxstacksize) { + if (newstack >= MAXREGS) + luaX_syntaxerror(fs->ls, + "function or expression needs too many registers"); + fs->f->maxstacksize = cast_byte(newstack); + } +} + + +/* +** Reserve 'n' registers in register stack +*/ +void luaK_reserveregs (FuncState *fs, int n) { + luaK_checkstack(fs, n); + fs->freereg += n; +} + + +/* +** Free register 'reg', if it is neither a constant index nor +** a local variable. +) +*/ +static void freereg (FuncState *fs, int reg) { + if (!ISK(reg) && reg >= fs->nactvar) { + fs->freereg--; + lua_assert(reg == fs->freereg); + } +} + + +/* +** Free register used by expression 'e' (if any) +*/ +static void freeexp (FuncState *fs, expdesc *e) { + if (e->k == VNONRELOC) + freereg(fs, e->u.info); +} + + +/* +** Free registers used by expressions 'e1' and 'e2' (if any) in proper +** order. +*/ +static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) { + int r1 = (e1->k == VNONRELOC) ? e1->u.info : -1; + int r2 = (e2->k == VNONRELOC) ? e2->u.info : -1; + if (r1 > r2) { + freereg(fs, r1); + freereg(fs, r2); + } + else { + freereg(fs, r2); + freereg(fs, r1); + } +} + + +/* +** Add constant 'v' to prototype's list of constants (field 'k'). +** Use scanner's table to cache position of constants in constant list +** and try to reuse constants. Because some values should not be used +** as keys (nil cannot be a key, integer keys can collapse with float +** keys), the caller must provide a useful 'key' for indexing the cache. +*/ +static int addk (FuncState *fs, TValue *key, TValue *v) { + lua_State *L = fs->ls->L; + Proto *f = fs->f; + TValue *idx = luaH_set(L, fs->ls->h, key); /* index scanner table */ + int k, oldsize; + if (ttisinteger(idx)) { /* is there an index there? */ + k = cast_int(ivalue(idx)); + /* correct value? (warning: must distinguish floats from integers!) */ + if (k < fs->nk && ttype(&f->k[k]) == ttype(v) && + luaV_rawequalobj(&f->k[k], v)) + return k; /* reuse index */ + } + /* constant not found; create a new entry */ + oldsize = f->sizek; + k = fs->nk; + /* numerical value does not need GC barrier; + table has no metatable, so it does not need to invalidate cache */ + setivalue(idx, k); + luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); + while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); + setobj(L, &f->k[k], v); + fs->nk++; + luaC_barrier(L, f, v); + return k; +} + + +/* +** Add a string to list of constants and return its index. +*/ +int luaK_stringK (FuncState *fs, TString *s) { + TValue o; + setsvalue(fs->ls->L, &o, s); + return addk(fs, &o, &o); /* use string itself as key */ +} + + +/* +** Add an integer to list of constants and return its index. +** Integers use userdata as keys to avoid collision with floats with +** same value; conversion to 'void*' is used only for hashing, so there +** are no "precision" problems. +*/ +int luaK_intK (FuncState *fs, lua_Integer n) { + TValue k, o; + setpvalue(&k, cast(void*, cast(size_t, n))); + setivalue(&o, n); + return addk(fs, &k, &o); +} + +/* +** Add a float to list of constants and return its index. +*/ +static int luaK_numberK (FuncState *fs, lua_Number r) { + TValue o; + setfltvalue(&o, r); + return addk(fs, &o, &o); /* use number itself as key */ +} + + +/* +** Add a boolean to list of constants and return its index. +*/ +static int boolK (FuncState *fs, int b) { + TValue o; + setbvalue(&o, b); + return addk(fs, &o, &o); /* use boolean itself as key */ +} + + +/* +** Add nil to list of constants and return its index. +*/ +static int nilK (FuncState *fs) { + TValue k, v; + setnilvalue(&v); + /* cannot use nil as key; instead use table itself to represent nil */ + sethvalue(fs->ls->L, &k, fs->ls->h); + return addk(fs, &k, &v); +} + + +/* +** Fix an expression to return the number of results 'nresults'. +** Either 'e' is a multi-ret expression (function call or vararg) +** or 'nresults' is LUA_MULTRET (as any expression can satisfy that). +*/ +void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { + if (e->k == VCALL) { /* expression is an open function call? */ + SETARG_C(getinstruction(fs, e), nresults + 1); + } + else if (e->k == VVARARG) { + Instruction *pc = &getinstruction(fs, e); + SETARG_B(*pc, nresults + 1); + SETARG_A(*pc, fs->freereg); + luaK_reserveregs(fs, 1); + } + else lua_assert(nresults == LUA_MULTRET); +} + + +/* +** Fix an expression to return one result. +** If expression is not a multi-ret expression (function call or +** vararg), it already returns one result, so nothing needs to be done. +** Function calls become VNONRELOC expressions (as its result comes +** fixed in the base register of the call), while vararg expressions +** become VRELOCABLE (as OP_VARARG puts its results where it wants). +** (Calls are created returning one result, so that does not need +** to be fixed.) +*/ +void luaK_setoneret (FuncState *fs, expdesc *e) { + if (e->k == VCALL) { /* expression is an open function call? */ + /* already returns 1 value */ + lua_assert(GETARG_C(getinstruction(fs, e)) == 2); + e->k = VNONRELOC; /* result has fixed position */ + e->u.info = GETARG_A(getinstruction(fs, e)); + } + else if (e->k == VVARARG) { + SETARG_B(getinstruction(fs, e), 2); + e->k = VRELOCABLE; /* can relocate its simple result */ + } +} + + +/* +** Ensure that expression 'e' is not a variable. +*/ +void luaK_dischargevars (FuncState *fs, expdesc *e) { + switch (e->k) { + case VLOCAL: { /* already in a register */ + e->k = VNONRELOC; /* becomes a non-relocatable value */ + break; + } + case VUPVAL: { /* move value to some (pending) register */ + e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); + e->k = VRELOCABLE; + break; + } + case VINDEXED: { + OpCode op; + freereg(fs, e->u.ind.idx); + if (e->u.ind.vt == VLOCAL) { /* is 't' in a register? */ + freereg(fs, e->u.ind.t); + op = OP_GETTABLE; + } + else { + lua_assert(e->u.ind.vt == VUPVAL); + op = OP_GETTABUP; /* 't' is in an upvalue */ + } + e->u.info = luaK_codeABC(fs, op, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOCABLE; + break; + } + case VVARARG: case VCALL: { + luaK_setoneret(fs, e); + break; + } + default: break; /* there is one value available (somewhere) */ + } +} + + +/* +** Ensures expression value is in register 'reg' (and therefore +** 'e' will become a non-relocatable expression). +*/ +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_codek(fs, reg, e->u.info); + break; + } + case VKFLT: { + luaK_codek(fs, reg, luaK_numberK(fs, e->u.nval)); + break; + } + case VKINT: { + luaK_codek(fs, reg, luaK_intK(fs, e->u.ival)); + break; + } + case VRELOCABLE: { + Instruction *pc = &getinstruction(fs, e); + SETARG_A(*pc, reg); /* instruction will put result in 'reg' */ + break; + } + case VNONRELOC: { + if (reg != e->u.info) + luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0); + break; + } + default: { + lua_assert(e->k == VJMP); + return; /* nothing to do... */ + } + } + e->u.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensures expression value is in any register. +*/ +static void discharge2anyreg (FuncState *fs, expdesc *e) { + if (e->k != VNONRELOC) { /* no fixed register yet? */ + luaK_reserveregs(fs, 1); /* get a register */ + discharge2reg(fs, e, fs->freereg-1); /* put value there */ + } +} + + +static int code_loadbool (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); +} + + +/* +** 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 */ +} + + +/* +** Ensures final expression result (including results from its jump +** lists) is in register 'reg'. +** If expression has jumps, need to patch these jumps either to +** its final position or to "load" instructions (for those tests +** that do not produce values). +*/ +static void exp2reg (FuncState *fs, expdesc *e, int reg) { + discharge2reg(fs, e, reg); + if (e->k == VJMP) /* expression itself is a test? */ + luaK_concat(fs, &e->t, e->u.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_loadbool(fs, reg, 0, 1); + p_t = code_loadbool(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.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensures final expression result (including results from its jump +** lists) is in next available register. +*/ +void luaK_exp2nextreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + freeexp(fs, e); + luaK_reserveregs(fs, 1); + exp2reg(fs, e, fs->freereg - 1); +} + + +/* +** Ensures final expression result (including results from its jump +** lists) is in some (any) register and return that register. +*/ +int luaK_exp2anyreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + if (e->k == VNONRELOC) { /* expression already has a register? */ + if (!hasjumps(e)) /* no jumps? */ + return e->u.info; /* result is already in a register */ + if (e->u.info >= fs->nactvar) { /* reg. is not a local? */ + exp2reg(fs, e, e->u.info); /* put final result in it */ + return e->u.info; + } + } + luaK_exp2nextreg(fs, e); /* otherwise, use next available register */ + return e->u.info; +} + + +/* +** Ensures final expression result is either in a register or in an +** upvalue. +*/ +void luaK_exp2anyregup (FuncState *fs, expdesc *e) { + if (e->k != VUPVAL || hasjumps(e)) + luaK_exp2anyreg(fs, e); +} + + +/* +** Ensures final expression result is either in a register or it is +** a constant. +*/ +void luaK_exp2val (FuncState *fs, expdesc *e) { + if (hasjumps(e)) + luaK_exp2anyreg(fs, e); + else + luaK_dischargevars(fs, e); +} + + +/* +** Ensures final expression result is in a valid R/K index +** (that is, it is either in a register or in 'k' with an index +** in the range of R/K indices). +** Returns R/K index. +*/ +int luaK_exp2RK (FuncState *fs, expdesc *e) { + luaK_exp2val(fs, e); + switch (e->k) { /* move constants to 'k' */ + case VTRUE: e->u.info = boolK(fs, 1); goto vk; + case VFALSE: e->u.info = boolK(fs, 0); goto vk; + case VNIL: e->u.info = nilK(fs); goto vk; + case VKINT: e->u.info = luaK_intK(fs, e->u.ival); goto vk; + case VKFLT: e->u.info = luaK_numberK(fs, e->u.nval); goto vk; + case VK: + vk: + e->k = VK; + if (e->u.info <= MAXINDEXRK) /* constant fits in 'argC'? */ + return RKASK(e->u.info); + else break; + default: break; + } + /* not a constant in the right range: put it in a register */ + return luaK_exp2anyreg(fs, e); +} + + +/* +** Generate code to store result of expression 'ex' into variable 'var'. +*/ +void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { + switch (var->k) { + case VLOCAL: { + freeexp(fs, ex); + exp2reg(fs, ex, var->u.info); /* compute 'ex' into proper place */ + return; + } + case VUPVAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0); + break; + } + case VINDEXED: { + OpCode op = (var->u.ind.vt == VLOCAL) ? OP_SETTABLE : OP_SETTABUP; + int e = luaK_exp2RK(fs, ex); + luaK_codeABC(fs, op, var->u.ind.t, var->u.ind.idx, e); + break; + } + default: lua_assert(0); /* invalid var kind to store */ + } + freeexp(fs, ex); +} + + +/* +** Emit SELF instruction (convert expression 'e' into 'e:key(e,'). +*/ +void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { + int ereg; + luaK_exp2anyreg(fs, e); + ereg = e->u.info; /* register where 'e' was placed */ + freeexp(fs, e); + e->u.info = fs->freereg; /* base register for op_self */ + e->k = VNONRELOC; /* self expression has a fixed register */ + luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */ + luaK_codeABC(fs, OP_SELF, e->u.info, ereg, luaK_exp2RK(fs, key)); + freeexp(fs, key); +} + + +/* +** Negate condition 'e' (where 'e' is a comparison). +*/ +static void negatecondition (FuncState *fs, expdesc *e) { + Instruction *pc = getjumpcontrol(fs, e->u.info); + lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && + GET_OPCODE(*pc) != OP_TEST); + SETARG_A(*pc, !(GETARG_A(*pc))); +} + + +/* +** Emit instruction to jump if 'e' is 'cond' (that is, if 'cond' +** is true, code will jump if 'e' is true.) Return jump position. +** Optimize when 'e' is 'not' something, inverting the condition +** and removing the 'not'. +*/ +static int jumponcond (FuncState *fs, expdesc *e, int cond) { + if (e->k == VRELOCABLE) { + Instruction ie = getinstruction(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.info, cond); +} + + +/* +** Emit code to go through if 'e' is true, jump otherwise. +*/ +void luaK_goiftrue (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { /* condition? */ + negatecondition(fs, e); /* jump when it is false */ + pc = e->u.info; /* save jump position */ + break; + } + case VK: case VKFLT: case VKINT: case VTRUE: { + pc = NO_JUMP; /* always true; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 0); /* jump when false */ + break; + } + } + luaK_concat(fs, &e->f, pc); /* insert new jump in false list */ + luaK_patchtohere(fs, e->t); /* true list jumps to here (to go through) */ + e->t = NO_JUMP; +} + + +/* +** Emit code to go through if 'e' is false, jump otherwise. +*/ +void luaK_goiffalse (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { + pc = e->u.info; /* already jump if true */ + break; + } + case VNIL: case VFALSE: { + pc = NO_JUMP; /* always false; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 1); /* jump if true */ + break; + } + } + luaK_concat(fs, &e->t, pc); /* insert new jump in 't' list */ + luaK_patchtohere(fs, e->f); /* false list jumps to here (to go through) */ + e->f = NO_JUMP; +} + + +/* +** Code 'not e', doing constant folding. +*/ +static void codenot (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: case VFALSE: { + e->k = VTRUE; /* true == not nil == not false */ + break; + } + case VK: case VKFLT: case VKINT: case VTRUE: { + e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */ + break; + } + case VJMP: { + negatecondition(fs, e); + break; + } + case VRELOCABLE: + case VNONRELOC: { + discharge2anyreg(fs, e); + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0); + e->k = VRELOCABLE; + break; + } + default: lua_assert(0); /* cannot happen */ + } + /* interchange true and false lists */ + { int temp = e->f; e->f = e->t; e->t = temp; } + removevalues(fs, e->f); /* values are useless when negated */ + removevalues(fs, e->t); +} + + +/* +** Create expression 't[k]'. 't' must have its final result already in a +** register or upvalue. +*/ +void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + lua_assert(!hasjumps(t) && (vkisinreg(t->k) || t->k == VUPVAL)); + t->u.ind.t = t->u.info; /* register or upvalue index */ + t->u.ind.idx = luaK_exp2RK(fs, k); /* R/K index for key */ + t->u.ind.vt = (t->k == VUPVAL) ? VUPVAL : VLOCAL; + t->k = VINDEXED; +} + + +/* +** Return false if folding can raise an error. +** Bitwise operations need operands convertible to integers; division +** operations cannot have 0 as divisor. +*/ +static int validop (int op, TValue *v1, TValue *v2) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: { /* conversion errors */ + lua_Integer i; + return (tointeger(v1, &i) && tointeger(v2, &i)); + } + case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD: /* division by 0 */ + return (nvalue(v2) != 0); + default: return 1; /* everything else is valid */ + } +} + + +/* +** Try to "constant-fold" an operation; return 1 iff successful. +** (In this case, 'e1' has the final result.) +*/ +static int constfolding (FuncState *fs, int op, expdesc *e1, expdesc *e2) { + TValue v1, v2, res; + if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2)) + return 0; /* non-numeric operands or not safe to fold */ + luaO_arith(fs->ls->L, op, &v1, &v2, &res); /* does operation */ + if (ttisinteger(&res)) { + e1->k = VKINT; + e1->u.ival = ivalue(&res); + } + else { /* folds neither NaN nor 0.0 (to avoid problems with -0.0) */ + lua_Number n = fltvalue(&res); + if (luai_numisnan(n) || n == 0) + return 0; + e1->k = VKFLT; + e1->u.nval = n; + } + return 1; +} + + +/* +** Emit code for unary expressions that "produce values" +** (everything but 'not'). +** Expression to produce final result will be encoded in 'e'. +*/ +static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) { + int r = luaK_exp2anyreg(fs, e); /* opcodes operate only on registers */ + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, op, 0, r, 0); /* generate opcode */ + e->k = VRELOCABLE; /* all those operations are relocatable */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for binary expressions that "produce values" +** (everything but logical operators 'and'/'or' and comparison +** operators). +** Expression to produce final result will be encoded in 'e1'. +*/ +static void codebinexpval (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int line) { + int rk1 = luaK_exp2RK(fs, e1); /* both operands are "RK" */ + int rk2 = luaK_exp2RK(fs, e2); + freeexps(fs, e1, e2); + e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */ + e1->k = VRELOCABLE; /* all those operations are relocatable */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for comparisons. +** 'e1' was already put in R/K form by 'luaK_infix'. +*/ +static void codecomp (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { + int rk1 = (e1->k == VK) ? RKASK(e1->u.info) + : check_exp(e1->k == VNONRELOC, e1->u.info); + int rk2 = luaK_exp2RK(fs, e2); + freeexps(fs, e1, e2); + switch (opr) { + case OPR_NE: { /* '(a ~= b)' ==> 'not (a == b)' */ + e1->u.info = condjump(fs, OP_EQ, 0, rk1, rk2); + break; + } + case OPR_GT: case OPR_GE: { + /* '(a > b)' ==> '(b < a)'; '(a >= b)' ==> '(b <= a)' */ + OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ); + e1->u.info = condjump(fs, op, 1, rk2, rk1); /* invert operands */ + break; + } + default: { /* '==', '<', '<=' use their own opcodes */ + OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ); + e1->u.info = condjump(fs, op, 1, rk1, rk2); + break; + } + } + e1->k = VJMP; +} + + +/* +** Aplly prefix operation 'op' to expression 'e'. +*/ +void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) { + static expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP}; /* fake 2nd operand */ + switch (op) { + case OPR_MINUS: case OPR_BNOT: + if (constfolding(fs, op + LUA_OPUNM, e, &ef)) + break; + /* FALLTHROUGH */ + case OPR_LEN: + codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line); + break; + case OPR_NOT: codenot(fs, e); break; + default: lua_assert(0); + } +} + + +/* +** Process 1st operand 'v' of binary operation 'op' before reading +** 2nd operand. +*/ +void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { + switch (op) { + case OPR_AND: { + luaK_goiftrue(fs, v); /* go ahead only if 'v' is true */ + break; + } + case OPR_OR: { + luaK_goiffalse(fs, v); /* go ahead only if 'v' is false */ + 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_IDIV: + case OPR_MOD: case OPR_POW: + case OPR_BAND: case OPR_BOR: case OPR_BXOR: + case OPR_SHL: case OPR_SHR: { + if (!tonumeral(v, NULL)) + luaK_exp2RK(fs, v); + /* else keep numeral, which may be folded with 2nd operand */ + break; + } + default: { + luaK_exp2RK(fs, v); + break; + } + } +} + + +/* +** Finalize code for binary operation, after reading 2nd operand. +** For '(a .. b .. c)' (which is '(a .. (b .. c))', because +** concatenation is right associative), merge second CONCAT into first +** one. +*/ +void luaK_posfix (FuncState *fs, BinOpr op, + expdesc *e1, expdesc *e2, int line) { + switch (op) { + case OPR_AND: { + lua_assert(e1->t == NO_JUMP); /* list closed by 'luK_infix' */ + luaK_dischargevars(fs, e2); + luaK_concat(fs, &e2->f, e1->f); + *e1 = *e2; + break; + } + case OPR_OR: { + lua_assert(e1->f == NO_JUMP); /* list closed by 'luK_infix' */ + 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(getinstruction(fs, e2)) == OP_CONCAT) { + lua_assert(e1->u.info == GETARG_B(getinstruction(fs, e2))-1); + freeexp(fs, e1); + SETARG_B(getinstruction(fs, e2), e1->u.info); + e1->k = VRELOCABLE; e1->u.info = e2->u.info; + } + else { + luaK_exp2nextreg(fs, e2); /* operand must be on the 'stack' */ + codebinexpval(fs, OP_CONCAT, e1, e2, line); + } + break; + } + case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV: + case OPR_IDIV: case OPR_MOD: case OPR_POW: + case OPR_BAND: case OPR_BOR: case OPR_BXOR: + case OPR_SHL: case OPR_SHR: { + if (!constfolding(fs, op + LUA_OPADD, e1, e2)) + codebinexpval(fs, cast(OpCode, op + OP_ADD), e1, e2, line); + break; + } + case OPR_EQ: case OPR_LT: case OPR_LE: + case OPR_NE: case OPR_GT: case OPR_GE: { + codecomp(fs, op, e1, e2); + break; + } + default: lua_assert(0); + } +} + + +/* +** Change line information associated with current position. +*/ +void luaK_fixline (FuncState *fs, int line) { + fs->f->lineinfo[fs->pc - 1] = line; +} + + +/* +** Emit a SETLIST instruction. +** 'base' is register that keeps table; +** 'nelems' is #table plus those to be stored now; +** 'tostore' is number of values (in registers 'base + 1',...) to add to +** table (or LUA_MULTRET to add up to stack top). +*/ +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 && tostore <= LFIELDS_PER_FLUSH); + if (c <= MAXARG_C) + luaK_codeABC(fs, OP_SETLIST, base, b, c); + else if (c <= MAXARG_Ax) { + luaK_codeABC(fs, OP_SETLIST, base, b, 0); + codeextraarg(fs, c); + } + else + luaX_syntaxerror(fs->ls, "constructor too long"); + fs->freereg = base + 1; /* free registers with list values */ +} + diff --git a/lua-5.3.3/src/lcode.h b/lua-5.3.3/src/lcode.h new file mode 100644 index 0000000..cd306d5 --- /dev/null +++ b/lua-5.3.3/src/lcode.h @@ -0,0 +1,88 @@ +/* +** $Id: lcode.h,v 1.64 2016/01/05 16:22:37 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 (ORDER OP) +*/ +typedef enum BinOpr { + OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW, + OPR_DIV, + OPR_IDIV, + OPR_BAND, OPR_BOR, OPR_BXOR, + OPR_SHL, OPR_SHR, + OPR_CONCAT, + OPR_EQ, OPR_LT, OPR_LE, + OPR_NE, OPR_GT, OPR_GE, + OPR_AND, OPR_OR, + OPR_NOBINOPR +} BinOpr; + + +typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; + + +/* get (pointer to) instruction of given 'expdesc' */ +#define getinstruction(fs,e) ((fs)->f->code[(e)->u.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) + +#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) + +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 int luaK_codek (FuncState *fs, int reg, int k); +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_intK (FuncState *fs, lua_Integer n); +LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e); +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_goiffalse (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); +LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); +LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); +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_patchclose (FuncState *fs, int list, int level); +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, int line); +LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); +LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, + expdesc *v2, int line); +LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); + + +#endif diff --git a/lua-5.3.3/src/lcorolib.c b/lua-5.3.3/src/lcorolib.c new file mode 100644 index 0000000..2303429 --- /dev/null +++ b/lua-5.3.3/src/lcorolib.c @@ -0,0 +1,168 @@ +/* +** $Id: lcorolib.c,v 1.10 2016/04/11 19:19:55 roberto Exp $ +** Coroutine Library +** See Copyright Notice in lua.h +*/ + +#define lcorolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static lua_State *getco (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + luaL_argcheck(L, co, 1, "thread expected"); + return co; +} + + +static int auxresume (lua_State *L, lua_State *co, int narg) { + int status; + if (!lua_checkstack(co, narg)) { + lua_pushliteral(L, "too many arguments to resume"); + return -1; /* error flag */ + } + if (lua_status(co) == LUA_OK && lua_gettop(co) == 0) { + lua_pushliteral(L, "cannot resume dead coroutine"); + return -1; /* error flag */ + } + lua_xmove(L, co, narg); + status = lua_resume(co, L, narg); + if (status == LUA_OK || status == LUA_YIELD) { + int nres = lua_gettop(co); + if (!lua_checkstack(L, nres + 1)) { + lua_pop(co, nres); /* remove results anyway */ + lua_pushliteral(L, "too many results to resume"); + return -1; /* error flag */ + } + 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 = getco(L); + int r; + 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_type(L, -1) == LUA_TSTRING) { /* error object is a string? */ + luaL_where(L, 1); /* add extra info */ + lua_insert(L, -2); + lua_concat(L, 2); + } + return lua_error(L); /* propagate error */ + } + return r; +} + + +static int luaB_cocreate (lua_State *L) { + lua_State *NL; + luaL_checktype(L, 1, LUA_TFUNCTION); + NL = lua_newthread(L); + 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_costatus (lua_State *L) { + lua_State *co = getco(L); + if (L == co) lua_pushliteral(L, "running"); + else { + switch (lua_status(co)) { + case LUA_YIELD: + lua_pushliteral(L, "suspended"); + break; + case LUA_OK: { + lua_Debug ar; + if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */ + lua_pushliteral(L, "normal"); /* it is running */ + else if (lua_gettop(co) == 0) + lua_pushliteral(L, "dead"); + else + lua_pushliteral(L, "suspended"); /* initial state */ + break; + } + default: /* some error occurred */ + lua_pushliteral(L, "dead"); + break; + } + } + return 1; +} + + +static int luaB_yieldable (lua_State *L) { + lua_pushboolean(L, lua_isyieldable(L)); + return 1; +} + + +static int luaB_corunning (lua_State *L) { + int ismain = lua_pushthread(L); + lua_pushboolean(L, ismain); + return 2; +} + + +static const luaL_Reg co_funcs[] = { + {"create", luaB_cocreate}, + {"resume", luaB_coresume}, + {"running", luaB_corunning}, + {"status", luaB_costatus}, + {"wrap", luaB_cowrap}, + {"yield", luaB_yield}, + {"isyieldable", luaB_yieldable}, + {NULL, NULL} +}; + + + +LUAMOD_API int luaopen_coroutine (lua_State *L) { + luaL_newlib(L, co_funcs); + return 1; +} + diff --git a/lua-5.3.3/src/lctype.c b/lua-5.3.3/src/lctype.c new file mode 100644 index 0000000..ae9367e --- /dev/null +++ b/lua-5.3.3/src/lctype.c @@ -0,0 +1,55 @@ +/* +** $Id: lctype.c,v 1.12 2014/11/02 19:19:04 roberto Exp $ +** 'ctype' functions for Lua +** See Copyright Notice in lua.h +*/ + +#define lctype_c +#define LUA_CORE + +#include "lprefix.h" + + +#include "lctype.h" + +#if !LUA_USE_CTYPE /* { */ + +#include + +LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = { + 0x00, /* EOZ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0. */ + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, /* 2. */ + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, /* 3. */ + 0x16, 0x16, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 4. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 5. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 6. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 7. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 8. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 9. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* a. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* b. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* c. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* d. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* e. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* f. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; + +#endif /* } */ diff --git a/lua-5.3.3/src/lctype.h b/lua-5.3.3/src/lctype.h new file mode 100644 index 0000000..99c7d12 --- /dev/null +++ b/lua-5.3.3/src/lctype.h @@ -0,0 +1,95 @@ +/* +** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $ +** 'ctype' functions for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lctype_h +#define lctype_h + +#include "lua.h" + + +/* +** WARNING: the functions defined here do not necessarily correspond +** to the similar functions in the standard C ctype.h. They are +** optimized for the specific needs of Lua +*/ + +#if !defined(LUA_USE_CTYPE) + +#if 'A' == 65 && '0' == 48 +/* ASCII case: can use its own tables; faster and fixed */ +#define LUA_USE_CTYPE 0 +#else +/* must use standard C ctype */ +#define LUA_USE_CTYPE 1 +#endif + +#endif + + +#if !LUA_USE_CTYPE /* { */ + +#include + +#include "llimits.h" + + +#define ALPHABIT 0 +#define DIGITBIT 1 +#define PRINTBIT 2 +#define SPACEBIT 3 +#define XDIGITBIT 4 + + +#define MASK(B) (1 << (B)) + + +/* +** add 1 to char to allow index -1 (EOZ) +*/ +#define testprop(c,p) (luai_ctype_[(c)+1] & (p)) + +/* +** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_' +*/ +#define lislalpha(c) testprop(c, MASK(ALPHABIT)) +#define lislalnum(c) testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT))) +#define lisdigit(c) testprop(c, MASK(DIGITBIT)) +#define lisspace(c) testprop(c, MASK(SPACEBIT)) +#define lisprint(c) testprop(c, MASK(PRINTBIT)) +#define lisxdigit(c) testprop(c, MASK(XDIGITBIT)) + +/* +** this 'ltolower' only works for alphabetic characters +*/ +#define ltolower(c) ((c) | ('A' ^ 'a')) + + +/* two more entries for 0 and -1 (EOZ) */ +LUAI_DDEC const lu_byte luai_ctype_[UCHAR_MAX + 2]; + + +#else /* }{ */ + +/* +** use standard C ctypes +*/ + +#include + + +#define lislalpha(c) (isalpha(c) || (c) == '_') +#define lislalnum(c) (isalnum(c) || (c) == '_') +#define lisdigit(c) (isdigit(c)) +#define lisspace(c) (isspace(c)) +#define lisprint(c) (isprint(c)) +#define lisxdigit(c) (isxdigit(c)) + +#define ltolower(c) (tolower(c)) + +#endif /* } */ + +#endif + diff --git a/lua-5.3.3/src/ldblib.c b/lua-5.3.3/src/ldblib.c new file mode 100644 index 0000000..786f6cd --- /dev/null +++ b/lua-5.3.3/src/ldblib.c @@ -0,0 +1,456 @@ +/* +** $Id: ldblib.c,v 1.151 2015/11/23 11:29:43 roberto Exp $ +** Interface from Lua to its debug API +** See Copyright Notice in lua.h +*/ + +#define ldblib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** The hook table at registry[&HOOKKEY] maps threads to their current +** hook function. (We only need the unique address of 'HOOKKEY'.) +*/ +static const int HOOKKEY = 0; + + +/* +** If L1 != L, L1 can be in any state, and therefore there are no +** guarantees about its stack space; any push in L1 must be +** checked. +*/ +static void checkstack (lua_State *L, lua_State *L1, int n) { + if (L != L1 && !lua_checkstack(L1, n)) + luaL_error(L, "stack overflow"); +} + + +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_setmetatable(L, 1); + return 1; /* return 1st argument */ +} + + +static int db_getuservalue (lua_State *L) { + if (lua_type(L, 1) != LUA_TUSERDATA) + lua_pushnil(L); + else + lua_getuservalue(L, 1); + return 1; +} + + +static int db_setuservalue (lua_State *L) { + luaL_checktype(L, 1, LUA_TUSERDATA); + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_setuservalue(L, 1); + return 1; +} + + +/* +** Auxiliary function used by several library functions: check for +** an optional thread as function's first argument and set 'arg' with +** 1 if this argument is present (so that functions can skip it to +** access their other arguments) +*/ +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; /* function will operate over current thread */ + } +} + + +/* +** Variations of 'lua_settable', used by 'db_getinfo' to put results +** from 'lua_getinfo' into result table. Key is always a string; +** value can be a string, an int, or a boolean. +*/ +static void settabss (lua_State *L, const char *k, const char *v) { + lua_pushstring(L, v); + lua_setfield(L, -2, k); +} + +static void settabsi (lua_State *L, const char *k, int v) { + lua_pushinteger(L, v); + lua_setfield(L, -2, k); +} + +static void settabsb (lua_State *L, const char *k, int v) { + lua_pushboolean(L, v); + lua_setfield(L, -2, k); +} + + +/* +** In function 'db_getinfo', the call to 'lua_getinfo' may push +** results on the stack; later it creates the result table to put +** these objects. Function 'treatstackoption' puts the result from +** 'lua_getinfo' on top of the result table so that it can call +** 'lua_setfield'. +*/ +static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { + if (L == L1) + lua_rotate(L, -2, 1); /* exchange object and table */ + else + lua_xmove(L1, L, 1); /* move object to the "main" stack */ + lua_setfield(L, -2, fname); /* put object into table */ +} + + +/* +** Calls 'lua_getinfo' and collects all results in a new table. +** L1 needs stack space for an optional input (function) plus +** two optional outputs (function and line table) from function +** 'lua_getinfo'. +*/ +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, "flnStu"); + checkstack(L, L1, 3); + if (lua_isfunction(L, arg + 1)) { /* info about a function? */ + options = lua_pushfstring(L, ">%s", options); /* add '>' to 'options' */ + lua_pushvalue(L, arg + 1); /* move function to 'L1' stack */ + lua_xmove(L, L1, 1); + } + else { /* stack level */ + if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) { + lua_pushnil(L); /* level out of range */ + return 1; + } + } + if (!lua_getinfo(L1, options, &ar)) + return luaL_argerror(L, arg+2, "invalid option"); + lua_newtable(L); /* table to collect results */ + 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); + settabsi(L, "nparams", ar.nparams); + settabsb(L, "isvararg", ar.isvararg); + } + if (strchr(options, 'n')) { + settabss(L, "name", ar.name); + settabss(L, "namewhat", ar.namewhat); + } + if (strchr(options, 't')) + settabsb(L, "istailcall", ar.istailcall); + 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; + int nvar = (int)luaL_checkinteger(L, arg + 2); /* local-variable index */ + if (lua_isfunction(L, arg + 1)) { /* function argument? */ + lua_pushvalue(L, arg + 1); /* push function */ + lua_pushstring(L, lua_getlocal(L, NULL, nvar)); /* push local name */ + return 1; /* return only name (there is no value) */ + } + else { /* stack-level argument */ + int level = (int)luaL_checkinteger(L, arg + 1); + if (!lua_getstack(L1, level, &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + checkstack(L, L1, 1); + name = lua_getlocal(L1, &ar, nvar); + if (name) { + lua_xmove(L1, L, 1); /* move local value */ + lua_pushstring(L, name); /* push name */ + lua_rotate(L, -2, 1); /* re-order */ + return 2; + } + else { + lua_pushnil(L); /* no name (nor value) */ + return 1; + } + } +} + + +static int db_setlocal (lua_State *L) { + int arg; + const char *name; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + int level = (int)luaL_checkinteger(L, arg + 1); + int nvar = (int)luaL_checkinteger(L, arg + 2); + if (!lua_getstack(L1, level, &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + luaL_checkany(L, arg+3); + lua_settop(L, arg+3); + checkstack(L, L1, 1); + lua_xmove(L, L1, 1); + name = lua_setlocal(L1, &ar, nvar); + if (name == NULL) + lua_pop(L1, 1); /* pop value (if not popped by 'lua_setlocal') */ + lua_pushstring(L, name); + return 1; +} + + +/* +** get (if 'get' is true) or set an upvalue from a closure +*/ +static int auxupvalue (lua_State *L, int get) { + const char *name; + int n = (int)luaL_checkinteger(L, 2); /* upvalue index */ + luaL_checktype(L, 1, LUA_TFUNCTION); /* closure */ + 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)); /* no-op if get is false */ + 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); +} + + +/* +** Check whether a given upvalue from a given closure exists and +** returns its index +*/ +static int checkupval (lua_State *L, int argf, int argnup) { + int nup = (int)luaL_checkinteger(L, argnup); /* upvalue index */ + luaL_checktype(L, argf, LUA_TFUNCTION); /* closure */ + luaL_argcheck(L, (lua_getupvalue(L, argf, nup) != NULL), argnup, + "invalid upvalue index"); + return nup; +} + + +static int db_upvalueid (lua_State *L) { + int n = checkupval(L, 1, 2); + lua_pushlightuserdata(L, lua_upvalueid(L, 1, n)); + return 1; +} + + +static int db_upvaluejoin (lua_State *L) { + int n1 = checkupval(L, 1, 2); + int n2 = checkupval(L, 3, 4); + luaL_argcheck(L, !lua_iscfunction(L, 1), 1, "Lua function expected"); + luaL_argcheck(L, !lua_iscfunction(L, 3), 3, "Lua function expected"); + lua_upvaluejoin(L, 1, n1, 3, n2); + return 0; +} + + +/* +** Call hook function registered at hook table for the current +** thread (if there is one) +*/ +static void hookf (lua_State *L, lua_Debug *ar) { + static const char *const hooknames[] = + {"call", "return", "line", "count", "tail call"}; + lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); + lua_pushthread(L); + if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */ + lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */ + if (ar->currentline >= 0) + lua_pushinteger(L, ar->currentline); /* push current line */ + else lua_pushnil(L); + lua_assert(lua_getinfo(L, "lS", ar)); + lua_call(L, 2, 0); /* call hook function */ + } +} + + +/* +** Convert a string mask (for 'sethook') into a bit mask +*/ +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; +} + + +/* +** Convert a bit mask (for 'gethook') into a string 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 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)) { /* no hook? */ + 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 = (int)luaL_optinteger(L, arg + 3, 0); + func = hookf; mask = makemask(smask, count); + } + if (lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY) == LUA_TNIL) { + lua_createtable(L, 0, 2); /* create a hook table */ + lua_pushvalue(L, -1); + lua_rawsetp(L, LUA_REGISTRYINDEX, &HOOKKEY); /* set it in position */ + lua_pushstring(L, "k"); + lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ + lua_pushvalue(L, -1); + lua_setmetatable(L, -2); /* setmetatable(hooktable) = hooktable */ + } + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */ + lua_pushvalue(L, arg + 1); /* value (hook function) */ + lua_rawset(L, -3); /* hooktable[L1] = new Lua hook */ + lua_sethook(L1, func, mask, count); + 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) /* no hook? */ + lua_pushnil(L); + else if (hook != hookf) /* external hook? */ + lua_pushliteral(L, "external hook"); + else { /* hook table must exist */ + lua_rawgetp(L, LUA_REGISTRYINDEX, &HOOKKEY); + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); + lua_rawget(L, -2); /* 1st result = hooktable[L1] */ + lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); /* 2nd result = mask */ + lua_pushinteger(L, lua_gethookcount(L1)); /* 3rd result = count */ + return 3; +} + + +static int db_debug (lua_State *L) { + for (;;) { + char buffer[250]; + lua_writestringerror("%s", "lua_debug> "); + 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)) + lua_writestringerror("%s\n", lua_tostring(L, -1)); + lua_settop(L, 0); /* remove eventual returns */ + } +} + + +static int db_traceback (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + const char *msg = lua_tostring(L, arg + 1); + if (msg == NULL && !lua_isnoneornil(L, arg + 1)) /* non-string 'msg'? */ + lua_pushvalue(L, arg + 1); /* return it untouched */ + else { + int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0); + luaL_traceback(L, L1, msg, level); + } + return 1; +} + + +static const luaL_Reg dblib[] = { + {"debug", db_debug}, + {"getuservalue", db_getuservalue}, + {"gethook", db_gethook}, + {"getinfo", db_getinfo}, + {"getlocal", db_getlocal}, + {"getregistry", db_getregistry}, + {"getmetatable", db_getmetatable}, + {"getupvalue", db_getupvalue}, + {"upvaluejoin", db_upvaluejoin}, + {"upvalueid", db_upvalueid}, + {"setuservalue", db_setuservalue}, + {"sethook", db_sethook}, + {"setlocal", db_setlocal}, + {"setmetatable", db_setmetatable}, + {"setupvalue", db_setupvalue}, + {"traceback", db_traceback}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_debug (lua_State *L) { + luaL_newlib(L, dblib); + return 1; +} + diff --git a/lua-5.3.3/src/ldebug.c b/lua-5.3.3/src/ldebug.c new file mode 100644 index 0000000..e499ee3 --- /dev/null +++ b/lua-5.3.3/src/ldebug.c @@ -0,0 +1,679 @@ +/* +** $Id: ldebug.c,v 2.120 2016/03/31 19:01:21 roberto Exp $ +** Debug Interface +** See Copyright Notice in lua.h +*/ + +#define ldebug_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#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" + + + +#define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_TCCL) + + +/* Active Lua function (given call info) */ +#define ci_func(ci) (clLvalue((ci)->func)) + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); + + +static int currentpc (CallInfo *ci) { + lua_assert(isLua(ci)); + return pcRel(ci->u.l.savedpc, ci_func(ci)->p); +} + + +static int currentline (CallInfo *ci) { + return getfuncline(ci_func(ci)->p, currentpc(ci)); +} + + +/* +** If function yielded, its 'func' can be in the 'extra' field. The +** next function restores 'func' to its correct value for debugging +** purposes. (It exchanges 'func' and 'extra'; so, when called again, +** after debugging, it also "re-restores" ** 'func' to its altered value. +*/ +static void swapextra (lua_State *L) { + if (L->status == LUA_YIELD) { + CallInfo *ci = L->ci; /* get function that yielded */ + StkId temp = ci->func; /* exchange its 'func' and 'extra' values */ + ci->func = restorestack(L, ci->extra); + ci->extra = savestack(L, temp); + } +} + + +/* +** This function can be called asynchronously (e.g. during a signal). +** Fields 'oldpc', 'basehookcount', and 'hookcount' (set by +** 'resethookcount') are for debug only, and it is no problem if they +** get arbitrary values (causes at most one wrong hook call). 'hookmask' +** is an atomic value. We assume that pointers are atomic too (e.g., gcc +** ensures that for all platforms where it runs). Moreover, 'hook' is +** always checked before being called (see 'luaD_hook'). +*/ +LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { + if (func == NULL || mask == 0) { /* turn off hooks? */ + mask = 0; + func = NULL; + } + if (isLua(L->ci)) + L->oldpc = L->ci->u.l.savedpc; + L->hook = func; + L->basehookcount = count; + resethookcount(L); + L->hookmask = cast_byte(mask); +} + + +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; + if (level < 0) return 0; /* invalid (negative) level */ + lua_lock(L); + for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous) + level--; + if (level == 0 && ci != &L->base_ci) { /* level found? */ + status = 1; + ar->i_ci = ci; + } + else status = 0; /* no such level */ + lua_unlock(L); + return status; +} + + +static const char *upvalname (Proto *p, int uv) { + TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name); + if (s == NULL) return "?"; + else return getstr(s); +} + + +static const char *findvararg (CallInfo *ci, int n, StkId *pos) { + int nparams = clLvalue(ci->func)->p->numparams; + if (n >= cast_int(ci->u.l.base - ci->func) - nparams) + return NULL; /* no such vararg */ + else { + *pos = ci->func + nparams + n; + return "(*vararg)"; /* generic name for any vararg */ + } +} + + +static const char *findlocal (lua_State *L, CallInfo *ci, int n, + StkId *pos) { + const char *name = NULL; + StkId base; + if (isLua(ci)) { + if (n < 0) /* access to vararg values? */ + return findvararg(ci, -n, pos); + else { + base = ci->u.l.base; + name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); + } + } + else + base = ci->func + 1; + if (name == NULL) { /* no 'standard' name? */ + StkId limit = (ci == L->ci) ? L->top : ci->next->func; + if (limit - base >= n && n > 0) /* is 'n' inside 'ci' stack? */ + name = "(*temporary)"; /* generic name for any valid slot */ + else + return NULL; /* no name */ + } + *pos = base + (n - 1); + return name; +} + + +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { + const char *name; + lua_lock(L); + swapextra(L); + if (ar == NULL) { /* information about non-active function? */ + if (!isLfunction(L->top - 1)) /* not a Lua function? */ + name = NULL; + else /* consider live variables at function start (parameters) */ + name = luaF_getlocalname(clLvalue(L->top - 1)->p, n, 0); + } + else { /* active function; get information through 'ar' */ + StkId pos = NULL; /* to avoid warnings */ + name = findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobj2s(L, L->top, pos); + api_incr_top(L); + } + } + swapextra(L); + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + StkId pos = NULL; /* to avoid warnings */ + const char *name; + lua_lock(L); + swapextra(L); + name = findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, pos, L->top - 1); + L->top--; /* pop value */ + } + swapextra(L); + lua_unlock(L); + return name; +} + + +static void funcinfo (lua_Debug *ar, Closure *cl) { + if (noLuaClosure(cl)) { + ar->source = "=[C]"; + ar->linedefined = -1; + ar->lastlinedefined = -1; + ar->what = "C"; + } + else { + Proto *p = cl->l.p; + ar->source = p->source ? getstr(p->source) : "=?"; + ar->linedefined = p->linedefined; + ar->lastlinedefined = p->lastlinedefined; + ar->what = (ar->linedefined == 0) ? "main" : "Lua"; + } + luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); +} + + +static void collectvalidlines (lua_State *L, Closure *f) { + if (noLuaClosure(f)) { + setnilvalue(L->top); + api_incr_top(L); + } + else { + int i; + TValue v; + int *lineinfo = f->l.p->lineinfo; + Table *t = luaH_new(L); /* new table to store active lines */ + sethvalue(L, L->top, t); /* push it on stack */ + api_incr_top(L); + setbvalue(&v, 1); /* boolean 'true' to be the value of all indices */ + for (i = 0; i < f->l.p->sizelineinfo; i++) /* for all lines with code */ + luaH_setint(L, t, lineinfo[i], &v); /* table[line] = true */ + } +} + + +static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, + Closure *f, CallInfo *ci) { + int status = 1; + for (; *what; what++) { + switch (*what) { + case 'S': { + funcinfo(ar, f); + break; + } + case 'l': { + ar->currentline = (ci && isLua(ci)) ? currentline(ci) : -1; + break; + } + case 'u': { + ar->nups = (f == NULL) ? 0 : f->c.nupvalues; + if (noLuaClosure(f)) { + ar->isvararg = 1; + ar->nparams = 0; + } + else { + ar->isvararg = f->l.p->is_vararg; + ar->nparams = f->l.p->numparams; + } + break; + } + case 't': { + ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0; + break; + } + case 'n': { + /* calling function is a known Lua function? */ + if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous)) + ar->namewhat = getfuncname(L, ci->previous, &ar->name); + else + ar->namewhat = 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 *cl; + CallInfo *ci; + StkId func; + lua_lock(L); + swapextra(L); + if (*what == '>') { + ci = NULL; + func = L->top - 1; + api_check(L, ttisfunction(func), "function expected"); + what++; /* skip the '>' */ + L->top--; /* pop function */ + } + else { + ci = ar->i_ci; + func = ci->func; + lua_assert(ttisfunction(ci->func)); + } + cl = ttisclosure(func) ? clvalue(func) : NULL; + status = auxgetinfo(L, what, ar, cl, ci); + if (strchr(what, 'f')) { + setobjs2s(L, L->top, func); + api_incr_top(L); + } + swapextra(L); /* correct before option 'L', which can raise a mem. error */ + if (strchr(what, 'L')) + collectvalidlines(L, cl); + lua_unlock(L); + return status; +} + + +/* +** {====================================================== +** Symbolic Execution +** ======================================================= +*/ + +static const char *getobjname (Proto *p, int lastpc, int reg, + const char **name); + + +/* +** find a "name" for the RK value 'c' +*/ +static void kname (Proto *p, int pc, int c, const char **name) { + if (ISK(c)) { /* is 'c' a constant? */ + TValue *kvalue = &p->k[INDEXK(c)]; + if (ttisstring(kvalue)) { /* literal constant? */ + *name = svalue(kvalue); /* it is its own name */ + return; + } + /* else no reasonable name found */ + } + else { /* 'c' is a register */ + const char *what = getobjname(p, pc, c, name); /* search for 'c' */ + if (what && *what == 'c') { /* found a constant name? */ + return; /* 'name' already filled */ + } + /* else no reasonable name found */ + } + *name = "?"; /* no reasonable name found */ +} + + +static int filterpc (int pc, int jmptarget) { + if (pc < jmptarget) /* is code conditional (inside a jump)? */ + return -1; /* cannot know who sets that register */ + else return pc; /* current position sets that register */ +} + + +/* +** try to find last instruction before 'lastpc' that modified register 'reg' +*/ +static int findsetreg (Proto *p, int lastpc, int reg) { + int pc; + int setreg = -1; /* keep last instruction that changed 'reg' */ + int jmptarget = 0; /* any code before this address is conditional */ + for (pc = 0; pc < lastpc; pc++) { + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + int a = GETARG_A(i); + switch (op) { + case OP_LOADNIL: { + int b = GETARG_B(i); + if (a <= reg && reg <= a + b) /* set registers from 'a' to 'a+b' */ + setreg = filterpc(pc, jmptarget); + break; + } + case OP_TFORCALL: { + if (reg >= a + 2) /* affect all regs above its base */ + setreg = filterpc(pc, jmptarget); + break; + } + case OP_CALL: + case OP_TAILCALL: { + if (reg >= a) /* affect all registers above base */ + setreg = filterpc(pc, jmptarget); + break; + } + case OP_JMP: { + int b = GETARG_sBx(i); + int dest = pc + 1 + b; + /* jump is forward and do not skip 'lastpc'? */ + if (pc < dest && dest <= lastpc) { + if (dest > jmptarget) + jmptarget = dest; /* update 'jmptarget' */ + } + break; + } + default: + if (testAMode(op) && reg == a) /* any instruction that set A */ + setreg = filterpc(pc, jmptarget); + break; + } + } + return setreg; +} + + +static const char *getobjname (Proto *p, int lastpc, int reg, + const char **name) { + int pc; + *name = luaF_getlocalname(p, reg + 1, lastpc); + if (*name) /* is a local? */ + return "local"; + /* else try symbolic execution */ + pc = findsetreg(p, lastpc, reg); + if (pc != -1) { /* could find instruction? */ + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + switch (op) { + case OP_MOVE: { + int b = GETARG_B(i); /* move from 'b' to 'a' */ + if (b < GETARG_A(i)) + return getobjname(p, pc, b, name); /* get name for 'b' */ + break; + } + case OP_GETTABUP: + case OP_GETTABLE: { + int k = GETARG_C(i); /* key index */ + int t = GETARG_B(i); /* table index */ + const char *vn = (op == OP_GETTABLE) /* name of indexed variable */ + ? luaF_getlocalname(p, t + 1, pc) + : upvalname(p, t); + kname(p, pc, k, name); + return (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field"; + } + case OP_GETUPVAL: { + *name = upvalname(p, GETARG_B(i)); + return "upvalue"; + } + case OP_LOADK: + case OP_LOADKX: { + int b = (op == OP_LOADK) ? GETARG_Bx(i) + : GETARG_Ax(p->code[pc + 1]); + if (ttisstring(&p->k[b])) { + *name = svalue(&p->k[b]); + return "constant"; + } + break; + } + case OP_SELF: { + int k = GETARG_C(i); /* key index */ + kname(p, pc, k, name); + return "method"; + } + default: break; /* go through to return NULL */ + } + } + return NULL; /* could not find reasonable name */ +} + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { + TMS tm = (TMS)0; /* to avoid warnings */ + Proto *p = ci_func(ci)->p; /* calling function */ + int pc = currentpc(ci); /* calling instruction index */ + Instruction i = p->code[pc]; /* calling instruction */ + if (ci->callstatus & CIST_HOOKED) { /* was it called inside a hook? */ + *name = "?"; + return "hook"; + } + switch (GET_OPCODE(i)) { + case OP_CALL: + case OP_TAILCALL: /* get function name */ + return getobjname(p, pc, GETARG_A(i), name); + case OP_TFORCALL: { /* for iterator */ + *name = "for iterator"; + return "for iterator"; + } + /* all other instructions can call only through metamethods */ + case OP_SELF: case OP_GETTABUP: case OP_GETTABLE: + tm = TM_INDEX; + break; + case OP_SETTABUP: case OP_SETTABLE: + tm = TM_NEWINDEX; + break; + case OP_ADD: case OP_SUB: case OP_MUL: case OP_MOD: + case OP_POW: case OP_DIV: case OP_IDIV: case OP_BAND: + case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: { + int offset = cast_int(GET_OPCODE(i)) - cast_int(OP_ADD); /* ORDER OP */ + tm = cast(TMS, offset + cast_int(TM_ADD)); /* ORDER TM */ + break; + } + case OP_UNM: tm = TM_UNM; break; + case OP_BNOT: tm = TM_BNOT; break; + case OP_LEN: tm = TM_LEN; break; + case OP_CONCAT: tm = TM_CONCAT; break; + case OP_EQ: tm = TM_EQ; break; + case OP_LT: tm = TM_LT; break; + case OP_LE: tm = TM_LE; break; + default: lua_assert(0); /* other instructions cannot call a function */ + } + *name = getstr(G(L)->tmname[tm]); + return "metamethod"; +} + +/* }====================================================== */ + + + +/* +** The subtraction of two potentially unrelated pointers is +** not ISO C, but it should not crash a program; the subsequent +** checks are ISO C and ensure a correct result. +*/ +static int isinstack (CallInfo *ci, const TValue *o) { + ptrdiff_t i = o - ci->u.l.base; + return (0 <= i && i < (ci->top - ci->u.l.base) && ci->u.l.base + i == o); +} + + +/* +** Checks whether value 'o' came from an upvalue. (That can only happen +** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on +** upvalues.) +*/ +static const char *getupvalname (CallInfo *ci, const TValue *o, + const char **name) { + LClosure *c = ci_func(ci); + int i; + for (i = 0; i < c->nupvalues; i++) { + if (c->upvals[i]->v == o) { + *name = upvalname(c->p, i); + return "upvalue"; + } + } + return NULL; +} + + +static const char *varinfo (lua_State *L, const TValue *o) { + const char *name = NULL; /* to avoid warnings */ + CallInfo *ci = L->ci; + const char *kind = NULL; + if (isLua(ci)) { + kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */ + if (!kind && isinstack(ci, o)) /* no? try a register */ + kind = getobjname(ci_func(ci)->p, currentpc(ci), + cast_int(o - ci->u.l.base), &name); + } + return (kind) ? luaO_pushfstring(L, " (%s '%s')", kind, name) : ""; +} + + +l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) { + const char *t = luaT_objtypename(L, o); + luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o)); +} + + +l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) { + if (ttisstring(p1) || cvt2str(p1)) p1 = p2; + luaG_typeerror(L, p1, "concatenate"); +} + + +l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, const char *msg) { + lua_Number temp; + if (!tonumber(p1, &temp)) /* first operand is wrong? */ + p2 = p1; /* now second is wrong */ + luaG_typeerror(L, p2, msg); +} + + +/* +** Error when both values are convertible to numbers, but not to integers +*/ +l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) { + lua_Integer temp; + if (!tointeger(p1, &temp)) + p2 = p1; + luaG_runerror(L, "number%s has no integer representation", varinfo(L, p2)); +} + + +l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { + const char *t1 = luaT_objtypename(L, p1); + const char *t2 = luaT_objtypename(L, p2); + if (strcmp(t1, t2) == 0) + luaG_runerror(L, "attempt to compare two %s values", t1); + else + luaG_runerror(L, "attempt to compare %s with %s", t1, t2); +} + + +/* add src:line information to 'msg' */ +const char *luaG_addinfo (lua_State *L, const char *msg, TString *src, + int line) { + char buff[LUA_IDSIZE]; + if (src) + luaO_chunkid(buff, getstr(src), LUA_IDSIZE); + else { /* no source available; use "?" instead */ + buff[0] = '?'; buff[1] = '\0'; + } + return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); +} + + +l_noret luaG_errormsg (lua_State *L) { + if (L->errfunc != 0) { /* is there an error handling function? */ + StkId errfunc = restorestack(L, L->errfunc); + setobjs2s(L, L->top, L->top - 1); /* move argument */ + setobjs2s(L, L->top - 1, errfunc); /* push function */ + L->top++; /* assume EXTRA_STACK */ + luaD_callnoyield(L, L->top - 2, 1); /* call it */ + } + luaD_throw(L, LUA_ERRRUN); +} + + +l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { + CallInfo *ci = L->ci; + const char *msg; + va_list argp; + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); /* format message */ + va_end(argp); + if (isLua(ci)) /* if Lua function, add source:line information */ + luaG_addinfo(L, msg, ci_func(ci)->p->source, currentline(ci)); + luaG_errormsg(L); +} + + +void luaG_traceexec (lua_State *L) { + CallInfo *ci = L->ci; + lu_byte mask = L->hookmask; + int counthook = (--L->hookcount == 0 && (mask & LUA_MASKCOUNT)); + if (counthook) + resethookcount(L); /* reset count */ + else if (!(mask & LUA_MASKLINE)) + return; /* no line hook and count != 0; nothing to be done */ + if (ci->callstatus & CIST_HOOKYIELD) { /* called hook last time? */ + ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */ + return; /* do not call hook again (VM yielded, so it did not move) */ + } + if (counthook) + luaD_hook(L, LUA_HOOKCOUNT, -1); /* call count hook */ + if (mask & LUA_MASKLINE) { + Proto *p = ci_func(ci)->p; + int npc = pcRel(ci->u.l.savedpc, p); + int newline = getfuncline(p, npc); + if (npc == 0 || /* call linehook when enter a new function, */ + ci->u.l.savedpc <= L->oldpc || /* when jump back (loop), or when */ + newline != getfuncline(p, pcRel(L->oldpc, p))) /* enter a new line */ + luaD_hook(L, LUA_HOOKLINE, newline); /* call line hook */ + } + L->oldpc = ci->u.l.savedpc; + if (L->status == LUA_YIELD) { /* did hook yield? */ + if (counthook) + L->hookcount = 1; /* undo decrement to zero */ + ci->u.l.savedpc--; /* undo increment (resume will increment it again) */ + ci->callstatus |= CIST_HOOKYIELD; /* mark that it yielded */ + ci->func = L->top - 1; /* protect stack below results */ + luaD_throw(L, LUA_YIELD); + } +} + diff --git a/lua-5.3.3/src/ldebug.h b/lua-5.3.3/src/ldebug.h new file mode 100644 index 0000000..0e31546 --- /dev/null +++ b/lua-5.3.3/src/ldebug.h @@ -0,0 +1,39 @@ +/* +** $Id: ldebug.h,v 2.14 2015/05/22 17:45:56 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 getfuncline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : -1) + +#define resethookcount(L) (L->hookcount = L->basehookcount) + + +LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o, + const char *opname); +LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, + const char *msg); +LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...); +LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg, + TString *src, int line); +LUAI_FUNC l_noret luaG_errormsg (lua_State *L); +LUAI_FUNC void luaG_traceexec (lua_State *L); + + +#endif diff --git a/lua-5.3.3/src/ldo.c b/lua-5.3.3/src/ldo.c new file mode 100644 index 0000000..8804c99 --- /dev/null +++ b/lua-5.3.3/src/ldo.c @@ -0,0 +1,800 @@ +/* +** $Id: ldo.c,v 2.151 2015/12/16 16:40:07 roberto Exp $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#define ldo_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#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 "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" + + + +#define errorstatus(s) ((s) > LUA_YIELD) + + +/* +** {====================================================== +** Error-recovery functions +** ======================================================= +*/ + +/* +** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By +** default, Lua handles errors with exceptions when compiling as +** C++ code, with _longjmp/_setjmp when asked to use them, and with +** longjmp/setjmp otherwise. +*/ +#if !defined(LUAI_THROW) /* { */ + +#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP) /* { */ + +/* C++ exceptions */ +#define LUAI_THROW(L,c) throw(c) +#define LUAI_TRY(L,c,a) \ + try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; } +#define luai_jmpbuf int /* dummy variable */ + +#elif defined(LUA_USE_POSIX) /* }{ */ + +/* in POSIX, try _longjmp/_setjmp (more efficient) */ +#define LUAI_THROW(L,c) _longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#else /* }{ */ + +/* ISO C handling with long jumps */ +#define LUAI_THROW(L,c) longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#endif /* } */ + +#endif /* } */ + + + +/* chain list of long jump buffers */ +struct lua_longjmp { + struct lua_longjmp *previous; + luai_jmpbuf b; + volatile int status; /* error code */ +}; + + +static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { + switch (errcode) { + case LUA_ERRMEM: { /* memory error? */ + setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ + break; + } + case LUA_ERRERR: { + setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); + break; + } + default: { + setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ + break; + } + } + L->top = oldtop + 1; +} + + +l_noret luaD_throw (lua_State *L, int errcode) { + if (L->errorJmp) { /* thread has an error handler? */ + L->errorJmp->status = errcode; /* set status */ + LUAI_THROW(L, L->errorJmp); /* jump to it */ + } + else { /* thread has no error handler */ + global_State *g = G(L); + L->status = cast_byte(errcode); /* mark it as dead */ + if (g->mainthread->errorJmp) { /* main thread has a handler? */ + setobjs2s(L, g->mainthread->top++, L->top - 1); /* copy error obj. */ + luaD_throw(g->mainthread, errcode); /* re-throw in main thread */ + } + else { /* no handler at all; abort */ + if (g->panic) { /* panic function? */ + seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */ + if (L->ci->top < L->top) + L->ci->top = L->top; /* pushing msg. can break this invariant */ + lua_unlock(L); + g->panic(L); /* call panic function (last chance to jump out) */ + } + abort(); + } + } +} + + +int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { + unsigned short oldnCcalls = L->nCcalls; + struct lua_longjmp lj; + lj.status = LUA_OK; + lj.previous = L->errorJmp; /* chain new error handler */ + L->errorJmp = &lj; + LUAI_TRY(L, &lj, + (*f)(L, ud); + ); + L->errorJmp = lj.previous; /* restore old error handler */ + L->nCcalls = oldnCcalls; + return lj.status; +} + +/* }====================================================== */ + + +/* +** {================================================================== +** Stack reallocation +** =================================================================== +*/ +static void correctstack (lua_State *L, TValue *oldstack) { + CallInfo *ci; + UpVal *up; + L->top = (L->top - oldstack) + L->stack; + for (up = L->openupval; up != NULL; up = up->u.open.next) + up->v = (up->v - oldstack) + L->stack; + for (ci = L->ci; ci != NULL; ci = ci->previous) { + ci->top = (ci->top - oldstack) + L->stack; + ci->func = (ci->func - oldstack) + L->stack; + if (isLua(ci)) + ci->u.l.base = (ci->u.l.base - oldstack) + L->stack; + } +} + + +/* some space for error handling */ +#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200) + + +void luaD_reallocstack (lua_State *L, int newsize) { + TValue *oldstack = L->stack; + int lim = L->stacksize; + lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE); + lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK); + luaM_reallocvector(L, L->stack, L->stacksize, newsize, TValue); + for (; lim < newsize; lim++) + setnilvalue(L->stack + lim); /* erase new segment */ + L->stacksize = newsize; + L->stack_last = L->stack + newsize - EXTRA_STACK; + correctstack(L, oldstack); +} + + +void luaD_growstack (lua_State *L, int n) { + int size = L->stacksize; + if (size > LUAI_MAXSTACK) /* error after extra size? */ + luaD_throw(L, LUA_ERRERR); + else { + int needed = cast_int(L->top - L->stack) + n + EXTRA_STACK; + int newsize = 2 * size; + if (newsize > LUAI_MAXSTACK) newsize = LUAI_MAXSTACK; + if (newsize < needed) newsize = needed; + if (newsize > LUAI_MAXSTACK) { /* stack overflow? */ + luaD_reallocstack(L, ERRORSTACKSIZE); + luaG_runerror(L, "stack overflow"); + } + else + luaD_reallocstack(L, newsize); + } +} + + +static int stackinuse (lua_State *L) { + CallInfo *ci; + StkId lim = L->top; + for (ci = L->ci; ci != NULL; ci = ci->previous) { + lua_assert(ci->top <= L->stack_last); + if (lim < ci->top) lim = ci->top; + } + return cast_int(lim - L->stack) + 1; /* part of stack in use */ +} + + +void luaD_shrinkstack (lua_State *L) { + int inuse = stackinuse(L); + int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; + if (goodsize > LUAI_MAXSTACK) goodsize = LUAI_MAXSTACK; + if (L->stacksize > LUAI_MAXSTACK) /* was handling stack overflow? */ + luaE_freeCI(L); /* free all CIs (list grew because of an error) */ + else + luaE_shrinkCI(L); /* shrink list */ + if (inuse <= LUAI_MAXSTACK && /* not handling stack overflow? */ + goodsize < L->stacksize) /* trying to shrink? */ + luaD_reallocstack(L, goodsize); /* shrink it */ + else + condmovestack(L,,); /* don't change stack (change only for debugging) */ +} + + +void luaD_inctop (lua_State *L) { + luaD_checkstack(L, 1); + L->top++; +} + +/* }================================================================== */ + + +/* +** Call a hook for the given event. Make sure there is a hook to be +** called. (Both 'L->hook' and 'L->hookmask', which triggers this +** function, can be changed asynchronously by signals.) +*/ +void luaD_hook (lua_State *L, int event, int line) { + lua_Hook hook = L->hook; + if (hook && L->allowhook) { /* make sure there is a hook */ + CallInfo *ci = L->ci; + ptrdiff_t top = savestack(L, L->top); + ptrdiff_t ci_top = savestack(L, ci->top); + lua_Debug ar; + ar.event = event; + ar.currentline = line; + ar.i_ci = ci; + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + ci->top = L->top + LUA_MINSTACK; + lua_assert(ci->top <= L->stack_last); + L->allowhook = 0; /* cannot call hooks inside a hook */ + ci->callstatus |= CIST_HOOKED; + lua_unlock(L); + (*hook)(L, &ar); + lua_lock(L); + lua_assert(!L->allowhook); + L->allowhook = 1; + ci->top = restorestack(L, ci_top); + L->top = restorestack(L, top); + ci->callstatus &= ~CIST_HOOKED; + } +} + + +static void callhook (lua_State *L, CallInfo *ci) { + int hook = LUA_HOOKCALL; + ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */ + if (isLua(ci->previous) && + GET_OPCODE(*(ci->previous->u.l.savedpc - 1)) == OP_TAILCALL) { + ci->callstatus |= CIST_TAIL; + hook = LUA_HOOKTAILCALL; + } + luaD_hook(L, hook, -1); + ci->u.l.savedpc--; /* correct 'pc' */ +} + + +static StkId adjust_varargs (lua_State *L, Proto *p, int actual) { + int i; + int nfixargs = p->numparams; + StkId base, fixed; + /* move fixed parameters to final position */ + fixed = L->top - actual; /* first fixed argument */ + base = L->top; /* final position of first argument */ + for (i = 0; i < nfixargs && i < actual; i++) { + setobjs2s(L, L->top++, fixed + i); + setnilvalue(fixed + i); /* erase original copy (for GC) */ + } + for (; i < nfixargs; i++) + setnilvalue(L->top++); /* complete missing arguments */ + return base; +} + + +/* +** Check whether __call metafield of 'func' is a function. If so, put +** it in stack below original 'func' so that 'luaD_precall' can call +** it. Raise an error if __call metafield is not a function. +*/ +static void tryfuncTM (lua_State *L, StkId func) { + const TValue *tm = luaT_gettmbyobj(L, func, TM_CALL); + StkId p; + 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); + L->top++; /* slot ensured by caller */ + setobj2s(L, func, tm); /* tag method is the new function to be called */ +} + + + +#define next_ci(L) (L->ci = (L->ci->next ? L->ci->next : luaE_extendCI(L))) + + +/* macro to check stack size, preserving 'p' */ +#define checkstackp(L,n,p) \ + luaD_checkstackaux(L, n, \ + ptrdiff_t t__ = savestack(L, p); /* save 'p' */ \ + luaC_checkGC(L), /* stack grow uses memory */ \ + p = restorestack(L, t__)) /* 'pos' part: restore 'p' */ + + +/* +** Prepares a function call: checks the stack, creates a new CallInfo +** entry, fills in the relevant information, calls hook if needed. +** If function is a C function, does the call, too. (Otherwise, leave +** the execution ('luaV_execute') to the caller, to allow stackless +** calls.) Returns true iff function has been executed (C function). +*/ +int luaD_precall (lua_State *L, StkId func, int nresults) { + lua_CFunction f; + CallInfo *ci; + switch (ttype(func)) { + case LUA_TCCL: /* C closure */ + f = clCvalue(func)->f; + goto Cfunc; + case LUA_TLCF: /* light C function */ + f = fvalue(func); + Cfunc: { + int n; /* number of returns */ + checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ + ci = next_ci(L); /* now 'enter' new function */ + ci->nresults = nresults; + ci->func = func; + ci->top = L->top + LUA_MINSTACK; + lua_assert(ci->top <= L->stack_last); + ci->callstatus = 0; + if (L->hookmask & LUA_MASKCALL) + luaD_hook(L, LUA_HOOKCALL, -1); + lua_unlock(L); + n = (*f)(L); /* do the actual call */ + lua_lock(L); + api_checknelems(L, n); + luaD_poscall(L, ci, L->top - n, n); + return 1; + } + case LUA_TLCL: { /* Lua function: prepare its call */ + StkId base; + Proto *p = clLvalue(func)->p; + int n = cast_int(L->top - func) - 1; /* number of real arguments */ + int fsize = p->maxstacksize; /* frame size */ + checkstackp(L, fsize, func); + if (p->is_vararg != 1) { /* do not use vararg? */ + for (; n < p->numparams; n++) + setnilvalue(L->top++); /* complete missing arguments */ + base = func + 1; + } + else + base = adjust_varargs(L, p, n); + ci = next_ci(L); /* now 'enter' new function */ + ci->nresults = nresults; + ci->func = func; + ci->u.l.base = base; + L->top = ci->top = base + fsize; + lua_assert(ci->top <= L->stack_last); + ci->u.l.savedpc = p->code; /* starting point */ + ci->callstatus = CIST_LUA; + if (L->hookmask & LUA_MASKCALL) + callhook(L, ci); + return 0; + } + default: { /* not a function */ + checkstackp(L, 1, func); /* ensure space for metamethod */ + tryfuncTM(L, func); /* try to get '__call' metamethod */ + return luaD_precall(L, func, nresults); /* now it must be a function */ + } + } +} + + +/* +** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'. +** Handle most typical cases (zero results for commands, one result for +** expressions, multiple results for tail calls/single parameters) +** separated. +*/ +static int moveresults (lua_State *L, const TValue *firstResult, StkId res, + int nres, int wanted) { + switch (wanted) { /* handle typical cases separately */ + case 0: break; /* nothing to move */ + case 1: { /* one result needed */ + if (nres == 0) /* no results? */ + firstResult = luaO_nilobject; /* adjust with nil */ + setobjs2s(L, res, firstResult); /* move it to proper place */ + break; + } + case LUA_MULTRET: { + int i; + for (i = 0; i < nres; i++) /* move all results to correct place */ + setobjs2s(L, res + i, firstResult + i); + L->top = res + nres; + return 0; /* wanted == LUA_MULTRET */ + } + default: { + int i; + if (wanted <= nres) { /* enough results? */ + for (i = 0; i < wanted; i++) /* move wanted results to correct place */ + setobjs2s(L, res + i, firstResult + i); + } + else { /* not enough results; use all of them plus nils */ + for (i = 0; i < nres; i++) /* move all results to correct place */ + setobjs2s(L, res + i, firstResult + i); + for (; i < wanted; i++) /* complete wanted number of results */ + setnilvalue(res + i); + } + break; + } + } + L->top = res + wanted; /* top points after the last result */ + return 1; +} + + +/* +** Finishes a function call: calls hook if necessary, removes CallInfo, +** moves current number of results to proper place; returns 0 iff call +** wanted multiple (variable number of) results. +*/ +int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) { + StkId res; + int wanted = ci->nresults; + if (L->hookmask & (LUA_MASKRET | LUA_MASKLINE)) { + if (L->hookmask & LUA_MASKRET) { + ptrdiff_t fr = savestack(L, firstResult); /* hook may change stack */ + luaD_hook(L, LUA_HOOKRET, -1); + firstResult = restorestack(L, fr); + } + L->oldpc = ci->previous->u.l.savedpc; /* 'oldpc' for caller function */ + } + res = ci->func; /* res == final position of 1st result */ + L->ci = ci->previous; /* back to caller */ + /* move results to proper place */ + return moveresults(L, firstResult, res, nres, wanted); +} + + +/* +** Check appropriate error for stack overflow ("regular" overflow or +** overflow while handling stack overflow). If 'nCalls' is larger than +** LUAI_MAXCCALLS (which means it is handling a "regular" overflow) but +** smaller than 9/8 of LUAI_MAXCCALLS, does not report an error (to +** allow overflow handling to work) +*/ +static void stackerror (lua_State *L) { + 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 */ +} + + +/* +** 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) + stackerror(L); + if (!luaD_precall(L, func, nResults)) /* is a Lua function? */ + luaV_execute(L); /* call it */ + L->nCcalls--; +} + + +/* +** Similar to 'luaD_call', but does not allow yields during the call +*/ +void luaD_callnoyield (lua_State *L, StkId func, int nResults) { + L->nny++; + luaD_call(L, func, nResults); + L->nny--; +} + + +/* +** Completes the execution of an interrupted C function, calling its +** continuation function. +*/ +static void finishCcall (lua_State *L, int status) { + CallInfo *ci = L->ci; + int n; + /* must have a continuation and must be able to call it */ + lua_assert(ci->u.c.k != NULL && L->nny == 0); + /* error status can only happen in a protected call */ + lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD); + if (ci->callstatus & CIST_YPCALL) { /* was inside a pcall? */ + ci->callstatus &= ~CIST_YPCALL; /* finish 'lua_pcall' */ + L->errfunc = ci->u.c.old_errfunc; + } + /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already + handled */ + adjustresults(L, ci->nresults); + /* call continuation function */ + lua_unlock(L); + n = (*ci->u.c.k)(L, status, ci->u.c.ctx); + lua_lock(L); + api_checknelems(L, n); + /* finish 'luaD_precall' */ + luaD_poscall(L, ci, L->top - n, n); +} + + +/* +** Executes "full continuation" (everything in the stack) of a +** previously interrupted coroutine until the stack is empty (or another +** interruption long-jumps out of the loop). If the coroutine is +** recovering from an error, 'ud' points to the error status, which must +** be passed to the first continuation function (otherwise the default +** status is LUA_YIELD). +*/ +static void unroll (lua_State *L, void *ud) { + if (ud != NULL) /* error status? */ + finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */ + while (L->ci != &L->base_ci) { /* something in the stack */ + if (!isLua(L->ci)) /* C function? */ + finishCcall(L, LUA_YIELD); /* complete its execution */ + else { /* Lua function */ + luaV_finishOp(L); /* finish interrupted instruction */ + luaV_execute(L); /* execute down to higher C 'boundary' */ + } + } +} + + +/* +** Try to find a suspended protected call (a "recover point") for the +** given thread. +*/ +static CallInfo *findpcall (lua_State *L) { + CallInfo *ci; + for (ci = L->ci; ci != NULL; ci = ci->previous) { /* search for a pcall */ + if (ci->callstatus & CIST_YPCALL) + return ci; + } + return NULL; /* no pending pcall */ +} + + +/* +** Recovers from an error in a coroutine. Finds a recover point (if +** there is one) and completes the execution of the interrupted +** 'luaD_pcall'. If there is no recover point, returns zero. +*/ +static int recover (lua_State *L, int status) { + StkId oldtop; + CallInfo *ci = findpcall(L); + if (ci == NULL) return 0; /* no recovery point */ + /* "finish" luaD_pcall */ + oldtop = restorestack(L, ci->extra); + luaF_close(L, oldtop); + seterrorobj(L, status, oldtop); + L->ci = ci; + L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */ + L->nny = 0; /* should be zero to be yieldable */ + luaD_shrinkstack(L); + L->errfunc = ci->u.c.old_errfunc; + return 1; /* continue running the coroutine */ +} + + +/* +** signal an error in the call to 'resume', not in the execution of the +** coroutine itself. (Such errors should not be handled by any coroutine +** error handler and should not kill the coroutine.) +*/ +static l_noret resume_error (lua_State *L, const char *msg, StkId firstArg) { + L->top = firstArg; /* remove args from the stack */ + setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */ + api_incr_top(L); + luaD_throw(L, -1); /* jump back to 'lua_resume' */ +} + + +/* +** Do the work for 'lua_resume' in protected mode. Most of the work +** depends on the status of the coroutine: initial state, suspended +** inside a hook, or regularly suspended (optionally with a continuation +** function), plus erroneous cases: non-suspended coroutine or dead +** coroutine. +*/ +static void resume (lua_State *L, void *ud) { + int nCcalls = L->nCcalls; + int n = *(cast(int*, ud)); /* number of arguments */ + StkId firstArg = L->top - n; /* first argument */ + CallInfo *ci = L->ci; + if (nCcalls >= LUAI_MAXCCALLS) + resume_error(L, "C stack overflow", firstArg); + if (L->status == LUA_OK) { /* may be starting a coroutine */ + if (ci != &L->base_ci) /* not in base level? */ + resume_error(L, "cannot resume non-suspended coroutine", firstArg); + /* coroutine is in base level; start running it */ + if (!luaD_precall(L, firstArg - 1, LUA_MULTRET)) /* Lua function? */ + luaV_execute(L); /* call it */ + } + else if (L->status != LUA_YIELD) + resume_error(L, "cannot resume dead coroutine", firstArg); + else { /* resuming from previous yield */ + L->status = LUA_OK; /* mark that it is running (again) */ + ci->func = restorestack(L, ci->extra); + if (isLua(ci)) /* yielded inside a hook? */ + luaV_execute(L); /* just continue running Lua code */ + else { /* 'common' yield */ + if (ci->u.c.k != NULL) { /* does it have a continuation function? */ + lua_unlock(L); + n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */ + lua_lock(L); + api_checknelems(L, n); + firstArg = L->top - n; /* yield results come from continuation */ + } + luaD_poscall(L, ci, firstArg, n); /* finish 'luaD_precall' */ + } + unroll(L, NULL); /* run continuation */ + } + lua_assert(nCcalls == L->nCcalls); +} + + +LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) { + int status; + unsigned short oldnny = L->nny; /* save "number of non-yieldable" calls */ + lua_lock(L); + luai_userstateresume(L, nargs); + L->nCcalls = (from) ? from->nCcalls + 1 : 1; + L->nny = 0; /* allow yields */ + api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); + status = luaD_rawrunprotected(L, resume, &nargs); + if (status == -1) /* error calling 'lua_resume'? */ + status = LUA_ERRRUN; + else { /* continue running after recoverable errors */ + while (errorstatus(status) && recover(L, status)) { + /* unroll continuation */ + status = luaD_rawrunprotected(L, unroll, &status); + } + if (errorstatus(status)) { /* unrecoverable error? */ + L->status = cast_byte(status); /* mark thread as 'dead' */ + seterrorobj(L, status, L->top); /* push error message */ + L->ci->top = L->top; + } + else lua_assert(status == L->status); /* normal end or yield */ + } + L->nny = oldnny; /* restore 'nny' */ + L->nCcalls--; + lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0)); + lua_unlock(L); + return status; +} + + +LUA_API int lua_isyieldable (lua_State *L) { + return (L->nny == 0); +} + + +LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k) { + CallInfo *ci = L->ci; + luai_userstateyield(L, nresults); + lua_lock(L); + api_checknelems(L, nresults); + if (L->nny > 0) { + if (L != G(L)->mainthread) + luaG_runerror(L, "attempt to yield across a C-call boundary"); + else + luaG_runerror(L, "attempt to yield from outside a coroutine"); + } + L->status = LUA_YIELD; + ci->extra = savestack(L, ci->func); /* save current 'func' */ + if (isLua(ci)) { /* inside a hook? */ + api_check(L, k == NULL, "hooks cannot continue after yielding"); + } + else { + if ((ci->u.c.k = k) != NULL) /* is there a continuation? */ + ci->u.c.ctx = ctx; /* save context */ + ci->func = L->top - nresults - 1; /* protect stack below results */ + luaD_throw(L, LUA_YIELD); + } + lua_assert(ci->callstatus & CIST_HOOKED); /* must be inside a hook */ + lua_unlock(L); + return 0; /* return to 'luaD_hook' */ +} + + +int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t old_top, ptrdiff_t ef) { + int status; + CallInfo *old_ci = L->ci; + lu_byte old_allowhooks = L->allowhook; + unsigned short old_nny = L->nny; + ptrdiff_t old_errfunc = L->errfunc; + L->errfunc = ef; + status = luaD_rawrunprotected(L, func, u); + if (status != LUA_OK) { /* an error occurred? */ + StkId oldtop = restorestack(L, old_top); + luaF_close(L, oldtop); /* close possible pending closures */ + seterrorobj(L, status, oldtop); + L->ci = old_ci; + L->allowhook = old_allowhooks; + L->nny = old_nny; + luaD_shrinkstack(L); + } + L->errfunc = old_errfunc; + return status; +} + + + +/* +** Execute a protected parser. +*/ +struct SParser { /* data to 'f_parser' */ + ZIO *z; + Mbuffer buff; /* dynamic structure used by the scanner */ + Dyndata dyd; /* dynamic structures used by the parser */ + const char *mode; + const char *name; +}; + + +static void checkmode (lua_State *L, const char *mode, const char *x) { + if (mode && strchr(mode, x[0]) == NULL) { + luaO_pushfstring(L, + "attempt to load a %s chunk (mode is '%s')", x, mode); + luaD_throw(L, LUA_ERRSYNTAX); + } +} + + +static void f_parser (lua_State *L, void *ud) { + LClosure *cl; + struct SParser *p = cast(struct SParser *, ud); + int c = zgetc(p->z); /* read first character */ + if (c == LUA_SIGNATURE[0]) { + checkmode(L, p->mode, "binary"); + cl = luaU_undump(L, p->z, p->name); + } + else { + checkmode(L, p->mode, "text"); + cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c); + } + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luaF_initupvals(L, cl); +} + + +int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode) { + struct SParser p; + int status; + L->nny++; /* cannot yield during parsing */ + p.z = z; p.name = name; p.mode = mode; + p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0; + p.dyd.gt.arr = NULL; p.dyd.gt.size = 0; + p.dyd.label.arr = NULL; p.dyd.label.size = 0; + luaZ_initbuffer(L, &p.buff); + status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); + luaZ_freebuffer(L, &p.buff); + luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size); + luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size); + luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size); + L->nny--; + return status; +} + + diff --git a/lua-5.3.3/src/ldo.h b/lua-5.3.3/src/ldo.h new file mode 100644 index 0000000..4f5d51c --- /dev/null +++ b/lua-5.3.3/src/ldo.h @@ -0,0 +1,58 @@ +/* +** $Id: ldo.h,v 2.29 2015/12/21 13:02:14 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" + + +/* +** Macro to check stack size and grow stack if needed. Parameters +** 'pre'/'pos' allow the macro to preserve a pointer into the +** stack across reallocations, doing the work only when needed. +** 'condmovestack' is used in heavy tests to force a stack reallocation +** at every check. +*/ +#define luaD_checkstackaux(L,n,pre,pos) \ + if (L->stack_last - L->top <= (n)) \ + { pre; luaD_growstack(L, n); pos; } else { condmovestack(L,pre,pos); } + +/* In general, 'pre'/'pos' are empty (nothing to save) */ +#define luaD_checkstack(L,n) luaD_checkstackaux(L,n,(void)0,(void)0) + + + +#define savestack(L,p) ((char *)(p) - (char *)L->stack) +#define restorestack(L,n) ((TValue *)((char *)L->stack + (n))) + + +/* 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, + const char *mode); +LUAI_FUNC void luaD_hook (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 void luaD_callnoyield (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, CallInfo *ci, StkId firstResult, + int nres); +LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); +LUAI_FUNC void luaD_growstack (lua_State *L, int n); +LUAI_FUNC void luaD_shrinkstack (lua_State *L); +LUAI_FUNC void luaD_inctop (lua_State *L); + +LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode); +LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); + +#endif + diff --git a/lua-5.3.3/src/ldump.c b/lua-5.3.3/src/ldump.c new file mode 100644 index 0000000..016e300 --- /dev/null +++ b/lua-5.3.3/src/ldump.c @@ -0,0 +1,215 @@ +/* +** $Id: ldump.c,v 2.37 2015/10/08 15:53:49 roberto Exp $ +** save precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define ldump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lundump.h" + + +typedef struct { + lua_State *L; + lua_Writer writer; + void *data; + int strip; + int status; +} DumpState; + + +/* +** All high-level dumps go through DumpVector; you can change it to +** change the endianness of the result +*/ +#define DumpVector(v,n,D) DumpBlock(v,(n)*sizeof((v)[0]),D) + +#define DumpLiteral(s,D) DumpBlock(s, sizeof(s) - sizeof(char), D) + + +static void DumpBlock (const void *b, size_t size, DumpState *D) { + if (D->status == 0 && size > 0) { + lua_unlock(D->L); + D->status = (*D->writer)(D->L, b, size, D->data); + lua_lock(D->L); + } +} + + +#define DumpVar(x,D) DumpVector(&x,1,D) + + +static void DumpByte (int y, DumpState *D) { + lu_byte x = (lu_byte)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 DumpInteger (lua_Integer x, DumpState *D) { + DumpVar(x, D); +} + + +static void DumpString (const TString *s, DumpState *D) { + if (s == NULL) + DumpByte(0, D); + else { + size_t size = tsslen(s) + 1; /* include trailing '\0' */ + const char *str = getstr(s); + if (size < 0xFF) + DumpByte(cast_int(size), D); + else { + DumpByte(0xFF, D); + DumpVar(size, D); + } + DumpVector(str, size - 1, D); /* no need to save '\0' */ + } +} + + +static void DumpCode (const Proto *f, DumpState *D) { + DumpInt(f->sizecode, D); + DumpVector(f->code, f->sizecode, D); +} + + +static void DumpFunction(const Proto *f, TString *psource, DumpState *D); + +static void DumpConstants (const Proto *f, DumpState *D) { + int i; + int n = f->sizek; + DumpInt(n, D); + for (i = 0; i < n; i++) { + const TValue *o = &f->k[i]; + DumpByte(ttype(o), D); + switch (ttype(o)) { + case LUA_TNIL: + break; + case LUA_TBOOLEAN: + DumpByte(bvalue(o), D); + break; + case LUA_TNUMFLT: + DumpNumber(fltvalue(o), D); + break; + case LUA_TNUMINT: + DumpInteger(ivalue(o), D); + break; + case LUA_TSHRSTR: + case LUA_TLNGSTR: + DumpString(tsvalue(o), D); + break; + default: + lua_assert(0); + } + } +} + + +static void DumpProtos (const Proto *f, DumpState *D) { + int i; + int n = f->sizep; + DumpInt(n, D); + for (i = 0; i < n; i++) + DumpFunction(f->p[i], f->source, D); +} + + +static void DumpUpvalues (const Proto *f, DumpState *D) { + int i, n = f->sizeupvalues; + DumpInt(n, D); + for (i = 0; i < n; i++) { + DumpByte(f->upvalues[i].instack, D); + DumpByte(f->upvalues[i].idx, D); + } +} + + +static void DumpDebug (const Proto *f, DumpState *D) { + int i, n; + n = (D->strip) ? 0 : f->sizelineinfo; + DumpInt(n, D); + DumpVector(f->lineinfo, n, D); + n = (D->strip) ? 0 : f->sizelocvars; + DumpInt(n, D); + for (i = 0; i < n; i++) { + DumpString(f->locvars[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; i < n; i++) + DumpString(f->upvalues[i].name, D); +} + + +static void DumpFunction (const Proto *f, TString *psource, DumpState *D) { + if (D->strip || f->source == psource) + DumpString(NULL, D); /* no debug info or same source as its parent */ + else + DumpString(f->source, D); + DumpInt(f->linedefined, D); + DumpInt(f->lastlinedefined, D); + DumpByte(f->numparams, D); + DumpByte(f->is_vararg, D); + DumpByte(f->maxstacksize, D); + DumpCode(f, D); + DumpConstants(f, D); + DumpUpvalues(f, D); + DumpProtos(f, D); + DumpDebug(f, D); +} + + +static void DumpHeader (DumpState *D) { + DumpLiteral(LUA_SIGNATURE, D); + DumpByte(LUAC_VERSION, D); + DumpByte(LUAC_FORMAT, D); + DumpLiteral(LUAC_DATA, D); + DumpByte(sizeof(int), D); + DumpByte(sizeof(size_t), D); + DumpByte(sizeof(Instruction), D); + DumpByte(sizeof(lua_Integer), D); + DumpByte(sizeof(lua_Number), D); + DumpInteger(LUAC_INT, D); + DumpNumber(LUAC_NUM, 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); + DumpByte(f->sizeupvalues, &D); + DumpFunction(f, NULL, &D); + return D.status; +} + diff --git a/lua-5.3.3/src/lfunc.c b/lua-5.3.3/src/lfunc.c new file mode 100644 index 0000000..67967da --- /dev/null +++ b/lua-5.3.3/src/lfunc.c @@ -0,0 +1,151 @@ +/* +** $Id: lfunc.c,v 2.45 2014/11/02 19:19:04 roberto Exp $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#define lfunc_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +CClosure *luaF_newCclosure (lua_State *L, int n) { + GCObject *o = luaC_newobj(L, LUA_TCCL, sizeCclosure(n)); + CClosure *c = gco2ccl(o); + c->nupvalues = cast_byte(n); + return c; +} + + +LClosure *luaF_newLclosure (lua_State *L, int n) { + GCObject *o = luaC_newobj(L, LUA_TLCL, sizeLclosure(n)); + LClosure *c = gco2lcl(o); + c->p = NULL; + c->nupvalues = cast_byte(n); + while (n--) c->upvals[n] = NULL; + return c; +} + +/* +** fill a closure with new closed upvalues +*/ +void luaF_initupvals (lua_State *L, LClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) { + UpVal *uv = luaM_new(L, UpVal); + uv->refcount = 1; + uv->v = &uv->u.value; /* make it closed */ + setnilvalue(uv->v); + cl->upvals[i] = uv; + } +} + + +UpVal *luaF_findupval (lua_State *L, StkId level) { + UpVal **pp = &L->openupval; + UpVal *p; + UpVal *uv; + lua_assert(isintwups(L) || L->openupval == NULL); + while (*pp != NULL && (p = *pp)->v >= level) { + lua_assert(upisopen(p)); + if (p->v == level) /* found a corresponding upvalue? */ + return p; /* return it */ + pp = &p->u.open.next; + } + /* not found: create a new upvalue */ + uv = luaM_new(L, UpVal); + uv->refcount = 0; + uv->u.open.next = *pp; /* link it to list of open upvalues */ + uv->u.open.touched = 1; + *pp = uv; + uv->v = level; /* current value lives in the stack */ + if (!isintwups(L)) { /* thread not in list of threads with upvalues? */ + L->twups = G(L)->twups; /* link it to the list */ + G(L)->twups = L; + } + return uv; +} + + +void luaF_close (lua_State *L, StkId level) { + UpVal *uv; + while (L->openupval != NULL && (uv = L->openupval)->v >= level) { + lua_assert(upisopen(uv)); + L->openupval = uv->u.open.next; /* remove from 'open' list */ + if (uv->refcount == 0) /* no references? */ + luaM_free(L, uv); /* free upvalue */ + else { + setobj(L, &uv->u.value, uv->v); /* move value to upvalue slot */ + uv->v = &uv->u.value; /* now current value lives here */ + luaC_upvalbarrier(L, uv); + } + } +} + + +Proto *luaF_newproto (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_TPROTO, sizeof(Proto)); + Proto *f = gco2p(o); + f->k = NULL; + f->sizek = 0; + f->p = NULL; + f->sizep = 0; + f->code = NULL; + f->cache = NULL; + f->sizecode = 0; + f->lineinfo = NULL; + f->sizelineinfo = 0; + f->upvalues = NULL; + f->sizeupvalues = 0; + f->numparams = 0; + f->is_vararg = 0; + f->maxstacksize = 0; + f->locvars = NULL; + f->sizelocvars = 0; + 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); + luaM_freearray(L, f->p, f->sizep); + luaM_freearray(L, f->k, f->sizek); + luaM_freearray(L, f->lineinfo, f->sizelineinfo); + luaM_freearray(L, f->locvars, f->sizelocvars); + luaM_freearray(L, f->upvalues, f->sizeupvalues); + luaM_free(L, f); +} + + +/* +** 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/lua-5.3.3/src/lfunc.h b/lua-5.3.3/src/lfunc.h new file mode 100644 index 0000000..2eeb0d5 --- /dev/null +++ b/lua-5.3.3/src/lfunc.h @@ -0,0 +1,61 @@ +/* +** $Id: lfunc.h,v 2.15 2015/01/13 15:49:11 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))) + + +/* test whether thread is in 'twups' list */ +#define isintwups(L) (L->twups != L) + + +/* +** maximum number of upvalues in a closure (both C and Lua). (Value +** must fit in a VM register.) +*/ +#define MAXUPVAL 255 + + +/* +** Upvalues for Lua closures +*/ +struct UpVal { + TValue *v; /* points to stack or to its own value */ + lu_mem refcount; /* reference counter */ + union { + struct { /* (when open) */ + UpVal *next; /* linked list */ + int touched; /* mark to avoid cycles with dead threads */ + } open; + TValue value; /* the value (when closed) */ + } u; +}; + +#define upisopen(up) ((up)->v != &(up)->u.value) + + +LUAI_FUNC Proto *luaF_newproto (lua_State *L); +LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nelems); +LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nelems); +LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); +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 const char *luaF_getlocalname (const Proto *func, int local_number, + int pc); + + +#endif diff --git a/lua-5.3.3/src/lgc.c b/lua-5.3.3/src/lgc.c new file mode 100644 index 0000000..7c29fb0 --- /dev/null +++ b/lua-5.3.3/src/lgc.c @@ -0,0 +1,1176 @@ +/* +** $Id: lgc.c,v 2.212 2016/03/31 19:02:03 roberto Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#define lgc_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#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" + + +/* +** internal state for collector while inside the atomic phase. The +** collector should never be in this state while running regular code. +*/ +#define GCSinsideatomic (GCSpause + 1) + +/* +** cost of sweeping one element (the size of a small object divided +** by some adjust for the sweep speed) +*/ +#define GCSWEEPCOST ((sizeof(TString) + 4) / 4) + +/* maximum number of elements to sweep in each single step */ +#define GCSWEEPMAX (cast_int((GCSTEPSIZE / GCSWEEPCOST) / 4)) + +/* cost of calling one finalizer */ +#define GCFINALIZECOST GCSWEEPCOST + + +/* +** macro to adjust 'stepmul': 'stepmul' is actually used like +** 'stepmul / STEPMULADJ' (value chosen by tests) +*/ +#define STEPMULADJ 200 + + +/* +** macro to adjust 'pause': 'pause' is actually used like +** 'pause / PAUSEADJ' (value chosen by tests) +*/ +#define PAUSEADJ 100 + + +/* +** 'makewhite' erases all color bits then sets only the current white +** bit +*/ +#define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS)) +#define makewhite(g,x) \ + (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g))) + +#define white2gray(x) resetbits(x->marked, WHITEBITS) +#define black2gray(x) resetbit(x->marked, BLACKBIT) + + +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + +#define checkdeadkey(n) lua_assert(!ttisdeadkey(gkey(n)) || ttisnil(gval(n))) + + +#define checkconsistency(obj) \ + lua_longassert(!iscollectable(obj) || righttt(obj)) + + +#define markvalue(g,o) { checkconsistency(o); \ + if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); } + +#define markobject(g,t) { if (iswhite(t)) reallymarkobject(g, obj2gco(t)); } + +/* +** mark an object that can be NULL (either because it is really optional, +** or it was stripped as debug info, or inside an uncompleted structure) +*/ +#define markobjectN(g,t) { if (t) markobject(g,t); } + +static void reallymarkobject (global_State *g, GCObject *o); + + +/* +** {====================================================== +** Generic functions +** ======================================================= +*/ + + +/* +** one after last element in a hash array +*/ +#define gnodelast(h) gnode(h, cast(size_t, sizenode(h))) + + +/* +** link collectable object 'o' into list pointed by 'p' +*/ +#define linkgclist(o,p) ((o)->gclist = (p), (p) = obj2gco(o)) + + +/* +** If key is not marked, mark its entry as dead. This allows key to be +** collected, but keeps its entry in the table. A dead node is needed +** when Lua looks up for a key (it may be part of a chain) and when +** traversing a weak table (key might be removed from the table during +** traversal). Other places never manipulate dead keys, because its +** associated nil value is enough to signal that the entry is logically +** empty. +*/ +static void removeentry (Node *n) { + lua_assert(ttisnil(gval(n))); + if (valiswhite(gkey(n))) + setdeadvalue(wgkey(n)); /* unused and unmarked key; remove it */ +} + + +/* +** 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 objects +** being finalized, keep them in keys, but not in values +*/ +static int iscleared (global_State *g, const TValue *o) { + if (!iscollectable(o)) return 0; + else if (ttisstring(o)) { + markobject(g, tsvalue(o)); /* strings are 'values', so are never weak */ + return 0; + } + else return iswhite(gcvalue(o)); +} + + +/* +** barrier that moves collector forward, that is, mark the white object +** being pointed by a black object. (If in sweep phase, clear the black +** object to white [sweep it] to avoid other barrier calls for this +** same object.) +*/ +void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { + global_State *g = G(L); + lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); + if (keepinvariant(g)) /* must keep invariant? */ + reallymarkobject(g, v); /* restore invariant */ + else { /* sweep phase */ + lua_assert(issweepphase(g)); + makewhite(g, o); /* mark main obj. as white to avoid other barriers */ + } +} + + +/* +** barrier that moves collector backward, that is, mark the black object +** pointing to a white object as gray again. +*/ +void luaC_barrierback_ (lua_State *L, Table *t) { + global_State *g = G(L); + lua_assert(isblack(t) && !isdead(g, t)); + black2gray(t); /* make table gray (again) */ + linkgclist(t, g->grayagain); +} + + +/* +** barrier for assignments to closed upvalues. Because upvalues are +** shared among closures, it is impossible to know the color of all +** closures pointing to it. So, we assume that the object being assigned +** must be marked. +*/ +void luaC_upvalbarrier_ (lua_State *L, UpVal *uv) { + global_State *g = G(L); + GCObject *o = gcvalue(uv->v); + lua_assert(!upisopen(uv)); /* ensured by macro luaC_upvalbarrier */ + if (keepinvariant(g)) + markobject(g, o); +} + + +void luaC_fix (lua_State *L, GCObject *o) { + global_State *g = G(L); + lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */ + white2gray(o); /* they will be gray forever */ + g->allgc = o->next; /* remove object from 'allgc' list */ + o->next = g->fixedgc; /* link it to 'fixedgc' list */ + g->fixedgc = o; +} + + +/* +** create a new collectable object (with given type and size) and link +** it to 'allgc' list. +*/ +GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { + global_State *g = G(L); + GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); + o->marked = luaC_white(g); + o->tt = tt; + o->next = g->allgc; + g->allgc = o; + return o; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Mark functions +** ======================================================= +*/ + + +/* +** mark an object. Userdata, strings, and closed upvalues are visited +** and turned black here. Other objects are marked gray and added +** to appropriate list to be visited (and turned black) later. (Open +** upvalues are already linked in 'headuv' list.) +*/ +static void reallymarkobject (global_State *g, GCObject *o) { + reentry: + white2gray(o); + switch (o->tt) { + case LUA_TSHRSTR: { + gray2black(o); + g->GCmemtrav += sizelstring(gco2ts(o)->shrlen); + break; + } + case LUA_TLNGSTR: { + gray2black(o); + g->GCmemtrav += sizelstring(gco2ts(o)->u.lnglen); + break; + } + case LUA_TUSERDATA: { + TValue uvalue; + markobjectN(g, gco2u(o)->metatable); /* mark its metatable */ + gray2black(o); + g->GCmemtrav += sizeudata(gco2u(o)); + getuservalue(g->mainthread, gco2u(o), &uvalue); + if (valiswhite(&uvalue)) { /* markvalue(g, &uvalue); */ + o = gcvalue(&uvalue); + goto reentry; + } + break; + } + case LUA_TLCL: { + linkgclist(gco2lcl(o), g->gray); + break; + } + case LUA_TCCL: { + linkgclist(gco2ccl(o), g->gray); + break; + } + case LUA_TTABLE: { + linkgclist(gco2t(o), g->gray); + break; + } + case LUA_TTHREAD: { + linkgclist(gco2th(o), g->gray); + break; + } + case LUA_TPROTO: { + linkgclist(gco2p(o), g->gray); + break; + } + default: lua_assert(0); break; + } +} + + +/* +** mark metamethods for basic types +*/ +static void markmt (global_State *g) { + int i; + for (i=0; i < LUA_NUMTAGS; i++) + markobjectN(g, g->mt[i]); +} + + +/* +** mark all objects in list of being-finalized +*/ +static void markbeingfnz (global_State *g) { + GCObject *o; + for (o = g->tobefnz; o != NULL; o = o->next) + markobject(g, o); +} + + +/* +** Mark all values stored in marked open upvalues from non-marked threads. +** (Values from marked threads were already marked when traversing the +** thread.) Remove from the list threads that no longer have upvalues and +** not-marked threads. +*/ +static void remarkupvals (global_State *g) { + lua_State *thread; + lua_State **p = &g->twups; + while ((thread = *p) != NULL) { + lua_assert(!isblack(thread)); /* threads are never black */ + if (isgray(thread) && thread->openupval != NULL) + p = &thread->twups; /* keep marked thread with upvalues in the list */ + else { /* thread is not marked or without upvalues */ + UpVal *uv; + *p = thread->twups; /* remove thread from the list */ + thread->twups = thread; /* mark that it is out of list */ + for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) { + if (uv->u.open.touched) { + markvalue(g, uv->v); /* remark upvalue's value */ + uv->u.open.touched = 0; + } + } + } + } +} + + +/* +** mark root set and reset all gray lists, to start a new collection +*/ +static void restartcollection (global_State *g) { + g->gray = g->grayagain = NULL; + g->weak = g->allweak = g->ephemeron = NULL; + markobject(g, g->mainthread); + markvalue(g, &g->l_registry); + markmt(g); + markbeingfnz(g); /* mark any finalizing object left from previous cycle */ +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Traverse functions +** ======================================================= +*/ + +/* +** Traverse a table with weak values and link it to proper list. During +** propagate phase, keep it in 'grayagain' list, to be revisited in the +** atomic phase. In the atomic phase, if table has any white value, +** put it in 'weak' list, to be cleared. +*/ +static void traverseweakvalue (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + /* if there is array part, assume it may have white values (it is not + worth traversing it now just to check) */ + int hasclears = (h->sizearray > 0); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + checkdeadkey(n); + if (ttisnil(gval(n))) /* entry is empty? */ + removeentry(n); /* remove it */ + else { + lua_assert(!ttisnil(gkey(n))); + markvalue(g, gkey(n)); /* mark key */ + if (!hasclears && iscleared(g, gval(n))) /* is there a white value? */ + hasclears = 1; /* table will have to be cleared */ + } + } + if (g->gcstate == GCSpropagate) + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ + else if (hasclears) + linkgclist(h, g->weak); /* has to be cleared later */ +} + + +/* +** Traverse an ephemeron table and link it to proper list. Returns true +** iff any object was marked during this traversal (which implies that +** convergence has to continue). During propagation phase, keep table +** in 'grayagain' list, to be visited again in the atomic phase. In +** the atomic phase, if table has any white->white entry, it has to +** be revisited during ephemeron convergence (as that key may turn +** black). Otherwise, if it has any white key, table has to be cleared +** (in the atomic phase). +*/ +static int traverseephemeron (global_State *g, Table *h) { + int marked = 0; /* true if an object is marked in this traversal */ + int hasclears = 0; /* true if table has white keys */ + int hasww = 0; /* true if table has entry "white-key -> white-value" */ + Node *n, *limit = gnodelast(h); + unsigned int i; + /* traverse array part */ + for (i = 0; i < h->sizearray; i++) { + if (valiswhite(&h->array[i])) { + marked = 1; + reallymarkobject(g, gcvalue(&h->array[i])); + } + } + /* traverse hash part */ + for (n = gnode(h, 0); n < limit; n++) { + checkdeadkey(n); + if (ttisnil(gval(n))) /* entry is empty? */ + removeentry(n); /* remove it */ + else if (iscleared(g, gkey(n))) { /* key is not marked (yet)? */ + hasclears = 1; /* table must be cleared */ + if (valiswhite(gval(n))) /* value not marked yet? */ + hasww = 1; /* white-white entry */ + } + else if (valiswhite(gval(n))) { /* value not marked yet? */ + marked = 1; + reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ + } + } + /* link table into proper list */ + if (g->gcstate == GCSpropagate) + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ + else if (hasww) /* table has white->white entries? */ + linkgclist(h, g->ephemeron); /* have to propagate again */ + else if (hasclears) /* table has white keys? */ + linkgclist(h, g->allweak); /* may have to clean white keys */ + return marked; +} + + +static void traversestrongtable (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + unsigned int i; + for (i = 0; i < h->sizearray; i++) /* traverse array part */ + markvalue(g, &h->array[i]); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + checkdeadkey(n); + if (ttisnil(gval(n))) /* entry is empty? */ + removeentry(n); /* remove it */ + else { + lua_assert(!ttisnil(gkey(n))); + markvalue(g, gkey(n)); /* mark key */ + markvalue(g, gval(n)); /* mark value */ + } + } +} + + +static lu_mem traversetable (global_State *g, Table *h) { + const char *weakkey, *weakvalue; + const TValue *mode = gfasttm(g, h->metatable, TM_MODE); + markobjectN(g, h->metatable); + if (mode && ttisstring(mode) && /* is there a weak mode? */ + ((weakkey = strchr(svalue(mode), 'k')), + (weakvalue = strchr(svalue(mode), 'v')), + (weakkey || weakvalue))) { /* is really weak? */ + black2gray(h); /* keep table gray */ + if (!weakkey) /* strong keys? */ + traverseweakvalue(g, h); + else if (!weakvalue) /* strong values? */ + traverseephemeron(g, h); + else /* all weak */ + linkgclist(h, g->allweak); /* nothing to traverse now */ + } + else /* not weak */ + traversestrongtable(g, h); + return sizeof(Table) + sizeof(TValue) * h->sizearray + + sizeof(Node) * cast(size_t, sizenode(h)); +} + + +/* +** Traverse a prototype. (While a prototype is being build, its +** arrays can be larger than needed; the extra slots are filled with +** NULL, so the use of 'markobjectN') +*/ +static int traverseproto (global_State *g, Proto *f) { + int i; + if (f->cache && iswhite(f->cache)) + f->cache = NULL; /* allow cache to be collected */ + markobjectN(g, f->source); + for (i = 0; i < f->sizek; i++) /* mark literals */ + markvalue(g, &f->k[i]); + for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */ + markobjectN(g, f->upvalues[i].name); + for (i = 0; i < f->sizep; i++) /* mark nested protos */ + markobjectN(g, f->p[i]); + for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */ + markobjectN(g, f->locvars[i].varname); + return sizeof(Proto) + sizeof(Instruction) * f->sizecode + + sizeof(Proto *) * f->sizep + + sizeof(TValue) * f->sizek + + sizeof(int) * f->sizelineinfo + + sizeof(LocVar) * f->sizelocvars + + sizeof(Upvaldesc) * f->sizeupvalues; +} + + +static lu_mem traverseCclosure (global_State *g, CClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ + markvalue(g, &cl->upvalue[i]); + return sizeCclosure(cl->nupvalues); +} + +/* +** open upvalues point to values in a thread, so those values should +** be marked when the thread is traversed except in the atomic phase +** (because then the value cannot be changed by the thread and the +** thread may not be traversed again) +*/ +static lu_mem traverseLclosure (global_State *g, LClosure *cl) { + int i; + markobjectN(g, cl->p); /* mark its prototype */ + for (i = 0; i < cl->nupvalues; i++) { /* mark its upvalues */ + UpVal *uv = cl->upvals[i]; + if (uv != NULL) { + if (upisopen(uv) && g->gcstate != GCSinsideatomic) + uv->u.open.touched = 1; /* can be marked in 'remarkupvals' */ + else + markvalue(g, uv->v); + } + } + return sizeLclosure(cl->nupvalues); +} + + +static lu_mem traversethread (global_State *g, lua_State *th) { + StkId o = th->stack; + if (o == NULL) + return 1; /* stack not completely built yet */ + lua_assert(g->gcstate == GCSinsideatomic || + th->openupval == NULL || isintwups(th)); + for (; o < th->top; o++) /* mark live elements in the stack */ + markvalue(g, o); + if (g->gcstate == GCSinsideatomic) { /* final traversal? */ + StkId lim = th->stack + th->stacksize; /* real end of stack */ + for (; o < lim; o++) /* clear not-marked stack slice */ + setnilvalue(o); + /* 'remarkupvals' may have removed thread from 'twups' list */ + if (!isintwups(th) && th->openupval != NULL) { + th->twups = g->twups; /* link it back to the list */ + g->twups = th; + } + } + else if (g->gckind != KGC_EMERGENCY) + luaD_shrinkstack(th); /* do not change stack in emergency cycle */ + return (sizeof(lua_State) + sizeof(TValue) * th->stacksize + + sizeof(CallInfo) * th->nci); +} + + +/* +** traverse one gray object, turning it to black (except for threads, +** which are always gray). +*/ +static void propagatemark (global_State *g) { + lu_mem size; + GCObject *o = g->gray; + lua_assert(isgray(o)); + gray2black(o); + switch (o->tt) { + case LUA_TTABLE: { + Table *h = gco2t(o); + g->gray = h->gclist; /* remove from 'gray' list */ + size = traversetable(g, h); + break; + } + case LUA_TLCL: { + LClosure *cl = gco2lcl(o); + g->gray = cl->gclist; /* remove from 'gray' list */ + size = traverseLclosure(g, cl); + break; + } + case LUA_TCCL: { + CClosure *cl = gco2ccl(o); + g->gray = cl->gclist; /* remove from 'gray' list */ + size = traverseCclosure(g, cl); + break; + } + case LUA_TTHREAD: { + lua_State *th = gco2th(o); + g->gray = th->gclist; /* remove from 'gray' list */ + linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ + black2gray(o); + size = traversethread(g, th); + break; + } + case LUA_TPROTO: { + Proto *p = gco2p(o); + g->gray = p->gclist; /* remove from 'gray' list */ + size = traverseproto(g, p); + break; + } + default: lua_assert(0); return; + } + g->GCmemtrav += size; +} + + +static void propagateall (global_State *g) { + while (g->gray) propagatemark(g); +} + + +static void convergeephemerons (global_State *g) { + int changed; + do { + GCObject *w; + GCObject *next = g->ephemeron; /* get ephemeron list */ + g->ephemeron = NULL; /* tables may return to this list when traversed */ + changed = 0; + while ((w = next) != NULL) { + next = gco2t(w)->gclist; + if (traverseephemeron(g, gco2t(w))) { /* traverse marked some value? */ + propagateall(g); /* propagate changes */ + changed = 1; /* will have to revisit all ephemeron tables */ + } + } + } while (changed); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Sweep Functions +** ======================================================= +*/ + + +/* +** clear entries with unmarked keys from all weaktables in list 'l' up +** to element 'f' +*/ +static void clearkeys (global_State *g, GCObject *l, GCObject *f) { + for (; l != f; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *n, *limit = gnodelast(h); + for (n = gnode(h, 0); n < limit; n++) { + if (!ttisnil(gval(n)) && (iscleared(g, gkey(n)))) { + setnilvalue(gval(n)); /* remove value ... */ + removeentry(n); /* and remove entry from table */ + } + } + } +} + + +/* +** clear entries with unmarked values from all weaktables in list 'l' up +** to element 'f' +*/ +static void clearvalues (global_State *g, GCObject *l, GCObject *f) { + for (; l != f; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *n, *limit = gnodelast(h); + unsigned int i; + for (i = 0; i < h->sizearray; i++) { + TValue *o = &h->array[i]; + if (iscleared(g, o)) /* value was collected? */ + setnilvalue(o); /* remove value */ + } + for (n = gnode(h, 0); n < limit; n++) { + if (!ttisnil(gval(n)) && iscleared(g, gval(n))) { + setnilvalue(gval(n)); /* remove value ... */ + removeentry(n); /* and remove entry from table */ + } + } + } +} + + +void luaC_upvdeccount (lua_State *L, UpVal *uv) { + lua_assert(uv->refcount > 0); + uv->refcount--; + if (uv->refcount == 0 && !upisopen(uv)) + luaM_free(L, uv); +} + + +static void freeLclosure (lua_State *L, LClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) { + UpVal *uv = cl->upvals[i]; + if (uv) + luaC_upvdeccount(L, uv); + } + luaM_freemem(L, cl, sizeLclosure(cl->nupvalues)); +} + + +static void freeobj (lua_State *L, GCObject *o) { + switch (o->tt) { + case LUA_TPROTO: luaF_freeproto(L, gco2p(o)); break; + case LUA_TLCL: { + freeLclosure(L, gco2lcl(o)); + break; + } + case LUA_TCCL: { + luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues)); + break; + } + case LUA_TTABLE: luaH_free(L, gco2t(o)); break; + case LUA_TTHREAD: luaE_freethread(L, gco2th(o)); break; + case LUA_TUSERDATA: luaM_freemem(L, o, sizeudata(gco2u(o))); break; + case LUA_TSHRSTR: + luaS_remove(L, gco2ts(o)); /* remove it from hash table */ + luaM_freemem(L, o, sizelstring(gco2ts(o)->shrlen)); + break; + case LUA_TLNGSTR: { + luaM_freemem(L, o, sizelstring(gco2ts(o)->u.lnglen)); + 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); + + +/* +** sweep at most 'count' elements from a list of GCObjects erasing dead +** objects, where a dead object is one marked with the old (non current) +** white; change all non-dead objects back to white, preparing for next +** collection cycle. Return where to continue the traversal or NULL if +** list is finished. +*/ +static GCObject **sweeplist (lua_State *L, GCObject **p, lu_mem count) { + global_State *g = G(L); + int ow = otherwhite(g); + int white = luaC_white(g); /* current white */ + while (*p != NULL && count-- > 0) { + GCObject *curr = *p; + int marked = curr->marked; + if (isdeadm(ow, marked)) { /* is 'curr' dead? */ + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* change mark to 'white' */ + curr->marked = cast_byte((marked & maskcolors) | white); + p = &curr->next; /* go to next element */ + } + } + return (*p == NULL) ? NULL : p; +} + + +/* +** sweep a list until a live object (or end of list) +*/ +static GCObject **sweeptolive (lua_State *L, GCObject **p) { + GCObject **old = p; + do { + p = sweeplist(L, p, 1); + } while (p == old); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Finalization +** ======================================================= +*/ + +/* +** If possible, shrink string table +*/ +static void checkSizes (lua_State *L, global_State *g) { + if (g->gckind != KGC_EMERGENCY) { + l_mem olddebt = g->GCdebt; + if (g->strt.nuse < g->strt.size / 4) /* string table too big? */ + luaS_resize(L, g->strt.size / 2); /* shrink it a little */ + g->GCestimate += g->GCdebt - olddebt; /* update estimate */ + } +} + + +static GCObject *udata2finalize (global_State *g) { + GCObject *o = g->tobefnz; /* get first element */ + lua_assert(tofinalize(o)); + g->tobefnz = o->next; /* remove it from 'tobefnz' list */ + o->next = g->allgc; /* return it to 'allgc' list */ + g->allgc = o; + resetbit(o->marked, FINALIZEDBIT); /* object is "normal" again */ + if (issweepphase(g)) + makewhite(g, o); /* "sweep" object */ + return o; +} + + +static void dothecall (lua_State *L, void *ud) { + UNUSED(ud); + luaD_callnoyield(L, L->top - 2, 0); +} + + +static void GCTM (lua_State *L, int propagateerrors) { + global_State *g = G(L); + const TValue *tm; + TValue v; + setgcovalue(L, &v, udata2finalize(g)); + tm = luaT_gettmbyobj(L, &v, TM_GC); + if (tm != NULL && ttisfunction(tm)) { /* is there a finalizer? */ + int status; + lu_byte oldah = L->allowhook; + int running = g->gcrunning; + L->allowhook = 0; /* stop debug hooks during GC metamethod */ + g->gcrunning = 0; /* avoid GC steps */ + setobj2s(L, L->top, tm); /* push finalizer... */ + setobj2s(L, L->top + 1, &v); /* ... and its argument */ + L->top += 2; /* and (next line) call the finalizer */ + status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0); + L->allowhook = oldah; /* restore hooks */ + g->gcrunning = running; /* restore state */ + if (status != LUA_OK && propagateerrors) { /* error while running __gc? */ + if (status == LUA_ERRRUN) { /* is there an error object? */ + const char *msg = (ttisstring(L->top - 1)) + ? svalue(L->top - 1) + : "no message"; + luaO_pushfstring(L, "error in __gc metamethod (%s)", msg); + status = LUA_ERRGCMM; /* error in __gc metamethod */ + } + luaD_throw(L, status); /* re-throw error */ + } + } +} + + +/* +** call a few (up to 'g->gcfinnum') finalizers +*/ +static int runafewfinalizers (lua_State *L) { + global_State *g = G(L); + unsigned int i; + lua_assert(!g->tobefnz || g->gcfinnum > 0); + for (i = 0; g->tobefnz && i < g->gcfinnum; i++) + GCTM(L, 1); /* call one finalizer */ + g->gcfinnum = (!g->tobefnz) ? 0 /* nothing more to finalize? */ + : g->gcfinnum * 2; /* else call a few more next time */ + return i; +} + + +/* +** call all pending finalizers +*/ +static void callallpendingfinalizers (lua_State *L) { + global_State *g = G(L); + while (g->tobefnz) + GCTM(L, 0); +} + + +/* +** find last 'next' field in list 'p' list (to add elements in its end) +*/ +static GCObject **findlast (GCObject **p) { + while (*p != NULL) + p = &(*p)->next; + return p; +} + + +/* +** move all unreachable objects (or 'all' objects) that need +** finalization from list 'finobj' to list 'tobefnz' (to be finalized) +*/ +static void separatetobefnz (global_State *g, int all) { + GCObject *curr; + GCObject **p = &g->finobj; + GCObject **lastnext = findlast(&g->tobefnz); + while ((curr = *p) != NULL) { /* traverse all finalizable objects */ + lua_assert(tofinalize(curr)); + if (!(iswhite(curr) || all)) /* not being collected? */ + p = &curr->next; /* don't bother with it */ + else { + *p = curr->next; /* remove 'curr' from 'finobj' list */ + curr->next = *lastnext; /* link at the end of 'tobefnz' list */ + *lastnext = curr; + lastnext = &curr->next; + } + } +} + + +/* +** if object 'o' has a finalizer, remove it from 'allgc' list (must +** search the list to find it) and link it in 'finobj' list. +*/ +void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { + global_State *g = G(L); + if (tofinalize(o) || /* obj. is already marked... */ + gfasttm(g, mt, TM_GC) == NULL) /* or has no finalizer? */ + return; /* nothing to be done */ + else { /* move 'o' to 'finobj' list */ + GCObject **p; + if (issweepphase(g)) { + makewhite(g, o); /* "sweep" object 'o' */ + if (g->sweepgc == &o->next) /* should not remove 'sweepgc' object */ + g->sweepgc = sweeptolive(L, g->sweepgc); /* change 'sweepgc' */ + } + /* search for pointer pointing to 'o' */ + for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ } + *p = o->next; /* remove 'o' from 'allgc' list */ + o->next = g->finobj; /* link it in 'finobj' list */ + g->finobj = o; + l_setbit(o->marked, FINALIZEDBIT); /* mark it as such */ + } +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** GC control +** ======================================================= +*/ + + +/* +** Set a reasonable "time" to wait before starting a new GC cycle; cycle +** will start when memory use hits threshold. (Division by 'estimate' +** should be OK: it cannot be zero (because Lua cannot even start with +** less than PAUSEADJ bytes). +*/ +static void setpause (global_State *g) { + l_mem threshold, debt; + l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ + lua_assert(estimate > 0); + threshold = (g->gcpause < MAX_LMEM / estimate) /* overflow? */ + ? estimate * g->gcpause /* no overflow */ + : MAX_LMEM; /* overflow; truncate to maximum */ + debt = gettotalbytes(g) - threshold; + luaE_setdebt(g, debt); +} + + +/* +** Enter first sweep phase. +** The call to 'sweeplist' tries to make pointer point to an object +** inside the list (instead of to the header), so that the real sweep do +** not need to skip objects created between "now" and the start of the +** real sweep. +*/ +static void entersweep (lua_State *L) { + global_State *g = G(L); + g->gcstate = GCSswpallgc; + lua_assert(g->sweepgc == NULL); + g->sweepgc = sweeplist(L, &g->allgc, 1); +} + + +void luaC_freeallobjects (lua_State *L) { + global_State *g = G(L); + separatetobefnz(g, 1); /* separate all objects with finalizers */ + lua_assert(g->finobj == NULL); + callallpendingfinalizers(L); + lua_assert(g->tobefnz == NULL); + g->currentwhite = WHITEBITS; /* this "white" makes all objects look dead */ + g->gckind = KGC_NORMAL; + sweepwholelist(L, &g->finobj); + sweepwholelist(L, &g->allgc); + sweepwholelist(L, &g->fixedgc); /* collect fixed objects */ + lua_assert(g->strt.nuse == 0); +} + + +static l_mem atomic (lua_State *L) { + global_State *g = G(L); + l_mem work; + GCObject *origweak, *origall; + GCObject *grayagain = g->grayagain; /* save original list */ + lua_assert(g->ephemeron == NULL && g->weak == NULL); + lua_assert(!iswhite(g->mainthread)); + g->gcstate = GCSinsideatomic; + g->GCmemtrav = 0; /* start counting work */ + markobject(g, L); /* mark running thread */ + /* registry and global metatables may be changed by API */ + markvalue(g, &g->l_registry); + markmt(g); /* mark global metatables */ + /* remark occasional upvalues of (maybe) dead threads */ + remarkupvals(g); + propagateall(g); /* propagate changes */ + work = g->GCmemtrav; /* stop counting (do not recount 'grayagain') */ + g->gray = grayagain; + propagateall(g); /* traverse 'grayagain' list */ + g->GCmemtrav = 0; /* restart counting */ + convergeephemerons(g); + /* at this point, all strongly accessible objects are marked. */ + /* Clear values from weak tables, before checking finalizers */ + clearvalues(g, g->weak, NULL); + clearvalues(g, g->allweak, NULL); + origweak = g->weak; origall = g->allweak; + work += g->GCmemtrav; /* stop counting (objects being finalized) */ + separatetobefnz(g, 0); /* separate objects to be finalized */ + g->gcfinnum = 1; /* there may be objects to be finalized */ + markbeingfnz(g); /* mark objects that will be finalized */ + propagateall(g); /* remark, to propagate 'resurrection' */ + g->GCmemtrav = 0; /* restart counting */ + convergeephemerons(g); + /* at this point, all resurrected objects are marked. */ + /* remove dead objects from weak tables */ + clearkeys(g, g->ephemeron, NULL); /* clear keys from all ephemeron tables */ + clearkeys(g, g->allweak, NULL); /* clear keys from all 'allweak' tables */ + /* clear values from resurrected weak tables */ + clearvalues(g, g->weak, origweak); + clearvalues(g, g->allweak, origall); + luaS_clearcache(g); + g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */ + work += g->GCmemtrav; /* complete counting */ + return work; /* estimate of memory marked by 'atomic' */ +} + + +static lu_mem sweepstep (lua_State *L, global_State *g, + int nextstate, GCObject **nextlist) { + if (g->sweepgc) { + l_mem olddebt = g->GCdebt; + g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX); + g->GCestimate += g->GCdebt - olddebt; /* update estimate */ + if (g->sweepgc) /* is there still something to sweep? */ + return (GCSWEEPMAX * GCSWEEPCOST); + } + /* else enter next state */ + g->gcstate = nextstate; + g->sweepgc = nextlist; + return 0; +} + + +static lu_mem singlestep (lua_State *L) { + global_State *g = G(L); + switch (g->gcstate) { + case GCSpause: { + g->GCmemtrav = g->strt.size * sizeof(GCObject*); + restartcollection(g); + g->gcstate = GCSpropagate; + return g->GCmemtrav; + } + case GCSpropagate: { + g->GCmemtrav = 0; + lua_assert(g->gray); + propagatemark(g); + if (g->gray == NULL) /* no more gray objects? */ + g->gcstate = GCSatomic; /* finish propagate phase */ + return g->GCmemtrav; /* memory traversed in this step */ + } + case GCSatomic: { + lu_mem work; + propagateall(g); /* make sure gray list is empty */ + work = atomic(L); /* work is what was traversed by 'atomic' */ + entersweep(L); + g->GCestimate = gettotalbytes(g); /* first estimate */; + return work; + } + case GCSswpallgc: { /* sweep "regular" objects */ + return sweepstep(L, g, GCSswpfinobj, &g->finobj); + } + case GCSswpfinobj: { /* sweep objects with finalizers */ + return sweepstep(L, g, GCSswptobefnz, &g->tobefnz); + } + case GCSswptobefnz: { /* sweep objects to be finalized */ + return sweepstep(L, g, GCSswpend, NULL); + } + case GCSswpend: { /* finish sweeps */ + makewhite(g, g->mainthread); /* sweep main thread */ + checkSizes(L, g); + g->gcstate = GCScallfin; + return 0; + } + case GCScallfin: { /* call remaining finalizers */ + if (g->tobefnz && g->gckind != KGC_EMERGENCY) { + int n = runafewfinalizers(L); + return (n * GCFINALIZECOST); + } + else { /* emergency mode or no more finalizers */ + g->gcstate = GCSpause; /* finish collection */ + return 0; + } + } + default: lua_assert(0); return 0; + } +} + + +/* +** advances the garbage collector until it reaches a state allowed +** by 'statemask' +*/ +void luaC_runtilstate (lua_State *L, int statesmask) { + global_State *g = G(L); + while (!testbit(statesmask, g->gcstate)) + singlestep(L); +} + + +/* +** get GC debt and convert it from Kb to 'work units' (avoid zero debt +** and overflows) +*/ +static l_mem getdebt (global_State *g) { + l_mem debt = g->GCdebt; + int stepmul = g->gcstepmul; + if (debt <= 0) return 0; /* minimal debt */ + else { + debt = (debt / STEPMULADJ) + 1; + debt = (debt < MAX_LMEM / stepmul) ? debt * stepmul : MAX_LMEM; + return debt; + } +} + +/* +** performs a basic GC step when collector is running +*/ +void luaC_step (lua_State *L) { + global_State *g = G(L); + l_mem debt = getdebt(g); /* GC deficit (be paid now) */ + if (!g->gcrunning) { /* not running? */ + luaE_setdebt(g, -GCSTEPSIZE * 10); /* avoid being called too often */ + return; + } + do { /* repeat until pause or enough "credit" (negative debt) */ + lu_mem work = singlestep(L); /* perform one single step */ + debt -= work; + } while (debt > -GCSTEPSIZE && g->gcstate != GCSpause); + if (g->gcstate == GCSpause) + setpause(g); /* pause until next cycle */ + else { + debt = (debt / g->gcstepmul) * STEPMULADJ; /* convert 'work units' to Kb */ + luaE_setdebt(g, debt); + runafewfinalizers(L); + } +} + + +/* +** Performs a full GC cycle; if 'isemergency', set a flag to avoid +** some operations which could change the interpreter state in some +** unexpected ways (running finalizers and shrinking some structures). +** Before running the collection, check 'keepinvariant'; if it is true, +** there may be some objects marked as black, so the collector has +** to sweep all objects to turn them back to white (as white has not +** changed, nothing will be collected). +*/ +void luaC_fullgc (lua_State *L, int isemergency) { + global_State *g = G(L); + lua_assert(g->gckind == KGC_NORMAL); + if (isemergency) g->gckind = KGC_EMERGENCY; /* set flag */ + if (keepinvariant(g)) { /* black objects? */ + entersweep(L); /* sweep everything to turn them back to white */ + } + /* finish any pending sweep phase to start a new cycle */ + luaC_runtilstate(L, bitmask(GCSpause)); + luaC_runtilstate(L, ~bitmask(GCSpause)); /* start new collection */ + luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */ + /* estimate must be correct after a full GC cycle */ + lua_assert(g->GCestimate == gettotalbytes(g)); + luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + g->gckind = KGC_NORMAL; + setpause(g); +} + +/* }====================================================== */ + + diff --git a/lua-5.3.3/src/lgc.h b/lua-5.3.3/src/lgc.h new file mode 100644 index 0000000..aed3e18 --- /dev/null +++ b/lua-5.3.3/src/lgc.h @@ -0,0 +1,147 @@ +/* +** $Id: lgc.h,v 2.91 2015/12/21 13:02:14 roberto Exp $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#ifndef lgc_h +#define lgc_h + + +#include "lobject.h" +#include "lstate.h" + +/* +** Collectable objects may have one of three colors: white, which +** means the object is not marked; gray, which means the +** object is marked, but its references may be not marked; and +** black, which means that the object and all its references are marked. +** The main invariant of the garbage collector, while marking objects, +** is that a black object can never point to a white one. Moreover, +** any gray object must be in a "gray list" (gray, grayagain, weak, +** allweak, ephemeron) so that it can be visited again before finishing +** the collection cycle. These lists have no meaning when the invariant +** is not being enforced (e.g., sweep phase). +*/ + + + +/* how much to allocate before next GC step */ +#if !defined(GCSTEPSIZE) +/* ~100 small strings */ +#define GCSTEPSIZE (cast_int(100 * sizeof(TString))) +#endif + + +/* +** Possible states of the Garbage Collector +*/ +#define GCSpropagate 0 +#define GCSatomic 1 +#define GCSswpallgc 2 +#define GCSswpfinobj 3 +#define GCSswptobefnz 4 +#define GCSswpend 5 +#define GCScallfin 6 +#define GCSpause 7 + + +#define issweepphase(g) \ + (GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend) + + +/* +** macro to tell when main invariant (white objects cannot point to black +** ones) must be kept. During a collection, the sweep +** phase may break the invariant, as objects turned white may point to +** still-black objects. The invariant is restored when sweep ends and +** all objects are white again. +*/ + +#define keepinvariant(g) ((g)->gcstate <= GCSatomic) + + +/* +** some useful 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)) + + +/* Layout for bit use in 'marked' field: */ +#define WHITE0BIT 0 /* object is white (type 0) */ +#define WHITE1BIT 1 /* object is white (type 1) */ +#define BLACKBIT 2 /* object is black */ +#define FINALIZEDBIT 3 /* object has been marked for finalization */ +/* bit 7 is currently used by tests (luaL_checkmemory) */ + +#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) + + +#define iswhite(x) testbits((x)->marked, WHITEBITS) +#define isblack(x) testbit((x)->marked, BLACKBIT) +#define isgray(x) /* neither white nor black */ \ + (!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT))) + +#define tofinalize(x) testbit((x)->marked, FINALIZEDBIT) + +#define otherwhite(g) ((g)->currentwhite ^ WHITEBITS) +#define isdeadm(ow,m) (!(((m) ^ WHITEBITS) & (ow))) +#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked) + +#define changewhite(x) ((x)->marked ^= WHITEBITS) +#define gray2black(x) l_setbit((x)->marked, BLACKBIT) + +#define luaC_white(g) cast(lu_byte, (g)->currentwhite & WHITEBITS) + + +/* +** Does one step of collection when debt becomes positive. 'pre'/'pos' +** allows some adjustments to be done only when needed. macro +** 'condchangemem' is used only for heavy tests (forcing a full +** GC cycle on every opportunity) +*/ +#define luaC_condGC(L,pre,pos) \ + { if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \ + condchangemem(L,pre,pos); } + +/* more often than not, 'pre'/'pos' are empty */ +#define luaC_checkGC(L) luaC_condGC(L,(void)0,(void)0) + + +#define luaC_barrier(L,p,v) ( \ + (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \ + luaC_barrier_(L,obj2gco(p),gcvalue(v)) : cast_void(0)) + +#define luaC_barrierback(L,p,v) ( \ + (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \ + luaC_barrierback_(L,p) : cast_void(0)) + +#define luaC_objbarrier(L,p,o) ( \ + (isblack(p) && iswhite(o)) ? \ + luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0)) + +#define luaC_upvalbarrier(L,uv) ( \ + (iscollectable((uv)->v) && !upisopen(uv)) ? \ + luaC_upvalbarrier_(L,uv) : cast_void(0)) + +LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o); +LUAI_FUNC void luaC_freeallobjects (lua_State *L); +LUAI_FUNC void luaC_step (lua_State *L); +LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); +LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); +LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); +LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); +LUAI_FUNC void luaC_barrierback_ (lua_State *L, Table *o); +LUAI_FUNC void luaC_upvalbarrier_ (lua_State *L, UpVal *uv); +LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt); +LUAI_FUNC void luaC_upvdeccount (lua_State *L, UpVal *uv); + + +#endif diff --git a/lua-5.3.3/src/linit.c b/lua-5.3.3/src/linit.c new file mode 100644 index 0000000..8ce94cc --- /dev/null +++ b/lua-5.3.3/src/linit.c @@ -0,0 +1,68 @@ +/* +** $Id: linit.c,v 1.38 2015/01/05 13:48:33 roberto Exp $ +** Initialization of libraries for lua.c and other clients +** See Copyright Notice in lua.h +*/ + + +#define linit_c +#define LUA_LIB + +/* +** If you embed Lua in your program and need to open the standard +** libraries, call luaL_openlibs in your program. If you need a +** different set of libraries, copy this file to your project and edit +** it to suit your needs. +** +** You can also *preload* libraries, so that a later 'require' can +** open the library, which is already linked to the application. +** For that, do the following code: +** +** luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD"); +** lua_pushcfunction(L, luaopen_modname); +** lua_setfield(L, -2, modname); +** lua_pop(L, 1); // remove _PRELOAD table +*/ + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lualib.h" +#include "lauxlib.h" + + +/* +** these libs are loaded by lua.c and are readily available to any Lua +** program +*/ +static const luaL_Reg loadedlibs[] = { + {"_G", luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_COLIBNAME, luaopen_coroutine}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_UTF8LIBNAME, luaopen_utf8}, + {LUA_DBLIBNAME, luaopen_debug}, +#if defined(LUA_COMPAT_BITLIB) + {LUA_BITLIBNAME, luaopen_bit32}, +#endif + {NULL, NULL} +}; + + +LUALIB_API void luaL_openlibs (lua_State *L) { + const luaL_Reg *lib; + /* "require" functions from 'loadedlibs' and set results to global table */ + for (lib = loadedlibs; lib->func; lib++) { + luaL_requiref(L, lib->name, lib->func, 1); + lua_pop(L, 1); /* remove lib */ + } +} + diff --git a/lua-5.3.3/src/liolib.c b/lua-5.3.3/src/liolib.c new file mode 100644 index 0000000..aa78e59 --- /dev/null +++ b/lua-5.3.3/src/liolib.c @@ -0,0 +1,768 @@ +/* +** $Id: liolib.c,v 2.149 2016/05/02 14:03:19 roberto Exp $ +** Standard I/O (and system) library +** See Copyright Notice in lua.h +*/ + +#define liolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + + +/* +** Change this macro to accept other modes for 'fopen' besides +** the standard ones. +*/ +#if !defined(l_checkmode) + +/* accepted extensions to 'mode' in 'fopen' */ +#if !defined(L_MODEEXT) +#define L_MODEEXT "b" +#endif + +/* Check whether 'mode' matches '[rwa]%+?[L_MODEEXT]*' */ +#define l_checkmode(mode) \ + (*mode != '\0' && strchr("rwa", *(mode++)) != NULL && \ + (*mode != '+' || (++mode, 1)) && /* skip if char is '+' */ \ + (strspn(mode, L_MODEEXT) == strlen(mode))) + +#endif + +/* +** {====================================================== +** l_popen spawns a new process connected to the current +** one through the file streams. +** ======================================================= +*/ + +#if !defined(l_popen) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_popen(L,c,m) (fflush(NULL), popen(c,m)) +#define l_pclose(L,file) (pclose(file)) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#define l_popen(L,c,m) (_popen(c,m)) +#define l_pclose(L,file) (_pclose(file)) + +#else /* }{ */ + +/* ISO C definitions */ +#define l_popen(L,c,m) \ + ((void)((void)c, m), \ + luaL_error(L, "'popen' not supported"), \ + (FILE*)0) +#define l_pclose(L,file) ((void)L, (void)file, -1) + +#endif /* } */ + +#endif /* } */ + +/* }====================================================== */ + + +#if !defined(l_getc) /* { */ + +#if defined(LUA_USE_POSIX) +#define l_getc(f) getc_unlocked(f) +#define l_lockfile(f) flockfile(f) +#define l_unlockfile(f) funlockfile(f) +#else +#define l_getc(f) getc(f) +#define l_lockfile(f) ((void)0) +#define l_unlockfile(f) ((void)0) +#endif + +#endif /* } */ + + +/* +** {====================================================== +** l_fseek: configuration for longer offsets +** ======================================================= +*/ + +#if !defined(l_fseek) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include + +#define l_fseek(f,o,w) fseeko(f,o,w) +#define l_ftell(f) ftello(f) +#define l_seeknum off_t + +#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \ + && defined(_MSC_VER) && (_MSC_VER >= 1400) /* }{ */ + +/* Windows (but not DDK) and Visual C++ 2005 or higher */ +#define l_fseek(f,o,w) _fseeki64(f,o,w) +#define l_ftell(f) _ftelli64(f) +#define l_seeknum __int64 + +#else /* }{ */ + +/* ISO C definitions */ +#define l_fseek(f,o,w) fseek(f,o,w) +#define l_ftell(f) ftell(f) +#define l_seeknum long + +#endif /* } */ + +#endif /* } */ + +/* }====================================================== */ + + +#define IO_PREFIX "_IO_" +#define IOPREF_LEN (sizeof(IO_PREFIX)/sizeof(char) - 1) +#define IO_INPUT (IO_PREFIX "input") +#define IO_OUTPUT (IO_PREFIX "output") + + +typedef luaL_Stream LStream; + + +#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE)) + +#define isclosed(p) ((p)->closef == NULL) + + +static int io_type (lua_State *L) { + LStream *p; + luaL_checkany(L, 1); + p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE); + if (p == NULL) + lua_pushnil(L); /* not a file */ + else if (isclosed(p)) + lua_pushliteral(L, "closed file"); + else + lua_pushliteral(L, "file"); + return 1; +} + + +static int f_tostring (lua_State *L) { + LStream *p = tolstream(L); + if (isclosed(p)) + lua_pushliteral(L, "file (closed)"); + else + lua_pushfstring(L, "file (%p)", p->f); + return 1; +} + + +static FILE *tofile (lua_State *L) { + LStream *p = tolstream(L); + if (isclosed(p)) + luaL_error(L, "attempt to use a closed file"); + lua_assert(p->f); + return p->f; +} + + +/* +** When creating file handles, always creates a 'closed' file handle +** before opening the actual file; so, if there is a memory error, the +** handle is in a consistent state. +*/ +static LStream *newprefile (lua_State *L) { + LStream *p = (LStream *)lua_newuserdata(L, sizeof(LStream)); + p->closef = NULL; /* mark file handle as 'closed' */ + luaL_setmetatable(L, LUA_FILEHANDLE); + return p; +} + + +/* +** Calls the 'close' function from a file handle. The 'volatile' avoids +** a bug in some versions of the Clang compiler (e.g., clang 3.0 for +** 32 bits). +*/ +static int aux_close (lua_State *L) { + LStream *p = tolstream(L); + volatile lua_CFunction cf = p->closef; + p->closef = NULL; /* mark stream as closed */ + return (*cf)(L); /* close it */ +} + + +static int io_close (lua_State *L) { + if (lua_isnone(L, 1)) /* no argument? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use standard output */ + tofile(L); /* make sure argument is an open stream */ + return aux_close(L); +} + + +static int f_gc (lua_State *L) { + LStream *p = tolstream(L); + if (!isclosed(p) && p->f != NULL) + aux_close(L); /* ignore closed and incompletely open files */ + return 0; +} + + +/* +** function to close regular files +*/ +static int io_fclose (lua_State *L) { + LStream *p = tolstream(L); + int res = fclose(p->f); + return luaL_fileresult(L, (res == 0), NULL); +} + + +static LStream *newfile (lua_State *L) { + LStream *p = newprefile(L); + p->f = NULL; + p->closef = &io_fclose; + return p; +} + + +static void opencheck (lua_State *L, const char *fname, const char *mode) { + LStream *p = newfile(L); + p->f = fopen(fname, mode); + if (p->f == NULL) + luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno)); +} + + +static int io_open (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newfile(L); + const char *md = mode; /* to traverse/check mode */ + luaL_argcheck(L, l_checkmode(md), 2, "invalid mode"); + p->f = fopen(filename, mode); + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +/* +** function to close 'popen' files +*/ +static int io_pclose (lua_State *L) { + LStream *p = tolstream(L); + return luaL_execresult(L, l_pclose(L, p->f)); +} + + +static int io_popen (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newprefile(L); + p->f = l_popen(L, filename, mode); + p->closef = &io_pclose; + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +static int io_tmpfile (lua_State *L) { + LStream *p = newfile(L); + p->f = tmpfile(); + return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1; +} + + +static FILE *getiofile (lua_State *L, const char *findex) { + LStream *p; + lua_getfield(L, LUA_REGISTRYINDEX, findex); + p = (LStream *)lua_touserdata(L, -1); + if (isclosed(p)) + luaL_error(L, "standard %s file is closed", findex + IOPREF_LEN); + return p->f; +} + + +static int g_iofile (lua_State *L, const char *f, const char *mode) { + if (!lua_isnoneornil(L, 1)) { + const char *filename = lua_tostring(L, 1); + if (filename) + opencheck(L, filename, mode); + else { + tofile(L); /* check that it's a valid file handle */ + lua_pushvalue(L, 1); + } + lua_setfield(L, LUA_REGISTRYINDEX, f); + } + /* return current value */ + lua_getfield(L, LUA_REGISTRYINDEX, 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); + + +/* +** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit +** in the limit for upvalues of a closure) +*/ +#define MAXARGLINE 250 + +static void aux_lines (lua_State *L, int toclose) { + int n = lua_gettop(L) - 1; /* number of arguments to read */ + luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments"); + lua_pushinteger(L, n); /* number of arguments to read */ + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_rotate(L, 2, 2); /* move 'n' and 'toclose' to their positions */ + lua_pushcclosure(L, io_readline, 3 + n); +} + + +static int f_lines (lua_State *L) { + tofile(L); /* check that it's a valid file handle */ + aux_lines(L, 0); + return 1; +} + + +static int io_lines (lua_State *L) { + int toclose; + if (lua_isnone(L, 1)) lua_pushnil(L); /* at least one argument */ + if (lua_isnil(L, 1)) { /* no file name? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT); /* get default input */ + lua_replace(L, 1); /* put it at index 1 */ + tofile(L); /* check that it's a valid file handle */ + toclose = 0; /* do not close it after iteration */ + } + else { /* open a new file */ + const char *filename = luaL_checkstring(L, 1); + opencheck(L, filename, "r"); + lua_replace(L, 1); /* put file at index 1 */ + toclose = 1; /* close it after iteration */ + } + aux_lines(L, toclose); + return 1; +} + + +/* +** {====================================================== +** READ +** ======================================================= +*/ + + +/* maximum length of a numeral */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + + +/* auxiliary structure used by 'read_number' */ +typedef struct { + FILE *f; /* file being read */ + int c; /* current character (look ahead) */ + int n; /* number of elements in buffer 'buff' */ + char buff[L_MAXLENNUM + 1]; /* +1 for ending '\0' */ +} RN; + + +/* +** Add current char to buffer (if not out of space) and read next one +*/ +static int nextc (RN *rn) { + if (rn->n >= L_MAXLENNUM) { /* buffer overflow? */ + rn->buff[0] = '\0'; /* invalidate result */ + return 0; /* fail */ + } + else { + rn->buff[rn->n++] = rn->c; /* save current char */ + rn->c = l_getc(rn->f); /* read next one */ + return 1; + } +} + + +/* +** Accept current char if it is in 'set' (of size 2) +*/ +static int test2 (RN *rn, const char *set) { + if (rn->c == set[0] || rn->c == set[1]) + return nextc(rn); + else return 0; +} + + +/* +** Read a sequence of (hex)digits +*/ +static int readdigits (RN *rn, int hex) { + int count = 0; + while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn)) + count++; + return count; +} + + +/* +** Read a number: first reads a valid prefix of a numeral into a buffer. +** Then it calls 'lua_stringtonumber' to check whether the format is +** correct and to convert it to a Lua number +*/ +static int read_number (lua_State *L, FILE *f) { + RN rn; + int count = 0; + int hex = 0; + char decp[2]; + rn.f = f; rn.n = 0; + decp[0] = lua_getlocaledecpoint(); /* get decimal point from locale */ + decp[1] = '.'; /* always accept a dot */ + l_lockfile(rn.f); + do { rn.c = l_getc(rn.f); } while (isspace(rn.c)); /* skip spaces */ + test2(&rn, "-+"); /* optional signal */ + if (test2(&rn, "00")) { + if (test2(&rn, "xX")) hex = 1; /* numeral is hexadecimal */ + else count = 1; /* count initial '0' as a valid digit */ + } + count += readdigits(&rn, hex); /* integral part */ + if (test2(&rn, decp)) /* decimal point? */ + count += readdigits(&rn, hex); /* fractional part */ + if (count > 0 && test2(&rn, (hex ? "pP" : "eE"))) { /* exponent mark? */ + test2(&rn, "-+"); /* exponent signal */ + readdigits(&rn, 0); /* exponent digits */ + } + ungetc(rn.c, rn.f); /* unread look-ahead char */ + l_unlockfile(rn.f); + rn.buff[rn.n] = '\0'; /* finish string */ + if (lua_stringtonumber(L, rn.buff)) /* is this a valid number? */ + return 1; /* ok */ + else { /* invalid format */ + 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); /* no-op when c == EOF */ + lua_pushliteral(L, ""); + return (c != EOF); +} + + +static int read_line (lua_State *L, FILE *f, int chop) { + luaL_Buffer b; + int c = '\0'; + luaL_buffinit(L, &b); + while (c != EOF && c != '\n') { /* repeat until end of line */ + char *buff = luaL_prepbuffer(&b); /* preallocate buffer */ + int i = 0; + l_lockfile(f); /* no memory errors can happen inside the lock */ + while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') + buff[i++] = c; + l_unlockfile(f); + luaL_addsize(&b, i); + } + if (!chop && c == '\n') /* want a newline and have one? */ + luaL_addchar(&b, c); /* add ending newline to result */ + luaL_pushresult(&b); /* close buffer */ + /* return ok if read something (either a newline or something else) */ + return (c == '\n' || lua_rawlen(L, -1) > 0); +} + + +static void read_all (lua_State *L, FILE *f) { + size_t nr; + luaL_Buffer b; + luaL_buffinit(L, &b); + do { /* read file in chunks of LUAL_BUFFERSIZE bytes */ + char *p = luaL_prepbuffer(&b); + nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f); + luaL_addsize(&b, nr); + } while (nr == LUAL_BUFFERSIZE); + luaL_pushresult(&b); /* close buffer */ +} + + +static int read_chars (lua_State *L, FILE *f, size_t n) { + size_t nr; /* number of chars actually read */ + char *p; + luaL_Buffer b; + luaL_buffinit(L, &b); + p = luaL_prepbuffsize(&b, n); /* prepare buffer to read whole block */ + nr = fread(p, sizeof(char), n, f); /* try to read 'n' chars */ + luaL_addsize(&b, nr); + luaL_pushresult(&b); /* close buffer */ + return (nr > 0); /* true iff read something */ +} + + +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, 1); + 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)luaL_checkinteger(L, n); + success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); + } + else { + const char *p = luaL_checkstring(L, n); + if (*p == '*') p++; /* skip optional '*' (for compatibility) */ + switch (*p) { + case 'n': /* number */ + success = read_number(L, f); + break; + case 'l': /* line */ + success = read_line(L, f, 1); + break; + case 'L': /* line with end-of-line */ + success = read_line(L, f, 0); + break; + case 'a': /* file */ + read_all(L, f); /* read entire file */ + success = 1; /* always success */ + break; + default: + return luaL_argerror(L, n, "invalid format"); + } + } + } + } + if (ferror(f)) + return luaL_fileresult(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) { + LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1)); + int i; + int n = (int)lua_tointeger(L, lua_upvalueindex(2)); + if (isclosed(p)) /* file is already closed? */ + return luaL_error(L, "file is already closed"); + lua_settop(L , 1); + luaL_checkstack(L, n, "too many arguments"); + for (i = 1; i <= n; i++) /* push arguments to 'g_read' */ + lua_pushvalue(L, lua_upvalueindex(3 + i)); + n = g_read(L, p->f, 2); /* 'n' is number of results */ + lua_assert(n > 0); /* should return at least a nil */ + if (lua_toboolean(L, -n)) /* read at least one value? */ + return n; /* return them */ + else { /* first result is nil: EOF or error */ + if (n > 1) { /* is there error information? */ + /* 2nd result is error message */ + return luaL_error(L, "%s", lua_tostring(L, -n + 1)); + } + if (lua_toboolean(L, lua_upvalueindex(3))) { /* 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) - arg; + int status = 1; + for (; nargs--; arg++) { + if (lua_type(L, arg) == LUA_TNUMBER) { + /* optimization: could be done exactly as for strings */ + int len = lua_isinteger(L, arg) + ? fprintf(f, LUA_INTEGER_FMT, lua_tointeger(L, arg)) + : fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)); + status = status && (len > 0); + } + else { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + status = status && (fwrite(s, sizeof(char), l, f) == l); + } + } + if (status) return 1; /* file handle already on stack top */ + else return luaL_fileresult(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) { + FILE *f = tofile(L); + lua_pushvalue(L, 1); /* push file at the stack top (to be returned) */ + return g_write(L, f, 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); + lua_Integer p3 = luaL_optinteger(L, 3, 0); + l_seeknum offset = (l_seeknum)p3; + luaL_argcheck(L, (lua_Integer)offset == p3, 3, + "not an integer in proper range"); + op = l_fseek(f, offset, mode[op]); + if (op) + return luaL_fileresult(L, 0, NULL); /* error */ + else { + lua_pushinteger(L, (lua_Integer)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], (size_t)sz); + return luaL_fileresult(L, res == 0, NULL); +} + + + +static int io_flush (lua_State *L) { + return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); +} + + +static int f_flush (lua_State *L) { + return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL); +} + + +/* +** functions for 'io' library +*/ +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} +}; + + +/* +** methods for file handles +*/ +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", f_gc}, + {"__tostring", f_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_setfuncs(L, flib, 0); /* add file methods to new metatable */ + lua_pop(L, 1); /* pop new metatable */ +} + + +/* +** function to (not) close the standard files stdin, stdout, and stderr +*/ +static int io_noclose (lua_State *L) { + LStream *p = tolstream(L); + p->closef = &io_noclose; /* keep file opened */ + lua_pushnil(L); + lua_pushliteral(L, "cannot close standard file"); + return 2; +} + + +static void createstdfile (lua_State *L, FILE *f, const char *k, + const char *fname) { + LStream *p = newprefile(L); + p->f = f; + p->closef = &io_noclose; + if (k != NULL) { + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, k); /* add file to registry */ + } + lua_setfield(L, -2, fname); /* add file to module */ +} + + +LUAMOD_API int luaopen_io (lua_State *L) { + luaL_newlib(L, iolib); /* new module */ + createmeta(L); + /* create (and set) default files */ + createstdfile(L, stdin, IO_INPUT, "stdin"); + createstdfile(L, stdout, IO_OUTPUT, "stdout"); + createstdfile(L, stderr, NULL, "stderr"); + return 1; +} + diff --git a/lua-5.3.3/src/llex.c b/lua-5.3.3/src/llex.c new file mode 100644 index 0000000..7032827 --- /dev/null +++ b/lua-5.3.3/src/llex.c @@ -0,0 +1,565 @@ +/* +** $Id: llex.c,v 2.96 2016/05/02 14:02:12 roberto Exp $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#define llex_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.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 */ +static const char *const luaX_tokens [] = { + "and", "break", "do", "else", "elseif", + "end", "false", "for", "function", "goto", "if", + "in", "local", "nil", "not", "or", "repeat", + "return", "then", "true", "until", "while", + "//", "..", "...", "==", ">=", "<=", "~=", + "<<", ">>", "::", "", + "", "", "", "" +}; + + +#define save_and_next(ls) (save(ls, ls->current), next(ls)) + + +static l_noret lexerror (LexState *ls, const char *msg, int token); + + +static void save (LexState *ls, int c) { + Mbuffer *b = ls->buff; + if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) { + size_t newsize; + if (luaZ_sizebuffer(b) >= MAX_SIZE/2) + lexerror(ls, "lexical element too long", 0); + newsize = luaZ_sizebuffer(b) * 2; + luaZ_resizebuffer(ls->L, b, newsize); + } + b->buffer[luaZ_bufflen(b)++] = cast(char, c); +} + + +void luaX_init (lua_State *L) { + int i; + TString *e = luaS_newliteral(L, LUA_ENV); /* create env name */ + luaC_fix(L, obj2gco(e)); /* never collect this name */ + for (i=0; iextra = cast_byte(i+1); /* reserved word */ + } +} + + +const char *luaX_token2str (LexState *ls, int token) { + if (token < FIRST_RESERVED) { /* single-byte symbols? */ + lua_assert(token == cast_uchar(token)); + return luaO_pushfstring(ls->L, "'%c'", token); + } + else { + const char *s = luaX_tokens[token - FIRST_RESERVED]; + if (token < TK_EOS) /* fixed format (symbols and reserved words)? */ + return luaO_pushfstring(ls->L, "'%s'", s); + else /* names, strings, and numerals */ + return s; + } +} + + +static const char *txtToken (LexState *ls, int token) { + switch (token) { + case TK_NAME: case TK_STRING: + case TK_FLT: case TK_INT: + save(ls, '\0'); + return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff)); + default: + return luaX_token2str(ls, token); + } +} + + +static l_noret lexerror (LexState *ls, const char *msg, int token) { + msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber); + if (token) + luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token)); + luaD_throw(ls->L, LUA_ERRSYNTAX); +} + + +l_noret luaX_syntaxerror (LexState *ls, const char *msg) { + lexerror(ls, msg, ls->t.token); +} + + +/* +** creates a new string and anchors it in scanner's table so that +** it will not be collected until the end of the compilation +** (by that time it should be anchored somewhere) +*/ +TString *luaX_newstring (LexState *ls, const char *str, size_t l) { + lua_State *L = ls->L; + TValue *o; /* entry for 'str' */ + TString *ts = luaS_newlstr(L, str, l); /* create new string */ + setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */ + o = luaH_set(L, ls->h, L->top - 1); + if (ttisnil(o)) { /* not in use yet? */ + /* boolean value does not need GC barrier; + table has no metatable, so it does not need to invalidate cache */ + setbvalue(o, 1); /* t[string] = true */ + luaC_checkGC(L); + } + else { /* string already present */ + ts = tsvalue(keyfromval(o)); /* re-use value previously stored */ + } + L->top--; /* remove string from stack */ + return ts; +} + + +/* +** increment line number and skips newline sequence (any of +** \n, \r, \n\r, or \r\n) +*/ +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) + lexerror(ls, "chunk has too many lines", 0); +} + + +void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, + int firstchar) { + ls->t.token = 0; + ls->L = L; + ls->current = firstchar; + ls->lookahead.token = TK_EOS; /* no look-ahead token */ + ls->z = z; + ls->fs = NULL; + ls->linenumber = 1; + ls->lastline = 1; + ls->source = source; + ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ + luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ +} + + + +/* +** ======================================================= +** LEXICAL ANALYZER +** ======================================================= +*/ + + +static int check_next1 (LexState *ls, int c) { + if (ls->current == c) { + next(ls); + return 1; + } + else return 0; +} + + +/* +** Check whether current char is in set 'set' (with two chars) and +** saves it +*/ +static int check_next2 (LexState *ls, const char *set) { + lua_assert(set[2] == '\0'); + if (ls->current == set[0] || ls->current == set[1]) { + save_and_next(ls); + return 1; + } + else return 0; +} + + +/* LUA_NUMBER */ +/* +** this function is quite liberal in what it accepts, as 'luaO_str2num' +** will reject ill-formed numerals. +*/ +static int read_numeral (LexState *ls, SemInfo *seminfo) { + TValue obj; + const char *expo = "Ee"; + int first = ls->current; + lua_assert(lisdigit(ls->current)); + save_and_next(ls); + if (first == '0' && check_next2(ls, "xX")) /* hexadecimal? */ + expo = "Pp"; + for (;;) { + if (check_next2(ls, expo)) /* exponent part? */ + check_next2(ls, "-+"); /* optional exponent sign */ + if (lisxdigit(ls->current)) + save_and_next(ls); + else if (ls->current == '.') + save_and_next(ls); + else break; + } + save(ls, '\0'); + if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0) /* format error? */ + lexerror(ls, "malformed number", TK_FLT); + if (ttisinteger(&obj)) { + seminfo->i = ivalue(&obj); + return TK_INT; + } + else { + lua_assert(ttisfloat(&obj)); + seminfo->r = fltvalue(&obj); + return TK_FLT; + } +} + + +/* +** skip a sequence '[=*[' or ']=*]'; if sequence is well formed, return +** its number of '='s; otherwise, return a negative number (-1 iff there +** are no '='s after initial bracket) +*/ +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 line = ls->linenumber; /* initial line (for error message) */ + save_and_next(ls); /* skip 2nd '[' */ + if (currIsNewline(ls)) /* string starts with a newline? */ + inclinenumber(ls); /* skip it */ + for (;;) { + switch (ls->current) { + case EOZ: { /* error */ + const char *what = (seminfo ? "string" : "comment"); + const char *msg = luaO_pushfstring(ls->L, + "unfinished long %s (starting at line %d)", what, line); + lexerror(ls, msg, TK_EOS); + break; /* to avoid warnings */ + } + case ']': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd ']' */ + 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 esccheck (LexState *ls, int c, const char *msg) { + if (!c) { + if (ls->current != EOZ) + save_and_next(ls); /* add current to buffer for error message */ + lexerror(ls, msg, TK_STRING); + } +} + + +static int gethexa (LexState *ls) { + save_and_next(ls); + esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected"); + return luaO_hexavalue(ls->current); +} + + +static int readhexaesc (LexState *ls) { + int r = gethexa(ls); + r = (r << 4) + gethexa(ls); + luaZ_buffremove(ls->buff, 2); /* remove saved chars from buffer */ + return r; +} + + +static unsigned long readutf8esc (LexState *ls) { + unsigned long r; + int i = 4; /* chars to be removed: '\', 'u', '{', and first digit */ + save_and_next(ls); /* skip 'u' */ + esccheck(ls, ls->current == '{', "missing '{'"); + r = gethexa(ls); /* must have at least one digit */ + while ((save_and_next(ls), lisxdigit(ls->current))) { + i++; + r = (r << 4) + luaO_hexavalue(ls->current); + esccheck(ls, r <= 0x10FFFF, "UTF-8 value too large"); + } + esccheck(ls, ls->current == '}', "missing '}'"); + next(ls); /* skip '}' */ + luaZ_buffremove(ls->buff, i); /* remove saved chars from buffer */ + return r; +} + + +static void utf8esc (LexState *ls) { + char buff[UTF8BUFFSZ]; + int n = luaO_utf8esc(buff, readutf8esc(ls)); + for (; n > 0; n--) /* add 'buff' to string */ + save(ls, buff[UTF8BUFFSZ - n]); +} + + +static int readdecesc (LexState *ls) { + int i; + int r = 0; /* result accumulator */ + for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */ + r = 10*r + ls->current - '0'; + save_and_next(ls); + } + esccheck(ls, r <= UCHAR_MAX, "decimal escape too large"); + luaZ_buffremove(ls->buff, i); /* remove read digits from buffer */ + return r; +} + + +static void read_string (LexState *ls, int del, SemInfo *seminfo) { + save_and_next(ls); /* keep delimiter (for error messages) */ + while (ls->current != del) { + switch (ls->current) { + case EOZ: + lexerror(ls, "unfinished string", TK_EOS); + break; /* to avoid warnings */ + case '\n': + case '\r': + lexerror(ls, "unfinished string", TK_STRING); + break; /* to avoid warnings */ + case '\\': { /* escape sequences */ + int c; /* final character to be saved */ + save_and_next(ls); /* keep '\\' for error messages */ + switch (ls->current) { + case 'a': c = '\a'; goto read_save; + case 'b': c = '\b'; goto read_save; + case 'f': c = '\f'; goto read_save; + case 'n': c = '\n'; goto read_save; + case 'r': c = '\r'; goto read_save; + case 't': c = '\t'; goto read_save; + case 'v': c = '\v'; goto read_save; + case 'x': c = readhexaesc(ls); goto read_save; + case 'u': utf8esc(ls); goto no_save; + case '\n': case '\r': + inclinenumber(ls); c = '\n'; goto only_save; + case '\\': case '\"': case '\'': + c = ls->current; goto read_save; + case EOZ: goto no_save; /* will raise an error next loop */ + case 'z': { /* zap following span of spaces */ + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + next(ls); /* skip the 'z' */ + while (lisspace(ls->current)) { + if (currIsNewline(ls)) inclinenumber(ls); + else next(ls); + } + goto no_save; + } + default: { + esccheck(ls, lisdigit(ls->current), "invalid escape sequence"); + c = readdecesc(ls); /* digital escape '\ddd' */ + goto only_save; + } + } + read_save: + next(ls); + /* go through */ + only_save: + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + save(ls, c); + /* go through */ + no_save: break; + } + 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': { /* line breaks */ + inclinenumber(ls); + break; + } + case ' ': case '\f': case '\t': case '\v': { /* spaces */ + next(ls); + break; + } + case '-': { /* '-' or '--' (comment) */ + next(ls); + if (ls->current != '-') return '-'; + /* else is a comment */ + next(ls); + if (ls->current == '[') { /* long comment? */ + int sep = skip_sep(ls); + luaZ_resetbuffer(ls->buff); /* 'skip_sep' may dirty the buffer */ + if (sep >= 0) { + read_long_string(ls, NULL, sep); /* skip long comment */ + luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */ + break; + } + } + /* else short comment */ + while (!currIsNewline(ls) && ls->current != EOZ) + next(ls); /* skip until end of line (or end of file) */ + break; + } + case '[': { /* long string or simply '[' */ + int sep = skip_sep(ls); + if (sep >= 0) { + read_long_string(ls, seminfo, sep); + return TK_STRING; + } + else if (sep != -1) /* '[=...' missing second bracket */ + lexerror(ls, "invalid long string delimiter", TK_STRING); + return '['; + } + case '=': { + next(ls); + if (check_next1(ls, '=')) return TK_EQ; + else return '='; + } + case '<': { + next(ls); + if (check_next1(ls, '=')) return TK_LE; + else if (check_next1(ls, '<')) return TK_SHL; + else return '<'; + } + case '>': { + next(ls); + if (check_next1(ls, '=')) return TK_GE; + else if (check_next1(ls, '>')) return TK_SHR; + else return '>'; + } + case '/': { + next(ls); + if (check_next1(ls, '/')) return TK_IDIV; + else return '/'; + } + case '~': { + next(ls); + if (check_next1(ls, '=')) return TK_NE; + else return '~'; + } + case ':': { + next(ls); + if (check_next1(ls, ':')) return TK_DBCOLON; + else return ':'; + } + case '"': case '\'': { /* short literal strings */ + read_string(ls, ls->current, seminfo); + return TK_STRING; + } + case '.': { /* '.', '..', '...', or number */ + save_and_next(ls); + if (check_next1(ls, '.')) { + if (check_next1(ls, '.')) + return TK_DOTS; /* '...' */ + else return TK_CONCAT; /* '..' */ + } + else if (!lisdigit(ls->current)) return '.'; + else return read_numeral(ls, seminfo); + } + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': { + return read_numeral(ls, seminfo); + } + case EOZ: { + return TK_EOS; + } + default: { + if (lislalpha(ls->current)) { /* identifier or reserved word? */ + TString *ts; + do { + save_and_next(ls); + } while (lislalnum(ls->current)); + ts = luaX_newstring(ls, luaZ_buffer(ls->buff), + luaZ_bufflen(ls->buff)); + seminfo->ts = ts; + if (isreserved(ts)) /* reserved word? */ + return ts->extra - 1 + FIRST_RESERVED; + else { + return TK_NAME; + } + } + else { /* single-char tokens (+ - / ...) */ + int c = ls->current; + next(ls); + return c; + } + } + } + } +} + + +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 */ +} + + +int luaX_lookahead (LexState *ls) { + lua_assert(ls->lookahead.token == TK_EOS); + ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); + return ls->lookahead.token; +} + diff --git a/lua-5.3.3/src/llex.h b/lua-5.3.3/src/llex.h new file mode 100644 index 0000000..2363d87 --- /dev/null +++ b/lua-5.3.3/src/llex.h @@ -0,0 +1,85 @@ +/* +** $Id: llex.h,v 1.79 2016/05/02 14:02:12 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 + + +#if !defined(LUA_ENV) +#define LUA_ENV "_ENV" +#endif + + +/* +* 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_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, + TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, + /* other terminal symbols */ + TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, + TK_SHL, TK_SHR, + TK_DBCOLON, TK_EOS, + TK_FLT, TK_INT, TK_NAME, TK_STRING +}; + +/* number of reserved words */ +#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) + + +typedef union { + lua_Number r; + lua_Integer i; + TString *ts; +} SemInfo; /* semantics information */ + + +typedef struct Token { + int token; + SemInfo seminfo; +} Token; + + +/* state of the lexer plus state of the parser when shared by all + functions */ +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; /* current function (parser) */ + struct lua_State *L; + ZIO *z; /* input stream */ + Mbuffer *buff; /* buffer for tokens */ + Table *h; /* to avoid collection/reuse strings */ + struct Dyndata *dyd; /* dynamic structures used by the parser */ + TString *source; /* current source name */ + TString *envn; /* environment variable name */ +} LexState; + + +LUAI_FUNC void luaX_init (lua_State *L); +LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, + TString *source, int firstchar); +LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); +LUAI_FUNC void luaX_next (LexState *ls); +LUAI_FUNC int luaX_lookahead (LexState *ls); +LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s); +LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); + + +#endif diff --git a/lua-5.3.3/src/llimits.h b/lua-5.3.3/src/llimits.h new file mode 100644 index 0000000..f21377f --- /dev/null +++ b/lua-5.3.3/src/llimits.h @@ -0,0 +1,323 @@ +/* +** $Id: llimits.h,v 1.141 2015/11/19 19:16:22 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" + +/* +** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count +** the total memory used by Lua (in bytes). Usually, 'size_t' and +** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines. +*/ +#if defined(LUAI_MEM) /* { external definitions? */ +typedef LUAI_UMEM lu_mem; +typedef LUAI_MEM l_mem; +#elif LUAI_BITSINT >= 32 /* }{ */ +typedef size_t lu_mem; +typedef ptrdiff_t l_mem; +#else /* 16-bit ints */ /* }{ */ +typedef unsigned long lu_mem; +typedef long l_mem; +#endif /* } */ + + +/* chars used as small naturals (so that 'char' is reserved for characters) */ +typedef unsigned char lu_byte; + + +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +/* maximum size visible for Lua (must be representable in a lua_Integer */ +#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \ + : (size_t)(LUA_MAXINTEGER)) + + +#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)) + +#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1)) + + +#define MAX_INT INT_MAX /* maximum value of an int */ + + +/* +** conversion of pointer to unsigned integer: +** this is for hashing only; there is no problem if the integer +** cannot hold the whole pointer value +*/ +#define point2uint(p) ((unsigned int)((size_t)(p) & UINT_MAX)) + + + +/* type to ensure maximum alignment */ +#if defined(LUAI_USER_ALIGNMENT_T) +typedef LUAI_USER_ALIGNMENT_T L_Umaxalign; +#else +typedef union { + lua_Number n; + double u; + void *s; + lua_Integer i; + long l; +} L_Umaxalign; +#endif + + + +/* types of 'usual argument conversions' for lua_Number and lua_Integer */ +typedef LUAI_UACNUMBER l_uacNumber; +typedef LUAI_UACINT l_uacInt; + + +/* internal assertions for in-house debugging */ +#if defined(lua_assert) +#define check_exp(c,e) (lua_assert(c), (e)) +/* to avoid problems with conditions too long */ +#define lua_longassert(c) ((c) ? (void)0 : lua_assert(0)) +#else +#define lua_assert(c) ((void)0) +#define check_exp(c,e) (e) +#define lua_longassert(c) ((void)0) +#endif + +/* +** assertion for checking API calls +*/ +#if !defined(luai_apicheck) +#define luai_apicheck(l,e) lua_assert(e) +#endif + +#define api_check(l,e,msg) luai_apicheck(l,(e) && msg) + + +/* macro to avoid warnings about unused variables */ +#if !defined(UNUSED) +#define UNUSED(x) ((void)(x)) +#endif + + +/* type casts (a macro highlights casts in the code) */ +#define cast(t, exp) ((t)(exp)) + +#define cast_void(i) cast(void, (i)) +#define cast_byte(i) cast(lu_byte, (i)) +#define cast_num(i) cast(lua_Number, (i)) +#define cast_int(i) cast(int, (i)) +#define cast_uchar(i) cast(unsigned char, (i)) + + +/* cast a signed lua_Integer to lua_Unsigned */ +#if !defined(l_castS2U) +#define l_castS2U(i) ((lua_Unsigned)(i)) +#endif + +/* +** cast a lua_Unsigned to a signed lua_Integer; this cast is +** not strict ISO C, but two-complement architectures should +** work fine. +*/ +#if !defined(l_castU2S) +#define l_castU2S(i) ((lua_Integer)(i)) +#endif + + +/* +** non-return type +*/ +#if defined(__GNUC__) +#define l_noret void __attribute__((noreturn)) +#elif defined(_MSC_VER) && _MSC_VER >= 1200 +#define l_noret void __declspec(noreturn) +#else +#define l_noret void +#endif + + + +/* +** maximum depth for nested C calls and syntactical nested non-terminals +** in a program. (Value must fit in an unsigned short int.) +*/ +#if !defined(LUAI_MAXCCALLS) +#define LUAI_MAXCCALLS 200 +#endif + + + +/* +** type for virtual-machine instructions; +** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +*/ +#if LUAI_BITSINT >= 32 +typedef unsigned int Instruction; +#else +typedef unsigned long Instruction; +#endif + + + +/* +** Maximum length for short strings, that is, strings that are +** internalized. (Cannot be smaller than reserved words or tags for +** metamethods, as these strings must be internalized; +** #("function") = 8, #("__newindex") = 10.) +*/ +#if !defined(LUAI_MAXSHORTLEN) +#define LUAI_MAXSHORTLEN 40 +#endif + + +/* +** Initial size for the string table (must be power of 2). +** The Lua core alone registers ~50 strings (reserved words + +** metaevent keys + a few others). Libraries would typically add +** a few dozens more. +*/ +#if !defined(MINSTRTABSIZE) +#define MINSTRTABSIZE 128 +#endif + + +/* +** Size of cache for strings in the API. 'N' is the number of +** sets (better be a prime) and "M" is the size of each set (M == 1 +** makes a direct cache.) +*/ +#if !defined(STRCACHE_N) +#define STRCACHE_N 53 +#define STRCACHE_M 2 +#endif + + +/* minimum size for string buffer */ +#if !defined(LUA_MINBUFFER) +#define LUA_MINBUFFER 32 +#endif + + +/* +** macros that are executed whenever program enters the Lua core +** ('lua_lock') and leaves the core ('lua_unlock') +*/ +#if !defined(lua_lock) +#define lua_lock(L) ((void) 0) +#define lua_unlock(L) ((void) 0) +#endif + +/* +** macro executed during Lua functions at points where the +** function can yield. +*/ +#if !defined(luai_threadyield) +#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} +#endif + + +/* +** these macros allow user-specific actions on threads when you defined +** LUAI_EXTRASPACE and need to do something extra when a thread is +** created/deleted/resumed/yielded. +*/ +#if !defined(luai_userstateopen) +#define luai_userstateopen(L) ((void)L) +#endif + +#if !defined(luai_userstateclose) +#define luai_userstateclose(L) ((void)L) +#endif + +#if !defined(luai_userstatethread) +#define luai_userstatethread(L,L1) ((void)L) +#endif + +#if !defined(luai_userstatefree) +#define luai_userstatefree(L,L1) ((void)L) +#endif + +#if !defined(luai_userstateresume) +#define luai_userstateresume(L,n) ((void)L) +#endif + +#if !defined(luai_userstateyield) +#define luai_userstateyield(L,n) ((void)L) +#endif + + + +/* +** The luai_num* macros define the primitive operations over numbers. +*/ + +/* floor division (defined as 'floor(a/b)') */ +#if !defined(luai_numidiv) +#define luai_numidiv(L,a,b) ((void)L, l_floor(luai_numdiv(L,a,b))) +#endif + +/* float division */ +#if !defined(luai_numdiv) +#define luai_numdiv(L,a,b) ((a)/(b)) +#endif + +/* +** modulo: defined as 'a - floor(a/b)*b'; this definition gives NaN when +** 'b' is huge, but the result should be 'a'. 'fmod' gives the result of +** 'a - trunc(a/b)*b', and therefore must be corrected when 'trunc(a/b) +** ~= floor(a/b)'. That happens when the division has a non-integer +** negative result, which is equivalent to the test below. +*/ +#if !defined(luai_nummod) +#define luai_nummod(L,a,b,m) \ + { (m) = l_mathop(fmod)(a,b); if ((m)*(b) < 0) (m) += (b); } +#endif + +/* exponentiation */ +#if !defined(luai_numpow) +#define luai_numpow(L,a,b) ((void)L, l_mathop(pow)(a,b)) +#endif + +/* the others are quite standard operations */ +#if !defined(luai_numadd) +#define luai_numadd(L,a,b) ((a)+(b)) +#define luai_numsub(L,a,b) ((a)-(b)) +#define luai_nummul(L,a,b) ((a)*(b)) +#define luai_numunm(L,a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(a,b) ((a)<(b)) +#define luai_numle(a,b) ((a)<=(b)) +#define luai_numisnan(a) (!luai_numeq((a), (a))) +#endif + + + + + +/* +** macro to control inclusion of some hard tests on stack reallocation +*/ +#if !defined(HARDSTACKTESTS) +#define condmovestack(L,pre,pos) ((void)0) +#else +/* realloc stack keeping its size */ +#define condmovestack(L,pre,pos) \ + { int sz_ = (L)->stacksize; pre; luaD_reallocstack((L), sz_); pos; } +#endif + +#if !defined(HARDMEMTESTS) +#define condchangemem(L,pre,pos) ((void)0) +#else +#define condchangemem(L,pre,pos) \ + { if (G(L)->gcrunning) { pre; luaC_fullgc(L, 0); pos; } } +#endif + +#endif diff --git a/lua-5.3.3/src/lmathlib.c b/lua-5.3.3/src/lmathlib.c new file mode 100644 index 0000000..94815f1 --- /dev/null +++ b/lua-5.3.3/src/lmathlib.c @@ -0,0 +1,407 @@ +/* +** $Id: lmathlib.c,v 1.117 2015/10/02 15:39:23 roberto Exp $ +** Standard mathematical library +** See Copyright Notice in lua.h +*/ + +#define lmathlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#undef PI +#define PI (l_mathop(3.141592653589793238462643383279502884)) + + +#if !defined(l_rand) /* { */ +#if defined(LUA_USE_POSIX) +#define l_rand() random() +#define l_srand(x) srandom(x) +#define L_RANDMAX 2147483647 /* (2^31 - 1), following POSIX */ +#else +#define l_rand() rand() +#define l_srand(x) srand(x) +#define L_RANDMAX RAND_MAX +#endif +#endif /* } */ + + +static int math_abs (lua_State *L) { + if (lua_isinteger(L, 1)) { + lua_Integer n = lua_tointeger(L, 1); + if (n < 0) n = (lua_Integer)(0u - (lua_Unsigned)n); + lua_pushinteger(L, n); + } + else + lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sin (lua_State *L) { + lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cos (lua_State *L) { + lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tan (lua_State *L) { + lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_asin (lua_State *L) { + lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_acos (lua_State *L) { + lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan (lua_State *L) { + lua_Number y = luaL_checknumber(L, 1); + lua_Number x = luaL_optnumber(L, 2, 1); + lua_pushnumber(L, l_mathop(atan2)(y, x)); + return 1; +} + + +static int math_toint (lua_State *L) { + int valid; + lua_Integer n = lua_tointegerx(L, 1, &valid); + if (valid) + lua_pushinteger(L, n); + else { + luaL_checkany(L, 1); + lua_pushnil(L); /* value is not convertible to integer */ + } + return 1; +} + + +static void pushnumint (lua_State *L, lua_Number d) { + lua_Integer n; + if (lua_numbertointeger(d, &n)) /* does 'd' fit in an integer? */ + lua_pushinteger(L, n); /* result is integer */ + else + lua_pushnumber(L, d); /* result is float */ +} + + +static int math_floor (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own floor */ + else { + lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_ceil (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own ceil */ + else { + lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_fmod (lua_State *L) { + if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) { + lua_Integer d = lua_tointeger(L, 2); + if ((lua_Unsigned)d + 1u <= 1u) { /* special cases: -1 or 0 */ + luaL_argcheck(L, d != 0, 2, "zero"); + lua_pushinteger(L, 0); /* avoid overflow with 0x80000... / -1 */ + } + else + lua_pushinteger(L, lua_tointeger(L, 1) % d); + } + else + lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1), + luaL_checknumber(L, 2))); + return 1; +} + + +/* +** next function does not use 'modf', avoiding problems with 'double*' +** (which is not compatible with 'float*') when lua_Number is not +** 'double'. +*/ +static int math_modf (lua_State *L) { + if (lua_isinteger(L ,1)) { + lua_settop(L, 1); /* number is its own integer part */ + lua_pushnumber(L, 0); /* no fractional part */ + } + else { + lua_Number n = luaL_checknumber(L, 1); + /* integer part (rounds toward zero) */ + lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n); + pushnumint(L, ip); + /* fractional part (test needed for inf/-inf) */ + lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip)); + } + return 2; +} + + +static int math_sqrt (lua_State *L) { + lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1))); + return 1; +} + + +static int math_ult (lua_State *L) { + lua_Integer a = luaL_checkinteger(L, 1); + lua_Integer b = luaL_checkinteger(L, 2); + lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b); + return 1; +} + +static int math_log (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number res; + if (lua_isnoneornil(L, 2)) + res = l_mathop(log)(x); + else { + lua_Number base = luaL_checknumber(L, 2); +#if !defined(LUA_USE_C89) + if (base == 2.0) res = l_mathop(log2)(x); else +#endif + if (base == 10.0) res = l_mathop(log10)(x); + else res = l_mathop(log)(x)/l_mathop(log)(base); + } + lua_pushnumber(L, res); + return 1; +} + +static int math_exp (lua_State *L) { + lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_deg (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI)); + return 1; +} + +static int math_rad (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0))); + return 1; +} + + +static int math_min (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imin = 1; /* index of current minimum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, i, imin, LUA_OPLT)) + imin = i; + } + lua_pushvalue(L, imin); + return 1; +} + + +static int math_max (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imax = 1; /* index of current maximum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, imax, i, LUA_OPLT)) + imax = i; + } + lua_pushvalue(L, imax); + return 1; +} + +/* +** This function uses 'double' (instead of 'lua_Number') to ensure that +** all bits from 'l_rand' can be represented, and that 'RANDMAX + 1.0' +** will keep full precision (ensuring that 'r' is always less than 1.0.) +*/ +static int math_random (lua_State *L) { + lua_Integer low, up; + double r = (double)l_rand() * (1.0 / ((double)L_RANDMAX + 1.0)); + switch (lua_gettop(L)) { /* check number of arguments */ + case 0: { /* no arguments */ + lua_pushnumber(L, (lua_Number)r); /* Number between 0 and 1 */ + return 1; + } + case 1: { /* only upper limit */ + low = 1; + up = luaL_checkinteger(L, 1); + break; + } + case 2: { /* lower and upper limits */ + low = luaL_checkinteger(L, 1); + up = luaL_checkinteger(L, 2); + break; + } + default: return luaL_error(L, "wrong number of arguments"); + } + /* random integer in the interval [low, up] */ + luaL_argcheck(L, low <= up, 1, "interval is empty"); + luaL_argcheck(L, low >= 0 || up <= LUA_MAXINTEGER + low, 1, + "interval too large"); + r *= (double)(up - low) + 1.0; + lua_pushinteger(L, (lua_Integer)r + low); + return 1; +} + + +static int math_randomseed (lua_State *L) { + l_srand((unsigned int)(lua_Integer)luaL_checknumber(L, 1)); + (void)l_rand(); /* discard first value to avoid undesirable correlations */ + return 0; +} + + +static int math_type (lua_State *L) { + if (lua_type(L, 1) == LUA_TNUMBER) { + if (lua_isinteger(L, 1)) + lua_pushliteral(L, "integer"); + else + lua_pushliteral(L, "float"); + } + else { + luaL_checkany(L, 1); + lua_pushnil(L); + } + return 1; +} + + +/* +** {================================================================== +** Deprecated functions (for compatibility only) +** =================================================================== +*/ +#if defined(LUA_COMPAT_MATHLIB) + +static int math_cosh (lua_State *L) { + lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sinh (lua_State *L) { + lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tanh (lua_State *L) { + lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_pow (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number y = luaL_checknumber(L, 2); + lua_pushnumber(L, l_mathop(pow)(x, y)); + return 1; +} + +static int math_frexp (lua_State *L) { + int e; + lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e)); + lua_pushinteger(L, e); + return 2; +} + +static int math_ldexp (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + int ep = (int)luaL_checkinteger(L, 2); + lua_pushnumber(L, l_mathop(ldexp)(x, ep)); + return 1; +} + +static int math_log10 (lua_State *L) { + lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1))); + return 1; +} + +#endif +/* }================================================================== */ + + + +static const luaL_Reg mathlib[] = { + {"abs", math_abs}, + {"acos", math_acos}, + {"asin", math_asin}, + {"atan", math_atan}, + {"ceil", math_ceil}, + {"cos", math_cos}, + {"deg", math_deg}, + {"exp", math_exp}, + {"tointeger", math_toint}, + {"floor", math_floor}, + {"fmod", math_fmod}, + {"ult", math_ult}, + {"log", math_log}, + {"max", math_max}, + {"min", math_min}, + {"modf", math_modf}, + {"rad", math_rad}, + {"random", math_random}, + {"randomseed", math_randomseed}, + {"sin", math_sin}, + {"sqrt", math_sqrt}, + {"tan", math_tan}, + {"type", math_type}, +#if defined(LUA_COMPAT_MATHLIB) + {"atan2", math_atan}, + {"cosh", math_cosh}, + {"sinh", math_sinh}, + {"tanh", math_tanh}, + {"pow", math_pow}, + {"frexp", math_frexp}, + {"ldexp", math_ldexp}, + {"log10", math_log10}, +#endif + /* placeholders */ + {"pi", NULL}, + {"huge", NULL}, + {"maxinteger", NULL}, + {"mininteger", NULL}, + {NULL, NULL} +}; + + +/* +** Open math library +*/ +LUAMOD_API int luaopen_math (lua_State *L) { + luaL_newlib(L, mathlib); + lua_pushnumber(L, PI); + lua_setfield(L, -2, "pi"); + lua_pushnumber(L, (lua_Number)HUGE_VAL); + lua_setfield(L, -2, "huge"); + lua_pushinteger(L, LUA_MAXINTEGER); + lua_setfield(L, -2, "maxinteger"); + lua_pushinteger(L, LUA_MININTEGER); + lua_setfield(L, -2, "mininteger"); + return 1; +} + diff --git a/lua-5.3.3/src/lmem.c b/lua-5.3.3/src/lmem.c new file mode 100644 index 0000000..0a0476c --- /dev/null +++ b/lua-5.3.3/src/lmem.c @@ -0,0 +1,100 @@ +/* +** $Id: lmem.c,v 1.91 2015/03/06 19:45:54 roberto Exp $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#define lmem_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.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) +** +** * frealloc(ud, NULL, x, s) creates a new block of size 's' (no +** matter '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 ISO 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 *what) { + void *newblock; + int newsize; + if (*size >= limit/2) { /* cannot double it? */ + if (*size >= limit) /* cannot grow even a little? */ + luaG_runerror(L, "too many %s (limit is %d)", what, limit); + 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; +} + + +l_noret luaM_toobig (lua_State *L) { + luaG_runerror(L, "memory allocation error: block too big"); +} + + + +/* +** generic allocation routine. +*/ +void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { + void *newblock; + global_State *g = G(L); + size_t realosize = (block) ? osize : 0; + lua_assert((realosize == 0) == (block == NULL)); +#if defined(HARDMEMTESTS) + if (nsize > realosize && g->gcrunning) + luaC_fullgc(L, 1); /* force a GC whenever possible */ +#endif + newblock = (*g->frealloc)(g->ud, block, osize, nsize); + if (newblock == NULL && nsize > 0) { + lua_assert(nsize > realosize); /* cannot fail when shrinking a block */ + if (g->version) { /* is state fully built? */ + luaC_fullgc(L, 1); /* try to free some memory... */ + newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ + } + if (newblock == NULL) + luaD_throw(L, LUA_ERRMEM); + } + lua_assert((nsize == 0) == (newblock == NULL)); + g->GCdebt = (g->GCdebt + nsize) - realosize; + return newblock; +} + diff --git a/lua-5.3.3/src/lmem.h b/lua-5.3.3/src/lmem.h new file mode 100644 index 0000000..30f4848 --- /dev/null +++ b/lua-5.3.3/src/lmem.h @@ -0,0 +1,69 @@ +/* +** $Id: lmem.h,v 1.43 2014/12/19 17:26:14 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" + + +/* +** This macro reallocs a vector 'b' from 'on' to 'n' elements, where +** each element has size 'e'. In case of arithmetic overflow of the +** product 'n'*'e', it raises an error (calling 'luaM_toobig'). Because +** 'e' is always constant, it avoids the runtime division MAX_SIZET/(e). +** +** (The macro is somewhat complex to avoid warnings: The 'sizeof' +** comparison avoids a runtime comparison when overflow cannot occur. +** The compiler should be able to optimize the real test by itself, but +** when it does it, it may give a warning about "comparison is always +** false due to limited range of data type"; the +1 tricks the compiler, +** avoiding this warning but also this optimization.) +*/ +#define luaM_reallocv(L,b,on,n,e) \ + (((sizeof(n) >= sizeof(size_t) && cast(size_t, (n)) + 1 > MAX_SIZET/(e)) \ + ? luaM_toobig(L) : cast_void(0)) , \ + luaM_realloc_(L, (b), (on)*(e), (n)*(e))) + +/* +** Arrays of chars do not need any test +*/ +#define luaM_reallocvchar(L,b,on,n) \ + cast(char *, luaM_realloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char))) + +#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) luaM_realloc_(L, (b), (n)*sizeof(*(b)), 0) + +#define luaM_malloc(L,s) luaM_realloc_(L, NULL, 0, (s)) +#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_newobject(L,tag,s) luaM_realloc_(L, NULL, tag, (s)) + +#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 l_noret luaM_toobig (lua_State *L); + +/* not to be called directly */ +LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int *size, + size_t size_elem, int limit, + const char *what); + +#endif + diff --git a/lua-5.3.3/src/loadlib.c b/lua-5.3.3/src/loadlib.c new file mode 100644 index 0000000..7911928 --- /dev/null +++ b/lua-5.3.3/src/loadlib.c @@ -0,0 +1,787 @@ +/* +** $Id: loadlib.c,v 1.127 2015/11/23 11:30:45 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 Windows, and a stub for other +** systems. +*/ + +#define loadlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment +** variables that Lua check to set its paths. +*/ +#if !defined(LUA_PATH_VAR) +#define LUA_PATH_VAR "LUA_PATH" +#endif + +#if !defined(LUA_CPATH_VAR) +#define LUA_CPATH_VAR "LUA_CPATH" +#endif + +#define LUA_PATHSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR + +#define LUA_PATHVARVERSION LUA_PATH_VAR LUA_PATHSUFFIX +#define LUA_CPATHVARVERSION LUA_CPATH_VAR LUA_PATHSUFFIX + +/* +** LUA_PATH_SEP is the character that separates templates in a path. +** LUA_PATH_MARK is the string that marks the substitution points in a +** template. +** LUA_EXEC_DIR in a Windows path is replaced by the executable's +** directory. +** LUA_IGMARK is a mark to ignore all before it when building the +** luaopen_ function name. +*/ +#if !defined (LUA_PATH_SEP) +#define LUA_PATH_SEP ";" +#endif +#if !defined (LUA_PATH_MARK) +#define LUA_PATH_MARK "?" +#endif +#if !defined (LUA_EXEC_DIR) +#define LUA_EXEC_DIR "!" +#endif +#if !defined (LUA_IGMARK) +#define LUA_IGMARK "-" +#endif + + +/* +** LUA_CSUBSEP is the character that replaces dots in submodule names +** when searching for a C loader. +** LUA_LSUBSEP is the character that replaces dots in submodule names +** when searching for a Lua loader. +*/ +#if !defined(LUA_CSUBSEP) +#define LUA_CSUBSEP LUA_DIRSEP +#endif + +#if !defined(LUA_LSUBSEP) +#define LUA_LSUBSEP LUA_DIRSEP +#endif + + +/* prefix for open functions in C libraries */ +#define LUA_POF "luaopen_" + +/* separator for open functions in C libraries */ +#define LUA_OFSEP "_" + + +/* +** unique key for table in the registry that keeps handles +** for all loaded C libraries +*/ +static const int CLIBS = 0; + +#define LIB_FAIL "open" + +#define setprogdir(L) ((void)0) + + +/* +** system-dependent functions +*/ + +/* +** unload library 'lib' +*/ +static void lsys_unloadlib (void *lib); + +/* +** load C library in file 'path'. If 'seeglb', load with all names in +** the library global. +** Returns the library; in case of error, returns NULL plus an +** error string in the stack. +*/ +static void *lsys_load (lua_State *L, const char *path, int seeglb); + +/* +** Try to find a function named 'sym' in library 'lib'. +** Returns the function; in case of error, returns NULL plus an +** error string in the stack. +*/ +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym); + + + + +#if defined(LUA_USE_DLOPEN) /* { */ +/* +** {======================================================================== +** This is an implementation of loadlib based on the dlfcn interface. +** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, +** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least +** as an emulation layer on top of native functions. +** ========================================================================= +*/ + +#include + +/* +** Macro to convert pointer-to-void* to pointer-to-function. This cast +** is undefined according to ISO C, but POSIX assumes that it works. +** (The '__extension__' in gnu compilers is only to avoid warnings.) +*/ +#if defined(__GNUC__) +#define cast_func(p) (__extension__ (lua_CFunction)(p)) +#else +#define cast_func(p) ((lua_CFunction)(p)) +#endif + + +static void lsys_unloadlib (void *lib) { + dlclose(lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL)); + if (lib == NULL) lua_pushstring(L, dlerror()); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = cast_func(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 + +/* +** optional flags for LoadLibraryEx +*/ +#if !defined(LUA_LLE_FLAGS) +#define LUA_LLE_FLAGS 0 +#endif + + +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_EXEC_DIR, 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)/sizeof(char), NULL)) + lua_pushstring(L, buffer); + else + lua_pushfstring(L, "system error %d\n", error); +} + +static void lsys_unloadlib (void *lib) { + FreeLibrary((HMODULE)lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS); + (void)(seeglb); /* not used: symbols are 'global' by default */ + if (lib == NULL) pusherror(L); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)GetProcAddress((HMODULE)lib, sym); + if (f == NULL) pusherror(L); + return f; +} + +/* }====================================================== */ + + +#else /* }{ */ +/* +** {====================================================== +** Fallback for other systems +** ======================================================= +*/ + +#undef LIB_FAIL +#define LIB_FAIL "absent" + + +#define DLMSG "dynamic libraries not enabled; check your Lua installation" + + +static void lsys_unloadlib (void *lib) { + (void)(lib); /* not used */ +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + (void)(path); (void)(seeglb); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + (void)(lib); (void)(sym); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + +/* }====================================================== */ +#endif /* } */ + + +/* +** return registry.CLIBS[path] +*/ +static void *checkclib (lua_State *L, const char *path) { + void *plib; + lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); + lua_getfield(L, -1, path); + plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ + lua_pop(L, 2); /* pop CLIBS table and 'plib' */ + return plib; +} + + +/* +** registry.CLIBS[path] = plib -- for queries +** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries +*/ +static void addtoclib (lua_State *L, const char *path, void *plib) { + lua_rawgetp(L, LUA_REGISTRYINDEX, &CLIBS); + lua_pushlightuserdata(L, plib); + lua_pushvalue(L, -1); + lua_setfield(L, -3, path); /* CLIBS[path] = plib */ + lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */ + lua_pop(L, 1); /* pop CLIBS table */ +} + + +/* +** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib +** handles in list CLIBS +*/ +static int gctm (lua_State *L) { + lua_Integer n = luaL_len(L, 1); + for (; n >= 1; n--) { /* for each handle, in reverse order */ + lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */ + lsys_unloadlib(lua_touserdata(L, -1)); + lua_pop(L, 1); /* pop handle */ + } + return 0; +} + + + +/* error codes for 'lookforfunc' */ +#define ERRLIB 1 +#define ERRFUNC 2 + +/* +** Look for a C function named 'sym' in a dynamically loaded library +** 'path'. +** First, check whether the library is already loaded; if not, try +** to load it. +** Then, if 'sym' is '*', return true (as library has been loaded). +** Otherwise, look for symbol 'sym' in the library and push a +** C function with that symbol. +** Return 0 and 'true' or a function in the stack; in case of +** errors, return an error code and an error message in the stack. +*/ +static int lookforfunc (lua_State *L, const char *path, const char *sym) { + void *reg = checkclib(L, path); /* check loaded C libraries */ + if (reg == NULL) { /* must load library? */ + reg = lsys_load(L, path, *sym == '*'); /* global symbols if 'sym'=='*' */ + if (reg == NULL) return ERRLIB; /* unable to load library */ + addtoclib(L, path, reg); + } + if (*sym == '*') { /* loading only library (no function)? */ + lua_pushboolean(L, 1); /* return 'true' */ + return 0; /* no errors */ + } + else { + lua_CFunction f = lsys_sym(L, reg, sym); + if (f == NULL) + return ERRFUNC; /* unable to find function */ + lua_pushcfunction(L, f); /* else create new function */ + return 0; /* no errors */ + } +} + + +static int ll_loadlib (lua_State *L) { + const char *path = luaL_checkstring(L, 1); + const char *init = luaL_checkstring(L, 2); + int stat = lookforfunc(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_PATH_SEP) path++; /* skip separators */ + if (*path == '\0') return NULL; /* no more templates */ + l = strchr(path, *LUA_PATH_SEP); /* find next separator */ + if (l == NULL) l = path + strlen(path); + lua_pushlstring(L, path, l - path); /* template */ + return l; +} + + +static const char *searchpath (lua_State *L, const char *name, + const char *path, + const char *sep, + const char *dirsep) { + luaL_Buffer msg; /* to build error message */ + luaL_buffinit(L, &msg); + if (*sep != '\0') /* non-empty separator? */ + name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */ + while ((path = pushnexttemplate(L, path)) != NULL) { + const char *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 '%s'", filename); + lua_remove(L, -2); /* remove file name */ + luaL_addvalue(&msg); /* concatenate error msg. entry */ + } + luaL_pushresult(&msg); /* create error message */ + return NULL; /* not found */ +} + + +static int ll_searchpath (lua_State *L) { + const char *f = searchpath(L, luaL_checkstring(L, 1), + luaL_checkstring(L, 2), + luaL_optstring(L, 3, "."), + luaL_optstring(L, 4, LUA_DIRSEP)); + if (f != NULL) return 1; + else { /* error message is on top of the stack */ + lua_pushnil(L); + lua_insert(L, -2); + return 2; /* return nil + error message */ + } +} + + +static const char *findfile (lua_State *L, const char *name, + const char *pname, + const char *dirsep) { + const char *path; + lua_getfield(L, lua_upvalueindex(1), pname); + path = lua_tostring(L, -1); + if (path == NULL) + luaL_error(L, "'package.%s' must be a string", pname); + return searchpath(L, name, path, ".", dirsep); +} + + +static int checkload (lua_State *L, int stat, const char *filename) { + if (stat) { /* module loaded successfully? */ + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; /* return open function and file name */ + } + else + return luaL_error(L, "error loading module '%s' from file '%s':\n\t%s", + lua_tostring(L, 1), filename, lua_tostring(L, -1)); +} + + +static int searcher_Lua (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + filename = findfile(L, name, "path", LUA_LSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename); +} + + +/* +** Try to find a load function for module 'modname' at file 'filename'. +** First, change '.' to '_' in 'modname'; then, if 'modname' has +** the form X-Y (that is, it has an "ignore mark"), build a function +** name "luaopen_X" and look for it. (For compatibility, if that +** fails, it also tries "luaopen_Y".) If there is no ignore mark, +** look for a function named "luaopen_modname". +*/ +static int loadfunc (lua_State *L, const char *filename, const char *modname) { + const char *openfunc; + const char *mark; + modname = luaL_gsub(L, modname, ".", LUA_OFSEP); + mark = strchr(modname, *LUA_IGMARK); + if (mark) { + int stat; + openfunc = lua_pushlstring(L, modname, mark - modname); + openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc); + stat = lookforfunc(L, filename, openfunc); + if (stat != ERRFUNC) return stat; + modname = mark + 1; /* else go ahead and try old-style name */ + } + openfunc = lua_pushfstring(L, LUA_POF"%s", modname); + return lookforfunc(L, filename, openfunc); +} + + +static int searcher_C (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (loadfunc(L, filename, name) == 0), filename); +} + + +static int searcher_Croot (lua_State *L) { + 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", LUA_CSUBSEP); + if (filename == NULL) return 1; /* root not found */ + if ((stat = loadfunc(L, filename, name)) != 0) { + if (stat != ERRFUNC) + return checkload(L, 0, filename); /* real error */ + else { /* open function not found */ + lua_pushfstring(L, "\n\tno module '%s' in file '%s'", name, filename); + return 1; + } + } + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; +} + + +static int searcher_preload (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_getfield(L, LUA_REGISTRYINDEX, "_PRELOAD"); + if (lua_getfield(L, -1, name) == LUA_TNIL) /* not found? */ + lua_pushfstring(L, "\n\tno field package.preload['%s']", name); + return 1; +} + + +static void findloader (lua_State *L, const char *name) { + int i; + luaL_Buffer msg; /* to build error message */ + luaL_buffinit(L, &msg); + /* push 'package.searchers' to index 3 in the stack */ + if (lua_getfield(L, lua_upvalueindex(1), "searchers") != LUA_TTABLE) + luaL_error(L, "'package.searchers' must be a table"); + /* iterate over available searchers to find a loader */ + for (i = 1; ; i++) { + if (lua_rawgeti(L, 3, i) == LUA_TNIL) { /* no more searchers? */ + lua_pop(L, 1); /* remove nil */ + luaL_pushresult(&msg); /* create error message */ + luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1)); + } + lua_pushstring(L, name); + lua_call(L, 1, 2); /* call it */ + if (lua_isfunction(L, -2)) /* did it find a loader? */ + return; /* module loader found */ + else if (lua_isstring(L, -2)) { /* searcher returned error message? */ + lua_pop(L, 1); /* remove extra return */ + luaL_addvalue(&msg); /* concatenate error message */ + } + else + lua_pop(L, 2); /* remove both returns */ + } +} + + +static int ll_require (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_settop(L, 1); /* _LOADED table will be at index 2 */ + lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_getfield(L, 2, name); /* _LOADED[name] */ + if (lua_toboolean(L, -1)) /* is it there? */ + return 1; /* package is already loaded */ + /* else must load package */ + lua_pop(L, 1); /* remove 'getfield' result */ + findloader(L, name); + lua_pushstring(L, name); /* pass name as argument to module loader */ + lua_insert(L, -2); /* name is 1st argument (before search data) */ + lua_call(L, 2, 1); /* run loader to load module */ + if (!lua_isnil(L, -1)) /* non-nil return? */ + lua_setfield(L, 2, name); /* _LOADED[name] = returned value */ + if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no 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 +** ======================================================= +*/ +#if defined(LUA_COMPAT_MODULE) + +/* +** changes the environment variable of calling function +*/ +static void set_env (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, "'module' not called from a Lua function"); + lua_pushvalue(L, -2); /* copy new environment table to top */ + lua_setupvalue(L, -2, 1); + lua_pop(L, 1); /* remove function */ +} + + +static void dooptions (lua_State *L, int n) { + int i; + for (i = 2; i <= n; i++) { + if (lua_isfunction(L, i)) { /* avoid 'calling' extra info. */ + 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 lastarg = lua_gettop(L); /* last parameter */ + luaL_pushmodule(L, modname, 1); /* get/create module table */ + /* check whether table already has a _NAME field */ + if (lua_getfield(L, -1, "_NAME") != LUA_TNIL) + lua_pop(L, 1); /* table is an initialized module */ + else { /* no; initialize it */ + lua_pop(L, 1); + modinit(L, modname); + } + lua_pushvalue(L, -1); + set_env(L); + dooptions(L, lastarg); + return 1; +} + + +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_pushglobaltable(L); + lua_setfield(L, -2, "__index"); /* mt.__index = _G */ + return 0; +} + +#endif +/* }====================================================== */ + + + +/* auxiliary mark (for internal use) */ +#define AUXMARK "\1" + + +/* +** return registry.LUA_NOENV as a boolean +*/ +static int noenv (lua_State *L) { + int b; + lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + b = lua_toboolean(L, -1); + lua_pop(L, 1); /* remove value */ + return b; +} + + +static void setpath (lua_State *L, const char *fieldname, const char *envname1, + const char *envname2, const char *def) { + const char *path = getenv(envname1); + if (path == NULL) /* no environment variable? */ + path = getenv(envname2); /* try alternative name */ + if (path == NULL || noenv(L)) /* 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_PATH_SEP LUA_PATH_SEP, + LUA_PATH_SEP AUXMARK LUA_PATH_SEP); + 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}, + {"searchpath", ll_searchpath}, +#if defined(LUA_COMPAT_MODULE) + {"seeall", ll_seeall}, +#endif + /* placeholders */ + {"preload", NULL}, + {"cpath", NULL}, + {"path", NULL}, + {"searchers", NULL}, + {"loaded", NULL}, + {NULL, NULL} +}; + + +static const luaL_Reg ll_funcs[] = { +#if defined(LUA_COMPAT_MODULE) + {"module", ll_module}, +#endif + {"require", ll_require}, + {NULL, NULL} +}; + + +static void createsearcherstable (lua_State *L) { + static const lua_CFunction searchers[] = + {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL}; + int i; + /* create 'searchers' table */ + lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0); + /* fill it with predefined searchers */ + for (i=0; searchers[i] != NULL; i++) { + lua_pushvalue(L, -2); /* set 'package' as upvalue for all searchers */ + lua_pushcclosure(L, searchers[i], 1); + lua_rawseti(L, -2, i+1); + } +#if defined(LUA_COMPAT_LOADERS) + lua_pushvalue(L, -1); /* make a copy of 'searchers' table */ + lua_setfield(L, -3, "loaders"); /* put it in field 'loaders' */ +#endif + lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */ +} + + +/* +** create table CLIBS to keep track of loaded C libraries, +** setting a finalizer to close all libraries when closing state. +*/ +static void createclibstable (lua_State *L) { + lua_newtable(L); /* create CLIBS table */ + lua_createtable(L, 0, 1); /* create metatable for CLIBS */ + lua_pushcfunction(L, gctm); + lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ + lua_setmetatable(L, -2); + lua_rawsetp(L, LUA_REGISTRYINDEX, &CLIBS); /* set CLIBS table in registry */ +} + + +LUAMOD_API int luaopen_package (lua_State *L) { + createclibstable(L); + luaL_newlib(L, pk_funcs); /* create 'package' table */ + createsearcherstable(L); + /* set field 'path' */ + setpath(L, "path", LUA_PATHVARVERSION, LUA_PATH_VAR, LUA_PATH_DEFAULT); + /* set field 'cpath' */ + setpath(L, "cpath", LUA_CPATHVARVERSION, LUA_CPATH_VAR, LUA_CPATH_DEFAULT); + /* store config information */ + lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" + LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); + lua_setfield(L, -2, "config"); + /* set field 'loaded' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, "_LOADED"); + lua_setfield(L, -2, "loaded"); + /* set field 'preload' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, "_PRELOAD"); + lua_setfield(L, -2, "preload"); + lua_pushglobaltable(L); + lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */ + luaL_setfuncs(L, ll_funcs, 1); /* open lib into global table */ + lua_pop(L, 1); /* pop global table */ + return 1; /* return 'package' table */ +} + diff --git a/lua-5.3.3/src/lobject.c b/lua-5.3.3/src/lobject.c new file mode 100644 index 0000000..a44b385 --- /dev/null +++ b/lua-5.3.3/src/lobject.c @@ -0,0 +1,521 @@ +/* +** $Id: lobject.c,v 2.111 2016/05/20 14:07:48 roberto Exp $ +** Some generic functions over Lua objects +** See Copyright Notice in lua.h +*/ + +#define lobject_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "lvm.h" + + + +LUAI_DDEF const TValue luaO_nilobject_ = {NILCONSTANT}; + + +/* +** 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; /* exponent */ + if (x < 8) return x; + while (x >= (8 << 4)) { /* coarse steps */ + x = (x + 0xf) >> 4; /* x = ceil(x / 16) */ + e += 4; + } + while (x >= (8 << 1)) { /* fine steps */ + x = (x + 1) >> 1; /* x = ceil(x / 2) */ + e++; + } + return ((e+1) << 3) | (cast_int(x) - 8); +} + + +/* converts back */ +int luaO_fb2int (int x) { + return (x < 8) ? x : ((x & 7) + 8) << ((x >> 3) - 1); +} + + +/* +** Computes ceil(log2(x)) +*/ +int luaO_ceillog2 (unsigned int x) { + static const lu_byte log_2[256] = { /* log_2[i] = ceil(log2(i - 1)) */ + 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 = 0; + x--; + while (x >= 256) { l += 8; x >>= 8; } + return l + log_2[x]; +} + + +static lua_Integer intarith (lua_State *L, int op, lua_Integer v1, + lua_Integer v2) { + switch (op) { + case LUA_OPADD: return intop(+, v1, v2); + case LUA_OPSUB:return intop(-, v1, v2); + case LUA_OPMUL:return intop(*, v1, v2); + case LUA_OPMOD: return luaV_mod(L, v1, v2); + case LUA_OPIDIV: return luaV_div(L, v1, v2); + case LUA_OPBAND: return intop(&, v1, v2); + case LUA_OPBOR: return intop(|, v1, v2); + case LUA_OPBXOR: return intop(^, v1, v2); + case LUA_OPSHL: return luaV_shiftl(v1, v2); + case LUA_OPSHR: return luaV_shiftl(v1, -v2); + case LUA_OPUNM: return intop(-, 0, v1); + case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1); + default: lua_assert(0); return 0; + } +} + + +static lua_Number numarith (lua_State *L, int op, lua_Number v1, + lua_Number v2) { + switch (op) { + case LUA_OPADD: return luai_numadd(L, v1, v2); + case LUA_OPSUB: return luai_numsub(L, v1, v2); + case LUA_OPMUL: return luai_nummul(L, v1, v2); + case LUA_OPDIV: return luai_numdiv(L, v1, v2); + case LUA_OPPOW: return luai_numpow(L, v1, v2); + case LUA_OPIDIV: return luai_numidiv(L, v1, v2); + case LUA_OPUNM: return luai_numunm(L, v1); + case LUA_OPMOD: { + lua_Number m; + luai_nummod(L, v1, v2, m); + return m; + } + default: lua_assert(0); return 0; + } +} + + +void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, + TValue *res) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: + case LUA_OPBNOT: { /* operate only on integers */ + lua_Integer i1; lua_Integer i2; + if (tointeger(p1, &i1) && tointeger(p2, &i2)) { + setivalue(res, intarith(L, op, i1, i2)); + return; + } + else break; /* go to the end */ + } + case LUA_OPDIV: case LUA_OPPOW: { /* operate only on floats */ + lua_Number n1; lua_Number n2; + if (tonumber(p1, &n1) && tonumber(p2, &n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return; + } + else break; /* go to the end */ + } + default: { /* other operations */ + lua_Number n1; lua_Number n2; + if (ttisinteger(p1) && ttisinteger(p2)) { + setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); + return; + } + else if (tonumber(p1, &n1) && tonumber(p2, &n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return; + } + else break; /* go to the end */ + } + } + /* could not perform raw operation; try metamethod */ + lua_assert(L != NULL); /* should not fail when folding (compile time) */ + luaT_trybinTM(L, p1, p2, res, cast(TMS, (op - LUA_OPADD) + TM_ADD)); +} + + +int luaO_hexavalue (int c) { + if (lisdigit(c)) return c - '0'; + else return (ltolower(c) - 'a') + 10; +} + + +static int isneg (const char **s) { + if (**s == '-') { (*s)++; return 1; } + else if (**s == '+') (*s)++; + return 0; +} + + + +/* +** {================================================================== +** Lua's implementation for 'lua_strx2number' +** =================================================================== +*/ + +#if !defined(lua_strx2number) + +/* maximum number of significant digits to read (to avoid overflows + even with single floats) */ +#define MAXSIGDIG 30 + +/* +** convert an hexadecimal numeric string to a number, following +** C99 specification for 'strtod' +*/ +static lua_Number lua_strx2number (const char *s, char **endptr) { + int dot = lua_getlocaledecpoint(); + lua_Number r = 0.0; /* result (accumulator) */ + int sigdig = 0; /* number of significant digits */ + int nosigdig = 0; /* number of non-significant digits */ + int e = 0; /* exponent correction */ + int neg; /* 1 if number is negative */ + int hasdot = 0; /* true after seen a dot */ + *endptr = cast(char *, s); /* nothing is valid yet */ + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); /* check signal */ + if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */ + return 0.0; /* invalid format (no '0x') */ + for (s += 2; ; s++) { /* skip '0x' and read numeral */ + if (*s == dot) { + if (hasdot) break; /* second dot? stop loop */ + else hasdot = 1; + } + else if (lisxdigit(cast_uchar(*s))) { + if (sigdig == 0 && *s == '0') /* non-significant digit (zero)? */ + nosigdig++; + else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */ + r = (r * cast_num(16.0)) + luaO_hexavalue(*s); + else e++; /* too many digits; ignore, but still count for exponent */ + if (hasdot) e--; /* decimal digit? correct exponent */ + } + else break; /* neither a dot nor a digit */ + } + if (nosigdig + sigdig == 0) /* no digits? */ + return 0.0; /* invalid format */ + *endptr = cast(char *, s); /* valid up to here */ + e *= 4; /* each digit multiplies/divides value by 2^4 */ + if (*s == 'p' || *s == 'P') { /* exponent part? */ + int exp1 = 0; /* exponent value */ + int neg1; /* exponent signal */ + s++; /* skip 'p' */ + neg1 = isneg(&s); /* signal */ + if (!lisdigit(cast_uchar(*s))) + return 0.0; /* invalid; must have at least one digit */ + while (lisdigit(cast_uchar(*s))) /* read exponent */ + exp1 = exp1 * 10 + *(s++) - '0'; + if (neg1) exp1 = -exp1; + e += exp1; + *endptr = cast(char *, s); /* valid up to here */ + } + if (neg) r = -r; + return l_mathop(ldexp)(r, e); +} + +#endif +/* }====================================================== */ + + +/* maximum length of a numeral */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + +static const char *l_str2dloc (const char *s, lua_Number *result, int mode) { + char *endptr; + *result = (mode == 'x') ? lua_strx2number(s, &endptr) /* try to convert */ + : lua_str2number(s, &endptr); + if (endptr == s) return NULL; /* nothing recognized? */ + while (lisspace(cast_uchar(*endptr))) endptr++; /* skip trailing spaces */ + return (*endptr == '\0') ? endptr : NULL; /* OK if no trailing characters */ +} + + +/* +** Convert string 's' to a Lua number (put in 'result'). Return NULL +** on fail or the address of the ending '\0' on success. +** 'pmode' points to (and 'mode' contains) special things in the string: +** - 'x'/'X' means an hexadecimal numeral +** - 'n'/'N' means 'inf' or 'nan' (which should be rejected) +** - '.' just optimizes the search for the common case (nothing special) +** This function accepts both the current locale or a dot as the radix +** mark. If the convertion fails, it may mean number has a dot but +** locale accepts something else. In that case, the code copies 's' +** to a buffer (because 's' is read-only), changes the dot to the +** current locale radix mark, and tries to convert again. +*/ +static const char *l_str2d (const char *s, lua_Number *result) { + const char *endptr; + const char *pmode = strpbrk(s, ".xXnN"); + int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0; + if (mode == 'n') /* reject 'inf' and 'nan' */ + return NULL; + endptr = l_str2dloc(s, result, mode); /* try to convert */ + if (endptr == NULL) { /* failed? may be a different locale */ + char buff[L_MAXLENNUM + 1]; + char *pdot = strchr(s, '.'); + if (strlen(s) > L_MAXLENNUM || pdot == NULL) + return NULL; /* string too long or no dot; fail */ + strcpy(buff, s); /* copy string to buffer */ + buff[pdot - s] = lua_getlocaledecpoint(); /* correct decimal point */ + endptr = l_str2dloc(buff, result, mode); /* try again */ + if (endptr != NULL) + endptr = s + (endptr - buff); /* make relative to 's' */ + } + return endptr; +} + + +#define MAXBY10 cast(lua_Unsigned, LUA_MAXINTEGER / 10) +#define MAXLASTD cast_int(LUA_MAXINTEGER % 10) + +static const char *l_str2int (const char *s, lua_Integer *result) { + lua_Unsigned a = 0; + int empty = 1; + int neg; + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); + if (s[0] == '0' && + (s[1] == 'x' || s[1] == 'X')) { /* hex? */ + s += 2; /* skip '0x' */ + for (; lisxdigit(cast_uchar(*s)); s++) { + a = a * 16 + luaO_hexavalue(*s); + empty = 0; + } + } + else { /* decimal */ + for (; lisdigit(cast_uchar(*s)); s++) { + int d = *s - '0'; + if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ + return NULL; /* do not accept it (as integer) */ + a = a * 10 + d; + empty = 0; + } + } + while (lisspace(cast_uchar(*s))) s++; /* skip trailing spaces */ + if (empty || *s != '\0') return NULL; /* something wrong in the numeral */ + else { + *result = l_castU2S((neg) ? 0u - a : a); + return s; + } +} + + +size_t luaO_str2num (const char *s, TValue *o) { + lua_Integer i; lua_Number n; + const char *e; + if ((e = l_str2int(s, &i)) != NULL) { /* try as an integer */ + setivalue(o, i); + } + else if ((e = l_str2d(s, &n)) != NULL) { /* else try as a float */ + setfltvalue(o, n); + } + else + return 0; /* conversion failed */ + return (e - s) + 1; /* success; return string size */ +} + + +int luaO_utf8esc (char *buff, unsigned long x) { + int n = 1; /* number of bytes put in buffer (backwards) */ + lua_assert(x <= 0x10FFFF); + if (x < 0x80) /* ascii? */ + buff[UTF8BUFFSZ - 1] = cast(char, x); + else { /* need continuation bytes */ + unsigned int mfb = 0x3f; /* maximum that fits in first byte */ + do { /* add continuation bytes */ + buff[UTF8BUFFSZ - (n++)] = cast(char, 0x80 | (x & 0x3f)); + x >>= 6; /* remove added bits */ + mfb >>= 1; /* now there is one less bit available in first byte */ + } while (x > mfb); /* still needs continuation byte? */ + buff[UTF8BUFFSZ - n] = cast(char, (~mfb << 1) | x); /* add first byte */ + } + return n; +} + + +/* maximum length of the conversion of a number to a string */ +#define MAXNUMBER2STR 50 + + +/* +** Convert a number object to a string +*/ +void luaO_tostring (lua_State *L, StkId obj) { + char buff[MAXNUMBER2STR]; + size_t len; + lua_assert(ttisnumber(obj)); + if (ttisinteger(obj)) + len = lua_integer2str(buff, sizeof(buff), ivalue(obj)); + else { + len = lua_number2str(buff, sizeof(buff), fltvalue(obj)); +#if !defined(LUA_COMPAT_FLOATSTRING) + if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */ + buff[len++] = lua_getlocaledecpoint(); + buff[len++] = '0'; /* adds '.0' to result */ + } +#endif + } + setsvalue2s(L, obj, luaS_newlstr(L, buff, len)); +} + + +static void pushstr (lua_State *L, const char *str, size_t l) { + setsvalue2s(L, L->top, luaS_newlstr(L, str, l)); + luaD_inctop(L); +} + + +/* +** this function handles only '%d', '%c', '%f', '%p', and '%s' + conventional formats, plus Lua-specific '%I' and '%U' +*/ +const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { + int n = 0; + for (;;) { + const char *e = strchr(fmt, '%'); + if (e == NULL) break; + pushstr(L, fmt, e - fmt); + switch (*(e+1)) { + case 's': { /* zero-terminated string */ + const char *s = va_arg(argp, char *); + if (s == NULL) s = "(null)"; + pushstr(L, s, strlen(s)); + break; + } + case 'c': { /* an 'int' as a character */ + char buff = cast(char, va_arg(argp, int)); + if (lisprint(cast_uchar(buff))) + pushstr(L, &buff, 1); + else /* non-printable character; print its code */ + luaO_pushfstring(L, "<\\%d>", cast_uchar(buff)); + break; + } + case 'd': { /* an 'int' */ + setivalue(L->top, va_arg(argp, int)); + goto top2str; + } + case 'I': { /* a 'lua_Integer' */ + setivalue(L->top, cast(lua_Integer, va_arg(argp, l_uacInt))); + goto top2str; + } + case 'f': { /* a 'lua_Number' */ + setfltvalue(L->top, cast_num(va_arg(argp, l_uacNumber))); + top2str: /* convert the top element to a string */ + luaD_inctop(L); + luaO_tostring(L, L->top - 1); + break; + } + case 'p': { /* a pointer */ + char buff[4*sizeof(void *) + 8]; /* should be enough space for a '%p' */ + int l = l_sprintf(buff, sizeof(buff), "%p", va_arg(argp, void *)); + pushstr(L, buff, l); + break; + } + case 'U': { /* an 'int' as a UTF-8 sequence */ + char buff[UTF8BUFFSZ]; + int l = luaO_utf8esc(buff, cast(long, va_arg(argp, long))); + pushstr(L, buff + UTF8BUFFSZ - l, l); + break; + } + case '%': { + pushstr(L, "%", 1); + break; + } + default: { + luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'", + *(e + 1)); + } + } + n += 2; + fmt = e+2; + } + luaD_checkstack(L, 1); + pushstr(L, fmt, strlen(fmt)); + if (n > 0) luaV_concat(L, n + 1); + 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; +} + + +/* number of chars of a literal string without the ending \0 */ +#define LL(x) (sizeof(x)/sizeof(char) - 1) + +#define RETS "..." +#define PRE "[string \"" +#define POS "\"]" + +#define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) + +void luaO_chunkid (char *out, const char *source, size_t bufflen) { + size_t l = strlen(source); + if (*source == '=') { /* 'literal' source */ + if (l <= bufflen) /* small enough? */ + memcpy(out, source + 1, l * sizeof(char)); + else { /* truncate it */ + addstr(out, source + 1, bufflen - 1); + *out = '\0'; + } + } + else if (*source == '@') { /* file name */ + if (l <= bufflen) /* small enough? */ + memcpy(out, source + 1, l * sizeof(char)); + else { /* add '...' before rest of name */ + addstr(out, RETS, LL(RETS)); + bufflen -= LL(RETS); + memcpy(out, source + 1 + l - bufflen, bufflen * sizeof(char)); + } + } + else { /* string; format as [string "source"] */ + const char *nl = strchr(source, '\n'); /* find first new line (if any) */ + addstr(out, PRE, LL(PRE)); /* add prefix */ + bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ + if (l < bufflen && nl == NULL) { /* small one-line source? */ + addstr(out, source, l); /* keep it */ + } + else { + if (nl != NULL) l = nl - source; /* stop at first newline */ + if (l > bufflen) l = bufflen; + addstr(out, source, l); + addstr(out, RETS, LL(RETS)); + } + memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); + } +} + diff --git a/lua-5.3.3/src/lobject.h b/lua-5.3.3/src/lobject.h new file mode 100644 index 0000000..2d52b41 --- /dev/null +++ b/lua-5.3.3/src/lobject.h @@ -0,0 +1,549 @@ +/* +** $Id: lobject.h,v 2.116 2015/11/03 18:33:10 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" + + +/* +** Extra tags for non-values +*/ +#define LUA_TPROTO LUA_NUMTAGS /* function prototypes */ +#define LUA_TDEADKEY (LUA_NUMTAGS+1) /* removed keys in tables */ + +/* +** number of all possible tags (including LUA_TNONE but excluding DEADKEY) +*/ +#define LUA_TOTALTAGS (LUA_TPROTO + 2) + + +/* +** tags for Tagged Values have the following use of bits: +** bits 0-3: actual tag (a LUA_T* value) +** bits 4-5: variant bits +** bit 6: whether value is collectable +*/ + + +/* +** LUA_TFUNCTION variants: +** 0 - Lua function +** 1 - light C function +** 2 - regular C function (closure) +*/ + +/* Variant tags for functions */ +#define LUA_TLCL (LUA_TFUNCTION | (0 << 4)) /* Lua closure */ +#define LUA_TLCF (LUA_TFUNCTION | (1 << 4)) /* light C function */ +#define LUA_TCCL (LUA_TFUNCTION | (2 << 4)) /* C closure */ + + +/* Variant tags for strings */ +#define LUA_TSHRSTR (LUA_TSTRING | (0 << 4)) /* short strings */ +#define LUA_TLNGSTR (LUA_TSTRING | (1 << 4)) /* long strings */ + + +/* Variant tags for numbers */ +#define LUA_TNUMFLT (LUA_TNUMBER | (0 << 4)) /* float numbers */ +#define LUA_TNUMINT (LUA_TNUMBER | (1 << 4)) /* integer numbers */ + + +/* Bit mark for collectable types */ +#define BIT_ISCOLLECTABLE (1 << 6) + +/* mark a tag as collectable */ +#define ctb(t) ((t) | BIT_ISCOLLECTABLE) + + +/* +** Common type for all collectable objects +*/ +typedef struct 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 type has only the common header +*/ +struct GCObject { + CommonHeader; +}; + + + + +/* +** Tagged Values. This is the basic representation of values in Lua, +** an actual value plus a tag with its type. +*/ + +/* +** Union of all Lua values +*/ +typedef union Value { + GCObject *gc; /* collectable objects */ + void *p; /* light userdata */ + int b; /* booleans */ + lua_CFunction f; /* light C functions */ + lua_Integer i; /* integer numbers */ + lua_Number n; /* float numbers */ +} Value; + + +#define TValuefields Value value_; int tt_ + + +typedef struct lua_TValue { + TValuefields; +} TValue; + + + +/* macro defining a nil value */ +#define NILCONSTANT {NULL}, LUA_TNIL + + +#define val_(o) ((o)->value_) + + +/* raw type tag of a TValue */ +#define rttype(o) ((o)->tt_) + +/* tag with no variants (bits 0-3) */ +#define novariant(x) ((x) & 0x0F) + +/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ +#define ttype(o) (rttype(o) & 0x3F) + +/* type tag of a TValue with no variants (bits 0-3) */ +#define ttnov(o) (novariant(rttype(o))) + + +/* Macros to test type */ +#define checktag(o,t) (rttype(o) == (t)) +#define checktype(o,t) (ttnov(o) == (t)) +#define ttisnumber(o) checktype((o), LUA_TNUMBER) +#define ttisfloat(o) checktag((o), LUA_TNUMFLT) +#define ttisinteger(o) checktag((o), LUA_TNUMINT) +#define ttisnil(o) checktag((o), LUA_TNIL) +#define ttisboolean(o) checktag((o), LUA_TBOOLEAN) +#define ttislightuserdata(o) checktag((o), LUA_TLIGHTUSERDATA) +#define ttisstring(o) checktype((o), LUA_TSTRING) +#define ttisshrstring(o) checktag((o), ctb(LUA_TSHRSTR)) +#define ttislngstring(o) checktag((o), ctb(LUA_TLNGSTR)) +#define ttistable(o) checktag((o), ctb(LUA_TTABLE)) +#define ttisfunction(o) checktype(o, LUA_TFUNCTION) +#define ttisclosure(o) ((rttype(o) & 0x1F) == LUA_TFUNCTION) +#define ttisCclosure(o) checktag((o), ctb(LUA_TCCL)) +#define ttisLclosure(o) checktag((o), ctb(LUA_TLCL)) +#define ttislcf(o) checktag((o), LUA_TLCF) +#define ttisfulluserdata(o) checktag((o), ctb(LUA_TUSERDATA)) +#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD)) +#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY) + + +/* Macros to access values */ +#define ivalue(o) check_exp(ttisinteger(o), val_(o).i) +#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) +#define nvalue(o) check_exp(ttisnumber(o), \ + (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) +#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) +#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) +#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) +#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc)) +#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) +#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc)) +#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc)) +#define fvalue(o) check_exp(ttislcf(o), val_(o).f) +#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc)) +#define bvalue(o) check_exp(ttisboolean(o), val_(o).b) +#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc)) +/* a dead value may get the 'gc' field, but cannot access its contents */ +#define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc)) + +#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) + + +#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE) + + +/* Macros for internal tests */ +#define righttt(obj) (ttype(obj) == gcvalue(obj)->tt) + +#define checkliveness(L,obj) \ + lua_longassert(!iscollectable(obj) || \ + (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj))))) + + +/* Macros to set values */ +#define settt_(o,t) ((o)->tt_=(t)) + +#define setfltvalue(obj,x) \ + { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_TNUMFLT); } + +#define chgfltvalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); } + +#define setivalue(obj,x) \ + { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_TNUMINT); } + +#define chgivalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); } + +#define setnilvalue(obj) settt_(obj, LUA_TNIL) + +#define setfvalue(obj,x) \ + { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_TLCF); } + +#define setpvalue(obj,x) \ + { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_TLIGHTUSERDATA); } + +#define setbvalue(obj,x) \ + { TValue *io=(obj); val_(io).b=(x); settt_(io, LUA_TBOOLEAN); } + +#define setgcovalue(L,obj,x) \ + { TValue *io = (obj); GCObject *i_g=(x); \ + val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } + +#define setsvalue(L,obj,x) \ + { TValue *io = (obj); TString *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ + checkliveness(L,io); } + +#define setuvalue(L,obj,x) \ + { TValue *io = (obj); Udata *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TUSERDATA)); \ + checkliveness(L,io); } + +#define setthvalue(L,obj,x) \ + { TValue *io = (obj); lua_State *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTHREAD)); \ + checkliveness(L,io); } + +#define setclLvalue(L,obj,x) \ + { TValue *io = (obj); LClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TLCL)); \ + checkliveness(L,io); } + +#define setclCvalue(L,obj,x) \ + { TValue *io = (obj); CClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TCCL)); \ + checkliveness(L,io); } + +#define sethvalue(L,obj,x) \ + { TValue *io = (obj); Table *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_TTABLE)); \ + checkliveness(L,io); } + +#define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY) + + + +#define setobj(L,obj1,obj2) \ + { TValue *io1=(obj1); *io1 = *(obj2); \ + (void)L; checkliveness(L,io1); } + + +/* +** different types of assignments, 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 new object */ +#define setobj2n setobj +#define setsvalue2n setsvalue + +/* to table (define it as an expression to be used in macros) */ +#define setobj2t(L,o1,o2) ((void)L, *(o1)=*(o2), checkliveness(L,(o1))) + + + + +/* +** {====================================================== +** types and prototypes +** ======================================================= +*/ + + +typedef TValue *StkId; /* index to stack elements */ + + + + +/* +** Header for string value; string bytes follow the end of this structure +** (aligned according to 'UTString'; see next). +*/ +typedef struct TString { + CommonHeader; + lu_byte extra; /* reserved words for short strings; "has hash" for longs */ + lu_byte shrlen; /* length for short strings */ + unsigned int hash; + union { + size_t lnglen; /* length for long strings */ + struct TString *hnext; /* linked list for hash table */ + } u; +} TString; + + +/* +** Ensures that address after this type is always fully aligned. +*/ +typedef union UTString { + L_Umaxalign dummy; /* ensures maximum alignment for strings */ + TString tsv; +} UTString; + + +/* +** Get the actual string (array of bytes) from a 'TString'. +** (Access to 'extra' ensures that value is really a 'TString'.) +*/ +#define getstr(ts) \ + check_exp(sizeof((ts)->extra), cast(char *, (ts)) + sizeof(UTString)) + + +/* get the actual string (array of bytes) from a Lua value */ +#define svalue(o) getstr(tsvalue(o)) + +/* get string length from 'TString *s' */ +#define tsslen(s) ((s)->tt == LUA_TSHRSTR ? (s)->shrlen : (s)->u.lnglen) + +/* get string length from 'TValue *o' */ +#define vslen(o) tsslen(tsvalue(o)) + + +/* +** Header for userdata; memory area follows the end of this structure +** (aligned according to 'UUdata'; see next). +*/ +typedef struct Udata { + CommonHeader; + lu_byte ttuv_; /* user value's tag */ + struct Table *metatable; + size_t len; /* number of bytes */ + union Value user_; /* user value */ +} Udata; + + +/* +** Ensures that address after this type is always fully aligned. +*/ +typedef union UUdata { + L_Umaxalign dummy; /* ensures maximum alignment for 'local' udata */ + Udata uv; +} UUdata; + + +/* +** Get the address of memory block inside 'Udata'. +** (Access to 'ttuv_' ensures that value is really a 'Udata'.) +*/ +#define getudatamem(u) \ + check_exp(sizeof((u)->ttuv_), (cast(char*, (u)) + sizeof(UUdata))) + +#define setuservalue(L,u,o) \ + { const TValue *io=(o); Udata *iu = (u); \ + iu->user_ = io->value_; iu->ttuv_ = rttype(io); \ + checkliveness(L,io); } + + +#define getuservalue(L,u,o) \ + { TValue *io=(o); const Udata *iu = (u); \ + io->value_ = iu->user_; settt_(io, iu->ttuv_); \ + checkliveness(L,io); } + + +/* +** Description of an upvalue for function prototypes +*/ +typedef struct Upvaldesc { + TString *name; /* upvalue name (for debug information) */ + lu_byte instack; /* whether it is in stack (register) */ + lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ +} Upvaldesc; + + +/* +** Description of a local variable for function prototypes +** (used for debug information) +*/ +typedef struct LocVar { + TString *varname; + int startpc; /* first point where variable is active */ + int endpc; /* first point where variable is dead */ +} LocVar; + + +/* +** Function Prototypes +*/ +typedef struct Proto { + CommonHeader; + lu_byte numparams; /* number of fixed parameters */ + lu_byte is_vararg; /* 2: declared vararg; 1: uses vararg */ + lu_byte maxstacksize; /* number of registers needed by this function */ + int sizeupvalues; /* size of 'upvalues' */ + int sizek; /* size of 'k' */ + int sizecode; + int sizelineinfo; + int sizep; /* size of 'p' */ + int sizelocvars; + int linedefined; /* debug information */ + int lastlinedefined; /* debug information */ + TValue *k; /* constants used by the function */ + Instruction *code; /* opcodes */ + struct Proto **p; /* functions defined inside the function */ + int *lineinfo; /* map from opcodes to source lines (debug information) */ + LocVar *locvars; /* information about local variables (debug information) */ + Upvaldesc *upvalues; /* upvalue information */ + struct LClosure *cache; /* last-created closure with this prototype */ + TString *source; /* used for debug information */ + GCObject *gclist; +} Proto; + + + +/* +** Lua Upvalues +*/ +typedef struct UpVal UpVal; + + +/* +** Closures +*/ + +#define ClosureHeader \ + CommonHeader; lu_byte nupvalues; GCObject *gclist + +typedef struct CClosure { + ClosureHeader; + lua_CFunction f; + TValue upvalue[1]; /* list of upvalues */ +} CClosure; + + +typedef struct LClosure { + ClosureHeader; + struct Proto *p; + UpVal *upvals[1]; /* list of upvalues */ +} LClosure; + + +typedef union Closure { + CClosure c; + LClosure l; +} Closure; + + +#define isLfunction(o) ttisLclosure(o) + +#define getproto(o) (clLvalue(o)->p) + + +/* +** Tables +*/ + +typedef union TKey { + struct { + TValuefields; + int next; /* for chaining (offset for next node) */ + } nk; + TValue tvk; +} TKey; + + +/* copy a value into a key without messing up field 'next' */ +#define setnodekey(L,key,obj) \ + { TKey *k_=(key); const TValue *io_=(obj); \ + k_->nk.value_ = io_->value_; k_->nk.tt_ = io_->tt_; \ + (void)L; checkliveness(L,io_); } + + +typedef struct Node { + TValue i_val; + TKey i_key; +} Node; + + +typedef struct Table { + CommonHeader; + lu_byte flags; /* 1<

lsizenode)) + + +/* +** (address of) a fixed nil value +*/ +#define luaO_nilobject (&luaO_nilobject_) + + +LUAI_DDEC const TValue luaO_nilobject_; + +/* size of buffer for 'luaO_utf8esc' function */ +#define UTF8BUFFSZ 8 + +LUAI_FUNC int luaO_int2fb (unsigned int x); +LUAI_FUNC int luaO_fb2int (int x); +LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); +LUAI_FUNC int luaO_ceillog2 (unsigned int x); +LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, + const TValue *p2, TValue *res); +LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); +LUAI_FUNC int luaO_hexavalue (int c); +LUAI_FUNC void luaO_tostring (lua_State *L, StkId obj); +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/lua-5.3.3/src/lopcodes.c b/lua-5.3.3/src/lopcodes.c new file mode 100644 index 0000000..a1cbef8 --- /dev/null +++ b/lua-5.3.3/src/lopcodes.c @@ -0,0 +1,124 @@ +/* +** $Id: lopcodes.c,v 1.55 2015/01/05 13:48:33 roberto Exp $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#define lopcodes_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lopcodes.h" + + +/* ORDER OP */ + +LUAI_DDEF const char *const luaP_opnames[NUM_OPCODES+1] = { + "MOVE", + "LOADK", + "LOADKX", + "LOADBOOL", + "LOADNIL", + "GETUPVAL", + "GETTABUP", + "GETTABLE", + "SETTABUP", + "SETUPVAL", + "SETTABLE", + "NEWTABLE", + "SELF", + "ADD", + "SUB", + "MUL", + "MOD", + "POW", + "DIV", + "IDIV", + "BAND", + "BOR", + "BXOR", + "SHL", + "SHR", + "UNM", + "BNOT", + "NOT", + "LEN", + "CONCAT", + "JMP", + "EQ", + "LT", + "LE", + "TEST", + "TESTSET", + "CALL", + "TAILCALL", + "RETURN", + "FORLOOP", + "FORPREP", + "TFORCALL", + "TFORLOOP", + "SETLIST", + "CLOSURE", + "VARARG", + "EXTRAARG", + NULL +}; + + +#define opmode(t,a,b,c,m) (((t)<<7) | ((a)<<6) | ((b)<<4) | ((c)<<2) | (m)) + +LUAI_DDEF 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, OpArgN, OpArgN, iABx) /* OP_LOADKX */ + ,opmode(0, 1, OpArgU, OpArgU, iABC) /* OP_LOADBOOL */ + ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_LOADNIL */ + ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_GETUPVAL */ + ,opmode(0, 1, OpArgU, OpArgK, iABC) /* OP_GETTABUP */ + ,opmode(0, 1, OpArgR, OpArgK, iABC) /* OP_GETTABLE */ + ,opmode(0, 0, OpArgK, OpArgK, iABC) /* OP_SETTABUP */ + ,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_MOD */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_POW */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_DIV */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_IDIV */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BAND */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BOR */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_BXOR */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SHL */ + ,opmode(0, 1, OpArgK, OpArgK, iABC) /* OP_SHR */ + ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_UNM */ + ,opmode(0, 1, OpArgR, OpArgN, iABC) /* OP_BNOT */ + ,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, 0, OpArgN, 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(0, 0, OpArgN, OpArgU, iABC) /* OP_TFORCALL */ + ,opmode(0, 1, OpArgR, OpArgN, iAsBx) /* OP_TFORLOOP */ + ,opmode(0, 0, OpArgU, OpArgU, iABC) /* OP_SETLIST */ + ,opmode(0, 1, OpArgU, OpArgN, iABx) /* OP_CLOSURE */ + ,opmode(0, 1, OpArgU, OpArgN, iABC) /* OP_VARARG */ + ,opmode(0, 0, OpArgU, OpArgU, iAx) /* OP_EXTRAARG */ +}; + diff --git a/lua-5.3.3/src/lopcodes.h b/lua-5.3.3/src/lopcodes.h new file mode 100644 index 0000000..864b8e4 --- /dev/null +++ b/lua-5.3.3/src/lopcodes.h @@ -0,0 +1,295 @@ +/* +** $Id: lopcodes.h,v 1.148 2014/10/25 11:50:46 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 + 'Ax' : 26 bits ('A', 'B', and 'C' together) + '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, iAx}; /* 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_Ax (SIZE_C + SIZE_B + SIZE_A) + +#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 +#define POS_Ax POS_A + + +/* +** 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 + +#if SIZE_Ax < LUAI_BITSINT-1 +#define MAXARG_Ax ((1<>POS_OP) & MASK1(SIZE_OP,0))) +#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ + ((cast(Instruction, o)<>pos) & MASK1(size,0))) +#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ + ((cast(Instruction, v)<> RK(C) */ +OP_UNM,/* A B R(A) := -R(B) */ +OP_BNOT,/* A B R(A) := ~R(B) */ +OP_NOT,/* A B R(A) := not R(B) */ +OP_LEN,/* A B R(A) := length of R(B) */ + +OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */ + +OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A - 1) */ +OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */ +OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */ +OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */ + +OP_TEST,/* A C if not (R(A) <=> 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) > 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_DDEC 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/lua-5.3.3/src/loslib.c b/lua-5.3.3/src/loslib.c new file mode 100644 index 0000000..4810655 --- /dev/null +++ b/lua-5.3.3/src/loslib.c @@ -0,0 +1,403 @@ +/* +** $Id: loslib.c,v 1.64 2016/04/18 13:06:55 roberto Exp $ +** Standard Operating System library +** See Copyright Notice in lua.h +*/ + +#define loslib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** {================================================================== +** List of valid conversion specifiers for the 'strftime' function; +** options are grouped by length; group of length 2 start with '||'. +** =================================================================== +*/ +#if !defined(LUA_STRFTIMEOPTIONS) /* { */ + +/* options for ANSI C 89 */ +#define L_STRFTIMEC89 "aAbBcdHIjmMpSUwWxXyYZ%" + +/* options for ISO C 99 and POSIX */ +#define L_STRFTIMEC99 "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \ + "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" + +/* options for Windows */ +#define L_STRFTIMEWIN "aAbBcdHIjmMpSUwWxXyYzZ%" \ + "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" + +#if defined(LUA_USE_WINDOWS) +#define LUA_STRFTIMEOPTIONS L_STRFTIMEWIN +#elif defined(LUA_USE_C89) +#define LUA_STRFTIMEOPTIONS L_STRFTIMEC89 +#else /* C99 specification */ +#define LUA_STRFTIMEOPTIONS L_STRFTIMEC99 +#endif + +#endif /* } */ +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for time-related stuff +** =================================================================== +*/ + +#if !defined(l_time_t) /* { */ +/* +** type to represent time_t in Lua +*/ +#define l_timet lua_Integer +#define l_pushtime(L,t) lua_pushinteger(L,(lua_Integer)(t)) + +static time_t l_checktime (lua_State *L, int arg) { + lua_Integer t = luaL_checkinteger(L, arg); + luaL_argcheck(L, (time_t)t == t, arg, "time out-of-bounds"); + return (time_t)t; +} + +#endif /* } */ + + +#if !defined(l_gmtime) /* { */ +/* +** By default, Lua uses gmtime/localtime, except when POSIX is available, +** where it uses gmtime_r/localtime_r +*/ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_gmtime(t,r) gmtime_r(t,r) +#define l_localtime(t,r) localtime_r(t,r) + +#else /* }{ */ + +/* ISO C definitions */ +#define l_gmtime(t,r) ((void)(r)->tm_sec, gmtime(t)) +#define l_localtime(t,r) ((void)(r)->tm_sec, localtime(t)) + +#endif /* } */ + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for 'tmpnam': +** By default, Lua uses tmpnam except when POSIX is available, where +** it uses mkstemp. +** =================================================================== +*/ +#if !defined(lua_tmpnam) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include + +#define LUA_TMPNAMBUFSIZE 32 + +#if !defined(LUA_TMPNAMTEMPLATE) +#define LUA_TMPNAMTEMPLATE "/tmp/lua_XXXXXX" +#endif + +#define lua_tmpnam(b,e) { \ + strcpy(b, LUA_TMPNAMTEMPLATE); \ + e = mkstemp(b); \ + if (e != -1) close(e); \ + e = (e == -1); } + +#else /* }{ */ + +/* ISO C definitions */ +#define LUA_TMPNAMBUFSIZE L_tmpnam +#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } + +#endif /* } */ + +#endif /* } */ +/* }================================================================== */ + + + + +static int os_execute (lua_State *L) { + const char *cmd = luaL_optstring(L, 1, NULL); + int stat = system(cmd); + if (cmd != NULL) + return luaL_execresult(L, stat); + else { + lua_pushboolean(L, stat); /* true if there is a shell */ + return 1; + } +} + + +static int os_remove (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + return luaL_fileresult(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 luaL_fileresult(L, rename(fromname, toname) == 0, NULL); +} + + +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); +} + + +/* +** Set all fields from structure 'tm' in the table on top of the stack +*/ +static void setallfields (lua_State *L, struct tm *stm) { + 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); +} + + +static int getboolfield (lua_State *L, const char *key) { + int res; + res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1); + lua_pop(L, 1); + return res; +} + + +/* maximum value for date fields (to avoid arithmetic overflows with 'int') */ +#if !defined(L_MAXDATEFIELD) +#define L_MAXDATEFIELD (INT_MAX / 2) +#endif + +static int getfield (lua_State *L, const char *key, int d, int delta) { + int isnum; + int t = lua_getfield(L, -1, key); /* get field and its type */ + lua_Integer res = lua_tointegerx(L, -1, &isnum); + if (!isnum) { /* field is not an integer? */ + if (t != LUA_TNIL) /* some other value? */ + return luaL_error(L, "field '%s' is not an integer", key); + else if (d < 0) /* absent field; no default? */ + return luaL_error(L, "field '%s' missing in date table", key); + res = d; + } + else { + if (!(-L_MAXDATEFIELD <= res && res <= L_MAXDATEFIELD)) + return luaL_error(L, "field '%s' is out-of-bound", key); + res -= delta; + } + lua_pop(L, 1); + return (int)res; +} + + +static const char *checkoption (lua_State *L, const char *conv, char *buff) { + const char *option; + int oplen = 1; + for (option = LUA_STRFTIMEOPTIONS; *option != '\0'; option += oplen) { + if (*option == '|') /* next block? */ + oplen++; /* next length */ + else if (memcmp(conv, option, oplen) == 0) { /* match? */ + memcpy(buff, conv, oplen); /* copy valid option to buffer */ + buff[oplen] = '\0'; + return conv + oplen; /* return next item */ + } + } + luaL_argerror(L, 1, + lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv)); + return conv; /* to avoid warnings */ +} + + +/* maximum size for an individual 'strftime' item */ +#define SIZETIMEFMT 250 + + +static int os_date (lua_State *L) { + const char *s = luaL_optstring(L, 1, "%c"); + time_t t = luaL_opt(L, l_checktime, 2, time(NULL)); + struct tm tmr, *stm; + if (*s == '!') { /* UTC? */ + stm = l_gmtime(&t, &tmr); + s++; /* skip '!' */ + } + else + stm = l_localtime(&t, &tmr); + if (stm == NULL) /* invalid date? */ + luaL_error(L, "time result cannot be represented in this installation"); + if (strcmp(s, "*t") == 0) { + lua_createtable(L, 0, 9); /* 9 = number of fields */ + setallfields(L, stm); + } + else { + char cc[4]; /* buffer for individual conversion specifiers */ + luaL_Buffer b; + cc[0] = '%'; + luaL_buffinit(L, &b); + while (*s) { + if (*s != '%') /* not a conversion specifier? */ + luaL_addchar(&b, *s++); + else { + size_t reslen; + char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT); + s = checkoption(L, s + 1, cc + 1); /* copy specifier to 'cc' */ + reslen = strftime(buff, SIZETIMEFMT, cc, stm); + luaL_addsize(&b, 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, 0); + ts.tm_min = getfield(L, "min", 0, 0); + ts.tm_hour = getfield(L, "hour", 12, 0); + ts.tm_mday = getfield(L, "day", -1, 0); + 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); + setallfields(L, &ts); /* update fields with normalized values */ + } + if (t != (time_t)(l_timet)t || t == (time_t)(-1)) + luaL_error(L, "time result cannot be represented in this installation"); + l_pushtime(L, t); + return 1; +} + + +static int os_difftime (lua_State *L) { + time_t t1 = l_checktime(L, 1); + time_t t2 = l_checktime(L, 2); + lua_pushnumber(L, (lua_Number)difftime(t1, t2)); + 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) { + int status; + if (lua_isboolean(L, 1)) + status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE); + else + status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS); + if (lua_toboolean(L, 2)) + lua_close(L); + if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */ + return 0; +} + + +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} +}; + +/* }====================================================== */ + + + +LUAMOD_API int luaopen_os (lua_State *L) { + luaL_newlib(L, syslib); + return 1; +} + diff --git a/lua-5.3.3/src/lparser.c b/lua-5.3.3/src/lparser.c new file mode 100644 index 0000000..22530a5 --- /dev/null +++ b/lua-5.3.3/src/lparser.c @@ -0,0 +1,1652 @@ +/* +** $Id: lparser.c,v 2.153 2016/05/13 19:10:16 roberto Exp $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#define lparser_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#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" + + + +/* maximum number of local variables per function (must be smaller + than 250, due to the bytecode format) */ +#define MAXVARS 200 + + +#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) + + +/* because all strings are unified by the scanner, the parser + can use pointer equality for string equality */ +#define eqstr(a,b) ((a) == (b)) + + +/* +** nodes for block list (list of active blocks) +*/ +typedef struct BlockCnt { + struct BlockCnt *previous; /* chain */ + int firstlabel; /* index of first label in this block */ + int firstgoto; /* index of first pending goto in this block */ + lu_byte nactvar; /* # active locals outside the block */ + lu_byte upval; /* true if some variable in the block is an upvalue */ + lu_byte isloop; /* true if 'block' is a loop */ +} BlockCnt; + + + +/* +** prototypes for recursive non-terminal functions +*/ +static void statement (LexState *ls); +static void expr (LexState *ls, expdesc *v); + + +/* semantic error */ +static l_noret semerror (LexState *ls, const char *msg) { + ls->t.token = 0; /* remove "near " from final message */ + luaX_syntaxerror(ls, msg); +} + + +static l_noret error_expected (LexState *ls, int token) { + luaX_syntaxerror(ls, + luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); +} + + +static l_noret errorlimit (FuncState *fs, int limit, const char *what) { + lua_State *L = fs->ls->L; + const char *msg; + int line = fs->f->linedefined; + const char *where = (line == 0) + ? "main function" + : luaO_pushfstring(L, "function at line %d", line); + msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s", + what, limit, where); + luaX_syntaxerror(fs->ls, msg); +} + + +static void checklimit (FuncState *fs, int v, int l, const char *what) { + if (v > l) errorlimit(fs, l, what); +} + + +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, + "%s expected (to close %s 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.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, "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++; +} + + +static void new_localvar (LexState *ls, TString *name) { + FuncState *fs = ls->fs; + Dyndata *dyd = ls->dyd; + int reg = registerlocalvar(ls, name); + checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal, + MAXVARS, "local variables"); + luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, + dyd->actvar.size, Vardesc, MAX_INT, "local variables"); + dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg); +} + + +static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) { + new_localvar(ls, luaX_newstring(ls, name, sz)); +} + +#define new_localvarliteral(ls,v) \ + new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1) + + +static LocVar *getlocvar (FuncState *fs, int i) { + int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; + lua_assert(idx < fs->nlocvars); + return &fs->f->locvars[idx]; +} + + +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 (FuncState *fs, int tolevel) { + fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); + while (fs->nactvar > tolevel) + getlocvar(fs, --fs->nactvar)->endpc = fs->pc; +} + + +static int searchupvalue (FuncState *fs, TString *name) { + int i; + Upvaldesc *up = fs->f->upvalues; + for (i = 0; i < fs->nups; i++) { + if (eqstr(up[i].name, name)) return i; + } + return -1; /* not found */ +} + + +static int newupvalue (FuncState *fs, TString *name, expdesc *v) { + Proto *f = fs->f; + int oldsize = f->sizeupvalues; + checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); + luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, + Upvaldesc, MAXUPVAL, "upvalues"); + while (oldsize < f->sizeupvalues) + f->upvalues[oldsize++].name = NULL; + f->upvalues[fs->nups].instack = (v->k == VLOCAL); + f->upvalues[fs->nups].idx = cast_byte(v->u.info); + f->upvalues[fs->nups].name = name; + luaC_objbarrier(fs->ls->L, f, name); + return fs->nups++; +} + + +static int searchvar (FuncState *fs, TString *n) { + int i; + for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) { + if (eqstr(n, getlocvar(fs, i)->varname)) + return i; + } + return -1; /* not found */ +} + + +/* + Mark block where variable at given level was defined + (to emit close instructions later). +*/ +static void markupval (FuncState *fs, int level) { + BlockCnt *bl = fs->bl; + while (bl->nactvar > level) + bl = bl->previous; + bl->upval = 1; +} + + +/* + Find variable with given name 'n'. If it is an upvalue, add this + upvalue into all intermediate functions. +*/ +static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { + if (fs == NULL) /* no more levels? */ + init_exp(var, VVOID, 0); /* default is global */ + else { + int v = searchvar(fs, n); /* look up locals at current level */ + if (v >= 0) { /* found? */ + init_exp(var, VLOCAL, v); /* variable is local */ + if (!base) + markupval(fs, v); /* local will be used as an upval */ + } + else { /* not found as local at current level; try upvalues */ + int idx = searchupvalue(fs, n); /* try existing upvalues */ + if (idx < 0) { /* not found? */ + singlevaraux(fs->prev, n, var, 0); /* try upper levels */ + if (var->k == VVOID) /* not found? */ + return; /* it is a global */ + /* else was LOCAL or UPVAL */ + idx = newupvalue(fs, n, var); /* will be a new upvalue */ + } + init_exp(var, VUPVAL, idx); /* new or old upvalue */ + } + } +} + + +static void singlevar (LexState *ls, expdesc *var) { + TString *varname = str_checkname(ls); + FuncState *fs = ls->fs; + singlevaraux(fs, varname, var, 1); + if (var->k == VVOID) { /* global name? */ + expdesc key; + singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ + lua_assert(var->k != VVOID); /* this one must exist */ + codestring(ls, &key, varname); /* key is variable name */ + luaK_indexed(fs, var, &key); /* env[varname] */ + } +} + + +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) { + lua_State *L = ls->L; + ++L->nCcalls; + checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels"); +} + + +#define leavelevel(ls) ((ls)->L->nCcalls--) + + +static void closegoto (LexState *ls, int g, Labeldesc *label) { + int i; + FuncState *fs = ls->fs; + Labellist *gl = &ls->dyd->gt; + Labeldesc *gt = &gl->arr[g]; + lua_assert(eqstr(gt->name, label->name)); + if (gt->nactvar < label->nactvar) { + TString *vname = getlocvar(fs, gt->nactvar)->varname; + const char *msg = luaO_pushfstring(ls->L, + " at line %d jumps into the scope of local '%s'", + getstr(gt->name), gt->line, getstr(vname)); + semerror(ls, msg); + } + luaK_patchlist(fs, gt->pc, label->pc); + /* remove goto from pending list */ + for (i = g; i < gl->n - 1; i++) + gl->arr[i] = gl->arr[i + 1]; + gl->n--; +} + + +/* +** try to close a goto with existing labels; this solves backward jumps +*/ +static int findlabel (LexState *ls, int g) { + int i; + BlockCnt *bl = ls->fs->bl; + Dyndata *dyd = ls->dyd; + Labeldesc *gt = &dyd->gt.arr[g]; + /* check labels in current block for a match */ + for (i = bl->firstlabel; i < dyd->label.n; i++) { + Labeldesc *lb = &dyd->label.arr[i]; + if (eqstr(lb->name, gt->name)) { /* correct label? */ + if (gt->nactvar > lb->nactvar && + (bl->upval || dyd->label.n > bl->firstlabel)) + luaK_patchclose(ls->fs, gt->pc, lb->nactvar); + closegoto(ls, g, lb); /* close it */ + return 1; + } + } + return 0; /* label not found; cannot close goto */ +} + + +static int newlabelentry (LexState *ls, Labellist *l, TString *name, + int line, int pc) { + int n = l->n; + luaM_growvector(ls->L, l->arr, n, l->size, + Labeldesc, SHRT_MAX, "labels/gotos"); + l->arr[n].name = name; + l->arr[n].line = line; + l->arr[n].nactvar = ls->fs->nactvar; + l->arr[n].pc = pc; + l->n = n + 1; + return n; +} + + +/* +** check whether new label 'lb' matches any pending gotos in current +** block; solves forward jumps +*/ +static void findgotos (LexState *ls, Labeldesc *lb) { + Labellist *gl = &ls->dyd->gt; + int i = ls->fs->bl->firstgoto; + while (i < gl->n) { + if (eqstr(gl->arr[i].name, lb->name)) + closegoto(ls, i, lb); + else + i++; + } +} + + +/* +** export pending gotos to outer level, to check them against +** outer labels; if the block being exited has upvalues, and +** the goto exits the scope of any variable (which can be the +** upvalue), close those variables being exited. +*/ +static void movegotosout (FuncState *fs, BlockCnt *bl) { + int i = bl->firstgoto; + Labellist *gl = &fs->ls->dyd->gt; + /* correct pending gotos to current block and try to close it + with visible labels */ + while (i < gl->n) { + Labeldesc *gt = &gl->arr[i]; + if (gt->nactvar > bl->nactvar) { + if (bl->upval) + luaK_patchclose(fs, gt->pc, bl->nactvar); + gt->nactvar = bl->nactvar; + } + if (!findlabel(fs->ls, i)) + i++; /* move to next one */ + } +} + + +static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { + bl->isloop = isloop; + bl->nactvar = fs->nactvar; + bl->firstlabel = fs->ls->dyd->label.n; + bl->firstgoto = fs->ls->dyd->gt.n; + bl->upval = 0; + bl->previous = fs->bl; + fs->bl = bl; + lua_assert(fs->freereg == fs->nactvar); +} + + +/* +** create a label named 'break' to resolve break statements +*/ +static void breaklabel (LexState *ls) { + TString *n = luaS_new(ls->L, "break"); + int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc); + findgotos(ls, &ls->dyd->label.arr[l]); +} + +/* +** generates an error for an undefined 'goto'; choose appropriate +** message when label name is a reserved word (which can only be 'break') +*/ +static l_noret undefgoto (LexState *ls, Labeldesc *gt) { + const char *msg = isreserved(gt->name) + ? "<%s> at line %d not inside a loop" + : "no visible label '%s' for at line %d"; + msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); + semerror(ls, msg); +} + + +static void leaveblock (FuncState *fs) { + BlockCnt *bl = fs->bl; + LexState *ls = fs->ls; + if (bl->previous && bl->upval) { + /* create a 'jump to here' to close upvalues */ + int j = luaK_jump(fs); + luaK_patchclose(fs, j, bl->nactvar); + luaK_patchtohere(fs, j); + } + if (bl->isloop) + breaklabel(ls); /* close pending breaks */ + fs->bl = bl->previous; + removevars(fs, bl->nactvar); + lua_assert(bl->nactvar == fs->nactvar); + fs->freereg = fs->nactvar; /* free registers */ + ls->dyd->label.n = bl->firstlabel; /* remove local labels */ + if (bl->previous) /* inner block? */ + movegotosout(fs, bl); /* update pending gotos to outer block */ + else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ + undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ +} + + +/* +** adds a new prototype into list of prototypes +*/ +static Proto *addprototype (LexState *ls) { + Proto *clp; + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; /* prototype of current function */ + if (fs->np >= f->sizep) { + int oldsize = f->sizep; + luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions"); + while (oldsize < f->sizep) + f->p[oldsize++] = NULL; + } + f->p[fs->np++] = clp = luaF_newproto(L); + luaC_objbarrier(L, f, clp); + return clp; +} + + +/* +** codes instruction to create new closure in parent function. +** The OP_CLOSURE instruction must use the last available register, +** so that, if it invokes the GC, the GC knows which registers +** are in use at that time. +*/ +static void codeclosure (LexState *ls, expdesc *v) { + FuncState *fs = ls->fs->prev; + init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1)); + luaK_exp2nextreg(fs, v); /* fix it at the last register */ +} + + +static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { + Proto *f; + fs->prev = ls->fs; /* linked list of funcstates */ + fs->ls = ls; + ls->fs = fs; + fs->pc = 0; + fs->lasttarget = 0; + fs->jpc = NO_JUMP; + fs->freereg = 0; + fs->nk = 0; + fs->np = 0; + fs->nups = 0; + fs->nlocvars = 0; + fs->nactvar = 0; + fs->firstlocal = ls->dyd->actvar.n; + fs->bl = NULL; + f = fs->f; + f->source = ls->source; + f->maxstacksize = 2; /* registers 0/1 are always valid */ + enterblock(fs, bl, 0); +} + + +static void close_func (LexState *ls) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; + luaK_ret(fs, 0, 0); /* final return */ + leaveblock(fs); + 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, fs->nups, Upvaldesc); + f->sizeupvalues = fs->nups; + lua_assert(fs->bl == NULL); + ls->fs = fs->prev; + luaC_checkGC(L); +} + + + +/*============================================================*/ +/* GRAMMAR RULES */ +/*============================================================*/ + + +/* +** check whether current token is in the follow set of a block. +** 'until' closes syntactical blocks, but do not close scope, +** so it is handled in separate. +*/ +static int block_follow (LexState *ls, int withuntil) { + switch (ls->t.token) { + case TK_ELSE: case TK_ELSEIF: + case TK_END: case TK_EOS: + return 1; + case TK_UNTIL: return withuntil; + default: return 0; + } +} + + +static void statlist (LexState *ls) { + /* statlist -> { stat [';'] } */ + while (!block_follow(ls, 1)) { + if (ls->t.token == TK_RETURN) { + statement(ls); + return; /* 'return' must be last statement */ + } + statement(ls); + } +} + + +static void fieldsel (LexState *ls, expdesc *v) { + /* fieldsel -> ['.' | ':'] NAME */ + FuncState *fs = ls->fs; + expdesc key; + luaK_exp2anyregup(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) { + 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.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.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.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.info, cc->na, cc->tostore); + } +} + + +static void listfield (LexState *ls, struct ConsControl *cc) { + /* listfield -> exp */ + expr(ls, &cc->v); + checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); + cc->na++; + cc->tostore++; +} + + +static void field (LexState *ls, struct ConsControl *cc) { + /* field -> listfield | recfield */ + switch(ls->t.token) { + case TK_NAME: { /* may be 'listfield' or 'recfield' */ + if (luaX_lookahead(ls) != '=') /* expression? */ + listfield(ls, cc); + else + recfield(ls, cc); + break; + } + case '[': { + recfield(ls, cc); + break; + } + default: { + listfield(ls, cc); + break; + } + } +} + + +static void constructor (LexState *ls, expdesc *t) { + /* constructor -> '{' [ field { sep field } [sep] ] '}' + sep -> ',' | ';' */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + 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 */ + checknext(ls, '{'); + do { + lua_assert(cc.v.k == VVOID || cc.tostore > 0); + if (ls->t.token == '}') break; + closelistfield(fs, &cc); + field(ls, &cc); + } 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); + f->is_vararg = 2; /* declared vararg */ + break; + } + default: luaX_syntaxerror(ls, " or '...' expected"); + } + } while (!f->is_vararg && testnext(ls, ',')); + } + adjustlocalvars(ls, nparams); + f->numparams = cast_byte(fs->nactvar); + luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ +} + + +static void body (LexState *ls, expdesc *e, int ismethod, int line) { + /* body -> '(' parlist ')' block END */ + FuncState new_fs; + BlockCnt bl; + new_fs.f = addprototype(ls); + new_fs.f->linedefined = line; + open_func(ls, &new_fs, &bl); + checknext(ls, '('); + if (ismethod) { + new_localvarliteral(ls, "self"); /* create 'self' parameter */ + adjustlocalvars(ls, 1); + } + parlist(ls); + checknext(ls, ')'); + statlist(ls); + new_fs.f->lastlinedefined = ls->linenumber; + check_match(ls, TK_END, TK_FUNCTION, line); + codeclosure(ls, e); + close_func(ls); +} + + +static int explist (LexState *ls, expdesc *v) { + /* explist -> 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, int line) { + FuncState *fs = ls->fs; + expdesc args; + int base, nparams; + switch (ls->t.token) { + case '(': { /* funcargs -> '(' [ explist ] ')' */ + luaX_next(ls); + if (ls->t.token == ')') /* arg list is empty? */ + args.k = VVOID; + else { + explist(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"); + } + } + lua_assert(f->k == VNONRELOC); + base = f->u.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 primaryexp (LexState *ls, expdesc *v) { + /* primaryexp -> 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"); + } + } +} + + +static void suffixedexp (LexState *ls, expdesc *v) { + /* suffixedexp -> + primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + primaryexp(ls, v); + for (;;) { + switch (ls->t.token) { + case '.': { /* fieldsel */ + fieldsel(ls, v); + break; + } + case '[': { /* '[' exp1 ']' */ + expdesc key; + luaK_exp2anyregup(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, line); + break; + } + case '(': case TK_STRING: case '{': { /* funcargs */ + luaK_exp2nextreg(fs, v); + funcargs(ls, v, line); + break; + } + default: return; + } + } +} + + +static void simpleexp (LexState *ls, expdesc *v) { + /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... | + constructor | FUNCTION body | suffixedexp */ + switch (ls->t.token) { + case TK_FLT: { + init_exp(v, VKFLT, 0); + v->u.nval = ls->t.seminfo.r; + break; + } + case TK_INT: { + init_exp(v, VKINT, 0); + v->u.ival = ls->t.seminfo.i; + 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 '...' outside a vararg function"); + fs->f->is_vararg = 1; /* function actually uses vararg */ + 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: { + suffixedexp(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_BNOT; + 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_MOD; + case '^': return OPR_POW; + case '/': return OPR_DIV; + case TK_IDIV: return OPR_IDIV; + case '&': return OPR_BAND; + case '|': return OPR_BOR; + case '~': return OPR_BXOR; + case TK_SHL: return OPR_SHL; + case TK_SHR: return OPR_SHR; + 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 */ + {10, 10}, {10, 10}, /* '+' '-' */ + {11, 11}, {11, 11}, /* '*' '%' */ + {14, 13}, /* '^' (right associative) */ + {11, 11}, {11, 11}, /* '/' '//' */ + {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */ + {7, 7}, {7, 7}, /* '<<' '>>' */ + {9, 8}, /* '..' (right associative) */ + {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */ + {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */ + {2, 2}, {1, 1} /* and, or */ +}; + +#define UNARY_PRIORITY 12 /* 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, int limit) { + BinOpr op; + UnOpr uop; + enterlevel(ls); + uop = getunopr(ls->t.token); + if (uop != OPR_NOUNOPR) { + int line = ls->linenumber; + luaX_next(ls); + subexpr(ls, v, UNARY_PRIORITY); + luaK_prefix(ls->fs, uop, v, line); + } + 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; + int line = ls->linenumber; + 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, line); + 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 void block (LexState *ls) { + /* block -> statlist */ + FuncState *fs = ls->fs; + BlockCnt bl; + enterblock(fs, &bl, 0); + statlist(ls); + 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 an upvalue/local variable, the +** upvalue/local variable is begin used in a previous assignment to a +** table. If so, save original upvalue/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) { /* check all previous assignments */ + if (lh->v.k == VINDEXED) { /* assigning to a table? */ + /* table is the upvalue/local being assigned now? */ + if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) { + conflict = 1; + lh->v.u.ind.vt = VLOCAL; + lh->v.u.ind.t = extra; /* previous assignment will use safe copy */ + } + /* index is the local being assigned? (index cannot be upvalue) */ + if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) { + conflict = 1; + lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */ + } + } + } + if (conflict) { + /* copy upvalue/local value to a temporary (in position 'extra') */ + OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; + luaK_codeABC(fs, op, extra, v->u.info, 0); + luaK_reserveregs(fs, 1); + } +} + + +static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { + expdesc e; + check_condition(ls, vkisvar(lh->v.k), "syntax error"); + if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ + struct LHS_assign nv; + nv.prev = lh; + suffixedexp(ls, &nv.v); + if (nv.v.k != VINDEXED) + check_conflict(ls, lh, &nv.v); + checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS, + "C levels"); + assignment(ls, &nv, nvars+1); + } + else { /* assignment -> '=' explist */ + int nexps; + checknext(ls, '='); + nexps = explist(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 gotostat (LexState *ls, int pc) { + int line = ls->linenumber; + TString *label; + int g; + if (testnext(ls, TK_GOTO)) + label = str_checkname(ls); + else { + luaX_next(ls); /* skip break */ + label = luaS_new(ls->L, "break"); + } + g = newlabelentry(ls, &ls->dyd->gt, label, line, pc); + findlabel(ls, g); /* close it if label already defined */ +} + + +/* check for repeated labels on the same block */ +static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) { + int i; + for (i = fs->bl->firstlabel; i < ll->n; i++) { + if (eqstr(label, ll->arr[i].name)) { + const char *msg = luaO_pushfstring(fs->ls->L, + "label '%s' already defined on line %d", + getstr(label), ll->arr[i].line); + semerror(fs->ls, msg); + } + } +} + + +/* skip no-op statements */ +static void skipnoopstat (LexState *ls) { + while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) + statement(ls); +} + + +static void labelstat (LexState *ls, TString *label, int line) { + /* label -> '::' NAME '::' */ + FuncState *fs = ls->fs; + Labellist *ll = &ls->dyd->label; + int l; /* index of new label being created */ + checkrepeated(fs, ll, label); /* check for repeated labels */ + checknext(ls, TK_DBCOLON); /* skip double colon */ + /* create new entry for this label */ + l = newlabelentry(ls, ll, label, line, luaK_getlabel(fs)); + skipnoopstat(ls); /* skip other no-op statements */ + if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ + /* assume that locals are already out of scope */ + ll->arr[l].nactvar = fs->bl->nactvar; + } + findgotos(ls, &ll->arr[l]); +} + + +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_jumpto(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 */ + statlist(ls); + check_match(ls, TK_UNTIL, TK_REPEAT, line); + condexit = cond(ls); /* read condition (inside scope block) */ + if (bl2.upval) /* upvalues? */ + luaK_patchclose(fs, condexit, bl2.nactvar); + leaveblock(fs); /* finish scope */ + luaK_patchlist(fs, condexit, repeat_init); /* close the loop */ + leaveblock(fs); /* finish loop */ +} + + +static int exp1 (LexState *ls) { + expdesc e; + int reg; + expr(ls, &e); + luaK_exp2nextreg(ls->fs, &e); + lua_assert(e.k == VNONRELOC); + reg = e.u.info; + return reg; +} + + +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); + if (isnum) /* numeric for? */ + endfor = luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP); + else { /* generic for */ + luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); + luaK_fixline(fs, line); + endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP); + } + luaK_patchlist(fs, endfor, prep + 1); + luaK_fixline(fs, line); +} + + +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)"); + new_localvarliteral(ls, "(for limit)"); + new_localvarliteral(ls, "(for step)"); + new_localvar(ls, varname); + checknext(ls, '='); + exp1(ls); /* initial value */ + checknext(ls, ','); + exp1(ls); /* limit */ + if (testnext(ls, ',')) + exp1(ls); /* optional step */ + else { /* default step = 1 */ + luaK_codek(fs, fs->freereg, luaK_intK(fs, 1)); + luaK_reserveregs(fs, 1); + } + forbody(ls, base, line, 1, 1); +} + + +static void forlist (LexState *ls, TString *indexname) { + /* forlist -> NAME {,NAME} IN explist forbody */ + FuncState *fs = ls->fs; + expdesc e; + int nvars = 4; /* gen, state, control, plus at least one declared var */ + int line; + int base = fs->freereg; + /* create control variables */ + new_localvarliteral(ls, "(for generator)"); + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for control)"); + /* create declared variables */ + new_localvar(ls, indexname); + while (testnext(ls, ',')) { + new_localvar(ls, str_checkname(ls)); + nvars++; + } + checknext(ls, TK_IN); + line = ls->linenumber; + adjust_assign(ls, 3, explist(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, "'=' or 'in' expected"); + } + check_match(ls, TK_END, TK_FOR, line); + leaveblock(fs); /* loop scope ('break' jumps to this point) */ +} + + +static void test_then_block (LexState *ls, int *escapelist) { + /* test_then_block -> [IF | ELSEIF] cond THEN block */ + BlockCnt bl; + FuncState *fs = ls->fs; + expdesc v; + int jf; /* instruction to skip 'then' code (if condition is false) */ + luaX_next(ls); /* skip IF or ELSEIF */ + expr(ls, &v); /* read condition */ + checknext(ls, TK_THEN); + if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) { + luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ + enterblock(fs, &bl, 0); /* must enter block before 'goto' */ + gotostat(ls, v.t); /* handle goto/break */ + skipnoopstat(ls); /* skip other no-op statements */ + if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ + leaveblock(fs); + return; /* and that is it */ + } + else /* must skip over 'then' part if condition is false */ + jf = luaK_jump(fs); + } + else { /* regular case (not goto/break) */ + luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ + enterblock(fs, &bl, 0); + jf = v.f; + } + statlist(ls); /* 'then' part */ + leaveblock(fs); + if (ls->t.token == TK_ELSE || + ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ + luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */ + luaK_patchtohere(fs, jf); +} + + +static void ifstat (LexState *ls, int line) { + /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ + FuncState *fs = ls->fs; + int escapelist = NO_JUMP; /* exit list for finished parts */ + test_then_block(ls, &escapelist); /* IF cond THEN block */ + while (ls->t.token == TK_ELSEIF) + test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ + if (testnext(ls, TK_ELSE)) + block(ls); /* 'else' part */ + check_match(ls, TK_END, TK_IF, line); + luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */ +} + + +static void localfunc (LexState *ls) { + expdesc b; + FuncState *fs = ls->fs; + new_localvar(ls, str_checkname(ls)); /* new local variable */ + adjustlocalvars(ls, 1); /* enter its scope */ + body(ls, &b, 0, ls->linenumber); /* function created in next register */ + /* debug information will only see the variable after this point! */ + getlocvar(fs, b.u.info)->startpc = fs->pc; +} + + +static void localstat (LexState *ls) { + /* stat -> LOCAL NAME {',' NAME} ['=' explist] */ + int nvars = 0; + int nexps; + expdesc e; + do { + new_localvar(ls, str_checkname(ls)); + nvars++; + } while (testnext(ls, ',')); + if (testnext(ls, '=')) + nexps = explist(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 {fieldsel} [':' NAME] */ + int ismethod = 0; + singlevar(ls, v); + while (ls->t.token == '.') + fieldsel(ls, v); + if (ls->t.token == ':') { + ismethod = 1; + fieldsel(ls, v); + } + return ismethod; +} + + +static void funcstat (LexState *ls, int line) { + /* funcstat -> FUNCTION funcname body */ + int ismethod; + expdesc v, b; + luaX_next(ls); /* skip FUNCTION */ + ismethod = funcname(ls, &v); + body(ls, &b, ismethod, 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; + suffixedexp(ls, &v.v); + if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ + v.prev = NULL; + assignment(ls, &v, 1); + } + else { /* stat -> func */ + check_condition(ls, v.v.k == VCALL, "syntax error"); + SETARG_C(getinstruction(fs, &v.v), 1); /* call statement uses no results */ + } +} + + +static void retstat (LexState *ls) { + /* stat -> RETURN [explist] [';'] */ + FuncState *fs = ls->fs; + expdesc e; + int first, nret; /* registers with returned values */ + if (block_follow(ls, 1) || ls->t.token == ';') + first = nret = 0; /* return no values */ + else { + nret = explist(ls, &e); /* optional return values */ + if (hasmultret(e.k)) { + luaK_setmultret(fs, &e); + if (e.k == VCALL && nret == 1) { /* tail call? */ + SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL); + lua_assert(GETARG_A(getinstruction(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); + testnext(ls, ';'); /* skip optional semicolon */ +} + + +static void statement (LexState *ls) { + int line = ls->linenumber; /* may be needed for error messages */ + enterlevel(ls); + switch (ls->t.token) { + case ';': { /* stat -> ';' (empty statement) */ + luaX_next(ls); /* skip ';' */ + break; + } + case TK_IF: { /* stat -> ifstat */ + ifstat(ls, line); + break; + } + case TK_WHILE: { /* stat -> whilestat */ + whilestat(ls, line); + break; + } + case TK_DO: { /* stat -> DO block END */ + luaX_next(ls); /* skip DO */ + block(ls); + check_match(ls, TK_END, TK_DO, line); + break; + } + case TK_FOR: { /* stat -> forstat */ + forstat(ls, line); + break; + } + case TK_REPEAT: { /* stat -> repeatstat */ + repeatstat(ls, line); + break; + } + case TK_FUNCTION: { /* stat -> funcstat */ + funcstat(ls, line); + break; + } + case TK_LOCAL: { /* stat -> localstat */ + luaX_next(ls); /* skip LOCAL */ + if (testnext(ls, TK_FUNCTION)) /* local function? */ + localfunc(ls); + else + localstat(ls); + break; + } + case TK_DBCOLON: { /* stat -> label */ + luaX_next(ls); /* skip double colon */ + labelstat(ls, str_checkname(ls), line); + break; + } + case TK_RETURN: { /* stat -> retstat */ + luaX_next(ls); /* skip RETURN */ + retstat(ls); + break; + } + case TK_BREAK: /* stat -> breakstat */ + case TK_GOTO: { /* stat -> 'goto' NAME */ + gotostat(ls, luaK_jump(ls->fs)); + break; + } + default: { /* stat -> func | assignment */ + exprstat(ls); + break; + } + } + 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); +} + +/* }====================================================================== */ + + +/* +** compiles the main function, which is a regular vararg function with an +** upvalue named LUA_ENV +*/ +static void mainfunc (LexState *ls, FuncState *fs) { + BlockCnt bl; + expdesc v; + open_func(ls, fs, &bl); + fs->f->is_vararg = 2; /* main function is always declared vararg */ + init_exp(&v, VLOCAL, 0); /* create and... */ + newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ + luaX_next(ls); /* read first token */ + statlist(ls); /* parse main body */ + check(ls, TK_EOS); + close_func(ls); +} + + +LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar) { + LexState lexstate; + FuncState funcstate; + LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */ + setclLvalue(L, L->top, cl); /* anchor it (to avoid being collected) */ + luaD_inctop(L); + lexstate.h = luaH_new(L); /* create table for scanner */ + sethvalue(L, L->top, lexstate.h); /* anchor it */ + luaD_inctop(L); + funcstate.f = cl->p = luaF_newproto(L); + funcstate.f->source = luaS_new(L, name); /* create and anchor TString */ + lua_assert(iswhite(funcstate.f)); /* do not need barrier here */ + lexstate.buff = buff; + lexstate.dyd = dyd; + dyd->actvar.n = dyd->gt.n = dyd->label.n = 0; + luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar); + mainfunc(&lexstate, &funcstate); + lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs); + /* all scopes should be correctly finished */ + lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0); + L->top--; /* remove scanner's table */ + return cl; /* closure is on the stack, too */ +} + diff --git a/lua-5.3.3/src/lparser.h b/lua-5.3.3/src/lparser.h new file mode 100644 index 0000000..02e9b03 --- /dev/null +++ b/lua-5.3.3/src/lparser.h @@ -0,0 +1,133 @@ +/* +** $Id: lparser.h,v 1.76 2015/12/30 18:16:13 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 and variable descriptor. +** Code generation for variables and expressions can be delayed to allow +** optimizations; An 'expdesc' structure describes a potentially-delayed +** variable/expression. It has a description of its "main" value plus a +** list of conditional jumps that can also produce its value (generated +** by short-circuit operators 'and'/'or'). +*/ + +/* kinds of variables/expressions */ +typedef enum { + VVOID, /* when 'expdesc' describes the last expression a list, + this kind means an empty list (so, no expression) */ + VNIL, /* constant nil */ + VTRUE, /* constant true */ + VFALSE, /* constant false */ + VK, /* constant in 'k'; info = index of constant in 'k' */ + VKFLT, /* floating constant; nval = numerical float value */ + VKINT, /* integer constant; nval = numerical integer value */ + VNONRELOC, /* expression has its value in a fixed register; + info = result register */ + VLOCAL, /* local variable; info = local register */ + VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ + VINDEXED, /* indexed variable; + ind.vt = whether 't' is register or upvalue; + ind.t = table register or upvalue; + ind.idx = key's R/K index */ + VJMP, /* expression is a test/comparison; + info = pc of corresponding jump instruction */ + VRELOCABLE, /* expression can put result in any register; + info = instruction pc */ + VCALL, /* expression is a function call; info = instruction pc */ + VVARARG /* vararg expression; info = instruction pc */ +} expkind; + + +#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXED) +#define vkisinreg(k) ((k) == VNONRELOC || (k) == VLOCAL) + +typedef struct expdesc { + expkind k; + union { + lua_Integer ival; /* for VKINT */ + lua_Number nval; /* for VKFLT */ + int info; /* for generic use */ + struct { /* for indexed variables (VINDEXED) */ + short idx; /* index (R/K) */ + lu_byte t; /* table (register or upvalue) */ + lu_byte vt; /* whether 't' is register (VLOCAL) or upvalue (VUPVAL) */ + } ind; + } u; + int t; /* patch list of 'exit when true' */ + int f; /* patch list of 'exit when false' */ +} expdesc; + + +/* description of active local variable */ +typedef struct Vardesc { + short idx; /* variable index in stack */ +} Vardesc; + + +/* description of pending goto statements and label statements */ +typedef struct Labeldesc { + TString *name; /* label identifier */ + int pc; /* position in code */ + int line; /* line where it appeared */ + lu_byte nactvar; /* local level where it appears in current block */ +} Labeldesc; + + +/* list of labels or gotos */ +typedef struct Labellist { + Labeldesc *arr; /* array */ + int n; /* number of entries in use */ + int size; /* array size */ +} Labellist; + + +/* dynamic structures used by the parser */ +typedef struct Dyndata { + struct { /* list of active local variables */ + Vardesc *arr; + int n; + int size; + } actvar; + Labellist gt; /* list of pending gotos */ + Labellist label; /* list of active labels */ +} Dyndata; + + +/* control of blocks */ +struct BlockCnt; /* defined in lparser.c */ + + +/* state needed to generate code for a given function */ +typedef struct FuncState { + Proto *f; /* current function header */ + struct FuncState *prev; /* enclosing function */ + struct LexState *ls; /* lexical state */ + struct BlockCnt *bl; /* chain of current blocks */ + int pc; /* next position to code (equivalent to 'ncode') */ + int lasttarget; /* 'label' of last 'jump label' */ + int jpc; /* list of pending jumps to 'pc' */ + int nk; /* number of elements in 'k' */ + int np; /* number of elements in 'p' */ + int firstlocal; /* index of first local var (in Dyndata array) */ + short nlocvars; /* number of elements in 'f->locvars' */ + lu_byte nactvar; /* number of active local variables */ + lu_byte nups; /* number of upvalues */ + lu_byte freereg; /* first free register */ +} FuncState; + + +LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar); + + +#endif diff --git a/lua-5.3.3/src/lprefix.h b/lua-5.3.3/src/lprefix.h new file mode 100644 index 0000000..02daa83 --- /dev/null +++ b/lua-5.3.3/src/lprefix.h @@ -0,0 +1,45 @@ +/* +** $Id: lprefix.h,v 1.2 2014/12/29 16:54:13 roberto Exp $ +** Definitions for Lua code that must come before any other header file +** See Copyright Notice in lua.h +*/ + +#ifndef lprefix_h +#define lprefix_h + + +/* +** Allows POSIX/XSI stuff +*/ +#if !defined(LUA_USE_C89) /* { */ + +#if !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 +#elif _XOPEN_SOURCE == 0 +#undef _XOPEN_SOURCE /* use -D_XOPEN_SOURCE=0 to undefine it */ +#endif + +/* +** Allows manipulation of large files in gcc and some other compilers +*/ +#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS) +#define _LARGEFILE_SOURCE 1 +#define _FILE_OFFSET_BITS 64 +#endif + +#endif /* } */ + + +/* +** Windows stuff +*/ +#if defined(_WIN32) /* { */ + +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* avoid warnings about ISO C functions */ +#endif + +#endif /* } */ + +#endif + diff --git a/lua-5.3.3/src/lstate.c b/lua-5.3.3/src/lstate.c new file mode 100644 index 0000000..9194ac3 --- /dev/null +++ b/lua-5.3.3/src/lstate.c @@ -0,0 +1,347 @@ +/* +** $Id: lstate.c,v 2.133 2015/11/13 12:16:51 roberto Exp $ +** Global State +** See Copyright Notice in lua.h +*/ + +#define lstate_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lapi.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" + + +#if !defined(LUAI_GCPAUSE) +#define LUAI_GCPAUSE 200 /* 200% */ +#endif + +#if !defined(LUAI_GCMUL) +#define LUAI_GCMUL 200 /* GC runs 'twice the speed' of memory allocation */ +#endif + + +/* +** a macro to help the creation of a unique random seed when a state is +** created; the seed is used to randomize hashes. +*/ +#if !defined(luai_makeseed) +#include +#define luai_makeseed() cast(unsigned int, time(NULL)) +#endif + + + +/* +** thread state + extra space +*/ +typedef struct LX { + lu_byte extra_[LUA_EXTRASPACE]; + lua_State l; +} LX; + + +/* +** Main thread combines a thread state and the global state +*/ +typedef struct LG { + LX l; + global_State g; +} LG; + + + +#define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l))) + + +/* +** Compute an initial seed as random as possible. Rely on Address Space +** Layout Randomization (if present) to increase randomness.. +*/ +#define addbuff(b,p,e) \ + { size_t t = cast(size_t, e); \ + memcpy(b + p, &t, sizeof(t)); p += sizeof(t); } + +static unsigned int makeseed (lua_State *L) { + char buff[4 * sizeof(size_t)]; + unsigned int h = luai_makeseed(); + int p = 0; + addbuff(buff, p, L); /* heap variable */ + addbuff(buff, p, &h); /* local variable */ + addbuff(buff, p, luaO_nilobject); /* global variable */ + addbuff(buff, p, &lua_newstate); /* public function */ + lua_assert(p == sizeof(buff)); + return luaS_hash(buff, p, h); +} + + +/* +** set GCdebt to a new value keeping the value (totalbytes + GCdebt) +** invariant (and avoiding underflows in 'totalbytes') +*/ +void luaE_setdebt (global_State *g, l_mem debt) { + l_mem tb = gettotalbytes(g); + lua_assert(tb > 0); + if (debt < tb - MAX_LMEM) + debt = tb - MAX_LMEM; /* will make 'totalbytes == MAX_LMEM' */ + g->totalbytes = tb - debt; + g->GCdebt = debt; +} + + +CallInfo *luaE_extendCI (lua_State *L) { + CallInfo *ci = luaM_new(L, CallInfo); + lua_assert(L->ci->next == NULL); + L->ci->next = ci; + ci->previous = L->ci; + ci->next = NULL; + L->nci++; + return ci; +} + + +/* +** free all CallInfo structures not in use by a thread +*/ +void luaE_freeCI (lua_State *L) { + CallInfo *ci = L->ci; + CallInfo *next = ci->next; + ci->next = NULL; + while ((ci = next) != NULL) { + next = ci->next; + luaM_free(L, ci); + L->nci--; + } +} + + +/* +** free half of the CallInfo structures not in use by a thread +*/ +void luaE_shrinkCI (lua_State *L) { + CallInfo *ci = L->ci; + CallInfo *next2; /* next's next */ + /* while there are two nexts */ + while (ci->next != NULL && (next2 = ci->next->next) != NULL) { + luaM_free(L, ci->next); /* free next */ + L->nci--; + ci->next = next2; /* remove 'next' from the list */ + next2->previous = ci; + ci = next2; /* keep next's next */ + } +} + + +static void stack_init (lua_State *L1, lua_State *L) { + int i; CallInfo *ci; + /* initialize stack array */ + L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, TValue); + L1->stacksize = BASIC_STACK_SIZE; + for (i = 0; i < BASIC_STACK_SIZE; i++) + setnilvalue(L1->stack + i); /* erase new stack */ + L1->top = L1->stack; + L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK; + /* initialize first ci */ + ci = &L1->base_ci; + ci->next = ci->previous = NULL; + ci->callstatus = 0; + ci->func = L1->top; + setnilvalue(L1->top++); /* 'function' entry for this 'ci' */ + ci->top = L1->top + LUA_MINSTACK; + L1->ci = ci; +} + + +static void freestack (lua_State *L) { + if (L->stack == NULL) + return; /* stack not completely built yet */ + L->ci = &L->base_ci; /* free the entire 'ci' list */ + luaE_freeCI(L); + lua_assert(L->nci == 0); + luaM_freearray(L, L->stack, L->stacksize); /* free stack array */ +} + + +/* +** Create registry table and its predefined values +*/ +static void init_registry (lua_State *L, global_State *g) { + TValue temp; + /* create registry */ + Table *registry = luaH_new(L); + sethvalue(L, &g->l_registry, registry); + luaH_resize(L, registry, LUA_RIDX_LAST, 0); + /* registry[LUA_RIDX_MAINTHREAD] = L */ + setthvalue(L, &temp, L); /* temp = L */ + luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp); + /* registry[LUA_RIDX_GLOBALS] = table of globals */ + sethvalue(L, &temp, luaH_new(L)); /* temp = new table (global table) */ + luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp); +} + + +/* +** open parts of the state that may cause memory-allocation errors. +** ('g->version' != NULL flags that the state was completely build) +*/ +static void f_luaopen (lua_State *L, void *ud) { + global_State *g = G(L); + UNUSED(ud); + stack_init(L, L); /* init stack */ + init_registry(L, g); + luaS_init(L); + luaT_init(L); + luaX_init(L); + g->gcrunning = 1; /* allow gc */ + g->version = lua_version(NULL); + luai_userstateopen(L); +} + + +/* +** preinitialize a thread with consistent values without allocating +** any memory (to avoid errors) +*/ +static void preinit_thread (lua_State *L, global_State *g) { + G(L) = g; + L->stack = NULL; + L->ci = NULL; + L->nci = 0; + L->stacksize = 0; + L->twups = L; /* thread has no upvalues */ + L->errorJmp = NULL; + L->nCcalls = 0; + L->hook = NULL; + L->hookmask = 0; + L->basehookcount = 0; + L->allowhook = 1; + resethookcount(L); + L->openupval = NULL; + L->nny = 1; + L->status = LUA_OK; + L->errfunc = 0; +} + + +static void close_state (lua_State *L) { + global_State *g = G(L); + luaF_close(L, L->stack); /* close all upvalues for this thread */ + luaC_freeallobjects(L); /* collect all objects */ + if (g->version) /* closing a fully built state? */ + luai_userstateclose(L); + luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); + freestack(L); + lua_assert(gettotalbytes(g) == sizeof(LG)); + (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ +} + + +LUA_API lua_State *lua_newthread (lua_State *L) { + global_State *g = G(L); + lua_State *L1; + lua_lock(L); + luaC_checkGC(L); + /* create new thread */ + L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l; + L1->marked = luaC_white(g); + L1->tt = LUA_TTHREAD; + /* link it on list 'allgc' */ + L1->next = g->allgc; + g->allgc = obj2gco(L1); + /* anchor it on L stack */ + setthvalue(L, L->top, L1); + api_incr_top(L); + preinit_thread(L1, g); + L1->hookmask = L->hookmask; + L1->basehookcount = L->basehookcount; + L1->hook = L->hook; + resethookcount(L1); + /* initialize L1 extra space */ + memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread), + LUA_EXTRASPACE); + luai_userstatethread(L, L1); + stack_init(L1, L); /* init stack */ + lua_unlock(L); + return L1; +} + + +void luaE_freethread (lua_State *L, lua_State *L1) { + LX *l = fromstate(L1); + luaF_close(L1, L1->stack); /* close all upvalues for this thread */ + lua_assert(L1->openupval == NULL); + luai_userstatefree(L, L1); + freestack(L1); + luaM_free(L, l); +} + + +LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { + int i; + lua_State *L; + global_State *g; + LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG))); + if (l == NULL) return NULL; + L = &l->l.l; + g = &l->g; + L->next = NULL; + L->tt = LUA_TTHREAD; + g->currentwhite = bitmask(WHITE0BIT); + L->marked = luaC_white(g); + preinit_thread(L, g); + g->frealloc = f; + g->ud = ud; + g->mainthread = L; + g->seed = makeseed(L); + g->gcrunning = 0; /* no GC while building state */ + g->GCestimate = 0; + g->strt.size = g->strt.nuse = 0; + g->strt.hash = NULL; + setnilvalue(&g->l_registry); + g->panic = NULL; + g->version = NULL; + g->gcstate = GCSpause; + g->gckind = KGC_NORMAL; + g->allgc = g->finobj = g->tobefnz = g->fixedgc = NULL; + g->sweepgc = NULL; + g->gray = g->grayagain = NULL; + g->weak = g->ephemeron = g->allweak = NULL; + g->twups = NULL; + g->totalbytes = sizeof(LG); + g->GCdebt = 0; + g->gcfinnum = 0; + g->gcpause = LUAI_GCPAUSE; + g->gcstepmul = LUAI_GCMUL; + for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; + if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { + /* memory allocation error: free partial state */ + close_state(L); + L = NULL; + } + return L; +} + + +LUA_API void lua_close (lua_State *L) { + L = G(L)->mainthread; /* only the main thread can be closed */ + lua_lock(L); + close_state(L); +} + + diff --git a/lua-5.3.3/src/lstate.h b/lua-5.3.3/src/lstate.h new file mode 100644 index 0000000..b3033be --- /dev/null +++ b/lua-5.3.3/src/lstate.h @@ -0,0 +1,234 @@ +/* +** $Id: lstate.h,v 2.130 2015/12/16 16:39:38 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" + + +/* + +** Some notes about garbage-collected objects: All objects in Lua must +** be kept somehow accessible until being freed, so all objects always +** belong to one (and only one) of these lists, using field 'next' of +** the 'CommonHeader' for the link: +** +** 'allgc': all objects not marked for finalization; +** 'finobj': all objects marked for finalization; +** 'tobefnz': all objects ready to be finalized; +** 'fixedgc': all objects that are not to be collected (currently +** only small strings, such as reserved words). + +*/ + + +struct lua_longjmp; /* defined in ldo.c */ + + +/* +** Atomic type (relative to signals) to better ensure that 'lua_sethook' +** is thread safe +*/ +#if !defined(l_signalT) +#include +#define l_signalT sig_atomic_t +#endif + + +/* extra stack space to handle TM calls and some other extras */ +#define EXTRA_STACK 5 + + +#define BASIC_STACK_SIZE (2*LUA_MINSTACK) + + +/* kinds of Garbage Collection */ +#define KGC_NORMAL 0 +#define KGC_EMERGENCY 1 /* gc was forced by an allocation failure */ + + +typedef struct stringtable { + TString **hash; + int nuse; /* number of elements */ + int size; +} stringtable; + + +/* +** Information about a call. +** When a thread yields, 'func' is adjusted to pretend that the +** top function has only the yielded values in its stack; in that +** case, the actual 'func' value is saved in field 'extra'. +** When a function calls another with a continuation, 'extra' keeps +** the function index so that, in case of errors, the continuation +** function can be called with the correct top. +*/ +typedef struct CallInfo { + StkId func; /* function index in the stack */ + StkId top; /* top for this function */ + struct CallInfo *previous, *next; /* dynamic call link */ + union { + struct { /* only for Lua functions */ + StkId base; /* base for this function */ + const Instruction *savedpc; + } l; + struct { /* only for C functions */ + lua_KFunction k; /* continuation in case of yields */ + ptrdiff_t old_errfunc; + lua_KContext ctx; /* context info. in case of yields */ + } c; + } u; + ptrdiff_t extra; + short nresults; /* expected number of results from this function */ + lu_byte callstatus; +} CallInfo; + + +/* +** Bits in CallInfo status +*/ +#define CIST_OAH (1<<0) /* original value of 'allowhook' */ +#define CIST_LUA (1<<1) /* call is running a Lua function */ +#define CIST_HOOKED (1<<2) /* call is running a debug hook */ +#define CIST_FRESH (1<<3) /* call is running on a fresh invocation + of luaV_execute */ +#define CIST_YPCALL (1<<4) /* call is a yieldable protected call */ +#define CIST_TAIL (1<<5) /* call was tail called */ +#define CIST_HOOKYIELD (1<<6) /* last hook called yielded */ +#define CIST_LEQ (1<<7) /* using __lt for __le */ + +#define isLua(ci) ((ci)->callstatus & CIST_LUA) + +/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */ +#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v)) +#define getoah(st) ((st) & CIST_OAH) + + +/* +** 'global state', shared by all threads of this state +*/ +typedef struct global_State { + lua_Alloc frealloc; /* function to reallocate memory */ + void *ud; /* auxiliary data to 'frealloc' */ + l_mem totalbytes; /* number of bytes currently allocated - GCdebt */ + l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ + lu_mem GCmemtrav; /* memory traversed by the GC */ + lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ + stringtable strt; /* hash table for strings */ + TValue l_registry; + unsigned int seed; /* randomized seed for hashes */ + lu_byte currentwhite; + lu_byte gcstate; /* state of garbage collector */ + lu_byte gckind; /* kind of GC running */ + lu_byte gcrunning; /* true if GC is running */ + GCObject *allgc; /* list of all collectable objects */ + GCObject **sweepgc; /* current position of sweep in list */ + GCObject *finobj; /* list of collectable objects with finalizers */ + GCObject *gray; /* list of gray objects */ + GCObject *grayagain; /* list of objects to be traversed atomically */ + GCObject *weak; /* list of tables with weak values */ + GCObject *ephemeron; /* list of ephemeron tables (weak keys) */ + GCObject *allweak; /* list of all-weak tables */ + GCObject *tobefnz; /* list of userdata to be GC */ + GCObject *fixedgc; /* list of objects not to be collected */ + struct lua_State *twups; /* list of threads with open upvalues */ + unsigned int gcfinnum; /* number of finalizers to call in each GC step */ + int gcpause; /* size of pause between successive GCs */ + int gcstepmul; /* GC 'granularity' */ + lua_CFunction panic; /* to be called in unprotected errors */ + struct lua_State *mainthread; + const lua_Number *version; /* pointer to version number */ + TString *memerrmsg; /* memory-error message */ + TString *tmname[TM_N]; /* array with tag-method names */ + struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */ + TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */ +} global_State; + + +/* +** 'per thread' state +*/ +struct lua_State { + CommonHeader; + unsigned short nci; /* number of items in 'ci' list */ + lu_byte status; + StkId top; /* first free slot in the stack */ + global_State *l_G; + CallInfo *ci; /* call info for current function */ + const Instruction *oldpc; /* last pc traced */ + StkId stack_last; /* last free slot in the stack */ + StkId stack; /* stack base */ + UpVal *openupval; /* list of open upvalues in this stack */ + GCObject *gclist; + struct lua_State *twups; /* list of threads with open upvalues */ + struct lua_longjmp *errorJmp; /* current error recover point */ + CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ + volatile lua_Hook hook; + ptrdiff_t errfunc; /* current error handling function (stack index) */ + int stacksize; + int basehookcount; + int hookcount; + unsigned short nny; /* number of non-yieldable calls in stack */ + unsigned short nCcalls; /* number of nested C calls */ + l_signalT hookmask; + lu_byte allowhook; +}; + + +#define G(L) (L->l_G) + + +/* +** Union of all collectable objects (only for conversions) +*/ +union GCUnion { + GCObject gc; /* common header */ + struct TString ts; + struct Udata u; + union Closure cl; + struct Table h; + struct Proto p; + struct lua_State th; /* thread */ +}; + + +#define cast_u(o) cast(union GCUnion *, (o)) + +/* macros to convert a GCObject into a specific value */ +#define gco2ts(o) \ + check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts)) +#define gco2u(o) check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u)) +#define gco2lcl(o) check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l)) +#define gco2ccl(o) check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c)) +#define gco2cl(o) \ + check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl)) +#define gco2t(o) check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h)) +#define gco2p(o) check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p)) +#define gco2th(o) check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th)) + + +/* macro to convert a Lua object into a GCObject */ +#define obj2gco(v) \ + check_exp(novariant((v)->tt) < LUA_TDEADKEY, (&(cast_u(v)->gc))) + + +/* actual number of total bytes allocated */ +#define gettotalbytes(g) cast(lu_mem, (g)->totalbytes + (g)->GCdebt) + +LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); +LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); +LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); +LUAI_FUNC void luaE_freeCI (lua_State *L); +LUAI_FUNC void luaE_shrinkCI (lua_State *L); + + +#endif + diff --git a/lua-5.3.3/src/lstring.c b/lua-5.3.3/src/lstring.c new file mode 100644 index 0000000..9351766 --- /dev/null +++ b/lua-5.3.3/src/lstring.c @@ -0,0 +1,248 @@ +/* +** $Id: lstring.c,v 2.56 2015/11/23 11:32:51 roberto Exp $ +** String table (keeps all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#define lstring_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" + + +#define MEMERRMSG "not enough memory" + + +/* +** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a string to +** compute its hash +*/ +#if !defined(LUAI_HASHLIMIT) +#define LUAI_HASHLIMIT 5 +#endif + + +/* +** equality for long strings +*/ +int luaS_eqlngstr (TString *a, TString *b) { + size_t len = a->u.lnglen; + lua_assert(a->tt == LUA_TLNGSTR && b->tt == LUA_TLNGSTR); + return (a == b) || /* same instance or... */ + ((len == b->u.lnglen) && /* equal length and ... */ + (memcmp(getstr(a), getstr(b), len) == 0)); /* equal contents */ +} + + +unsigned int luaS_hash (const char *str, size_t l, unsigned int seed) { + unsigned int h = seed ^ cast(unsigned int, l); + size_t step = (l >> LUAI_HASHLIMIT) + 1; + for (; l >= step; l -= step) + h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1])); + return h; +} + + +unsigned int luaS_hashlongstr (TString *ts) { + lua_assert(ts->tt == LUA_TLNGSTR); + if (ts->extra == 0) { /* no hash? */ + ts->hash = luaS_hash(getstr(ts), ts->u.lnglen, ts->hash); + ts->extra = 1; /* now it has its hash */ + } + return ts->hash; +} + + +/* +** resizes the string table +*/ +void luaS_resize (lua_State *L, int newsize) { + int i; + stringtable *tb = &G(L)->strt; + if (newsize > tb->size) { /* grow table if needed */ + luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *); + for (i = tb->size; i < newsize; i++) + tb->hash[i] = NULL; + } + for (i = 0; i < tb->size; i++) { /* rehash */ + TString *p = tb->hash[i]; + tb->hash[i] = NULL; + while (p) { /* for each node in the list */ + TString *hnext = p->u.hnext; /* save next */ + unsigned int h = lmod(p->hash, newsize); /* new position */ + p->u.hnext = tb->hash[h]; /* chain it */ + tb->hash[h] = p; + p = hnext; + } + } + if (newsize < tb->size) { /* shrink table if needed */ + /* vanishing slice should be empty */ + lua_assert(tb->hash[newsize] == NULL && tb->hash[tb->size - 1] == NULL); + luaM_reallocvector(L, tb->hash, tb->size, newsize, TString *); + } + tb->size = newsize; +} + + +/* +** Clear API string cache. (Entries cannot be empty, so fill them with +** a non-collectable string.) +*/ +void luaS_clearcache (global_State *g) { + int i, j; + for (i = 0; i < STRCACHE_N; i++) + for (j = 0; j < STRCACHE_M; j++) { + if (iswhite(g->strcache[i][j])) /* will entry be collected? */ + g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */ + } +} + + +/* +** Initialize the string table and the string cache +*/ +void luaS_init (lua_State *L) { + global_State *g = G(L); + int i, j; + luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ + /* pre-create memory-error message */ + g->memerrmsg = luaS_newliteral(L, MEMERRMSG); + luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */ + for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */ + for (j = 0; j < STRCACHE_M; j++) + g->strcache[i][j] = g->memerrmsg; +} + + + +/* +** creates a new string object +*/ +static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) { + TString *ts; + GCObject *o; + size_t totalsize; /* total size of TString object */ + totalsize = sizelstring(l); + o = luaC_newobj(L, tag, totalsize); + ts = gco2ts(o); + ts->hash = h; + ts->extra = 0; + getstr(ts)[l] = '\0'; /* ending 0 */ + return ts; +} + + +TString *luaS_createlngstrobj (lua_State *L, size_t l) { + TString *ts = createstrobj(L, l, LUA_TLNGSTR, G(L)->seed); + ts->u.lnglen = l; + return ts; +} + + +void luaS_remove (lua_State *L, TString *ts) { + stringtable *tb = &G(L)->strt; + TString **p = &tb->hash[lmod(ts->hash, tb->size)]; + while (*p != ts) /* find previous element */ + p = &(*p)->u.hnext; + *p = (*p)->u.hnext; /* remove element from its list */ + tb->nuse--; +} + + +/* +** checks whether short string exists and reuses it or creates a new one +*/ +static TString *internshrstr (lua_State *L, const char *str, size_t l) { + TString *ts; + global_State *g = G(L); + unsigned int h = luaS_hash(str, l, g->seed); + TString **list = &g->strt.hash[lmod(h, g->strt.size)]; + lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */ + for (ts = *list; ts != NULL; ts = ts->u.hnext) { + if (l == ts->shrlen && + (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) { + /* found! */ + if (isdead(g, ts)) /* dead (but not collected yet)? */ + changewhite(ts); /* resurrect it */ + return ts; + } + } + if (g->strt.nuse >= g->strt.size && g->strt.size <= MAX_INT/2) { + luaS_resize(L, g->strt.size * 2); + list = &g->strt.hash[lmod(h, g->strt.size)]; /* recompute with new size */ + } + ts = createstrobj(L, l, LUA_TSHRSTR, h); + memcpy(getstr(ts), str, l * sizeof(char)); + ts->shrlen = cast_byte(l); + ts->u.hnext = *list; + *list = ts; + g->strt.nuse++; + return ts; +} + + +/* +** new string (with explicit length) +*/ +TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { + if (l <= LUAI_MAXSHORTLEN) /* short string? */ + return internshrstr(L, str, l); + else { + TString *ts; + if (l >= (MAX_SIZE - sizeof(TString))/sizeof(char)) + luaM_toobig(L); + ts = luaS_createlngstrobj(L, l); + memcpy(getstr(ts), str, l * sizeof(char)); + return ts; + } +} + + +/* +** Create or reuse a zero-terminated string, first checking in the +** cache (using the string address as a key). The cache can contain +** only zero-terminated strings, so it is safe to use 'strcmp' to +** check hits. +*/ +TString *luaS_new (lua_State *L, const char *str) { + unsigned int i = point2uint(str) % STRCACHE_N; /* hash */ + int j; + TString **p = G(L)->strcache[i]; + for (j = 0; j < STRCACHE_M; j++) { + if (strcmp(str, getstr(p[j])) == 0) /* hit? */ + return p[j]; /* that is it */ + } + /* normal route */ + for (j = STRCACHE_M - 1; j > 0; j--) + p[j] = p[j - 1]; /* move out last element */ + /* new element is first in the list */ + p[0] = luaS_newlstr(L, str, strlen(str)); + return p[0]; +} + + +Udata *luaS_newudata (lua_State *L, size_t s) { + Udata *u; + GCObject *o; + if (s > MAX_SIZE - sizeof(Udata)) + luaM_toobig(L); + o = luaC_newobj(L, LUA_TUSERDATA, sizeludata(s)); + u = gco2u(o); + u->len = s; + u->metatable = NULL; + setuservalue(L, u, luaO_nilobject); + return u; +} + diff --git a/lua-5.3.3/src/lstring.h b/lua-5.3.3/src/lstring.h new file mode 100644 index 0000000..27efd20 --- /dev/null +++ b/lua-5.3.3/src/lstring.h @@ -0,0 +1,49 @@ +/* +** $Id: lstring.h,v 1.61 2015/11/03 15:36:01 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 sizelstring(l) (sizeof(union UTString) + ((l) + 1) * sizeof(char)) + +#define sizeludata(l) (sizeof(union UUdata) + (l)) +#define sizeudata(u) sizeludata((u)->len) + +#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ + (sizeof(s)/sizeof(char))-1)) + + +/* +** test whether a string is a reserved word +*/ +#define isreserved(s) ((s)->tt == LUA_TSHRSTR && (s)->extra > 0) + + +/* +** equality for short strings, which are always internalized +*/ +#define eqshrstr(a,b) check_exp((a)->tt == LUA_TSHRSTR, (a) == (b)) + + +LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, unsigned int seed); +LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts); +LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b); +LUAI_FUNC void luaS_resize (lua_State *L, int newsize); +LUAI_FUNC void luaS_clearcache (global_State *g); +LUAI_FUNC void luaS_init (lua_State *L); +LUAI_FUNC void luaS_remove (lua_State *L, TString *ts); +LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s); +LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); +LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); +LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l); + + +#endif diff --git a/lua-5.3.3/src/lstrlib.c b/lua-5.3.3/src/lstrlib.c new file mode 100644 index 0000000..12264f8 --- /dev/null +++ b/lua-5.3.3/src/lstrlib.c @@ -0,0 +1,1582 @@ +/* +** $Id: lstrlib.c,v 1.251 2016/05/20 14:13:21 roberto Exp $ +** Standard library for string operations and pattern-matching +** See Copyright Notice in lua.h +*/ + +#define lstrlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** maximum number of captures that a pattern can do during +** pattern-matching. This limit is arbitrary, but must fit in +** an unsigned char. +*/ +#if !defined(LUA_MAXCAPTURES) +#define LUA_MAXCAPTURES 32 +#endif + + +/* macro to 'unsign' a character */ +#define uchar(c) ((unsigned char)(c)) + + +/* +** Some sizes are better limited to fit in 'int', but must also fit in +** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.) +*/ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +#define MAXSIZE \ + (sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX)) + + + + +static int str_len (lua_State *L) { + size_t l; + luaL_checklstring(L, 1, &l); + lua_pushinteger(L, (lua_Integer)l); + return 1; +} + + +/* translate a relative string position: negative means back from end */ +static lua_Integer posrelat (lua_Integer pos, size_t len) { + if (pos >= 0) return pos; + else if (0u - (size_t)pos > len) return 0; + else return (lua_Integer)len + pos + 1; +} + + +static int str_sub (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + lua_Integer start = posrelat(luaL_checkinteger(L, 2), l); + lua_Integer end = posrelat(luaL_optinteger(L, 3, -1), l); + if (start < 1) start = 1; + if (end > (lua_Integer)l) end = l; + if (start <= end) + lua_pushlstring(L, s + start - 1, (size_t)(end - start) + 1); + else lua_pushliteral(L, ""); + return 1; +} + + +static int str_reverse (lua_State *L) { + size_t l, i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i = 0; i < l; i++) + p[i] = s[l - i - 1]; + luaL_pushresultsize(&b, l); + 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); + char *p = luaL_buffinitsize(L, &b, l); + for (i=0; i MAXSIZE / n) /* may overflow? */ + return luaL_error(L, "resulting string too large"); + else { + size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep; + luaL_Buffer b; + char *p = luaL_buffinitsize(L, &b, totallen); + while (n-- > 1) { /* first n-1 copies (followed by separator) */ + memcpy(p, s, l * sizeof(char)); p += l; + if (lsep > 0) { /* empty 'memcpy' is not that cheap */ + memcpy(p, sep, lsep * sizeof(char)); + p += lsep; + } + } + memcpy(p, s, l * sizeof(char)); /* last copy (not followed by separator) */ + luaL_pushresultsize(&b, totallen); + } + return 1; +} + + +static int str_byte (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + lua_Integer posi = posrelat(luaL_optinteger(L, 2, 1), l); + lua_Integer pose = posrelat(luaL_optinteger(L, 3, posi), l); + int n, i; + if (posi < 1) posi = 1; + if (pose > (lua_Integer)l) pose = l; + if (posi > pose) return 0; /* empty interval; return no values */ + if (pose - posi >= INT_MAX) /* arithmetic overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; + 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 %%%d", l + 1); + 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 == ms->p_end) + luaL_error(ms->L, "malformed pattern (ends with '%%')"); + return p+1; + } + case '[': { + if (*p == '^') p++; + do { /* look for a ']' */ + if (p == ms->p_end) + luaL_error(ms->L, "malformed pattern (missing ']')"); + if (*(p++) == L_ESC && p < ms->p_end) + 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 'g' : res = isgraph(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; /* deprecated option */ + 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 (MatchState *ms, const char *s, const char *p, + const char *ep) { + if (s >= ms->src_end) + return 0; + else { + int c = uchar(*s); + 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 *matchbalance (MatchState *ms, const char *s, + const char *p) { + if (p >= ms->p_end - 1) + luaL_error(ms->L, "malformed pattern (missing arguments to '%%b')"); + 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 (singlematch(ms, 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 (singlematch(ms, 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) { + if (ms->matchdepth-- == 0) + luaL_error(ms->L, "pattern too complex"); + init: /* using goto's to optimize tail recursion */ + if (p != ms->p_end) { /* end of pattern? */ + switch (*p) { + case '(': { /* start capture */ + if (*(p + 1) == ')') /* position capture? */ + s = start_capture(ms, s, p + 2, CAP_POSITION); + else + s = start_capture(ms, s, p + 1, CAP_UNFINISHED); + break; + } + case ')': { /* end capture */ + s = end_capture(ms, s, p + 1); + break; + } + case '$': { + if ((p + 1) != ms->p_end) /* is the '$' the last char in pattern? */ + goto dflt; /* no; go to default */ + s = (s == ms->src_end) ? s : NULL; /* check end of string */ + break; + } + case L_ESC: { /* escaped sequences not in the format class[*+?-]? */ + switch (*(p + 1)) { + case 'b': { /* balanced string? */ + s = matchbalance(ms, s, p + 2); + if (s != NULL) { + p += 4; goto init; /* return match(ms, s, p + 4); */ + } /* else fail (s == NULL) */ + break; + } + case 'f': { /* frontier? */ + const char *ep; char previous; + p += 2; + if (*p != '[') + luaL_error(ms->L, "missing '[' after '%%f' in pattern"); + ep = classend(ms, p); /* points to what is next */ + previous = (s == ms->src_init) ? '\0' : *(s - 1); + if (!matchbracketclass(uchar(previous), p, ep - 1) && + matchbracketclass(uchar(*s), p, ep - 1)) { + p = ep; goto init; /* return match(ms, s, ep); */ + } + s = NULL; /* match failed */ + break; + } + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + case '8': case '9': { /* capture results (%0-%9)? */ + s = match_capture(ms, s, uchar(*(p + 1))); + if (s != NULL) { + p += 2; goto init; /* return match(ms, s, p + 2) */ + } + break; + } + default: goto dflt; + } + break; + } + default: dflt: { /* pattern class plus optional suffix */ + const char *ep = classend(ms, p); /* points to optional suffix */ + /* does not match at least once? */ + if (!singlematch(ms, s, p, ep)) { + if (*ep == '*' || *ep == '?' || *ep == '-') { /* accept empty? */ + p = ep + 1; goto init; /* return match(ms, s, ep + 1); */ + } + else /* '+' or no suffix */ + s = NULL; /* fail */ + } + else { /* matched once */ + switch (*ep) { /* handle optional suffix */ + case '?': { /* optional */ + const char *res; + if ((res = match(ms, s + 1, ep + 1)) != NULL) + s = res; + else { + p = ep + 1; goto init; /* else return match(ms, s, ep + 1); */ + } + break; + } + case '+': /* 1 or more repetitions */ + s++; /* 1 match already done */ + /* FALLTHROUGH */ + case '*': /* 0 or more repetitions */ + s = max_expand(ms, s, p, ep); + break; + case '-': /* 0 or more repetitions (minimum) */ + s = min_expand(ms, s, p, ep); + break; + default: /* no suffix */ + s++; p = ep; goto init; /* return match(ms, s + 1, ep); */ + } + } + break; + } + } + } + ms->matchdepth++; + return s; +} + + + +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 %%%d", i + 1); + } + 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 */ +} + + +/* check whether pattern has no special characters */ +static int nospecials (const char *p, size_t l) { + size_t upto = 0; + do { + if (strpbrk(p + upto, SPECIALS)) + return 0; /* pattern has a special character */ + upto += strlen(p + upto) + 1; /* may have more after \0 */ + } while (upto <= l); + return 1; /* no special chars found */ +} + + +static void prepstate (MatchState *ms, lua_State *L, + const char *s, size_t ls, const char *p, size_t lp) { + ms->L = L; + ms->matchdepth = MAXCCALLS; + ms->src_init = s; + ms->src_end = s + ls; + ms->p_end = p + lp; +} + + +static void reprepstate (MatchState *ms) { + ms->level = 0; + lua_assert(ms->matchdepth == MAXCCALLS); +} + + +static int str_find_aux (lua_State *L, int find) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + lua_Integer init = posrelat(luaL_optinteger(L, 3, 1), ls); + if (init < 1) init = 1; + else if (init > (lua_Integer)ls + 1) { /* start after string's end? */ + lua_pushnil(L); /* cannot find anything */ + return 1; + } + /* explicit request or no special characters? */ + if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) { + /* do a plain search */ + const char *s2 = lmemfind(s + init - 1, ls - (size_t)init + 1, p, lp); + if (s2) { + lua_pushinteger(L, (s2 - s) + 1); + lua_pushinteger(L, (s2 - s) + lp); + return 2; + } + } + else { + MatchState ms; + const char *s1 = s + init - 1; + int anchor = (*p == '^'); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, s, ls, p, lp); + do { + const char *res; + reprepstate(&ms); + 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); +} + + +/* state for 'gmatch' */ +typedef struct GMatchState { + const char *src; /* current position */ + const char *p; /* pattern */ + const char *lastmatch; /* end of last match */ + MatchState ms; /* match state */ +} GMatchState; + + +static int gmatch_aux (lua_State *L) { + GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); + const char *src; + gm->ms.L = L; + for (src = gm->src; src <= gm->ms.src_end; src++) { + const char *e; + reprepstate(&gm->ms); + if ((e = match(&gm->ms, src, gm->p)) != NULL && e != gm->lastmatch) { + gm->src = gm->lastmatch = e; + return push_captures(&gm->ms, src, e); + } + } + return 0; /* not found */ +} + + +static int gmatch (lua_State *L) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + GMatchState *gm; + lua_settop(L, 2); /* keep them on closure to avoid being collected */ + gm = (GMatchState *)lua_newuserdata(L, sizeof(GMatchState)); + prepstate(&gm->ms, L, s, ls, p, lp); + gm->src = s; gm->p = p; gm->lastmatch = NULL; + lua_pushcclosure(L, gmatch_aux, 3); + return 1; +} + + +static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + size_t l, i; + lua_State *L = ms->L; + const char *news = lua_tolstring(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]))) { + if (news[i] != L_ESC) + luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); + 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_tolstring(L, -1, NULL); /* if number, convert it to string */ + lua_remove(L, -2); /* remove original value */ + luaL_addvalue(b); /* add capture to accumulated result */ + } + } + } +} + + +static void add_value (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e, int tr) { + lua_State *L = ms->L; + switch (tr) { + 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; + } + default: { /* LUA_TNUMBER or LUA_TSTRING */ + add_s(ms, b, s, e); + return; + } + } + 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, lp; + const char *src = luaL_checklstring(L, 1, &srcl); /* subject */ + const char *p = luaL_checklstring(L, 2, &lp); /* pattern */ + const char *lastmatch = NULL; /* end of last match */ + int tr = lua_type(L, 3); /* replacement type */ + lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */ + int anchor = (*p == '^'); + lua_Integer n = 0; /* replacement count */ + 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); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, src, srcl, p, lp); + while (n < max_s) { + const char *e; + reprepstate(&ms); /* (re)prepare state for new match */ + if ((e = match(&ms, src, p)) != NULL && e != lastmatch) { /* match? */ + n++; + add_value(&ms, &b, src, e, tr); /* add replacement to buffer */ + src = lastmatch = e; + } + else if (src < ms.src_end) /* otherwise, skip one character */ + luaL_addchar(&b, *src++); + else break; /* end of subject */ + if (anchor) break; + } + luaL_addlstring(&b, src, ms.src_end-src); + luaL_pushresult(&b); + lua_pushinteger(L, n); /* number of substitutions */ + return 2; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** STRING FORMAT +** ======================================================= +*/ + +#if !defined(lua_number2strx) /* { */ + +/* +** Hexadecimal floating-point formatter +*/ + +#include + +#define SIZELENMOD (sizeof(LUA_NUMBER_FRMLEN)/sizeof(char)) + + +/* +** Number of bits that goes into the first digit. It can be any value +** between 1 and 4; the following definition tries to align the number +** to nibble boundaries by making what is left after that first digit a +** multiple of 4. +*/ +#define L_NBFD ((l_mathlim(MANT_DIG) - 1)%4 + 1) + + +/* +** Add integer part of 'x' to buffer and return new 'x' +*/ +static lua_Number adddigit (char *buff, int n, lua_Number x) { + lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */ + int d = (int)dd; + buff[n] = (d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ + return x - dd; /* return what is left */ +} + + +static int num2straux (char *buff, int sz, lua_Number x) { + if (x != x || x == HUGE_VAL || x == -HUGE_VAL) /* inf or NaN? */ + return l_sprintf(buff, sz, LUA_NUMBER_FMT, x); /* equal to '%g' */ + else if (x == 0) { /* can be -0... */ + /* create "0" or "-0" followed by exponent */ + return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", x); + } + else { + int e; + lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ + int n = 0; /* character count */ + if (m < 0) { /* is number negative? */ + buff[n++] = '-'; /* add signal */ + m = -m; /* make it positive */ + } + buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */ + m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */ + e -= L_NBFD; /* this digit goes before the radix point */ + if (m > 0) { /* more digits? */ + buff[n++] = lua_getlocaledecpoint(); /* add radix point */ + do { /* add as many digits as needed */ + m = adddigit(buff, n++, m * 16); + } while (m > 0); + } + n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ + lua_assert(n < sz); + return n; + } +} + + +static int lua_number2strx (lua_State *L, char *buff, int sz, + const char *fmt, lua_Number x) { + int n = num2straux(buff, sz, x); + if (fmt[SIZELENMOD] == 'A') { + int i; + for (i = 0; i < n; i++) + buff[i] = toupper(uchar(buff[i])); + } + else if (fmt[SIZELENMOD] != 'a') + luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented"); + return n; +} + +#endif /* } */ + + +/* +** Maximum size of each formatted item. This maximum size is produced +** by format('%.99f', -maxfloat), and is equal to 99 + 3 ('-', '.', +** and '\0') + number of decimal digits to represent maxfloat (which +** is maximum exponent + 1). (99+3+1 then rounded to 120 for "extra +** expenses", such as locale-dependent stuff) +*/ +#define MAX_ITEM (120 + l_mathlim(MAX_10_EXP)) + + +/* valid flags in a format specification */ +#define FLAGS "-+ #0" + +/* +** maximum size of each format specification (such as "%-099.99d") +*/ +#define MAX_FORMAT 32 + + +static void addquoted (luaL_Buffer *b, const char *s, size_t len) { + luaL_addchar(b, '"'); + while (len--) { + if (*s == '"' || *s == '\\' || *s == '\n') { + luaL_addchar(b, '\\'); + luaL_addchar(b, *s); + } + else if (iscntrl(uchar(*s))) { + char buff[10]; + if (!isdigit(uchar(*(s+1)))) + l_sprintf(buff, sizeof(buff), "\\%d", (int)uchar(*s)); + else + l_sprintf(buff, sizeof(buff), "\\%03d", (int)uchar(*s)); + luaL_addstring(b, buff); + } + else + luaL_addchar(b, *s); + s++; + } + luaL_addchar(b, '"'); +} + + +/* +** Ensures the 'buff' string uses a dot as the radix character. +*/ +static void checkdp (char *buff, int nb) { + if (memchr(buff, '.', nb) == NULL) { /* no dot? */ + char point = lua_getlocaledecpoint(); /* try locale point */ + char *ppoint = memchr(buff, point, nb); + if (ppoint) *ppoint = '.'; /* change it to a dot */ + } +} + + +static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { + switch (lua_type(L, arg)) { + case LUA_TSTRING: { + size_t len; + const char *s = lua_tolstring(L, arg, &len); + addquoted(b, s, len); + break; + } + case LUA_TNUMBER: { + char *buff = luaL_prepbuffsize(b, MAX_ITEM); + int nb; + if (!lua_isinteger(L, arg)) { /* float? */ + lua_Number n = lua_tonumber(L, arg); /* write as hexa ('%a') */ + nb = lua_number2strx(L, buff, MAX_ITEM, "%" LUA_NUMBER_FRMLEN "a", n); + checkdp(buff, nb); /* ensure it uses a dot */ + } + else { /* integers */ + lua_Integer n = lua_tointeger(L, arg); + const char *format = (n == LUA_MININTEGER) /* corner case? */ + ? "0x%" LUA_INTEGER_FRMLEN "x" /* use hexa */ + : LUA_INTEGER_FMT; /* else use default format */ + nb = l_sprintf(buff, MAX_ITEM, format, n); + } + luaL_addsize(b, nb); + break; + } + case LUA_TNIL: case LUA_TBOOLEAN: { + luaL_tolstring(L, arg, NULL); + luaL_addvalue(b); + break; + } + default: { + luaL_argerror(L, arg, "value has no literal form"); + } + } +} + + +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)/sizeof(char)) + 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++) = '%'; + memcpy(form, strfrmt, ((p - strfrmt) + 1) * sizeof(char)); + form += (p - strfrmt) + 1; + *form = '\0'; + return p; +} + + +/* +** add length modifier into formats +*/ +static void addlenmod (char *form, const char *lenmod) { + size_t l = strlen(form); + size_t lm = strlen(lenmod); + char spec = form[l - 1]; + strcpy(form + l - 1, lenmod); + form[l + lm - 1] = spec; + form[l + lm] = '\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 = luaL_prepbuffsize(&b, MAX_ITEM); /* to put formatted item */ + int nb = 0; /* number of bytes in added item */ + if (++arg > top) + luaL_argerror(L, arg, "no value"); + strfrmt = scanformat(L, strfrmt, form); + switch (*strfrmt++) { + case 'c': { + nb = l_sprintf(buff, MAX_ITEM, form, (int)luaL_checkinteger(L, arg)); + break; + } + case 'd': case 'i': + case 'o': case 'u': case 'x': case 'X': { + lua_Integer n = luaL_checkinteger(L, arg); + addlenmod(form, LUA_INTEGER_FRMLEN); + nb = l_sprintf(buff, MAX_ITEM, form, n); + break; + } + case 'a': case 'A': + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = lua_number2strx(L, buff, MAX_ITEM, form, + luaL_checknumber(L, arg)); + break; + case 'e': case 'E': case 'f': + case 'g': case 'G': { + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = l_sprintf(buff, MAX_ITEM, form, luaL_checknumber(L, arg)); + break; + } + case 'q': { + addliteral(L, &b, arg); + break; + } + case 's': { + size_t l; + const char *s = luaL_tolstring(L, arg, &l); + if (form[2] == '\0') /* no modifiers? */ + luaL_addvalue(&b); /* keep entire string */ + else { + luaL_argcheck(L, l == strlen(s), arg, "string contains zeros"); + if (!strchr(form, '.') && l >= 100) { + /* no precision and string is too long to be formatted */ + luaL_addvalue(&b); /* keep entire string */ + } + else { /* format the string into 'buff' */ + nb = l_sprintf(buff, MAX_ITEM, form, s); + lua_pop(L, 1); /* remove result from 'luaL_tolstring' */ + } + } + break; + } + default: { /* also treat cases 'pnLlh' */ + return luaL_error(L, "invalid option '%%%c' to 'format'", + *(strfrmt - 1)); + } + } + lua_assert(nb < MAX_ITEM); + luaL_addsize(&b, nb); + } + } + luaL_pushresult(&b); + return 1; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** PACK/UNPACK +** ======================================================= +*/ + + +/* value used for padding */ +#if !defined(LUAL_PACKPADBYTE) +#define LUAL_PACKPADBYTE 0x00 +#endif + +/* maximum size for the binary representation of an integer */ +#define MAXINTSIZE 16 + +/* number of bits in a character */ +#define NB CHAR_BIT + +/* mask for one character (NB 1's) */ +#define MC ((1 << NB) - 1) + +/* size of a lua_Integer */ +#define SZINT ((int)sizeof(lua_Integer)) + + +/* dummy union to get native endianness */ +static const union { + int dummy; + char little; /* true iff machine is little endian */ +} nativeendian = {1}; + + +/* dummy structure to get native alignment requirements */ +struct cD { + char c; + union { double d; void *p; lua_Integer i; lua_Number n; } u; +}; + +#define MAXALIGN (offsetof(struct cD, u)) + + +/* +** Union for serializing floats +*/ +typedef union Ftypes { + float f; + double d; + lua_Number n; + char buff[5 * sizeof(lua_Number)]; /* enough for any float type */ +} Ftypes; + + +/* +** information to pack/unpack stuff +*/ +typedef struct Header { + lua_State *L; + int islittle; + int maxalign; +} Header; + + +/* +** options for pack/unpack +*/ +typedef enum KOption { + Kint, /* signed integers */ + Kuint, /* unsigned integers */ + Kfloat, /* floating-point numbers */ + Kchar, /* fixed-length strings */ + Kstring, /* strings with prefixed length */ + Kzstr, /* zero-terminated strings */ + Kpadding, /* padding */ + Kpaddalign, /* padding for alignment */ + Knop /* no-op (configuration or spaces) */ +} KOption; + + +/* +** Read an integer numeral from string 'fmt' or return 'df' if +** there is no numeral +*/ +static int digit (int c) { return '0' <= c && c <= '9'; } + +static int getnum (const char **fmt, int df) { + if (!digit(**fmt)) /* no number? */ + return df; /* return default value */ + else { + int a = 0; + do { + a = a*10 + (*((*fmt)++) - '0'); + } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10); + return a; + } +} + + +/* +** Read an integer numeral and raises an error if it is larger +** than the maximum size for integers. +*/ +static int getnumlimit (Header *h, const char **fmt, int df) { + int sz = getnum(fmt, df); + if (sz > MAXINTSIZE || sz <= 0) + luaL_error(h->L, "integral size (%d) out of limits [1,%d]", + sz, MAXINTSIZE); + return sz; +} + + +/* +** Initialize Header +*/ +static void initheader (lua_State *L, Header *h) { + h->L = L; + h->islittle = nativeendian.little; + h->maxalign = 1; +} + + +/* +** Read and classify next option. 'size' is filled with option's size. +*/ +static KOption getoption (Header *h, const char **fmt, int *size) { + int opt = *((*fmt)++); + *size = 0; /* default */ + switch (opt) { + case 'b': *size = sizeof(char); return Kint; + case 'B': *size = sizeof(char); return Kuint; + case 'h': *size = sizeof(short); return Kint; + case 'H': *size = sizeof(short); return Kuint; + case 'l': *size = sizeof(long); return Kint; + case 'L': *size = sizeof(long); return Kuint; + case 'j': *size = sizeof(lua_Integer); return Kint; + case 'J': *size = sizeof(lua_Integer); return Kuint; + case 'T': *size = sizeof(size_t); return Kuint; + case 'f': *size = sizeof(float); return Kfloat; + case 'd': *size = sizeof(double); return Kfloat; + case 'n': *size = sizeof(lua_Number); return Kfloat; + case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint; + case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint; + case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring; + case 'c': + *size = getnum(fmt, -1); + if (*size == -1) + luaL_error(h->L, "missing size for format option 'c'"); + return Kchar; + case 'z': return Kzstr; + case 'x': *size = 1; return Kpadding; + case 'X': return Kpaddalign; + case ' ': break; + case '<': h->islittle = 1; break; + case '>': h->islittle = 0; break; + case '=': h->islittle = nativeendian.little; break; + case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break; + default: luaL_error(h->L, "invalid format option '%c'", opt); + } + return Knop; +} + + +/* +** Read, classify, and fill other details about the next option. +** 'psize' is filled with option's size, 'notoalign' with its +** alignment requirements. +** Local variable 'size' gets the size to be aligned. (Kpadal option +** always gets its full alignment, other options are limited by +** the maximum alignment ('maxalign'). Kchar option needs no alignment +** despite its size. +*/ +static KOption getdetails (Header *h, size_t totalsize, + const char **fmt, int *psize, int *ntoalign) { + KOption opt = getoption(h, fmt, psize); + int align = *psize; /* usually, alignment follows size */ + if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ + if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0) + luaL_argerror(h->L, 1, "invalid next option for option 'X'"); + } + if (align <= 1 || opt == Kchar) /* need no alignment? */ + *ntoalign = 0; + else { + if (align > h->maxalign) /* enforce maximum alignment */ + align = h->maxalign; + if ((align & (align - 1)) != 0) /* is 'align' not a power of 2? */ + luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); + *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1); + } + return opt; +} + + +/* +** Pack integer 'n' with 'size' bytes and 'islittle' endianness. +** The final 'if' handles the case when 'size' is larger than +** the size of a Lua integer, correcting the extra sign-extension +** bytes if necessary (by default they would be zeros). +*/ +static void packint (luaL_Buffer *b, lua_Unsigned n, + int islittle, int size, int neg) { + char *buff = luaL_prepbuffsize(b, size); + int i; + buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ + for (i = 1; i < size; i++) { + n >>= NB; + buff[islittle ? i : size - 1 - i] = (char)(n & MC); + } + if (neg && size > SZINT) { /* negative number need sign extension? */ + for (i = SZINT; i < size; i++) /* correct extra bytes */ + buff[islittle ? i : size - 1 - i] = (char)MC; + } + luaL_addsize(b, size); /* add result to buffer */ +} + + +/* +** Copy 'size' bytes from 'src' to 'dest', correcting endianness if +** given 'islittle' is different from native endianness. +*/ +static void copywithendian (volatile char *dest, volatile const char *src, + int size, int islittle) { + if (islittle == nativeendian.little) { + while (size-- != 0) + *(dest++) = *(src++); + } + else { + dest += size - 1; + while (size-- != 0) + *(dest--) = *(src++); + } +} + + +static int str_pack (lua_State *L) { + luaL_Buffer b; + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + int arg = 1; /* current argument to pack */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + lua_pushnil(L); /* mark to separate arguments from string buffer */ + luaL_buffinit(L, &b); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + totalsize += ntoalign + size; + while (ntoalign-- > 0) + luaL_addchar(&b, LUAL_PACKPADBYTE); /* fill alignment */ + arg++; + switch (opt) { + case Kint: { /* signed integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) { /* need overflow check? */ + lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); + luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); + } + packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0)); + break; + } + case Kuint: { /* unsigned integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) /* need overflow check? */ + luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), + arg, "unsigned overflow"); + packint(&b, (lua_Unsigned)n, h.islittle, size, 0); + break; + } + case Kfloat: { /* floating-point options */ + volatile Ftypes u; + char *buff = luaL_prepbuffsize(&b, size); + lua_Number n = luaL_checknumber(L, arg); /* get argument */ + if (size == sizeof(u.f)) u.f = (float)n; /* copy it into 'u' */ + else if (size == sizeof(u.d)) u.d = (double)n; + else u.n = n; + /* move 'u' to final result, correcting endianness if needed */ + copywithendian(buff, u.buff, size, h.islittle); + luaL_addsize(&b, size); + break; + } + case Kchar: { /* fixed-size string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, len <= (size_t)size, arg, + "string longer than given size"); + luaL_addlstring(&b, s, len); /* add string */ + while (len++ < (size_t)size) /* pad extra space */ + luaL_addchar(&b, LUAL_PACKPADBYTE); + break; + } + case Kstring: { /* strings with length count */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, size >= (int)sizeof(size_t) || + len < ((size_t)1 << (size * NB)), + arg, "string length does not fit in given size"); + packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */ + luaL_addlstring(&b, s, len); + totalsize += len; + break; + } + case Kzstr: { /* zero-terminated string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, strlen(s) == len, arg, "string contains zeros"); + luaL_addlstring(&b, s, len); + luaL_addchar(&b, '\0'); /* add zero at the end */ + totalsize += len + 1; + break; + } + case Kpadding: luaL_addchar(&b, LUAL_PACKPADBYTE); /* FALLTHROUGH */ + case Kpaddalign: case Knop: + arg--; /* undo increment */ + break; + } + } + luaL_pushresult(&b); + return 1; +} + + +static int str_packsize (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + size += ntoalign; /* total space used by option */ + luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, + "format result too large"); + totalsize += size; + switch (opt) { + case Kstring: /* strings with length count */ + case Kzstr: /* zero-terminated string */ + luaL_argerror(L, 1, "variable-length format"); + /* call never return, but to avoid warnings: *//* FALLTHROUGH */ + default: break; + } + } + lua_pushinteger(L, (lua_Integer)totalsize); + return 1; +} + + +/* +** Unpack an integer with 'size' bytes and 'islittle' endianness. +** If size is smaller than the size of a Lua integer and integer +** is signed, must do sign extension (propagating the sign to the +** higher bits); if size is larger than the size of a Lua integer, +** it must check the unread bytes to see whether they do not cause an +** overflow. +*/ +static lua_Integer unpackint (lua_State *L, const char *str, + int islittle, int size, int issigned) { + lua_Unsigned res = 0; + int i; + int limit = (size <= SZINT) ? size : SZINT; + for (i = limit - 1; i >= 0; i--) { + res <<= NB; + res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i]; + } + if (size < SZINT) { /* real size smaller than lua_Integer? */ + if (issigned) { /* needs sign extension? */ + lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1); + res = ((res ^ mask) - mask); /* do sign extension */ + } + } + else if (size > SZINT) { /* must check unread bytes */ + int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC; + for (i = limit; i < size; i++) { + if ((unsigned char)str[islittle ? i : size - 1 - i] != mask) + luaL_error(L, "%d-byte integer does not fit into Lua Integer", size); + } + } + return (lua_Integer)res; +} + + +static int str_unpack (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); + size_t ld; + const char *data = luaL_checklstring(L, 2, &ld); + size_t pos = (size_t)posrelat(luaL_optinteger(L, 3, 1), ld) - 1; + int n = 0; /* number of results */ + luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); + if ((size_t)ntoalign + size > ~pos || pos + ntoalign + size > ld) + luaL_argerror(L, 2, "data string too short"); + pos += ntoalign; /* skip alignment */ + /* stack space for item + next position */ + luaL_checkstack(L, 2, "too many results"); + n++; + switch (opt) { + case Kint: + case Kuint: { + lua_Integer res = unpackint(L, data + pos, h.islittle, size, + (opt == Kint)); + lua_pushinteger(L, res); + break; + } + case Kfloat: { + volatile Ftypes u; + lua_Number num; + copywithendian(u.buff, data + pos, size, h.islittle); + if (size == sizeof(u.f)) num = (lua_Number)u.f; + else if (size == sizeof(u.d)) num = (lua_Number)u.d; + else num = u.n; + lua_pushnumber(L, num); + break; + } + case Kchar: { + lua_pushlstring(L, data + pos, size); + break; + } + case Kstring: { + size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0); + luaL_argcheck(L, pos + len + size <= ld, 2, "data string too short"); + lua_pushlstring(L, data + pos + size, len); + pos += len; /* skip string */ + break; + } + case Kzstr: { + size_t len = (int)strlen(data + pos); + lua_pushlstring(L, data + pos, len); + pos += len + 1; /* skip string plus final '\0' */ + break; + } + case Kpaddalign: case Kpadding: case Knop: + n--; /* undo increment */ + break; + } + pos += size; + } + lua_pushinteger(L, pos + 1); /* next position */ + return n + 1; +} + +/* }====================================================== */ + + +static const luaL_Reg strlib[] = { + {"byte", str_byte}, + {"char", str_char}, + {"dump", str_dump}, + {"find", str_find}, + {"format", str_format}, + {"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}, + {"pack", str_pack}, + {"packsize", str_packsize}, + {"unpack", str_unpack}, + {NULL, NULL} +}; + + +static void createmetatable (lua_State *L) { + lua_createtable(L, 0, 1); /* table to be metatable for strings */ + lua_pushliteral(L, ""); /* dummy string */ + lua_pushvalue(L, -2); /* copy table */ + lua_setmetatable(L, -2); /* set table as metatable for strings */ + lua_pop(L, 1); /* pop dummy string */ + lua_pushvalue(L, -2); /* get string library */ + lua_setfield(L, -2, "__index"); /* metatable.__index = string */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** Open string library +*/ +LUAMOD_API int luaopen_string (lua_State *L) { + luaL_newlib(L, strlib); + createmetatable(L); + return 1; +} + diff --git a/lua-5.3.3/src/ltable.c b/lua-5.3.3/src/ltable.c new file mode 100644 index 0000000..7e15b71 --- /dev/null +++ b/lua-5.3.3/src/ltable.c @@ -0,0 +1,669 @@ +/* +** $Id: ltable.c,v 2.117 2015/11/19 19:16:22 roberto Exp $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#define ltable_c +#define LUA_CORE + +#include "lprefix.h" + + +/* +** Implementation of tables (aka arrays, objects, or hash tables). +** Tables keep its elements in two parts: an array part and a hash part. +** Non-negative integer keys are all candidates to be kept in the array +** part. The actual size of the array is the largest 'n' such that +** more than half the slots between 1 and n are in use. +** Hash uses a mix of chained scatter table with Brent's variation. +** A main invariant of these tables is that, if an element is not +** in its main position (i.e. the 'original' position that its hash gives +** to it), then the colliding element is in its own main position. +** Hence even when the load factor reaches 100%, performance remains good. +*/ + +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* +** Maximum size of array part (MAXASIZE) is 2^MAXABITS. MAXABITS is +** the largest integer such that MAXASIZE fits in an unsigned int. +*/ +#define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) +#define MAXASIZE (1u << MAXABITS) + +/* +** Maximum size of hash part is 2^MAXHBITS. MAXHBITS is the largest +** integer such that 2^MAXHBITS fits in a signed int. (Note that the +** maximum number of elements in a table, 2^MAXABITS + 2^MAXHBITS, still +** fits comfortably in an unsigned int.) +*/ +#define MAXHBITS (MAXABITS - 1) + + +#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) + +#define hashstr(t,str) hashpow2(t, (str)->hash) +#define hashboolean(t,p) hashpow2(t, p) +#define hashint(t,i) hashpow2(t, i) + + +/* +** 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, point2uint(p)) + + +#define dummynode (&dummynode_) + +#define isdummy(n) ((n) == dummynode) + +static const Node dummynode_ = { + {NILCONSTANT}, /* value */ + {{NILCONSTANT, 0}} /* key */ +}; + + +/* +** Hash for floating-point numbers. +** The main computation should be just +** n = frexp(n, &i); return (n * INT_MAX) + i +** but there are some numerical subtleties. +** In a two-complement representation, INT_MAX does not has an exact +** representation as a float, but INT_MIN does; because the absolute +** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the +** absolute value of the product 'frexp * -INT_MIN' is smaller or equal +** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when +** adding 'i'; the use of '~u' (instead of '-u') avoids problems with +** INT_MIN. +*/ +#if !defined(l_hashfloat) +static int l_hashfloat (lua_Number n) { + int i; + lua_Integer ni; + n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); + if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */ + lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL)); + return 0; + } + else { /* normal case */ + unsigned int u = cast(unsigned int, i) + cast(unsigned int, ni); + return cast_int(u <= cast(unsigned int, INT_MAX) ? u : ~u); + } +} +#endif + + +/* +** returns the 'main' position of an element in a table (that is, the index +** of its hash value) +*/ +static Node *mainposition (const Table *t, const TValue *key) { + switch (ttype(key)) { + case LUA_TNUMINT: + return hashint(t, ivalue(key)); + case LUA_TNUMFLT: + return hashmod(t, l_hashfloat(fltvalue(key))); + case LUA_TSHRSTR: + return hashstr(t, tsvalue(key)); + case LUA_TLNGSTR: + return hashpow2(t, luaS_hashlongstr(tsvalue(key))); + case LUA_TBOOLEAN: + return hashboolean(t, bvalue(key)); + case LUA_TLIGHTUSERDATA: + return hashpointer(t, pvalue(key)); + case LUA_TLCF: + return hashpointer(t, fvalue(key)); + default: + lua_assert(!ttisdeadkey(key)); + 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, 0 otherwise. +*/ +static unsigned int arrayindex (const TValue *key) { + if (ttisinteger(key)) { + lua_Integer k = ivalue(key); + if (0 < k && (lua_Unsigned)k <= MAXASIZE) + return cast(unsigned int, k); /* 'key' is an appropriate array index */ + } + return 0; /* '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 signaled by 0. +*/ +static unsigned int findindex (lua_State *L, Table *t, StkId key) { + unsigned int i; + if (ttisnil(key)) return 0; /* first iteration */ + i = arrayindex(key); + if (i != 0 && i <= t->sizearray) /* is 'key' inside array part? */ + return i; /* yes; that's the index */ + else { + int nx; + Node *n = mainposition(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + /* key may be dead already, but it is ok to use it in 'next' */ + if (luaV_rawequalobj(gkey(n), key) || + (ttisdeadkey(gkey(n)) && iscollectable(key) && + deadvalue(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 + 1) + t->sizearray; + } + nx = gnext(n); + if (nx == 0) + luaG_runerror(L, "invalid key to 'next'"); /* key not found */ + else n += nx; + } + } +} + + +int luaH_next (lua_State *L, Table *t, StkId key) { + unsigned int i = findindex(L, t, key); /* find original element */ + for (; i < t->sizearray; i++) { /* try first array part */ + if (!ttisnil(&t->array[i])) { /* a non-nil value? */ + setivalue(key, i + 1); + setobj2s(L, key+1, &t->array[i]); + return 1; + } + } + for (i -= t->sizearray; cast_int(i) < sizenode(t); i++) { /* hash part */ + if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ + setobj2s(L, key, gkey(gnode(t, i))); + setobj2s(L, key+1, gval(gnode(t, i))); + return 1; + } + } + return 0; /* no more elements */ +} + + +/* +** {============================================================= +** Rehash +** ============================================================== +*/ + +/* +** Compute the optimal size for the array part of table 't'. 'nums' is a +** "count array" where 'nums[i]' is the number of integers in the table +** between 2^(i - 1) + 1 and 2^i. 'pna' enters with the total number of +** integer keys in the table and leaves with the number of keys that +** will go to the array part; return the optimal size. +*/ +static unsigned int computesizes (unsigned int nums[], unsigned int *pna) { + int i; + unsigned int twotoi; /* 2^i (candidate for optimal size) */ + unsigned int a = 0; /* number of elements smaller than 2^i */ + unsigned int na = 0; /* number of elements to go to array part */ + unsigned int optimal = 0; /* optimal size for array part */ + /* loop while keys can fill more than half of total size */ + for (i = 0, twotoi = 1; *pna > twotoi / 2; i++, twotoi *= 2) { + if (nums[i] > 0) { + a += nums[i]; + if (a > twotoi/2) { /* more than half elements present? */ + optimal = twotoi; /* optimal size (till now) */ + na = a; /* all elements up to 'optimal' will go to array part */ + } + } + } + lua_assert((optimal == 0 || optimal / 2 < na) && na <= optimal); + *pna = na; + return optimal; +} + + +static int countint (const TValue *key, unsigned int *nums) { + unsigned int k = arrayindex(key); + if (k != 0) { /* is 'key' an appropriate array index? */ + nums[luaO_ceillog2(k)]++; /* count as such */ + return 1; + } + else + return 0; +} + + +/* +** Count keys in array part of table 't': Fill 'nums[i]' with +** number of keys that will go into corresponding slice and return +** total number of non-nil keys. +*/ +static unsigned int numusearray (const Table *t, unsigned int *nums) { + int lg; + unsigned int ttlg; /* 2^lg */ + unsigned int ause = 0; /* summation of 'nums' */ + unsigned int i = 1; /* count to traverse all array keys */ + /* traverse each slice */ + for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) { + unsigned int lc = 0; /* counter */ + unsigned 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, unsigned int *nums, unsigned int *pna) { + int totaluse = 0; /* total number of elements */ + int ause = 0; /* elements added to 'nums' (can go to array part) */ + int i = sizenode(t); + while (i--) { + Node *n = &t->node[i]; + if (!ttisnil(gval(n))) { + ause += countint(gkey(n), nums); + totaluse++; + } + } + *pna += ause; + return totaluse; +} + + +static void setarrayvector (lua_State *L, Table *t, unsigned int size) { + unsigned 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, unsigned 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 = luaO_ceillog2(size); + if (lsize > MAXHBITS) + luaG_runerror(L, "table overflow"); + size = twoto(lsize); + t->node = luaM_newvector(L, size, Node); + for (i = 0; i < (int)size; i++) { + Node *n = gnode(t, i); + gnext(n) = 0; + setnilvalue(wgkey(n)); + setnilvalue(gval(n)); + } + } + t->lsizenode = cast_byte(lsize); + t->lastfree = gnode(t, size); /* all positions are free */ +} + + +void luaH_resize (lua_State *L, Table *t, unsigned int nasize, + unsigned int nhsize) { + unsigned int i; + int j; + unsigned 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])) + luaH_setint(L, t, i + 1, &t->array[i]); + } + /* shrink array */ + luaM_reallocvector(L, t->array, oldasize, nasize, TValue); + } + /* re-insert elements from hash part */ + for (j = twoto(oldhsize) - 1; j >= 0; j--) { + Node *old = nold + j; + if (!ttisnil(gval(old))) { + /* doesn't need barrier/invalidate cache, as entry was + already present in the table */ + setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old)); + } + } + if (!isdummy(nold)) + luaM_freearray(L, nold, cast(size_t, twoto(oldhsize))); /* free old hash */ +} + + +void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { + int nsize = isdummy(t->node) ? 0 : sizenode(t); + luaH_resize(L, t, nasize, nsize); +} + +/* +** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i +*/ +static void rehash (lua_State *L, Table *t, const TValue *ek) { + unsigned int asize; /* optimal size for array part */ + unsigned int na; /* number of keys in the array part */ + unsigned int nums[MAXABITS + 1]; + int i; + int totaluse; + for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ + na = numusearray(t, nums); /* count keys in array part */ + totaluse = na; /* all those keys are integer keys */ + totaluse += numusehash(t, nums, &na); /* count keys in hash part */ + /* count extra key */ + na += countint(ek, nums); + totaluse++; + /* compute new size for array part */ + asize = computesizes(nums, &na); + /* resize the table to new computed sizes */ + luaH_resize(L, t, asize, totaluse - na); +} + + + +/* +** }============================================================= +*/ + + +Table *luaH_new (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_TTABLE, sizeof(Table)); + Table *t = gco2t(o); + t->metatable = NULL; + t->flags = cast_byte(~0); + t->array = NULL; + t->sizearray = 0; + setnodevector(L, t, 0); + return t; +} + + +void luaH_free (lua_State *L, Table *t) { + if (!isdummy(t->node)) + luaM_freearray(L, t->node, cast(size_t, sizenode(t))); + luaM_freearray(L, t->array, t->sizearray); + luaM_free(L, t); +} + + +static Node *getfreepos (Table *t) { + while (t->lastfree > t->node) { + t->lastfree--; + 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. +*/ +TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) { + Node *mp; + TValue aux; + if (ttisnil(key)) luaG_runerror(L, "table index is nil"); + else if (ttisfloat(key)) { + lua_Integer k; + if (luaV_tointeger(key, &k, 0)) { /* index is int? */ + setivalue(&aux, k); + key = &aux; /* insert it as an integer */ + } + else if (luai_numisnan(fltvalue(key))) + luaG_runerror(L, "table index is NaN"); + } + mp = mainposition(t, key); + if (!ttisnil(gval(mp)) || isdummy(mp)) { /* main position is taken? */ + Node *othern; + Node *f = getfreepos(t); /* get a free place */ + if (f == NULL) { /* cannot find a free place? */ + rehash(L, t, key); /* grow table */ + /* whatever called 'newkey' takes care of TM cache */ + return luaH_set(L, t, key); /* insert key into grown table */ + } + lua_assert(!isdummy(f)); + othern = mainposition(t, gkey(mp)); + if (othern != mp) { /* is colliding node out of its main position? */ + /* yes; move colliding node into free position */ + while (othern + gnext(othern) != mp) /* find previous */ + othern += gnext(othern); + gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */ + *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + if (gnext(mp) != 0) { + gnext(f) += cast_int(mp - f); /* correct 'next' */ + gnext(mp) = 0; /* now 'mp' is free */ + } + setnilvalue(gval(mp)); + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + if (gnext(mp) != 0) + gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */ + else lua_assert(gnext(f) == 0); + gnext(mp) = cast_int(f - mp); + mp = f; + } + } + setnodekey(L, &mp->i_key, key); + luaC_barrierback(L, t, key); + lua_assert(ttisnil(gval(mp))); + return gval(mp); +} + + +/* +** search function for integers +*/ +const TValue *luaH_getint (Table *t, lua_Integer key) { + /* (1 <= key && key <= t->sizearray) */ + if (l_castS2U(key) - 1 < t->sizearray) + return &t->array[key - 1]; + else { + Node *n = hashint(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (ttisinteger(gkey(n)) && ivalue(gkey(n)) == key) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) break; + n += nx; + } + } + return luaO_nilobject; + } +} + + +/* +** search function for short strings +*/ +const TValue *luaH_getshortstr (Table *t, TString *key) { + Node *n = hashstr(t, key); + lua_assert(key->tt == LUA_TSHRSTR); + for (;;) { /* check whether 'key' is somewhere in the chain */ + const TValue *k = gkey(n); + if (ttisshrstring(k) && eqshrstr(tsvalue(k), key)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return luaO_nilobject; /* not found */ + n += nx; + } + } +} + + +/* +** "Generic" get version. (Not that generic: not valid for integers, +** which may be in array part, nor for floats with integral values.) +*/ +static const TValue *getgeneric (Table *t, const TValue *key) { + Node *n = mainposition(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (luaV_rawequalobj(gkey(n), key)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return luaO_nilobject; /* not found */ + n += nx; + } + } +} + + +const TValue *luaH_getstr (Table *t, TString *key) { + if (key->tt == LUA_TSHRSTR) + return luaH_getshortstr(t, key); + else { /* for long strings, use generic case */ + TValue ko; + setsvalue(cast(lua_State *, NULL), &ko, key); + return getgeneric(t, &ko); + } +} + + +/* +** main search function +*/ +const TValue *luaH_get (Table *t, const TValue *key) { + switch (ttype(key)) { + case LUA_TSHRSTR: return luaH_getshortstr(t, tsvalue(key)); + case LUA_TNUMINT: return luaH_getint(t, ivalue(key)); + case LUA_TNIL: return luaO_nilobject; + case LUA_TNUMFLT: { + lua_Integer k; + if (luaV_tointeger(key, &k, 0)) /* index is int? */ + return luaH_getint(t, k); /* use specialized version */ + /* else... */ + } /* FALLTHROUGH */ + default: + return getgeneric(t, key); + } +} + + +/* +** beware: when using this function you probably need to check a GC +** barrier and invalidate the TM cache. +*/ +TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { + const TValue *p = luaH_get(t, key); + if (p != luaO_nilobject) + return cast(TValue *, p); + else return luaH_newkey(L, t, key); +} + + +void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) { + const TValue *p = luaH_getint(t, key); + TValue *cell; + if (p != luaO_nilobject) + cell = cast(TValue *, p); + else { + TValue k; + setivalue(&k, key); + cell = luaH_newkey(L, t, &k); + } + setobj2t(L, cell, value); +} + + +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_getint(t, j))) { + i = j; + if (j > cast(unsigned int, MAX_INT)/2) { /* overflow? */ + /* table was built with bad purposes: resort to linear search */ + i = 1; + while (!ttisnil(luaH_getint(t, i))) i++; + return i - 1; + } + j *= 2; + } + /* now do a binary search between them */ + while (j - i > 1) { + unsigned int m = (i+j)/2; + if (ttisnil(luaH_getint(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 (isdummy(t->node)) /* 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 isdummy(n); } + +#endif diff --git a/lua-5.3.3/src/ltable.h b/lua-5.3.3/src/ltable.h new file mode 100644 index 0000000..213cc13 --- /dev/null +++ b/lua-5.3.3/src/ltable.h @@ -0,0 +1,58 @@ +/* +** $Id: ltable.h,v 2.21 2015/11/03 15:47:30 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 gval(n) (&(n)->i_val) +#define gnext(n) ((n)->i_key.nk.next) + + +/* 'const' to avoid wrong writings that can mess up field 'next' */ +#define gkey(n) cast(const TValue*, (&(n)->i_key.tvk)) + +/* +** writable version of 'gkey'; allows updates to individual fields, +** but not to the whole (which has incompatible type) +*/ +#define wgkey(n) (&(n)->i_key.nk) + +#define invalidateTMcache(t) ((t)->flags = 0) + + +/* returns the key, given the value of a table entry */ +#define keyfromval(v) \ + (gkey(cast(Node *, cast(char *, (v)) - offsetof(Node, i_val)))) + + +LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key); +LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key, + TValue *value); +LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); +LUAI_FUNC TValue *luaH_newkey (lua_State *L, 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); +LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize, + unsigned int nhsize); +LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize); +LUAI_FUNC void luaH_free (lua_State *L, Table *t); +LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); +LUAI_FUNC 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/lua-5.3.3/src/ltablib.c b/lua-5.3.3/src/ltablib.c new file mode 100644 index 0000000..98b2f87 --- /dev/null +++ b/lua-5.3.3/src/ltablib.c @@ -0,0 +1,450 @@ +/* +** $Id: ltablib.c,v 1.93 2016/02/25 19:41:54 roberto Exp $ +** Library for Table Manipulation +** See Copyright Notice in lua.h +*/ + +#define ltablib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** Operations that an object must define to mimic a table +** (some functions only need some of them) +*/ +#define TAB_R 1 /* read */ +#define TAB_W 2 /* write */ +#define TAB_L 4 /* length */ +#define TAB_RW (TAB_R | TAB_W) /* read/write */ + + +#define aux_getn(L,n,w) (checktab(L, n, (w) | TAB_L), luaL_len(L, n)) + + +static int checkfield (lua_State *L, const char *key, int n) { + lua_pushstring(L, key); + return (lua_rawget(L, -n) != LUA_TNIL); +} + + +/* +** Check that 'arg' either is a table or can behave like one (that is, +** has a metatable with the required metamethods) +*/ +static void checktab (lua_State *L, int arg, int what) { + if (lua_type(L, arg) != LUA_TTABLE) { /* is it not a table? */ + int n = 1; /* number of elements to pop */ + if (lua_getmetatable(L, arg) && /* must have metatable */ + (!(what & TAB_R) || checkfield(L, "__index", ++n)) && + (!(what & TAB_W) || checkfield(L, "__newindex", ++n)) && + (!(what & TAB_L) || checkfield(L, "__len", ++n))) { + lua_pop(L, n); /* pop metatable and tested metamethods */ + } + else + luaL_checktype(L, arg, LUA_TTABLE); /* force an error */ + } +} + + +#if defined(LUA_COMPAT_MAXN) +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; +} +#endif + + +static int tinsert (lua_State *L) { + lua_Integer e = aux_getn(L, 1, TAB_RW) + 1; /* first empty element */ + lua_Integer 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: { + lua_Integer i; + pos = luaL_checkinteger(L, 2); /* 2nd argument is the position */ + luaL_argcheck(L, 1 <= pos && pos <= e, 2, "position out of bounds"); + for (i = e; i > pos; i--) { /* move up elements */ + lua_geti(L, 1, i - 1); + lua_seti(L, 1, i); /* t[i] = t[i - 1] */ + } + break; + } + default: { + return luaL_error(L, "wrong number of arguments to 'insert'"); + } + } + lua_seti(L, 1, pos); /* t[pos] = v */ + return 0; +} + + +static int tremove (lua_State *L) { + lua_Integer size = aux_getn(L, 1, TAB_RW); + lua_Integer pos = luaL_optinteger(L, 2, size); + if (pos != size) /* validate 'pos' if given */ + luaL_argcheck(L, 1 <= pos && pos <= size + 1, 1, "position out of bounds"); + lua_geti(L, 1, pos); /* result = t[pos] */ + for ( ; pos < size; pos++) { + lua_geti(L, 1, pos + 1); + lua_seti(L, 1, pos); /* t[pos] = t[pos + 1] */ + } + lua_pushnil(L); + lua_seti(L, 1, pos); /* t[pos] = nil */ + return 1; +} + + +/* +** Copy elements (1[f], ..., 1[e]) into (tt[t], tt[t+1], ...). Whenever +** possible, copy in increasing order, which is better for rehashing. +** "possible" means destination after original range, or smaller +** than origin, or copying to another table. +*/ +static int tmove (lua_State *L) { + lua_Integer f = luaL_checkinteger(L, 2); + lua_Integer e = luaL_checkinteger(L, 3); + lua_Integer t = luaL_checkinteger(L, 4); + int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ + checktab(L, 1, TAB_R); + checktab(L, tt, TAB_W); + if (e >= f) { /* otherwise, nothing to move */ + lua_Integer n, i; + luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3, + "too many elements to move"); + n = e - f + 1; /* number of elements to move */ + luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4, + "destination wrap around"); + if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) { + for (i = 0; i < n; i++) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + else { + for (i = n - 1; i >= 0; i--) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + } + lua_pushvalue(L, tt); /* return destination table */ + return 1; +} + + +static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) { + lua_geti(L, 1, i); + if (!lua_isstring(L, -1)) + luaL_error(L, "invalid value (%s) at index %d in table for 'concat'", + luaL_typename(L, -1), i); + luaL_addvalue(b); +} + + +static int tconcat (lua_State *L) { + luaL_Buffer b; + lua_Integer last = aux_getn(L, 1, TAB_R); + size_t lsep; + const char *sep = luaL_optlstring(L, 2, "", &lsep); + lua_Integer i = luaL_optinteger(L, 3, 1); + last = luaL_optinteger(L, 4, last); + luaL_buffinit(L, &b); + for (; i < last; i++) { + addfield(L, &b, i); + luaL_addlstring(&b, sep, lsep); + } + if (i == last) /* add last value (if interval was not empty) */ + addfield(L, &b, i); + luaL_pushresult(&b); + return 1; +} + + +/* +** {====================================================== +** Pack/unpack +** ======================================================= +*/ + +static int pack (lua_State *L) { + int i; + int n = lua_gettop(L); /* number of elements to pack */ + lua_createtable(L, n, 1); /* create result table */ + lua_insert(L, 1); /* put it at index 1 */ + for (i = n; i >= 1; i--) /* assign elements */ + lua_seti(L, 1, i); + lua_pushinteger(L, n); + lua_setfield(L, 1, "n"); /* t.n = number of elements */ + return 1; /* return table */ +} + + +static int unpack (lua_State *L) { + lua_Unsigned n; + lua_Integer i = luaL_optinteger(L, 2, 1); + lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1)); + if (i > e) return 0; /* empty range */ + n = (lua_Unsigned)e - i; /* number of elements minus 1 (avoid overflows) */ + if (n >= (unsigned int)INT_MAX || !lua_checkstack(L, (int)(++n))) + return luaL_error(L, "too many results to unpack"); + for (; i < e; i++) { /* push arg[i..e - 1] (to avoid overflows) */ + lua_geti(L, 1, i); + } + lua_geti(L, 1, e); /* push last element */ + return (int)n; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Quicksort +** (based on 'Algorithms in MODULA-3', Robert Sedgewick; +** Addison-Wesley, 1993.) +** ======================================================= +*/ + + +/* type for array indices */ +typedef unsigned int IdxT; + + +/* +** Produce a "random" 'unsigned int' to randomize pivot choice. This +** macro is used only when 'sort' detects a big imbalance in the result +** of a partition. (If you don't want/need this "randomness", ~0 is a +** good choice.) +*/ +#if !defined(l_randomizePivot) /* { */ + +#include + +/* size of 'e' measured in number of 'unsigned int's */ +#define sof(e) (sizeof(e) / sizeof(unsigned int)) + +/* +** Use 'time' and 'clock' as sources of "randomness". Because we don't +** know the types 'clock_t' and 'time_t', we cannot cast them to +** anything without risking overflows. A safe way to use their values +** is to copy them to an array of a known type and use the array values. +*/ +static unsigned int l_randomizePivot (void) { + clock_t c = clock(); + time_t t = time(NULL); + unsigned int buff[sof(c) + sof(t)]; + unsigned int i, rnd = 0; + memcpy(buff, &c, sof(c) * sizeof(unsigned int)); + memcpy(buff + sof(c), &t, sof(t) * sizeof(unsigned int)); + for (i = 0; i < sof(buff); i++) + rnd += buff[i]; + return rnd; +} + +#endif /* } */ + + +/* arrays larger than 'RANLIMIT' may use randomized pivots */ +#define RANLIMIT 100u + + +static void set2 (lua_State *L, IdxT i, IdxT j) { + lua_seti(L, 1, i); + lua_seti(L, 1, j); +} + + +/* +** Return true iff value at stack index 'a' is less than the value at +** index 'b' (according to the order of the sort). +*/ +static int sort_comp (lua_State *L, int a, int b) { + if (lua_isnil(L, 2)) /* no function? */ + return lua_compare(L, a, b, LUA_OPLT); /* a < b */ + else { /* function */ + int res; + lua_pushvalue(L, 2); /* push function */ + lua_pushvalue(L, a-1); /* -1 to compensate function */ + lua_pushvalue(L, b-2); /* -2 to compensate function and 'a' */ + lua_call(L, 2, 1); /* call function */ + res = lua_toboolean(L, -1); /* get result */ + lua_pop(L, 1); /* pop result */ + return res; + } +} + + +/* +** Does the partition: Pivot P is at the top of the stack. +** precondition: a[lo] <= P == a[up-1] <= a[up], +** so it only needs to do the partition from lo + 1 to up - 2. +** Pos-condition: a[lo .. i - 1] <= a[i] == P <= a[i + 1 .. up] +** returns 'i'. +*/ +static IdxT partition (lua_State *L, IdxT lo, IdxT up) { + IdxT i = lo; /* will be incremented before first use */ + IdxT j = up - 1; /* will be decremented before first use */ + /* loop invariant: a[lo .. i] <= P <= a[j .. up] */ + for (;;) { + /* next loop: repeat ++i while a[i] < P */ + while (lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (i == up - 1) /* a[i] < P but a[up - 1] == P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[i] */ + } + /* after the loop, a[i] >= P and a[lo .. i - 1] < P */ + /* next loop: repeat --j while P < a[j] */ + while (lua_geti(L, 1, --j), sort_comp(L, -3, -1)) { + if (j < i) /* j < i but a[j] > P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[j] */ + } + /* after the loop, a[j] <= P and a[j + 1 .. up] >= P */ + if (j < i) { /* no elements out of place? */ + /* a[lo .. i - 1] <= P <= a[j + 1 .. i .. up] */ + lua_pop(L, 1); /* pop a[j] */ + /* swap pivot (a[up - 1]) with a[i] to satisfy pos-condition */ + set2(L, up - 1, i); + return i; + } + /* otherwise, swap a[i] - a[j] to restore invariant and repeat */ + set2(L, i, j); + } +} + + +/* +** Choose an element in the middle (2nd-3th quarters) of [lo,up] +** "randomized" by 'rnd' +*/ +static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) { + IdxT r4 = (up - lo) / 4; /* range/4 */ + IdxT p = rnd % (r4 * 2) + (lo + r4); + lua_assert(lo + r4 <= p && p <= up - r4); + return p; +} + + +/* +** QuickSort algorithm (recursive function) +*/ +static void auxsort (lua_State *L, IdxT lo, IdxT up, + unsigned int rnd) { + while (lo < up) { /* loop for tail recursion */ + IdxT p; /* Pivot index */ + IdxT n; /* to be used later */ + /* sort elements 'lo', 'p', and 'up' */ + lua_geti(L, 1, lo); + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */ + set2(L, lo, up); /* swap a[lo] - a[up] */ + else + lua_pop(L, 2); /* remove both values */ + if (up - lo == 1) /* only 2 elements? */ + return; /* already sorted */ + if (up - lo < RANLIMIT || rnd == 0) /* small interval or no randomize? */ + p = (lo + up)/2; /* middle element is a good pivot */ + else /* for larger intervals, it is worth a random pivot */ + p = choosePivot(lo, up, rnd); + lua_geti(L, 1, p); + lua_geti(L, 1, lo); + if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */ + set2(L, p, lo); /* swap a[p] - a[lo] */ + else { + lua_pop(L, 1); /* remove a[lo] */ + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */ + set2(L, p, up); /* swap a[up] - a[p] */ + else + lua_pop(L, 2); + } + if (up - lo == 2) /* only 3 elements? */ + return; /* already sorted */ + lua_geti(L, 1, p); /* get middle element (Pivot) */ + lua_pushvalue(L, -1); /* push Pivot */ + lua_geti(L, 1, up - 1); /* push a[up - 1] */ + set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */ + p = partition(L, lo, up); + /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */ + if (p - lo < up - p) { /* lower interval is smaller? */ + auxsort(L, lo, p - 1, rnd); /* call recursively for lower interval */ + n = p - lo; /* size of smaller interval */ + lo = p + 1; /* tail call for [p + 1 .. up] (upper interval) */ + } + else { + auxsort(L, p + 1, up, rnd); /* call recursively for upper interval */ + n = up - p; /* size of smaller interval */ + up = p - 1; /* tail call for [lo .. p - 1] (lower interval) */ + } + if ((up - lo) / 128 > n) /* partition too imbalanced? */ + rnd = l_randomizePivot(); /* try a new randomization */ + } /* tail call auxsort(L, lo, up, rnd) */ +} + + +static int sort (lua_State *L) { + lua_Integer n = aux_getn(L, 1, TAB_RW); + if (n > 1) { /* non-trivial interval? */ + luaL_argcheck(L, n < INT_MAX, 1, "array too big"); + if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */ + luaL_checktype(L, 2, LUA_TFUNCTION); /* must be a function */ + lua_settop(L, 2); /* make sure there are two arguments */ + auxsort(L, 1, (IdxT)n, 0); + } + return 0; +} + +/* }====================================================== */ + + +static const luaL_Reg tab_funcs[] = { + {"concat", tconcat}, +#if defined(LUA_COMPAT_MAXN) + {"maxn", maxn}, +#endif + {"insert", tinsert}, + {"pack", pack}, + {"unpack", unpack}, + {"remove", tremove}, + {"move", tmove}, + {"sort", sort}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_table (lua_State *L) { + luaL_newlib(L, tab_funcs); +#if defined(LUA_COMPAT_UNPACK) + /* _G.unpack = table.unpack */ + lua_getfield(L, -1, "unpack"); + lua_setglobal(L, "unpack"); +#endif + return 1; +} + diff --git a/lua-5.3.3/src/ltm.c b/lua-5.3.3/src/ltm.c new file mode 100644 index 0000000..4650cc2 --- /dev/null +++ b/lua-5.3.3/src/ltm.c @@ -0,0 +1,165 @@ +/* +** $Id: ltm.c,v 2.37 2016/02/26 19:20:15 roberto Exp $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#define ltm_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +static const char udatatypename[] = "userdata"; + +LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTAGS] = { + "no value", + "nil", "boolean", udatatypename, "number", + "string", "table", "function", udatatypename, "thread", + "proto" /* this last case is used for tests only */ +}; + + +void luaT_init (lua_State *L) { + static const char *const luaT_eventname[] = { /* ORDER TM */ + "__index", "__newindex", + "__gc", "__mode", "__len", "__eq", + "__add", "__sub", "__mul", "__mod", "__pow", + "__div", "__idiv", + "__band", "__bor", "__bxor", "__shl", "__shr", + "__unm", "__bnot", "__lt", "__le", + "__concat", "__call" + }; + int i; + for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); + luaC_fix(L, obj2gco(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_getshortstr(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[ttnov(o)]; + } + return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : luaO_nilobject); +} + + +/* +** Return the name of the type of an object. For tables and userdata +** with metatable, use their '__name' metafield, if present. +*/ +const char *luaT_objtypename (lua_State *L, const TValue *o) { + Table *mt; + if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) || + (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) { + const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name")); + if (ttisstring(name)) /* is '__name' a string? */ + return getstr(tsvalue(name)); /* use it as type name */ + } + return ttypename(ttnov(o)); /* else use standard type name */ +} + + +void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, TValue *p3, int hasres) { + ptrdiff_t result = savestack(L, p3); + StkId func = L->top; + setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ + setobj2s(L, func + 1, p1); /* 1st argument */ + setobj2s(L, func + 2, p2); /* 2nd argument */ + L->top += 3; + if (!hasres) /* no result? 'p3' is third argument */ + setobj2s(L, L->top++, p3); /* 3rd argument */ + /* metamethod may yield only when called from Lua code */ + if (isLua(L->ci)) + luaD_call(L, func, hasres); + else + luaD_callnoyield(L, func, hasres); + if (hasres) { /* if has result, move it to its place */ + p3 = restorestack(L, result); + setobjs2s(L, p3, --L->top); + } +} + + +int luaT_callbinTM (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; + luaT_callTM(L, tm, p1, p2, res, 1); + return 1; +} + + +void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + if (!luaT_callbinTM(L, p1, p2, res, event)) { + switch (event) { + case TM_CONCAT: + luaG_concaterror(L, p1, p2); + /* call never returns, but to avoid warnings: *//* FALLTHROUGH */ + case TM_BAND: case TM_BOR: case TM_BXOR: + case TM_SHL: case TM_SHR: case TM_BNOT: { + lua_Number dummy; + if (tonumber(p1, &dummy) && tonumber(p2, &dummy)) + luaG_tointerror(L, p1, p2); + else + luaG_opinterror(L, p1, p2, "perform bitwise operation on"); + } + /* calls never return, but to avoid warnings: *//* FALLTHROUGH */ + default: + luaG_opinterror(L, p1, p2, "perform arithmetic on"); + } + } +} + + +int luaT_callorderTM (lua_State *L, const TValue *p1, const TValue *p2, + TMS event) { + if (!luaT_callbinTM(L, p1, p2, L->top, event)) + return -1; /* no metamethod */ + else + return !l_isfalse(L->top); +} + diff --git a/lua-5.3.3/src/ltm.h b/lua-5.3.3/src/ltm.h new file mode 100644 index 0000000..63db726 --- /dev/null +++ b/lua-5.3.3/src/ltm.h @@ -0,0 +1,76 @@ +/* +** $Id: ltm.h,v 2.22 2016/02/26 19:20:15 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" and "ORDER OP" +*/ +typedef enum { + TM_INDEX, + TM_NEWINDEX, + TM_GC, + TM_MODE, + TM_LEN, + TM_EQ, /* last tag method with fast access */ + TM_ADD, + TM_SUB, + TM_MUL, + TM_MOD, + TM_POW, + TM_DIV, + TM_IDIV, + TM_BAND, + TM_BOR, + TM_BXOR, + TM_SHL, + TM_SHR, + TM_UNM, + TM_BNOT, + 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) + +#define ttypename(x) luaT_typenames_[(x) + 1] + +LUAI_DDEC const char *const luaT_typenames_[LUA_TOTALTAGS]; + + +LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o); + +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); + +LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, TValue *p3, int hasres); +LUAI_FUNC int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event); +LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event); +LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1, + const TValue *p2, TMS event); + + + +#endif diff --git a/lua-5.3.3/src/lua.c b/lua-5.3.3/src/lua.c new file mode 100644 index 0000000..545d23d --- /dev/null +++ b/lua-5.3.3/src/lua.c @@ -0,0 +1,609 @@ +/* +** $Id: lua.c,v 1.226 2015/08/14 19:11:20 roberto Exp $ +** Lua stand-alone interpreter +** See Copyright Notice in lua.h +*/ + +#define lua_c + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#if !defined(LUA_PROMPT) +#define LUA_PROMPT "> " +#define LUA_PROMPT2 ">> " +#endif + +#if !defined(LUA_PROGNAME) +#define LUA_PROGNAME "lua" +#endif + +#if !defined(LUA_MAXINPUT) +#define LUA_MAXINPUT 512 +#endif + +#if !defined(LUA_INIT_VAR) +#define LUA_INIT_VAR "LUA_INIT" +#endif + +#define LUA_INITVARVERSION \ + LUA_INIT_VAR "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR + + +/* +** lua_stdin_is_tty detects whether the standard input is a 'tty' (that +** is, whether we're running lua interactively). +*/ +#if !defined(lua_stdin_is_tty) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include +#define lua_stdin_is_tty() isatty(0) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#include +#define lua_stdin_is_tty() _isatty(_fileno(stdin)) + +#else /* }{ */ + +/* ISO C definition */ +#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ + +#endif /* } */ + +#endif /* } */ + + +/* +** lua_readline defines how to show a prompt and then read a line from +** the standard input. +** lua_saveline defines how to "save" a read line in a "history". +** lua_freeline defines how to free a line read by lua_readline. +*/ +#if !defined(lua_readline) /* { */ + +#if defined(LUA_USE_READLINE) /* { */ + +#include +#include +#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) +#define lua_saveline(L,line) ((void)L, add_history(line)) +#define lua_freeline(L,b) ((void)L, free(b)) + +#else /* }{ */ + +#define lua_readline(L,b,p) \ + ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ + fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ +#define lua_saveline(L,line) { (void)L; (void)line; } +#define lua_freeline(L,b) { (void)L; (void)b; } + +#endif /* } */ + +#endif /* } */ + + + + +static lua_State *globalL = NULL; + +static const char *progname = LUA_PROGNAME; + + +/* +** Hook set by signal function to stop the interpreter. +*/ +static void lstop (lua_State *L, lua_Debug *ar) { + (void)ar; /* unused arg. */ + lua_sethook(L, NULL, 0, 0); /* reset hook */ + luaL_error(L, "interrupted!"); +} + + +/* +** Function to be called at a C signal. Because a C signal cannot +** just change a Lua state (as there is no proper synchronization), +** this function only sets a hook that, when called, will stop the +** interpreter. +*/ +static void laction (int i) { + signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */ + lua_sethook(globalL, lstop, LUA_MASKCALL | LUA_MASKRET | LUA_MASKCOUNT, 1); +} + + +static void print_usage (const char *badoption) { + lua_writestringerror("%s: ", progname); + if (badoption[1] == 'e' || badoption[1] == 'l') + lua_writestringerror("'%s' needs argument\n", badoption); + else + lua_writestringerror("unrecognized option '%s'\n", badoption); + lua_writestringerror( + "usage: %s [options] [script [args]]\n" + "Available options are:\n" + " -e stat execute string 'stat'\n" + " -i enter interactive mode after executing 'script'\n" + " -l name require library 'name'\n" + " -v show version information\n" + " -E ignore environment variables\n" + " -- stop handling options\n" + " - stop handling options and execute stdin\n" + , + progname); +} + + +/* +** Prints an error message, adding the program name in front of it +** (if present) +*/ +static void l_message (const char *pname, const char *msg) { + if (pname) lua_writestringerror("%s: ", pname); + lua_writestringerror("%s\n", msg); +} + + +/* +** Check whether 'status' is not OK and, if so, prints the error +** message on the top of the stack. It assumes that the error object +** is a string, as it was either generated by Lua or by 'msghandler'. +*/ +static int report (lua_State *L, int status) { + if (status != LUA_OK) { + const char *msg = lua_tostring(L, -1); + l_message(progname, msg); + lua_pop(L, 1); /* remove message */ + } + return status; +} + + +/* +** Message handler used to run all chunks +*/ +static int msghandler (lua_State *L) { + const char *msg = lua_tostring(L, 1); + if (msg == NULL) { /* is error object not a string? */ + if (luaL_callmeta(L, 1, "__tostring") && /* does it have a metamethod */ + lua_type(L, -1) == LUA_TSTRING) /* that produces a string? */ + return 1; /* that is the message */ + else + msg = lua_pushfstring(L, "(error object is a %s value)", + luaL_typename(L, 1)); + } + luaL_traceback(L, L, msg, 1); /* append a standard traceback */ + return 1; /* return the traceback */ +} + + +/* +** Interface to 'lua_pcall', which sets appropriate message function +** and C-signal handler. Used to run all chunks. +*/ +static int docall (lua_State *L, int narg, int nres) { + int status; + int base = lua_gettop(L) - narg; /* function index */ + lua_pushcfunction(L, msghandler); /* push message handler */ + lua_insert(L, base); /* put it under function and args */ + globalL = L; /* to be available to 'laction' */ + signal(SIGINT, laction); /* set C-signal handler */ + status = lua_pcall(L, narg, nres, base); + signal(SIGINT, SIG_DFL); /* reset C-signal handler */ + lua_remove(L, base); /* remove message handler from the stack */ + return status; +} + + +static void print_version (void) { + lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT)); + lua_writeline(); +} + + +/* +** Create the 'arg' table, which stores all arguments from the +** command line ('argv'). It should be aligned so that, at index 0, +** it has 'argv[script]', which is the script name. The arguments +** to the script (everything after 'script') go to positive indices; +** other arguments (before the script name) go to negative indices. +** If there is no script name, assume interpreter's name as base. +*/ +static void createargtable (lua_State *L, char **argv, int argc, int script) { + int i, narg; + if (script == argc) script = 0; /* no script name? */ + narg = argc - (script + 1); /* number of positive indices */ + lua_createtable(L, narg, script + 1); + for (i = 0; i < argc; i++) { + lua_pushstring(L, argv[i]); + lua_rawseti(L, -2, i - script); + } + lua_setglobal(L, "arg"); +} + + +static int dochunk (lua_State *L, int status) { + if (status == LUA_OK) status = docall(L, 0, 0); + return report(L, status); +} + + +static int dofile (lua_State *L, const char *name) { + return dochunk(L, luaL_loadfile(L, name)); +} + + +static int dostring (lua_State *L, const char *s, const char *name) { + return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name)); +} + + +/* +** Calls 'require(name)' and stores the result in a global variable +** with the given name. +*/ +static int dolibrary (lua_State *L, const char *name) { + int status; + lua_getglobal(L, "require"); + lua_pushstring(L, name); + status = docall(L, 1, 1); /* call 'require(name)' */ + if (status == LUA_OK) + lua_setglobal(L, name); /* global[name] = require return */ + return report(L, status); +} + + +/* +** Returns the string to be used as a prompt by the interpreter. +*/ +static const char *get_prompt (lua_State *L, int firstline) { + const char *p; + lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2"); + p = lua_tostring(L, -1); + if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2); + return p; +} + +/* mark in error messages for incomplete statements */ +#define EOFMARK "" +#define marklen (sizeof(EOFMARK)/sizeof(char) - 1) + + +/* +** Check whether 'status' signals a syntax error and the error +** message at the top of the stack ends with the above mark for +** incomplete statements. +*/ +static int incomplete (lua_State *L, int status) { + if (status == LUA_ERRSYNTAX) { + size_t lmsg; + const char *msg = lua_tolstring(L, -1, &lmsg); + if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) { + lua_pop(L, 1); + return 1; + } + } + return 0; /* else... */ +} + + +/* +** Prompt the user, read a line, and push it into the Lua stack. +*/ +static int pushline (lua_State *L, int firstline) { + char buffer[LUA_MAXINPUT]; + char *b = buffer; + size_t l; + const char *prmt = get_prompt(L, firstline); + int readstatus = lua_readline(L, b, prmt); + if (readstatus == 0) + return 0; /* no input (prompt will be popped by caller) */ + lua_pop(L, 1); /* remove prompt */ + l = strlen(b); + if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ + b[--l] = '\0'; /* remove it */ + if (firstline && b[0] == '=') /* for compatibility with 5.2, ... */ + lua_pushfstring(L, "return %s", b + 1); /* change '=' to 'return' */ + else + lua_pushlstring(L, b, l); + lua_freeline(L, b); + return 1; +} + + +/* +** Try to compile line on the stack as 'return ;'; on return, stack +** has either compiled chunk or original line (if compilation failed). +*/ +static int addreturn (lua_State *L) { + const char *line = lua_tostring(L, -1); /* original line */ + const char *retline = lua_pushfstring(L, "return %s;", line); + int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin"); + if (status == LUA_OK) { + lua_remove(L, -2); /* remove modified line */ + if (line[0] != '\0') /* non empty? */ + lua_saveline(L, line); /* keep history */ + } + else + lua_pop(L, 2); /* pop result from 'luaL_loadbuffer' and modified line */ + return status; +} + + +/* +** Read multiple lines until a complete Lua statement +*/ +static int multiline (lua_State *L) { + for (;;) { /* repeat until gets a complete statement */ + size_t len; + const char *line = lua_tolstring(L, 1, &len); /* get what it has */ + int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */ + if (!incomplete(L, status) || !pushline(L, 0)) { + lua_saveline(L, line); /* keep history */ + return status; /* cannot or should not try to add continuation line */ + } + lua_pushliteral(L, "\n"); /* add newline... */ + lua_insert(L, -2); /* ...between the two lines */ + lua_concat(L, 3); /* join them */ + } +} + + +/* +** Read a line and try to load (compile) it first as an expression (by +** adding "return " in front of it) and second as a statement. Return +** the final status of load/call with the resulting function (if any) +** in the top of the stack. +*/ +static int loadline (lua_State *L) { + int status; + lua_settop(L, 0); + if (!pushline(L, 1)) + return -1; /* no input */ + if ((status = addreturn(L)) != LUA_OK) /* 'return ...' did not work? */ + status = multiline(L); /* try as command, maybe with continuation lines */ + lua_remove(L, 1); /* remove line from the stack */ + lua_assert(lua_gettop(L) == 1); + return status; +} + + +/* +** Prints (calling the Lua 'print' function) any values on the stack +*/ +static void l_print (lua_State *L) { + int n = lua_gettop(L); + if (n > 0) { /* any result to be printed? */ + luaL_checkstack(L, LUA_MINSTACK, "too many results to print"); + lua_getglobal(L, "print"); + lua_insert(L, 1); + if (lua_pcall(L, n, 0, 0) != LUA_OK) + l_message(progname, lua_pushfstring(L, "error calling 'print' (%s)", + lua_tostring(L, -1))); + } +} + + +/* +** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and +** print any results. +*/ +static void doREPL (lua_State *L) { + int status; + const char *oldprogname = progname; + progname = NULL; /* no 'progname' on errors in interactive mode */ + while ((status = loadline(L)) != -1) { + if (status == LUA_OK) + status = docall(L, 0, LUA_MULTRET); + if (status == LUA_OK) l_print(L); + else report(L, status); + } + lua_settop(L, 0); /* clear stack */ + lua_writeline(); + progname = oldprogname; +} + + +/* +** Push on the stack the contents of table 'arg' from 1 to #arg +*/ +static int pushargs (lua_State *L) { + int i, n; + if (lua_getglobal(L, "arg") != LUA_TTABLE) + luaL_error(L, "'arg' is not a table"); + n = (int)luaL_len(L, -1); + luaL_checkstack(L, n + 3, "too many arguments to script"); + for (i = 1; i <= n; i++) + lua_rawgeti(L, -i, i); + lua_remove(L, -i); /* remove table from the stack */ + return n; +} + + +static int handle_script (lua_State *L, char **argv) { + int status; + const char *fname = argv[0]; + if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0) + fname = NULL; /* stdin */ + status = luaL_loadfile(L, fname); + if (status == LUA_OK) { + int n = pushargs(L); /* push arguments to script */ + status = docall(L, n, LUA_MULTRET); + } + return report(L, status); +} + + + +/* bits of various argument indicators in 'args' */ +#define has_error 1 /* bad option */ +#define has_i 2 /* -i */ +#define has_v 4 /* -v */ +#define has_e 8 /* -e */ +#define has_E 16 /* -E */ + +/* +** Traverses all arguments from 'argv', returning a mask with those +** needed before running any Lua code (or an error code if it finds +** any invalid argument). 'first' returns the first not-handled argument +** (either the script name or a bad argument in case of error). +*/ +static int collectargs (char **argv, int *first) { + int args = 0; + int i; + for (i = 1; argv[i] != NULL; i++) { + *first = i; + if (argv[i][0] != '-') /* not an option? */ + return args; /* stop handling options */ + switch (argv[i][1]) { /* else check option */ + case '-': /* '--' */ + if (argv[i][2] != '\0') /* extra characters after '--'? */ + return has_error; /* invalid option */ + *first = i + 1; + return args; + case '\0': /* '-' */ + return args; /* script "name" is '-' */ + case 'E': + if (argv[i][2] != '\0') /* extra characters after 1st? */ + return has_error; /* invalid option */ + args |= has_E; + break; + case 'i': + args |= has_i; /* (-i implies -v) *//* FALLTHROUGH */ + case 'v': + if (argv[i][2] != '\0') /* extra characters after 1st? */ + return has_error; /* invalid option */ + args |= has_v; + break; + case 'e': + args |= has_e; /* FALLTHROUGH */ + case 'l': /* both options need an argument */ + if (argv[i][2] == '\0') { /* no concatenated argument? */ + i++; /* try next 'argv' */ + if (argv[i] == NULL || argv[i][0] == '-') + return has_error; /* no next argument or it is another option */ + } + break; + default: /* invalid option */ + return has_error; + } + } + *first = i; /* no script name */ + return args; +} + + +/* +** Processes options 'e' and 'l', which involve running Lua code. +** Returns 0 if some code raises an error. +*/ +static int runargs (lua_State *L, char **argv, int n) { + int i; + for (i = 1; i < n; i++) { + int option = argv[i][1]; + lua_assert(argv[i][0] == '-'); /* already checked */ + if (option == 'e' || option == 'l') { + int status; + const char *extra = argv[i] + 2; /* both options need an argument */ + if (*extra == '\0') extra = argv[++i]; + lua_assert(extra != NULL); + status = (option == 'e') + ? dostring(L, extra, "=(command line)") + : dolibrary(L, extra); + if (status != LUA_OK) return 0; + } + } + return 1; +} + + +static int handle_luainit (lua_State *L) { + const char *name = "=" LUA_INITVARVERSION; + const char *init = getenv(name + 1); + if (init == NULL) { + name = "=" LUA_INIT_VAR; + init = getenv(name + 1); /* try alternative name */ + } + if (init == NULL) return LUA_OK; + else if (init[0] == '@') + return dofile(L, init+1); + else + return dostring(L, init, name); +} + + +/* +** Main body of stand-alone interpreter (to be called in protected mode). +** Reads the options and handles them all. +*/ +static int pmain (lua_State *L) { + int argc = (int)lua_tointeger(L, 1); + char **argv = (char **)lua_touserdata(L, 2); + int script; + int args = collectargs(argv, &script); + luaL_checkversion(L); /* check that interpreter has correct version */ + if (argv[0] && argv[0][0]) progname = argv[0]; + if (args == has_error) { /* bad arg? */ + print_usage(argv[script]); /* 'script' has index of bad arg. */ + return 0; + } + if (args & has_v) /* option '-v'? */ + print_version(); + if (args & has_E) { /* option '-E'? */ + lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */ + lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + } + luaL_openlibs(L); /* open standard libraries */ + createargtable(L, argv, argc, script); /* create table 'arg' */ + if (!(args & has_E)) { /* no option '-E'? */ + if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ + return 0; /* error running LUA_INIT */ + } + if (!runargs(L, argv, script)) /* execute arguments -e and -l */ + return 0; /* something failed */ + if (script < argc && /* execute main script (if there is one) */ + handle_script(L, argv + script) != LUA_OK) + return 0; + if (args & has_i) /* -i option? */ + doREPL(L); /* do read-eval-print loop */ + else if (script == argc && !(args & (has_e | has_v))) { /* no arguments? */ + if (lua_stdin_is_tty()) { /* running in interactive mode? */ + print_version(); + doREPL(L); /* do read-eval-print loop */ + } + else dofile(L, NULL); /* executes stdin as a file */ + } + lua_pushboolean(L, 1); /* signal no errors */ + return 1; +} + + +int main (int argc, char **argv) { + int status, result; + lua_State *L = luaL_newstate(); /* create state */ + if (L == NULL) { + l_message(argv[0], "cannot create state: not enough memory"); + return EXIT_FAILURE; + } + lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */ + lua_pushinteger(L, argc); /* 1st argument */ + lua_pushlightuserdata(L, argv); /* 2nd argument */ + status = lua_pcall(L, 2, 1, 0); /* do the call */ + result = lua_toboolean(L, -1); /* get result */ + report(L, status); + lua_close(L); + return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; +} + diff --git a/lua-5.3.3/src/lua.h b/lua-5.3.3/src/lua.h new file mode 100644 index 0000000..f78899f --- /dev/null +++ b/lua-5.3.3/src/lua.h @@ -0,0 +1,486 @@ +/* +** $Id: lua.h,v 1.331 2016/05/30 15:53:28 roberto Exp $ +** Lua - A Scripting Language +** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + +#include +#include + + +#include "luaconf.h" + + +#define LUA_VERSION_MAJOR "5" +#define LUA_VERSION_MINOR "3" +#define LUA_VERSION_NUM 503 +#define LUA_VERSION_RELEASE "3" + +#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE +#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2016 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" + + +/* mark for precompiled code ('Lua') */ +#define LUA_SIGNATURE "\x1bLua" + +/* option for multiple returns in 'lua_pcall' and 'lua_call' */ +#define LUA_MULTRET (-1) + + +/* +** Pseudo-indices +** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty +** space after that to help overflow detection) +*/ +#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000) +#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) + + +/* thread status */ +#define LUA_OK 0 +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRGCMM 5 +#define LUA_ERRERR 6 + + +typedef struct lua_State lua_State; + + +/* +** basic types +*/ +#define LUA_TNONE (-1) + +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 + +#define LUA_NUMTAGS 9 + + + +/* minimum Lua stack available to a C function */ +#define LUA_MINSTACK 20 + + +/* predefined values in the registry */ +#define LUA_RIDX_MAINTHREAD 1 +#define LUA_RIDX_GLOBALS 2 +#define LUA_RIDX_LAST LUA_RIDX_GLOBALS + + +/* type of numbers in Lua */ +typedef LUA_NUMBER lua_Number; + + +/* type for integer functions */ +typedef LUA_INTEGER lua_Integer; + +/* unsigned integer type */ +typedef LUA_UNSIGNED lua_Unsigned; + +/* type for continuation-function contexts */ +typedef LUA_KCONTEXT lua_KContext; + + +/* +** Type for C functions registered with Lua +*/ +typedef int (*lua_CFunction) (lua_State *L); + +/* +** Type for continuation functions +*/ +typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx); + + +/* +** Type for functions that read/write blocks when loading/dumping Lua chunks +*/ +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); + +typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud); + + +/* +** Type for memory-allocation functions +*/ +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); + + + +/* +** generic extra include file +*/ +#if defined(LUA_USER_H) +#include LUA_USER_H +#endif + + +/* +** RCS ident string +*/ +extern const char lua_ident[]; + + +/* +** state manipulation +*/ +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +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); + + +LUA_API const lua_Number *(lua_version) (lua_State *L); + + +/* +** basic stack manipulation +*/ +LUA_API int (lua_absindex) (lua_State *L, int idx); +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_rotate) (lua_State *L, int idx, int n); +LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx); +LUA_API int (lua_checkstack) (lua_State *L, int n); + +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); + + +/* +** 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_isinteger) (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 lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum); +LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum); +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_rawlen) (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); + + +/* +** Comparison and arithmetic functions +*/ + +#define LUA_OPADD 0 /* ORDER TM, ORDER OP */ +#define LUA_OPSUB 1 +#define LUA_OPMUL 2 +#define LUA_OPMOD 3 +#define LUA_OPPOW 4 +#define LUA_OPDIV 5 +#define LUA_OPIDIV 6 +#define LUA_OPBAND 7 +#define LUA_OPBOR 8 +#define LUA_OPBXOR 9 +#define LUA_OPSHL 10 +#define LUA_OPSHR 11 +#define LUA_OPUNM 12 +#define LUA_OPBNOT 13 + +LUA_API void (lua_arith) (lua_State *L, int op); + +#define LUA_OPEQ 0 +#define LUA_OPLT 1 +#define LUA_OPLE 2 + +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op); + + +/* +** 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 const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len); +LUA_API const char *(lua_pushstring) (lua_State *L, const char *s); +LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, + va_list argp); +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); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API int (lua_getglobal) (lua_State *L, const char *name); +LUA_API int (lua_gettable) (lua_State *L, int idx); +LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawget) (lua_State *L, int idx); +LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); + +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 int (lua_getuservalue) (lua_State *L, int idx); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void (lua_setglobal) (lua_State *L, const char *name); +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_seti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API void (lua_setuservalue) (lua_State *L, int idx); + + +/* +** 'load' and 'call' functions (load and run Lua code) +*/ +LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k); +#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL) + +LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k); +#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL) + +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname, const char *mode); + +LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip); + + +/* +** coroutine functions +*/ +LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k); +LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg); +LUA_API int (lua_status) (lua_State *L); +LUA_API int (lua_isyieldable) (lua_State *L); + +#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) + + +/* +** garbage-collection function and options +*/ + +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 +#define LUA_GCISRUNNING 9 + +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_next) (lua_State *L, int idx); + +LUA_API void (lua_concat) (lua_State *L, int n); +LUA_API void (lua_len) (lua_State *L, int idx); + +LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); + +LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); +LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); + + + +/* +** {============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE)) + +#define lua_tonumber(L,i) lua_tonumberx(L,(i),NULL) +#define lua_tointeger(L,i) lua_tointegerx(L,(i),NULL) + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_newtable(L) lua_createtable(L, 0, 0) + +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) + +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) + +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) + +#define lua_pushliteral(L, s) lua_pushstring(L, "" s) + +#define lua_pushglobaltable(L) \ + ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)) + +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) + + +#define lua_insert(L,idx) lua_rotate(L, (idx), 1) + +#define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1)) + +#define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1)) + +/* }============================================================== */ + + +/* +** {============================================================== +** compatibility macros for unsigned conversions +** =============================================================== +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define lua_pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n)) +#define lua_tounsignedx(L,i,is) ((lua_Unsigned)lua_tointegerx(L,i,is)) +#define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL) + +#endif +/* }============================================================== */ + +/* +** {====================================================================== +** Debug API +** ======================================================================= +*/ + + +/* +** Event codes +*/ +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILCALL 4 + + +/* +** Event masks +*/ +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + +typedef struct lua_Debug lua_Debug; /* activation record */ + + +/* Functions to be called by the debugger in specific events */ +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar); +LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n); +LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n); + +LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n); +LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1, + int fidx2, int n2); + +LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); +LUA_API lua_Hook (lua_gethook) (lua_State *L); +LUA_API int (lua_gethookmask) (lua_State *L); +LUA_API int (lua_gethookcount) (lua_State *L); + + +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 linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + unsigned char nups; /* (u) number of upvalues */ + unsigned char nparams;/* (u) number of parameters */ + char isvararg; /* (u) */ + char istailcall; /* (t) */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + struct CallInfo *i_ci; /* active function */ +}; + +/* }====================================================================== */ + + +/****************************************************************************** +* Copyright (C) 1994-2016 Lua.org, PUC-Rio. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************************/ + + +#endif diff --git a/lua-5.3.3/src/lua.hpp b/lua-5.3.3/src/lua.hpp new file mode 100644 index 0000000..ec417f5 --- /dev/null +++ b/lua-5.3.3/src/lua.hpp @@ -0,0 +1,9 @@ +// lua.hpp +// Lua header files for C++ +// <> not supplied automatically because Lua also compiles as C++ + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} diff --git a/lua-5.3.3/src/luac.c b/lua-5.3.3/src/luac.c new file mode 100644 index 0000000..c0c91d0 --- /dev/null +++ b/lua-5.3.3/src/luac.c @@ -0,0 +1,449 @@ +/* +** $Id: luac.c,v 1.75 2015/03/12 01:58:27 lhf Exp $ +** Lua compiler (saves bytecodes to files; also lists bytecodes) +** See Copyright Notice in lua.h +*/ + +#define luac_c +#define LUA_CORE + +#include "lprefix.h" + +#include +#include +#include +#include +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "lobject.h" +#include "lstate.h" +#include "lundump.h" + +static void PrintFunction(const Proto* f, int full); +#define luaU_print PrintFunction + +#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 '%s'\n",progname,message); + else + fprintf(stderr,"%s: %s\n",progname,message); + fprintf(stderr, + "usage: %s [options] [filenames]\n" + "Available options are:\n" + " -l list (use -l -l for full listing)\n" + " -o name output to file 'name' (default is \"%s\")\n" + " -p parse only\n" + " -s strip debug information\n" + " -v show version information\n" + " -- stop handling options\n" + " - stop handling options and process stdin\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)) + +static const Proto* combine(lua_State* L, int n) +{ + if (n==1) + return toproto(L,-1); + else + { + Proto* f; + int i=n; + if (lua_load(L,reader,&i,"=(" PROGNAME ")",NULL)!=LUA_OK) fatal(lua_tostring(L,-1)); + f=toproto(L,-1); + for (i=0; ip[i]=toproto(L,i-n-1); + if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0; + } + f->sizelineinfo=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); +} + +static int pmain(lua_State* L) +{ + int argc=(int)lua_tointeger(L,1); + char** argv=(char**)lua_touserdata(L,2); + 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; + int i=doargs(argc,argv); + argc-=i; argv+=i; + if (argc<=0) usage("no input files given"); + L=luaL_newstate(); + if (L==NULL) fatal("cannot create state: not enough memory"); + lua_pushcfunction(L,&pmain); + lua_pushinteger(L,argc); + lua_pushlightuserdata(L,argv); + if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1)); + lua_close(L); + return EXIT_SUCCESS; +} + +/* +** $Id: luac.c,v 1.75 2015/03/12 01:58:27 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" + +#define VOID(p) ((const void*)(p)) + +static void PrintString(const TString* ts) +{ + const char* s=getstr(ts); + size_t i,n=tsslen(ts); + printf("%c",'"'); + 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_TNUMFLT: + { + char buff[100]; + sprintf(buff,LUA_NUMBER_FMT,fltvalue(o)); + printf("%s",buff); + if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0"); + break; + } + case LUA_TNUMINT: + printf(LUA_INTEGER_FMT,ivalue(o)); + break; + case LUA_TSHRSTR: case LUA_TLNGSTR: + PrintString(tsvalue(o)); + break; + default: /* cannot happen */ + printf("? type=%d",ttype(o)); + break; + } +} + +#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : "-") +#define MYK(x) (-1-(x)) + +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) ? (MYK(INDEXK(b))) : b); + if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (MYK(INDEXK(c))) : c); + break; + case iABx: + printf("%d",a); + if (getBMode(o)==OpArgK) printf(" %d",MYK(bx)); + if (getBMode(o)==OpArgU) printf(" %d",bx); + break; + case iAsBx: + printf("%d %d",a,sbx); + break; + case iAx: + printf("%d",MYK(ax)); + break; + } + switch (o) + { + case OP_LOADK: + printf("\t; "); PrintConstant(f,bx); + break; + case OP_GETUPVAL: + case OP_SETUPVAL: + printf("\t; %s",UPVALNAME(b)); + break; + case OP_GETTABUP: + printf("\t; %s",UPVALNAME(b)); + if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); } + break; + case OP_SETTABUP: + printf("\t; %s",UPVALNAME(a)); + if (ISK(b)) { printf(" "); PrintConstant(f,INDEXK(b)); } + if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); } + 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_POW: + case OP_DIV: + case OP_IDIV: + case OP_BAND: + case OP_BOR: + case OP_BXOR: + case OP_SHL: + case OP_SHR: + 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: + case OP_TFORLOOP: + 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; + case OP_EXTRAARG: + printf("\t; "); PrintConstant(f,ax); + break; + default: + break; + } + printf("\n"); + } +} + +#define SS(x) ((x==1)?"":"s") +#define S(x) (int)(x),SS(x) + +static void PrintHeader(const Proto* f) +{ + const char* s=f->source ? 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 at %p)\n", + (f->linedefined==0)?"main":"function",s, + f->linedefined,f->lastlinedefined, + S(f->sizecode),VOID(f)); + printf("%d%s param%s, %d slot%s, %d upvalue%s, ", + (int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams), + S(f->maxstacksize),S(f->sizeupvalues)); + printf("%d local%s, %d constant%s, %d function%s\n", + S(f->sizelocvars),S(f->sizek),S(f->sizep)); +} + +static void PrintDebug(const Proto* f) +{ + int i,n; + 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); + } + n=f->sizeupvalues; + printf("upvalues (%d) for %p:\n",n,VOID(f)); + for (i=0; iupvalues[i].instack,f->upvalues[i].idx); + } +} + +static void PrintFunction(const Proto* f, int full) +{ + int i,n=f->sizep; + PrintHeader(f); + PrintCode(f); + if (full) PrintDebug(f); + for (i=0; ip[i],full); +} diff --git a/lua-5.3.3/src/luaconf.h b/lua-5.3.3/src/luaconf.h new file mode 100644 index 0000000..fd447cc --- /dev/null +++ b/lua-5.3.3/src/luaconf.h @@ -0,0 +1,767 @@ +/* +** $Id: luaconf.h,v 1.255 2016/05/01 20:06:09 roberto Exp $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ + + +#ifndef luaconf_h +#define luaconf_h + +#include +#include + + +/* +** =================================================================== +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +** {==================================================================== +** System Configuration: macros to adapt (if needed) Lua to some +** particular platform, for instance compiling it with 32-bit numbers or +** restricting it to C89. +** ===================================================================== +*/ + +/* +@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. You +** can also define LUA_32BITS in the make file, but changing here you +** ensure that all software connected to Lua will be compiled with the +** same configuration. +*/ +/* #define LUA_32BITS */ + + +/* +@@ LUA_USE_C89 controls the use of non-ISO-C89 features. +** Define it if you want Lua to avoid the use of a few C99 features +** or Windows-specific features on Windows. +*/ +/* #define LUA_USE_C89 */ + + +/* +** By default, Lua on Windows use (some) specific Windows features +*/ +#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE) +#define LUA_USE_WINDOWS /* enable goodies for regular Windows */ +#endif + + +#if defined(LUA_USE_WINDOWS) +#define LUA_DL_DLL /* enable support for DLL */ +#define LUA_USE_C89 /* broadly, Windows is C89 */ +#endif + + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#define LUA_USE_READLINE /* needs some extra libraries */ +#endif + + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#define LUA_USE_READLINE /* needs an extra library: -lreadline */ +#endif + + +/* +@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for +** C89 ('long' and 'double'); Windows always has '__int64', so it does +** not need to use this case. +*/ +#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS) +#define LUA_C89_NUMBERS +#endif + + + +/* +@@ LUAI_BITSINT defines the (minimum) number of bits in an 'int'. +*/ +/* avoid undefined shifts */ +#if ((INT_MAX >> 15) >> 15) >= 1 +#define LUAI_BITSINT 32 +#else +/* 'int' always must have at least 16 bits */ +#define LUAI_BITSINT 16 +#endif + + +/* +@@ LUA_INT_TYPE defines the type for Lua integers. +@@ LUA_FLOAT_TYPE defines the type for Lua floats. +** Lua should work fine with any mix of these options (if supported +** by your C compiler). The usual configurations are 64-bit integers +** and 'double' (the default), 32-bit integers and 'float' (for +** restricted platforms), and 'long'/'double' (for C compilers not +** compliant with C99, which may not have support for 'long long'). +*/ + +/* predefined options for LUA_INT_TYPE */ +#define LUA_INT_INT 1 +#define LUA_INT_LONG 2 +#define LUA_INT_LONGLONG 3 + +/* predefined options for LUA_FLOAT_TYPE */ +#define LUA_FLOAT_FLOAT 1 +#define LUA_FLOAT_DOUBLE 2 +#define LUA_FLOAT_LONGDOUBLE 3 + +#if defined(LUA_32BITS) /* { */ +/* +** 32-bit integers and 'float' +*/ +#if LUAI_BITSINT >= 32 /* use 'int' if big enough */ +#define LUA_INT_TYPE LUA_INT_INT +#else /* otherwise use 'long' */ +#define LUA_INT_TYPE LUA_INT_LONG +#endif +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT + +#elif defined(LUA_C89_NUMBERS) /* }{ */ +/* +** largest types available for C89 ('long' and 'double') +*/ +#define LUA_INT_TYPE LUA_INT_LONG +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE + +#endif /* } */ + + +/* +** default configuration for 64-bit Lua ('long long' and 'double') +*/ +#if !defined(LUA_INT_TYPE) +#define LUA_INT_TYPE LUA_INT_LONGLONG +#endif + +#if !defined(LUA_FLOAT_TYPE) +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE +#endif + +/* }================================================================== */ + + + + +/* +** {================================================================== +** Configuration for Paths. +** =================================================================== +*/ + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +** Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +** C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ +#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#if defined(_WIN32) /* { */ +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\" +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \ + LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \ + ".\\?.lua;" ".\\?\\init.lua" +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.dll;" \ + LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ + LUA_CDIR"loadall.dll;" ".\\?.dll" + +#else /* }{ */ + +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua;" "./?/init.lua" +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" +#endif /* } */ + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Marks for exported symbols in the C code +** =================================================================== +*/ + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all auxiliary library functions. +@@ LUAMOD_API is a mark for all standard library opening functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) /* { */ + +#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#define LUA_API __declspec(dllexport) +#else /* }{ */ +#define LUA_API __declspec(dllimport) +#endif /* } */ + +#else /* }{ */ + +#define LUA_API extern + +#endif /* } */ + + +/* more often than not the libs go together with the core */ +#define LUALIB_API LUA_API +#define LUAMOD_API LUALIB_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +** exported to outside modules. +@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables +** that are not to be exported to outside modules (LUAI_DDEF for +** definitions and LUAI_DDEC for declarations). +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. Not all elf targets support +** this attribute. Unfortunately, gcc does not offer a way to check +** whether the target offers that support, and those without support +** give a warning about it. To avoid these warnings, change to the +** default definition. +*/ +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) /* { */ +#define LUAI_FUNC __attribute__((visibility("hidden"))) extern +#else /* }{ */ +#define LUAI_FUNC extern +#endif /* } */ + +#define LUAI_DDEC LUAI_FUNC +#define LUAI_DDEF /* empty */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Compatibility with previous versions +** =================================================================== +*/ + +/* +@@ LUA_COMPAT_5_2 controls other macros for compatibility with Lua 5.2. +@@ LUA_COMPAT_5_1 controls other macros for compatibility with Lua 5.1. +** You can define it to get all options, or change specific options +** to fit your specific needs. +*/ +#if defined(LUA_COMPAT_5_2) /* { */ + +/* +@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated +** functions in the mathematical library. +*/ +#define LUA_COMPAT_MATHLIB + +/* +@@ LUA_COMPAT_BITLIB controls the presence of library 'bit32'. +*/ +#define LUA_COMPAT_BITLIB + +/* +@@ LUA_COMPAT_IPAIRS controls the effectiveness of the __ipairs metamethod. +*/ +#define LUA_COMPAT_IPAIRS + +/* +@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for +** manipulating other integer types (lua_pushunsigned, lua_tounsigned, +** luaL_checkint, luaL_checklong, etc.) +*/ +#define LUA_COMPAT_APIINTCASTS + +#endif /* } */ + + +#if defined(LUA_COMPAT_5_1) /* { */ + +/* Incompatibilities from 5.2 -> 5.3 */ +#define LUA_COMPAT_MATHLIB +#define LUA_COMPAT_APIINTCASTS + +/* +@@ LUA_COMPAT_UNPACK controls the presence of global 'unpack'. +** You can replace it with 'table.unpack'. +*/ +#define LUA_COMPAT_UNPACK + +/* +@@ LUA_COMPAT_LOADERS controls the presence of table 'package.loaders'. +** You can replace it with 'package.searchers'. +*/ +#define LUA_COMPAT_LOADERS + +/* +@@ macro 'lua_cpcall' emulates deprecated function lua_cpcall. +** You can call your C function directly (with light C functions). +*/ +#define lua_cpcall(L,f,u) \ + (lua_pushcfunction(L, (f)), \ + lua_pushlightuserdata(L,(u)), \ + lua_pcall(L,1,0,0)) + + +/* +@@ LUA_COMPAT_LOG10 defines the function 'log10' in the math library. +** You can rewrite 'log10(x)' as 'log(x, 10)'. +*/ +#define LUA_COMPAT_LOG10 + +/* +@@ LUA_COMPAT_LOADSTRING defines the function 'loadstring' in the base +** library. You can rewrite 'loadstring(s)' as 'load(s)'. +*/ +#define LUA_COMPAT_LOADSTRING + +/* +@@ LUA_COMPAT_MAXN defines the function 'maxn' in the table library. +*/ +#define LUA_COMPAT_MAXN + +/* +@@ The following macros supply trivial compatibility for some +** changes in the API. The macros themselves document how to +** change your code to avoid using them. +*/ +#define lua_strlen(L,i) lua_rawlen(L, (i)) + +#define lua_objlen(L,i) lua_rawlen(L, (i)) + +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) +#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) + +/* +@@ LUA_COMPAT_MODULE controls compatibility with previous +** module functions 'module' (Lua) and 'luaL_register' (C). +*/ +#define LUA_COMPAT_MODULE + +#endif /* } */ + + +/* +@@ LUA_COMPAT_FLOATSTRING makes Lua format integral floats without a +@@ a float mark ('.0'). +** This macro is not on by default even in compatibility mode, +** because this is not really an incompatibility. +*/ +/* #define LUA_COMPAT_FLOATSTRING */ + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Numbers. +** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_* +** satisfy your needs. +** =================================================================== +*/ + +/* +@@ LUA_NUMBER is the floating-point type used by Lua. +@@ LUAI_UACNUMBER is the result of an 'usual argument conversion' +@@ over a floating number. +@@ l_mathlim(x) corrects limit name 'x' to the proper float type +** by prefixing it with one of FLT/DBL/LDBL. +@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. +@@ LUA_NUMBER_FMT is the format for writing floats. +@@ lua_number2str converts a float to a string. +@@ l_mathop allows the addition of an 'l' or 'f' to all math operations. +@@ l_floor takes the floor of a float. +@@ lua_str2number converts a decimal numeric string to a number. +*/ + + +/* The following definitions are good for most cases here */ + +#define l_floor(x) (l_mathop(floor)(x)) + +#define lua_number2str(s,sz,n) l_sprintf((s), sz, LUA_NUMBER_FMT, (n)) + +/* +@@ lua_numbertointeger converts a float number to an integer, or +** returns 0 if float is not within the range of a lua_Integer. +** (The range comparisons are tricky because of rounding. The tests +** here assume a two-complement representation, where MININTEGER always +** has an exact representation as a float; MAXINTEGER may not have one, +** and therefore its conversion to float may have an ill-defined value.) +*/ +#define lua_numbertointeger(n,p) \ + ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ + (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ + (*(p) = (LUA_INTEGER)(n), 1)) + + +/* now the variable definitions */ + +#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */ + +#define LUA_NUMBER float + +#define l_mathlim(n) (FLT_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.7g" + +#define l_mathop(op) op##f + +#define lua_str2number(s,p) strtof((s), (p)) + + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */ + +#define LUA_NUMBER long double + +#define l_mathlim(n) (LDBL_##n) + +#define LUAI_UACNUMBER long double + +#define LUA_NUMBER_FRMLEN "L" +#define LUA_NUMBER_FMT "%.19Lg" + +#define l_mathop(op) op##l + +#define lua_str2number(s,p) strtold((s), (p)) + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */ + +#define LUA_NUMBER double + +#define l_mathlim(n) (DBL_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.14g" + +#define l_mathop(op) op + +#define lua_str2number(s,p) strtod((s), (p)) + +#else /* }{ */ + +#error "numeric float type not defined" + +#endif /* } */ + + + +/* +@@ LUA_INTEGER is the integer type used by Lua. +** +@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER. +** +@@ LUAI_UACINT is the result of an 'usual argument conversion' +@@ over a lUA_INTEGER. +@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers. +@@ LUA_INTEGER_FMT is the format for writing integers. +@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER. +@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER. +@@ lua_integer2str converts an integer to a string. +*/ + + +/* The following definitions are good for most cases here */ + +#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" +#define lua_integer2str(s,sz,n) l_sprintf((s), sz, LUA_INTEGER_FMT, (n)) + +#define LUAI_UACINT LUA_INTEGER + +/* +** use LUAI_UACINT here to avoid problems with promotions (which +** can turn a comparison between unsigneds into a signed comparison) +*/ +#define LUA_UNSIGNED unsigned LUAI_UACINT + + +/* now the variable definitions */ + +#if LUA_INT_TYPE == LUA_INT_INT /* { int */ + +#define LUA_INTEGER int +#define LUA_INTEGER_FRMLEN "" + +#define LUA_MAXINTEGER INT_MAX +#define LUA_MININTEGER INT_MIN + +#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */ + +#define LUA_INTEGER long +#define LUA_INTEGER_FRMLEN "l" + +#define LUA_MAXINTEGER LONG_MAX +#define LUA_MININTEGER LONG_MIN + +#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */ + +/* use presence of macro LLONG_MAX as proxy for C99 compliance */ +#if defined(LLONG_MAX) /* { */ +/* use ISO C99 stuff */ + +#define LUA_INTEGER long long +#define LUA_INTEGER_FRMLEN "ll" + +#define LUA_MAXINTEGER LLONG_MAX +#define LUA_MININTEGER LLONG_MIN + +#elif defined(LUA_USE_WINDOWS) /* }{ */ +/* in Windows, can use specific Windows types */ + +#define LUA_INTEGER __int64 +#define LUA_INTEGER_FRMLEN "I64" + +#define LUA_MAXINTEGER _I64_MAX +#define LUA_MININTEGER _I64_MIN + +#else /* }{ */ + +#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \ + or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" + +#endif /* } */ + +#else /* }{ */ + +#error "numeric integer type not defined" + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Dependencies with C99 and other C details +** =================================================================== +*/ + +/* +@@ l_sprintf is equivalent to 'snprintf' or 'sprintf' in C89. +** (All uses in Lua have only one format item.) +*/ +#if !defined(LUA_USE_C89) +#define l_sprintf(s,sz,f,i) snprintf(s,sz,f,i) +#else +#define l_sprintf(s,sz,f,i) ((void)(sz), sprintf(s,f,i)) +#endif + + +/* +@@ lua_strx2number converts an hexadecimal numeric string to a number. +** In C99, 'strtod' does that conversion. Otherwise, you can +** leave 'lua_strx2number' undefined and Lua will provide its own +** implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_strx2number(s,p) lua_str2number(s,p) +#endif + + +/* +@@ lua_number2strx converts a float to an hexadecimal numeric string. +** In C99, 'sprintf' (with format specifiers '%a'/'%A') does that. +** Otherwise, you can leave 'lua_number2strx' undefined and Lua will +** provide its own implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_number2strx(L,b,sz,f,n) ((void)L, l_sprintf(b,sz,f,n)) +#endif + + +/* +** 'strtof' and 'opf' variants for math functions are not valid in +** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the +** availability of these variants. ('math.h' is already included in +** all files that use these macros.) +*/ +#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF)) +#undef l_mathop /* variants not available */ +#undef lua_str2number +#define l_mathop(op) (lua_Number)op /* no variant */ +#define lua_str2number(s,p) ((lua_Number)strtod((s), (p))) +#endif + + +/* +@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation +** functions. It must be a numerical type; Lua will use 'intptr_t' if +** available, otherwise it will use 'ptrdiff_t' (the nearest thing to +** 'intptr_t' in C89) +*/ +#define LUA_KCONTEXT ptrdiff_t + +#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \ + __STDC_VERSION__ >= 199901L +#include +#if defined(INTPTR_MAX) /* even in C99 this type is optional */ +#undef LUA_KCONTEXT +#define LUA_KCONTEXT intptr_t +#endif +#endif + + +/* +@@ lua_getlocaledecpoint gets the locale "radix character" (decimal point). +** Change that if you do not want to use C locales. (Code using this +** macro must include header 'locale.h'.) +*/ +#if !defined(lua_getlocaledecpoint) +#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Language Variations +** ===================================================================== +*/ + +/* +@@ LUA_NOCVTN2S/LUA_NOCVTS2N control how Lua performs some +** coercions. Define LUA_NOCVTN2S to turn off automatic coercion from +** numbers to strings. Define LUA_NOCVTS2N to turn off automatic +** coercion from strings to numbers. +*/ +/* #define LUA_NOCVTN2S */ +/* #define LUA_NOCVTS2N */ + + +/* +@@ LUA_USE_APICHECK turns on several consistency checks on the C API. +** Define it as a help when debugging C code. +*/ +#if defined(LUA_USE_APICHECK) +#include +#define luai_apicheck(l,e) assert(e) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Macros that affect the API and must be stable (that is, must be the +** same when you compile Lua and when you compile code that links to +** Lua). You probably do not want/need to change them. +** ===================================================================== +*/ + +/* +@@ LUAI_MAXSTACK limits the size of the Lua stack. +** CHANGE it if you need a different limit. This limit is arbitrary; +** its only purpose is to stop Lua from consuming unlimited stack +** space (and to reserve some numbers for pseudo-indices). +*/ +#if LUAI_BITSINT >= 32 +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK 15000 +#endif + + +/* +@@ LUA_EXTRASPACE defines the size of a raw memory area associated with +** a Lua state with very fast access. +** CHANGE it if you need a different size. +*/ +#define LUA_EXTRASPACE (sizeof(void *)) + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +@@ of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. +** CHANGE it if it uses too much C-stack space. (For long double, +** 'string.format("%.99f", 1e4932)' needs ~5030 bytes, so a +** smaller buffer would force a memory allocation for each call to +** 'string.format'.) +*/ +#if defined(LUA_FLOAT_LONGDOUBLE) +#define LUAL_BUFFERSIZE 8192 +#else +#define LUAL_BUFFERSIZE ((int)(0x80 * sizeof(void*) * sizeof(lua_Integer))) +#endif + +/* }================================================================== */ + + +/* +@@ LUA_QL describes how error messages quote program elements. +** Lua does not use these macros anymore; they are here for +** compatibility only. +*/ +#define LUA_QL(x) "'" x "'" +#define LUA_QS LUA_QL("%s") + + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + + + +#endif + diff --git a/lua-5.3.3/src/lualib.h b/lua-5.3.3/src/lualib.h new file mode 100644 index 0000000..5165c0f --- /dev/null +++ b/lua-5.3.3/src/lualib.h @@ -0,0 +1,58 @@ +/* +** $Id: lualib.h,v 1.44 2014/02/06 17:32:33 roberto Exp $ +** Lua standard libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lualib_h +#define lualib_h + +#include "lua.h" + + + +LUAMOD_API int (luaopen_base) (lua_State *L); + +#define LUA_COLIBNAME "coroutine" +LUAMOD_API int (luaopen_coroutine) (lua_State *L); + +#define LUA_TABLIBNAME "table" +LUAMOD_API int (luaopen_table) (lua_State *L); + +#define LUA_IOLIBNAME "io" +LUAMOD_API int (luaopen_io) (lua_State *L); + +#define LUA_OSLIBNAME "os" +LUAMOD_API int (luaopen_os) (lua_State *L); + +#define LUA_STRLIBNAME "string" +LUAMOD_API int (luaopen_string) (lua_State *L); + +#define LUA_UTF8LIBNAME "utf8" +LUAMOD_API int (luaopen_utf8) (lua_State *L); + +#define LUA_BITLIBNAME "bit32" +LUAMOD_API int (luaopen_bit32) (lua_State *L); + +#define LUA_MATHLIBNAME "math" +LUAMOD_API int (luaopen_math) (lua_State *L); + +#define LUA_DBLIBNAME "debug" +LUAMOD_API int (luaopen_debug) (lua_State *L); + +#define LUA_LOADLIBNAME "package" +LUAMOD_API int (luaopen_package) (lua_State *L); + + +/* open all previous libraries */ +LUALIB_API void (luaL_openlibs) (lua_State *L); + + + +#if !defined(lua_assert) +#define lua_assert(x) ((void)0) +#endif + + +#endif diff --git a/lua-5.3.3/src/lundump.c b/lua-5.3.3/src/lundump.c new file mode 100644 index 0000000..4080af9 --- /dev/null +++ b/lua-5.3.3/src/lundump.c @@ -0,0 +1,279 @@ +/* +** $Id: lundump.c,v 2.44 2015/11/02 16:09:30 roberto Exp $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define lundump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstring.h" +#include "lundump.h" +#include "lzio.h" + + +#if !defined(luai_verifycode) +#define luai_verifycode(L,b,f) /* empty */ +#endif + + +typedef struct { + lua_State *L; + ZIO *Z; + const char *name; +} LoadState; + + +static l_noret error(LoadState *S, const char *why) { + luaO_pushfstring(S->L, "%s: %s precompiled chunk", S->name, why); + luaD_throw(S->L, LUA_ERRSYNTAX); +} + + +/* +** All high-level loads go through LoadVector; you can change it to +** adapt to the endianness of the input +*/ +#define LoadVector(S,b,n) LoadBlock(S,b,(n)*sizeof((b)[0])) + +static void LoadBlock (LoadState *S, void *b, size_t size) { + if (luaZ_read(S->Z, b, size) != 0) + error(S, "truncated"); +} + + +#define LoadVar(S,x) LoadVector(S,&x,1) + + +static lu_byte LoadByte (LoadState *S) { + lu_byte x; + LoadVar(S, x); + return x; +} + + +static int LoadInt (LoadState *S) { + int x; + LoadVar(S, x); + return x; +} + + +static lua_Number LoadNumber (LoadState *S) { + lua_Number x; + LoadVar(S, x); + return x; +} + + +static lua_Integer LoadInteger (LoadState *S) { + lua_Integer x; + LoadVar(S, x); + return x; +} + + +static TString *LoadString (LoadState *S) { + size_t size = LoadByte(S); + if (size == 0xFF) + LoadVar(S, size); + if (size == 0) + return NULL; + else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ + char buff[LUAI_MAXSHORTLEN]; + LoadVector(S, buff, size); + return luaS_newlstr(S->L, buff, size); + } + else { /* long string */ + TString *ts = luaS_createlngstrobj(S->L, size); + LoadVector(S, getstr(ts), size); /* load directly in final place */ + return ts; + } +} + + +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); +} + + +static void LoadFunction(LoadState *S, Proto *f, TString *psource); + + +static void LoadConstants (LoadState *S, Proto *f) { + int i; + int n = LoadInt(S); + f->k = luaM_newvector(S->L, n, TValue); + f->sizek = n; + for (i = 0; i < n; i++) + setnilvalue(&f->k[i]); + for (i = 0; i < n; i++) { + TValue *o = &f->k[i]; + int t = LoadByte(S); + switch (t) { + case LUA_TNIL: + setnilvalue(o); + break; + case LUA_TBOOLEAN: + setbvalue(o, LoadByte(S)); + break; + case LUA_TNUMFLT: + setfltvalue(o, LoadNumber(S)); + break; + case LUA_TNUMINT: + setivalue(o, LoadInteger(S)); + break; + case LUA_TSHRSTR: + case LUA_TLNGSTR: + setsvalue2n(S->L, o, LoadString(S)); + break; + default: + lua_assert(0); + } + } +} + + +static void LoadProtos (LoadState *S, Proto *f) { + int i; + int n = LoadInt(S); + f->p = luaM_newvector(S->L, n, Proto *); + f->sizep = n; + for (i = 0; i < n; i++) + f->p[i] = NULL; + for (i = 0; i < n; i++) { + f->p[i] = luaF_newproto(S->L); + LoadFunction(S, f->p[i], f->source); + } +} + + +static void LoadUpvalues (LoadState *S, Proto *f) { + int i, n; + n = LoadInt(S); + f->upvalues = luaM_newvector(S->L, n, Upvaldesc); + f->sizeupvalues = n; + for (i = 0; i < n; i++) + f->upvalues[i].name = NULL; + for (i = 0; i < n; i++) { + f->upvalues[i].instack = LoadByte(S); + f->upvalues[i].idx = LoadByte(S); + } +} + + +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); + n = LoadInt(S); + f->locvars = luaM_newvector(S->L, n, LocVar); + f->sizelocvars = n; + for (i = 0; i < n; i++) + f->locvars[i].varname = NULL; + for (i = 0; i < n; i++) { + f->locvars[i].varname = LoadString(S); + f->locvars[i].startpc = LoadInt(S); + f->locvars[i].endpc = LoadInt(S); + } + n = LoadInt(S); + for (i = 0; i < n; i++) + f->upvalues[i].name = LoadString(S); +} + + +static void LoadFunction (LoadState *S, Proto *f, TString *psource) { + f->source = LoadString(S); + if (f->source == NULL) /* no source in dump? */ + f->source = psource; /* reuse parent's source */ + f->linedefined = LoadInt(S); + f->lastlinedefined = LoadInt(S); + f->numparams = LoadByte(S); + f->is_vararg = LoadByte(S); + f->maxstacksize = LoadByte(S); + LoadCode(S, f); + LoadConstants(S, f); + LoadUpvalues(S, f); + LoadProtos(S, f); + LoadDebug(S, f); +} + + +static void checkliteral (LoadState *S, const char *s, const char *msg) { + char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ + size_t len = strlen(s); + LoadVector(S, buff, len); + if (memcmp(s, buff, len) != 0) + error(S, msg); +} + + +static void fchecksize (LoadState *S, size_t size, const char *tname) { + if (LoadByte(S) != size) + error(S, luaO_pushfstring(S->L, "%s size mismatch in", tname)); +} + + +#define checksize(S,t) fchecksize(S,sizeof(t),#t) + +static void checkHeader (LoadState *S) { + checkliteral(S, LUA_SIGNATURE + 1, "not a"); /* 1st char already checked */ + if (LoadByte(S) != LUAC_VERSION) + error(S, "version mismatch in"); + if (LoadByte(S) != LUAC_FORMAT) + error(S, "format mismatch in"); + checkliteral(S, LUAC_DATA, "corrupted"); + checksize(S, int); + checksize(S, size_t); + checksize(S, Instruction); + checksize(S, lua_Integer); + checksize(S, lua_Number); + if (LoadInteger(S) != LUAC_INT) + error(S, "endianness mismatch in"); + if (LoadNumber(S) != LUAC_NUM) + error(S, "float format mismatch in"); +} + + +/* +** load precompiled chunk +*/ +LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { + LoadState S; + LClosure *cl; + if (*name == '@' || *name == '=') + S.name = name + 1; + else if (*name == LUA_SIGNATURE[0]) + S.name = "binary string"; + else + S.name = name; + S.L = L; + S.Z = Z; + checkHeader(&S); + cl = luaF_newLclosure(L, LoadByte(&S)); + setclLvalue(L, L->top, cl); + luaD_inctop(L); + cl->p = luaF_newproto(L); + LoadFunction(&S, cl->p, NULL); + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luai_verifycode(L, buff, cl->p); + return cl; +} + diff --git a/lua-5.3.3/src/lundump.h b/lua-5.3.3/src/lundump.h new file mode 100644 index 0000000..aa5cc82 --- /dev/null +++ b/lua-5.3.3/src/lundump.h @@ -0,0 +1,32 @@ +/* +** $Id: lundump.h,v 1.45 2015/09/08 15:41:05 roberto Exp $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#ifndef lundump_h +#define lundump_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* data to catch conversion errors */ +#define LUAC_DATA "\x19\x93\r\n\x1a\n" + +#define LUAC_INT 0x5678 +#define LUAC_NUM cast_num(370.5) + +#define MYINT(s) (s[0]-'0') +#define LUAC_VERSION (MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR)) +#define LUAC_FORMAT 0 /* this is the official format */ + +/* load one chunk; from lundump.c */ +LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); + +/* dump one chunk; from ldump.c */ +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, + void* data, int strip); + +#endif diff --git a/lua-5.3.3/src/lutf8lib.c b/lua-5.3.3/src/lutf8lib.c new file mode 100644 index 0000000..9042582 --- /dev/null +++ b/lua-5.3.3/src/lutf8lib.c @@ -0,0 +1,256 @@ +/* +** $Id: lutf8lib.c,v 1.15 2015/03/28 19:16:55 roberto Exp $ +** Standard library for UTF-8 manipulation +** See Copyright Notice in lua.h +*/ + +#define lutf8lib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + +#define MAXUNICODE 0x10FFFF + +#define iscont(p) ((*(p) & 0xC0) == 0x80) + + +/* from strlib */ +/* translate a relative string position: negative means back from end */ +static lua_Integer u_posrelat (lua_Integer pos, size_t len) { + if (pos >= 0) return pos; + else if (0u - (size_t)pos > len) return 0; + else return (lua_Integer)len + pos + 1; +} + + +/* +** Decode one UTF-8 sequence, returning NULL if byte sequence is invalid. +*/ +static const char *utf8_decode (const char *o, int *val) { + static const unsigned int limits[] = {0xFF, 0x7F, 0x7FF, 0xFFFF}; + const unsigned char *s = (const unsigned char *)o; + unsigned int c = s[0]; + unsigned int res = 0; /* final result */ + if (c < 0x80) /* ascii? */ + res = c; + else { + int count = 0; /* to count number of continuation bytes */ + while (c & 0x40) { /* still have continuation bytes? */ + int cc = s[++count]; /* read next byte */ + if ((cc & 0xC0) != 0x80) /* not a continuation byte? */ + return NULL; /* invalid byte sequence */ + res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */ + c <<= 1; /* to test next bit */ + } + res |= ((c & 0x7F) << (count * 5)); /* add first byte */ + if (count > 3 || res > MAXUNICODE || res <= limits[count]) + return NULL; /* invalid byte sequence */ + s += count; /* skip continuation bytes read */ + } + if (val) *val = res; + return (const char *)s + 1; /* +1 to include first byte */ +} + + +/* +** utf8len(s [, i [, j]]) --> number of characters that start in the +** range [i,j], or nil + current position if 's' is not well formed in +** that interval +*/ +static int utflen (lua_State *L) { + int n = 0; + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2, + "initial position out of string"); + luaL_argcheck(L, --posj < (lua_Integer)len, 3, + "final position out of string"); + while (posi <= posj) { + const char *s1 = utf8_decode(s + posi, NULL); + if (s1 == NULL) { /* conversion error? */ + lua_pushnil(L); /* return nil ... */ + lua_pushinteger(L, posi + 1); /* ... and current position */ + return 2; + } + posi = s1 - s; + n++; + } + lua_pushinteger(L, n); + return 1; +} + + +/* +** codepoint(s, [i, [j]]) -> returns codepoints for all characters +** that start in the range [i,j] +*/ +static int codepoint (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len); + int n; + const char *se; + luaL_argcheck(L, posi >= 1, 2, "out of range"); + luaL_argcheck(L, pose <= (lua_Integer)len, 3, "out of range"); + if (posi > pose) return 0; /* empty interval; return no values */ + if (pose - posi >= INT_MAX) /* (lua_Integer -> int) overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; + luaL_checkstack(L, n, "string slice too long"); + n = 0; + se = s + pose; + for (s += posi - 1; s < se;) { + int code; + s = utf8_decode(s, &code); + if (s == NULL) + return luaL_error(L, "invalid UTF-8 code"); + lua_pushinteger(L, code); + n++; + } + return n; +} + + +static void pushutfchar (lua_State *L, int arg) { + lua_Integer code = luaL_checkinteger(L, arg); + luaL_argcheck(L, 0 <= code && code <= MAXUNICODE, arg, "value out of range"); + lua_pushfstring(L, "%U", (long)code); +} + + +/* +** utfchar(n1, n2, ...) -> char(n1)..char(n2)... +*/ +static int utfchar (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + if (n == 1) /* optimize common case of single char */ + pushutfchar(L, 1); + else { + int i; + luaL_Buffer b; + luaL_buffinit(L, &b); + for (i = 1; i <= n; i++) { + pushutfchar(L, i); + luaL_addvalue(&b); + } + luaL_pushresult(&b); + } + return 1; +} + + +/* +** offset(s, n, [i]) -> index where n-th character counting from +** position 'i' starts; 0 means character at 'i'. +*/ +static int byteoffset (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer n = luaL_checkinteger(L, 2); + lua_Integer posi = (n >= 0) ? 1 : len + 1; + posi = u_posrelat(luaL_optinteger(L, 3, posi), len); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3, + "position out of range"); + if (n == 0) { + /* find beginning of current byte sequence */ + while (posi > 0 && iscont(s + posi)) posi--; + } + else { + if (iscont(s + posi)) + luaL_error(L, "initial position is a continuation byte"); + if (n < 0) { + while (n < 0 && posi > 0) { /* move back */ + do { /* find beginning of previous character */ + posi--; + } while (posi > 0 && iscont(s + posi)); + n++; + } + } + else { + n--; /* do not move for 1st character */ + while (n > 0 && posi < (lua_Integer)len) { + do { /* find beginning of next character */ + posi++; + } while (iscont(s + posi)); /* (cannot pass final '\0') */ + n--; + } + } + } + if (n == 0) /* did it find given character? */ + lua_pushinteger(L, posi + 1); + else /* no such character */ + lua_pushnil(L); + return 1; +} + + +static int iter_aux (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer n = lua_tointeger(L, 2) - 1; + if (n < 0) /* first iteration? */ + n = 0; /* start from here */ + else if (n < (lua_Integer)len) { + n++; /* skip current byte */ + while (iscont(s + n)) n++; /* and its continuations */ + } + if (n >= (lua_Integer)len) + return 0; /* no more codepoints */ + else { + int code; + const char *next = utf8_decode(s + n, &code); + if (next == NULL || iscont(next)) + return luaL_error(L, "invalid UTF-8 code"); + lua_pushinteger(L, n + 1); + lua_pushinteger(L, code); + return 2; + } +} + + +static int iter_codes (lua_State *L) { + luaL_checkstring(L, 1); + lua_pushcfunction(L, iter_aux); + lua_pushvalue(L, 1); + lua_pushinteger(L, 0); + return 3; +} + + +/* pattern to match a single UTF-8 character */ +#define UTF8PATT "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" + + +static const luaL_Reg funcs[] = { + {"offset", byteoffset}, + {"codepoint", codepoint}, + {"char", utfchar}, + {"len", utflen}, + {"codes", iter_codes}, + /* placeholders */ + {"charpattern", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_utf8 (lua_State *L) { + luaL_newlib(L, funcs); + lua_pushlstring(L, UTF8PATT, sizeof(UTF8PATT)/sizeof(char) - 1); + lua_setfield(L, -2, "charpattern"); + return 1; +} + diff --git a/lua-5.3.3/src/lvm.c b/lua-5.3.3/src/lvm.c new file mode 100644 index 0000000..84ade6b --- /dev/null +++ b/lua-5.3.3/src/lvm.c @@ -0,0 +1,1322 @@ +/* +** $Id: lvm.c,v 2.268 2016/02/05 19:59:14 roberto Exp $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#define lvm_c +#define LUA_CORE + +#include "lprefix.h" + +#include +#include +#include +#include +#include +#include + +#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 2000 + + + +/* +** 'l_intfitsf' checks whether a given integer can be converted to a +** float without rounding. Used in comparisons. Left undefined if +** all integers fit in a float precisely. +*/ +#if !defined(l_intfitsf) + +/* number of bits in the mantissa of a float */ +#define NBM (l_mathlim(MANT_DIG)) + +/* +** Check whether some integers may not fit in a float, that is, whether +** (maxinteger >> NBM) > 0 (that implies (1 << NBM) <= maxinteger). +** (The shifts are done in parts to avoid shifting by more than the size +** of an integer. In a worst case, NBM == 113 for long double and +** sizeof(integer) == 32.) +*/ +#if ((((LUA_MAXINTEGER >> (NBM / 4)) >> (NBM / 4)) >> (NBM / 4)) \ + >> (NBM - (3 * (NBM / 4)))) > 0 + +#define l_intfitsf(i) \ + (-((lua_Integer)1 << NBM) <= (i) && (i) <= ((lua_Integer)1 << NBM)) + +#endif + +#endif + + + +/* +** Try to convert a value to a float. The float case is already handled +** by the macro 'tonumber'. +*/ +int luaV_tonumber_ (const TValue *obj, lua_Number *n) { + TValue v; + if (ttisinteger(obj)) { + *n = cast_num(ivalue(obj)); + return 1; + } + else if (cvt2num(obj) && /* string convertible to number? */ + luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) { + *n = nvalue(&v); /* convert result of 'luaO_str2num' to a float */ + return 1; + } + else + return 0; /* conversion failed */ +} + + +/* +** try to convert a value to an integer, rounding according to 'mode': +** mode == 0: accepts only integral values +** mode == 1: takes the floor of the number +** mode == 2: takes the ceil of the number +*/ +int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode) { + TValue v; + again: + if (ttisfloat(obj)) { + lua_Number n = fltvalue(obj); + lua_Number f = l_floor(n); + if (n != f) { /* not an integral value? */ + if (mode == 0) return 0; /* fails if mode demands integral value */ + else if (mode > 1) /* needs ceil? */ + f += 1; /* convert floor to ceil (remember: n != f) */ + } + return lua_numbertointeger(f, p); + } + else if (ttisinteger(obj)) { + *p = ivalue(obj); + return 1; + } + else if (cvt2num(obj) && + luaO_str2num(svalue(obj), &v) == vslen(obj) + 1) { + obj = &v; + goto again; /* convert result from 'luaO_str2num' to an integer */ + } + return 0; /* conversion failed */ +} + + +/* +** Try to convert a 'for' limit to an integer, preserving the +** semantics of the loop. +** (The following explanation assumes a non-negative step; it is valid +** for negative steps mutatis mutandis.) +** If the limit can be converted to an integer, rounding down, that is +** it. +** Otherwise, check whether the limit can be converted to a number. If +** the number is too large, it is OK to set the limit as LUA_MAXINTEGER, +** which means no limit. If the number is too negative, the loop +** should not run, because any initial integer value is larger than the +** limit. So, it sets the limit to LUA_MININTEGER. 'stopnow' corrects +** the extreme case when the initial value is LUA_MININTEGER, in which +** case the LUA_MININTEGER limit would still run the loop once. +*/ +static int forlimit (const TValue *obj, lua_Integer *p, lua_Integer step, + int *stopnow) { + *stopnow = 0; /* usually, let loops run */ + if (!luaV_tointeger(obj, p, (step < 0 ? 2 : 1))) { /* not fit in integer? */ + lua_Number n; /* try to convert to float */ + if (!tonumber(obj, &n)) /* cannot convert to float? */ + return 0; /* not a number */ + if (luai_numlt(0, n)) { /* if true, float is larger than max integer */ + *p = LUA_MAXINTEGER; + if (step < 0) *stopnow = 1; + } + else { /* float is smaller than min integer */ + *p = LUA_MININTEGER; + if (step >= 0) *stopnow = 1; + } + } + return 1; +} + + +/* +** Finish the table access 'val = t[key]'. +** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to +** t[k] entry (which must be nil). +*/ +void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, + const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + const TValue *tm; /* metamethod */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + if (slot == NULL) { /* 't' is not a table? */ + lua_assert(!ttistable(t)); + tm = luaT_gettmbyobj(L, t, TM_INDEX); + if (ttisnil(tm)) + luaG_typeerror(L, t, "index"); /* no metamethod */ + /* else will try the metamethod */ + } + else { /* 't' is a table */ + lua_assert(ttisnil(slot)); + tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ + if (tm == NULL) { /* no metamethod? */ + setnilvalue(val); /* result is nil */ + return; + } + /* else will try the metamethod */ + } + if (ttisfunction(tm)) { /* is metamethod a function? */ + luaT_callTM(L, tm, t, key, val, 1); /* call it */ + return; + } + t = tm; /* else try to access 'tm[key]' */ + if (luaV_fastget(L,t,key,slot,luaH_get)) { /* fast track? */ + setobj2s(L, val, slot); /* done */ + return; + } + /* else repeat (tail call 'luaV_finishget') */ + } + luaG_runerror(L, "'__index' chain too long; possible loop"); +} + + +/* +** Finish a table assignment 't[key] = val'. +** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points +** to the entry 't[key]', or to 'luaO_nilobject' if there is no such +** entry. (The value at 'slot' must be nil, otherwise 'luaV_fastset' +** would have done the job.) +*/ +void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + StkId val, const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; /* '__newindex' metamethod */ + if (slot != NULL) { /* is 't' a table? */ + Table *h = hvalue(t); /* save 't' table */ + lua_assert(ttisnil(slot)); /* old value must be nil */ + tm = fasttm(L, h->metatable, TM_NEWINDEX); /* get metamethod */ + if (tm == NULL) { /* no metamethod? */ + if (slot == luaO_nilobject) /* no previous entry? */ + slot = luaH_newkey(L, h, key); /* create one */ + /* no metamethod and (now) there is an entry with given key */ + setobj2t(L, cast(TValue *, slot), val); /* set its new value */ + invalidateTMcache(h); + luaC_barrierback(L, h, val); + return; + } + /* else will try the metamethod */ + } + else { /* not a table; check metamethod */ + if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) + luaG_typeerror(L, t, "index"); + } + /* try the metamethod */ + if (ttisfunction(tm)) { + luaT_callTM(L, tm, t, key, val, 0); + return; + } + t = tm; /* else repeat assignment over 'tm' */ + if (luaV_fastset(L, t, key, slot, luaH_get, val)) + return; /* done */ + /* else loop */ + } + luaG_runerror(L, "'__newindex' chain too long; possible loop"); +} + + +/* +** Compare two strings 'ls' x 'rs', returning an integer smaller-equal- +** -larger than zero if 'ls' is smaller-equal-larger than 'rs'. +** The code is a little tricky because it allows '\0' in the strings +** and it uses 'strcoll' (to respect locales) for each segments +** of the strings. +*/ +static int l_strcmp (const TString *ls, const TString *rs) { + const char *l = getstr(ls); + size_t ll = tsslen(ls); + const char *r = getstr(rs); + size_t lr = tsslen(rs); + for (;;) { /* for each segment */ + int temp = strcoll(l, r); + if (temp != 0) /* not equal? */ + return temp; /* done */ + else { /* strings are equal up to a '\0' */ + size_t len = strlen(l); /* index of first '\0' in both strings */ + if (len == lr) /* 'rs' is finished? */ + return (len == ll) ? 0 : 1; /* check 'ls' */ + else if (len == ll) /* 'ls' is finished? */ + return -1; /* 'ls' is smaller than 'rs' ('rs' is not finished) */ + /* both strings longer than 'len'; go on comparing after the '\0' */ + len++; + l += len; ll -= len; r += len; lr -= len; + } + } +} + + +/* +** Check whether integer 'i' is less than float 'f'. If 'i' has an +** exact representation as a float ('l_intfitsf'), compare numbers as +** floats. Otherwise, if 'f' is outside the range for integers, result +** is trivial. Otherwise, compare them as integers. (When 'i' has no +** float representation, either 'f' is "far away" from 'i' or 'f' has +** no precision left for a fractional part; either way, how 'f' is +** truncated is irrelevant.) When 'f' is NaN, comparisons must result +** in false. +*/ +static int LTintfloat (lua_Integer i, lua_Number f) { +#if defined(l_intfitsf) + if (!l_intfitsf(i)) { + if (f >= -cast_num(LUA_MININTEGER)) /* -minint == maxint + 1 */ + return 1; /* f >= maxint + 1 > i */ + else if (f > cast_num(LUA_MININTEGER)) /* minint < f <= maxint ? */ + return (i < cast(lua_Integer, f)); /* compare them as integers */ + else /* f <= minint <= i (or 'f' is NaN) --> not(i < f) */ + return 0; + } +#endif + return luai_numlt(cast_num(i), f); /* compare them as floats */ +} + + +/* +** Check whether integer 'i' is less than or equal to float 'f'. +** See comments on previous function. +*/ +static int LEintfloat (lua_Integer i, lua_Number f) { +#if defined(l_intfitsf) + if (!l_intfitsf(i)) { + if (f >= -cast_num(LUA_MININTEGER)) /* -minint == maxint + 1 */ + return 1; /* f >= maxint + 1 > i */ + else if (f >= cast_num(LUA_MININTEGER)) /* minint <= f <= maxint ? */ + return (i <= cast(lua_Integer, f)); /* compare them as integers */ + else /* f < minint <= i (or 'f' is NaN) --> not(i <= f) */ + return 0; + } +#endif + return luai_numle(cast_num(i), f); /* compare them as floats */ +} + + +/* +** Return 'l < r', for numbers. +*/ +static int LTnum (const TValue *l, const TValue *r) { + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li < ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LTintfloat(li, fltvalue(r)); /* l < r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numlt(lf, fltvalue(r)); /* both are float */ + else if (luai_numisnan(lf)) /* 'r' is int and 'l' is float */ + return 0; /* NaN < i is always false */ + else /* without NaN, (l < r) <--> not(r <= l) */ + return !LEintfloat(ivalue(r), lf); /* not (r <= l) ? */ + } +} + + +/* +** Return 'l <= r', for numbers. +*/ +static int LEnum (const TValue *l, const TValue *r) { + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li <= ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LEintfloat(li, fltvalue(r)); /* l <= r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numle(lf, fltvalue(r)); /* both are float */ + else if (luai_numisnan(lf)) /* 'r' is int and 'l' is float */ + return 0; /* NaN <= i is always false */ + else /* without NaN, (l <= r) <--> not(r < l) */ + return !LTintfloat(ivalue(r), lf); /* not (r < l) ? */ + } +} + + +/* +** Main operation less than; return 'l < r'. +*/ +int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { + int res; + if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */ + return LTnum(l, r); + else if (ttisstring(l) && ttisstring(r)) /* both are strings? */ + return l_strcmp(tsvalue(l), tsvalue(r)) < 0; + else if ((res = luaT_callorderTM(L, l, r, TM_LT)) < 0) /* no metamethod? */ + luaG_ordererror(L, l, r); /* error */ + return res; +} + + +/* +** Main operation less than or equal to; return 'l <= r'. If it needs +** a metamethod and there is no '__le', try '__lt', based on +** l <= r iff !(r < l) (assuming a total order). If the metamethod +** yields during this substitution, the continuation has to know +** about it (to negate the result of r= 0) /* try 'le' */ + return res; + else { /* try 'lt': */ + L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */ + res = luaT_callorderTM(L, r, l, TM_LT); + L->ci->callstatus ^= CIST_LEQ; /* clear mark */ + if (res < 0) + luaG_ordererror(L, l, r); + return !res; /* result is negated */ + } +} + + +/* +** Main operation for equality of Lua values; return 't1 == t2'. +** L == NULL means raw equality (no metamethods) +*/ +int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { + const TValue *tm; + if (ttype(t1) != ttype(t2)) { /* not the same variant? */ + if (ttnov(t1) != ttnov(t2) || ttnov(t1) != LUA_TNUMBER) + return 0; /* only numbers can be equal with different variants */ + else { /* two numbers with different variants */ + lua_Integer i1, i2; /* compare them as integers */ + return (tointeger(t1, &i1) && tointeger(t2, &i2) && i1 == i2); + } + } + /* values have same type and same variant */ + switch (ttype(t1)) { + case LUA_TNIL: return 1; + case LUA_TNUMINT: return (ivalue(t1) == ivalue(t2)); + case LUA_TNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2)); + case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ + case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); + case LUA_TLCF: return fvalue(t1) == fvalue(t2); + case LUA_TSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2)); + case LUA_TLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2)); + case LUA_TUSERDATA: { + if (uvalue(t1) == uvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, uvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, uvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + case LUA_TTABLE: { + if (hvalue(t1) == hvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, hvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, hvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + default: + return gcvalue(t1) == gcvalue(t2); + } + if (tm == NULL) /* no TM? */ + return 0; /* objects are different */ + luaT_callTM(L, tm, t1, t2, L->top, 1); /* call TM */ + return !l_isfalse(L->top); +} + + +/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */ +#define tostring(L,o) \ + (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1))) + +#define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0) + +/* copy strings in stack from top - n up to top - 1 to buffer */ +static void copy2buff (StkId top, int n, char *buff) { + size_t tl = 0; /* size already copied */ + do { + size_t l = vslen(top - n); /* length of string being copied */ + memcpy(buff + tl, svalue(top - n), l * sizeof(char)); + tl += l; + } while (--n > 0); +} + + +/* +** Main operation for concatenation: concat 'total' values in the stack, +** from 'L->top - total' up to 'L->top - 1'. +*/ +void luaV_concat (lua_State *L, int total) { + lua_assert(total >= 2); + do { + StkId top = L->top; + int n = 2; /* number of elements handled in this pass (at least 2) */ + if (!(ttisstring(top-2) || cvt2str(top-2)) || !tostring(L, top-1)) + luaT_trybinTM(L, top-2, top-1, top-2, TM_CONCAT); + else if (isemptystr(top - 1)) /* second operand is empty? */ + cast_void(tostring(L, top - 2)); /* result is first operand */ + else if (isemptystr(top - 2)) { /* first operand is an empty string? */ + setobjs2s(L, top - 2, top - 1); /* result is second op. */ + } + else { + /* at least two non-empty string values; get as many as possible */ + size_t tl = vslen(top - 1); + TString *ts; + /* collect total length and number of strings */ + for (n = 1; n < total && tostring(L, top - n - 1); n++) { + size_t l = vslen(top - n - 1); + if (l >= (MAX_SIZE/sizeof(char)) - tl) + luaG_runerror(L, "string length overflow"); + tl += l; + } + if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */ + char buff[LUAI_MAXSHORTLEN]; + copy2buff(top, n, buff); /* copy strings to buffer */ + ts = luaS_newlstr(L, buff, tl); + } + else { /* long string; copy strings directly to final result */ + ts = luaS_createlngstrobj(L, tl); + copy2buff(top, n, getstr(ts)); + } + setsvalue2s(L, top - n, ts); /* create result */ + } + total -= n-1; /* got 'n' strings to create 1 new */ + L->top -= n-1; /* popped 'n' strings and pushed one */ + } while (total > 1); /* repeat until only 1 result left */ +} + + +/* +** Main operation 'ra' = #rb'. +*/ +void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) { + const TValue *tm; + switch (ttype(rb)) { + case LUA_TTABLE: { + Table *h = hvalue(rb); + tm = fasttm(L, h->metatable, TM_LEN); + if (tm) break; /* metamethod? break switch to call it */ + setivalue(ra, luaH_getn(h)); /* else primitive len */ + return; + } + case LUA_TSHRSTR: { + setivalue(ra, tsvalue(rb)->shrlen); + return; + } + case LUA_TLNGSTR: { + setivalue(ra, tsvalue(rb)->u.lnglen); + return; + } + default: { /* try metamethod */ + tm = luaT_gettmbyobj(L, rb, TM_LEN); + if (ttisnil(tm)) /* no metamethod? */ + luaG_typeerror(L, rb, "get length of"); + break; + } + } + luaT_callTM(L, tm, rb, rb, ra, 1); +} + + +/* +** Integer division; return 'm // n', that is, floor(m/n). +** C division truncates its result (rounds towards zero). +** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer, +** otherwise 'floor(q) == trunc(q) - 1'. +*/ +lua_Integer luaV_div (lua_State *L, lua_Integer m, lua_Integer n) { + if (l_castS2U(n) + 1u <= 1u) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to divide by zero"); + return intop(-, 0, m); /* n==-1; avoid overflow with 0x80000...//-1 */ + } + else { + lua_Integer q = m / n; /* perform C division */ + if ((m ^ n) < 0 && m % n != 0) /* 'm/n' would be negative non-integer? */ + q -= 1; /* correct result for different rounding */ + return q; + } +} + + +/* +** Integer modulus; return 'm % n'. (Assume that C '%' with +** negative operands follows C99 behavior. See previous comment +** about luaV_div.) +*/ +lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) { + if (l_castS2U(n) + 1u <= 1u) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to perform 'n%%0'"); + return 0; /* m % -1 == 0; avoid overflow with 0x80000...%-1 */ + } + else { + lua_Integer r = m % n; + if (r != 0 && (m ^ n) < 0) /* 'm/n' would be non-integer negative? */ + r += n; /* correct result for different rounding */ + return r; + } +} + + +/* number of bits in an integer */ +#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) + +/* +** Shift left operation. (Shift right just negates 'y'.) +*/ +lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { + if (y < 0) { /* shift right? */ + if (y <= -NBITS) return 0; + else return intop(>>, x, -y); + } + else { /* shift left */ + if (y >= NBITS) return 0; + else return intop(<<, x, y); + } +} + + +/* +** check whether cached closure in prototype 'p' may be reused, that is, +** whether there is a cached closure with the same upvalues needed by +** new closure to be created. +*/ +static LClosure *getcached (Proto *p, UpVal **encup, StkId base) { + LClosure *c = p->cache; + if (c != NULL) { /* is there a cached closure? */ + int nup = p->sizeupvalues; + Upvaldesc *uv = p->upvalues; + int i; + for (i = 0; i < nup; i++) { /* check whether it has right upvalues */ + TValue *v = uv[i].instack ? base + uv[i].idx : encup[uv[i].idx]->v; + if (c->upvals[i]->v != v) + return NULL; /* wrong upvalue; cannot reuse closure */ + } + } + return c; /* return cached closure (or NULL if no cached closure) */ +} + + +/* +** create a new Lua closure, push it in the stack, and initialize +** its upvalues. Note that the closure is not cached if prototype is +** already black (which means that 'cache' was already cleared by the +** GC). +*/ +static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, + StkId ra) { + int nup = p->sizeupvalues; + Upvaldesc *uv = p->upvalues; + int i; + LClosure *ncl = luaF_newLclosure(L, nup); + ncl->p = p; + setclLvalue(L, ra, ncl); /* anchor new closure in stack */ + for (i = 0; i < nup; i++) { /* fill in its upvalues */ + if (uv[i].instack) /* upvalue refers to local variable? */ + ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx); + else /* get upvalue from enclosing function */ + ncl->upvals[i] = encup[uv[i].idx]; + ncl->upvals[i]->refcount++; + /* new closure is white, so we do not need a barrier here */ + } + if (!isblack(p)) /* cache will not break GC invariant? */ + p->cache = ncl; /* save it on cache for reuse */ +} + + +/* +** finish execution of an opcode interrupted by an yield +*/ +void luaV_finishOp (lua_State *L) { + CallInfo *ci = L->ci; + StkId base = ci->u.l.base; + Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ + OpCode op = GET_OPCODE(inst); + switch (op) { /* finish its execution */ + case OP_ADD: case OP_SUB: case OP_MUL: case OP_DIV: case OP_IDIV: + case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: + case OP_MOD: case OP_POW: + case OP_UNM: case OP_BNOT: case OP_LEN: + case OP_GETTABUP: case OP_GETTABLE: case OP_SELF: { + setobjs2s(L, base + GETARG_A(inst), --L->top); + break; + } + case OP_LE: case OP_LT: case OP_EQ: { + int res = !l_isfalse(L->top - 1); + L->top--; + if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */ + lua_assert(op == OP_LE); + ci->callstatus ^= CIST_LEQ; /* clear mark */ + res = !res; /* negate result */ + } + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP); + if (res != GETARG_A(inst)) /* condition failed? */ + ci->u.l.savedpc++; /* skip jump instruction */ + break; + } + case OP_CONCAT: { + StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */ + int b = GETARG_B(inst); /* first element to concatenate */ + int total = cast_int(top - 1 - (base + b)); /* yet to concatenate */ + setobj2s(L, top - 2, top); /* put TM result in proper position */ + if (total > 1) { /* are there elements to concat? */ + L->top = top - 1; /* top is one after last element (at top-2) */ + luaV_concat(L, total); /* concat them (may yield again) */ + } + /* move final result to final position */ + setobj2s(L, ci->u.l.base + GETARG_A(inst), L->top - 1); + L->top = ci->top; /* restore top */ + break; + } + case OP_TFORCALL: { + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_TFORLOOP); + L->top = ci->top; /* correct top */ + break; + } + case OP_CALL: { + if (GETARG_C(inst) - 1 >= 0) /* nresults >= 0? */ + L->top = ci->top; /* adjust results */ + break; + } + case OP_TAILCALL: case OP_SETTABUP: case OP_SETTABLE: + break; + default: lua_assert(0); + } +} + + + + +/* +** {================================================================== +** Function 'luaV_execute': main interpreter loop +** =================================================================== +*/ + + +/* +** some macros for common tasks in 'luaV_execute' +*/ + + +#define RA(i) (base+GETARG_A(i)) +#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)) + + +/* execute a jump instruction */ +#define dojump(ci,i,e) \ + { int a = GETARG_A(i); \ + if (a != 0) luaF_close(L, ci->u.l.base + a - 1); \ + ci->u.l.savedpc += GETARG_sBx(i) + e; } + +/* for test instructions, execute the jump instruction that follows it */ +#define donextjump(ci) { i = *ci->u.l.savedpc; dojump(ci, i, 1); } + + +#define Protect(x) { {x;}; base = ci->u.l.base; } + +#define checkGC(L,c) \ + { luaC_condGC(L, L->top = (c), /* limit of live values */ \ + Protect(L->top = ci->top)); /* restore top */ \ + luai_threadyield(L); } + + +/* fetch an instruction and prepare its execution */ +#define vmfetch() { \ + i = *(ci->u.l.savedpc++); \ + if (L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) \ + Protect(luaG_traceexec(L)); \ + ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \ + lua_assert(base == ci->u.l.base); \ + lua_assert(base <= L->top && L->top < L->stack + L->stacksize); \ +} + +#define vmdispatch(o) switch(o) +#define vmcase(l) case l: +#define vmbreak break + + +/* +** copy of 'luaV_gettable', but protecting the call to potential +** metamethod (which can reallocate the stack) +*/ +#define gettableProtected(L,t,k,v) { const TValue *slot; \ + if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \ + else Protect(luaV_finishget(L,t,k,v,slot)); } + + +/* same for 'luaV_settable' */ +#define settableProtected(L,t,k,v) { const TValue *slot; \ + if (!luaV_fastset(L,t,k,slot,luaH_get,v)) \ + Protect(luaV_finishset(L,t,k,v,slot)); } + + + +void luaV_execute (lua_State *L) { + CallInfo *ci = L->ci; + LClosure *cl; + TValue *k; + StkId base; + ci->callstatus |= CIST_FRESH; /* fresh invocation of 'luaV_execute" */ + newframe: /* reentry point when frame changes (call/return) */ + lua_assert(ci == L->ci); + cl = clLvalue(ci->func); /* local reference to function's closure */ + k = cl->p->k; /* local reference to function's constant table */ + base = ci->u.l.base; /* local copy of function's base */ + /* main loop of interpreter */ + for (;;) { + Instruction i; + StkId ra; + vmfetch(); + vmdispatch (GET_OPCODE(i)) { + vmcase(OP_MOVE) { + setobjs2s(L, ra, RB(i)); + vmbreak; + } + vmcase(OP_LOADK) { + TValue *rb = k + GETARG_Bx(i); + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADKX) { + TValue *rb; + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG); + rb = k + GETARG_Ax(*ci->u.l.savedpc++); + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADBOOL) { + setbvalue(ra, GETARG_B(i)); + if (GETARG_C(i)) ci->u.l.savedpc++; /* skip next instruction (if C) */ + vmbreak; + } + vmcase(OP_LOADNIL) { + int b = GETARG_B(i); + do { + setnilvalue(ra++); + } while (b--); + vmbreak; + } + vmcase(OP_GETUPVAL) { + int b = GETARG_B(i); + setobj2s(L, ra, cl->upvals[b]->v); + vmbreak; + } + vmcase(OP_GETTABUP) { + TValue *upval = cl->upvals[GETARG_B(i)]->v; + TValue *rc = RKC(i); + gettableProtected(L, upval, rc, ra); + vmbreak; + } + vmcase(OP_GETTABLE) { + StkId rb = RB(i); + TValue *rc = RKC(i); + gettableProtected(L, rb, rc, ra); + vmbreak; + } + vmcase(OP_SETTABUP) { + TValue *upval = cl->upvals[GETARG_A(i)]->v; + TValue *rb = RKB(i); + TValue *rc = RKC(i); + settableProtected(L, upval, rb, rc); + vmbreak; + } + vmcase(OP_SETUPVAL) { + UpVal *uv = cl->upvals[GETARG_B(i)]; + setobj(L, uv->v, ra); + luaC_upvalbarrier(L, uv); + vmbreak; + } + vmcase(OP_SETTABLE) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + settableProtected(L, ra, rb, rc); + vmbreak; + } + vmcase(OP_NEWTABLE) { + int b = GETARG_B(i); + int c = GETARG_C(i); + Table *t = luaH_new(L); + sethvalue(L, ra, t); + if (b != 0 || c != 0) + luaH_resize(L, t, luaO_fb2int(b), luaO_fb2int(c)); + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_SELF) { + const TValue *aux; + StkId rb = RB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rc); /* key must be a string */ + setobjs2s(L, ra + 1, rb); + if (luaV_fastget(L, rb, key, aux, luaH_getstr)) { + setobj2s(L, ra, aux); + } + else Protect(luaV_finishget(L, rb, rc, ra, aux)); + vmbreak; + } + vmcase(OP_ADD) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Number nb; lua_Number nc; + if (ttisinteger(rb) && ttisinteger(rc)) { + lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); + setivalue(ra, intop(+, ib, ic)); + } + else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { + setfltvalue(ra, luai_numadd(L, nb, nc)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); } + vmbreak; + } + vmcase(OP_SUB) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Number nb; lua_Number nc; + if (ttisinteger(rb) && ttisinteger(rc)) { + lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); + setivalue(ra, intop(-, ib, ic)); + } + else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { + setfltvalue(ra, luai_numsub(L, nb, nc)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SUB)); } + vmbreak; + } + vmcase(OP_MUL) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Number nb; lua_Number nc; + if (ttisinteger(rb) && ttisinteger(rc)) { + lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); + setivalue(ra, intop(*, ib, ic)); + } + else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { + setfltvalue(ra, luai_nummul(L, nb, nc)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MUL)); } + vmbreak; + } + vmcase(OP_DIV) { /* float division (always with floats) */ + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Number nb; lua_Number nc; + if (tonumber(rb, &nb) && tonumber(rc, &nc)) { + setfltvalue(ra, luai_numdiv(L, nb, nc)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_DIV)); } + vmbreak; + } + vmcase(OP_BAND) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Integer ib; lua_Integer ic; + if (tointeger(rb, &ib) && tointeger(rc, &ic)) { + setivalue(ra, intop(&, ib, ic)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BAND)); } + vmbreak; + } + vmcase(OP_BOR) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Integer ib; lua_Integer ic; + if (tointeger(rb, &ib) && tointeger(rc, &ic)) { + setivalue(ra, intop(|, ib, ic)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BOR)); } + vmbreak; + } + vmcase(OP_BXOR) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Integer ib; lua_Integer ic; + if (tointeger(rb, &ib) && tointeger(rc, &ic)) { + setivalue(ra, intop(^, ib, ic)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_BXOR)); } + vmbreak; + } + vmcase(OP_SHL) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Integer ib; lua_Integer ic; + if (tointeger(rb, &ib) && tointeger(rc, &ic)) { + setivalue(ra, luaV_shiftl(ib, ic)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); } + vmbreak; + } + vmcase(OP_SHR) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Integer ib; lua_Integer ic; + if (tointeger(rb, &ib) && tointeger(rc, &ic)) { + setivalue(ra, luaV_shiftl(ib, -ic)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); } + vmbreak; + } + vmcase(OP_MOD) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Number nb; lua_Number nc; + if (ttisinteger(rb) && ttisinteger(rc)) { + lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); + setivalue(ra, luaV_mod(L, ib, ic)); + } + else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { + lua_Number m; + luai_nummod(L, nb, nc, m); + setfltvalue(ra, m); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_MOD)); } + vmbreak; + } + vmcase(OP_IDIV) { /* floor division */ + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Number nb; lua_Number nc; + if (ttisinteger(rb) && ttisinteger(rc)) { + lua_Integer ib = ivalue(rb); lua_Integer ic = ivalue(rc); + setivalue(ra, luaV_div(L, ib, ic)); + } + else if (tonumber(rb, &nb) && tonumber(rc, &nc)) { + setfltvalue(ra, luai_numidiv(L, nb, nc)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_IDIV)); } + vmbreak; + } + vmcase(OP_POW) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + lua_Number nb; lua_Number nc; + if (tonumber(rb, &nb) && tonumber(rc, &nc)) { + setfltvalue(ra, luai_numpow(L, nb, nc)); + } + else { Protect(luaT_trybinTM(L, rb, rc, ra, TM_POW)); } + vmbreak; + } + vmcase(OP_UNM) { + TValue *rb = RB(i); + lua_Number nb; + if (ttisinteger(rb)) { + lua_Integer ib = ivalue(rb); + setivalue(ra, intop(-, 0, ib)); + } + else if (tonumber(rb, &nb)) { + setfltvalue(ra, luai_numunm(L, nb)); + } + else { + Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); + } + vmbreak; + } + vmcase(OP_BNOT) { + TValue *rb = RB(i); + lua_Integer ib; + if (tointeger(rb, &ib)) { + setivalue(ra, intop(^, ~l_castS2U(0), ib)); + } + else { + Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); + } + vmbreak; + } + vmcase(OP_NOT) { + TValue *rb = RB(i); + int res = l_isfalse(rb); /* next assignment may change this value */ + setbvalue(ra, res); + vmbreak; + } + vmcase(OP_LEN) { + Protect(luaV_objlen(L, ra, RB(i))); + vmbreak; + } + vmcase(OP_CONCAT) { + int b = GETARG_B(i); + int c = GETARG_C(i); + StkId rb; + L->top = base + c + 1; /* mark the end of concat operands */ + Protect(luaV_concat(L, c - b + 1)); + ra = RA(i); /* 'luaV_concat' may invoke TMs and move the stack */ + rb = base + b; + setobjs2s(L, ra, rb); + checkGC(L, (ra >= rb ? ra + 1 : rb)); + L->top = ci->top; /* restore top */ + vmbreak; + } + vmcase(OP_JMP) { + dojump(ci, i, 0); + vmbreak; + } + vmcase(OP_EQ) { + TValue *rb = RKB(i); + TValue *rc = RKC(i); + Protect( + if (luaV_equalobj(L, rb, rc) != GETARG_A(i)) + ci->u.l.savedpc++; + else + donextjump(ci); + ) + vmbreak; + } + vmcase(OP_LT) { + Protect( + if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) + ci->u.l.savedpc++; + else + donextjump(ci); + ) + vmbreak; + } + vmcase(OP_LE) { + Protect( + if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) + ci->u.l.savedpc++; + else + donextjump(ci); + ) + vmbreak; + } + vmcase(OP_TEST) { + if (GETARG_C(i) ? l_isfalse(ra) : !l_isfalse(ra)) + ci->u.l.savedpc++; + else + donextjump(ci); + vmbreak; + } + vmcase(OP_TESTSET) { + TValue *rb = RB(i); + if (GETARG_C(i) ? l_isfalse(rb) : !l_isfalse(rb)) + ci->u.l.savedpc++; + else { + setobjs2s(L, ra, rb); + donextjump(ci); + } + vmbreak; + } + vmcase(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 */ + if (luaD_precall(L, ra, nresults)) { /* C function? */ + if (nresults >= 0) + L->top = ci->top; /* adjust results */ + Protect((void)0); /* update 'base' */ + } + else { /* Lua function */ + ci = L->ci; + goto newframe; /* restart luaV_execute over new Lua function */ + } + vmbreak; + } + vmcase(OP_TAILCALL) { + int b = GETARG_B(i); + if (b != 0) L->top = ra+b; /* else previous instruction set top */ + lua_assert(GETARG_C(i) - 1 == LUA_MULTRET); + if (luaD_precall(L, ra, LUA_MULTRET)) { /* C function? */ + Protect((void)0); /* update 'base' */ + } + else { + /* tail call: put called frame (n) in place of caller one (o) */ + CallInfo *nci = L->ci; /* called frame */ + CallInfo *oci = nci->previous; /* caller frame */ + StkId nfunc = nci->func; /* called function */ + StkId ofunc = oci->func; /* caller function */ + /* last stack slot filled by 'precall' */ + StkId lim = nci->u.l.base + getproto(nfunc)->numparams; + int aux; + /* close all upvalues from previous call */ + if (cl->p->sizep > 0) luaF_close(L, oci->u.l.base); + /* move new frame into old one */ + for (aux = 0; nfunc + aux < lim; aux++) + setobjs2s(L, ofunc + aux, nfunc + aux); + oci->u.l.base = ofunc + (nci->u.l.base - nfunc); /* correct base */ + oci->top = L->top = ofunc + (L->top - nfunc); /* correct top */ + oci->u.l.savedpc = nci->u.l.savedpc; + oci->callstatus |= CIST_TAIL; /* function was tail called */ + ci = L->ci = oci; /* remove new frame */ + lua_assert(L->top == oci->u.l.base + getproto(ofunc)->maxstacksize); + goto newframe; /* restart luaV_execute over new Lua function */ + } + vmbreak; + } + vmcase(OP_RETURN) { + int b = GETARG_B(i); + if (cl->p->sizep > 0) luaF_close(L, base); + b = luaD_poscall(L, ci, ra, (b != 0 ? b - 1 : cast_int(L->top - ra))); + if (ci->callstatus & CIST_FRESH) /* local 'ci' still from callee */ + return; /* external invocation: return */ + else { /* invocation via reentry: continue execution */ + ci = L->ci; + if (b) L->top = ci->top; + lua_assert(isLua(ci)); + lua_assert(GET_OPCODE(*((ci)->u.l.savedpc - 1)) == OP_CALL); + goto newframe; /* restart luaV_execute over new Lua function */ + } + } + vmcase(OP_FORLOOP) { + if (ttisinteger(ra)) { /* integer loop? */ + lua_Integer step = ivalue(ra + 2); + lua_Integer idx = intop(+, ivalue(ra), step); /* increment index */ + lua_Integer limit = ivalue(ra + 1); + if ((0 < step) ? (idx <= limit) : (limit <= idx)) { + ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ + chgivalue(ra, idx); /* update internal index... */ + setivalue(ra + 3, idx); /* ...and external index */ + } + } + else { /* floating loop */ + lua_Number step = fltvalue(ra + 2); + lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */ + lua_Number limit = fltvalue(ra + 1); + if (luai_numlt(0, step) ? luai_numle(idx, limit) + : luai_numle(limit, idx)) { + ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ + chgfltvalue(ra, idx); /* update internal index... */ + setfltvalue(ra + 3, idx); /* ...and external index */ + } + } + vmbreak; + } + vmcase(OP_FORPREP) { + TValue *init = ra; + TValue *plimit = ra + 1; + TValue *pstep = ra + 2; + lua_Integer ilimit; + int stopnow; + if (ttisinteger(init) && ttisinteger(pstep) && + forlimit(plimit, &ilimit, ivalue(pstep), &stopnow)) { + /* all values are integer */ + lua_Integer initv = (stopnow ? 0 : ivalue(init)); + setivalue(plimit, ilimit); + setivalue(init, intop(-, initv, ivalue(pstep))); + } + else { /* try making all values floats */ + lua_Number ninit; lua_Number nlimit; lua_Number nstep; + if (!tonumber(plimit, &nlimit)) + luaG_runerror(L, "'for' limit must be a number"); + setfltvalue(plimit, nlimit); + if (!tonumber(pstep, &nstep)) + luaG_runerror(L, "'for' step must be a number"); + setfltvalue(pstep, nstep); + if (!tonumber(init, &ninit)) + luaG_runerror(L, "'for' initial value must be a number"); + setfltvalue(init, luai_numsub(L, ninit, nstep)); + } + ci->u.l.savedpc += GETARG_sBx(i); + vmbreak; + } + vmcase(OP_TFORCALL) { + 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 = ci->top; + i = *(ci->u.l.savedpc++); /* go to next instruction */ + ra = RA(i); + lua_assert(GET_OPCODE(i) == OP_TFORLOOP); + goto l_tforloop; + } + vmcase(OP_TFORLOOP) { + l_tforloop: + if (!ttisnil(ra + 1)) { /* continue loop? */ + setobjs2s(L, ra, ra + 1); /* save control variable */ + ci->u.l.savedpc += GETARG_sBx(i); /* jump back */ + } + vmbreak; + } + vmcase(OP_SETLIST) { + int n = GETARG_B(i); + int c = GETARG_C(i); + unsigned int last; + Table *h; + if (n == 0) n = cast_int(L->top - ra) - 1; + if (c == 0) { + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_EXTRAARG); + c = GETARG_Ax(*ci->u.l.savedpc++); + } + h = hvalue(ra); + last = ((c-1)*LFIELDS_PER_FLUSH) + n; + if (last > h->sizearray) /* needs more space? */ + luaH_resizearray(L, h, last); /* preallocate it at once */ + for (; n > 0; n--) { + TValue *val = ra+n; + luaH_setint(L, h, last--, val); + luaC_barrierback(L, h, val); + } + L->top = ci->top; /* correct top (in case of previous open call) */ + vmbreak; + } + vmcase(OP_CLOSURE) { + Proto *p = cl->p->p[GETARG_Bx(i)]; + LClosure *ncl = getcached(p, cl->upvals, base); /* cached closure */ + if (ncl == NULL) /* no match? */ + pushclosure(L, p, cl->upvals, base, ra); /* create a new one */ + else + setclLvalue(L, ra, ncl); /* push cashed closure */ + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_VARARG) { + int b = GETARG_B(i) - 1; /* required results */ + int j; + int n = cast_int(base - ci->func) - cl->p->numparams - 1; + if (n < 0) /* less arguments than parameters? */ + n = 0; /* no vararg arguments */ + if (b < 0) { /* B == 0? */ + b = n; /* get all var. arguments */ + Protect(luaD_checkstack(L, n)); + ra = RA(i); /* previous call may change the stack */ + L->top = ra + n; + } + for (j = 0; j < b && j < n; j++) + setobjs2s(L, ra + j, base - n + j); + for (; j < b; j++) /* complete required results with nil */ + setnilvalue(ra + j); + vmbreak; + } + vmcase(OP_EXTRAARG) { + lua_assert(0); + vmbreak; + } + } + } +} + +/* }================================================================== */ + diff --git a/lua-5.3.3/src/lvm.h b/lua-5.3.3/src/lvm.h new file mode 100644 index 0000000..bcf52d2 --- /dev/null +++ b/lua-5.3.3/src/lvm.h @@ -0,0 +1,113 @@ +/* +** $Id: lvm.h,v 2.40 2016/01/05 16:07:21 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" + + +#if !defined(LUA_NOCVTN2S) +#define cvt2str(o) ttisnumber(o) +#else +#define cvt2str(o) 0 /* no conversion from numbers to strings */ +#endif + + +#if !defined(LUA_NOCVTS2N) +#define cvt2num(o) ttisstring(o) +#else +#define cvt2num(o) 0 /* no conversion from strings to numbers */ +#endif + + +/* +** You can define LUA_FLOORN2I if you want to convert floats to integers +** by flooring them (instead of raising an error if they are not +** integral values) +*/ +#if !defined(LUA_FLOORN2I) +#define LUA_FLOORN2I 0 +#endif + + +#define tonumber(o,n) \ + (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n)) + +#define tointeger(o,i) \ + (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger(o,i,LUA_FLOORN2I)) + +#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2)) + +#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) + + +/* +** fast track for 'gettable': if 't' is a table and 't[k]' is not nil, +** return 1 with 'slot' pointing to 't[k]' (final result). Otherwise, +** return 0 (meaning it will have to check metamethod) with 'slot' +** pointing to a nil 't[k]' (if 't' is a table) or NULL (otherwise). +** 'f' is the raw get function to use. +*/ +#define luaV_fastget(L,t,k,slot,f) \ + (!ttistable(t) \ + ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ + : (slot = f(hvalue(t), k), /* else, do raw access */ \ + !ttisnil(slot))) /* result not nil? */ + +/* +** standard implementation for 'gettable' +*/ +#define luaV_gettable(L,t,k,v) { const TValue *slot; \ + if (luaV_fastget(L,t,k,slot,luaH_get)) { setobj2s(L, v, slot); } \ + else luaV_finishget(L,t,k,v,slot); } + + +/* +** Fast track for set table. If 't' is a table and 't[k]' is not nil, +** call GC barrier, do a raw 't[k]=v', and return true; otherwise, +** return false with 'slot' equal to NULL (if 't' is not a table) or +** 'nil'. (This is needed by 'luaV_finishget'.) Note that, if the macro +** returns true, there is no need to 'invalidateTMcache', because the +** call is not creating a new entry. +*/ +#define luaV_fastset(L,t,k,slot,f,v) \ + (!ttistable(t) \ + ? (slot = NULL, 0) \ + : (slot = f(hvalue(t), k), \ + ttisnil(slot) ? 0 \ + : (luaC_barrierback(L, hvalue(t), v), \ + setobj2t(L, cast(TValue *,slot), v), \ + 1))) + + +#define luaV_settable(L,t,k,v) { const TValue *slot; \ + if (!luaV_fastset(L,t,k,slot,luaH_get,v)) \ + luaV_finishset(L,t,k,v,slot); } + + + +LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2); +LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n); +LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, int mode); +LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key, + StkId val, const TValue *slot); +LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + StkId val, const TValue *slot); +LUAI_FUNC void luaV_finishOp (lua_State *L); +LUAI_FUNC void luaV_execute (lua_State *L); +LUAI_FUNC void luaV_concat (lua_State *L, int total); +LUAI_FUNC lua_Integer luaV_div (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); +LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); + +#endif diff --git a/lua-5.3.3/src/lzio.c b/lua-5.3.3/src/lzio.c new file mode 100644 index 0000000..c9e1f49 --- /dev/null +++ b/lua-5.3.3/src/lzio.c @@ -0,0 +1,68 @@ +/* +** $Id: lzio.c,v 1.37 2015/09/08 15:41:05 roberto Exp $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + +#define lzio_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#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; /* discount char being returned */ + z->p = buff; + return cast_uchar(*(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 (z->n == 0) { /* no bytes in buffer? */ + if (luaZ_fill(z) == EOZ) /* try to read more */ + return n; /* no more input; return number of missing bytes */ + else { + z->n++; /* luaZ_fill consumed first byte; put it back */ + z->p--; + } + } + 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; +} + diff --git a/lua-5.3.3/src/lzio.h b/lua-5.3.3/src/lzio.h new file mode 100644 index 0000000..e7b6f34 --- /dev/null +++ b/lua-5.3.3/src/lzio.h @@ -0,0 +1,66 @@ +/* +** $Id: lzio.h,v 1.31 2015/09/08 15:41:05 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 zgetc(z) (((z)->n--)>0 ? cast_uchar(*(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_buffremove(buff,i) ((buff)->n -= (i)) +#define luaZ_resetbuffer(buff) ((buff)->n = 0) + + +#define luaZ_resizebuffer(L, buff, size) \ + ((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \ + (buff)->buffsize, size), \ + (buff)->buffsize = size) + +#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) + + +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 */ + + + +/* --------- Private Part ------------------ */ + +struct Zio { + size_t n; /* bytes still unread */ + const char *p; /* current position in buffer */ + lua_Reader reader; /* reader function */ + void *data; /* additional data */ + lua_State *L; /* Lua state (for reader) */ +}; + + +LUAI_FUNC int luaZ_fill (ZIO *z); + +#endif diff --git a/orig_sources/lua-5.3.3.tar.gz b/orig_sources/lua-5.3.3.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a7c45a7ffd08401a61341c59338e58bdea239c6e GIT binary patch literal 294290 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

ARQAssZiKu1o0AX3_;oI%~{nKxb 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

ZoKivMT-{YtZTV=&+;>+H=juCx~>1w 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

>E;R;M& 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

g+cwon_Sr&*BBIkl#!o^Et@j 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 N{}*%aYCQm05dh{Z_I3aO literal 0 HcmV?d00001