History

Lua 5.2.0-rc1

Lua Team committed 14 years ago

Commit d74d0e51 parent 8203bab51 files · +1861 −1136Browse files

Unified · Split

51 files
  1. Makefile +2 −2
  2. README +1 −1
  3. doc/alert.png +0 −0
  4. doc/contents.html +9 −11
  5. doc/lua.1 +116 −0
  6. doc/lua.css +2 −3
  7. doc/luac.1 +118 −0
  8. doc/manual.css +5 −2
  9. doc/manual.html +588 −438
  10. doc/readme.html +61 −49
  11. src/Makefile +1 −0
  12. src/lapi.c +88 −37
  13. src/lauxlib.c +31 −10
  14. src/lauxlib.h +31 −2
  15. src/lbaselib.c +45 −35
  16. src/lcode.c +12 −10
  17. src/lcode.h +2 −1
  18. src/lcorolib.c +2 −2
  19. src/lctype.c +4 −1
  20. src/lctype.h +2 −2
  21. src/ldblib.c +4 −7
  22. src/ldebug.c +104 −96
  23. src/ldebug.h +10 −10
  24. src/ldo.c +17 −17
  25. src/ldo.h +2 −2
  26. src/ldump.c +3 −3
  27. src/lgc.c +96 −46
  28. src/lgc.h +1 −5
  29. src/liolib.c +74 −30
  30. src/llex.c +40 −47
  31. src/llimits.h +16 −4
  32. src/lmem.c +2 −2
  33. src/loadlib.c +71 −33
  34. src/lobject.c +6 −4
  35. src/lobject.h +46 −22
  36. src/lopcodes.h +2 −2
  37. src/lparser.c +90 −70
  38. src/lparser.h +6 −7
  39. src/lstate.c +5 −8
  40. src/lstate.h +2 −4
  41. src/lstrlib.c +15 −6
  42. src/ltable.c +25 −36
  43. src/ltable.h +5 −3
  44. src/ltablib.c +2 −2
  45. src/lua.c +39 −12
  46. src/lua.h +7 −10
  47. src/luac.c +3 −4
  48. src/luaconf.h +16 −11
  49. src/lvm.c +29 −20
  50. src/lzio.c +2 −2
  51. src/lzio.h +2 −6
Makefile+2−2
@@ -62,13 +62,13 @@ install: dummy · 61 unmodified lines
62 cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)62 cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN)
63 cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)63 cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC)
64 cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)64 cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB)
65 #cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)65 cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN)
66 66
67uninstall:67uninstall:
68 cd src && cd $(INSTALL_BIN) && $(RM) $(TO_BIN)68 cd src && cd $(INSTALL_BIN) && $(RM) $(TO_BIN)
69 cd src && cd $(INSTALL_INC) && $(RM) $(TO_INC)69 cd src && cd $(INSTALL_INC) && $(RM) $(TO_INC)
70 cd src && cd $(INSTALL_LIB) && $(RM) $(TO_LIB)70 cd src && cd $(INSTALL_LIB) && $(RM) $(TO_LIB)
71 #cd doc && cd $(INSTALL_MAN) && $(RM) $(TO_MAN)71 cd doc && cd $(INSTALL_MAN) && $(RM) $(TO_MAN)
72 72
73local:73local:
74 $(MAKE) install INSTALL_TOP=../install74 $(MAKE) install INSTALL_TOP=../install
README+1−1
@@ -1,5 +1,5 @@
1 1
2This is Lua 5.2 (beta), released on 05 Jul 2011.2This is Lua 5.2, released on 24 Nov 2011.
3 3
4For installation instructions, license details, and4For installation instructions, license details, and
5further information about Lua, see doc/readme.html.5further information about Lua, see doc/readme.html.
doc/alert.png+0−0

Binary file not shown.

doc/contents.html+9−11
@@ -20,11 +20,6 @@ ul { · 19 unmodified lines
20Lua 5.2 Reference Manual20Lua 5.2 Reference Manual
21</H1>21</H1>
22 22
23<P>
24<IMG SRC="alert.png" ALIGN="absbottom" ALT="[!]">
25<EM>This is a beta version of Lua 5.2.
26Some details may change in the final version.</EM>
27
28<P>23<P>
29The reference manual is the official definition of the Lua language.24The reference manual is the official definition of the Lua language.
30For a complete introduction to Lua programming, see the book25For a complete introduction to Lua programming, see the book
@@ -95,7 +90,7 @@ Freely available under the terms of the · 64 unmodified lines
95<UL>90<UL>
96<LI><A HREF="manual.html#4.1">4.1 &ndash; The Stack</A>91<LI><A HREF="manual.html#4.1">4.1 &ndash; The Stack</A>
97<LI><A HREF="manual.html#4.2">4.2 &ndash; Stack Size</A>92<LI><A HREF="manual.html#4.2">4.2 &ndash; Stack Size</A>
98<LI><A HREF="manual.html#4.3">4.3 &ndash; Pseudo-Indices</A>93<LI><A HREF="manual.html#4.3">4.3 &ndash; Valid and Acceptable Indices</A>
99<LI><A HREF="manual.html#4.4">4.4 &ndash; C Closures</A>94<LI><A HREF="manual.html#4.4">4.4 &ndash; C Closures</A>
100<LI><A HREF="manual.html#4.5">4.5 &ndash; Registry</A>95<LI><A HREF="manual.html#4.5">4.5 &ndash; Registry</A>
101<LI><A HREF="manual.html#4.6">4.6 &ndash; Error Handling in C</A>96<LI><A HREF="manual.html#4.6">4.6 &ndash; Error Handling in C</A>
@@ -154,8 +149,8 @@ Freely available under the terms of the · 52 unmodified lines
154<A HREF="manual.html#pdf-error">error</A><BR>149<A HREF="manual.html#pdf-error">error</A><BR>
155<A HREF="manual.html#pdf-getmetatable">getmetatable</A><BR>150<A HREF="manual.html#pdf-getmetatable">getmetatable</A><BR>
156<A HREF="manual.html#pdf-ipairs">ipairs</A><BR>151<A HREF="manual.html#pdf-ipairs">ipairs</A><BR>
157<A HREF="manual.html#pdf-load">load</A><BR>
158<A HREF="manual.html#pdf-loadfile">loadfile</A><BR>152<A HREF="manual.html#pdf-loadfile">loadfile</A><BR>
153<A HREF="manual.html#pdf-load">load</A><BR>
159<A HREF="manual.html#pdf-next">next</A><BR>154<A HREF="manual.html#pdf-next">next</A><BR>
160<A HREF="manual.html#pdf-pairs">pairs</A><BR>155<A HREF="manual.html#pdf-pairs">pairs</A><BR>
161<A HREF="manual.html#pdf-pcall">pcall</A><BR>156<A HREF="manual.html#pdf-pcall">pcall</A><BR>
@@ -406,6 +401,8 @@ Freely available under the terms of the · 244 unmodified lines
406<A HREF="manual.html#lua_rawlen">lua_rawlen</A><BR>401<A HREF="manual.html#lua_rawlen">lua_rawlen</A><BR>
407<A HREF="manual.html#lua_rawset">lua_rawset</A><BR>402<A HREF="manual.html#lua_rawset">lua_rawset</A><BR>
408<A HREF="manual.html#lua_rawseti">lua_rawseti</A><BR>403<A HREF="manual.html#lua_rawseti">lua_rawseti</A><BR>
404<A HREF="manual.html#lua_rawgetp">lua_rawgetp</A><BR>
405<A HREF="manual.html#lua_rawsetp">lua_rawsetp</A><BR>
409<A HREF="manual.html#lua_register">lua_register</A><BR>406<A HREF="manual.html#lua_register">lua_register</A><BR>
410<A HREF="manual.html#lua_remove">lua_remove</A><BR>407<A HREF="manual.html#lua_remove">lua_remove</A><BR>
411<A HREF="manual.html#lua_replace">lua_replace</A><BR>408<A HREF="manual.html#lua_replace">lua_replace</A><BR>
@@ -463,8 +460,8 @@ Freely available under the terms of the · 51 unmodified lines
463<A HREF="manual.html#luaL_buffinitsize">luaL_buffinitsize</A><BR>460<A HREF="manual.html#luaL_buffinitsize">luaL_buffinitsize</A><BR>
464<A HREF="manual.html#luaL_callmeta">luaL_callmeta</A><BR>461<A HREF="manual.html#luaL_callmeta">luaL_callmeta</A><BR>
465<A HREF="manual.html#luaL_checkany">luaL_checkany</A><BR>462<A HREF="manual.html#luaL_checkany">luaL_checkany</A><BR>
466<A HREF="manual.html#luaL_checkint">luaL_checkint</A><BR>
467<A HREF="manual.html#luaL_checkinteger">luaL_checkinteger</A><BR>463<A HREF="manual.html#luaL_checkinteger">luaL_checkinteger</A><BR>
464<A HREF="manual.html#luaL_checkint">luaL_checkint</A><BR>
468<A HREF="manual.html#luaL_checklong">luaL_checklong</A><BR>465<A HREF="manual.html#luaL_checklong">luaL_checklong</A><BR>
469<A HREF="manual.html#luaL_checklstring">luaL_checklstring</A><BR>466<A HREF="manual.html#luaL_checklstring">luaL_checklstring</A><BR>
470<A HREF="manual.html#luaL_checknumber">luaL_checknumber</A><BR>467<A HREF="manual.html#luaL_checknumber">luaL_checknumber</A><BR>
@@ -487,14 +484,15 @@ Freely available under the terms of the · 16 unmodified lines
487<A HREF="manual.html#luaL_len">luaL_len</A><BR>484<A HREF="manual.html#luaL_len">luaL_len</A><BR>
488<A HREF="manual.html#luaL_loadbuffer">luaL_loadbuffer</A><BR>485<A HREF="manual.html#luaL_loadbuffer">luaL_loadbuffer</A><BR>
489<A HREF="manual.html#luaL_loadfile">luaL_loadfile</A><BR>486<A HREF="manual.html#luaL_loadfile">luaL_loadfile</A><BR>
487<A HREF="manual.html#luaL_loadfilex">luaL_loadfilex</A><BR>
490<A HREF="manual.html#luaL_loadstring">luaL_loadstring</A><BR>488<A HREF="manual.html#luaL_loadstring">luaL_loadstring</A><BR>
491<A HREF="manual.html#luaL_newlib">luaL_newlib</A><BR>489<A HREF="manual.html#luaL_newlib">luaL_newlib</A><BR>
492<A HREF="manual.html#luaL_newlibtable">luaL_newlibtable</A><BR>490<A HREF="manual.html#luaL_newlibtable">luaL_newlibtable</A><BR>
493<A HREF="manual.html#luaL_newmetatable">luaL_newmetatable</A><BR>491<A HREF="manual.html#luaL_newmetatable">luaL_newmetatable</A><BR>
494<A HREF="manual.html#luaL_newstate">luaL_newstate</A><BR>492<A HREF="manual.html#luaL_newstate">luaL_newstate</A><BR>
495<A HREF="manual.html#luaL_openlibs">luaL_openlibs</A><BR>493<A HREF="manual.html#luaL_openlibs">luaL_openlibs</A><BR>
496<A HREF="manual.html#luaL_optint">luaL_optint</A><BR>
497<A HREF="manual.html#luaL_optinteger">luaL_optinteger</A><BR>494<A HREF="manual.html#luaL_optinteger">luaL_optinteger</A><BR>
495<A HREF="manual.html#luaL_optint">luaL_optint</A><BR>
498<A HREF="manual.html#luaL_optlong">luaL_optlong</A><BR>496<A HREF="manual.html#luaL_optlong">luaL_optlong</A><BR>
499<A HREF="manual.html#luaL_optlstring">luaL_optlstring</A><BR>497<A HREF="manual.html#luaL_optlstring">luaL_optlstring</A><BR>
500<A HREF="manual.html#luaL_optnumber">luaL_optnumber</A><BR>498<A HREF="manual.html#luaL_optnumber">luaL_optnumber</A><BR>
@@ -522,10 +520,10 @@ Freely available under the terms of the · 21 unmodified lines
522<HR>520<HR>
523<SMALL CLASS="footer">521<SMALL CLASS="footer">
524Last update:522Last update:
525Tue Jun 28 14:53:13 BRT 2011523Wed Nov 23 16:14:28 BRST 2011
526</SMALL>524</SMALL>
527<!--525<!--
528Last change: revised for Lua 5.2.0 (beta)526Last change: revised for Lua 5.2.0
529-->527-->
530 528
531</BODY>529</BODY>
doc/lua.1+116−0
@@ -0,0 +1,116 @@
1.\" $Id: lua.man,v 1.13 2011/11/16 17:16:53 lhf Exp $
2.TH LUA 1 "$Date: 2011/11/16 17:16:53 $"
3.SH NAME
4lua \- Lua interpreter
5.SH SYNOPSIS
6.B lua
7[
8.I options
9]
10[
11.I script
12[
13.I args
14]
15]
16.SH DESCRIPTION
17.B lua
18is the standalone Lua interpreter.
19It loads and executes Lua programs,
20either in textual source form or
21in precompiled binary form.
22(Precompiled binaries are output by
23.BR luac ,
24the Lua compiler.)
25.B lua
26can be used as a batch interpreter and also interactively.
27.LP
28The given
29.I options
30are handled in order and then
31the Lua program in file
32.I script
33is loaded and executed.
34The given
35.I args
36are available to
37.I script
38as strings in a global table named
39.BR arg .
40If no options or arguments are given,
41then
42.B "\-v \-i"
43is assumed when the standard input is a terminal;
44otherwise,
45.B "\-"
46is assumed.
47.LP
48In interactive mode,
49.B lua
50prompts the user,
51reads lines from the standard input,
52and executes them as they are read.
53If a line does not contain a complete statement,
54then a secondary prompt is displayed and
55lines are read until a complete statement is formed or
56a syntax error is found.
57If a line starts with
58.BR '=' ,
59then
60.B lua
61evaluates and displays
62the values of the expressions in the remainder of the line.
63.LP
64At the very start,
65before even handling the command line,
66.B lua
67checks the contents of the environment variables
68.B LUA_INIT_5_2
69or
70.BR LUA_INIT ,
71in that order.
72If the contents is of the form
73.RI '@ filename ',
74then
75.I filename
76is executed.
77Otherwise, the string is assumed to be a Lua statement and is executed.
78.SH OPTIONS
79.TP
80.BI \-e " stat"
81execute statement
82.IR stat .
83.TP
84.B \-i
85enter interactive mode after executing
86.IR script .
87.TP
88.BI \-l " name"
89execute the equivalent of
90.IB name =require(' name ')
91before executing
92.IR script .
93.TP
94.B \-v
95show version information.
96.TP
97.B \-E
98ignore environment variables.
99.TP
100.B \-\-
101stop handling options.
102.TP
103.B \-
104stop handling options and execute the standard input as a file.
105.SH "SEE ALSO"
106.BR luac (1)
107.br
108The documentation at lua.org,
109especially section 7 of the reference manual.
110.SH DIAGNOSTICS
111Error messages should be self explanatory.
112.SH AUTHORS
113R. Ierusalimschy,
114L. H. de Figueiredo,
115W. Celes
116.\" EOF
doc/lua.css+2−3
@@ -1,7 +1,6 @@
1body {1body {
2 color: #000000 ;2 color: #000000 ;
3 background-color: #FFFFFF ;3 background-color: #FFFFFF ;
4 font-family: sans-serif ;
5 font-family: Helvetica, Arial, sans-serif ;4 font-family: Helvetica, Arial, sans-serif ;
6 text-align: justify ;5 text-align: justify ;
7 margin-right: 20px ;6 margin-right: 20px ;
@@ -18,12 +17,13 @@ h2 { · 10 unmodified lines
18 padding-top: 0.4em ;17 padding-top: 0.4em ;
19 padding-bottom: 0.4em ;18 padding-bottom: 0.4em ;
20 padding-left: 20px ;19 padding-left: 20px ;
20 padding-right: 20px ;
21 margin-left: -20px ;21 margin-left: -20px ;
22 background-color: #E0E0FF ;22 background-color: #E0E0FF ;
23}23}
24 24
25h3 {25h3 {
26 padding-left: 8px ;26 padding-left: 0.5em ;
27 border-left: solid #E0E0FF 1em ;27 border-left: solid #E0E0FF 1em ;
28}28}
29 29
@@ -76,7 +76,6 @@ input[type=text] { · 46 unmodified lines
76 -moz-border-radius: 2em ;76 -moz-border-radius: 2em ;
77 background-image: url('images/search.png') ;77 background-image: url('images/search.png') ;
78 background-repeat: no-repeat;78 background-repeat: no-repeat;
79 background-position: left center ;
80 background-position: 4px center ;79 background-position: 4px center ;
81 padding-left: 20px ;80 padding-left: 20px ;
82 height: 2em ;81 height: 2em ;
doc/luac.1+118−0
@@ -0,0 +1,118 @@
1.\" $Id: luac.man,v 1.29 2011/11/16 13:53:40 lhf Exp $
2.TH LUAC 1 "$Date: 2011/11/16 13:53:40 $"
3.SH NAME
4luac \- Lua compiler
5.SH SYNOPSIS
6.B luac
7[
8.I options
9] [
10.I filenames
11]
12.SH DESCRIPTION
13.B luac
14is the Lua compiler.
15It translates programs written in the Lua programming language
16into binary files containing precompiled chunks
17that can be later loaded and executed.
18.LP
19The main advantages of precompiling chunks are:
20faster loading,
21protecting source code from accidental user changes,
22and
23off-line syntax checking.
24Precompiling does not imply faster execution
25because in Lua chunks are always compiled into bytecodes before being executed.
26.B luac
27simply allows those bytecodes to be saved in a file for later execution.
28Precompiled chunks are not necessarily smaller than the corresponding source.
29The main goal in precompiling is faster loading.
30.LP
31In the command line,
32you can mix
33text files containing Lua source and
34binary files containing precompiled chunks.
35.B luac
36produces a single output file containing the combined bytecodes
37for all files given.
38Executing the combined file is equivalent to executing the given files.
39By default,
40the output file is named
41.BR luac.out ,
42but you can change this with the
43.B \-o
44option.
45.LP
46Precompiled chunks are
47.I not
48portable across different architectures.
49Moreover,
50the internal format of precompiled chunks
51is likely to change when a new version of Lua is released.
52Make sure you save the source files of all Lua programs that you precompile.
53.LP
54.SH OPTIONS
55.TP
56.B \-l
57produce a listing of the compiled bytecode for Lua's virtual machine.
58Listing bytecodes is useful to learn about Lua's virtual machine.
59If no files are given, then
60.B luac
61loads
62.B luac.out
63and lists its contents.
64Use
65.B \-l \-l
66for a full listing.
67.TP
68.BI \-o " file"
69output to
70.IR file ,
71instead of the default
72.BR luac.out .
73(You can use
74.B "'\-'"
75for standard output,
76but not on platforms that open standard output in text mode.)
77The output file may be one of the given files because
78all files are loaded before the output file is written.
79Be careful not to overwrite precious files.
80.TP
81.B \-p
82load files but do not generate any output file.
83Used mainly for syntax checking and for testing precompiled chunks:
84corrupted files will probably generate errors when loaded.
85If no files are given, then
86.B luac
87loads
88.B luac.out
89and tests its contents.
90No messages are displayed if the file loads without errors.
91.TP
92.B \-s
93strip debug information before writing the output file.
94This saves some space in very large chunks,
95but if errors occur when running a stripped chunk,
96then the error messages may not contain the full information they usually do.
97In particular,
98line numbers and names of local variables are lost.
99.TP
100.B \-v
101show version information.
102.TP
103.B \-\-
104stop handling options.
105.TP
106.B \-
107stop handling options and process standard input.
108.SH "SEE ALSO"
109.BR lua (1)
110.br
111The documentation at lua.org.
112.SH DIAGNOSTICS
113Error messages should be self explanatory.
114.SH AUTHORS
115R. Ierusalimschy,
116L. H. de Figueiredo,
117W. Celes
118.\" EOF
doc/manual.css+5−2
@@ -2,13 +2,16 @@ h3 code { · 1 unmodified line
2 font-family: inherit ;2 font-family: inherit ;
3}3}
4 4
5pre {5pre, code {
6 font-size: 105% ;6 font-size: 12pt ;
7}7}
8 8
9span.apii {9span.apii {
10 float: right ;10 float: right ;
11 font-family: inherit ;11 font-family: inherit ;
12 font-style: normal ;
13 font-size: small ;
14 color: gray ;
12}15}
13 16
14p+h1, ul+h1 {17p+h1, ul+h1 {
doc/manual.html+588−438
@@ -16,11 +16,6 @@ · 15 unmodified lines
16Lua 5.2 Reference Manual16Lua 5.2 Reference Manual
17</h1>17</h1>
18 18
19<IMG SRC="alert.png" ALIGN="absbottom" ALT="[!]">
20<EM>This is a beta version of Lua 5.2.
21Some details may change in the final version.</EM>
22<P>
23
24by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes19by Roberto Ierusalimschy, Luiz Henrique de Figueiredo, Waldemar Celes
25<p>20<p>
26<small>21<small>
@@ -38,7 +33,7 @@ Freely available under the terms of the · 11 unmodified lines
38<!-- ====================================================================== -->33<!-- ====================================================================== -->
39<p>34<p>
40 35
41<!-- $Id: manual.of,v 1.86 2011/07/08 20:00:45 roberto Exp $ -->36<!-- $Id: manual.of,v 1.88 2011/11/24 13:23:53 roberto Exp $ -->
42 37
43 38
44 39
@@ -51,8 +46,8 @@ general procedural programming with data description · 6 unmodified lines
51facilities.46facilities.
52It also offers good support for object-oriented programming,47It also offers good support for object-oriented programming,
53functional programming, and data-driven programming.48functional programming, and data-driven programming.
54Lua is intended to be used as a powerful, light-weight49Lua is intended to be used as a powerful, lightweight,
55scripting language for any program that needs one.50embeddable scripting language for any program that needs one.
56Lua is implemented as a library, written in <em>clean C</em>,51Lua is implemented as a library, written in <em>clean C</em>,
57the common subset of Standard&nbsp;C and C++.52the common subset of Standard&nbsp;C and C++.
58 53
@@ -86,14 +81,14 @@ this document is dry in places. · 27 unmodified lines
86For a discussion of the decisions behind the design of Lua,81For a discussion of the decisions behind the design of Lua,
87see the technical papers available at Lua's web site.82see the technical papers available at Lua's web site.
88For a detailed introduction to programming in Lua,83For a detailed introduction to programming in Lua,
89see Roberto's book, <em>Programming in Lua</em> (second edition).84see Roberto's book, <em>Programming in Lua</em>.
90 85
91 86
92 87
93<h1>2 &ndash; <a name="2">Basic Concepts</a></h1>88<h1>2 &ndash; <a name="2">Basic Concepts</a></h1>
94 89
95<p>90<p>
96This section describes some basic concepts of the language.91This section describes the basic concepts of the language.
97 92
98 93
99 94
@@ -148,11 +143,14 @@ functions written in C · 48 unmodified lines
148<p>143<p>
149The type <em>userdata</em> is provided to allow arbitrary C&nbsp;data to144The type <em>userdata</em> is provided to allow arbitrary C&nbsp;data to
150be stored in Lua variables.145be stored in Lua variables.
151This type corresponds to a block of raw memory146A userdata value is a pointer to a block of raw memory.
152and has no pre-defined operations in Lua,147There are two kinds of userdata:
148full userdata, where the block of memory is managed by Lua,
149and light userdata, where the block of memory is managed by the host.
150Userdata has no predefined operations in Lua,
153except assignment and identity test.151except assignment and identity test.
154However, by using <em>metatables</em>,152By using <em>metatables</em>,
155the programmer can define operations for userdata values153the programmer can define operations for full userdata values
156(see <a href="#2.4">&sect;2.4</a>).154(see <a href="#2.4">&sect;2.4</a>).
157Userdata values cannot be created or modified in Lua,155Userdata values cannot be created or modified in Lua,
158only through the C&nbsp;API.156only through the C&nbsp;API.
@@ -200,7 +198,7 @@ which is called the length of the sequence (see <a href="#3.4.6">&sect;3.4.6</a> · 41 unmodified lines
200 198
201<p>199<p>
202Like indices,200Like indices,
203the value of a table field can be of any type.201the values of table fields can be of any type.
204In particular,202In particular,
205because functions are first-class values,203because functions are first-class values,
206table fields can contain functions.204table fields can contain functions.
@@ -227,7 +225,7 @@ these operations do not imply any kind of copy. · 20 unmodified lines
227 225
228<p>226<p>
229The library function <a href="#pdf-type"><code>type</code></a> returns a string describing the type227The library function <a href="#pdf-type"><code>type</code></a> returns a string describing the type
230of a given value.228of a given value (see <a href="#6.1">&sect;6.1</a>).
231 229
232 230
233 231
@@ -239,8 +237,8 @@ of a given value. · 5 unmodified lines
239As will be discussed in <a href="#3.2">&sect;3.2</a> and <a href="#3.3.3">&sect;3.3.3</a>,237As will be discussed in <a href="#3.2">&sect;3.2</a> and <a href="#3.3.3">&sect;3.3.3</a>,
240any reference to a global name <code>var</code> is syntactically translated238any reference to a global name <code>var</code> is syntactically translated
241to <code>_ENV.var</code>.239to <code>_ENV.var</code>.
242Moreover, every chunk is compiled in the scope of an external240Moreover, every chunk is compiled in the scope of
243variable called <code>_ENV</code> (see <a href="#3.3.2">&sect;3.3.2</a>),241an external local variable called <code>_ENV</code> (see <a href="#3.3.2">&sect;3.3.2</a>),
244so <code>_ENV</code> itself is never a global name in a chunk.242so <code>_ENV</code> itself is never a global name in a chunk.
245 243
246 244
@@ -252,12 +250,11 @@ In particular, · 5 unmodified lines
252you can define new variables and parameters with that name.250you can define new variables and parameters with that name.
253Each reference to a global name uses the <code>_ENV</code> that is251Each reference to a global name uses the <code>_ENV</code> that is
254visible at that point in the program,252visible at that point in the program,
255following the usual visibility rules of Lua.253following the usual visibility rules of Lua (see <a href="#3.5">&sect;3.5</a>).
256 254
257 255
258<p>256<p>
259Any table used as the value of <code>_ENV</code> is usually called257Any table used as the value of <code>_ENV</code> is called an <em>environment</em>.
260an <em>environment</em>.
261 258
262 259
263<p>260<p>
@@ -268,13 +265,14 @@ In Lua, the variable <a href="#pdf-_G"><code>_G</code></a> is initialized with t · 4 unmodified lines
268 265
269<p>266<p>
270When Lua compiles a chunk,267When Lua compiles a chunk,
271it initializes the value of its <code>_ENV</code> variable268it initializes the value of its <code>_ENV</code> upvalue
272with the global environment (see <a href="#pdf-load"><code>load</code></a>).269with the global environment (see <a href="#pdf-load"><code>load</code></a>).
273Therefore, by default,270Therefore, by default,
274global variables in Lua code refer to entries in the global environment.271global variables in Lua code refer to entries in the global environment.
275Moreover, all standard libraries are loaded in the global environment,272Moreover, all standard libraries are loaded in the global environment
276and several functions there operate on that environment.273and several functions there operate on that environment.
277You can use <a href="#pdf-load"><code>load</code></a> to load a chunk with a different environment.274You can use <a href="#pdf-load"><code>load</code></a> (or <a href="#pdf-loadfile"><code>loadfile</code></a>)
275to load a chunk with a different environment.
278(In C, you have to load the chunk and then change the value276(In C, you have to load the chunk and then change the value
279of its first upvalue.)277of its first upvalue.)
280 278
@@ -325,7 +323,7 @@ any value for the error object. · 44 unmodified lines
325 323
326<p>324<p>
327When you use <a href="#pdf-xpcall"><code>xpcall</code></a> or <a href="#lua_pcall"><code>lua_pcall</code></a>,325When you use <a href="#pdf-xpcall"><code>xpcall</code></a> or <a href="#lua_pcall"><code>lua_pcall</code></a>,
328you may give an <em>message handler</em>326you may give a <em>message handler</em>
329to be called in case of errors.327to be called in case of errors.
330This function is called with the original error message328This function is called with the original error message
331and returns a new error message.329and returns a new error message.
@@ -389,8 +387,8 @@ but the string library sets a metatable for the string type (see <a href="#6.4"> · 57 unmodified lines
389<p>387<p>
390A metatable controls how an object behaves in arithmetic operations,388A metatable controls how an object behaves in arithmetic operations,
391order comparisons, concatenation, length operation, and indexing.389order comparisons, concatenation, length operation, and indexing.
392A metatable also can define a function to be called when a userdata390A metatable also can define a function to be called
393is garbage collected.391when a userdata or a table is garbage collected.
394When Lua performs one of these operations over a value,392When Lua performs one of these operations over a value,
395it checks whether this value has a metatable with the corresponding event.393it checks whether this value has a metatable with the corresponding event.
396If so, the value associated with that key (the metamethod)394If so, the value associated with that key (the metamethod)
@@ -427,8 +425,8 @@ This should be read as · 30 unmodified lines
427 rawget(getmetatable(obj) or {}, event)425 rawget(getmetatable(obj) or {}, event)
428</pre><p>426</pre><p>
429 427
430That is, the access to a metamethod does not invoke other metamethods,428This means that the access to a metamethod does not invoke other metamethods,
431and the access to objects with no metatables does not fail429and access to objects with no metatables does not fail
432(it simply results in <b>nil</b>).430(it simply results in <b>nil</b>).
433 431
434 432
@@ -590,13 +588,17 @@ The function <code>getequalhandler</code> defines how Lua chooses a metamethod · 155 unmodified lines
590for equality.588for equality.
591A metamethod is selected only when both values589A metamethod is selected only when both values
592being compared have the same type590being compared have the same type
593and the same metamethod for the selected operation.591and the same metamethod for the selected operation,
592and the values are either tables or full userdata.
594 593
595<pre>594<pre>
596 function getequalhandler (op1, op2, event)595 function getequalhandler (op1, op2)
597 if type(op1) ~= type(op2) then return nil end596 if type(op1) ~= type(op2) or
598 local mm1 = metatable(op1)[event]597 (type(op1) ~= "table" and type(op1) ~= "userdata") then
599 local mm2 = metatable(op2)[event]598 return nil -- different values
599 end
600 local mm1 = metatable(op1).__eq
601 local mm2 = metatable(op2).__eq
600 if mm1 == mm2 then return mm1 else return nil end602 if mm1 == mm2 then return mm1 else return nil end
601 end603 end
602</pre><p>604</pre><p>
@@ -604,21 +606,19 @@ The "eq" event is defined as follows: · 1 unmodified line
604 606
605<pre>607<pre>
606 function eq_event (op1, op2)608 function eq_event (op1, op2)
607 if type(op1) ~= type(op2) then -- different types?
608 return false -- different values
609 end
610 if op1 == op2 then -- primitive equal?609 if op1 == op2 then -- primitive equal?
611 return true -- values are equal610 return true -- values are equal
612 end611 end
613 -- try metamethod612 -- try metamethod
614 local h = getequalhandler(op1, op2, "__eq")613 local h = getequalhandler(op1, op2)
615 if h then614 if h then
616 return (h(op1, op2))615 return not not h(op1, op2)
617 else616 else
618 return false617 return false
619 end618 end
620 end619 end
621</pre><p>620</pre><p>
621Note that the result is always a boolean.
622</li>622</li>
623 623
624<li><b>"lt": </b>624<li><b>"lt": </b>
@@ -634,13 +634,14 @@ the <code>&lt;</code> operation. · 9 unmodified lines
634 else634 else
635 local h = getbinhandler(op1, op2, "__lt")635 local h = getbinhandler(op1, op2, "__lt")
636 if h then636 if h then
637 return (h(op1, op2))637 return not not h(op1, op2)
638 else638 else
639 error(&middot;&middot;&middot;)639 error(&middot;&middot;&middot;)
640 end640 end
641 end641 end
642 end642 end
643</pre><p>643</pre><p>
644Note that the result is always a boolean.
644</li>645</li>
645 646
646<li><b>"le": </b>647<li><b>"le": </b>
@@ -656,7 +657,7 @@ the <code>&lt;=</code> operation. · 9 unmodified lines
656 else657 else
657 local h = getbinhandler(op1, op2, "__le")658 local h = getbinhandler(op1, op2, "__le")
658 if h then659 if h then
659 return (h(op1, op2))660 return not not h(op1, op2)
660 else661 else
661 h = getbinhandler(op1, op2, "__lt")662 h = getbinhandler(op1, op2, "__lt")
662 if h then663 if h then
@@ -671,6 +672,11 @@ the <code>&lt;=</code> operation. · 8 unmodified lines
671Note that, in the absence of a "le" metamethod,672Note that, in the absence of a "le" metamethod,
672Lua tries the "lt", assuming that <code>a &lt;= b</code> is673Lua tries the "lt", assuming that <code>a &lt;= b</code> is
673equivalent to <code>not (b &lt; a)</code>.674equivalent to <code>not (b &lt; a)</code>.
675
676
677<p>
678As with the other comparison operators,
679the result is always a boolean.
674</li>680</li>
675 681
676<li><b>"index": </b>682<li><b>"index": </b>
@@ -770,7 +776,7 @@ Lua manages memory automatically by running · 93 unmodified lines
770a <em>garbage collector</em> to collect all <em>dead objects</em>776a <em>garbage collector</em> to collect all <em>dead objects</em>
771(that is, objects that are no longer accessible from Lua).777(that is, objects that are no longer accessible from Lua).
772All memory used by Lua is subject to automatic management:778All memory used by Lua is subject to automatic management:
773tables, userdata, functions, threads, strings, etc.779strings, tables, userdata, functions, threads, internal structures, etc.
774 780
775 781
776<p>782<p>
@@ -819,10 +825,25 @@ memory usage. · 42 unmodified lines
819<p>825<p>
820You can change these numbers by calling <a href="#lua_gc"><code>lua_gc</code></a> in C826You can change these numbers by calling <a href="#lua_gc"><code>lua_gc</code></a> in C
821or <a href="#pdf-collectgarbage"><code>collectgarbage</code></a> in Lua.827or <a href="#pdf-collectgarbage"><code>collectgarbage</code></a> in Lua.
822With these functions you can also control828You can also use these functions to control
823the collector directly (e.g., stop and restart it).829the collector directly (e.g., stop and restart it).
824 830
825 831
832<p>
833As an experimental feature in Lua 5.2,
834you can change the collector's operation mode
835from incremental to <em>generational</em>.
836A <em>generational collector</em> assumes that most objects die young,
837and therefore it traverses only young (recently created) objects.
838This behavior can reduce the time used by the collector,
839but also increases memory usage (as old dead objects may accumulate).
840To mitigate this second problem,
841from time to time the generational collector performs a full collection.
842Remember that this is an experimental feature;
843you are welcome to try it,
844but check your gains.
845
846
826 847
827<h3>2.5.1 &ndash; <a name="2.5.1">Garbage-Collection Metamethods</a></h3>848<h3>2.5.1 &ndash; <a name="2.5.1">Garbage-Collection Metamethods</a></h3>
828 849
@@ -879,11 +900,17 @@ the execution of the regular code. · 50 unmodified lines
879 900
880 901
881<p>902<p>
882Because the object being collected must still be used by the finalizer 903Because the object being collected must still be used by the finalizer,
883and even <em>resurrected</em>904it (and other objects accessible only through it)
884(e.g., stored by the finalizer in a global variable),905must be <em>resurrected</em> by Lua.
885the object memory is freed only when it becomes completely inaccessible906Usually, this resurrection is transient,
886(that is, in the next garbage-collection cycle unless it was resurrected).907and the object memory is freed in the next garbage-collection cycle.
908However, if the finalizer stores the object in some global place
909(e.g., a global variable),
910then there is a permanent resurrection.
911In any case,
912the object memory is freed only when it becomes completely inaccessible;
913its finalizer will never be called twice.
887 914
888 915
889 916
@@ -927,32 +954,42 @@ the pair is removed. · 37 unmodified lines
927 954
928 955
929<p>956<p>
930After you use a table as a metatable,957Any change in the weakness of a table may take effect only
931you should not change the value of its <code>__mode</code> field.958at the next collect cycle.
932Otherwise, the weak behavior of the tables controlled by this959In particular, if you change the weakness to a stronger mode,
933metatable is undefined.960Lua may still collect some items from that table
961before the change takes effect.
934 962
935 963
936<p>964<p>
937Only objects that have an explicit construction965Only objects that have an explicit construction
938can be removed from weak tables.966are removed from weak tables.
939Values, such as numbers and booleans,967Values, such as numbers and light C functions,
940are not subject to garbage collection,968are not subject to garbage collection,
941and therefore are not removed from weak tables969and therefore are not removed from weak tables
942(unless its associated value is collected).970(unless its associated value is collected).
943Lua treats strings and light C functions as non-object values.971Although strings are subject to garbage collection,
972they do not have an explicit construction,
973and therefore are not removed from weak tables.
944 974
945 975
946<p>976<p>
947Objects marked for finalization have a special behavior in weak tables.977Resurrected objects
948When a marked object is a value in a weak table,978(that is, objects being finalized
949it is removed from the table before running its finalizer.979and objects accessible only through objects being finalized)
950However, when it is a key,980have a special behavior in weak tables.
951it is removed from the table only after running its finalizer.981They are removed from weak values before running their finalizers,
982but are removed from weak keys only in the next collection
983after running their finalizers, when such objects are actually freed.
952This behavior allows the finalizer to access properties984This behavior allows the finalizer to access properties
953associated with the object through weak tables.985associated with the object through weak tables.
954 986
955 987
988<p>
989If a weak table is among the resurrected objects in a collection cycle,
990it may not be properly cleared until the next cycle.
991
992
956 993
957 994
958 995
@@ -1060,7 +1097,6 @@ When you run it, it produces the following output: · 101 unmodified lines
1060<pre>1097<pre>
1061 co-body 1 101098 co-body 1 10
1062 foo 21099 foo 2
1063
1064 main true 41100 main true 4
1065 co-body r1101 co-body r
1066 main true 11 -91102 main true 11 -9
@@ -1090,7 +1126,7 @@ and what their combinations mean. · 23 unmodified lines
1090 1126
1091 1127
1092<p>1128<p>
1093The language constructs will be explained using the usual extended BNF notation,1129Language constructs will be explained using the usual extended BNF notation,
1094in which1130in which
1095{<em>a</em>}&nbsp;means&nbsp;0 or more <em>a</em>'s, and1131{<em>a</em>}&nbsp;means&nbsp;0 or more <em>a</em>'s, and
1096[<em>a</em>]&nbsp;means an optional <em>a</em>.1132[<em>a</em>]&nbsp;means an optional <em>a</em>.
@@ -1176,7 +1212,7 @@ into the string contents. · 79 unmodified lines
1176 1212
1177 1213
1178<p>1214<p>
1179A character in a literal string can also be specified by its numerical value.1215A byte in a literal string can also be specified by its numerical value.
1180This can be done with the escape sequence <code>\x<em>XX</em></code>,1216This can be done with the escape sequence <code>\x<em>XX</em></code>,
1181where <em>XX</em> is a sequence of exactly two hexadecimal digits,1217where <em>XX</em> is a sequence of exactly two hexadecimal digits,
1182or with the escape sequence <code>\<em>ddd</em></code>,1218or with the escape sequence <code>\<em>ddd</em></code>,
@@ -1407,13 +1443,13 @@ even if it does not use that variable. · 224 unmodified lines
1407<p>1443<p>
1408A chunk can be stored in a file or in a string inside the host program.1444A chunk can be stored in a file or in a string inside the host program.
1409To execute a chunk,1445To execute a chunk,
1410Lua first pre-compiles the chunk into instructions for a virtual machine,1446Lua first precompiles the chunk into instructions for a virtual machine,
1411and then it executes the compiled code1447and then it executes the compiled code
1412with an interpreter for the virtual machine.1448with an interpreter for the virtual machine.
1413 1449
1414 1450
1415<p>1451<p>
1416Chunks can also be pre-compiled into binary form;1452Chunks can also be precompiled into binary form;
1417see program <code>luac</code> for details.1453see program <code>luac</code> for details.
1418Programs in source and compiled forms are interchangeable;1454Programs in source and compiled forms are interchangeable;
1419Lua automatically detects the file type and acts accordingly.1455Lua automatically detects the file type and acts accordingly.
@@ -1555,7 +1591,7 @@ enter into the scope of a local variable. · 135 unmodified lines
1555 1591
1556 1592
1557<p>1593<p>
1558Both labels and empty statements are called <em>void statements</em>,1594Labels and empty statements are called <em>void statements</em>,
1559as they perform no actions.1595as they perform no actions.
1560 1596
1561 1597
@@ -1806,14 +1842,13 @@ and the unary <em>length operator</em> (see <a href="#3.4.6">&sect;3.4.6</a>). · 244 unmodified lines
1806 1842
1807<p>1843<p>
1808Both function calls and vararg expressions can result in multiple values.1844Both function calls and vararg expressions can result in multiple values.
1809If an expression is used as a statement1845If a function call is used as a statement (see <a href="#3.3.6">&sect;3.3.6</a>),
1810(only possible for function calls (see <a href="#3.3.6">&sect;3.3.6</a>)),
1811then its return list is adjusted to zero elements,1846then its return list is adjusted to zero elements,
1812thus discarding all returned values.1847thus discarding all returned values.
1813If an expression is used as the last (or the only) element1848If an expression is used as the last (or the only) element
1814of a list of expressions,1849of a list of expressions,
1815then no adjustment is made1850then no adjustment is made
1816(unless the call is enclosed in parentheses).1851(unless the expression is enclosed in parentheses).
1817In all other contexts,1852In all other contexts,
1818Lua adjusts the result list to one element,1853Lua adjusts the result list to one element,
1819discarding all values except the first one.1854discarding all values except the first one.
@@ -1881,8 +1916,7 @@ Lua provides automatic conversion between · 61 unmodified lines
1881string and number values at run time.1916string and number values at run time.
1882Any arithmetic operation applied to a string tries to convert1917Any arithmetic operation applied to a string tries to convert
1883this string to a number, following the rules of the Lua lexer.1918this string to a number, following the rules of the Lua lexer.
1884(The string may have leading and trailing spaces,1919(The string may have leading and trailing spaces and a sign.)
1885plus an optional sign.)
1886Conversely, whenever a number is used where a string is expected,1920Conversely, whenever a number is used where a string is expected,
1887the number is converted to a string, in a reasonable format.1921the number is converted to a string, in a reasonable format.
1888For complete control over how numbers are converted to strings,1922For complete control over how numbers are converted to strings,
@@ -2254,8 +2288,8 @@ contains references to <code>f</code>.) · 365 unmodified lines
2254<p>2288<p>
2255A function definition is an executable expression,2289A function definition is an executable expression,
2256whose value has type <em>function</em>.2290whose value has type <em>function</em>.
2257When Lua pre-compiles a chunk,2291When Lua precompiles a chunk,
2258all its function bodies are pre-compiled too.2292all its function bodies are precompiled too.
2259Then, whenever Lua executes the function definition,2293Then, whenever Lua executes the function definition,
2260the function is <em>instantiated</em> (or <em>closed</em>).2294the function is <em>instantiated</em> (or <em>closed</em>).
2261This function instance (or <em>closure</em>)2295This function instance (or <em>closure</em>)
@@ -2272,9 +2306,9 @@ initialized with the argument values: · 10 unmodified lines
2272When a function is called,2306When a function is called,
2273the list of arguments is adjusted to2307the list of arguments is adjusted to
2274the length of the list of parameters,2308the length of the list of parameters,
2275unless the function is a variadic or <em>vararg function</em>,2309unless the function is a <em>vararg function</em>,
2276which is2310which is indicated by three dots ('<code>...</code>')
2277indicated by three dots ('<code>...</code>') at the end of its parameter list.2311at the end of its parameter list.
2278A vararg function does not adjust its argument list;2312A vararg function does not adjust its argument list;
2279instead, it collects all extra arguments and supplies them2313instead, it collects all extra arguments and supplies them
2280to the function through a <em>vararg expression</em>,2314to the function through a <em>vararg expression</em>,
@@ -2425,7 +2459,8 @@ are declared in the header file <a name="pdf-lua.h"><code>lua.h</code></a>. · 144 unmodified lines
2425<p>2459<p>
2426Even when we use the term "function",2460Even when we use the term "function",
2427any facility in the API may be provided as a macro instead.2461any facility in the API may be provided as a macro instead.
2428All such macros use each of their arguments exactly once2462Except where stated otherwise,
2463all such macros use each of their arguments exactly once
2429(except for the first argument, which is always a Lua state),2464(except for the first argument, which is always a Lua state),
2430and so do not generate any hidden side-effects.2465and so do not generate any hidden side-effects.
2431 2466
@@ -2434,8 +2469,7 @@ and so do not generate any hidden side-effects. · 2 unmodified lines
2434As in most C&nbsp;libraries,2469As in most C&nbsp;libraries,
2435the Lua API functions do not check their arguments for validity or consistency.2470the Lua API functions do not check their arguments for validity or consistency.
2436However, you can change this behavior by compiling Lua2471However, you can change this behavior by compiling Lua
2437with a proper definition for the macro <a name="pdf-luai_apicheck"><code>luai_apicheck</code></a>,2472with the macro <a name="pdf-LUA_USE_APICHECK"><code>LUA_USE_APICHECK</code></a> defined.
2438in file <code>luaconf.h</code>.
2439 2473
2440 2474
2441 2475
@@ -2472,10 +2506,6 @@ index&nbsp;<em>n</em> represents the last element; · 30 unmodified lines
2472index&nbsp;-1 also represents the last element2506index&nbsp;-1 also represents the last element
2473(that is, the element at the&nbsp;top)2507(that is, the element at the&nbsp;top)
2474and index <em>-n</em> represents the first element.2508and index <em>-n</em> represents the first element.
2475We say that an index is <em>valid</em>
2476if it lies between&nbsp;1 and the stack top
2477(that is, if <code>1 &le; abs(index) &le; top</code>).
2478
2479 2509
2480 2510
2481 2511
@@ -2494,7 +2524,7 @@ to ensure that the stack has extra slots when pushing new elements. · 12 unmodified lines
2494 2524
2495<p>2525<p>
2496Whenever Lua calls C,2526Whenever Lua calls C,
2497it ensures that at least <a name="pdf-LUA_MINSTACK"><code>LUA_MINSTACK</code></a> stack positions are available.2527it ensures that the stack has at least <a name="pdf-LUA_MINSTACK"><code>LUA_MINSTACK</code></a> extra slots.
2498<code>LUA_MINSTACK</code> is defined as 20,2528<code>LUA_MINSTACK</code> is defined as 20,
2499so that usually you do not have to worry about stack space2529so that usually you do not have to worry about stack space
2500unless your code has loops pushing elements onto the stack.2530unless your code has loops pushing elements onto the stack.
@@ -2509,33 +2539,66 @@ So, before pushing anything in the stack after such a call · 8 unmodified lines
2509you should use <a href="#lua_checkstack"><code>lua_checkstack</code></a>.2539you should use <a href="#lua_checkstack"><code>lua_checkstack</code></a>.
2510 2540
2511 2541
2542
2543
2544
2545<h2>4.3 &ndash; <a name="4.3">Valid and Acceptable Indices</a></h2>
2546
2512<p>2547<p>
2513Most query functions accept as indices any value inside the2548Any function in the API that receives stack indices
2514available stack space, that is, indices up to the maximum stack size2549works only with <em>valid indices</em> or <em>acceptable indices</em>.
2515that you have set through <a href="#lua_checkstack"><code>lua_checkstack</code></a>.2550
2516Such indices are called <em>acceptable indices</em>.2551
2517More formally, we define an <em>acceptable index</em>2552<p>
2553A <em>valid index</em> is an index that refers to a
2554valid position within the stack, that is,
2555it lies between&nbsp;1 and the stack top
2556(<code>1 &le; abs(index) &le; top</code>).
2557
2558Usually, functions that need a specific stack position
2559(e.g., <a href="#lua_remove"><code>lua_remove</code></a>) require valid indices.
2560
2561
2562<p>
2563Functions that do not need a specific stack position,
2564but only a value in the stack (e.g., query functions),
2565can be called with acceptable indices.
2566An <em>acceptable index</em> refers to a position within
2567the space allocated for the stack,
2568that is, indices up to the stack size.
2569More formally, we define an acceptable index
2518as follows:2570as follows:
2519 2571
2520<pre>2572<pre>
2521 (index &lt; 0 &amp;&amp; abs(index) &lt;= top) ||2573 (index &lt; 0 &amp;&amp; abs(index) &lt;= top) ||
2522 (index &gt; 0 &amp;&amp; index &lt;= stackspace)2574 (index &gt; 0 &amp;&amp; index &lt;= stack size)
2523</pre><p>2575</pre><p>
2524Note that 0 is never an acceptable index.2576(Note that 0 is never an acceptable index.)
2577When a function is called,
2578its stack size is <code>top + LUA_MINSTACK</code>.
2579You can change its stack size through function <a href="#lua_checkstack"><code>lua_checkstack</code></a>.
2525 2580
2526 2581
2582<p>
2583Acceptable indices serve to avoid extra tests
2584against the stack top when querying the stack.
2585For instance, a C&nbsp;function can query its third argument
2586without the need to first check whether there is a third argument,
2587that is, without the need to check whether 3 is a valid index.
2527 2588
2528 2589
2590<p>
2591For functions that can be called with acceptable indices,
2592any non-valid index is treated as if it
2593contains a value of a virtual type <a name="pdf-LUA_TNONE"><code>LUA_TNONE</code></a>.
2529 2594
2530<h2>4.3 &ndash; <a name="4.3">Pseudo-Indices</a></h2>
2531 2595
2532<p>2596<p>
2533Unless otherwise noted,2597Unless otherwise noted,
2534any function that accepts valid indices also accepts <em>pseudo-indices</em>,2598any function that accepts valid indices also accepts <em>pseudo-indices</em>,
2535which represent some Lua values that are accessible to C&nbsp;code2599which represent some Lua values that are accessible to C&nbsp;code
2536but which are not in the stack.2600but which are not in the stack.
2537Pseudo-indices are used to access2601Pseudo-indices are used to access the registry
2538the registry
2539and the upvalues of a C&nbsp;function (see <a href="#4.4">&sect;4.4</a>).2602and the upvalues of a C&nbsp;function (see <a href="#4.4">&sect;4.4</a>).
2540 2603
2541 2604
@@ -2547,10 +2610,10 @@ and the upvalues of a C&nbsp;function (see <a href="#4.4">&sect;4.4</a>). · 5 unmodified lines
2547<p>2610<p>
2548When a C&nbsp;function is created,2611When a C&nbsp;function is created,
2549it is possible to associate some values with it,2612it is possible to associate some values with it,
2550thus creating a <em>C&nbsp;closure</em>;2613thus creating a <em>C&nbsp;closure</em>
2614(see <a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a>);
2551these values are called <em>upvalues</em> and are2615these values are called <em>upvalues</em> and are
2552accessible to the function whenever it is called2616accessible to the function whenever it is called.
2553(see <a href="#lua_pushcclosure"><code>lua_pushcclosure</code></a>).
2554 2617
2555 2618
2556<p>2619<p>
@@ -2573,12 +2636,13 @@ produces an acceptable (but invalid) index. · 16 unmodified lines
2573 2636
2574<p>2637<p>
2575Lua provides a <em>registry</em>,2638Lua provides a <em>registry</em>,
2576a pre-defined table that can be used by any C&nbsp;code to2639a predefined table that can be used by any C&nbsp;code to
2577store whatever Lua value it needs to store.2640store whatever Lua values it needs to store.
2578This table is always located at pseudo-index2641The registry table is always located at pseudo-index
2579<a name="pdf-LUA_REGISTRYINDEX"><code>LUA_REGISTRYINDEX</code></a>.2642<a name="pdf-LUA_REGISTRYINDEX"><code>LUA_REGISTRYINDEX</code></a>.
2580Any C&nbsp;library can store data into this table,2643Any C&nbsp;library can store data into this table,
2581but it should take care to choose keys different from those used2644but it should take care to choose keys
2645that are different from those used
2582by other libraries, to avoid collisions.2646by other libraries, to avoid collisions.
2583Typically, you should use as key a string containing your library name,2647Typically, you should use as key a string containing your library name,
2584or a light userdata with the address of a C&nbsp;object in your code,2648or a light userdata with the address of a C&nbsp;object in your code,
@@ -2610,7 +2674,6 @@ the main thread of the state. · 25 unmodified lines
2610 2674
2611<li><b><a name="pdf-LUA_RIDX_GLOBALS"><code>LUA_RIDX_GLOBALS</code></a>: </b> At this index the registry has2675<li><b><a name="pdf-LUA_RIDX_GLOBALS"><code>LUA_RIDX_GLOBALS</code></a>: </b> At this index the registry has
2612the global environment.2676the global environment.
2613This is the C&nbsp;equivalent to the <a href="#pdf-_G"><code>_G</code></a> global variable.
2614</li>2677</li>
2615</ul>2678</ul>
2616 2679
@@ -2629,8 +2692,8 @@ and runtime errors) · 12 unmodified lines
2629it <em>raises</em> an error;2692it <em>raises</em> an error;
2630that is, it does a long jump.2693that is, it does a long jump.
2631A <em>protected environment</em> uses <code>setjmp</code>2694A <em>protected environment</em> uses <code>setjmp</code>
2632to set a recover point;2695to set a recovery point;
2633any error jumps to the most recent active recover point.2696any error jumps to the most recent active recovery point.
2634 2697
2635 2698
2636<p>2699<p>
@@ -2639,7 +2702,8 @@ Lua calls a <em>panic function</em> (see <a href="#lua_atpanic"><code>lua_atpani · 2 unmodified lines
2639and then calls <code>abort</code>,2702and then calls <code>abort</code>,
2640thus exiting the host application.2703thus exiting the host application.
2641Your panic function can avoid this exit by2704Your panic function can avoid this exit by
2642never returning (e.g., doing a long jump).2705never returning
2706(e.g., doing a long jump to your own recovery point outside Lua).
2643 2707
2644 2708
2645<p>2709<p>
@@ -2677,8 +2741,7 @@ All those functions receive a <em>continuation function</em> · 31 unmodified lines
2677 2741
2678 2742
2679<p>2743<p>
2680To explain continuations,2744We need to set some terminology to explain continuations.
2681let us set some terminology.
2682We have a C function called from Lua which we will call2745We have a C function called from Lua which we will call
2683the <em>original function</em>.2746the <em>original function</em>.
2684This original function then calls one of those three functions in the C API,2747This original function then calls one of those three functions in the C API,
@@ -2704,7 +2767,7 @@ of the original function. · 19 unmodified lines
2704 2767
2705 2768
2706<p>2769<p>
2707Lua treats the continuation function as if it was the original function.2770Lua treats the continuation function as if it were the original function.
2708The continuation function receives the same Lua stack2771The continuation function receives the same Lua stack
2709from the original function,2772from the original function,
2710in the same state it would be if the callee function had returned.2773in the same state it would be if the callee function had returned.
@@ -2712,7 +2775,7 @@ in the same state it would be if the callee function had returned. · 1 unmodified line
2712after a <a href="#lua_callk"><code>lua_callk</code></a> the function and its arguments are2775after a <a href="#lua_callk"><code>lua_callk</code></a> the function and its arguments are
2713removed from the stack and replaced by the results from the call.)2776removed from the stack and replaced by the results from the call.)
2714It also has the same upvalues.2777It also has the same upvalues.
2715Whatever it returns is handled by Lua as if it was the return2778Whatever it returns is handled by Lua as if it were the return
2716of the original function.2779of the original function.
2717 2780
2718 2781
@@ -2749,15 +2812,14 @@ by looking only at its arguments · 30 unmodified lines
2749The third field, <code>x</code>,2812The third field, <code>x</code>,
2750tells whether the function may throw errors:2813tells whether the function may throw errors:
2751'<code>-</code>' means the function never throws any error;2814'<code>-</code>' means the function never throws any error;
2752'<code>m</code>' means the function may throw an error2815'<code>m</code>' means the function may throw only memory allocation errors;
2753only due to not enough memory;
2754'<code>e</code>' means the function may throw other kinds of errors;2816'<code>e</code>' means the function may throw other kinds of errors;
2755'<code>v</code>' means the function may throw an error on purpose.2817'<code>v</code>' means the function may throw an error on purpose.
2756 2818
2757 2819
2758 2820
2759<hr><h3><a name="lua_absindex"><code>lua_absindex</code></a></h3><p>2821<hr><h3><a name="lua_absindex"><code>lua_absindex</code></a></h3><p>
2760<span class="apii">[-0, +0, <em>-</em>]</span>2822<span class="apii">[-0, +0, &ndash;]</span>
2761<pre>int lua_absindex (lua_State *L, int idx);</pre>2823<pre>int lua_absindex (lua_State *L, int idx);</pre>
2762 2824
2763<p>2825<p>
@@ -2795,7 +2857,7 @@ that is, the size given when it was allocated or reallocated. · 31 unmodified lines
2795 2857
2796<p>2858<p>
2797When <code>ptr</code> is <code>NULL</code>,2859When <code>ptr</code> is <code>NULL</code>,
2798<code>osize</code> codes the kind of object that Lua is allocating.2860<code>osize</code> encodes the kind of object that Lua is allocating.
2799<code>osize</code> is any of2861<code>osize</code> is any of
2800<a href="#pdf-LUA_TSTRING"><code>LUA_TSTRING</code></a>, <a href="#pdf-LUA_TTABLE"><code>LUA_TTABLE</code></a>, <a href="#pdf-LUA_TFUNCTION"><code>LUA_TFUNCTION</code></a>,2862<a href="#pdf-LUA_TSTRING"><code>LUA_TSTRING</code></a>, <a href="#pdf-LUA_TTABLE"><code>LUA_TTABLE</code></a>, <a href="#pdf-LUA_TFUNCTION"><code>LUA_TFUNCTION</code></a>,
2801<a href="#pdf-LUA_TUSERDATA"><code>LUA_TUSERDATA</code></a>, or <a href="#pdf-LUA_TTHREAD"><code>LUA_TTHREAD</code></a> when (and only when)2863<a href="#pdf-LUA_TUSERDATA"><code>LUA_TUSERDATA</code></a>, or <a href="#pdf-LUA_TTHREAD"><code>LUA_TTHREAD</code></a> when (and only when)
@@ -2818,7 +2880,7 @@ and return <code>NULL</code>. · 16 unmodified lines
2818When <code>nsize</code> is not zero,2880When <code>nsize</code> is not zero,
2819the allocator should behave like <code>realloc</code>.2881the allocator should behave like <code>realloc</code>.
2820The allocator returns <code>NULL</code>2882The allocator returns <code>NULL</code>
2821if and only if it cannot fill the request.2883if and only if it cannot fulfill the request.
2822Lua assumes that the allocator never fails when2884Lua assumes that the allocator never fails when
2823<code>osize &gt;= nsize</code>.2885<code>osize &gt;= nsize</code>.
2824 2886
@@ -2843,8 +2905,8 @@ Note that Standard&nbsp;C ensures · 18 unmodified lines
2843that <code>free(NULL)</code> has no effect and that2905that <code>free(NULL)</code> has no effect and that
2844<code>realloc(NULL, size)</code> is equivalent to <code>malloc(size)</code>.2906<code>realloc(NULL, size)</code> is equivalent to <code>malloc(size)</code>.
2845This code assumes that <code>realloc</code> does not fail when shrinking a block.2907This code assumes that <code>realloc</code> does not fail when shrinking a block.
2846Standard&nbsp;C does not ensure this behavior,2908(Although Standard&nbsp;C does not ensure this behavior,
2847but it seems a safe assumption.2909it seems to be a safe assumption.)
2848 2910
2849 2911
2850 2912
@@ -2883,7 +2945,7 @@ The value of <code>op</code> must be one of the following constants: · 32 unmodified lines
2883 2945
2884 2946
2885<hr><h3><a name="lua_atpanic"><code>lua_atpanic</code></a></h3><p>2947<hr><h3><a name="lua_atpanic"><code>lua_atpanic</code></a></h3><p>
2886<span class="apii">[-0, +0, <em>-</em>]</span>2948<span class="apii">[-0, +0, &ndash;]</span>
2887<pre>lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);</pre>2949<pre>lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf);</pre>
2888 2950
2889<p>2951<p>
@@ -2901,7 +2963,7 @@ In particular, the error message is at the top of the stack. · 11 unmodified lines
2901 2963
2902 2964
2903<hr><h3><a name="lua_call"><code>lua_call</code></a></h3><p>2965<hr><h3><a name="lua_call"><code>lua_call</code></a></h3><p>
2904<span class="apii">[-(nargs + 1), +nresults, <em>e</em>]</span>2966<span class="apii">[-(nargs+1), +nresults, <em>e</em>]</span>
2905<pre>void lua_call (lua_State *L, int nargs, int nresults);</pre>2967<pre>void lua_call (lua_State *L, int nargs, int nresults);</pre>
2906 2968
2907<p>2969<p>
@@ -3025,12 +3087,12 @@ of numerical arguments and returns their average and sum: · 117 unmodified lines
3025 3087
3026 3088
3027<hr><h3><a name="lua_checkstack"><code>lua_checkstack</code></a></h3><p>3089<hr><h3><a name="lua_checkstack"><code>lua_checkstack</code></a></h3><p>
3028<span class="apii">[-0, +0, <em>-</em>]</span>3090<span class="apii">[-0, +0, &ndash;]</span>
3029<pre>int lua_checkstack (lua_State *L, int extra);</pre>3091<pre>int lua_checkstack (lua_State *L, int extra);</pre>
3030 3092
3031<p>3093<p>
3032Ensures that there are at least <code>extra</code> free stack slots in the stack.3094Ensures that there are at least <code>extra</code> free stack slots in the stack.
3033It returns false if it cannot grant the request,3095It returns false if it cannot fulfill the request,
3034because it would cause the stack to be larger than a fixed maximum size3096because it would cause the stack to be larger than a fixed maximum size
3035(typically at least a few thousand elements) or3097(typically at least a few thousand elements) or
3036because it cannot allocate memory for the new stack size.3098because it cannot allocate memory for the new stack size.
@@ -3043,7 +3105,7 @@ it is left unchanged. · 6 unmodified lines
3043 3105
3044 3106
3045<hr><h3><a name="lua_close"><code>lua_close</code></a></h3><p>3107<hr><h3><a name="lua_close"><code>lua_close</code></a></h3><p>
3046<span class="apii">[-0, +0, <em>-</em>]</span>3108<span class="apii">[-0, +0, &ndash;]</span>
3047<pre>void lua_close (lua_State *L);</pre>3109<pre>void lua_close (lua_State *L);</pre>
3048 3110
3049<p>3111<p>
@@ -3052,10 +3114,9 @@ Destroys all objects in the given Lua state · 2 unmodified lines
3052and frees all dynamic memory used by this state.3114and frees all dynamic memory used by this state.
3053On several platforms, you may not need to call this function,3115On several platforms, you may not need to call this function,
3054because all resources are naturally released when the host program ends.3116because all resources are naturally released when the host program ends.
3055On the other hand, long-running programs,3117On the other hand, long-running programs that create multiple states,
3056such as a daemon or a web server,3118such as daemons or web servers,
3057might need to release states as soon as they are not needed,3119might need to close states as soon as they are not needed.
3058to avoid growing too large.
3059 3120
3060 3121
3061 3122
@@ -3066,6 +3127,7 @@ to avoid growing too large. · 4 unmodified lines
3066<pre>int lua_compare (lua_State *L, int index1, int index2, int op);</pre>3127<pre>int lua_compare (lua_State *L, int index1, int index2, int op);</pre>
3067 3128
3068<p>3129<p>
3130Compares two Lua values.
3069Returns 1 if the value at acceptable index <code>index1</code> satisfies <code>op</code>3131Returns 1 if the value at acceptable index <code>index1</code> satisfies <code>op</code>
3070when compared with the value at acceptable index <code>index2</code>,3132when compared with the value at acceptable index <code>index2</code>,
3071following the semantics of the corresponding Lua operator3133following the semantics of the corresponding Lua operator
@@ -3106,7 +3168,7 @@ Concatenation is performed following the usual semantics of Lua · 34 unmodified lines
3106 3168
3107 3169
3108<hr><h3><a name="lua_copy"><code>lua_copy</code></a></h3><p>3170<hr><h3><a name="lua_copy"><code>lua_copy</code></a></h3><p>
3109<span class="apii">[-0, +0, <em>-</em>]</span>3171<span class="apii">[-0, +0, &ndash;]</span>
3110<pre>void lua_copy (lua_State *L, int fromidx, int toidx);</pre>3172<pre>void lua_copy (lua_State *L, int fromidx, int toidx);</pre>
3111 3173
3112<p>3174<p>
@@ -3176,7 +3238,7 @@ Generates a Lua error. · 63 unmodified lines
3176The error message (which can actually be a Lua value of any type)3238The error message (which can actually be a Lua value of any type)
3177must be on the stack top.3239must be on the stack top.
3178This function does a long jump,3240This function does a long jump,
3179and therefore never returns.3241and therefore never returns
3180(see <a href="#luaL_error"><code>luaL_error</code></a>).3242(see <a href="#luaL_error"><code>luaL_error</code></a>).
3181 3243
3182 3244
@@ -3245,10 +3307,20 @@ returns a boolean that tells whether the collector is running · 62 unmodified lines
3245(i.e., not stopped).3307(i.e., not stopped).
3246</li>3308</li>
3247 3309
3310<li><b><code>LUA_GCGEN</code>: </b>
3311changes the collector to generational mode
3312(see <a href="#2.5">&sect;2.5</a>).
3313</li>
3314
3315<li><b><code>LUA_GCINC</code>: </b>
3316changes the collector to incremental mode.
3317This is the default mode.
3318</li>
3319
3248</ul>3320</ul>
3249 3321
3250<p>3322<p>
3251For more details about some options,3323For more details about these options,
3252see <a href="#pdf-collectgarbage"><code>collectgarbage</code></a>.3324see <a href="#pdf-collectgarbage"><code>collectgarbage</code></a>.
3253 3325
3254 3326
@@ -3256,7 +3328,7 @@ see <a href="#pdf-collectgarbage"><code>collectgarbage</code></a>. · 1 unmodified line
3256 3328
3257 3329
3258<hr><h3><a name="lua_getallocf"><code>lua_getallocf</code></a></h3><p>3330<hr><h3><a name="lua_getallocf"><code>lua_getallocf</code></a></h3><p>
3259<span class="apii">[-0, +0, <em>-</em>]</span>3331<span class="apii">[-0, +0, &ndash;]</span>
3260<pre>lua_Alloc lua_getallocf (lua_State *L, void **ud);</pre>3332<pre>lua_Alloc lua_getallocf (lua_State *L, void **ud);</pre>
3261 3333
3262<p>3334<p>
@@ -3269,7 +3341,7 @@ opaque pointer passed to <a href="#lua_newstate"><code>lua_newstate</code></a>. · 6 unmodified lines
3269 3341
3270 3342
3271<hr><h3><a name="lua_getctx"><code>lua_getctx</code></a></h3><p>3343<hr><h3><a name="lua_getctx"><code>lua_getctx</code></a></h3><p>
3272<span class="apii">[-0, +0, <em>-</em>]</span>3344<span class="apii">[-0, +0, &ndash;]</span>
3273<pre>int lua_getctx (lua_State *L, int *ctx);</pre>3345<pre>int lua_getctx (lua_State *L, int *ctx);</pre>
3274 3346
3275<p>3347<p>
@@ -3293,7 +3365,7 @@ When the callee is <a href="#lua_pcallk"><code>lua_pcallk</code></a>, · 17 unmodified lines
3293Lua may also call its continuation function3365Lua may also call its continuation function
3294to handle errors during the call.3366to handle errors during the call.
3295That is, upon an error in the function called by <a href="#lua_pcallk"><code>lua_pcallk</code></a>,3367That is, upon an error in the function called by <a href="#lua_pcallk"><code>lua_pcallk</code></a>,
3296Lua may not return <a href="#lua_pcallk"><code>lua_pcallk</code></a>3368Lua may not return to the original function
3297but instead may call the continuation function.3369but instead may call the continuation function.
3298In that case, a call to <a href="#lua_getctx"><code>lua_getctx</code></a> will return the error code3370In that case, a call to <a href="#lua_getctx"><code>lua_getctx</code></a> will return the error code
3299(the value that would be returned by <a href="#lua_pcallk"><code>lua_pcallk</code></a>);3371(the value that would be returned by <a href="#lua_pcallk"><code>lua_pcallk</code></a>);
@@ -3324,21 +3396,19 @@ for the "index" event (see <a href="#2.4">&sect;2.4</a>). · 24 unmodified lines
3324 3396
3325<p>3397<p>
3326Pushes onto the stack the value of the global <code>name</code>.3398Pushes onto the stack the value of the global <code>name</code>.
3327It is defined as a macro.
3328 3399
3329 3400
3330 3401
3331 3402
3332 3403
3333<hr><h3><a name="lua_getmetatable"><code>lua_getmetatable</code></a></h3><p>3404<hr><h3><a name="lua_getmetatable"><code>lua_getmetatable</code></a></h3><p>
3334<span class="apii">[-0, +(0|1), <em>-</em>]</span>3405<span class="apii">[-0, +(0|1), &ndash;]</span>
3335<pre>int lua_getmetatable (lua_State *L, int index);</pre>3406<pre>int lua_getmetatable (lua_State *L, int index);</pre>
3336 3407
3337<p>3408<p>
3338Pushes onto the stack the metatable of the value at the given3409Pushes onto the stack the metatable of the value at the given
3339acceptable index.3410acceptable index.
3340If the index is not valid,3411If the value does not have a metatable,
3341or if the value does not have a metatable,
3342the function returns&nbsp;0 and pushes nothing on the stack.3412the function returns&nbsp;0 and pushes nothing on the stack.
3343 3413
3344 3414
@@ -3366,7 +3436,7 @@ for the "index" event (see <a href="#2.4">&sect;2.4</a>). · 21 unmodified lines
3366 3436
3367 3437
3368<hr><h3><a name="lua_gettop"><code>lua_gettop</code></a></h3><p>3438<hr><h3><a name="lua_gettop"><code>lua_gettop</code></a></h3><p>
3369<span class="apii">[-0, +0, <em>-</em>]</span>3439<span class="apii">[-0, +0, &ndash;]</span>
3370<pre>int lua_gettop (lua_State *L);</pre>3440<pre>int lua_gettop (lua_State *L);</pre>
3371 3441
3372<p>3442<p>
@@ -3380,7 +3450,7 @@ this result is equal to the number of elements in the stack · 7 unmodified lines
3380 3450
3381 3451
3382<hr><h3><a name="lua_getuservalue"><code>lua_getuservalue</code></a></h3><p>3452<hr><h3><a name="lua_getuservalue"><code>lua_getuservalue</code></a></h3><p>
3383<span class="apii">[-0, +1, <em>-</em>]</span>3453<span class="apii">[-0, +1, &ndash;]</span>
3384<pre>void lua_getuservalue (lua_State *L, int index);</pre>3454<pre>void lua_getuservalue (lua_State *L, int index);</pre>
3385 3455
3386<p>3456<p>
@@ -3393,7 +3463,7 @@ This Lua value must be a table or <b>nil</b>. · 6 unmodified lines
3393 3463
3394 3464
3395<hr><h3><a name="lua_insert"><code>lua_insert</code></a></h3><p>3465<hr><h3><a name="lua_insert"><code>lua_insert</code></a></h3><p>
3396<span class="apii">[-1, +1, <em>-</em>]</span>3466<span class="apii">[-1, +1, &ndash;]</span>
3397<pre>void lua_insert (lua_State *L, int index);</pre>3467<pre>void lua_insert (lua_State *L, int index);</pre>
3398 3468
3399<p>3469<p>
@@ -3423,11 +3493,11 @@ which is usually the largest signed integral type the machine handles · 23 unmodified lines
3423 3493
3424 3494
3425<hr><h3><a name="lua_isboolean"><code>lua_isboolean</code></a></h3><p>3495<hr><h3><a name="lua_isboolean"><code>lua_isboolean</code></a></h3><p>
3426<span class="apii">[-0, +0, <em>-</em>]</span>3496<span class="apii">[-0, +0, &ndash;]</span>
3427<pre>int lua_isboolean (lua_State *L, int index);</pre>3497<pre>int lua_isboolean (lua_State *L, int index);</pre>
3428 3498
3429<p>3499<p>
3430Returns 1 if the value at the given acceptable index has type boolean,3500Returns 1 if the value at the given acceptable index is a boolean,
3431and 0&nbsp;otherwise.3501and 0&nbsp;otherwise.
3432 3502
3433 3503
@@ -3435,7 +3505,7 @@ and 0&nbsp;otherwise. · 1 unmodified line
3435 3505
3436 3506
3437<hr><h3><a name="lua_iscfunction"><code>lua_iscfunction</code></a></h3><p>3507<hr><h3><a name="lua_iscfunction"><code>lua_iscfunction</code></a></h3><p>
3438<span class="apii">[-0, +0, <em>-</em>]</span>3508<span class="apii">[-0, +0, &ndash;]</span>
3439<pre>int lua_iscfunction (lua_State *L, int index);</pre>3509<pre>int lua_iscfunction (lua_State *L, int index);</pre>
3440 3510
3441<p>3511<p>
@@ -3447,7 +3517,7 @@ and 0&nbsp;otherwise. · 5 unmodified lines
3447 3517
3448 3518
3449<hr><h3><a name="lua_isfunction"><code>lua_isfunction</code></a></h3><p>3519<hr><h3><a name="lua_isfunction"><code>lua_isfunction</code></a></h3><p>
3450<span class="apii">[-0, +0, <em>-</em>]</span>3520<span class="apii">[-0, +0, &ndash;]</span>
3451<pre>int lua_isfunction (lua_State *L, int index);</pre>3521<pre>int lua_isfunction (lua_State *L, int index);</pre>
3452 3522
3453<p>3523<p>
@@ -3459,7 +3529,7 @@ Returns 1 if the value at the given acceptable index is a function · 5 unmodified lines
3459 3529
3460 3530
3461<hr><h3><a name="lua_islightuserdata"><code>lua_islightuserdata</code></a></h3><p>3531<hr><h3><a name="lua_islightuserdata"><code>lua_islightuserdata</code></a></h3><p>
3462<span class="apii">[-0, +0, <em>-</em>]</span>3532<span class="apii">[-0, +0, &ndash;]</span>
3463<pre>int lua_islightuserdata (lua_State *L, int index);</pre>3533<pre>int lua_islightuserdata (lua_State *L, int index);</pre>
3464 3534
3465<p>3535<p>
@@ -3471,7 +3541,7 @@ and 0&nbsp;otherwise. · 5 unmodified lines
3471 3541
3472 3542
3473<hr><h3><a name="lua_isnil"><code>lua_isnil</code></a></h3><p>3543<hr><h3><a name="lua_isnil"><code>lua_isnil</code></a></h3><p>
3474<span class="apii">[-0, +0, <em>-</em>]</span>3544<span class="apii">[-0, +0, &ndash;]</span>
3475<pre>int lua_isnil (lua_State *L, int index);</pre>3545<pre>int lua_isnil (lua_State *L, int index);</pre>
3476 3546
3477<p>3547<p>
@@ -3483,7 +3553,7 @@ and 0&nbsp;otherwise. · 5 unmodified lines
3483 3553
3484 3554
3485<hr><h3><a name="lua_isnone"><code>lua_isnone</code></a></h3><p>3555<hr><h3><a name="lua_isnone"><code>lua_isnone</code></a></h3><p>
3486<span class="apii">[-0, +0, <em>-</em>]</span>3556<span class="apii">[-0, +0, &ndash;]</span>
3487<pre>int lua_isnone (lua_State *L, int index);</pre>3557<pre>int lua_isnone (lua_State *L, int index);</pre>
3488 3558
3489<p>3559<p>
@@ -3496,7 +3566,7 @@ and 0&nbsp;otherwise. · 6 unmodified lines
3496 3566
3497 3567
3498<hr><h3><a name="lua_isnoneornil"><code>lua_isnoneornil</code></a></h3><p>3568<hr><h3><a name="lua_isnoneornil"><code>lua_isnoneornil</code></a></h3><p>
3499<span class="apii">[-0, +0, <em>-</em>]</span>3569<span class="apii">[-0, +0, &ndash;]</span>
3500<pre>int lua_isnoneornil (lua_State *L, int index);</pre>3570<pre>int lua_isnoneornil (lua_State *L, int index);</pre>
3501 3571
3502<p>3572<p>
@@ -3510,7 +3580,7 @@ and 0&nbsp;otherwise. · 7 unmodified lines
3510 3580
3511 3581
3512<hr><h3><a name="lua_isnumber"><code>lua_isnumber</code></a></h3><p>3582<hr><h3><a name="lua_isnumber"><code>lua_isnumber</code></a></h3><p>
3513<span class="apii">[-0, +0, <em>-</em>]</span>3583<span class="apii">[-0, +0, &ndash;]</span>
3514<pre>int lua_isnumber (lua_State *L, int index);</pre>3584<pre>int lua_isnumber (lua_State *L, int index);</pre>
3515 3585
3516<p>3586<p>
@@ -3523,7 +3593,7 @@ and 0&nbsp;otherwise. · 6 unmodified lines
3523 3593
3524 3594
3525<hr><h3><a name="lua_isstring"><code>lua_isstring</code></a></h3><p>3595<hr><h3><a name="lua_isstring"><code>lua_isstring</code></a></h3><p>
3526<span class="apii">[-0, +0, <em>-</em>]</span>3596<span class="apii">[-0, +0, &ndash;]</span>
3527<pre>int lua_isstring (lua_State *L, int index);</pre>3597<pre>int lua_isstring (lua_State *L, int index);</pre>
3528 3598
3529<p>3599<p>
@@ -3536,7 +3606,7 @@ and 0&nbsp;otherwise. · 6 unmodified lines
3536 3606
3537 3607
3538<hr><h3><a name="lua_istable"><code>lua_istable</code></a></h3><p>3608<hr><h3><a name="lua_istable"><code>lua_istable</code></a></h3><p>
3539<span class="apii">[-0, +0, <em>-</em>]</span>3609<span class="apii">[-0, +0, &ndash;]</span>
3540<pre>int lua_istable (lua_State *L, int index);</pre>3610<pre>int lua_istable (lua_State *L, int index);</pre>
3541 3611
3542<p>3612<p>
@@ -3548,7 +3618,7 @@ and 0&nbsp;otherwise. · 5 unmodified lines
3548 3618
3549 3619
3550<hr><h3><a name="lua_isthread"><code>lua_isthread</code></a></h3><p>3620<hr><h3><a name="lua_isthread"><code>lua_isthread</code></a></h3><p>
3551<span class="apii">[-0, +0, <em>-</em>]</span>3621<span class="apii">[-0, +0, &ndash;]</span>
3552<pre>int lua_isthread (lua_State *L, int index);</pre>3622<pre>int lua_isthread (lua_State *L, int index);</pre>
3553 3623
3554<p>3624<p>
@@ -3560,7 +3630,7 @@ and 0&nbsp;otherwise. · 5 unmodified lines
3560 3630
3561 3631
3562<hr><h3><a name="lua_isuserdata"><code>lua_isuserdata</code></a></h3><p>3632<hr><h3><a name="lua_isuserdata"><code>lua_isuserdata</code></a></h3><p>
3563<span class="apii">[-0, +0, <em>-</em>]</span>3633<span class="apii">[-0, +0, &ndash;]</span>
3564<pre>int lua_isuserdata (lua_State *L, int index);</pre>3634<pre>int lua_isuserdata (lua_State *L, int index);</pre>
3565 3635
3566<p>3636<p>
@@ -3585,7 +3655,7 @@ The result is pushed on the stack. · 18 unmodified lines
3585 3655
3586 3656
3587<hr><h3><a name="lua_load"><code>lua_load</code></a></h3><p>3657<hr><h3><a name="lua_load"><code>lua_load</code></a></h3><p>
3588<span class="apii">[-0, +1, <em>-</em>]</span>3658<span class="apii">[-0, +1, &ndash;]</span>
3589<pre>int lua_load (lua_State *L,3659<pre>int lua_load (lua_State *L,
3590 lua_Reader reader,3660 lua_Reader reader,
3591 void *data,3661 void *data,
@@ -3601,13 +3671,13 @@ The return values of <a href="#lua_load"><code>lua_load</code></a> are: · 9 unmodified lines
3601 3671
3602<ul>3672<ul>
3603 3673
3604<li><b><a href="#pdf-LUA_OK"><code>LUA_OK</code></a> (0): </b> no errors;</li>3674<li><b><a href="#pdf-LUA_OK"><code>LUA_OK</code></a>: </b> no errors;</li>
3605 3675
3606<li><b><a name="pdf-LUA_ERRSYNTAX"><code>LUA_ERRSYNTAX</code></a>: </b>3676<li><b><a name="pdf-LUA_ERRSYNTAX"><code>LUA_ERRSYNTAX</code></a>: </b>
3607syntax error during pre-compilation;</li>3677syntax error during precompilation;</li>
3608 3678
3609<li><b><a href="#pdf-LUA_ERRMEM"><code>LUA_ERRMEM</code></a>: </b>3679<li><b><a href="#pdf-LUA_ERRMEM"><code>LUA_ERRMEM</code></a>: </b>
3610memory allocation error.</li>3680memory allocation error;</li>
3611 3681
3612<li><b><a href="#pdf-LUA_ERRGCMM"><code>LUA_ERRGCMM</code></a>: </b>3682<li><b><a href="#pdf-LUA_ERRGCMM"><code>LUA_ERRGCMM</code></a>: </b>
3613error while running a <code>__gc</code> metamethod.3683error while running a <code>__gc</code> metamethod.
@@ -3623,7 +3693,7 @@ it does not run it. · 9 unmodified lines
3623 3693
3624 3694
3625<p>3695<p>
3626<a href="#lua_load"><code>lua_load</code></a> automatically detects whether the chunk is text or binary,3696<a href="#lua_load"><code>lua_load</code></a> automatically detects whether the chunk is text or binary
3627and loads it accordingly (see program <code>luac</code>).3697and loads it accordingly (see program <code>luac</code>).
3628 3698
3629 3699
@@ -3642,25 +3712,25 @@ which is used for error messages and in debug information (see <a href="#4.9">&s · 12 unmodified lines
3642If the resulting function has one upvalue,3712If the resulting function has one upvalue,
3643this upvalue is set to the value of the global environment3713this upvalue is set to the value of the global environment
3644stored at index <code>LUA_RIDX_GLOBALS</code> in the registry (see <a href="#4.5">&sect;4.5</a>).3714stored at index <code>LUA_RIDX_GLOBALS</code> in the registry (see <a href="#4.5">&sect;4.5</a>).
3645(When loading main chunks,3715When loading main chunks,
3646this upvalue will be the <code>_ENV</code> variable (see <a href="#2.2">&sect;2.2</a>).)3716this upvalue will be the <code>_ENV</code> variable (see <a href="#2.2">&sect;2.2</a>).
3647 3717
3648 3718
3649 3719
3650 3720
3651 3721
3652<hr><h3><a name="lua_newstate"><code>lua_newstate</code></a></h3><p>3722<hr><h3><a name="lua_newstate"><code>lua_newstate</code></a></h3><p>
3653<span class="apii">[-0, +0, <em>-</em>]</span>3723<span class="apii">[-0, +0, &ndash;]</span>
3654<pre>lua_State *lua_newstate (lua_Alloc f, void *ud);</pre>3724<pre>lua_State *lua_newstate (lua_Alloc f, void *ud);</pre>
3655 3725
3656<p>3726<p>
3657Creates a new thread running in a new, independent state.3727Creates a new thread running in a new, independent state.
3658Returns <code>NULL</code> if cannot create the thread/state3728Returns <code>NULL</code> if cannot create the thread or the state
3659(due to lack of memory).3729(due to lack of memory).
3660The argument <code>f</code> is the allocator function;3730The argument <code>f</code> is the allocator function;
3661Lua does all memory allocation for this state through this function.3731Lua does all memory allocation for this state through this function.
3662The second argument, <code>ud</code>, is an opaque pointer that Lua3732The second argument, <code>ud</code>, is an opaque pointer that Lua
3663simply passes to the allocator in every call.3733passes to the allocator in every call.
3664 3734
3665 3735
3666 3736
@@ -3686,7 +3756,7 @@ It is equivalent to <code>lua_createtable(L, 0, 0)</code>. · 19 unmodified lines
3686Creates a new thread, pushes it on the stack,3756Creates a new thread, pushes it on the stack,
3687and returns a pointer to a <a href="#lua_State"><code>lua_State</code></a> that represents this new thread.3757and returns a pointer to a <a href="#lua_State"><code>lua_State</code></a> that represents this new thread.
3688The new thread returned by this function shares with the original thread3758The new thread returned by this function shares with the original thread
3689all global objects (such as tables),3759its global environment,
3690but has an independent execution stack.3760but has an independent execution stack.
3691 3761
3692 3762
@@ -3707,15 +3777,7 @@ like any Lua object. · 14 unmodified lines
3707This function allocates a new block of memory with the given size,3777This function allocates a new block of memory with the given size,
3708pushes onto the stack a new full userdata with the block address,3778pushes onto the stack a new full userdata with the block address,
3709and returns this address.3779and returns this address.
3710 3780The host program can freely use this memory.
3711
3712<p>
3713Userdata represent C&nbsp;values in Lua.
3714A <em>full userdata</em> represents a block of memory.
3715It is an object (like a table):
3716you must create it, it can have its own metatable,
3717and you can detect when it is being collected.
3718A full userdata is only equal to itself (under raw equality).
3719 3781
3720 3782
3721 3783
@@ -3780,7 +3842,7 @@ Lua to operate with another type for numbers (e.g., float or long). · 58 unmodified lines
3780 3842
3781 3843
3782<hr><h3><a name="lua_pcall"><code>lua_pcall</code></a></h3><p>3844<hr><h3><a name="lua_pcall"><code>lua_pcall</code></a></h3><p>
3783<span class="apii">[-(nargs + 1), +(nresults|1), <em>-</em>]</span>3845<span class="apii">[-(nargs + 1), +(nresults|1), &ndash;]</span>
3784<pre>int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);</pre>3846<pre>int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);</pre>
3785 3847
3786<p>3848<p>
@@ -3855,9 +3917,13 @@ It is generated by the garbage collector.) · 68 unmodified lines
3855 3917
3856 3918
3857<hr><h3><a name="lua_pcallk"><code>lua_pcallk</code></a></h3><p>3919<hr><h3><a name="lua_pcallk"><code>lua_pcallk</code></a></h3><p>
3858<span class="apii">[-(nargs + 1), +(nresults|1), <em>-</em>]</span>3920<span class="apii">[-(nargs + 1), +(nresults|1), &ndash;]</span>
3859<pre>int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc,3921<pre>int lua_pcallk (lua_State *L,
3860 int ctx, lua_CFunction k);</pre>3922 int nargs,
3923 int nresults,
3924 int errfunc,
3925 int ctx,
3926 lua_CFunction k);</pre>
3861 3927
3862<p>3928<p>
3863This function behaves exactly like <a href="#lua_pcall"><code>lua_pcall</code></a>,3929This function behaves exactly like <a href="#lua_pcall"><code>lua_pcall</code></a>,
@@ -3868,7 +3934,7 @@ but allows the called function to yield (see <a href="#4.7">&sect;4.7</a>). · 4 unmodified lines
3868 3934
3869 3935
3870<hr><h3><a name="lua_pop"><code>lua_pop</code></a></h3><p>3936<hr><h3><a name="lua_pop"><code>lua_pop</code></a></h3><p>
3871<span class="apii">[-n, +0, <em>-</em>]</span>3937<span class="apii">[-n, +0, &ndash;]</span>
3872<pre>void lua_pop (lua_State *L, int n);</pre>3938<pre>void lua_pop (lua_State *L, int n);</pre>
3873 3939
3874<p>3940<p>
@@ -3879,7 +3945,7 @@ Pops <code>n</code> elements from the stack. · 4 unmodified lines
3879 3945
3880 3946
3881<hr><h3><a name="lua_pushboolean"><code>lua_pushboolean</code></a></h3><p>3947<hr><h3><a name="lua_pushboolean"><code>lua_pushboolean</code></a></h3><p>
3882<span class="apii">[-0, +1, <em>-</em>]</span>3948<span class="apii">[-0, +1, &ndash;]</span>
3883<pre>void lua_pushboolean (lua_State *L, int b);</pre>3949<pre>void lua_pushboolean (lua_State *L, int b);</pre>
3884 3950
3885<p>3951<p>
@@ -3920,14 +3986,14 @@ The maximum value for <code>n</code> is 255. · 34 unmodified lines
3920When <code>n</code> is zero,3986When <code>n</code> is zero,
3921this function creates a <em>light C function</em>,3987this function creates a <em>light C function</em>,
3922which is just a pointer to the C&nbsp;function.3988which is just a pointer to the C&nbsp;function.
3923In that case, it cannot throw a memory error.3989In that case, it never throws a memory error.
3924 3990
3925 3991
3926 3992
3927 3993
3928 3994
3929<hr><h3><a name="lua_pushcfunction"><code>lua_pushcfunction</code></a></h3><p>3995<hr><h3><a name="lua_pushcfunction"><code>lua_pushcfunction</code></a></h3><p>
3930<span class="apii">[-0, +1, <em>-</em>]</span>3996<span class="apii">[-0, +1, &ndash;]</span>
3931<pre>void lua_pushcfunction (lua_State *L, lua_CFunction f);</pre>3997<pre>void lua_pushcfunction (lua_State *L, lua_CFunction f);</pre>
3932 3998
3933<p>3999<p>
@@ -3948,7 +4014,9 @@ and return its results (see <a href="#lua_CFunction"><code>lua_CFunction</code>< · 14 unmodified lines
3948 4014
3949<pre>4015<pre>
3950 #define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)4016 #define lua_pushcfunction(L,f) lua_pushcclosure(L,f,0)
3951</pre>4017</pre><p>
4018Note that <code>f</code> is used twice.
4019
3952 4020
3953 4021
3954 4022
@@ -3980,7 +4048,7 @@ The conversion specifiers can only be · 25 unmodified lines
3980'<code>%f</code>' (inserts a <a href="#lua_Number"><code>lua_Number</code></a>),4048'<code>%f</code>' (inserts a <a href="#lua_Number"><code>lua_Number</code></a>),
3981'<code>%p</code>' (inserts a pointer as a hexadecimal numeral),4049'<code>%p</code>' (inserts a pointer as a hexadecimal numeral),
3982'<code>%d</code>' (inserts an <code>int</code>), and4050'<code>%d</code>' (inserts an <code>int</code>), and
3983'<code>%c</code>' (inserts an <code>int</code> as a character).4051'<code>%c</code>' (inserts an <code>int</code> as a byte).
3984</li>4052</li>
3985 4053
3986</ul>4054</ul>
@@ -3989,7 +4057,7 @@ The conversion specifiers can only be · 2 unmodified lines
3989 4057
3990 4058
3991<hr><h3><a name="lua_pushinteger"><code>lua_pushinteger</code></a></h3><p>4059<hr><h3><a name="lua_pushinteger"><code>lua_pushinteger</code></a></h3><p>
3992<span class="apii">[-0, +1, <em>-</em>]</span>4060<span class="apii">[-0, +1, &ndash;]</span>
3993<pre>void lua_pushinteger (lua_State *L, lua_Integer n);</pre>4061<pre>void lua_pushinteger (lua_State *L, lua_Integer n);</pre>
3994 4062
3995<p>4063<p>
@@ -4000,7 +4068,7 @@ Pushes a number with value <code>n</code> onto the stack. · 4 unmodified lines
4000 4068
4001 4069
4002<hr><h3><a name="lua_pushlightuserdata"><code>lua_pushlightuserdata</code></a></h3><p>4070<hr><h3><a name="lua_pushlightuserdata"><code>lua_pushlightuserdata</code></a></h3><p>
4003<span class="apii">[-0, +1, <em>-</em>]</span>4071<span class="apii">[-0, +1, &ndash;]</span>
4004<pre>void lua_pushlightuserdata (lua_State *L, void *p);</pre>4072<pre>void lua_pushlightuserdata (lua_State *L, void *p);</pre>
4005 4073
4006<p>4074<p>
@@ -4027,7 +4095,7 @@ light userdata with the same C&nbsp;address. · 20 unmodified lines
4027<p>4095<p>
4028This macro is equivalent to <a href="#lua_pushlstring"><code>lua_pushlstring</code></a>,4096This macro is equivalent to <a href="#lua_pushlstring"><code>lua_pushlstring</code></a>,
4029but can be used only when <code>s</code> is a literal string.4097but can be used only when <code>s</code> is a literal string.
4030In these cases, it automatically provides the string length.4098It automatically provides the string length.
4031 4099
4032 4100
4033 4101
@@ -4055,7 +4123,7 @@ Returns a pointer to the internal copy of the string. · 21 unmodified lines
4055 4123
4056 4124
4057<hr><h3><a name="lua_pushnil"><code>lua_pushnil</code></a></h3><p>4125<hr><h3><a name="lua_pushnil"><code>lua_pushnil</code></a></h3><p>
4058<span class="apii">[-0, +1, <em>-</em>]</span>4126<span class="apii">[-0, +1, &ndash;]</span>
4059<pre>void lua_pushnil (lua_State *L);</pre>4127<pre>void lua_pushnil (lua_State *L);</pre>
4060 4128
4061<p>4129<p>
@@ -4066,7 +4134,7 @@ Pushes a nil value onto the stack. · 4 unmodified lines
4066 4134
4067 4135
4068<hr><h3><a name="lua_pushnumber"><code>lua_pushnumber</code></a></h3><p>4136<hr><h3><a name="lua_pushnumber"><code>lua_pushnumber</code></a></h3><p>
4069<span class="apii">[-0, +1, <em>-</em>]</span>4137<span class="apii">[-0, +1, &ndash;]</span>
4070<pre>void lua_pushnumber (lua_State *L, lua_Number n);</pre>4138<pre>void lua_pushnumber (lua_State *L, lua_Number n);</pre>
4071 4139
4072<p>4140<p>
@@ -4100,7 +4168,7 @@ If <code>s</code> is <code>NULL</code>, pushes <b>nil</b> and returns <code>NULL · 27 unmodified lines
4100 4168
4101 4169
4102<hr><h3><a name="lua_pushthread"><code>lua_pushthread</code></a></h3><p>4170<hr><h3><a name="lua_pushthread"><code>lua_pushthread</code></a></h3><p>
4103<span class="apii">[-0, +1, <em>-</em>]</span>4171<span class="apii">[-0, +1, &ndash;]</span>
4104<pre>int lua_pushthread (lua_State *L);</pre>4172<pre>int lua_pushthread (lua_State *L);</pre>
4105 4173
4106<p>4174<p>
@@ -4112,7 +4180,7 @@ Returns 1 if this thread is the main thread of its state. · 5 unmodified lines
4112 4180
4113 4181
4114<hr><h3><a name="lua_pushvalue"><code>lua_pushvalue</code></a></h3><p>4182<hr><h3><a name="lua_pushvalue"><code>lua_pushvalue</code></a></h3><p>
4115<span class="apii">[-0, +1, <em>-</em>]</span>4183<span class="apii">[-0, +1, &ndash;]</span>
4116<pre>void lua_pushvalue (lua_State *L, int index);</pre>4184<pre>void lua_pushvalue (lua_State *L, int index);</pre>
4117 4185
4118<p>4186<p>
@@ -4138,7 +4206,7 @@ instead of a variable number of arguments. · 19 unmodified lines
4138 4206
4139 4207
4140<hr><h3><a name="lua_rawequal"><code>lua_rawequal</code></a></h3><p>4208<hr><h3><a name="lua_rawequal"><code>lua_rawequal</code></a></h3><p>
4141<span class="apii">[-0, +0, <em>-</em>]</span>4209<span class="apii">[-0, +0, &ndash;]</span>
4142<pre>int lua_rawequal (lua_State *L, int index1, int index2);</pre>4210<pre>int lua_rawequal (lua_State *L, int index1, int index2);</pre>
4143 4211
4144<p>4212<p>
@@ -4153,7 +4221,7 @@ Also returns&nbsp;0 if any of the indices are non valid. · 8 unmodified lines
4153 4221
4154 4222
4155<hr><h3><a name="lua_rawget"><code>lua_rawget</code></a></h3><p>4223<hr><h3><a name="lua_rawget"><code>lua_rawget</code></a></h3><p>
4156<span class="apii">[-1, +1, <em>-</em>]</span>4224<span class="apii">[-1, +1, &ndash;]</span>
4157<pre>void lua_rawget (lua_State *L, int index);</pre>4225<pre>void lua_rawget (lua_State *L, int index);</pre>
4158 4226
4159<p>4227<p>
@@ -4165,7 +4233,7 @@ Similar to <a href="#lua_gettable"><code>lua_gettable</code></a>, but does a raw · 5 unmodified lines
4165 4233
4166 4234
4167<hr><h3><a name="lua_rawgeti"><code>lua_rawgeti</code></a></h3><p>4235<hr><h3><a name="lua_rawgeti"><code>lua_rawgeti</code></a></h3><p>
4168<span class="apii">[-0, +1, <em>-</em>]</span>4236<span class="apii">[-0, +1, &ndash;]</span>
4169<pre>void lua_rawgeti (lua_State *L, int index, int n);</pre>4237<pre>void lua_rawgeti (lua_State *L, int index, int n);</pre>
4170 4238
4171<p>4239<p>
@@ -4178,8 +4246,23 @@ that is, it does not invoke metamethods. · 6 unmodified lines
4178 4246
4179 4247
4180 4248
4249<hr><h3><a name="lua_rawgetp"><code>lua_rawgetp</code></a></h3><p>
4250<span class="apii">[-0, +1, &ndash;]</span>
4251<pre>void lua_rawgetp (lua_State *L, int index, const void *p);</pre>
4252
4253<p>
4254Pushes onto the stack the value <code>t[k]</code>,
4255where <code>t</code> is the table at the given valid index and
4256<code>k</code> is the pointer <code>p</code> represented as a light userdata.
4257The access is raw;
4258that is, it does not invoke metamethods.
4259
4260
4261
4262
4263
4181<hr><h3><a name="lua_rawlen"><code>lua_rawlen</code></a></h3><p>4264<hr><h3><a name="lua_rawlen"><code>lua_rawlen</code></a></h3><p>
4182<span class="apii">[-0, +0, <em>-</em>]</span>4265<span class="apii">[-0, +0, &ndash;]</span>
4183<pre>size_t lua_rawlen (lua_State *L, int index);</pre>4266<pre>size_t lua_rawlen (lua_State *L, int index);</pre>
4184 4267
4185<p>4268<p>
@@ -4226,6 +4309,26 @@ that is, it does not invoke metamethods. · 40 unmodified lines
4226 4309
4227 4310
4228 4311
4312<hr><h3><a name="lua_rawsetp"><code>lua_rawsetp</code></a></h3><p>
4313<span class="apii">[-1, +0, <em>m</em>]</span>
4314<pre>void lua_rawsetp (lua_State *L, int index, const void *p);</pre>
4315
4316<p>
4317Does the equivalent of <code>t[k] = v</code>,
4318where <code>t</code> is the table at the given valid index,
4319<code>k</code> is the pointer <code>p</code> represented as a light userdata,
4320and <code>v</code> is the value at the top of the stack.
4321
4322
4323<p>
4324This function pops the value from the stack.
4325The assignment is raw;
4326that is, it does not invoke metamethods.
4327
4328
4329
4330
4331
4229<hr><h3><a name="lua_Reader"><code>lua_Reader</code></a></h3>4332<hr><h3><a name="lua_Reader"><code>lua_Reader</code></a></h3>
4230<pre>typedef const char * (*lua_Reader) (lua_State *L,4333<pre>typedef const char * (*lua_Reader) (lua_State *L,
4231 void *data,4334 void *data,
@@ -4250,9 +4353,7 @@ The reader function may return pieces of any size greater than zero. · 18 unmodified lines
4250 4353
4251<hr><h3><a name="lua_register"><code>lua_register</code></a></h3><p>4354<hr><h3><a name="lua_register"><code>lua_register</code></a></h3><p>
4252<span class="apii">[-0, +0, <em>e</em>]</span>4355<span class="apii">[-0, +0, <em>e</em>]</span>
4253<pre>void lua_register (lua_State *L,4356<pre>void lua_register (lua_State *L, const char *name, lua_CFunction f);</pre>
4254 const char *name,
4255 lua_CFunction f);</pre>
4256 4357
4257<p>4358<p>
4258Sets the C function <code>f</code> as the new value of global <code>name</code>.4359Sets the C function <code>f</code> as the new value of global <code>name</code>.
@@ -4267,7 +4368,7 @@ It is defined as a macro: · 8 unmodified lines
4267 4368
4268 4369
4269<hr><h3><a name="lua_remove"><code>lua_remove</code></a></h3><p>4370<hr><h3><a name="lua_remove"><code>lua_remove</code></a></h3><p>
4270<span class="apii">[-1, +0, <em>-</em>]</span>4371<span class="apii">[-1, +0, &ndash;]</span>
4271<pre>void lua_remove (lua_State *L, int index);</pre>4372<pre>void lua_remove (lua_State *L, int index);</pre>
4272 4373
4273<p>4374<p>
@@ -4281,7 +4382,7 @@ because a pseudo-index is not an actual stack position. · 7 unmodified lines
4281 4382
4282 4383
4283<hr><h3><a name="lua_replace"><code>lua_replace</code></a></h3><p>4384<hr><h3><a name="lua_replace"><code>lua_replace</code></a></h3><p>
4284<span class="apii">[-1, +0, <em>-</em>]</span>4385<span class="apii">[-1, +0, &ndash;]</span>
4285<pre>void lua_replace (lua_State *L, int index);</pre>4386<pre>void lua_replace (lua_State *L, int index);</pre>
4286 4387
4287<p>4388<p>
@@ -4295,8 +4396,8 @@ and then pops the top element. · 7 unmodified lines
4295 4396
4296 4397
4297<hr><h3><a name="lua_resume"><code>lua_resume</code></a></h3><p>4398<hr><h3><a name="lua_resume"><code>lua_resume</code></a></h3><p>
4298<span class="apii">[-?, +?, <em>-</em>]</span>4399<span class="apii">[-?, +?, &ndash;]</span>
4299<pre>int lua_resume (lua_State *L, int narg);</pre>4400<pre>int lua_resume (lua_State *L, lua_State *from, int narg);</pre>
4300 4401
4301<p>4402<p>
4302Starts and resumes a coroutine in a given thread.4403Starts and resumes a coroutine in a given thread.
@@ -4330,11 +4431,17 @@ be passed as results from <code>yield</code>, · 27 unmodified lines
4330and then call <a href="#lua_resume"><code>lua_resume</code></a>.4431and then call <a href="#lua_resume"><code>lua_resume</code></a>.
4331 4432
4332 4433
4434<p>
4435The parameter <code>from</code> represents the coroutine that is resuming <code>L</code>.
4436If there is no such coroutine,
4437this parameter can be <code>NULL</code>.
4438
4439
4333 4440
4334 4441
4335 4442
4336<hr><h3><a name="lua_setallocf"><code>lua_setallocf</code></a></h3><p>4443<hr><h3><a name="lua_setallocf"><code>lua_setallocf</code></a></h3><p>
4337<span class="apii">[-0, +0, <em>-</em>]</span>4444<span class="apii">[-0, +0, &ndash;]</span>
4338<pre>void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);</pre>4445<pre>void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);</pre>
4339 4446
4340<p>4447<p>
@@ -4371,14 +4478,13 @@ for the "newindex" event (see <a href="#2.4">&sect;2.4</a>). · 30 unmodified lines
4371<p>4478<p>
4372Pops a value from the stack and4479Pops a value from the stack and
4373sets it as the new value of global <code>name</code>.4480sets it as the new value of global <code>name</code>.
4374It is defined as a macro.
4375 4481
4376 4482
4377 4483
4378 4484
4379 4485
4380<hr><h3><a name="lua_setmetatable"><code>lua_setmetatable</code></a></h3><p>4486<hr><h3><a name="lua_setmetatable"><code>lua_setmetatable</code></a></h3><p>
4381<span class="apii">[-1, +0, <em>-</em>]</span>4487<span class="apii">[-1, +0, &ndash;]</span>
4382<pre>void lua_setmetatable (lua_State *L, int index);</pre>4488<pre>void lua_setmetatable (lua_State *L, int index);</pre>
4383 4489
4384<p>4490<p>
@@ -4411,7 +4517,7 @@ for the "newindex" event (see <a href="#2.4">&sect;2.4</a>). · 26 unmodified lines
4411 4517
4412 4518
4413<hr><h3><a name="lua_settop"><code>lua_settop</code></a></h3><p>4519<hr><h3><a name="lua_settop"><code>lua_settop</code></a></h3><p>
4414<span class="apii">[-?, +?, <em>-</em>]</span>4520<span class="apii">[-?, +?, &ndash;]</span>
4415<pre>void lua_settop (lua_State *L, int index);</pre>4521<pre>void lua_settop (lua_State *L, int index);</pre>
4416 4522
4417<p>4523<p>
@@ -4426,7 +4532,7 @@ If <code>index</code> is&nbsp;0, then all stack elements are removed. · 8 unmodified lines
4426 4532
4427 4533
4428<hr><h3><a name="lua_setuservalue"><code>lua_setuservalue</code></a></h3><p>4534<hr><h3><a name="lua_setuservalue"><code>lua_setuservalue</code></a></h3><p>
4429<span class="apii">[-1, +0, <em>-</em>]</span>4535<span class="apii">[-1, +0, &ndash;]</span>
4430<pre>void lua_setuservalue (lua_State *L, int index);</pre>4536<pre>void lua_setuservalue (lua_State *L, int index);</pre>
4431 4537
4432<p>4538<p>
@@ -4457,7 +4563,7 @@ which creates a Lua state from scratch. · 24 unmodified lines
4457 4563
4458 4564
4459<hr><h3><a name="lua_status"><code>lua_status</code></a></h3><p>4565<hr><h3><a name="lua_status"><code>lua_status</code></a></h3><p>
4460<span class="apii">[-0, +0, <em>-</em>]</span>4566<span class="apii">[-0, +0, &ndash;]</span>
4461<pre>int lua_status (lua_State *L);</pre>4567<pre>int lua_status (lua_State *L);</pre>
4462 4568
4463<p>4569<p>
@@ -4482,7 +4588,7 @@ You can resume threads with status <a href="#pdf-LUA_OK"><code>LUA_OK</code></a> · 18 unmodified lines
4482 4588
4483 4589
4484<hr><h3><a name="lua_toboolean"><code>lua_toboolean</code></a></h3><p>4590<hr><h3><a name="lua_toboolean"><code>lua_toboolean</code></a></h3><p>
4485<span class="apii">[-0, +0, <em>-</em>]</span>4591<span class="apii">[-0, +0, &ndash;]</span>
4486<pre>int lua_toboolean (lua_State *L, int index);</pre>4592<pre>int lua_toboolean (lua_State *L, int index);</pre>
4487 4593
4488<p>4594<p>
@@ -4501,7 +4607,7 @@ use <a href="#lua_isboolean"><code>lua_isboolean</code></a> to test the value's · 12 unmodified lines
4501 4607
4502 4608
4503<hr><h3><a name="lua_tocfunction"><code>lua_tocfunction</code></a></h3><p>4609<hr><h3><a name="lua_tocfunction"><code>lua_tocfunction</code></a></h3><p>
4504<span class="apii">[-0, +0, <em>-</em>]</span>4610<span class="apii">[-0, +0, &ndash;]</span>
4505<pre>lua_CFunction lua_tocfunction (lua_State *L, int index);</pre>4611<pre>lua_CFunction lua_tocfunction (lua_State *L, int index);</pre>
4506 4612
4507<p>4613<p>
@@ -4514,18 +4620,18 @@ otherwise, returns <code>NULL</code>. · 6 unmodified lines
4514 4620
4515 4621
4516<hr><h3><a name="lua_tointeger"><code>lua_tointeger</code></a></h3><p>4622<hr><h3><a name="lua_tointeger"><code>lua_tointeger</code></a></h3><p>
4517<span class="apii">[-0, +0, <em>-</em>]</span>4623<span class="apii">[-0, +0, &ndash;]</span>
4518<pre>lua_Integer lua_tointeger (lua_State *L, int index);</pre>4624<pre>lua_Integer lua_tointeger (lua_State *L, int index);</pre>
4519 4625
4520<p>4626<p>
4521A macro equivalent to <code>lua_tointegerx(L, index, NULL)</code>.4627Equivalent to <a href="#lua_tointegerx"><code>lua_tointegerx</code></a> with <code>isnum</code> equal to <code>NULL</code>.
4522 4628
4523 4629
4524 4630
4525 4631
4526 4632
4527<hr><h3><a name="lua_tointegerx"><code>lua_tointegerx</code></a></h3><p>4633<hr><h3><a name="lua_tointegerx"><code>lua_tointegerx</code></a></h3><p>
4528<span class="apii">[-0, +0, <em>-</em>]</span>4634<span class="apii">[-0, +0, &ndash;]</span>
4529<pre>lua_Integer lua_tointegerx (lua_State *L, int index, int *isnum);</pre>4635<pre>lua_Integer lua_tointegerx (lua_State *L, int index, int *isnum);</pre>
4530 4636
4531<p>4637<p>
@@ -4533,7 +4639,7 @@ Converts the Lua value at the given acceptable index · 1 unmodified line
4533to the signed integral type <a href="#lua_Integer"><code>lua_Integer</code></a>.4639to the signed integral type <a href="#lua_Integer"><code>lua_Integer</code></a>.
4534The Lua value must be a number or a string convertible to a number4640The Lua value must be a number or a string convertible to a number
4535(see <a href="#3.4.2">&sect;3.4.2</a>);4641(see <a href="#3.4.2">&sect;3.4.2</a>);
4536otherwise, <a href="#lua_tointegerx"><code>lua_tointegerx</code></a> returns&nbsp;0.4642otherwise, <code>lua_tointegerx</code> returns&nbsp;0.
4537 4643
4538 4644
4539<p>4645<p>
@@ -4542,7 +4648,7 @@ it is truncated in some non-specified way. · 2 unmodified lines
4542 4648
4543 4649
4544<p>4650<p>
4545If <code>isnum</code> is different from <code>NULL</code>,4651If <code>isnum</code> is not <code>NULL</code>,
4546its referent is assigned a boolean value that4652its referent is assigned a boolean value that
4547indicates whether the operation succeeded.4653indicates whether the operation succeeded.
4548 4654
@@ -4561,20 +4667,20 @@ it also sets <code>*len</code> with the string length. · 12 unmodified lines
4561The Lua value must be a string or a number;4667The Lua value must be a string or a number;
4562otherwise, the function returns <code>NULL</code>.4668otherwise, the function returns <code>NULL</code>.
4563If the value is a number,4669If the value is a number,
4564then <a href="#lua_tolstring"><code>lua_tolstring</code></a> also4670then <code>lua_tolstring</code> also
4565<em>changes the actual value in the stack to a string</em>.4671<em>changes the actual value in the stack to a string</em>.
4566(This change confuses <a href="#lua_next"><code>lua_next</code></a>4672(This change confuses <a href="#lua_next"><code>lua_next</code></a>
4567when <a href="#lua_tolstring"><code>lua_tolstring</code></a> is applied to keys during a table traversal.)4673when <code>lua_tolstring</code> is applied to keys during a table traversal.)
4568 4674
4569 4675
4570<p>4676<p>
4571<a href="#lua_tolstring"><code>lua_tolstring</code></a> returns a fully aligned pointer4677<code>lua_tolstring</code> returns a fully aligned pointer
4572to a string inside the Lua state.4678to a string inside the Lua state.
4573This string always has a zero ('<code>\0</code>')4679This string always has a zero ('<code>\0</code>')
4574after its last character (as in&nbsp;C),4680after its last character (as in&nbsp;C),
4575but can contain other zeros in its body.4681but can contain other zeros in its body.
4576Because Lua has garbage collection,4682Because Lua has garbage collection,
4577there is no guarantee that the pointer returned by <a href="#lua_tolstring"><code>lua_tolstring</code></a>4683there is no guarantee that the pointer returned by <code>lua_tolstring</code>
4578will be valid after the corresponding value is removed from the stack.4684will be valid after the corresponding value is removed from the stack.
4579 4685
4580 4686
@@ -4582,18 +4688,18 @@ will be valid after the corresponding value is removed from the stack. · 1 unmodified line
4582 4688
4583 4689
4584<hr><h3><a name="lua_tonumber"><code>lua_tonumber</code></a></h3><p>4690<hr><h3><a name="lua_tonumber"><code>lua_tonumber</code></a></h3><p>
4585<span class="apii">[-0, +0, <em>-</em>]</span>4691<span class="apii">[-0, +0, &ndash;]</span>
4586<pre>lua_Number lua_tonumber (lua_State *L, int index);</pre>4692<pre>lua_Number lua_tonumber (lua_State *L, int index);</pre>
4587 4693
4588<p>4694<p>
4589A macro equivalent to <code>lua_tonumberx(L, index, NULL)</code>.4695Equivalent to <a href="#lua_tonumberx"><code>lua_tonumberx</code></a> with <code>isnum</code> equal to <code>NULL</code>.
4590 4696
4591 4697
4592 4698
4593 4699
4594 4700
4595<hr><h3><a name="lua_tonumberx"><code>lua_tonumberx</code></a></h3><p>4701<hr><h3><a name="lua_tonumberx"><code>lua_tonumberx</code></a></h3><p>
4596<span class="apii">[-0, +0, <em>-</em>]</span>4702<span class="apii">[-0, +0, &ndash;]</span>
4597<pre>lua_Number lua_tonumberx (lua_State *L, int index, int *isnum);</pre>4703<pre>lua_Number lua_tonumberx (lua_State *L, int index, int *isnum);</pre>
4598 4704
4599<p>4705<p>
@@ -4605,7 +4711,7 @@ otherwise, <a href="#lua_tonumberx"><code>lua_tonumberx</code></a> returns&nbsp; · 5 unmodified lines
4605 4711
4606 4712
4607<p>4713<p>
4608If <code>isnum</code> is different from <code>NULL</code>,4714If <code>isnum</code> is not <code>NULL</code>,
4609its referent is assigned a boolean value that4715its referent is assigned a boolean value that
4610indicates whether the operation succeeded.4716indicates whether the operation succeeded.
4611 4717
@@ -4614,14 +4720,14 @@ indicates whether the operation succeeded. · 2 unmodified lines
4614 4720
4615 4721
4616<hr><h3><a name="lua_topointer"><code>lua_topointer</code></a></h3><p>4722<hr><h3><a name="lua_topointer"><code>lua_topointer</code></a></h3><p>
4617<span class="apii">[-0, +0, <em>-</em>]</span>4723<span class="apii">[-0, +0, &ndash;]</span>
4618<pre>const void *lua_topointer (lua_State *L, int index);</pre>4724<pre>const void *lua_topointer (lua_State *L, int index);</pre>
4619 4725
4620<p>4726<p>
4621Converts the value at the given acceptable index to a generic4727Converts the value at the given acceptable index to a generic
4622C&nbsp;pointer (<code>void*</code>).4728C&nbsp;pointer (<code>void*</code>).
4623The value can be a userdata, a table, a thread, or a function;4729The value can be a userdata, a table, a thread, or a function;
4624otherwise, <a href="#lua_topointer"><code>lua_topointer</code></a> returns <code>NULL</code>.4730otherwise, <code>lua_topointer</code> returns <code>NULL</code>.
4625Different objects will give different pointers.4731Different objects will give different pointers.
4626There is no way to convert the pointer back to its original value.4732There is no way to convert the pointer back to its original value.
4627 4733
@@ -4645,7 +4751,7 @@ Equivalent to <a href="#lua_tolstring"><code>lua_tolstring</code></a> with <code · 17 unmodified lines
4645 4751
4646 4752
4647<hr><h3><a name="lua_tothread"><code>lua_tothread</code></a></h3><p>4753<hr><h3><a name="lua_tothread"><code>lua_tothread</code></a></h3><p>
4648<span class="apii">[-0, +0, <em>-</em>]</span>4754<span class="apii">[-0, +0, &ndash;]</span>
4649<pre>lua_State *lua_tothread (lua_State *L, int index);</pre>4755<pre>lua_State *lua_tothread (lua_State *L, int index);</pre>
4650 4756
4651<p>4757<p>
@@ -4659,18 +4765,18 @@ otherwise, the function returns <code>NULL</code>. · 7 unmodified lines
4659 4765
4660 4766
4661<hr><h3><a name="lua_tounsigned"><code>lua_tounsigned</code></a></h3><p>4767<hr><h3><a name="lua_tounsigned"><code>lua_tounsigned</code></a></h3><p>
4662<span class="apii">[-0, +0, <em>-</em>]</span>4768<span class="apii">[-0, +0, &ndash;]</span>
4663<pre>lua_Unsigned lua_tounsigned (lua_State *L, int index);</pre>4769<pre>lua_Unsigned lua_tounsigned (lua_State *L, int index);</pre>
4664 4770
4665<p>4771<p>
4666A macro equivalent to <code>lua_tounsignedx(L, index, NULL)</code>.4772Equivalent to <a href="#lua_tounsignedx"><code>lua_tounsignedx</code></a> with <code>isnum</code> equal to <code>NULL</code>.
4667 4773
4668 4774
4669 4775
4670 4776
4671 4777
4672<hr><h3><a name="lua_tounsignedx"><code>lua_tounsignedx</code></a></h3><p>4778<hr><h3><a name="lua_tounsignedx"><code>lua_tounsignedx</code></a></h3><p>
4673<span class="apii">[-0, +0, <em>-</em>]</span>4779<span class="apii">[-0, +0, &ndash;]</span>
4674<pre>lua_Unsigned lua_tounsignedx (lua_State *L, int index, int *isnum);</pre>4780<pre>lua_Unsigned lua_tounsignedx (lua_State *L, int index, int *isnum);</pre>
4675 4781
4676<p>4782<p>
@@ -4678,7 +4784,7 @@ Converts the Lua value at the given acceptable index · 1 unmodified line
4678to the unsigned integral type <a href="#lua_Unsigned"><code>lua_Unsigned</code></a>.4784to the unsigned integral type <a href="#lua_Unsigned"><code>lua_Unsigned</code></a>.
4679The Lua value must be a number or a string convertible to a number4785The Lua value must be a number or a string convertible to a number
4680(see <a href="#3.4.2">&sect;3.4.2</a>);4786(see <a href="#3.4.2">&sect;3.4.2</a>);
4681otherwise, <a href="#lua_tounsignedx"><code>lua_tounsignedx</code></a> returns&nbsp;0.4787otherwise, <code>lua_tounsignedx</code> returns&nbsp;0.
4682 4788
4683 4789
4684<p>4790<p>
@@ -4690,7 +4796,7 @@ one more than the maximum representable value. · 5 unmodified lines
4690 4796
4691 4797
4692<p>4798<p>
4693If <code>isnum</code> is different from <code>NULL</code>,4799If <code>isnum</code> is not <code>NULL</code>,
4694its referent is assigned a boolean value that4800its referent is assigned a boolean value that
4695indicates whether the operation succeeded.4801indicates whether the operation succeeded.
4696 4802
@@ -4699,7 +4805,7 @@ indicates whether the operation succeeded. · 2 unmodified lines
4699 4805
4700 4806
4701<hr><h3><a name="lua_touserdata"><code>lua_touserdata</code></a></h3><p>4807<hr><h3><a name="lua_touserdata"><code>lua_touserdata</code></a></h3><p>
4702<span class="apii">[-0, +0, <em>-</em>]</span>4808<span class="apii">[-0, +0, &ndash;]</span>
4703<pre>void *lua_touserdata (lua_State *L, int index);</pre>4809<pre>void *lua_touserdata (lua_State *L, int index);</pre>
4704 4810
4705<p>4811<p>
@@ -4714,13 +4820,12 @@ Otherwise, returns <code>NULL</code>. · 8 unmodified lines
4714 4820
4715 4821
4716<hr><h3><a name="lua_type"><code>lua_type</code></a></h3><p>4822<hr><h3><a name="lua_type"><code>lua_type</code></a></h3><p>
4717<span class="apii">[-0, +0, <em>-</em>]</span>4823<span class="apii">[-0, +0, &ndash;]</span>
4718<pre>int lua_type (lua_State *L, int index);</pre>4824<pre>int lua_type (lua_State *L, int index);</pre>
4719 4825
4720<p>4826<p>
4721Returns the type of the value in the given acceptable index,4827Returns the type of the value in the given acceptable index,
4722or <code>LUA_TNONE</code> for a non-valid index4828or <code>LUA_TNONE</code> for a non-valid index.
4723(that is, an index to an "empty" stack position).
4724The types returned by <a href="#lua_type"><code>lua_type</code></a> are coded by the following constants4829The types returned by <a href="#lua_type"><code>lua_type</code></a> are coded by the following constants
4725defined in <code>lua.h</code>:4830defined in <code>lua.h</code>:
4726<a name="pdf-LUA_TNIL"><code>LUA_TNIL</code></a>,4831<a name="pdf-LUA_TNIL"><code>LUA_TNIL</code></a>,
@@ -4739,7 +4844,7 @@ and · 12 unmodified lines
4739 4844
4740 4845
4741<hr><h3><a name="lua_typename"><code>lua_typename</code></a></h3><p>4846<hr><h3><a name="lua_typename"><code>lua_typename</code></a></h3><p>
4742<span class="apii">[-0, +0, <em>-</em>]</span>4847<span class="apii">[-0, +0, &ndash;]</span>
4743<pre>const char *lua_typename (lua_State *L, int tp);</pre>4848<pre>const char *lua_typename (lua_State *L, int tp);</pre>
4744 4849
4745<p>4850<p>
@@ -4807,11 +4912,11 @@ calling the writer again. · 61 unmodified lines
4807 4912
4808 4913
4809<hr><h3><a name="lua_xmove"><code>lua_xmove</code></a></h3><p>4914<hr><h3><a name="lua_xmove"><code>lua_xmove</code></a></h3><p>
4810<span class="apii">[-?, +?, <em>-</em>]</span>4915<span class="apii">[-?, +?, &ndash;]</span>
4811<pre>void lua_xmove (lua_State *from, lua_State *to, int n);</pre>4916<pre>void lua_xmove (lua_State *from, lua_State *to, int n);</pre>
4812 4917
4813<p>4918<p>
4814Exchange values between different threads of the same global state.4919Exchange values between different threads of the same state.
4815 4920
4816 4921
4817<p>4922<p>
@@ -4823,7 +4928,7 @@ and pushes them onto the stack <code>to</code>. · 5 unmodified lines
4823 4928
4824 4929
4825<hr><h3><a name="lua_yield"><code>lua_yield</code></a></h3><p>4930<hr><h3><a name="lua_yield"><code>lua_yield</code></a></h3><p>
4826<span class="apii">[-?, +?, <em>-</em>]</span>4931<span class="apii">[-?, +?, &ndash;]</span>
4827<pre>int lua_yield (lua_State *L, int nresults);</pre>4932<pre>int lua_yield (lua_State *L, int nresults);</pre>
4828 4933
4829<p>4934<p>
@@ -4838,7 +4943,7 @@ the function calling <code>lua_yield</code>. · 8 unmodified lines
4838 4943
4839 4944
4840<hr><h3><a name="lua_yieldk"><code>lua_yieldk</code></a></h3><p>4945<hr><h3><a name="lua_yieldk"><code>lua_yieldk</code></a></h3><p>
4841<span class="apii">[-?, +?, <em>-</em>]</span>4946<span class="apii">[-?, +?, &ndash;]</span>
4842<pre>int lua_yieldk (lua_State *L, int nresults, int ctx, lua_CFunction k);</pre>4947<pre>int lua_yieldk (lua_State *L, int nresults, int ctx, lua_CFunction k);</pre>
4843 4948
4844<p>4949<p>
@@ -4850,7 +4955,7 @@ This function should only be called as the · 5 unmodified lines
4850return expression of a C&nbsp;function, as follows:4955return expression of a C&nbsp;function, as follows:
4851 4956
4852<pre>4957<pre>
4853 return lua_yield (L, nresults, i, k);4958 return lua_yieldk (L, n, i, k);
4854</pre><p>4959</pre><p>
4855When a C&nbsp;function calls <a href="#lua_yieldk"><code>lua_yieldk</code></a> in that way,4960When a C&nbsp;function calls <a href="#lua_yieldk"><code>lua_yieldk</code></a> in that way,
4856the running coroutine suspends its execution,4961the running coroutine suspends its execution,
@@ -4928,7 +5033,7 @@ If <code>source</code> starts with a '<code>@</code>', · 71 unmodified lines
4928it means that the function was defined in a file where5033it means that the function was defined in a file where
4929the file name follows the '<code>@</code>'.5034the file name follows the '<code>@</code>'.
4930If <code>source</code> starts with a '<code>=</code>',5035If <code>source</code> starts with a '<code>=</code>',
4931the rest of it should describe the source in a user-dependent manner.5036the remainder of its contents describe the source in a user-dependent manner.
4932Otherwise,5037Otherwise,
4933the function was defined in a string where5038the function was defined in a string where
4934<code>source</code> is that string.5039<code>source</code> is that string.
@@ -4994,7 +5099,7 @@ the number of fixed parameters of the function · 59 unmodified lines
4994</li>5099</li>
4995 5100
4996<li><b><code>isvararg</code>: </b>5101<li><b><code>isvararg</code>: </b>
4997whether the function is a vararg function5102true if the function is a vararg function
4998(always true for C&nbsp;functions).5103(always true for C&nbsp;functions).
4999</li>5104</li>
5000 5105
@@ -5004,7 +5109,7 @@ whether the function is a vararg function · 3 unmodified lines
5004 5109
5005 5110
5006<hr><h3><a name="lua_gethook"><code>lua_gethook</code></a></h3><p>5111<hr><h3><a name="lua_gethook"><code>lua_gethook</code></a></h3><p>
5007<span class="apii">[-0, +0, <em>-</em>]</span>5112<span class="apii">[-0, +0, &ndash;]</span>
5008<pre>lua_Hook lua_gethook (lua_State *L);</pre>5113<pre>lua_Hook lua_gethook (lua_State *L);</pre>
5009 5114
5010<p>5115<p>
@@ -5015,7 +5120,7 @@ Returns the current hook function. · 4 unmodified lines
5015 5120
5016 5121
5017<hr><h3><a name="lua_gethookcount"><code>lua_gethookcount</code></a></h3><p>5122<hr><h3><a name="lua_gethookcount"><code>lua_gethookcount</code></a></h3><p>
5018<span class="apii">[-0, +0, <em>-</em>]</span>5123<span class="apii">[-0, +0, &ndash;]</span>
5019<pre>int lua_gethookcount (lua_State *L);</pre>5124<pre>int lua_gethookcount (lua_State *L);</pre>
5020 5125
5021<p>5126<p>
@@ -5026,7 +5131,7 @@ Returns the current hook count. · 4 unmodified lines
5026 5131
5027 5132
5028<hr><h3><a name="lua_gethookmask"><code>lua_gethookmask</code></a></h3><p>5133<hr><h3><a name="lua_gethookmask"><code>lua_gethookmask</code></a></h3><p>
5029<span class="apii">[-0, +0, <em>-</em>]</span>5134<span class="apii">[-0, +0, &ndash;]</span>
5030<pre>int lua_gethookmask (lua_State *L);</pre>5135<pre>int lua_gethookmask (lua_State *L);</pre>
5031 5136
5032<p>5137<p>
@@ -5115,7 +5220,7 @@ This function returns 0 on error · 82 unmodified lines
5115 5220
5116 5221
5117<hr><h3><a name="lua_getlocal"><code>lua_getlocal</code></a></h3><p>5222<hr><h3><a name="lua_getlocal"><code>lua_getlocal</code></a></h3><p>
5118<span class="apii">[-0, +(0|1), <em>-</em>]</span>5223<span class="apii">[-0, +(0|1), &ndash;]</span>
5119<pre>const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);</pre>5224<pre>const char *lua_getlocal (lua_State *L, lua_Debug *ar, int n);</pre>
5120 5225
5121<p>5226<p>
@@ -5156,7 +5261,7 @@ the number of active local variables. · 34 unmodified lines
5156 5261
5157 5262
5158<hr><h3><a name="lua_getstack"><code>lua_getstack</code></a></h3><p>5263<hr><h3><a name="lua_getstack"><code>lua_getstack</code></a></h3><p>
5159<span class="apii">[-0, +0, <em>-</em>]</span>5264<span class="apii">[-0, +0, &ndash;]</span>
5160<pre>int lua_getstack (lua_State *L, int level, lua_Debug *ar);</pre>5265<pre>int lua_getstack (lua_State *L, int level, lua_Debug *ar);</pre>
5161 5266
5162<p>5267<p>
@@ -5179,7 +5284,7 @@ it returns 0. · 16 unmodified lines
5179 5284
5180 5285
5181<hr><h3><a name="lua_getupvalue"><code>lua_getupvalue</code></a></h3><p>5286<hr><h3><a name="lua_getupvalue"><code>lua_getupvalue</code></a></h3><p>
5182<span class="apii">[-0, +(0|1), <em>-</em>]</span>5287<span class="apii">[-0, +(0|1), &ndash;]</span>
5183<pre>const char *lua_getupvalue (lua_State *L, int funcindex, int n);</pre>5288<pre>const char *lua_getupvalue (lua_State *L, int funcindex, int n);</pre>
5184 5289
5185<p>5290<p>
@@ -5241,7 +5346,7 @@ this execution occurs without any calls to hooks. · 55 unmodified lines
5241 5346
5242 5347
5243<hr><h3><a name="lua_sethook"><code>lua_sethook</code></a></h3><p>5348<hr><h3><a name="lua_sethook"><code>lua_sethook</code></a></h3><p>
5244<span class="apii">[-0, +0, <em>-</em>]</span>5349<span class="apii">[-0, +0, &ndash;]</span>
5245<pre>int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);</pre>5350<pre>int lua_sethook (lua_State *L, lua_Hook f, int mask, int count);</pre>
5246 5351
5247<p>5352<p>
@@ -5294,7 +5399,7 @@ A hook is disabled by setting <code>mask</code> to zero. · 46 unmodified lines
5294 5399
5295 5400
5296<hr><h3><a name="lua_setlocal"><code>lua_setlocal</code></a></h3><p>5401<hr><h3><a name="lua_setlocal"><code>lua_setlocal</code></a></h3><p>
5297<span class="apii">[-(0|1), +0, <em>-</em>]</span>5402<span class="apii">[-(0|1), +0, &ndash;]</span>
5298<pre>const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);</pre>5403<pre>const char *lua_setlocal (lua_State *L, lua_Debug *ar, int n);</pre>
5299 5404
5300<p>5405<p>
@@ -5316,7 +5421,7 @@ the number of active local variables. · 15 unmodified lines
5316 5421
5317 5422
5318<hr><h3><a name="lua_setupvalue"><code>lua_setupvalue</code></a></h3><p>5423<hr><h3><a name="lua_setupvalue"><code>lua_setupvalue</code></a></h3><p>
5319<span class="apii">[-(0|1), +0, <em>-</em>]</span>5424<span class="apii">[-(0|1), +0, &ndash;]</span>
5320<pre>const char *lua_setupvalue (lua_State *L, int funcindex, int n);</pre>5425<pre>const char *lua_setupvalue (lua_State *L, int funcindex, int n);</pre>
5321 5426
5322<p>5427<p>
@@ -5337,7 +5442,7 @@ when the index is greater than the number of upvalues. · 14 unmodified lines
5337 5442
5338 5443
5339<hr><h3><a name="lua_upvalueid"><code>lua_upvalueid</code></a></h3><p>5444<hr><h3><a name="lua_upvalueid"><code>lua_upvalueid</code></a></h3><p>
5340<span class="apii">[-0, +0, <em>-</em>]</span>5445<span class="apii">[-0, +0, &ndash;]</span>
5341<pre>void *lua_upvalueid (lua_State *L, int funcindex, int n);</pre>5446<pre>void *lua_upvalueid (lua_State *L, int funcindex, int n);</pre>
5342 5447
5343<p>5448<p>
@@ -5386,7 +5491,7 @@ common tasks. · 42 unmodified lines
5386 5491
5387 5492
5388<p>5493<p>
5389All functions from the auxiliary library5494All functions and types from the auxiliary library
5390are defined in header file <code>lauxlib.h</code> and5495are defined in header file <code>lauxlib.h</code> and
5391have a prefix <code>luaL_</code>.5496have a prefix <code>luaL_</code>.
5392 5497
@@ -5395,6 +5500,8 @@ have a prefix <code>luaL_</code>. · 2 unmodified lines
5395All functions in the auxiliary library are built on5500All functions in the auxiliary library are built on
5396top of the basic API,5501top of the basic API,
5397and so they provide nothing that cannot be done with that API.5502and so they provide nothing that cannot be done with that API.
5503Nevertheless, the use of the auxiliary library ensures
5504more consistency to your code.
5398 5505
5399 5506
5400<p>5507<p>
@@ -5432,7 +5539,7 @@ in alphabetical order. · 31 unmodified lines
5432<pre>void luaL_addchar (luaL_Buffer *B, char c);</pre>5539<pre>void luaL_addchar (luaL_Buffer *B, char c);</pre>
5433 5540
5434<p>5541<p>
5435Adds the character <code>c</code> to the buffer <code>B</code>5542Adds the byte <code>c</code> to the buffer <code>B</code>
5436(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).5543(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).
5437 5544
5438 5545
@@ -5474,7 +5581,7 @@ buffer area (see <a href="#luaL_prepbuffer"><code>luaL_prepbuffer</code></a>). · 35 unmodified lines
5474Adds the zero-terminated string pointed to by <code>s</code>5581Adds the zero-terminated string pointed to by <code>s</code>
5475to the buffer <code>B</code>5582to the buffer <code>B</code>
5476(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).5583(see <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>).
5477The string should not contain embedded zeros.5584The string cannot contain embedded zeros.
5478 5585
5479 5586
5480 5587
@@ -5509,12 +5616,8 @@ which is the value to be added to the buffer. · 28 unmodified lines
5509 5616
5510<p>5617<p>
5511Checks whether <code>cond</code> is true.5618Checks whether <code>cond</code> is true.
5512If not, raises an error with the following message,5619If not, raises an error with a standard message.
5513where <code>func</code> is retrieved from the call stack:
5514 5620
5515<pre>
5516 bad argument #&lt;narg&gt; to &lt;func&gt; (&lt;extramsg&gt;)
5517</pre>
5518 5621
5519 5622
5520 5623
@@ -5524,12 +5627,9 @@ where <code>func</code> is retrieved from the call stack: · 3 unmodified lines
5524<pre>int luaL_argerror (lua_State *L, int narg, const char *extramsg);</pre>5627<pre>int luaL_argerror (lua_State *L, int narg, const char *extramsg);</pre>
5525 5628
5526<p>5629<p>
5527Raises an error with the following message,5630Raises an error with a standard message
5528where <code>func</code> is retrieved from the call stack:5631that includes <code>extramsg</code> as a comment.
5529 5632
5530<pre>
5531 bad argument #&lt;narg&gt; to &lt;func&gt; (&lt;extramsg&gt;)
5532</pre>
5533 5633
5534<p>5634<p>
5535This function never returns,5635This function never returns,
@@ -5553,17 +5653,17 @@ Its pattern of use is as follows: · 17 unmodified lines
5553 5653
5554<ul>5654<ul>
5555 5655
5556<li>First you declare a variable <code>b</code> of type <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>.</li>5656<li>First declare a variable <code>b</code> of type <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>.</li>
5557 5657
5558<li>Then you initialize it with a call <code>luaL_buffinit(L, &amp;b)</code>.</li>5658<li>Then initialize it with a call <code>luaL_buffinit(L, &amp;b)</code>.</li>
5559 5659
5560<li>5660<li>
5561Then you add string pieces to the buffer calling any of5661Then add string pieces to the buffer calling any of
5562the <code>luaL_add*</code> functions.5662the <code>luaL_add*</code> functions.
5563</li>5663</li>
5564 5664
5565<li>5665<li>
5566You finish by calling <code>luaL_pushresult(&amp;b)</code>.5666Finish by calling <code>luaL_pushresult(&amp;b)</code>.
5567This call leaves the final string on the top of the stack.5667This call leaves the final string on the top of the stack.
5568</li>5668</li>
5569 5669
@@ -5575,15 +5675,15 @@ you can use the buffer like this: · 5 unmodified lines
5575 5675
5576<ul>5676<ul>
5577 5677
5578<li>First you declare a variable <code>b</code> of type <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>.</li>5678<li>First declare a variable <code>b</code> of type <a href="#luaL_Buffer"><code>luaL_Buffer</code></a>.</li>
5579 5679
5580<li>Then you initialize it and preallocate a space of5680<li>Then initialize it and preallocate a space of
5581size <code>sz</code> with a call <code>luaL_buffinitsize(L, &amp;b, sz)</code>.</li>5681size <code>sz</code> with a call <code>luaL_buffinitsize(L, &amp;b, sz)</code>.</li>
5582 5682
5583<li>Then you copy the string into that space.</li>5683<li>Then copy the string into that space.</li>
5584 5684
5585<li>5685<li>
5586You finish by calling <code>luaL_pushresult(&amp;b, sz)</code>,5686Finish by calling <code>luaL_pushresult(&amp;b, sz)</code>,
5587where <code>sz</code> is the total size of the resulting string5687where <code>sz</code> is the total size of the resulting string
5588copied into that space.5688copied into that space.
5589</li>5689</li>
@@ -5611,7 +5711,7 @@ plus the final string on its top. · 21 unmodified lines
5611 5711
5612 5712
5613<hr><h3><a name="luaL_buffinit"><code>luaL_buffinit</code></a></h3><p>5713<hr><h3><a name="luaL_buffinit"><code>luaL_buffinit</code></a></h3><p>
5614<span class="apii">[-0, +0, <em>-</em>]</span>5714<span class="apii">[-0, +0, &ndash;]</span>
5615<pre>void luaL_buffinit (lua_State *L, luaL_Buffer *B);</pre>5715<pre>void luaL_buffinit (lua_State *L, luaL_Buffer *B);</pre>
5616 5716
5617<p>5717<p>
@@ -5647,7 +5747,7 @@ Calls a metamethod. · 29 unmodified lines
5647<p>5747<p>
5648If the object at index <code>obj</code> has a metatable and this5748If the object at index <code>obj</code> has a metatable and this
5649metatable has a field <code>e</code>,5749metatable has a field <code>e</code>,
5650this function calls this field and passes the object as its only argument.5750this function calls this field passing the object as its only argument.
5651In this case this function returns true and pushes onto the5751In this case this function returns true and pushes onto the
5652stack the value returned by the call.5752stack the value returned by the call.
5653If there is no metatable or no metamethod,5753If there is no metatable or no metamethod,
@@ -5755,7 +5855,7 @@ if the string cannot be found. · 101 unmodified lines
5755<p>5855<p>
5756If <code>def</code> is not <code>NULL</code>,5856If <code>def</code> is not <code>NULL</code>,
5757the function uses <code>def</code> as a default value when5857the function uses <code>def</code> as a default value when
5758there is no argument <code>narg</code> or if this argument is <b>nil</b>.5858there is no argument <code>narg</code> or when this argument is <b>nil</b>.
5759 5859
5760 5860
5761<p>5861<p>
@@ -5836,7 +5936,7 @@ and returns this number cast to a <a href="#lua_Unsigned"><code>lua_Unsigned</co · 74 unmodified lines
5836 5936
5837 5937
5838<hr><h3><a name="luaL_checkversion"><code>luaL_checkversion</code></a></h3><p>5938<hr><h3><a name="luaL_checkversion"><code>luaL_checkversion</code></a></h3><p>
5839<span class="apii">[-0, +0, <em>-</em>]</span>5939<span class="apii">[-0, +0, &ndash;]</span>
5840<pre>void luaL_checkversion (lua_State *L);</pre>5940<pre>void luaL_checkversion (lua_State *L);</pre>
5841 5941
5842<p>5942<p>
@@ -5870,7 +5970,7 @@ or true in case of errors. · 27 unmodified lines
5870 5970
5871 5971
5872<hr><h3><a name="luaL_dostring"><code>luaL_dostring</code></a></h3><p>5972<hr><h3><a name="luaL_dostring"><code>luaL_dostring</code></a></h3><p>
5873<span class="apii">[-0, +?, <em>-</em>]</span>5973<span class="apii">[-0, +?, &ndash;]</span>
5874<pre>int luaL_dostring (lua_State *L, const char *str);</pre>5974<pre>int luaL_dostring (lua_State *L, const char *str);</pre>
5875 5975
5876<p>5976<p>
@@ -5952,7 +6052,7 @@ returns false and pushes nothing. · 75 unmodified lines
5952 6052
5953 6053
5954<hr><h3><a name="luaL_getmetatable"><code>luaL_getmetatable</code></a></h3><p>6054<hr><h3><a name="luaL_getmetatable"><code>luaL_getmetatable</code></a></h3><p>
5955<span class="apii">[-0, +1, <em>-</em>]</span>6055<span class="apii">[-0, +1, &ndash;]</span>
5956<pre>void luaL_getmetatable (lua_State *L, const char *tname);</pre>6056<pre>void luaL_getmetatable (lua_State *L, const char *tname);</pre>
5957 6057
5958<p>6058<p>
@@ -6012,7 +6112,7 @@ Raises an error if the result of the operation is not a number. · 53 unmodified lines
6012 6112
6013 6113
6014<hr><h3><a name="luaL_loadbuffer"><code>luaL_loadbuffer</code></a></h3><p>6114<hr><h3><a name="luaL_loadbuffer"><code>luaL_loadbuffer</code></a></h3><p>
6015<span class="apii">[-0, +1, <em>-</em>]</span>6115<span class="apii">[-0, +1, &ndash;]</span>
6016<pre>int luaL_loadbuffer (lua_State *L,6116<pre>int luaL_loadbuffer (lua_State *L,
6017 const char *buff,6117 const char *buff,
6018 size_t sz,6118 size_t sz,
@@ -6035,7 +6135,16 @@ used for debug information and error messages. · 16 unmodified lines
6035 6135
6036<hr><h3><a name="luaL_loadfile"><code>luaL_loadfile</code></a></h3><p>6136<hr><h3><a name="luaL_loadfile"><code>luaL_loadfile</code></a></h3><p>
6037<span class="apii">[-0, +1, <em>m</em>]</span>6137<span class="apii">[-0, +1, <em>m</em>]</span>
6038<pre>int luaL_loadfile (lua_State *L, const char *filename);</pre>6138<pre>int luaL_loadfile (lua_State *L, const char *filename);</pre><p>
6139Equivalent to <a href="#luaL_loadfilex"><code>luaL_loadfilex</code></a> with <code>mode</code> equal to <code>NULL</code>.
6140
6141
6142
6143
6144<hr><h3><a name="luaL_loadfilex"><code>luaL_loadfilex</code></a></h3><p>
6145<span class="apii">[-0, +1, <em>m</em>]</span>
6146<pre>int luaL_loadfilex (lua_State *L, const char *filename,
6147 const char *mode);</pre>
6039 6148
6040<p>6149<p>
6041Loads a file as a Lua chunk.6150Loads a file as a Lua chunk.
@@ -6046,10 +6155,16 @@ then it loads from the standard input. · 4 unmodified lines
6046The first line in the file is ignored if it starts with a <code>#</code>.6155The first line in the file is ignored if it starts with a <code>#</code>.
6047 6156
6048 6157
6158<p>
6159The string <code>mode</code> works as in function <a href="#pdf-load"><code>load</code></a>,
6160with the addition that
6161a <code>NULL</code> value is equivalent to the string "<code>bt</code>".
6162
6163
6049<p>6164<p>
6050This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>,6165This function returns the same results as <a href="#lua_load"><code>lua_load</code></a>,
6051but it has an extra error code <a name="pdf-LUA_ERRFILE"><code>LUA_ERRFILE</code></a>6166but it has an extra error code <a name="pdf-LUA_ERRFILE"><code>LUA_ERRFILE</code></a>
6052if it cannot open/read the file.6167if it cannot open/read the file or the file has a wrong mode.
6053 6168
6054 6169
6055<p>6170<p>
@@ -6061,7 +6176,7 @@ it does not run it. · 5 unmodified lines
6061 6176
6062 6177
6063<hr><h3><a name="luaL_loadstring"><code>luaL_loadstring</code></a></h3><p>6178<hr><h3><a name="luaL_loadstring"><code>luaL_loadstring</code></a></h3><p>
6064<span class="apii">[-0, +1, <em>-</em>]</span>6179<span class="apii">[-0, +1, &ndash;]</span>
6065<pre>int luaL_loadstring (lua_State *L, const char *s);</pre>6180<pre>int luaL_loadstring (lua_State *L, const char *s);</pre>
6066 6181
6067<p>6182<p>
@@ -6141,7 +6256,7 @@ with <code>tname</code> in the registry. · 73 unmodified lines
6141 6256
6142 6257
6143<hr><h3><a name="luaL_newstate"><code>luaL_newstate</code></a></h3><p>6258<hr><h3><a name="luaL_newstate"><code>luaL_newstate</code></a></h3><p>
6144<span class="apii">[-0, +0, <em>-</em>]</span>6259<span class="apii">[-0, +0, &ndash;]</span>
6145<pre>lua_State *luaL_newstate (void);</pre>6260<pre>lua_State *luaL_newstate (void);</pre>
6146 6261
6147<p>6262<p>
@@ -6434,7 +6549,7 @@ These values are popped from the stack after the registration. · 286 unmodified lines
6434 6549
6435 6550
6436<hr><h3><a name="luaL_setmetatable"><code>luaL_setmetatable</code></a></h3><p>6551<hr><h3><a name="luaL_setmetatable"><code>luaL_setmetatable</code></a></h3><p>
6437<span class="apii">[-0, +0, <em>-</em>]</span>6552<span class="apii">[-0, +0, &ndash;]</span>
6438<pre>void luaL_setmetatable (lua_State *L, const char *tname);</pre>6553<pre>void luaL_setmetatable (lua_State *L, const char *tname);</pre>
6439 6554
6440<p>6555<p>
@@ -6499,7 +6614,7 @@ to start the traceback. · 58 unmodified lines
6499 6614
6500 6615
6501<hr><h3><a name="luaL_typename"><code>luaL_typename</code></a></h3><p>6616<hr><h3><a name="luaL_typename"><code>luaL_typename</code></a></h3><p>
6502<span class="apii">[-0, +0, <em>-</em>]</span>6617<span class="apii">[-0, +0, &ndash;]</span>
6503<pre>const char *luaL_typename (lua_State *L, int index);</pre>6618<pre>const char *luaL_typename (lua_State *L, int index);</pre>
6504 6619
6505<p>6620<p>
@@ -6510,7 +6625,7 @@ Returns the name of the type of the value at the given index. · 4 unmodified lines
6510 6625
6511 6626
6512<hr><h3><a name="luaL_unref"><code>luaL_unref</code></a></h3><p>6627<hr><h3><a name="luaL_unref"><code>luaL_unref</code></a></h3><p>
6513<span class="apii">[-0, +0, <em>-</em>]</span>6628<span class="apii">[-0, +0, &ndash;]</span>
6514<pre>void luaL_unref (lua_State *L, int t, int ref);</pre>6629<pre>void luaL_unref (lua_State *L, int t, int ref);</pre>
6515 6630
6516<p>6631<p>
@@ -6575,28 +6690,28 @@ Currently, Lua has the following standard libraries: · 58 unmodified lines
6575 6690
6576<ul>6691<ul>
6577 6692
6578<li>basic library;</li>6693<li>basic library (<a href="#6.1">&sect;6.1</a>);</li>
6579 6694
6580<li>package library;</li>6695<li>coroutine library (<a href="#6.2">&sect;6.2</a>);</li>
6581 6696
6582<li>coroutine library;</li>6697<li>package library (<a href="#6.3">&sect;6.3</a>);</li>
6583 6698
6584<li>string manipulation;</li>6699<li>string manipulation (<a href="#6.4">&sect;6.4</a>);</li>
6585 6700
6586<li>table manipulation;</li>6701<li>table manipulation (<a href="#6.5">&sect;6.5</a>);</li>
6587 6702
6588<li>mathematical functions (sin, log, etc.);</li>6703<li>mathematical functions (<a href="#6.6">&sect;6.6</a>) (sin, log, etc.);</li>
6589 6704
6590<li>bitwise operations;</li>6705<li>bitwise operations (<a href="#6.7">&sect;6.7</a>);</li>
6591 6706
6592<li>input and output;</li>6707<li>input and output (<a href="#6.8">&sect;6.8</a>);</li>
6593 6708
6594<li>operating system facilities;</li>6709<li>operating system facilities (<a href="#6.9">&sect;6.9</a>);</li>
6595 6710
6596<li>debug facilities.</li>6711<li>debug facilities (<a href="#6.10">&sect;6.10</a>).</li>
6597 6712
6598</ul><p>6713</ul><p>
6599Except for the basic and package libraries,6714Except for the basic and the package libraries,
6600each library provides all its functions as fields of a global table6715each library provides all its functions as fields of a global table
6601or as methods of its objects.6716or as methods of its objects.
6602 6717
@@ -6627,7 +6742,7 @@ e.g., by using <a href="#lua_call"><code>lua_call</code></a>. · 24 unmodified lines
6627<h2>6.1 &ndash; <a name="6.1">Basic Functions</a></h2>6742<h2>6.1 &ndash; <a name="6.1">Basic Functions</a></h2>
6628 6743
6629<p>6744<p>
6630The basic library provides some core functions to Lua.6745The basic library provides core functions to Lua.
6631If you do not include this library in your application,6746If you do not include this library in your application,
6632you should check carefully whether you need to provide6747you should check carefully whether you need to provide
6633implementations for some of its facilities.6748implementations for some of its facilities.
@@ -6660,13 +6775,13 @@ This is the default option. · 26 unmodified lines
6660</li>6775</li>
6661 6776
6662<li><b>"<code>stop</code>": </b>6777<li><b>"<code>stop</code>": </b>
6663stops automatic invocation of the garbage collector.6778stops automatic execution of the garbage collector.
6664The collector will run only when explcitly invoked,6779The collector will run only when explicitly invoked,
6665until a call to restart it.6780until a call to restart it.
6666</li>6781</li>
6667 6782
6668<li><b>"<code>restart</code>": </b>6783<li><b>"<code>restart</code>": </b>
6669restarts automatic invocation the garbage collector.6784restarts automatic execution of the garbage collector.
6670</li>6785</li>
6671 6786
6672<li><b>"<code>count</code>": </b>6787<li><b>"<code>count</code>": </b>
@@ -6709,6 +6824,16 @@ returns a boolean that tells whether the collector is running · 36 unmodified lines
6709(i.e., not stopped).6824(i.e., not stopped).
6710</li>6825</li>
6711 6826
6827<li><b>"<code>generational</code>": </b>
6828changes the collector to generational mode.
6829This is an experimental feature (see <a href="#2.5">&sect;2.5</a>).
6830</li>
6831
6832<li><b>"<code>incremental</code>": </b>
6833changes the collector to incremental mode.
6834This is the default mode.
6835</li>
6836
6712</ul>6837</ul>
6713 6838
6714 6839
@@ -6789,7 +6914,7 @@ so that the construction · 74 unmodified lines
6789<pre>6914<pre>
6790 for i,v in ipairs(t) do <em>body</em> end6915 for i,v in ipairs(t) do <em>body</em> end
6791</pre><p>6916</pre><p>
6792will iterate over the pairs (<code>1,t[1]</code>), (<code>2,t[2]</code>), &middot;&middot;&middot;,6917will iterate over the pairs (<code>1,t[1]</code>), (<code>2,t[2]</code>), ...,
6793up to the first integer key absent from the table.6918up to the first integer key absent from the table.
6794 6919
6795 6920
@@ -6823,8 +6948,8 @@ If the resulting function has upvalues, · 27 unmodified lines
6823the first upvalue is set to the value of the6948the first upvalue is set to the value of the
6824global environment or to <code>env</code>,6949global environment or to <code>env</code>,
6825if that parameter is given.6950if that parameter is given.
6826(When loading main chunks,6951When loading main chunks,
6827the first upvalue will be the <code>_ENV</code> variable (see <a href="#2.2">&sect;2.2</a>).)6952the first upvalue will be the <code>_ENV</code> variable (see <a href="#2.2">&sect;2.2</a>).
6828 6953
6829 6954
6830<p>6955<p>
@@ -6832,21 +6957,22 @@ the first upvalue will be the <code>_ENV</code> variable (see <a href="#2.2">&se · 1 unmodified line
6832and debug information (see <a href="#4.9">&sect;4.9</a>).6957and debug information (see <a href="#4.9">&sect;4.9</a>).
6833When absent,6958When absent,
6834it defaults to <code>ld</code>, if <code>ld</code> is a string,6959it defaults to <code>ld</code>, if <code>ld</code> is a string,
6835or to "<code>=(load)</code>".6960or to "<code>=(load)</code>" otherwise.
6836 6961
6837 6962
6838<p>6963<p>
6839The string <code>mode</code> controls whether the chunk can be text or binary6964The string <code>mode</code> controls whether the chunk can be text or binary
6840(that is, a precompiled chunk).6965(that is, a precompiled chunk).
6841A letter '<code>t</code>' in <code>mode</code> allows a text chunk;6966It may be the string "<code>b</code>" (only binary chunks),
6842a letter '<code>b</code>' allows a binary chunk.6967"<code>t</code>" (only text chunks),
6968or "<code>bt</code>" (both binary and text).
6843The default is "<code>bt</code>".6969The default is "<code>bt</code>".
6844 6970
6845 6971
6846 6972
6847 6973
6848<p>6974<p>
6849<hr><h3><a name="pdf-loadfile"><code>loadfile ([filename])</code></a></h3>6975<hr><h3><a name="pdf-loadfile"><code>loadfile ([filename [, mode [, env]]])</code></a></h3>
6850 6976
6851 6977
6852<p>6978<p>
@@ -6945,13 +7071,14 @@ In case of any error, <code>pcall</code> returns <b>false</b> plus the error mes · 92 unmodified lines
6945 7071
6946<p>7072<p>
6947<hr><h3><a name="pdf-print"><code>print (&middot;&middot;&middot;)</code></a></h3>7073<hr><h3><a name="pdf-print"><code>print (&middot;&middot;&middot;)</code></a></h3>
6948Receives any number of arguments,7074Receives any number of arguments
6949and prints their values to <code>stdout</code>,7075and prints their values to <code>stdout</code>,
6950using the <a href="#pdf-tostring"><code>tostring</code></a> function to convert them to strings.7076using the <a href="#pdf-tostring"><code>tostring</code></a> function to convert each argument to a string.
6951<code>print</code> is not intended for formatted output,7077<code>print</code> is not intended for formatted output,
6952but only as a quick way to show a value,7078but only as a quick way to show a value,
6953typically for debugging.7079for instance for debugging.
6954For formatted output, use <a href="#pdf-string.format"><code>string.format</code></a>.7080For complete control over the output,
7081use <a href="#pdf-string.format"><code>string.format</code></a> and <a href="#pdf-io.write"><code>io.write</code></a>.
6955 7082
6956 7083
6957 7084
@@ -6990,7 +7117,7 @@ Returns an integer number. · 32 unmodified lines
6990Sets the real value of <code>table[index]</code> to <code>value</code>,7117Sets the real value of <code>table[index]</code> to <code>value</code>,
6991without invoking any metamethod.7118without invoking any metamethod.
6992<code>table</code> must be a table,7119<code>table</code> must be a table,
6993<code>index</code> any value different from <b>nil</b>,7120<code>index</code> any value different from <b>nil</b> and NaN,
6994and <code>value</code> any Lua value.7121and <code>value</code> any Lua value.
6995 7122
6996 7123
@@ -7035,37 +7162,43 @@ This function returns <code>table</code>. · 38 unmodified lines
7035 7162
7036<p>7163<p>
7037<hr><h3><a name="pdf-tonumber"><code>tonumber (e [, base])</code></a></h3>7164<hr><h3><a name="pdf-tonumber"><code>tonumber (e [, base])</code></a></h3>
7038Tries to convert its argument to a number.7165
7039If the argument is already a number or a string convertible7166
7040to a number, then <code>tonumber</code> returns this number;7167<p>
7168When called with no <code>base</code>,
7169<code>tonumber</code> tries to convert its argument to a number.
7170If the argument is already a number or
7171a string convertible to a number (see <a href="#3.4.2">&sect;3.4.2</a>),
7172then <code>tonumber</code> returns this number;
7041otherwise, it returns <b>nil</b>.7173otherwise, it returns <b>nil</b>.
7042 7174
7043 7175
7044<p>7176<p>
7045An optional argument specifies the base to interpret the numeral.7177When called with <code>base</code>,
7178then <code>e</code> should be a string to be interpreted as
7179an integer numeral in that base.
7046The base may be any integer between 2 and 36, inclusive.7180The base may be any integer between 2 and 36, inclusive.
7047In bases above&nbsp;10, the letter '<code>A</code>' (in either upper or lower case)7181In bases above&nbsp;10, the letter '<code>A</code>' (in either upper or lower case)
7048represents&nbsp;10, '<code>B</code>' represents&nbsp;11, and so forth,7182represents&nbsp;10, '<code>B</code>' represents&nbsp;11, and so forth,
7049with '<code>Z</code>' representing 35.7183with '<code>Z</code>' representing 35.
7050In base 10 (the default),7184If the string <code>e</code> is not a valid numeral in the given base,
7051the numeral is converted following the coercion rules (see <a href="#3.4.2">&sect;3.4.2</a>).7185the function returns <b>nil</b>.
7052In other bases, only integers are accepted.
7053 7186
7054 7187
7055 7188
7056 7189
7057<p>7190<p>
7058<hr><h3><a name="pdf-tostring"><code>tostring (e)</code></a></h3>7191<hr><h3><a name="pdf-tostring"><code>tostring (v)</code></a></h3>
7059Receives an argument of any type and7192Receives a value of any type and
7060converts it to a string in a reasonable format.7193converts it to a string in a reasonable format.
7061For complete control of how numbers are converted,7194(For complete control of how numbers are converted,
7062use <a href="#pdf-string.format"><code>string.format</code></a>.7195use <a href="#pdf-string.format"><code>string.format</code></a>.)
7063 7196
7064 7197
7065<p>7198<p>
7066If the metatable of <code>e</code> has a <code>"__tostring"</code> field,7199If the metatable of <code>v</code> has a <code>"__tostring"</code> field,
7067then <code>tostring</code> calls the corresponding value7200then <code>tostring</code> calls the corresponding value
7068with <code>e</code> as argument,7201with <code>v</code> as argument,
7069and uses the result of the call as its result.7202and uses the result of the call as its result.
7070 7203
7071 7204
@@ -7139,11 +7272,11 @@ an object with type <code>"thread"</code>. · 67 unmodified lines
7139Starts or continues the execution of coroutine <code>co</code>.7272Starts or continues the execution of coroutine <code>co</code>.
7140The first time you resume a coroutine,7273The first time you resume a coroutine,
7141it starts running its body.7274it starts running its body.
7142The values <code>val1</code>, &middot;&middot;&middot; are passed7275The values <code>val1</code>, ... are passed
7143as the arguments to the body function.7276as the arguments to the body function.
7144If the coroutine has yielded,7277If the coroutine has yielded,
7145<code>resume</code> restarts it;7278<code>resume</code> restarts it;
7146the values <code>val1</code>, &middot;&middot;&middot; are passed7279the values <code>val1</code>, ... are passed
7147as the results from the yield.7280as the results from the yield.
7148 7281
7149 7282
@@ -7280,7 +7413,7 @@ final value of <code>package.loaded[modname]</code>. · 130 unmodified lines
7280<p>7413<p>
7281If there is any error loading or running the module,7414If there is any error loading or running the module,
7282or if it cannot find any loader for the module,7415or if it cannot find any loader for the module,
7283then <code>require</code> signals an error.7416then <code>require</code> raises an error.
7284 7417
7285 7418
7286 7419
@@ -7309,8 +7442,8 @@ Default is '<code>?</code>'.</li> · 22 unmodified lines
7309is replaced by the executable's directory.7442is replaced by the executable's directory.
7310Default is '<code>!</code>'.</li>7443Default is '<code>!</code>'.</li>
7311 7444
7312<li>The fifth line is a mark to ignore all before it when building the7445<li>The fifth line is a mark to ignore all text before it
7313<code>luaopen_</code> function name.7446when building the <code>luaopen_</code> function name.
7314Default is '<code>-</code>'.</li>7447Default is '<code>-</code>'.</li>
7315 7448
7316</ul>7449</ul>
@@ -7372,7 +7505,7 @@ available to other dynamically linked libraries. · 55 unmodified lines
7372Otherwise,7505Otherwise,
7373it looks for a function <code>funcname</code> inside the library7506it looks for a function <code>funcname</code> inside the library
7374and returns this function as a C&nbsp;function.7507and returns this function as a C&nbsp;function.
7375(So, <code>funcname</code> must follow the protocol (see <a href="#lua_CFunction"><code>lua_CFunction</code></a>)).7508(So, <code>funcname</code> must follow the prototype <a href="#lua_CFunction"><code>lua_CFunction</code></a>).
7376 7509
7377 7510
7378<p>7511<p>
@@ -7409,7 +7542,7 @@ At start-up, Lua initializes this variable with · 30 unmodified lines
7409the value of the environment variable <a name="pdf-LUA_PATH_5_2"><code>LUA_PATH_5_2</code></a> or7542the value of the environment variable <a name="pdf-LUA_PATH_5_2"><code>LUA_PATH_5_2</code></a> or
7410the environment variable <a name="pdf-LUA_PATH"><code>LUA_PATH</code></a> or7543the environment variable <a name="pdf-LUA_PATH"><code>LUA_PATH</code></a> or
7411with a default path defined in <code>luaconf.h</code>,7544with a default path defined in <code>luaconf.h</code>,
7412if the environment variable is not defined.7545if those environment variables are not defined.
7413Any "<code>;;</code>" in the value of the environment variable7546Any "<code>;;</code>" in the value of the environment variable
7414is replaced by the default path.7547is replaced by the default path.
7415 7548
@@ -7511,7 +7644,7 @@ with each submodule keeping its original open function. · 95 unmodified lines
7511 7644
7512 7645
7513<p>7646<p>
7514All searchers except the first (preload) return as the extra value7647All searchers except the first one (preload) return as the extra value
7515the file name where the module was found,7648the file name where the module was found,
7516as returned by <a href="#pdf-package.searchpath"><code>package.searchpath</code></a>.7649as returned by <a href="#pdf-package.searchpath"><code>package.searchpath</code></a>.
7517The first searcher returns no extra value.7650The first searcher returns no extra value.
@@ -7520,7 +7653,7 @@ The first searcher returns no extra value. · 2 unmodified lines
7520 7653
7521 7654
7522<p>7655<p>
7523<hr><h3><a name="pdf-package.searchpath"><code>package.searchpath (name, path [, sep])</code></a></h3>7656<hr><h3><a name="pdf-package.searchpath"><code>package.searchpath (name, path [, sep [, rep]])</code></a></h3>
7524 7657
7525 7658
7526<p>7659<p>
@@ -7528,17 +7661,16 @@ Searches for the given <code>name</code> in the given <code>path</code>. · 1 unmodified line
7528 7661
7529 7662
7530<p>7663<p>
7531A path is string containing a sequence of7664A path is a string containing a sequence of
7532<em>templates</em> separated by semicolons.7665<em>templates</em> separated by semicolons.
7533For each template,7666For each template,
7534the function changes each interrogation7667the function replaces each interrogation mark (if any)
7535mark in the template by a copy of <code>name</code>7668in the template with a copy of <code>name</code>
7536wherein all occurrences of <code>sep</code>7669wherein all occurrences of <code>sep</code>
7537(a dot, by default)7670(a dot, by default)
7538were replaced by the system's directory separator,7671were replaced by <code>rep</code>
7672(the system's directory separator, by default),
7539and then tries to open the resulting file name.7673and then tries to open the resulting file name.
7540If <code>sep</code> is the empty string,
7541the replacement is not done.
7542 7674
7543 7675
7544<p>7676<p>
@@ -7583,7 +7715,7 @@ The string library provides all its functions inside the table · 38 unmodified lines
7583It also sets a metatable for strings7715It also sets a metatable for strings
7584where the <code>__index</code> field points to the <code>string</code> table.7716where the <code>__index</code> field points to the <code>string</code> table.
7585Therefore, you can use the string functions in object-oriented style.7717Therefore, you can use the string functions in object-oriented style.
7586For instance, <code>string.byte(s, i)</code>7718For instance, <code>string.byte(s,i)</code>
7587can be written as <code>s:byte(i)</code>.7719can be written as <code>s:byte(i)</code>.
7588 7720
7589 7721
@@ -7594,13 +7726,15 @@ The string library assumes one-byte character encodings. · 4 unmodified lines
7594<p>7726<p>
7595<hr><h3><a name="pdf-string.byte"><code>string.byte (s [, i [, j]])</code></a></h3>7727<hr><h3><a name="pdf-string.byte"><code>string.byte (s [, i [, j]])</code></a></h3>
7596Returns the internal numerical codes of the characters <code>s[i]</code>,7728Returns the internal numerical codes of the characters <code>s[i]</code>,
7597<code>s[i+1]</code>, &middot;&middot;&middot;, <code>s[j]</code>.7729<code>s[i+1]</code>, ..., <code>s[j]</code>.
7598The default value for <code>i</code> is&nbsp;1;7730The default value for <code>i</code> is&nbsp;1;
7599the default value for <code>j</code> is&nbsp;<code>i</code>.7731the default value for <code>j</code> is&nbsp;<code>i</code>.
7732These indices are corrected
7733following the same rules of function <a href="#pdf-string.sub"><code>string.sub</code></a>.
7600 7734
7601 7735
7602<p>7736<p>
7603Note that numerical codes are not necessarily portable across platforms.7737Numerical codes are not necessarily portable across platforms.
7604 7738
7605 7739
7606 7740
@@ -7614,7 +7748,7 @@ to its corresponding argument. · 7 unmodified lines
7614 7748
7615 7749
7616<p>7750<p>
7617Note that numerical codes are not necessarily portable across platforms.7751Numerical codes are not necessarily portable across platforms.
7618 7752
7619 7753
7620 7754
@@ -7709,7 +7843,7 @@ it is converted to one following the same rules of <a href="#pdf-tostring"><code · 88 unmodified lines
7709<hr><h3><a name="pdf-string.gmatch"><code>string.gmatch (s, pattern)</code></a></h3>7843<hr><h3><a name="pdf-string.gmatch"><code>string.gmatch (s, pattern)</code></a></h3>
7710Returns an iterator function that,7844Returns an iterator function that,
7711each time it is called,7845each time it is called,
7712returns the next captures from <code>pattern</code> over string <code>s</code>.7846returns the next captures from <code>pattern</code> over the string <code>s</code>.
7713If <code>pattern</code> specifies no captures,7847If <code>pattern</code> specifies no captures,
7714then the whole match is produced in each call.7848then the whole match is produced in each call.
7715 7849
@@ -7737,7 +7871,7 @@ given string into a table: · 21 unmodified lines
7737</pre>7871</pre>
7738 7872
7739<p>7873<p>
7740For this function, a '<code>^</code>' at the start of a pattern does not7874For this function, a caret '<code>^</code>' at the start of a pattern does not
7741work as an anchor, as this would prevent the iteration.7875work as an anchor, as this would prevent the iteration.
7742 7876
7743 7877
@@ -7884,6 +8018,17 @@ and <code>string.sub(s, -i)</code> returns a suffix of <code>s</code> · 140 unmodified lines
7884with length <code>i</code>.8018with length <code>i</code>.
7885 8019
7886 8020
8021<p>
8022If, after the translation of negative indices,
8023<code>i</code> is less than zero,
8024it is corrected to zero.
8025If <code>j</code> is greater than the string length,
8026it is corrected to that length.
8027If, after these corrections,
8028<code>i</code> is greater than <code>j</code>,
8029the function returns the empty string.
8030
8031
7887 8032
7888 8033
7889<p>8034<p>
@@ -8050,7 +8195,7 @@ they were the character '<code>\0</code>'. · 160 unmodified lines
8050 8195
8051<h4>Pattern:</h4><p>8196<h4>Pattern:</h4><p>
8052A <em>pattern</em> is a sequence of pattern items.8197A <em>pattern</em> is a sequence of pattern items.
8053A '<code>^</code>' at the beginning of a pattern anchors the match at the8198A caret '<code>^</code>' at the beginning of a pattern anchors the match at the
8054beginning of the subject string.8199beginning of the subject string.
8055A '<code>$</code>' at the end of a pattern anchors the match at the8200A '<code>$</code>' at the end of a pattern anchors the match at the
8056end of the subject string.8201end of the subject string.
@@ -8589,7 +8734,7 @@ result in zero or <code>0xFFFFFFFF</code> (all original bits are shifted out). · 532 unmodified lines
8589 8734
8590 8735
8591<p>8736<p>
8592Returns the bitwise and of its operands.8737Returns the bitwise <em>and</em> of its operands.
8593 8738
8594 8739
8595 8740
@@ -8614,7 +8759,7 @@ the following identity holds: · 18 unmodified lines
8614 8759
8615 8760
8616<p>8761<p>
8617Returns the bitwise or of its operands.8762Returns the bitwise <em>or</em> of its operands.
8618 8763
8619 8764
8620 8765
@@ -8625,7 +8770,7 @@ Returns the bitwise or of its operands. · 4 unmodified lines
8625 8770
8626<p>8771<p>
8627Returns a boolean signaling8772Returns a boolean signaling
8628whether the bitwise and of its operands is different from zero.8773whether the bitwise <em>and</em> of its operands is different from zero.
8629 8774
8630 8775
8631 8776
@@ -8635,7 +8780,7 @@ whether the bitwise and of its operands is different from zero. · 3 unmodified lines
8635 8780
8636 8781
8637<p>8782<p>
8638Returns the bitwise exclusive or of its operands.8783Returns the bitwise <em>exclusive or</em> of its operands.
8639 8784
8640 8785
8641 8786
@@ -8845,7 +8990,7 @@ instead of returning an error code. · 203 unmodified lines
8845 8990
8846 8991
8847<p>8992<p>
8848<hr><h3><a name="pdf-io.lines"><code>io.lines ([filename] &middot;&middot;&middot;)</code></a></h3>8993<hr><h3><a name="pdf-io.lines"><code>io.lines ([filename &middot;&middot;&middot;])</code></a></h3>
8849 8994
8850 8995
8851<p>8996<p>
@@ -8863,6 +9008,11 @@ that is, it iterates over the lines of the default input file. · 11 unmodified lines
8863In this case it does not close the file when the loop ends.9008In this case it does not close the file when the loop ends.
8864 9009
8865 9010
9011<p>
9012In case of errors this function raises the error,
9013instead of returning an error code.
9014
9015
8866 9016
8867 9017
8868<p>9018<p>
@@ -9007,15 +9157,20 @@ each time it is called, · 138 unmodified lines
9007reads the file according to the given formats.9157reads the file according to the given formats.
9008When no format is given,9158When no format is given,
9009uses "*l" as a default.9159uses "*l" as a default.
9010Therefore, the construction9160As an example, the construction
9011 9161
9012<pre>9162<pre>
9013 for c in file:lines(1) do <em>body</em> end9163 for c in file:lines(1) do <em>body</em> end
9014</pre><p>9164</pre><p>
9015will iterate over all characters of the file,9165will iterate over all characters of the file,
9016starting at the current position.9166starting at the current position.
9017(Unlike <a href="#pdf-io.lines"><code>io.lines</code></a>, this function does not close the file9167Unlike <a href="#pdf-io.lines"><code>io.lines</code></a>, this function does not close the file
9018when the loop ends.)9168when the loop ends.
9169
9170
9171<p>
9172In case of errors this function raises the error,
9173instead of returning an error code.
9019 9174
9020 9175
9021 9176
@@ -9062,7 +9217,7 @@ returning <b>nil</b> on end of file. · 40 unmodified lines
9062</li>9217</li>
9063 9218
9064<li><b><em>number</em>: </b>9219<li><b><em>number</em>: </b>
9065reads a string with up to this number of characters,9220reads a string with up to this number of bytes,
9066returning <b>nil</b> on end of file.9221returning <b>nil</b> on end of file.
9067If number is zero,9222If number is zero,
9068it reads nothing and returns an empty string,9223it reads nothing and returns an empty string,
@@ -9088,9 +9243,9 @@ specified by the string <code>whence</code>, as follows: · 19 unmodified lines
9088<li><b>"<code>cur</code>": </b> base is current position;</li>9243<li><b>"<code>cur</code>": </b> base is current position;</li>
9089<li><b>"<code>end</code>": </b> base is end of file;</li>9244<li><b>"<code>end</code>": </b> base is end of file;</li>
9090</ul><p>9245</ul><p>
9091In case of success, function <code>seek</code> returns the final file position,9246In case of success, <code>seek</code> returns the final file position,
9092measured in bytes from the beginning of the file.9247measured in bytes from the beginning of the file.
9093If this function fails, it returns <b>nil</b>,9248If <code>seek</code> fails, it returns <b>nil</b>,
9094plus a string describing the error.9249plus a string describing the error.
9095 9250
9096 9251
@@ -9123,8 +9278,8 @@ no buffering; the result of any output operation appears immediately. · 26 unmodified lines
9123 9278
9124<li><b>"<code>full</code>": </b>9279<li><b>"<code>full</code>": </b>
9125full buffering; output operation is performed only9280full buffering; output operation is performed only
9126when the buffer is full (or when you explicitly <code>flush</code> the file9281when the buffer is full or when
9127(see <a href="#pdf-io.flush"><code>io.flush</code></a>)).9282you explicitly <code>flush</code> the file (see <a href="#pdf-io.flush"><code>io.flush</code></a>).
9128</li>9283</li>
9129 9284
9130<li><b>"<code>line</code>": </b>9285<li><b>"<code>line</code>": </b>
@@ -9146,11 +9301,8 @@ The default is an appropriate size. · 15 unmodified lines
9146 9301
9147 9302
9148<p>9303<p>
9149Writes the value of each of its arguments to9304Writes the value of each of its arguments to <code>file</code>.
9150the <code>file</code>.
9151The arguments must be strings or numbers.9305The arguments must be strings or numbers.
9152To write other values,
9153use <a href="#pdf-tostring"><code>tostring</code></a> or <a href="#pdf-string.format"><code>string.format</code></a> before <code>write</code>.
9154 9306
9155 9307
9156<p>9308<p>
@@ -9202,8 +9354,8 @@ then the date is formatted in Coordinated Universal Time. · 45 unmodified lines
9202After this optional character,9354After this optional character,
9203if <code>format</code> is the string "<code>*t</code>",9355if <code>format</code> is the string "<code>*t</code>",
9204then <code>date</code> returns a table with the following fields:9356then <code>date</code> returns a table with the following fields:
9205<code>year</code> (four digits), <code>month</code> (1--12), <code>day</code> (1--31),9357<code>year</code> (four digits), <code>month</code> (1&ndash;12), <code>day</code> (1&ndash;31),
9206<code>hour</code> (0--23), <code>min</code> (0--59), <code>sec</code> (0--61),9358<code>hour</code> (0&ndash;23), <code>min</code> (0&ndash;59), <code>sec</code> (0&ndash;61),
9207<code>wday</code> (weekday, Sunday is&nbsp;1),9359<code>wday</code> (weekday, Sunday is&nbsp;1),
9208<code>yday</code> (day of the year),9360<code>yday</code> (day of the year),
9209and <code>isdst</code> (daylight saving flag, a boolean).9361and <code>isdst</code> (daylight saving flag, a boolean).
@@ -9314,7 +9466,7 @@ or <b>nil</b> if the variable is not defined. · 104 unmodified lines
9314Deletes the file (or empty directory, on POSIX systems)9466Deletes the file (or empty directory, on POSIX systems)
9315with the given name.9467with the given name.
9316If this function fails, it returns <b>nil</b>,9468If this function fails, it returns <b>nil</b>,
9317plus a string describing the error.9469plus a string describing the error and the error code.
9318 9470
9319 9471
9320 9472
@@ -9326,7 +9478,7 @@ plus a string describing the error. · 5 unmodified lines
9326<p>9478<p>
9327Renames file or directory named <code>oldname</code> to <code>newname</code>.9479Renames file or directory named <code>oldname</code> to <code>newname</code>.
9328If this function fails, it returns <b>nil</b>,9480If this function fails, it returns <b>nil</b>,
9329plus a string describing the error.9481plus a string describing the error and the error code.
9330 9482
9331 9483
9332 9484
@@ -9337,7 +9489,7 @@ plus a string describing the error. · 4 unmodified lines
9337 9489
9338<p>9490<p>
9339Sets the current locale of the program.9491Sets the current locale of the program.
9340<code>locale</code> is a string specifying a locale;9492<code>locale</code> is a system-dependent string specifying a locale;
9341<code>category</code> is an optional string describing which category to change:9493<code>category</code> is an optional string describing which category to change:
9342<code>"all"</code>, <code>"collate"</code>, <code>"ctype"</code>,9494<code>"all"</code>, <code>"collate"</code>, <code>"ctype"</code>,
9343<code>"monetary"</code>, <code>"numeric"</code>, or <code>"time"</code>;9495<code>"monetary"</code>, <code>"numeric"</code>, or <code>"time"</code>;
@@ -9369,8 +9521,12 @@ for the given category. · 25 unmodified lines
9369Returns the current time when called without arguments,9521Returns the current time when called without arguments,
9370or a time representing the date and time specified by the given table.9522or a time representing the date and time specified by the given table.
9371This table must have fields <code>year</code>, <code>month</code>, and <code>day</code>,9523This table must have fields <code>year</code>, <code>month</code>, and <code>day</code>,
9372and may have fields <code>hour</code>, <code>min</code>, <code>sec</code>, and <code>isdst</code>9524and may have fields
9373(for a description of these fields, see the <a href="#pdf-os.date"><code>os.date</code></a> function).9525<code>hour</code> (default is 12),
9526<code>min</code> (default is 0),
9527<code>sec</code> (default is 0),
9528and <code>isdst</code> (default is <b>nil</b>).
9529For a description of these fields, see the <a href="#pdf-os.date"><code>os.date</code></a> function.
9374 9530
9375 9531
9376<p>9532<p>
@@ -9380,7 +9536,7 @@ this number counts the number · 3 unmodified lines
9380of seconds since some given start time (the "epoch").9536of seconds since some given start time (the "epoch").
9381In other systems, the meaning is not specified,9537In other systems, the meaning is not specified,
9382and the number returned by <code>time</code> can be used only as an argument to9538and the number returned by <code>time</code> can be used only as an argument to
9383<code>date</code> and <code>difftime</code>.9539<a href="#pdf-os.date"><code>os.date</code></a> and <a href="#pdf-os.difftime"><code>os.difftime</code></a>.
9384 9540
9385 9541
9386 9542
@@ -9421,9 +9577,9 @@ which automatically removes the file when the program ends. · 34 unmodified lines
9421 9577
9422<p>9578<p>
9423This library provides9579This library provides
9424the functionality of the debug interface to Lua programs.9580the functionality of the debug interface (<a href="#4.9">&sect;4.9</a>) to Lua programs.
9425You should exert care when using this library.9581You should exert care when using this library.
9426Several of these functions9582Several of its functions
9427violate basic assumptions about Lua code9583violate basic assumptions about Lua code
9428(e.g., that variables local to a function9584(e.g., that variables local to a function
9429cannot be accessed from outside;9585cannot be accessed from outside;
@@ -9458,7 +9614,7 @@ so that the caller continues its execution. · 28 unmodified lines
9458 9614
9459<p>9615<p>
9460Note that commands for <code>debug.debug</code> are not lexically nested9616Note that commands for <code>debug.debug</code> are not lexically nested
9461within any function, and so have no direct access to local variables.9617within any function and so have no direct access to local variables.
9462 9618
9463 9619
9464 9620
@@ -9477,20 +9633,20 @@ and the current hook count · 12 unmodified lines
9477 9633
9478 9634
9479<p>9635<p>
9480<hr><h3><a name="pdf-debug.getinfo"><code>debug.getinfo ([thread,] function [, what])</code></a></h3>9636<hr><h3><a name="pdf-debug.getinfo"><code>debug.getinfo ([thread,] f [, what])</code></a></h3>
9481 9637
9482 9638
9483<p>9639<p>
9484Returns a table with information about a function.9640Returns a table with information about a function.
9485You can give the function directly,9641You can give the function directly
9486or you can give a number as the value of <code>function</code>,9642or you can give a number as the value of <code>f</code>,
9487which means the function running at level <code>function</code> of the call stack9643which means the function running at level <code>f</code> of the call stack
9488of the given thread:9644of the given thread:
9489level&nbsp;0 is the current function (<code>getinfo</code> itself);9645level&nbsp;0 is the current function (<code>getinfo</code> itself);
9490level&nbsp;1 is the function that called <code>getinfo</code>9646level&nbsp;1 is the function that called <code>getinfo</code>
9491(except for tail calls, which do not count on the stack);9647(except for tail calls, which do not count on the stack);
9492and so on.9648and so on.
9493If <code>function</code> is a number larger than the number of active functions,9649If <code>f</code> is a number larger than the number of active functions,
9494then <code>getinfo</code> returns <b>nil</b>.9650then <code>getinfo</code> returns <b>nil</b>.
9495 9651
9496 9652
@@ -9554,11 +9710,11 @@ In that case, <code>getlocal</code> returns only the name of function parameters · 57 unmodified lines
9554 9710
9555 9711
9556<p>9712<p>
9557<hr><h3><a name="pdf-debug.getmetatable"><code>debug.getmetatable (object)</code></a></h3>9713<hr><h3><a name="pdf-debug.getmetatable"><code>debug.getmetatable (value)</code></a></h3>
9558 9714
9559 9715
9560<p>9716<p>
9561Returns the metatable of the given <code>object</code>9717Returns the metatable of the given <code>value</code>
9562or <b>nil</b> if it does not have a metatable.9718or <b>nil</b> if it does not have a metatable.
9563 9719
9564 9720
@@ -9575,12 +9731,12 @@ Returns the registry table (see <a href="#4.5">&sect;4.5</a>). · 10 unmodified lines
9575 9731
9576 9732
9577<p>9733<p>
9578<hr><h3><a name="pdf-debug.getupvalue"><code>debug.getupvalue (func, up)</code></a></h3>9734<hr><h3><a name="pdf-debug.getupvalue"><code>debug.getupvalue (f, up)</code></a></h3>
9579 9735
9580 9736
9581<p>9737<p>
9582This function returns the name and the value of the upvalue9738This function returns the name and the value of the upvalue
9583with index <code>up</code> of the function <code>func</code>.9739with index <code>up</code> of the function <code>f</code>.
9584The function returns <b>nil</b> if there is no upvalue with the given index.9740The function returns <b>nil</b> if there is no upvalue with the given index.
9585 9741
9586 9742
@@ -9662,24 +9818,24 @@ variable indices and names. · 75 unmodified lines
9662 9818
9663 9819
9664<p>9820<p>
9665<hr><h3><a name="pdf-debug.setmetatable"><code>debug.setmetatable (object, table)</code></a></h3>9821<hr><h3><a name="pdf-debug.setmetatable"><code>debug.setmetatable (value, table)</code></a></h3>
9666 9822
9667 9823
9668<p>9824<p>
9669Sets the metatable for the given <code>object</code> to the given <code>table</code>9825Sets the metatable for the given <code>value</code> to the given <code>table</code>
9670(which can be <b>nil</b>).9826(which can be <b>nil</b>).
9671Returns <code>object</code>.9827Returns <code>value</code>.
9672 9828
9673 9829
9674 9830
9675 9831
9676<p>9832<p>
9677<hr><h3><a name="pdf-debug.setupvalue"><code>debug.setupvalue (func, up, value)</code></a></h3>9833<hr><h3><a name="pdf-debug.setupvalue"><code>debug.setupvalue (f, up, value)</code></a></h3>
9678 9834
9679 9835
9680<p>9836<p>
9681This function assigns the value <code>value</code> to the upvalue9837This function assigns the value <code>value</code> to the upvalue
9682with index <code>up</code> of the function <code>func</code>.9838with index <code>up</code> of the function <code>f</code>.
9683The function returns <b>nil</b> if there is no upvalue9839The function returns <b>nil</b> if there is no upvalue
9684with the given index.9840with the given index.
9685Otherwise, it returns the name of the upvalue.9841Otherwise, it returns the name of the upvalue.
@@ -9723,7 +9879,7 @@ to start the traceback · 37 unmodified lines
9723 9879
9724 9880
9725<p>9881<p>
9726<hr><h3><a name="pdf-debug.upvalueid"><code>debug.upvalueid (function, n)</code></a></h3>9882<hr><h3><a name="pdf-debug.upvalueid"><code>debug.upvalueid (f, n)</code></a></h3>
9727 9883
9728 9884
9729<p>9885<p>
@@ -9743,12 +9899,12 @@ will return identical ids for those upvalue indices. · 13 unmodified lines
9743 9899
9744 9900
9745<p>9901<p>
9746<hr><h3><a name="pdf-debug.upvaluejoin"><code>debug.upvaluejoin (func1, n1, func2, n2)</code></a></h3>9902<hr><h3><a name="pdf-debug.upvaluejoin"><code>debug.upvaluejoin (f1, n1, f2, n2)</code></a></h3>
9747 9903
9748 9904
9749<p>9905<p>
9750Make the <code>n1</code>-th upvalue of the Lua closure <code>func1</code>9906Make the <code>n1</code>-th upvalue of the Lua closure <code>f1</code>
9751refer to the <code>n2</code>-th upvalue of the Lua closure <code>func2</code>.9907refer to the <code>n2</code>-th upvalue of the Lua closure <code>f2</code>.
9752 9908
9753 9909
9754 9910
@@ -9779,6 +9935,7 @@ The options are: · 24 unmodified lines
9779<li><b><code>-l <em>mod</em></code>: </b> "requires" <em>mod</em>;</li>9935<li><b><code>-l <em>mod</em></code>: </b> "requires" <em>mod</em>;</li>
9780<li><b><code>-i</code>: </b> enters interactive mode after running <em>script</em>;</li>9936<li><b><code>-i</code>: </b> enters interactive mode after running <em>script</em>;</li>
9781<li><b><code>-v</code>: </b> prints version information;</li>9937<li><b><code>-v</code>: </b> prints version information;</li>
9938<li><b><code>-E</code>: </b> ignores environment variables;</li>
9782<li><b><code>--</code>: </b> stops handling options;</li>9939<li><b><code>--</code>: </b> stops handling options;</li>
9783<li><b><code>-</code>: </b> executes <code>stdin</code> as a file and stops handling options.</li>9940<li><b><code>-</code>: </b> executes <code>stdin</code> as a file and stops handling options.</li>
9784</ul><p>9941</ul><p>
@@ -9791,24 +9948,34 @@ and as <code>lua -</code> otherwise. · 6 unmodified lines
9791 9948
9792 9949
9793<p>9950<p>
9794Before running any argument,9951When called without option <code>-E</code>,
9795the interpreter checks for an environment variable <a name="pdf-LUA_INIT_5_2"><code>LUA_INIT_5_2</code></a>9952the interpreter checks for an environment variable <a name="pdf-LUA_INIT_5_2"><code>LUA_INIT_5_2</code></a>
9796(or <a name="pdf-LUA_INIT"><code>LUA_INIT</code></a> if it is not defined).9953(or <a name="pdf-LUA_INIT"><code>LUA_INIT</code></a> if it is not defined)
9797If its format is <code>@<em>filename</em></code>,9954before running any argument.
9955If the variable content has the format <code>@<em>filename</em></code>,
9798then <code>lua</code> executes the file.9956then <code>lua</code> executes the file.
9799Otherwise, <code>lua</code> executes the string itself.9957Otherwise, <code>lua</code> executes the string itself.
9800 9958
9801 9959
9802<p>9960<p>
9803All options are handled in order, except <code>-i</code>.9961When called with option <code>-E</code>,
9962besides ignoring <code>LUA_INIT</code>,
9963the interpreter also resets the values of
9964<a href="#pdf-package.path"><code>package.path</code></a> and <a href="#pdf-package.cpath"><code>package.cpath</code></a>
9965with the default paths defined in <code>luaconf.h</code>,
9966in effect ignoring the values of <code>LUA_PATH</code> and <code>LUA_CPATH</code>.
9967
9968
9969<p>
9970All options are handled in order, except <code>-i</code> and <code>-E</code>.
9804For instance, an invocation like9971For instance, an invocation like
9805 9972
9806<pre>9973<pre>
9807 $ lua -e'a=1' -e 'print(a)' script.lua9974 $ lua -e'a=1' -e 'print(a)' script.lua
9808</pre><p>9975</pre><p>
9809will first set <code>a</code> to 1, then print the value of <code>a</code> (which is '<code>1</code>'),9976will first set <code>a</code> to 1, then print the value of <code>a</code>,
9810and finally run the file <code>script.lua</code> with no arguments.9977and finally run the file <code>script.lua</code> with no arguments.
9811(Here <code>$</code> is the shell prompt. Your prompt can be different.)9978(Here <code>$</code> is the shell prompt. Your prompt may be different.)
9812 9979
9813 9980
9814<p>9981<p>
@@ -9835,7 +10002,7 @@ then creates a table · 20 unmodified lines
9835 [1] = "t1", [2] = "t2" }10002 [1] = "t1", [2] = "t2" }
9836</pre><p>10003</pre><p>
9837and finally runs the file <code>b.lua</code>.10004and finally runs the file <code>b.lua</code>.
9838The script is called with <code>arg[1]</code>, <code>arg[2]</code>, &middot;&middot;&middot;10005The script is called with <code>arg[1]</code>, <code>arg[2]</code>, ...
9839as arguments;10006as arguments;
9840it can also access these arguments with the vararg expression '<code>...</code>'.10007it can also access these arguments with the vararg expression '<code>...</code>'.
9841 10008
@@ -9862,29 +10029,8 @@ the interpreter does not report the error. · 20 unmodified lines
9862When finishing normally,10029When finishing normally,
9863the interpreter closes its main Lua state10030the interpreter closes its main Lua state
9864(see <a href="#lua_close"><code>lua_close</code></a>).10031(see <a href="#lua_close"><code>lua_close</code></a>).
9865The script can avoid this step by terminating10032The script can avoid this step by
9866through <a href="#pdf-os.exit"><code>os.exit</code></a>.10033calling <a href="#pdf-os.exit"><code>os.exit</code></a> to terminate.
9867
9868
9869<p>
9870If the global variable <a name="pdf-_PROMPT"><code>_PROMPT</code></a> contains a string,
9871then its value is used as the prompt.
9872Similarly, if the global variable <a name="pdf-_PROMPT2"><code>_PROMPT2</code></a> contains a string,
9873its value is used as the secondary prompt
9874(issued during incomplete statements).
9875Therefore, both prompts can be changed directly on the command line
9876or in any Lua programs by assigning to <code>_PROMPT</code>.
9877See the next example:
9878
9879<pre>
9880 $ lua -e"_PROMPT='myprompt&gt; '" -i
9881</pre><p>
9882(The outer pair of quotes is for the shell,
9883the inner pair is for Lua.)
9884Note the use of <code>-i</code> to enter interactive mode;
9885otherwise,
9886the program would just end silently
9887right after the assignment to <code>_PROMPT</code>.
9888 10034
9889 10035
9890<p>10036<p>
@@ -9900,7 +10046,7 @@ as in · 9 unmodified lines
9900 #!/usr/local/bin/lua10046 #!/usr/local/bin/lua
9901</pre><p>10047</pre><p>
9902(Of course,10048(Of course,
9903the location of the Lua interpreter can be different in your machine.10049the location of the Lua interpreter may be different in your machine.
9904If <code>lua</code> is in your <code>PATH</code>,10050If <code>lua</code> is in your <code>PATH</code>,
9905then10051then
9906 10052
@@ -9914,9 +10060,9 @@ is a more portable solution.) · 7 unmodified lines
9914<h1>8 &ndash; <a name="8">Incompatibilities with the Previous Version</a></h1>10060<h1>8 &ndash; <a name="8">Incompatibilities with the Previous Version</a></h1>
9915 10061
9916<p>10062<p>
9917Here we list the incompatibilities that you can find when moving a program10063Here we list the incompatibilities that you may find when moving a program
9918from Lua&nbsp;5.1 to Lua&nbsp;5.2.10064from Lua&nbsp;5.1 to Lua&nbsp;5.2.
9919You can avoid some incompatibilities compiling Lua with10065You can avoid some incompatibilities by compiling Lua with
9920appropriate options (see file <code>luaconf.h</code>).10066appropriate options (see file <code>luaconf.h</code>).
9921However,10067However,
9922all these compatibility options will be removed in the next version of Lua.10068all these compatibility options will be removed in the next version of Lua.
@@ -9934,7 +10080,7 @@ use the variable <code>_ENV</code> or the function <a href="#pdf-load"><code>loa · 11 unmodified lines
9934 10080
9935 10081
9936<p>10082<p>
9937C functions do not have environments any more.10083C functions no longer have environments.
9938Use an upvalue with a shared table if you need to keep10084Use an upvalue with a shared table if you need to keep
9939shared state among several C functions.10085shared state among several C functions.
9940(You may use <a href="#luaL_setfuncs"><code>luaL_setfuncs</code></a> to open a C library10086(You may use <a href="#luaL_setfuncs"><code>luaL_setfuncs</code></a> to open a C library
@@ -9964,8 +10110,8 @@ Weak tables with weak keys now perform like <em>ephemeron tables</em>. · 23 unmodified lines
9964<li>10110<li>
9965The event <em>tail return</em> in debug hooks was removed.10111The event <em>tail return</em> in debug hooks was removed.
9966Instead, tail calls generate a special new event,10112Instead, tail calls generate a special new event,
9967<em>tail call</em>, so that the debugger can know there will10113<em>tail call</em>, so that the debugger can know that
9968not be a corresponding return event.10114there will not be a corresponding return event.
9969</li>10115</li>
9970 10116
9971<li>10117<li>
@@ -9985,8 +10131,8 @@ observable difference to the new function. · 13 unmodified lines
9985 10131
9986<li>10132<li>
9987Function <code>module</code> is deprecated.10133Function <code>module</code> is deprecated.
9988Modules are not expected to set global variables anymore,10134It is easy to set up a module with regular Lua code.
9989and it is easy to set up a module with regular Lua code.10135Modules are not expected to set global variables.
9990</li>10136</li>
9991 10137
9992<li>10138<li>
@@ -10036,12 +10182,17 @@ So, all functions that load code · 43 unmodified lines
10036(<a href="#pdf-load"><code>load</code></a> and <a href="#pdf-loadfile"><code>loadfile</code></a>)10182(<a href="#pdf-load"><code>load</code></a> and <a href="#pdf-loadfile"><code>loadfile</code></a>)
10037are potentially insecure when loading untrusted binary data.10183are potentially insecure when loading untrusted binary data.
10038(Actually, those functions were already insecure because10184(Actually, those functions were already insecure because
10039of bugs in the verification algorithm.)10185of flaws in the verification algorithm.)
10040When in doubt,10186When in doubt,
10041use the <code>mode</code> argument in function <a href="#pdf-load"><code>load</code></a>10187use the <code>mode</code> argument in function <a href="#pdf-load"><code>load</code></a>
10042to restrict it to loading textual chunks.10188to restrict it to loading textual chunks.
10043</li>10189</li>
10044 10190
10191<li>
10192The standard paths in the official distribution may
10193change between versions.
10194</li>
10195
10045</ul>10196</ul>
10046 10197
10047 10198
@@ -10060,13 +10211,12 @@ You must get the global environment from the registry · 12 unmodified lines
10060Pseudoindex <code>LUA_ENVIRONINDEX</code>10211Pseudoindex <code>LUA_ENVIRONINDEX</code>
10061and functions <code>lua_getfenv</code>/<code>lua_setfenv</code>10212and functions <code>lua_getfenv</code>/<code>lua_setfenv</code>
10062were removed,10213were removed,
10063as C&nbsp;functions do not have environments any more.10214as C&nbsp;functions no longer have environments.
10064</li>10215</li>
10065 10216
10066<li>10217<li>
10067Function <code>luaL_register</code> is deprecated.10218Function <code>luaL_register</code> is deprecated.
10068Use <a href="#luaL_setfuncs"><code>luaL_setfuncs</code></a> so that your module does not10219Use <a href="#luaL_setfuncs"><code>luaL_setfuncs</code></a> so that your module does not create globals.
10069create globals anymore.
10070(Modules are not expected to set global variables anymore.)10220(Modules are not expected to set global variables anymore.)
10071</li>10221</li>
10072 10222
@@ -10081,7 +10231,7 @@ the block is new. · 8 unmodified lines
10081 10231
10082<li>10232<li>
10083Finalizers (<code>__gc</code> metamethods) for userdata are called in the10233Finalizers (<code>__gc</code> metamethods) for userdata are called in the
10084reverse order that they were marked,10234reverse order that they were marked for finalization,
10085not that they were created (see <a href="#2.5.1">&sect;2.5.1</a>).10235not that they were created (see <a href="#2.5.1">&sect;2.5.1</a>).
10086(Most userdata are marked immediately after they are created.)10236(Most userdata are marked immediately after they are created.)
10087Moreover,10237Moreover,
@@ -10202,10 +10352,10 @@ Here is the complete syntax of Lua in extended BNF. · 114 unmodified lines
10202<HR>10352<HR>
10203<SMALL CLASS="footer">10353<SMALL CLASS="footer">
10204Last update:10354Last update:
10205Fri Jul 8 17:11:02 BRT 201110355Thu Nov 24 11:54:31 BRST 2011
10206</SMALL>10356</SMALL>
10207<!--10357<!--
10208Last change: revised for Lua 5.2.0 (beta)10358Last change: revised for Lua 5.2.0
10209-->10359-->
10210 10360
10211</body></html>10361</body></html>
doc/readme.html+61−49
@@ -6,18 +6,21 @@ · 5 unmodified lines
6<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1">6<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=iso-8859-1">
7<STYLE TYPE="text/css">7<STYLE TYPE="text/css">
8blockquote, .display {8blockquote, .display {
9 color: black ;
10 padding: 8px ;
11 border: solid #a0a0a0 2px ;9 border: solid #a0a0a0 2px ;
12 xbackground-color: #EFEFFF ;10 padding: 1em ;
13 margin-left: 0px ;11 margin: 0px ;
12}
13
14.display {
15 word-spacing: 0.25em ;
16}
17
18dl.display dd {
19 padding-bottom: 0.2em ;
14}20}
15 21
16tt, kbd, code {22tt, kbd, code {
17 font-size: 120% ;23 font-size: 12pt ;
18 xcolor: black ;
19 xpadding: 4px ;
20 xbackground-color: #E0E0E0 ;
21}24}
22</STYLE>25</STYLE>
23</HEAD>26</HEAD>
@@ -27,14 +30,9 @@ tt, kbd, code { · 3 unmodified lines
27<HR>30<HR>
28<H1>31<H1>
29<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua" BORDER=0></A>32<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua" BORDER=0></A>
30Welcome to Lua 5.2 (beta)33Welcome to Lua 5.2
31</H1>34</H1>
32 35
33<P>
34<IMG SRC="alert.png" ALIGN="absbottom" ALT="[!]">
35<EM>This is a beta version of Lua 5.2.
36Some details may change in the final version.</EM>
37
38<P>36<P>
39<A HREF="#about">about</A>37<A HREF="#about">about</A>
40&middot;38&middot;
@@ -86,7 +84,7 @@ form. · 45 unmodified lines
86You need to build it before using it.84You need to build it before using it.
87Building Lua should be straightforward85Building Lua should be straightforward
88because86because
89Lua is implemented in pure ANSI C, and compiles unmodified in all known87Lua is implemented in pure ANSI C and compiles unmodified in all known
90platforms that have an ANSI C compiler.88platforms that have an ANSI C compiler.
91Lua also compiles unmodified as C++.89Lua also compiles unmodified as C++.
92The instructions given below for building Lua are for Unix-like platforms.90The instructions given below for building Lua are for Unix-like platforms.
@@ -120,15 +118,16 @@ Here are the details. · 27 unmodified lines
120<OL>118<OL>
121<LI>119<LI>
122Open a terminal window and move to120Open a terminal window and move to
123the top-level directory, which is named lua-5.2.0.121the top-level directory, which is named <TT>lua-5.2.0</TT>.
124The Makefile there controls both the build process and the installation process.122The Makefile there controls both the build process and the installation process.
125<P>123<P>
126<LI>124<LI>
127 Do "<KBD>make</KBD>" and see if your platform is listed.125 Do "<KBD>make</KBD>" and see if your platform is listed.
128 The platforms currently supported are:126 The platforms currently supported are:
129<BLOCKQUOTE>127<P>
130 aix ansi bsd freebsd generic linux macosx mingw posix solaris128<P CLASS="display">
131</BLOCKQUOTE>129 aix ansi bsd freebsd generic linux macosx mingw posix solaris
130</P>
132<P>131<P>
133 If your platform is listed, just do "<KBD>make xxx</KBD>", where xxx132 If your platform is listed, just do "<KBD>make xxx</KBD>", where xxx
134 is your platform name.133 is your platform name.
@@ -138,7 +137,7 @@ The Makefile there controls both the build process and the installation process. · 3 unmodified lines
138<P>137<P>
139<LI>138<LI>
140The compilation takes only a few moments139The compilation takes only a few moments
141and produces three files in the src directory:140and produces three files in the <TT>src</TT> directory:
142lua (the interpreter),141lua (the interpreter),
143luac (the compiler),142luac (the compiler),
144and liblua.a (the library).143and liblua.a (the library).
@@ -147,12 +146,15 @@ and liblua.a (the library). · 2 unmodified lines
147 To check that Lua has been built correctly, do "<KBD>make test</KBD>"146 To check that Lua has been built correctly, do "<KBD>make test</KBD>"
148 after building Lua. This will run the interpreter and print its version string.147 after building Lua. This will run the interpreter and print its version string.
149</OL>148</OL>
149<P>
150If you're running Linux and get compilation errors,
151make sure you have installed the <TT>readline</TT> development package.
150 152
151<H3>Installing Lua</H3>153<H3>Installing Lua</H3>
152<P>154<P>
153 Once you have built Lua, you may want to install it in an official155 Once you have built Lua, you may want to install it in an official
154 place in your system. In this case, do "<KBD>make install</KBD>". The official156 place in your system. In this case, do "<KBD>make install</KBD>". The official
155 place and the way to install files are defined in Makefile. You'll157 place and the way to install files are defined in the Makefile. You'll
156 probably need the right permissions to install files.158 probably need the right permissions to install files.
157 159
158<P>160<P>
@@ -198,9 +200,9 @@ and liblua.a (the library). · 39 unmodified lines
198<P>200<P>
199 Three kinds of things can be customized by editing a file:201 Three kinds of things can be customized by editing a file:
200<UL>202<UL>
201 <LI> Where and how to install Lua &mdash; edit Makefile.203 <LI> Where and how to install Lua &mdash; edit <TT>Makefile</TT>.
202 <LI> How to build Lua &mdash; edit src/Makefile.204 <LI> How to build Lua &mdash; edit <TT>src/Makefile</TT>.
203 <LI> Lua features &mdash; edit src/luaconf.h.205 <LI> Lua features &mdash; edit <TT>src/luaconf.h</TT>.
204</UL>206</UL>
205 207
206<P>208<P>
@@ -211,13 +213,13 @@ and liblua.a (the library). · 4 unmodified lines
211 213
212<P>214<P>
213 On the other hand, if you need to customize some Lua features, you'll need215 On the other hand, if you need to customize some Lua features, you'll need
214 to edit src/luaconf.h before building and installing Lua.216 to edit <TT>src/luaconf.h</TT> before building and installing Lua.
215 The edited file will be the one installed, and217 The edited file will be the one installed, and
216 it will be used by any Lua clients that you build, to ensure consistency.218 it will be used by any Lua clients that you build, to ensure consistency.
217 Further customization is available to experts by editing the Lua sources.219 Further customization is available to experts by editing the Lua sources.
218 220
219<P>221<P>
220 We strongly recommend that you enable dynamic loading in src/luaconf.h.222 We strongly recommend that you enable dynamic loading in <TT>src/luaconf.h</TT>.
221 This is done automatically for all platforms listed above that have223 This is done automatically for all platforms listed above that have
222 this feature and also for Windows.224 this feature and also for Windows.
223 225
@@ -238,7 +240,6 @@ lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c · 14 unmodified lines
238ltm.c lundump.c lvm.c lzio.c240ltm.c lundump.c lvm.c lzio.c
239lauxlib.c lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c241lauxlib.c lbaselib.c lbitlib.c lcorolib.c ldblib.c liolib.c
240lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c242lmathlib.c loslib.c lstrlib.c ltablib.c loadlib.c linit.c
241
242<DT>243<DT>
243interpreter:244interpreter:
244<DD>245<DD>
@@ -257,11 +258,11 @@ compiler: · 12 unmodified lines
257 those dynamic libraries &mdash; but <EM>don't</EM> link the Lua library258 those dynamic libraries &mdash; but <EM>don't</EM> link the Lua library
258 into each dynamic library. For Unix, we recommend that the Lua library259 into each dynamic library. For Unix, we recommend that the Lua library
259 be linked statically into the host program and its symbols exported for260 be linked statically into the host program and its symbols exported for
260 dynamic linking; src/Makefile does this for the Lua interpreter.261 dynamic linking; <TT>src/Makefile</TT> does this for the Lua interpreter.
261 For Windows, we recommend that the Lua library be a DLL.262 For Windows, we recommend that the Lua library be a DLL.
262 263
263<P>264<P>
264 As mentioned above, you may edit src/luaconf.h to customize265 As mentioned above, you may edit <TT>src/luaconf.h</TT> to customize
265 some features before building Lua.266 some features before building Lua.
266 267
267<H2><A NAME="changes">Changes since Lua 5.1</A></H2>268<H2><A NAME="changes">Changes since Lua 5.1</A></H2>
@@ -290,7 +291,7 @@ Here are the other changes introduced in Lua 5.2: · 22 unmodified lines
290<UL>291<UL>
291<LI> no more fenv for threads or functions292<LI> no more fenv for threads or functions
292<LI> tables honor the <CODE>__len</CODE> metamethod293<LI> tables honor the <CODE>__len</CODE> metamethod
293<LI> hex and <CODE>\*</CODE> escapes in strings294<LI> hex and <CODE>\z</CODE> escapes in strings
294<LI> support for hexadecimal floats295<LI> support for hexadecimal floats
295<LI> order metamethods work for different types296<LI> order metamethods work for different types
296<LI> no more verification of opcode consistency297<LI> no more verification of opcode consistency
@@ -302,8 +303,8 @@ Here are the other changes introduced in Lua 5.2: · 5 unmodified lines
302<H3>Libraries</H3>303<H3>Libraries</H3>
303<UL>304<UL>
304<LI> arguments for function called through <CODE>xpcall</CODE>305<LI> arguments for function called through <CODE>xpcall</CODE>
305<LI> optional 'mode' argument to load (to control binary x text)306<LI> optional 'mode' argument to load and loadfile (to control binary x text)
306<LI> optional 'env' argument to load (environment for loaded chunk)307<LI> optional 'env' argument to load and loadfile (environment for loaded chunk)
307<LI> <CODE>loadlib</CODE> may load libraries with global names (RTLD_GLOBAL)308<LI> <CODE>loadlib</CODE> may load libraries with global names (RTLD_GLOBAL)
308<LI> new function <CODE>package.searchpath</CODE>309<LI> new function <CODE>package.searchpath</CODE>
309<LI> modules receive their paths when loaded310<LI> modules receive their paths when loaded
@@ -324,15 +325,23 @@ Here are the other changes introduced in Lua 5.2: · 14 unmodified lines
324<H3>C API</H3>325<H3>C API</H3>
325<UL>326<UL>
326<LI> main thread predefined in the registry327<LI> main thread predefined in the registry
327<LI> new constants <CODE>LUA_OK</CODE> and <CODE>LUA_ERRGCMM</CODE>328<LI> new functions
328<LI> new <CODE>lua_compare</CODE>, <CODE>lua_arith</CODE>, and <CODE>lua_len</CODE>329<CODE>lua_absindex</CODE>,
329<LI> new <CODE>lua_version</CODE> and <CODE>luaL_checkversion</CODE>330<CODE>lua_arith</CODE>,
331<CODE>lua_compare</CODE>,
332<CODE>lua_copy</CODE>,
333<CODE>lua_len</CODE>,
334<CODE>lua_rawgetp</CODE>,
335<CODE>lua_rawsetp</CODE>,
336<CODE>lua_upvalueid</CODE>,
337<CODE>lua_upvaluejoin</CODE>,
338<CODE>lua_version</CODE>.
339<LI> new functions
340<CODE>luaL_checkversion</CODE>,
341<CODE>luaL_setmetatable</CODE>,
342<CODE>luaL_testudata</CODE>,
343<CODE>luaL_tolstring</CODE>.
330<LI> <CODE>lua_pushstring</CODE> and <CODE>pushlstring</CODE> return string344<LI> <CODE>lua_pushstring</CODE> and <CODE>pushlstring</CODE> return string
331<LI> new <CODE>luaL_testudata</CODE> and <CODE>luaL_setmetatable</CODE>
332<LI> new <CODE>luaL_tolstring</CODE>
333<LI> new <CODE>lua_copy</CODE>
334<LI> new <CODE>lua_absindex</CODE>
335<LI> new <CODE>lua_upvalueid</CODE> and <CODE>lua_upvaluejoin</CODE>
336<LI> <CODE>nparams</CODE> and <CODE>isvararg</CODE> available in debug API345<LI> <CODE>nparams</CODE> and <CODE>isvararg</CODE> available in debug API
337<LI> new <CODE>lua_Unsigned</CODE>346<LI> new <CODE>lua_Unsigned</CODE>
338</UL>347</UL>
@@ -340,15 +349,17 @@ Here are the other changes introduced in Lua 5.2: · 1 unmodified line
340<H3>Implementation</H3>349<H3>Implementation</H3>
341<UL>350<UL>
342<LI> max constants per function raised to 2<SUP>26</SUP>351<LI> max constants per function raised to 2<SUP>26</SUP>
352<LI> generational mode for garbage collection (experimental)
353<LI> NaN trick (experimental)
343<LI> internal (immutable) version of ctypes354<LI> internal (immutable) version of ctypes
344<LI> simpler implementation for string buffers355<LI> simpler implementation for string buffers
345<LI> udata with finalizers are kept in a separated list for the GC
346<LI> <CODE>CallInfo</CODE> stack now is a linked list
347<LI> parser uses much less C-stack space (no more auto arrays)356<LI> parser uses much less C-stack space (no more auto arrays)
348<LI> new hash for floats357</UL>
349<LI> handling of non-string error messages in the standalone interpreter358
350<LI> generational mode for garbage collection (experimental)359<H3>Lua standalone interpreter</H3>
351<LI> NaN trick (experimental)360<UL>
361<LI> new <CODE>-E</CODE> option to avoid environment variables
362<LI> handling of non-string error messages
352</UL>363</UL>
353 364
354<H2><A NAME="license">License</A></H2>365<H2><A NAME="license">License</A></H2>
@@ -369,7 +380,7 @@ then you should give us credit by including the appropriate copyright notice som · 14 unmodified lines
369For details, see380For details, see
370<A HREF="http://www.lua.org/license.html">this</A>.381<A HREF="http://www.lua.org/license.html">this</A>.
371 382
372<BLOCKQUOTE>383<BLOCKQUOTE STYLE="padding-bottom: 0em">
373Copyright &copy; 1994&ndash;2011 Lua.org, PUC-Rio.384Copyright &copy; 1994&ndash;2011 Lua.org, PUC-Rio.
374 385
375<P>386<P>
@@ -393,14 +404,15 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, · 17 unmodified lines
393OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN404OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
394THE SOFTWARE.405THE SOFTWARE.
395</BLOCKQUOTE>406</BLOCKQUOTE>
407<P>
396 408
397<HR>409<HR>
398<SMALL CLASS="footer">410<SMALL CLASS="footer">
399Last update:411Last update:
400Fri Jun 24 11:30:57 BRT 2011412Wed Nov 23 16:17:22 BRST 2011
401</SMALL>413</SMALL>
402<!--414<!--
403Last change: revised for Lua 5.2.0 (beta)415Last change: revised for Lua 5.2.0
404-->416-->
405 417
406</BODY>418</BODY>
src/Makefile+1−0
@@ -112,6 +112,7 @@ mingw: · 111 unmodified lines
112 $(MAKE) "LUA_A=lua52.dll" "LUA_T=lua.exe" \112 $(MAKE) "LUA_A=lua52.dll" "LUA_T=lua.exe" \
113 "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \113 "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \
114 "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe114 "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe
115 $(MAKE) "LUAC_T=luac.exe" luac.exe
115 116
116posix:117posix:
117 $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX"118 $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX"
src/lapi.c+88−37
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lapi.c,v 2.149 2011/06/13 14:13:06 roberto Exp $2** $Id: lapi.c,v 2.157 2011/11/16 18:51:36 roberto Exp $
3** Lua API3** Lua API
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -34,9 +34,13 @@ const char lua_ident[] = · 28 unmodified lines
34 "$LuaAuthors: " LUA_AUTHORS " $";34 "$LuaAuthors: " LUA_AUTHORS " $";
35 35
36 36
37/* value at a non-valid index */
38#define NONVALIDVALUE cast(TValue *, luaO_nilobject)
37 39
38#define api_checkvalidindex(L, i) api_check(L, (i) != luaO_nilobject, \40/* corresponding test */
39 "invalid index")41#define isvalid(o) ((o) != luaO_nilobject)
42
43#define api_checkvalidindex(L, i) api_check(L, isvalid(i), "invalid index")
40 44
41 45
42static TValue *index2addr (lua_State *L, int idx) {46static TValue *index2addr (lua_State *L, int idx) {
@@ -44,7 +48,7 @@ static TValue *index2addr (lua_State *L, int idx) { · 1 unmodified line
44 if (idx > 0) {48 if (idx > 0) {
45 TValue *o = ci->func + idx;49 TValue *o = ci->func + idx;
46 api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index");50 api_check(L, idx <= ci->top - (ci->func + 1), "unacceptable index");
47 if (o >= L->top) return cast(TValue *, luaO_nilobject);51 if (o >= L->top) return NONVALIDVALUE;
48 else return o;52 else return o;
49 }53 }
50 else if (idx > LUA_REGISTRYINDEX) {54 else if (idx > LUA_REGISTRYINDEX) {
@@ -57,12 +61,10 @@ static TValue *index2addr (lua_State *L, int idx) { · 6 unmodified lines
57 idx = LUA_REGISTRYINDEX - idx;61 idx = LUA_REGISTRYINDEX - idx;
58 api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large");62 api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large");
59 if (ttislcf(ci->func)) /* light C function? */63 if (ttislcf(ci->func)) /* light C function? */
60 return cast(TValue *, luaO_nilobject); /* it has no upvalues */64 return NONVALIDVALUE; /* it has no upvalues */
61 else {65 else {
62 CClosure *func = clCvalue(ci->func);66 CClosure *func = clCvalue(ci->func);
63 return (idx <= func->nupvalues)67 return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : NONVALIDVALUE;
64 ? &func->upvalue[idx-1]
65 : cast(TValue *, luaO_nilobject);
66 }68 }
67 }69 }
68}70}
@@ -237,7 +239,7 @@ LUA_API void lua_pushvalue (lua_State *L, int idx) { · 168 unmodified lines
237 239
238LUA_API int lua_type (lua_State *L, int idx) {240LUA_API int lua_type (lua_State *L, int idx) {
239 StkId o = index2addr(L, idx);241 StkId o = index2addr(L, idx);
240 return (o == luaO_nilobject) ? LUA_TNONE : ttypenv(o);242 return (isvalid(o) ? ttypenv(o) : LUA_TNONE);
241}243}
242 244
243 245
@@ -275,8 +277,7 @@ LUA_API int lua_isuserdata (lua_State *L, int idx) { · 31 unmodified lines
275LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {277LUA_API int lua_rawequal (lua_State *L, int index1, int index2) {
276 StkId o1 = index2addr(L, index1);278 StkId o1 = index2addr(L, index1);
277 StkId o2 = index2addr(L, index2);279 StkId o2 = index2addr(L, index2);
278 return (o1 == luaO_nilobject || o2 == luaO_nilobject) ? 0280 return (isvalid(o1) && isvalid(o2)) ? luaV_rawequalobj(o1, o2) : 0;
279 : luaV_rawequalobj(o1, o2);
280}281}
281 282
282 283
@@ -305,17 +306,17 @@ LUA_API void lua_arith (lua_State *L, int op) { · 22 unmodified lines
305 306
306LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {307LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) {
307 StkId o1, o2;308 StkId o1, o2;
308 int i;309 int i = 0;
309 lua_lock(L); /* may call tag method */310 lua_lock(L); /* may call tag method */
310 o1 = index2addr(L, index1);311 o1 = index2addr(L, index1);
311 o2 = index2addr(L, index2);312 o2 = index2addr(L, index2);
312 if (o1 == luaO_nilobject || o2 == luaO_nilobject)313 if (isvalid(o1) && isvalid(o2)) {
313 i = 0;314 switch (op) {
314 else switch (op) {315 case LUA_OPEQ: i = equalobj(L, o1, o2); break;
315 case LUA_OPEQ: i = equalobj(L, o1, o2); break;316 case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break;
316 case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break;317 case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break;
317 case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break;318 default: api_check(L, 0, "invalid option");
318 default: api_check(L, 0, "invalid option"); i = 0;319 }
319 }320 }
320 lua_unlock(L);321 lua_unlock(L);
321 return i;322 return i;
@@ -595,6 +596,17 @@ LUA_API int lua_pushthread (lua_State *L) { · 273 unmodified lines
595*/596*/
596 597
597 598
599LUA_API void lua_getglobal (lua_State *L, const char *var) {
600 Table *reg = hvalue(&G(L)->l_registry);
601 const TValue *gt; /* global table */
602 lua_lock(L);
603 gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
604 setsvalue2s(L, L->top++, luaS_new(L, var));
605 luaV_gettable(L, gt, L->top - 1, L->top - 1);
606 lua_unlock(L);
607}
608
609
598LUA_API void lua_gettable (lua_State *L, int idx) {610LUA_API void lua_gettable (lua_State *L, int idx) {
599 StkId t;611 StkId t;
600 lua_lock(L);612 lua_lock(L);
@@ -628,11 +640,24 @@ LUA_API void lua_rawget (lua_State *L, int idx) { · 27 unmodified lines
628 640
629 641
630LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {642LUA_API void lua_rawgeti (lua_State *L, int idx, int n) {
631 StkId o;643 StkId t;
632 lua_lock(L);644 lua_lock(L);
633 o = index2addr(L, idx);645 t = index2addr(L, idx);
634 api_check(L, ttistable(o), "table expected");646 api_check(L, ttistable(t), "table expected");
635 setobj2s(L, L->top, luaH_getint(hvalue(o), n));647 setobj2s(L, L->top, luaH_getint(hvalue(t), n));
648 api_incr_top(L);
649 lua_unlock(L);
650}
651
652
653LUA_API void lua_rawgetp (lua_State *L, int idx, const void *p) {
654 StkId t;
655 TValue k;
656 lua_lock(L);
657 t = index2addr(L, idx);
658 api_check(L, ttistable(t), "table expected");
659 setpvalue(&k, cast(void *, p));
660 setobj2s(L, L->top, luaH_get(hvalue(t), &k));
636 api_incr_top(L);661 api_incr_top(L);
637 lua_unlock(L);662 lua_unlock(L);
638}663}
@@ -700,6 +725,19 @@ LUA_API void lua_getuservalue (lua_State *L, int idx) { · 61 unmodified lines
700*/725*/
701 726
702 727
728LUA_API void lua_setglobal (lua_State *L, const char *var) {
729 Table *reg = hvalue(&G(L)->l_registry);
730 const TValue *gt; /* global table */
731 lua_lock(L);
732 api_checknelems(L, 1);
733 gt = luaH_getint(reg, LUA_RIDX_GLOBALS);
734 setsvalue2s(L, L->top++, luaS_new(L, var));
735 luaV_settable(L, gt, L->top - 1, L->top - 2);
736 L->top -= 2; /* pop value and key */
737 lua_unlock(L);
738}
739
740
703LUA_API void lua_settable (lua_State *L, int idx) {741LUA_API void lua_settable (lua_State *L, int idx) {
704 StkId t;742 StkId t;
705 lua_lock(L);743 lua_lock(L);
@@ -732,6 +770,7 @@ LUA_API void lua_rawset (lua_State *L, int idx) { · 26 unmodified lines
732 t = index2addr(L, idx);770 t = index2addr(L, idx);
733 api_check(L, ttistable(t), "table expected");771 api_check(L, ttistable(t), "table expected");
734 setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);772 setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1);
773 invalidateTMcache(hvalue(t));
735 luaC_barrierback(L, gcvalue(t), L->top-1);774 luaC_barrierback(L, gcvalue(t), L->top-1);
736 L->top -= 2;775 L->top -= 2;
737 lua_unlock(L);776 lua_unlock(L);
@@ -739,13 +778,28 @@ LUA_API void lua_rawset (lua_State *L, int idx) { · 1 unmodified line
739 778
740 779
741LUA_API void lua_rawseti (lua_State *L, int idx, int n) {780LUA_API void lua_rawseti (lua_State *L, int idx, int n) {
742 StkId o;781 StkId t;
743 lua_lock(L);782 lua_lock(L);
744 api_checknelems(L, 1);783 api_checknelems(L, 1);
745 o = index2addr(L, idx);784 t = index2addr(L, idx);
746 api_check(L, ttistable(o), "table expected");785 api_check(L, ttistable(t), "table expected");
747 setobj2t(L, luaH_setint(L, hvalue(o), n), L->top-1);786 luaH_setint(L, hvalue(t), n, L->top - 1);
748 luaC_barrierback(L, gcvalue(o), L->top-1);787 luaC_barrierback(L, gcvalue(t), L->top-1);
788 L->top--;
789 lua_unlock(L);
790}
791
792
793LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) {
794 StkId t;
795 TValue k;
796 lua_lock(L);
797 api_checknelems(L, 1);
798 t = index2addr(L, idx);
799 api_check(L, ttistable(t), "table expected");
800 setpvalue(&k, cast(void *, p));
801 setobj2t(L, luaH_set(L, hvalue(t), &k), L->top - 1);
802 luaC_barrierback(L, gcvalue(t), L->top - 1);
749 L->top--;803 L->top--;
750 lua_unlock(L);804 lua_unlock(L);
751}805}
@@ -1128,7 +1182,6 @@ LUA_API void *lua_newuserdata (lua_State *L, size_t size) { · 376 unmodified lines
1128 1182
1129 1183
1130 1184
1131
1132static const char *aux_upvalue (StkId fi, int n, TValue **val,1185static const char *aux_upvalue (StkId fi, int n, TValue **val,
1133 GCObject **owner) {1186 GCObject **owner) {
1134 switch (ttype(fi)) {1187 switch (ttype(fi)) {
@@ -1141,15 +1194,13 @@ static const char *aux_upvalue (StkId fi, int n, TValue **val, · 6 unmodified lines
1141 }1194 }
1142 case LUA_TLCL: { /* Lua closure */1195 case LUA_TLCL: { /* Lua closure */
1143 LClosure *f = clLvalue(fi);1196 LClosure *f = clLvalue(fi);
1144 const char *name;1197 TString *name;
1145 Proto *p = f->p;1198 Proto *p = f->p;
1146 if (!(1 <= n && n <= p->sizeupvalues)) return NULL;1199 if (!(1 <= n && n <= p->sizeupvalues)) return NULL;
1147 *val = f->upvals[n-1]->v;1200 *val = f->upvals[n-1]->v;
1148 if (owner) *owner = obj2gco(f->upvals[n - 1]);1201 if (owner) *owner = obj2gco(f->upvals[n - 1]);
1149 name = getstr(p->upvalues[n-1].name);1202 name = p->upvalues[n-1].name;
1150 if (name == NULL) /* no debug information? */1203 return (name == NULL) ? "" : getstr(name);
1151 name = "";
1152 return name;
1153 }1204 }
1154 default: return NULL; /* not a closure */1205 default: return NULL; /* not a closure */
1155 }1206 }
@@ -1158,7 +1209,7 @@ static const char *aux_upvalue (StkId fi, int n, TValue **val, · 2 unmodified lines
1158 1209
1159LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {1210LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) {
1160 const char *name;1211 const char *name;
1161 TValue *val;1212 TValue *val = NULL; /* initialized to avoid warnings */
1162 lua_lock(L);1213 lua_lock(L);
1163 name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL);1214 name = aux_upvalue(index2addr(L, funcindex), n, &val, NULL);
1164 if (name) {1215 if (name) {
@@ -1172,8 +1223,8 @@ LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { · 7 unmodified lines
1172 1223
1173LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {1224LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) {
1174 const char *name;1225 const char *name;
1175 TValue *val;1226 TValue *val = NULL; /* initialized to avoid warnings */
1176 GCObject *owner;1227 GCObject *owner = NULL; /* initialized to avoid warnings */
1177 StkId fi;1228 StkId fi;
1178 lua_lock(L);1229 lua_lock(L);
1179 fi = index2addr(L, funcindex);1230 fi = index2addr(L, funcindex);
src/lauxlib.c+31−10
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lauxlib.c,v 1.233 2011/06/16 14:11:04 roberto Exp $2** $Id: lauxlib.c,v 1.236 2011/11/14 17:10:24 roberto Exp $
3** Auxiliary functions for building Lua libraries3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -41,11 +41,10 @@ · 35 unmodified lines
41** return 1 + string at top if find a good name.41** return 1 + string at top if find a good name.
42*/42*/
43static int findfield (lua_State *L, int objidx, int level) {43static int findfield (lua_State *L, int objidx, int level) {
44 int found = 0;
45 if (level == 0 || !lua_istable(L, -1))44 if (level == 0 || !lua_istable(L, -1))
46 return 0; /* not found */45 return 0; /* not found */
47 lua_pushnil(L); /* start 'next' loop */46 lua_pushnil(L); /* start 'next' loop */
48 while (!found && lua_next(L, -2)) { /* for each pair in table */47 while (lua_next(L, -2)) { /* for each pair in table */
49 if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */48 if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */
50 if (lua_rawequal(L, objidx, -1)) { /* found object? */49 if (lua_rawequal(L, objidx, -1)) { /* found object? */
51 lua_pop(L, 1); /* remove value (but keep name) */50 lua_pop(L, 1); /* remove value (but keep name) */
@@ -86,7 +85,7 @@ static void pushfuncname (lua_State *L, lua_Debug *ar) { · 34 unmodified lines
86 lua_pushfstring(L, "function " LUA_QS, ar->name);85 lua_pushfstring(L, "function " LUA_QS, ar->name);
87 else if (*ar->what == 'm') /* main? */86 else if (*ar->what == 'm') /* main? */
88 lua_pushfstring(L, "main chunk");87 lua_pushfstring(L, "main chunk");
89 else if (*ar->what == 'C' || *ar->what == 't') {88 else if (*ar->what == 'C') {
90 if (pushglobalfuncname(L, ar)) {89 if (pushglobalfuncname(L, ar)) {
91 lua_pushfstring(L, "function " LUA_QS, lua_tostring(L, -1));90 lua_pushfstring(L, "function " LUA_QS, lua_tostring(L, -1));
92 lua_remove(L, -2); /* remove name */91 lua_remove(L, -2); /* remove name */
@@ -331,7 +330,9 @@ LUALIB_API int luaL_checkoption (lua_State *L, int narg, const char *def, · 238 unmodified lines
331 330
332 331
333LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) {332LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) {
334 if (!lua_checkstack(L, space)) {333 /* keep some extra space to run error routines, if needed */
334 const int extra = LUA_MINSTACK;
335 if (!lua_checkstack(L, space + extra)) {
335 if (msg)336 if (msg)
336 luaL_error(L, "stack overflow (%s)", msg);337 luaL_error(L, "stack overflow (%s)", msg);
337 else338 else
@@ -591,6 +592,16 @@ static int errfile (lua_State *L, const char *what, int fnameindex) { · 253 unmodified lines
591}592}
592 593
593 594
595static int checkmode (lua_State *L, const char *mode, const char *x) {
596 if (mode && strchr(mode, x[0]) == NULL) {
597 lua_pushfstring(L,
598 "attempt to load a %s chunk (mode is " LUA_QS ")", x, mode);
599 return LUA_ERRFILE;
600 }
601 else return LUA_OK;
602}
603
604
594static int skipBOM (LoadF *lf) {605static int skipBOM (LoadF *lf) {
595 const char *p = "\xEF\xBB\xBF"; /* Utf8 BOM mark */606 const char *p = "\xEF\xBB\xBF"; /* Utf8 BOM mark */
596 int c;607 int c;
@@ -623,7 +634,8 @@ static int skipcomment (LoadF *lf, int *cp) { · 26 unmodified lines
623}634}
624 635
625 636
626LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {637LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename,
638 const char *mode) {
627 LoadF lf;639 LoadF lf;
628 int status, readstatus;640 int status, readstatus;
629 int c;641 int c;
@@ -639,14 +651,23 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { · 9 unmodified lines
639 }651 }
640 if (skipcomment(&lf, &c)) /* read initial portion */652 if (skipcomment(&lf, &c)) /* read initial portion */
641 lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */653 lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */
642 if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */654 if (c == LUA_SIGNATURE[0]) { /* binary file? */
643 lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */655 if ((status = checkmode(L, mode, "binary")) != LUA_OK)
644 if (lf.f == NULL) return errfile(L, "reopen", fnameindex);656 goto closefile;
645 skipcomment(&lf, &c); /* re-read initial portion */657 if (filename) {
658 lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
659 if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
660 skipcomment(&lf, &c); /* re-read initial portion */
661 }
662 }
663 else { /* text file */
664 if ((status = checkmode(L, mode, "text")) != LUA_OK)
665 goto closefile;
646 }666 }
647 if (c != EOF)667 if (c != EOF)
648 lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */668 lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */
649 status = lua_load(L, getF, &lf, lua_tostring(L, -1));669 status = lua_load(L, getF, &lf, lua_tostring(L, -1));
670 closefile:
650 readstatus = ferror(lf.f);671 readstatus = ferror(lf.f);
651 if (filename) fclose(lf.f); /* close file (even in case of errors) */672 if (filename) fclose(lf.f); /* close file (even in case of errors) */
652 if (readstatus) {673 if (readstatus) {
src/lauxlib.h+31−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lauxlib.h,v 1.117 2011/06/16 14:10:12 roberto Exp $2** $Id: lauxlib.h,v 1.119 2011/11/14 17:10:24 roberto Exp $
3** Auxiliary functions for building Lua libraries3** Auxiliary functions for building Lua libraries
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -72,7 +72,11 @@ LUALIB_API int (luaL_execresult) (lua_State *L, int stat); · 66 unmodified lines
72LUALIB_API int (luaL_ref) (lua_State *L, int t);72LUALIB_API int (luaL_ref) (lua_State *L, int t);
73LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);73LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref);
74 74
75LUALIB_API int (luaL_loadfile) (lua_State *L, const char *filename);75LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename,
76 const char *mode);
77
78#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL)
79
76LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,80LUALIB_API int (luaL_loadbuffer) (lua_State *L, const char *buff, size_t sz,
77 const char *name);81 const char *name);
78LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);82LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s);
@@ -163,6 +167,31 @@ LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); · 84 unmodified lines
163/* }====================================================== */167/* }====================================================== */
164 168
165 169
170
171/*
172** {======================================================
173** File handles for IO library
174** =======================================================
175*/
176
177/*
178** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and
179** initial structure 'luaL_Stream' (it may contain other fields
180** after that initial structure).
181*/
182
183#define LUA_FILEHANDLE "FILE*"
184
185
186typedef struct luaL_Stream {
187 FILE *f; /* stream (NULL for incompletely created streams) */
188 lua_CFunction closef; /* to close stream (NULL for closed streams) */
189} luaL_Stream;
190
191/* }====================================================== */
192
193
194
166/* compatibility with old module system */195/* compatibility with old module system */
167#if defined(LUA_COMPAT_MODULE)196#if defined(LUA_COMPAT_MODULE)
168 197
src/lbaselib.c+45−35
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lbaselib.c,v 1.264 2011/07/05 12:49:35 roberto Exp $2** $Id: lbaselib.c,v 1.270 2011/11/23 17:29:04 roberto Exp $
3** Basic library3** Basic library
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -46,20 +46,22 @@ static int luaB_print (lua_State *L) { · 40 unmodified lines
46#define SPACECHARS " \f\n\r\t\v"46#define SPACECHARS " \f\n\r\t\v"
47 47
48static int luaB_tonumber (lua_State *L) {48static int luaB_tonumber (lua_State *L) {
49 int base = luaL_optint(L, 2, 10);49 if (lua_isnoneornil(L, 2)) { /* standard conversion */
50 luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");50 int isnum;
51 if (base == 10) { /* standard conversion */51 lua_Number n = lua_tonumberx(L, 1, &isnum);
52 luaL_checkany(L, 1);52 if (isnum) {
53 if (lua_isnumber(L, 1)) {53 lua_pushnumber(L, n);
54 lua_pushnumber(L, lua_tonumber(L, 1));
55 return 1;54 return 1;
56 } /* else not a number */55 } /* else not a number; must be something */
56 luaL_checkany(L, 1);
57 }57 }
58 else {58 else {
59 size_t l;59 size_t l;
60 const char *s = luaL_checklstring(L, 1, &l);60 const char *s = luaL_checklstring(L, 1, &l);
61 const char *e = s + l; /* end point for 's' */61 const char *e = s + l; /* end point for 's' */
62 int base = luaL_checkint(L, 2);
62 int neg = 0;63 int neg = 0;
64 luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");
63 s += strspn(s, SPACECHARS); /* skip initial spaces */65 s += strspn(s, SPACECHARS); /* skip initial spaces */
64 if (*s == '-') { s++; neg = 1; } /* handle signal */66 if (*s == '-') { s++; neg = 1; } /* handle signal */
65 else if (*s == '+') s++;67 else if (*s == '+') s++;
@@ -158,7 +160,7 @@ static int luaB_rawset (lua_State *L) { · 92 unmodified lines
158static int luaB_collectgarbage (lua_State *L) {160static int luaB_collectgarbage (lua_State *L) {
159 static const char *const opts[] = {"stop", "restart", "collect",161 static const char *const opts[] = {"stop", "restart", "collect",
160 "count", "step", "setpause", "setstepmul",162 "count", "step", "setpause", "setstepmul",
161 "setmajorinc", "isrunning", "gen", "inc", NULL};163 "setmajorinc", "isrunning", "generational", "incremental", NULL};
162 static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,164 static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT,
163 LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,165 LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL,
164 LUA_GCSETMAJORINC, LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC};166 LUA_GCSETMAJORINC, LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC};
@@ -253,7 +255,14 @@ static int load_aux (lua_State *L, int status) { · 88 unmodified lines
253 255
254static int luaB_loadfile (lua_State *L) {256static int luaB_loadfile (lua_State *L) {
255 const char *fname = luaL_optstring(L, 1, NULL);257 const char *fname = luaL_optstring(L, 1, NULL);
256 return load_aux(L, luaL_loadfile(L, fname));258 const char *mode = luaL_optstring(L, 2, NULL);
259 int env = !lua_isnone(L, 3); /* 'env' parameter? */
260 int status = luaL_loadfilex(L, fname, mode);
261 if (status == LUA_OK && env) { /* 'env' parameter? */
262 lua_pushvalue(L, 3);
263 lua_setupvalue(L, -2, 1); /* set it as 1st upvalue of loaded chunk */
264 }
265 return load_aux(L, status);
257}266}
258 267
259 268
@@ -265,7 +274,6 @@ static int luaB_loadfile (lua_State *L) { · 5 unmodified lines
265 274
266 275
267typedef struct {276typedef struct {
268char c;
269 const char *mode;277 const char *mode;
270} loaddata;278} loaddata;
271 279
@@ -276,11 +284,11 @@ char c; · 4 unmodified lines
276** pushed on the stack) in case of errors.284** pushed on the stack) in case of errors.
277*/285*/
278static const char *checkrights (lua_State *L, const char *mode, const char *s) {286static const char *checkrights (lua_State *L, const char *mode, const char *s) {
279 if (strchr(mode, 'b') == NULL && *s == LUA_SIGNATURE[0])287 const char *x = (*s == LUA_SIGNATURE[0]) ? "binary" : "text";
280 return lua_pushstring(L, "attempt to load a binary chunk");288 if (strchr(mode, x[0]) == NULL)
281 if (strchr(mode, 't') == NULL && *s != LUA_SIGNATURE[0])289 return lua_pushfstring(L,
282 return lua_pushstring(L, "attempt to load a text chunk");290 "attempt to load a %s chunk (mode is " LUA_QS ")", x, mode);
283 return NULL; /* chunk in allowed format */291 else return NULL;
284}292}
285 293
286 294
@@ -390,27 +398,32 @@ static int luaB_select (lua_State *L) { · 103 unmodified lines
390}398}
391 399
392 400
393static int pcallcont (lua_State *L) {401static int finishpcall (lua_State *L, int status) {
394 int errfunc = 0; /* =0 to avoid warnings */402 if (!lua_checkstack(L, 1)) { /* no space for extra boolean? */
395 int status = lua_getctx(L, &errfunc);403 lua_settop(L, 0); /* create space for return values */
396 lua_assert(status != LUA_OK);404 lua_pushboolean(L, 0);
397 lua_pushboolean(L, (status == LUA_YIELD)); /* first result (status) */405 lua_pushstring(L, "stack overflow");
398 if (errfunc) /* came from xpcall? */406 return 2; /* return false, msg */
399 lua_replace(L, 1); /* put first result in place of error function */407 }
400 else /* came from pcall */408 lua_pushboolean(L, status); /* first result (status) */
401 lua_insert(L, 1); /* open space for first result */409 lua_replace(L, 1); /* put first result in first slot */
402 return lua_gettop(L);410 return lua_gettop(L);
403}411}
404 412
405 413
414static int pcallcont (lua_State *L) {
415 int status = lua_getctx(L, NULL);
416 return finishpcall(L, (status == LUA_YIELD));
417}
418
419
406static int luaB_pcall (lua_State *L) {420static int luaB_pcall (lua_State *L) {
407 int status;421 int status;
408 luaL_checkany(L, 1);422 luaL_checkany(L, 1);
409 status = lua_pcallk(L, lua_gettop(L) - 1, LUA_MULTRET, 0, 0, pcallcont);423 lua_pushnil(L);
410 luaL_checkstack(L, 1, NULL);424 lua_insert(L, 1); /* create space for status result */
411 lua_pushboolean(L, (status == LUA_OK));425 status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, pcallcont);
412 lua_insert(L, 1);426 return finishpcall(L, (status == LUA_OK));
413 return lua_gettop(L); /* return status + all results */
414}427}
415 428
416 429
@@ -421,11 +434,8 @@ static int luaB_xpcall (lua_State *L) { · 4 unmodified lines
421 lua_pushvalue(L, 1); /* exchange function... */434 lua_pushvalue(L, 1); /* exchange function... */
422 lua_copy(L, 2, 1); /* ...and error handler */435 lua_copy(L, 2, 1); /* ...and error handler */
423 lua_replace(L, 2);436 lua_replace(L, 2);
424 status = lua_pcallk(L, n - 2, LUA_MULTRET, 1, 1, pcallcont);437 status = lua_pcallk(L, n - 2, LUA_MULTRET, 1, 0, pcallcont);
425 luaL_checkstack(L, 1, NULL);438 return finishpcall(L, (status == LUA_OK));
426 lua_pushboolean(L, (status == LUA_OK));
427 lua_replace(L, 1);
428 return lua_gettop(L); /* return status + all results */
429}439}
430 440
431 441
src/lcode.c+12−10
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lcode.c,v 2.56 2011/05/31 18:27:56 roberto Exp $2** $Id: lcode.c,v 2.60 2011/08/30 16:26:41 roberto Exp $
3** Code generator for Lua3** Code generator for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -44,8 +44,8 @@ void luaK_nil (FuncState *fs, int from, int n) { · 38 unmodified lines
44 int pl = pfrom + GETARG_B(*previous);44 int pl = pfrom + GETARG_B(*previous);
45 if ((pfrom <= from && from <= pl + 1) ||45 if ((pfrom <= from && from <= pl + 1) ||
46 (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */46 (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */
47 if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */ 47 if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */
48 if (pl > l) l = pl; /* l = max(l, pl) */ 48 if (pl > l) l = pl; /* l = max(l, pl) */
49 SETARG_A(*previous, from);49 SETARG_A(*previous, from);
50 SETARG_B(*previous, l - from);50 SETARG_B(*previous, l - from);
51 return;51 return;
@@ -213,11 +213,11 @@ static int luaK_code (FuncState *fs, Instruction i) { · 161 unmodified lines
213 Proto *f = fs->f;213 Proto *f = fs->f;
214 dischargejpc(fs); /* `pc' will change */214 dischargejpc(fs); /* `pc' will change */
215 /* put new instruction in code array */215 /* put new instruction in code array */
216 luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction,216 luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction,
217 MAX_INT, "opcodes");217 MAX_INT, "opcodes");
218 f->code[fs->pc] = i;218 f->code[fs->pc] = i;
219 /* save corresponding line information */219 /* save corresponding line information */
220 luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int,220 luaM_growvector(fs->ls->L, f->lineinfo, fs->pc, f->sizelineinfo, int,
221 MAX_INT, "opcodes");221 MAX_INT, "opcodes");
222 f->lineinfo[fs->pc] = fs->ls->lastline;222 f->lineinfo[fs->pc] = fs->ls->lastline;
223 return fs->pc++;223 return fs->pc++;
@@ -289,7 +289,7 @@ static void freeexp (FuncState *fs, expdesc *e) { · 65 unmodified lines
289 289
290 290
291static int addk (FuncState *fs, TValue *key, TValue *v) {291static int addk (FuncState *fs, TValue *key, TValue *v) {
292 lua_State *L = fs->L;292 lua_State *L = fs->ls->L;
293 TValue *idx = luaH_set(L, fs->h, key);293 TValue *idx = luaH_set(L, fs->h, key);
294 Proto *f = fs->f;294 Proto *f = fs->f;
295 int k, oldsize;295 int k, oldsize;
@@ -304,6 +304,8 @@ static int addk (FuncState *fs, TValue *key, TValue *v) { · 8 unmodified lines
304 /* constant not found; create a new entry */304 /* constant not found; create a new entry */
305 oldsize = f->sizek;305 oldsize = f->sizek;
306 k = fs->nk;306 k = fs->nk;
307 /* numerical value does not need GC barrier;
308 table has no metatable, so it does not need to invalidate cache */
307 setnvalue(idx, cast_num(k));309 setnvalue(idx, cast_num(k));
308 luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants");310 luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants");
309 while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);311 while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]);
@@ -316,14 +318,14 @@ static int addk (FuncState *fs, TValue *key, TValue *v) { · 6 unmodified lines
316 318
317int luaK_stringK (FuncState *fs, TString *s) {319int luaK_stringK (FuncState *fs, TString *s) {
318 TValue o;320 TValue o;
319 setsvalue(fs->L, &o, s);321 setsvalue(fs->ls->L, &o, s);
320 return addk(fs, &o, &o);322 return addk(fs, &o, &o);
321}323}
322 324
323 325
324int luaK_numberK (FuncState *fs, lua_Number r) {326int luaK_numberK (FuncState *fs, lua_Number r) {
325 int n;327 int n;
326 lua_State *L = fs->L;328 lua_State *L = fs->ls->L;
327 TValue o;329 TValue o;
328 setnvalue(&o, r);330 setnvalue(&o, r);
329 if (r == 0 || luai_numisnan(NULL, r)) { /* handle -0 and NaN */331 if (r == 0 || luai_numisnan(NULL, r)) { /* handle -0 and NaN */
@@ -350,7 +352,7 @@ static int nilK (FuncState *fs) { · 20 unmodified lines
350 TValue k, v;352 TValue k, v;
351 setnilvalue(&v);353 setnilvalue(&v);
352 /* cannot use nil as key; instead use table itself to represent nil */354 /* cannot use nil as key; instead use table itself to represent nil */
353 sethvalue(fs->L, &k, fs->h);355 sethvalue(fs->ls->L, &k, fs->h);
354 return addk(fs, &k, &v);356 return addk(fs, &k, &v);
355}357}
356 358
@@ -641,7 +643,7 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) { · 284 unmodified lines
641}643}
642 644
643 645
644static void luaK_goiffalse (FuncState *fs, expdesc *e) {646void luaK_goiffalse (FuncState *fs, expdesc *e) {
645 int pc; /* pc of last jump */647 int pc; /* pc of last jump */
646 luaK_dischargevars(fs, e);648 luaK_dischargevars(fs, e);
647 switch (e->k) {649 switch (e->k) {
src/lcode.h+2−1
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lcode.h,v 1.57 2011/04/07 18:14:12 roberto Exp $2** $Id: lcode.h,v 1.58 2011/08/30 16:26:41 roberto Exp $
3** Code generator for Lua3** Code generator for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -62,6 +62,7 @@ LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e); · 56 unmodified lines
62LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);62LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
63LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);63LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
64LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);64LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
65LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e);
65LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);66LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);
66LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);67LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);
67LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);68LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);
src/lcorolib.c+2−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lcorolib.c,v 1.2 2010/07/02 11:38:13 roberto Exp $2** $Id: lcorolib.c,v 1.3 2011/08/23 17:24:34 roberto Exp $
3** Coroutine Library3** Coroutine Library
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -28,7 +28,7 @@ static int auxresume (lua_State *L, lua_State *co, int narg) { · 22 unmodified lines
28 return -1; /* error flag */28 return -1; /* error flag */
29 }29 }
30 lua_xmove(L, co, narg);30 lua_xmove(L, co, narg);
31 status = lua_resume(co, narg);31 status = lua_resume(co, L, narg);
32 if (status == LUA_OK || status == LUA_YIELD) {32 if (status == LUA_OK || status == LUA_YIELD) {
33 int nres = lua_gettop(co);33 int nres = lua_gettop(co);
34 if (!lua_checkstack(L, nres + 1)) {34 if (!lua_checkstack(L, nres + 1)) {
src/lctype.c+4−1
@@ -1,9 +1,12 @@
1/*1/*
2** $Id: lctype.c,v 1.10 2011/06/24 12:25:33 roberto Exp $2** $Id: lctype.c,v 1.11 2011/10/03 16:19:23 roberto Exp $
3** 'ctype' functions for Lua3** 'ctype' functions for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
6 6
7#define lctype_c
8#define LUA_CORE
9
7#include "lctype.h"10#include "lctype.h"
8 11
9#if !LUA_USE_CTYPE /* { */12#if !LUA_USE_CTYPE /* { */
src/lctype.h+2−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lctype.h,v 1.11 2011/06/27 18:22:46 roberto Exp $2** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $
3** 'ctype' functions for Lua3** 'ctype' functions for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -11,7 +11,7 @@ · 5 unmodified lines
11 11
12 12
13/*13/*
14** WARNING: the functions defined here do not necessarily correspond 14** WARNING: the functions defined here do not necessarily correspond
15** to the similar functions in the standard C ctype.h. They are15** to the similar functions in the standard C ctype.h. They are
16** optimized for the specific needs of Lua16** optimized for the specific needs of Lua
17*/17*/
src/ldblib.c+4−7
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldblib.c,v 1.130 2011/04/08 19:17:36 roberto Exp $2** $Id: ldblib.c,v 1.131 2011/10/24 14:54:05 roberto Exp $
3** Interface from Lua to its debug API3** Interface from Lua to its debug API
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -260,8 +260,7 @@ static void hookf (lua_State *L, lua_Debug *ar) { · 254 unmodified lines
260 static const char *const hooknames[] =260 static const char *const hooknames[] =
261 {"call", "return", "line", "count", "tail call"};261 {"call", "return", "line", "count", "tail call"};
262 gethooktable(L);262 gethooktable(L);
263 lua_pushlightuserdata(L, L);263 lua_rawgetp(L, -1, L);
264 lua_rawget(L, -2);
265 if (lua_isfunction(L, -1)) {264 if (lua_isfunction(L, -1)) {
266 lua_pushstring(L, hooknames[(int)ar->event]);265 lua_pushstring(L, hooknames[(int)ar->event]);
267 if (ar->currentline >= 0)266 if (ar->currentline >= 0)
@@ -308,9 +307,8 @@ static int db_sethook (lua_State *L) { · 40 unmodified lines
308 func = hookf; mask = makemask(smask, count);307 func = hookf; mask = makemask(smask, count);
309 }308 }
310 gethooktable(L);309 gethooktable(L);
311 lua_pushlightuserdata(L, L1);
312 lua_pushvalue(L, arg+1);310 lua_pushvalue(L, arg+1);
313 lua_rawset(L, -3); /* set new hook */311 lua_rawsetp(L, -2, L1); /* set new hook */
314 lua_pop(L, 1); /* remove hook table */312 lua_pop(L, 1); /* remove hook table */
315 lua_sethook(L1, func, mask, count); /* set hooks */313 lua_sethook(L1, func, mask, count); /* set hooks */
316 return 0;314 return 0;
@@ -327,8 +325,7 @@ static int db_gethook (lua_State *L) { · 10 unmodified lines
327 lua_pushliteral(L, "external hook");325 lua_pushliteral(L, "external hook");
328 else {326 else {
329 gethooktable(L);327 gethooktable(L);
330 lua_pushlightuserdata(L, L1);328 lua_rawgetp(L, -1, L1); /* get hook */
331 lua_rawget(L, -2); /* get hook */
332 lua_remove(L, -2); /* remove hook table */329 lua_remove(L, -2); /* remove hook table */
333 }330 }
334 lua_pushstring(L, unmakemask(mask, buff));331 lua_pushstring(L, unmakemask(mask, buff));
src/ldebug.c+104−96
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldebug.c,v 2.82 2011/06/02 19:31:40 roberto Exp $2** $Id: ldebug.c,v 2.87 2011/10/07 20:45:19 roberto Exp $
3** Debug Interface3** Debug Interface
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -94,6 +94,13 @@ LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { · 88 unmodified lines
94}94}
95 95
96 96
97static const char *upvalname (Proto *p, int uv) {
98 TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name);
99 if (s == NULL) return "?";
100 else return getstr(s);
101}
102
103
97static const char *findvararg (CallInfo *ci, int n, StkId *pos) {104static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
98 int nparams = clLvalue(ci->func)->p->numparams;105 int nparams = clLvalue(ci->func)->p->numparams;
99 if (n >= ci->u.l.base - ci->func - nparams)106 if (n >= ci->u.l.base - ci->func - nparams)
@@ -190,12 +197,14 @@ static void collectvalidlines (lua_State *L, Closure *f) { · 90 unmodified lines
190 }197 }
191 else {198 else {
192 int i;199 int i;
200 TValue v;
193 int *lineinfo = f->l.p->lineinfo;201 int *lineinfo = f->l.p->lineinfo;
194 Table *t = luaH_new(L);202 Table *t = luaH_new(L); /* new table to store active lines */
195 sethvalue(L, L->top, t);203 sethvalue(L, L->top, t); /* push it on stack */
196 incr_top(L);204 incr_top(L);
197 for (i=0; i<f->l.p->sizelineinfo; i++)205 setbvalue(&v, 1); /* boolean 'true' to be the value of all indices */
198 setbvalue(luaH_setint(L, t, lineinfo[i]), 1);206 for (i = 0; i < f->l.p->sizelineinfo; i++) /* for all lines with code */
207 luaH_setint(L, t, lineinfo[i], &v); /* table[line] = true */
199 }208 }
200}209}
201 210
@@ -230,7 +239,11 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, · 28 unmodified lines
230 break;239 break;
231 }240 }
232 case 'n': {241 case 'n': {
233 ar->namewhat = (ci) ? getfuncname(L, ci, &ar->name) : NULL;242 /* calling function is a known Lua function? */
243 if (ci && !(ci->callstatus & CIST_TAIL) && isLua(ci->previous))
244 ar->namewhat = getfuncname(L, ci->previous, &ar->name);
245 else
246 ar->namewhat = NULL;
234 if (ar->namewhat == NULL) {247 if (ar->namewhat == NULL) {
235 ar->namewhat = ""; /* not found */248 ar->namewhat = ""; /* not found */
236 ar->name = NULL;249 ar->name = NULL;
@@ -284,17 +297,16 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { · 47 unmodified lines
284** =======================================================297** =======================================================
285*/298*/
286 299
287static const char *getobjname (lua_State *L, CallInfo *ci, int reg,300static const char *getobjname (Proto *p, int lastpc, int reg,
288 const char **name);301 const char **name);
289 302
290 303
291/*304/*
292** find a "name" for the RK value 'c'305** find a "name" for the RK value 'c'
293*/306*/
294static void kname (lua_State *L, CallInfo *ci, int c, int oreg,307static void kname (Proto *p, int pc, int c, const char **name) {
295 const char *what, const char **name) {
296 if (ISK(c)) { /* is 'c' a constant? */308 if (ISK(c)) { /* is 'c' a constant? */
297 TValue *kvalue = &ci_func(ci)->p->k[INDEXK(c)];309 TValue *kvalue = &p->k[INDEXK(c)];
298 if (ttisstring(kvalue)) { /* literal constant? */310 if (ttisstring(kvalue)) { /* literal constant? */
299 *name = svalue(kvalue); /* it is its own name */311 *name = svalue(kvalue); /* it is its own name */
300 return;312 return;
@@ -302,8 +314,7 @@ static void kname (lua_State *L, CallInfo *ci, int c, int oreg, · 1 unmodified line
302 /* else no reasonable name found */314 /* else no reasonable name found */
303 }315 }
304 else { /* 'c' is a register */316 else { /* 'c' is a register */
305 if (c != oreg) /* not the original register? */317 const char *what = getobjname(p, pc, c, name); /* search for 'c' */
306 what = getobjname(L, ci, c, name); /* search for 'c' */
307 if (what && *what == 'c') { /* found a constant name? */318 if (what && *what == 'c') { /* found a constant name? */
308 return; /* 'name' already filled */319 return; /* 'name' already filled */
309 }320 }
@@ -313,85 +324,30 @@ static void kname (lua_State *L, CallInfo *ci, int c, int oreg, · 3 unmodified lines
313}324}
314 325
315 326
316static const char *getobjname (lua_State *L, CallInfo *ci, int reg,327/*
317 const char **name) {328** try to find last instruction before 'lastpc' that modified register 'reg'
318 Proto *p = ci_func(ci)->p;329*/
319 const char *what = NULL;330static int findsetreg (Proto *p, int lastpc, int reg) {
320 int lastpc = currentpc(ci);
321 int pc;331 int pc;
322 *name = luaF_getlocalname(p, reg + 1, lastpc);332 int setreg = -1; /* keep last instruction that changed 'reg' */
323 if (*name) /* is a local? */
324 return "local";
325 /* else try symbolic execution */
326 for (pc = 0; pc < lastpc; pc++) {333 for (pc = 0; pc < lastpc; pc++) {
327 Instruction i = p->code[pc];334 Instruction i = p->code[pc];
328 OpCode op = GET_OPCODE(i);335 OpCode op = GET_OPCODE(i);
329 int a = GETARG_A(i);336 int a = GETARG_A(i);
330 switch (op) {337 switch (op) {
331 case OP_MOVE: {
332 if (reg == a) {
333 int b = GETARG_B(i); /* move from 'b' to 'a' */
334 if (b < a)
335 what = getobjname(L, ci, b, name); /* get name for 'b' */
336 else what = NULL;
337 }
338 break;
339 }
340 case OP_GETTABUP:
341 case OP_GETTABLE: {
342 if (reg == a) {
343 int k = GETARG_C(i); /* key index */
344 int t = GETARG_B(i);
345 const char *vn = (op == OP_GETTABLE) /* name of indexed variable */
346 ? luaF_getlocalname(p, t + 1, pc)
347 : getstr(p->upvalues[t].name);
348 kname(L, ci, k, a, what, name);
349 what = (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field";
350 }
351 break;
352 }
353 case OP_GETUPVAL: {
354 if (reg == a) {
355 int u = GETARG_B(i); /* upvalue index */
356 TString *tn = p->upvalues[u].name;
357 *name = tn ? getstr(tn) : "?";
358 what = "upvalue";
359 }
360 break;
361 }
362 case OP_LOADK:
363 case OP_LOADKX: {
364 if (reg == a) {
365 int b = (op == OP_LOADK) ? GETARG_Bx(i)
366 : GETARG_Ax(p->code[pc + 1]);
367 if (ttisstring(&p->k[b])) {
368 what = "constant";
369 *name = svalue(&p->k[b]);
370 }
371 }
372 break;
373 }
374 case OP_LOADNIL: {338 case OP_LOADNIL: {
375 int b = GETARG_B(i);339 int b = GETARG_B(i);
376 if (a <= reg && reg <= a + b) /* set registers from 'a' to 'a+b' */340 if (a <= reg && reg <= a + b) /* set registers from 'a' to 'a+b' */
377 what = NULL;341 setreg = pc;
378 break;
379 }
380 case OP_SELF: {
381 if (reg == a) {
382 int k = GETARG_C(i); /* key index */
383 kname(L, ci, k, a, what, name);
384 what = "method";
385 }
386 break;342 break;
387 }343 }
388 case OP_TFORCALL: {344 case OP_TFORCALL: {
389 if (reg >= a + 2) what = NULL; /* affect all regs above its base */345 if (reg >= a + 2) setreg = pc; /* affect all regs above its base */
390 break;346 break;
391 }347 }
392 case OP_CALL:348 case OP_CALL:
393 case OP_TAILCALL: {349 case OP_TAILCALL: {
394 if (reg >= a) what = NULL; /* affect all registers above base */350 if (reg >= a) setreg = pc; /* affect all registers above base */
395 break;351 break;
396 }352 }
397 case OP_JMP: {353 case OP_JMP: {
@@ -403,35 +359,87 @@ static const char *getobjname (lua_State *L, CallInfo *ci, int reg, · 5 unmodified lines
403 break;359 break;
404 }360 }
405 case OP_TEST: {361 case OP_TEST: {
406 if (reg == a) what = NULL; /* jumped code can change 'a' */362 if (reg == a) setreg = pc; /* jumped code can change 'a' */
407 break;363 break;
408 }364 }
409 default:365 default:
410 if (testAMode(op) && reg == a) what = NULL;366 if (testAMode(op) && reg == a) /* any instruction that set A */
367 setreg = pc;
411 break;368 break;
412 }369 }
413 }370 }
414 return what;371 return setreg;
372}
373
374
375static const char *getobjname (Proto *p, int lastpc, int reg,
376 const char **name) {
377 int pc;
378 *name = luaF_getlocalname(p, reg + 1, lastpc);
379 if (*name) /* is a local? */
380 return "local";
381 /* else try symbolic execution */
382 pc = findsetreg(p, lastpc, reg);
383 if (pc != -1) { /* could find instruction? */
384 Instruction i = p->code[pc];
385 OpCode op = GET_OPCODE(i);
386 switch (op) {
387 case OP_MOVE: {
388 int b = GETARG_B(i); /* move from 'b' to 'a' */
389 if (b < GETARG_A(i))
390 return getobjname(p, pc, b, name); /* get name for 'b' */
391 break;
392 }
393 case OP_GETTABUP:
394 case OP_GETTABLE: {
395 int k = GETARG_C(i); /* key index */
396 int t = GETARG_B(i); /* table index */
397 const char *vn = (op == OP_GETTABLE) /* name of indexed variable */
398 ? luaF_getlocalname(p, t + 1, pc)
399 : upvalname(p, t);
400 kname(p, pc, k, name);
401 return (vn && strcmp(vn, LUA_ENV) == 0) ? "global" : "field";
402 }
403 case OP_GETUPVAL: {
404 *name = upvalname(p, GETARG_B(i));
405 return "upvalue";
406 }
407 case OP_LOADK:
408 case OP_LOADKX: {
409 int b = (op == OP_LOADK) ? GETARG_Bx(i)
410 : GETARG_Ax(p->code[pc + 1]);
411 if (ttisstring(&p->k[b])) {
412 *name = svalue(&p->k[b]);
413 return "constant";
414 }
415 break;
416 }
417 case OP_SELF: {
418 int k = GETARG_C(i); /* key index */
419 kname(p, pc, k, name);
420 return "method";
421 }
422 default: break; /* go through to return NULL */
423 }
424 }
425 return NULL; /* could not find reasonable name */
415}426}
416 427
417 428
418static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {429static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) {
419 TMS tm;430 TMS tm;
420 Instruction i;431 Proto *p = ci_func(ci)->p; /* calling function */
421 if ((ci->callstatus & CIST_TAIL) || !isLua(ci->previous))432 int pc = currentpc(ci); /* calling instruction index */
422 return NULL; /* calling function is not Lua (or is unknown) */433 Instruction i = p->code[pc]; /* calling instruction */
423 ci = ci->previous; /* calling function */
424 i = ci_func(ci)->p->code[currentpc(ci)];
425 if (GET_OPCODE(i) == OP_EXTRAARG) /* extra argument? */
426 i = ci_func(ci)->p->code[currentpc(ci) - 1]; /* get 'real' instruction */
427 switch (GET_OPCODE(i)) {434 switch (GET_OPCODE(i)) {
428 case OP_CALL:435 case OP_CALL:
429 case OP_TAILCALL:436 case OP_TAILCALL: /* get function name */
430 return getobjname(L, ci, GETARG_A(i), name);437 return getobjname(p, pc, GETARG_A(i), name);
431 case OP_TFORCALL: {438 case OP_TFORCALL: { /* for iterator */
432 *name = "for iterator";439 *name = "for iterator";
433 return "for iterator";440 return "for iterator";
434 }441 }
442 /* all other instructions can call only through metamethods */
435 case OP_SELF:443 case OP_SELF:
436 case OP_GETTABUP:444 case OP_GETTABUP:
437 case OP_GETTABLE: tm = TM_INDEX; break;445 case OP_GETTABLE: tm = TM_INDEX; break;
@@ -473,12 +481,12 @@ static int isinstack (CallInfo *ci, const TValue *o) { · 35 unmodified lines
473 481
474 482
475static const char *getupvalname (CallInfo *ci, const TValue *o,483static const char *getupvalname (CallInfo *ci, const TValue *o,
476 const char **name) {484 const char **name) {
477 LClosure *c = ci_func(ci);485 LClosure *c = ci_func(ci);
478 int i;486 int i;
479 for (i = 0; i < c->nupvalues; i++) {487 for (i = 0; i < c->nupvalues; i++) {
480 if (c->upvals[i]->v == o) {488 if (c->upvals[i]->v == o) {
481 *name = getstr(c->p->upvalues[i].name);489 *name = upvalname(c->p, i);
482 return "upvalue";490 return "upvalue";
483 }491 }
484 }492 }
@@ -494,7 +502,8 @@ void luaG_typeerror (lua_State *L, const TValue *o, const char *op) { · 9 unmodified lines
494 if (isLua(ci)) {502 if (isLua(ci)) {
495 kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */503 kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */
496 if (!kind && isinstack(ci, o)) /* no? try a register */504 if (!kind && isinstack(ci, o)) /* no? try a register */
497 kind = getobjname(L, ci, cast_int(o - ci->u.l.base), &name);505 kind = getobjname(ci_func(ci)->p, currentpc(ci),
506 cast_int(o - ci->u.l.base), &name);
498 }507 }
499 if (kind)508 if (kind)
500 luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)",509 luaG_runerror(L, "attempt to %s %s " LUA_QS " (a %s value)",
@@ -511,7 +520,7 @@ void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { · 10 unmodified lines
511}520}
512 521
513 522
514void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {523l_noret luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) {
515 TValue temp;524 TValue temp;
516 if (luaV_tonumber(p1, &temp) == NULL)525 if (luaV_tonumber(p1, &temp) == NULL)
517 p2 = p1; /* first operand is wrong */526 p2 = p1; /* first operand is wrong */
@@ -519,14 +528,13 @@ void luaG_aritherror (lua_State *L, const TValue *p1, const TValue *p2) { · 1 unmodified line
519}528}
520 529
521 530
522int luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {531l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) {
523 const char *t1 = objtypename(p1);532 const char *t1 = objtypename(p1);
524 const char *t2 = objtypename(p2);533 const char *t2 = objtypename(p2);
525 if (t1 == t2)534 if (t1 == t2)
526 luaG_runerror(L, "attempt to compare two %s values", t1);535 luaG_runerror(L, "attempt to compare two %s values", t1);
527 else536 else
528 luaG_runerror(L, "attempt to compare %s with %s", t1, t2);537 luaG_runerror(L, "attempt to compare %s with %s", t1, t2);
529 return 0;
530}538}
531 539
532 540
@@ -546,7 +554,7 @@ static void addinfo (lua_State *L, const char *msg) { · 13 unmodified lines
546}554}
547 555
548 556
549void luaG_errormsg (lua_State *L) {557l_noret luaG_errormsg (lua_State *L) {
550 if (L->errfunc != 0) { /* is there an error handling function? */558 if (L->errfunc != 0) { /* is there an error handling function? */
551 StkId errfunc = restorestack(L, L->errfunc);559 StkId errfunc = restorestack(L, L->errfunc);
552 if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR);560 if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR);
@@ -559,7 +567,7 @@ void luaG_errormsg (lua_State *L) { · 6 unmodified lines
559}567}
560 568
561 569
562void luaG_runerror (lua_State *L, const char *fmt, ...) {570l_noret luaG_runerror (lua_State *L, const char *fmt, ...) {
563 va_list argp;571 va_list argp;
564 va_start(argp, fmt);572 va_start(argp, fmt);
565 addinfo(L, luaO_pushvfstring(L, fmt, argp));573 addinfo(L, luaO_pushvfstring(L, fmt, argp));
src/ldebug.h+10−10
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldebug.h,v 2.6 2011/06/02 19:31:40 roberto Exp $2** $Id: ldebug.h,v 2.7 2011/10/07 20:45:19 roberto Exp $
3** Auxiliary functions from Debug Interface module3** Auxiliary functions from Debug Interface module
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -21,14 +21,14 @@ · 15 unmodified lines
21#define ci_func(ci) (clLvalue((ci)->func))21#define ci_func(ci) (clLvalue((ci)->func))
22 22
23 23
24LUAI_FUNC void luaG_typeerror (lua_State *L, const TValue *o,24LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o,
25 const char *opname);25 const char *opname);
26LUAI_FUNC void luaG_concaterror (lua_State *L, StkId p1, StkId p2);26LUAI_FUNC l_noret luaG_concaterror (lua_State *L, StkId p1, StkId p2);
27LUAI_FUNC void luaG_aritherror (lua_State *L, const TValue *p1,27LUAI_FUNC l_noret luaG_aritherror (lua_State *L, const TValue *p1,
28 const TValue *p2);28 const TValue *p2);
29LUAI_FUNC int luaG_ordererror (lua_State *L, const TValue *p1,29LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1,
30 const TValue *p2);30 const TValue *p2);
31LUAI_FUNC void luaG_runerror (lua_State *L, const char *fmt, ...);31LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...);
32LUAI_FUNC void luaG_errormsg (lua_State *L);32LUAI_FUNC l_noret luaG_errormsg (lua_State *L);
33 33
34#endif34#endif
src/ldo.c+17−17
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldo.c,v 2.98 2011/06/28 15:42:04 roberto Exp $2** $Id: ldo.c,v 2.101 2011/10/07 20:45:19 roberto Exp $
3** Stack and Call structure of Lua3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -100,7 +100,7 @@ static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { · 94 unmodified lines
100}100}
101 101
102 102
103void luaD_throw (lua_State *L, int errcode) {103l_noret luaD_throw (lua_State *L, int errcode) {
104 if (L->errorJmp) { /* thread has an error handler? */104 if (L->errorJmp) { /* thread has an error handler? */
105 L->errorJmp->status = errcode; /* set status */105 L->errorJmp->status = errcode; /* set status */
106 LUAI_THROW(L, L->errorJmp); /* jump to it */106 LUAI_THROW(L, L->errorJmp); /* jump to it */
@@ -123,7 +123,7 @@ void luaD_throw (lua_State *L, int errcode) { · 16 unmodified lines
123 123
124 124
125int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {125int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
126 unsigned short oldnCcalls = G(L)->nCcalls;126 unsigned short oldnCcalls = L->nCcalls;
127 struct lua_longjmp lj;127 struct lua_longjmp lj;
128 lj.status = LUA_OK;128 lj.status = LUA_OK;
129 lj.previous = L->errorJmp; /* chain new error handler */129 lj.previous = L->errorJmp; /* chain new error handler */
@@ -132,7 +132,7 @@ int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { · 2 unmodified lines
132 (*f)(L, ud);132 (*f)(L, ud);
133 );133 );
134 L->errorJmp = lj.previous; /* restore old error handler */134 L->errorJmp = lj.previous; /* restore old error handler */
135 G(L)->nCcalls = oldnCcalls;135 L->nCcalls = oldnCcalls;
136 return lj.status;136 return lj.status;
137}137}
138 138
@@ -344,7 +344,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { · 205 unmodified lines
344 }344 }
345 default: { /* not a function */345 default: { /* not a function */
346 func = tryfuncTM(L, func); /* retry with 'function' tag method */346 func = tryfuncTM(L, func); /* retry with 'function' tag method */
347 return luaD_precall(L, func, nresults);347 return luaD_precall(L, func, nresults); /* now it must be a function */
348 }348 }
349 }349 }
350}350}
@@ -382,18 +382,17 @@ int luaD_poscall (lua_State *L, StkId firstResult) { · 31 unmodified lines
382** function position.382** function position.
383*/383*/
384void luaD_call (lua_State *L, StkId func, int nResults, int allowyield) {384void luaD_call (lua_State *L, StkId func, int nResults, int allowyield) {
385 global_State *g = G(L);385 if (++L->nCcalls >= LUAI_MAXCCALLS) {
386 if (++g->nCcalls >= LUAI_MAXCCALLS) {386 if (L->nCcalls == LUAI_MAXCCALLS)
387 if (g->nCcalls == LUAI_MAXCCALLS)
388 luaG_runerror(L, "C stack overflow");387 luaG_runerror(L, "C stack overflow");
389 else if (g->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))388 else if (L->nCcalls >= (LUAI_MAXCCALLS + (LUAI_MAXCCALLS>>3)))
390 luaD_throw(L, LUA_ERRERR); /* error while handing stack error */389 luaD_throw(L, LUA_ERRERR); /* error while handing stack error */
391 }390 }
392 if (!allowyield) L->nny++;391 if (!allowyield) L->nny++;
393 if (!luaD_precall(L, func, nResults)) /* is a Lua function? */392 if (!luaD_precall(L, func, nResults)) /* is a Lua function? */
394 luaV_execute(L); /* call it */393 luaV_execute(L); /* call it */
395 if (!allowyield) L->nny--;394 if (!allowyield) L->nny--;
396 g->nCcalls--;395 L->nCcalls--;
397 luaC_checkGC(L);396 luaC_checkGC(L);
398}397}
399 398
@@ -404,7 +403,7 @@ static void finishCcall (lua_State *L) { · 4 unmodified lines
404 lua_assert(ci->u.c.k != NULL); /* must have a continuation */403 lua_assert(ci->u.c.k != NULL); /* must have a continuation */
405 lua_assert(L->nny == 0);404 lua_assert(L->nny == 0);
406 /* finish 'luaD_call' */405 /* finish 'luaD_call' */
407 G(L)->nCcalls--;406 L->nCcalls--;
408 /* finish 'lua_callk' */407 /* finish 'lua_callk' */
409 adjustresults(L, ci->nresults);408 adjustresults(L, ci->nresults);
410 /* call continuation function */409 /* call continuation function */
@@ -473,7 +472,7 @@ static int recover (lua_State *L, int status) { · 62 unmodified lines
473** coroutine itself. (Such errors should not be handled by any coroutine472** coroutine itself. (Such errors should not be handled by any coroutine
474** error handler and should not kill the coroutine.)473** error handler and should not kill the coroutine.)
475*/474*/
476static void resume_error (lua_State *L, const char *msg, StkId firstArg) {475static l_noret resume_error (lua_State *L, const char *msg, StkId firstArg) {
477 L->top = firstArg; /* remove args from the stack */476 L->top = firstArg; /* remove args from the stack */
478 setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */477 setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */
479 incr_top(L);478 incr_top(L);
@@ -487,7 +486,7 @@ static void resume_error (lua_State *L, const char *msg, StkId firstArg) { · 7 unmodified lines
487static void resume (lua_State *L, void *ud) {486static void resume (lua_State *L, void *ud) {
488 StkId firstArg = cast(StkId, ud);487 StkId firstArg = cast(StkId, ud);
489 CallInfo *ci = L->ci;488 CallInfo *ci = L->ci;
490 if (G(L)->nCcalls >= LUAI_MAXCCALLS)489 if (L->nCcalls >= LUAI_MAXCCALLS)
491 resume_error(L, "C stack overflow", firstArg);490 resume_error(L, "C stack overflow", firstArg);
492 if (L->status == LUA_OK) { /* may be starting a coroutine */491 if (L->status == LUA_OK) { /* may be starting a coroutine */
493 if (ci != &L->base_ci) /* not in base level? */492 if (ci != &L->base_ci) /* not in base level? */
@@ -514,7 +513,7 @@ static void resume (lua_State *L, void *ud) { · 20 unmodified lines
514 api_checknelems(L, n);513 api_checknelems(L, n);
515 firstArg = L->top - n; /* yield results come from continuation */514 firstArg = L->top - n; /* yield results come from continuation */
516 }515 }
517 G(L)->nCcalls--; /* finish 'luaD_call' */516 L->nCcalls--; /* finish 'luaD_call' */
518 luaD_poscall(L, firstArg); /* finish 'luaD_precall' */517 luaD_poscall(L, firstArg); /* finish 'luaD_precall' */
519 }518 }
520 unroll(L, NULL);519 unroll(L, NULL);
@@ -522,11 +521,11 @@ static void resume (lua_State *L, void *ud) { · 1 unmodified line
522}521}
523 522
524 523
525LUA_API int lua_resume (lua_State *L, int nargs) {524LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs) {
526 int status;525 int status;
527 lua_lock(L);526 lua_lock(L);
528 luai_userstateresume(L, nargs);527 luai_userstateresume(L, nargs);
529 ++G(L)->nCcalls; /* count resume */528 L->nCcalls = (from) ? from->nCcalls + 1 : 1;
530 L->nny = 0; /* allow yields */529 L->nny = 0; /* allow yields */
531 api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs);530 api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs);
532 status = luaD_rawrunprotected(L, resume, L->top - nargs);531 status = luaD_rawrunprotected(L, resume, L->top - nargs);
@@ -546,7 +545,8 @@ LUA_API int lua_resume (lua_State *L, int nargs) { · 13 unmodified lines
546 lua_assert(status == L->status);545 lua_assert(status == L->status);
547 }546 }
548 L->nny = 1; /* do not allow yields */547 L->nny = 1; /* do not allow yields */
549 --G(L)->nCcalls;548 L->nCcalls--;
549 lua_assert(L->nCcalls == ((from) ? from->nCcalls : 0));
550 lua_unlock(L);550 lua_unlock(L);
551 return status;551 return status;
552}552}
src/ldo.h+2−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldo.h,v 2.18 2009/12/17 12:28:57 roberto Exp $2** $Id: ldo.h,v 2.19 2011/10/07 20:45:19 roberto Exp $
3** Stack and Call structure of Lua3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -38,7 +38,7 @@ LUAI_FUNC void luaD_reallocstack (lua_State *L, int newsize); · 32 unmodified lines
38LUAI_FUNC void luaD_growstack (lua_State *L, int n);38LUAI_FUNC void luaD_growstack (lua_State *L, int n);
39LUAI_FUNC void luaD_shrinkstack (lua_State *L);39LUAI_FUNC void luaD_shrinkstack (lua_State *L);
40 40
41LUAI_FUNC void luaD_throw (lua_State *L, int errcode);41LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode);
42LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);42LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud);
43 43
44#endif44#endif
src/ldump.c+3−3
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ldump.c,v 1.18 2011/05/06 13:35:17 lhf Exp $2** $Id: ldump.c,v 1.19 2011/11/23 17:48:18 lhf Exp $
3** save precompiled Lua chunks3** save precompiled Lua chunks
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -111,8 +111,8 @@ static void DumpUpvalues(const Proto* f, DumpState* D) · 105 unmodified lines
111 DumpInt(n,D);111 DumpInt(n,D);
112 for (i=0; i<n; i++)112 for (i=0; i<n; i++)
113 {113 {
114 DumpChar(f->upvalues[i].instack, D);114 DumpChar(f->upvalues[i].instack,D);
115 DumpChar(f->upvalues[i].idx, D);115 DumpChar(f->upvalues[i].idx,D);
116 }116 }
117}117}
118 118
src/lgc.c+96−46
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lgc.c,v 2.109 2011/05/05 19:42:25 roberto Exp $2** $Id: lgc.c,v 2.114 2011/10/03 17:54:25 roberto Exp $
3** Garbage Collector3** Garbage Collector
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -100,12 +100,13 @@ static void reallymarkobject (global_State *g, GCObject *o); · 94 unmodified lines
100 100
101 101
102/*102/*
103** mark a table entry as dead (therefore removing it from the table)103** if key is not marked, mark its entry as dead (therefore removing it
104** from the table)
104*/105*/
105static void removeentry (Node *n) {106static void removeentry (Node *n) {
106 lua_assert(ttisnil(gval(n)));107 lua_assert(ttisnil(gval(n)));
107 if (iscollectable(gkey(n)))108 if (valiswhite(gkey(n)))
108 setdeadvalue(gkey(n)); /* dead key; remove it */109 setdeadvalue(gkey(n)); /* unused and unmarked key; remove it */
109}110}
110 111
111 112
@@ -116,13 +117,13 @@ static void removeentry (Node *n) { · 4 unmodified lines
116** other objects: if really collected, cannot keep them; for objects117** other objects: if really collected, cannot keep them; for objects
117** being finalized, keep them in keys, but not in values118** being finalized, keep them in keys, but not in values
118*/119*/
119static int iscleared (const TValue *o, int iskey) {120static int iscleared (const TValue *o) {
120 if (!iscollectable(o)) return 0;121 if (!iscollectable(o)) return 0;
121 else if (ttisstring(o)) {122 else if (ttisstring(o)) {
122 stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */123 stringmark(rawtsvalue(o)); /* strings are `values', so are never weak */
123 return 0;124 return 0;
124 }125 }
125 else return iswhite(gcvalue(o)) || (!iskey && isfinalized(gcvalue(o)));126 else return iswhite(gcvalue(o));
126}127}
127 128
128 129
@@ -152,7 +153,7 @@ void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { · 23 unmodified lines
152*/153*/
153void luaC_barrierback_ (lua_State *L, GCObject *o) {154void luaC_barrierback_ (lua_State *L, GCObject *o) {
154 global_State *g = G(L);155 global_State *g = G(L);
155 lua_assert(isblack(o) && !isdead(g, o));156 lua_assert(isblack(o) && !isdead(g, o) && gch(o)->tt == LUA_TTABLE);
156 black2gray(o); /* make object gray (again) */157 black2gray(o); /* make object gray (again) */
157 gco2t(o)->gclist = g->grayagain;158 gco2t(o)->gclist = g->grayagain;
158 g->grayagain = o;159 g->grayagain = o;
@@ -342,6 +343,9 @@ static void markroot (global_State *g) { · 183 unmodified lines
342 343
343static void traverseweakvalue (global_State *g, Table *h) {344static void traverseweakvalue (global_State *g, Table *h) {
344 Node *n, *limit = gnode(h, sizenode(h));345 Node *n, *limit = gnode(h, sizenode(h));
346 /* if there is array part, assume it may have white values (do not
347 traverse it just to check) */
348 int hasclears = (h->sizearray > 0);
345 for (n = gnode(h, 0); n < limit; n++) {349 for (n = gnode(h, 0); n < limit; n++) {
346 checkdeadkey(n);350 checkdeadkey(n);
347 if (ttisnil(gval(n))) /* entry is empty? */351 if (ttisnil(gval(n))) /* entry is empty? */
@@ -349,15 +353,21 @@ static void traverseweakvalue (global_State *g, Table *h) { · 1 unmodified line
349 else {353 else {
350 lua_assert(!ttisnil(gkey(n)));354 lua_assert(!ttisnil(gkey(n)));
351 markvalue(g, gkey(n)); /* mark key */355 markvalue(g, gkey(n)); /* mark key */
356 if (!hasclears && iscleared(gval(n))) /* is there a white value? */
357 hasclears = 1; /* table will have to be cleared */
352 }358 }
353 }359 }
354 linktable(h, &g->weak); /* link into appropriate list */360 if (hasclears)
361 linktable(h, &g->weak); /* has to be cleared later */
362 else /* no white values */
363 linktable(h, &g->grayagain); /* no need to clean */
355}364}
356 365
357 366
358static int traverseephemeron (global_State *g, Table *h) {367static int traverseephemeron (global_State *g, Table *h) {
359 int marked = 0; /* true if an object is marked in this traversal */368 int marked = 0; /* true if an object is marked in this traversal */
360 int hasclears = 0; /* true if table has unmarked pairs */369 int hasclears = 0; /* true if table has white keys */
370 int prop = 0; /* true if table has entry "white-key -> white-value" */
361 Node *n, *limit = gnode(h, sizenode(h));371 Node *n, *limit = gnode(h, sizenode(h));
362 int i;372 int i;
363 /* traverse array part (numeric keys are 'strong') */373 /* traverse array part (numeric keys are 'strong') */
@@ -372,19 +382,22 @@ static int traverseephemeron (global_State *g, Table *h) { · 8 unmodified lines
372 checkdeadkey(n);382 checkdeadkey(n);
373 if (ttisnil(gval(n))) /* entry is empty? */383 if (ttisnil(gval(n))) /* entry is empty? */
374 removeentry(n); /* remove it */384 removeentry(n); /* remove it */
385 else if (iscleared(gkey(n))) { /* key is not marked (yet)? */
386 hasclears = 1; /* table must be cleared */
387 if (valiswhite(gval(n))) /* value not marked yet? */
388 prop = 1; /* must propagate again */
389 }
375 else if (valiswhite(gval(n))) { /* value not marked yet? */390 else if (valiswhite(gval(n))) { /* value not marked yet? */
376 if (iscleared(gkey(n), 1)) /* key is not marked (yet)? */391 marked = 1;
377 hasclears = 1; /* may have to propagate mark from key to value */392 reallymarkobject(g, gcvalue(gval(n))); /* mark it now */
378 else { /* key is marked, so mark value */
379 marked = 1; /* value was not marked */
380 reallymarkobject(g, gcvalue(gval(n)));
381 }
382 }393 }
383 }394 }
384 if (hasclears) /* does table have unmarked pairs? */395 if (prop)
385 linktable(h, &g->ephemeron); /* will have to propagate again */396 linktable(h, &g->ephemeron); /* have to propagate again */
386 else /* nothing to propagate */397 else if (hasclears) /* does table have white keys? */
387 linktable(h, &g->weak); /* avoid convergence phase */398 linktable(h, &g->allweak); /* may have to clean white keys */
399 else /* no white keys */
400 linktable(h, &g->grayagain); /* no need to clean */
388 return marked;401 return marked;
389}402}
390 403
@@ -526,11 +539,26 @@ static void propagateall (global_State *g) { · 135 unmodified lines
526}539}
527 540
528 541
529static void traverselistofgrays (global_State *g, GCObject **l) {542static void propagatelist (global_State *g, GCObject *l) {
530 lua_assert(g->gray == NULL); /* no grays left */543 lua_assert(g->gray == NULL); /* no grays left */
531 g->gray = *l; /* now 'l' is new gray list */544 g->gray = l;
532 *l = NULL;545 propagateall(g); /* traverse all elements from 'l' */
533 propagateall(g);546}
547
548/*
549** retraverse all gray lists. Because tables may be reinserted in other
550** lists when traversed, traverse the original lists to avoid traversing
551** twice the same table (which is not wrong, but inefficient)
552*/
553static void retraversegrays (global_State *g) {
554 GCObject *weak = g->weak; /* save original lists */
555 GCObject *grayagain = g->grayagain;
556 GCObject *ephemeron = g->ephemeron;
557 g->weak = g->grayagain = g->ephemeron = NULL;
558 propagateall(g); /* traverse main gray list */
559 propagatelist(g, grayagain);
560 propagatelist(g, weak);
561 propagatelist(g, ephemeron);
534}562}
535 563
536 564
@@ -562,21 +590,39 @@ static void convergeephemerons (global_State *g) { · 25 unmodified lines
562 590
563 591
564/*592/*
565** clear collected entries from all weaktables in list 'l'593** clear entries with unmarked keys from all weaktables in list 'l' up
594** to element 'f'
595*/
596static void clearkeys (GCObject *l, GCObject *f) {
597 for (; l != f; l = gco2t(l)->gclist) {
598 Table *h = gco2t(l);
599 Node *n, *limit = gnode(h, sizenode(h));
600 for (n = gnode(h, 0); n < limit; n++) {
601 if (!ttisnil(gval(n)) && (iscleared(gkey(n)))) {
602 setnilvalue(gval(n)); /* remove value ... */
603 removeentry(n); /* and remove entry from table */
604 }
605 }
606 }
607}
608
609
610/*
611** clear entries with unmarked values from all weaktables in list 'l' up
612** to element 'f'
566*/613*/
567static void cleartable (GCObject *l) {614static void clearvalues (GCObject *l, GCObject *f) {
568 for (; l != NULL; l = gco2t(l)->gclist) {615 for (; l != f; l = gco2t(l)->gclist) {
569 Table *h = gco2t(l);616 Table *h = gco2t(l);
570 Node *n, *limit = gnode(h, sizenode(h));617 Node *n, *limit = gnode(h, sizenode(h));
571 int i;618 int i;
572 for (i = 0; i < h->sizearray; i++) {619 for (i = 0; i < h->sizearray; i++) {
573 TValue *o = &h->array[i];620 TValue *o = &h->array[i];
574 if (iscleared(o, 0)) /* value was collected? */621 if (iscleared(o)) /* value was collected? */
575 setnilvalue(o); /* remove value */622 setnilvalue(o); /* remove value */
576 }623 }
577 for (n = gnode(h, 0); n < limit; n++) {624 for (n = gnode(h, 0); n < limit; n++) {
578 if (!ttisnil(gval(n)) && /* non-empty entry? */625 if (!ttisnil(gval(n)) && iscleared(gval(n))) {
579 (iscleared(gkey(n), 1) || iscleared(gval(n), 0))) {
580 setnilvalue(gval(n)); /* remove value ... */626 setnilvalue(gval(n)); /* remove value ... */
581 removeentry(n); /* and remove entry from table */627 removeentry(n); /* and remove entry from table */
582 }628 }
@@ -743,10 +789,10 @@ static void GCTM (lua_State *L, int propagateerrors) { · 160 unmodified lines
743 789
744 790
745/*791/*
746** move all unreachable objects that need finalization from list 'finobj'792** move all unreachable objects (or 'all' objects) that need
747** to list 'tobefnz'793** finalization from list 'finobj' to list 'tobefnz' (to be finalized)
748*/794*/
749void luaC_separateudata (lua_State *L, int all) {795static void separatetobefnz (lua_State *L, int all) {
750 global_State *g = G(L);796 global_State *g = G(L);
751 GCObject **p = &g->finobj;797 GCObject **p = &g->finobj;
752 GCObject *curr;798 GCObject *curr;
@@ -842,14 +888,13 @@ static void callallpendingfinalizers (lua_State *L, int propagateerrors) { · 89 unmodified lines
842void luaC_freeallobjects (lua_State *L) {888void luaC_freeallobjects (lua_State *L) {
843 global_State *g = G(L);889 global_State *g = G(L);
844 int i;890 int i;
891 separatetobefnz(L, 1); /* separate all objects with finalizers */
892 lua_assert(g->finobj == NULL);
845 callallpendingfinalizers(L, 0);893 callallpendingfinalizers(L, 0);
846 /* following "white" makes all objects look dead */894 g->currentwhite = WHITEBITS; /* this "white" makes all objects look dead */
847 g->currentwhite = WHITEBITS;
848 g->gckind = KGC_NORMAL;895 g->gckind = KGC_NORMAL;
849 sweepwholelist(L, &g->finobj);896 sweepwholelist(L, &g->finobj); /* finalizers can create objs. in 'finobj' */
850 lua_assert(g->finobj == NULL);
851 sweepwholelist(L, &g->allgc);897 sweepwholelist(L, &g->allgc);
852 lua_assert(g->allgc == NULL);
853 for (i = 0; i < g->strt.size; i++) /* free all string lists */898 for (i = 0; i < g->strt.size; i++) /* free all string lists */
854 sweepwholelist(L, &g->strt.hash[i]);899 sweepwholelist(L, &g->strt.hash[i]);
855 lua_assert(g->strt.nuse == 0);900 lua_assert(g->strt.nuse == 0);
@@ -858,6 +903,7 @@ void luaC_freeallobjects (lua_State *L) { · 2 unmodified lines
858 903
859static void atomic (lua_State *L) {904static void atomic (lua_State *L) {
860 global_State *g = G(L);905 global_State *g = G(L);
906 GCObject *origweak, *origall;
861 lua_assert(!iswhite(obj2gco(g->mainthread)));907 lua_assert(!iswhite(obj2gco(g->mainthread)));
862 markobject(g, L); /* mark running thread */908 markobject(g, L); /* mark running thread */
863 /* registry and global metatables may be changed by API */909 /* registry and global metatables may be changed by API */
@@ -866,20 +912,24 @@ static void atomic (lua_State *L) { · 2 unmodified lines
866 /* remark occasional upvalues of (maybe) dead threads */912 /* remark occasional upvalues of (maybe) dead threads */
867 remarkupvals(g);913 remarkupvals(g);
868 /* traverse objects caught by write barrier and by 'remarkupvals' */914 /* traverse objects caught by write barrier and by 'remarkupvals' */
869 propagateall(g);915 retraversegrays(g);
870 traverselistofgrays(g, &g->weak); /* remark weak tables */
871 traverselistofgrays(g, &g->ephemeron); /* remark ephemeron tables */
872 traverselistofgrays(g, &g->grayagain); /* remark gray again */
873 convergeephemerons(g);916 convergeephemerons(g);
874 /* at this point, all strongly accessible objects are marked. */917 /* at this point, all strongly accessible objects are marked. */
875 luaC_separateudata(L, 0); /* separate userdata to be finalized */918 /* clear values from weak tables, before checking finalizers */
919 clearvalues(g->weak, NULL);
920 clearvalues(g->allweak, NULL);
921 origweak = g->weak; origall = g->allweak;
922 separatetobefnz(L, 0); /* separate objects to be finalized */
876 markbeingfnz(g); /* mark userdata that will be finalized */923 markbeingfnz(g); /* mark userdata that will be finalized */
877 propagateall(g); /* remark, to propagate `preserveness' */924 propagateall(g); /* remark, to propagate `preserveness' */
878 convergeephemerons(g);925 convergeephemerons(g);
879 /* remove collected objects from weak tables */926 /* at this point, all resurrected objects are marked. */
880 cleartable(g->weak);927 /* remove dead objects from weak tables */
881 cleartable(g->ephemeron);928 clearkeys(g->ephemeron, NULL); /* clear keys from all ephemeron tables */
882 cleartable(g->allweak);929 clearkeys(g->allweak, NULL); /* clear keys from all allweak tables */
930 /* clear values from resurrected weak tables */
931 clearvalues(g->weak, origweak);
932 clearvalues(g->allweak, origall);
883 g->sweepstrgc = 0; /* prepare to sweep strings */933 g->sweepstrgc = 0; /* prepare to sweep strings */
884 g->gcstate = GCSsweepstring;934 g->gcstate = GCSsweepstring;
885 g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */935 g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */
src/lgc.h+1−5
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lgc.h,v 2.50 2011/01/26 16:30:02 roberto Exp $2** $Id: lgc.h,v 2.52 2011/10/03 17:54:25 roberto Exp $
3** Garbage Collector3** Garbage Collector
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -63,9 +63,6 @@ · 57 unmodified lines
63#define l_setbit(x,b) setbits(x, bitmask(b))63#define l_setbit(x,b) setbits(x, bitmask(b))
64#define resetbit(x,b) resetbits(x, bitmask(b))64#define resetbit(x,b) resetbits(x, bitmask(b))
65#define testbit(x,b) testbits(x, bitmask(b))65#define testbit(x,b) testbits(x, bitmask(b))
66#define set2bits(x,b1,b2) setbits(x, (bit2mask(b1, b2)))
67#define reset2bits(x,b1,b2) resetbits(x, (bit2mask(b1, b2)))
68
69 66
70 67
71/* Layout for bit use in `marked' field: */68/* Layout for bit use in `marked' field: */
@@ -125,7 +122,6 @@ · 53 unmodified lines
125#define luaC_barrierproto(L,p,c) \122#define luaC_barrierproto(L,p,c) \
126 { if (isblack(obj2gco(p))) luaC_barrierproto_(L,p,c); }123 { if (isblack(obj2gco(p))) luaC_barrierproto_(L,p,c); }
127 124
128LUAI_FUNC void luaC_separateudata (lua_State *L, int all);
129LUAI_FUNC void luaC_freeallobjects (lua_State *L);125LUAI_FUNC void luaC_freeallobjects (lua_State *L);
130LUAI_FUNC void luaC_step (lua_State *L);126LUAI_FUNC void luaC_step (lua_State *L);
131LUAI_FUNC void luaC_forcestep (lua_State *L);127LUAI_FUNC void luaC_forcestep (lua_State *L);
src/liolib.c+74−30
@@ -1,10 +1,20 @@
1/*1/*
2** $Id: liolib.c,v 2.101 2011/06/27 19:42:31 roberto Exp $2** $Id: liolib.c,v 2.107 2011/11/14 16:55:35 roberto Exp $
3** Standard I/O (and system) library3** Standard I/O (and system) library
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
6 6
7 7
8/*
9** POSIX idiosyncrasy!
10** This definition must come before the inclusion of 'stdio.h'; it
11** should not affect non-POSIX systems
12*/
13#if !defined(_FILE_OFFSET_BITS)
14#define _FILE_OFFSET_BITS 64
15#endif
16
17
8#include <errno.h>18#include <errno.h>
9#include <stdio.h>19#include <stdio.h>
10#include <stdlib.h>20#include <stdlib.h>
@@ -21,9 +31,12 @@ · 10 unmodified lines
21 31
22 32
23/*33/*
24** lua_popen spawns a new process connected to the current one through34** {======================================================
25** the file streams.35** lua_popen spawns a new process connected to the current
36** one through the file streams.
37** =======================================================
26*/38*/
39
27#if !defined(lua_popen) /* { */40#if !defined(lua_popen) /* { */
28 41
29#if defined(LUA_USE_POPEN) /* { */42#if defined(LUA_USE_POPEN) /* { */
@@ -48,22 +61,48 @@ · 18 unmodified lines
48 61
49#endif /* } */62#endif /* } */
50 63
64/* }====================================================== */
65
66
67/*
68** {======================================================
69** lua_fseek/lua_ftell: configuration for longer offsets
70** =======================================================
71*/
72
73#if !defined(lua_fseek) /* { */
74
75#if defined(LUA_USE_POSIX)
76
77#define l_fseek(f,o,w) fseeko(f,o,w)
78#define l_ftell(f) ftello(f)
79#define l_seeknum off_t
80
81#elif defined(LUA_WIN)
82
83#define l_fseek(f,o,w) _fseeki64(f,o,w)
84#define l_ftell(f) _ftelli64(f)
85#define l_seeknum __int64
86
87#else
88
89#define l_fseek(f,o,w) fseek(f,o,w)
90#define l_ftell(f) ftell(f)
91#define l_seeknum long
92
93#endif
94
95#endif /* } */
96
97/* }====================================================== */
98
51 99
52#define IO_PREFIX "_IO_"100#define IO_PREFIX "_IO_"
53#define IO_INPUT (IO_PREFIX "input")101#define IO_INPUT (IO_PREFIX "input")
54#define IO_OUTPUT (IO_PREFIX "output")102#define IO_OUTPUT (IO_PREFIX "output")
55 103
56 104
57typedef struct LStream {105typedef luaL_Stream LStream;
58 FILE *f; /* stream */
59 lua_CFunction closef; /* to close stream (NULL for closed streams) */
60} LStream;
61
62
63static void fileerror (lua_State *L, int arg, const char *filename) {
64 lua_pushfstring(L, "%s: %s", filename, strerror(errno));
65 luaL_argerror(L, arg, lua_tostring(L, -1));
66}
67 106
68 107
69#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE))108#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE))
@@ -159,6 +198,14 @@ static LStream *newfile (lua_State *L) { · 89 unmodified lines
159}198}
160 199
161 200
201static void opencheck (lua_State *L, const char *fname, const char *mode) {
202 LStream *p = newfile(L);
203 p->f = fopen(fname, mode);
204 if (p->f == NULL)
205 luaL_error(L, "cannot open file " LUA_QS " (%s)", fname, strerror(errno));
206}
207
208
162static int io_open (lua_State *L) {209static int io_open (lua_State *L) {
163 const char *filename = luaL_checkstring(L, 1);210 const char *filename = luaL_checkstring(L, 1);
164 const char *mode = luaL_optstring(L, 2, "r");211 const char *mode = luaL_optstring(L, 2, "r");
@@ -169,7 +216,7 @@ static int io_open (lua_State *L) { · 4 unmodified lines
169 (mode[i] != '+' || ++i) && /* skip if char is '+' */216 (mode[i] != '+' || ++i) && /* skip if char is '+' */
170 (mode[i] != 'b' || ++i) && /* skip if char is 'b' */217 (mode[i] != 'b' || ++i) && /* skip if char is 'b' */
171 (mode[i] == '\0')))218 (mode[i] == '\0')))
172 return luaL_error(L, "invalid mode " LUA_QL("%s")219 return luaL_error(L, "invalid mode " LUA_QS
173 " (should match " LUA_QL("[rwa]%%+?b?") ")", mode);220 " (should match " LUA_QL("[rwa]%%+?b?") ")", mode);
174 p->f = fopen(filename, mode);221 p->f = fopen(filename, mode);
175 return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;222 return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
@@ -215,12 +262,8 @@ static FILE *getiofile (lua_State *L, const char *findex) { · 39 unmodified lines
215static int g_iofile (lua_State *L, const char *f, const char *mode) {262static int g_iofile (lua_State *L, const char *f, const char *mode) {
216 if (!lua_isnoneornil(L, 1)) {263 if (!lua_isnoneornil(L, 1)) {
217 const char *filename = lua_tostring(L, 1);264 const char *filename = lua_tostring(L, 1);
218 if (filename) {265 if (filename)
219 LStream *p = newfile(L);266 opencheck(L, filename, mode);
220 p->f = fopen(filename, mode);
221 if (p->f == NULL)
222 fileerror(L, 1, filename);
223 }
224 else {267 else {
225 tofile(L); /* check that it's a valid file handle */268 tofile(L); /* check that it's a valid file handle */
226 lua_pushvalue(L, 1);269 lua_pushvalue(L, 1);
@@ -277,10 +320,7 @@ static int io_lines (lua_State *L) { · 50 unmodified lines
277 }320 }
278 else { /* open a new file */321 else { /* open a new file */
279 const char *filename = luaL_checkstring(L, 1);322 const char *filename = luaL_checkstring(L, 1);
280 LStream *p = newfile(L);323 opencheck(L, filename, "r");
281 p->f = fopen(filename, "r");
282 if (p->f == NULL)
283 fileerror(L, 1, filename);
284 lua_replace(L, 1); /* put file at index 1 */324 lua_replace(L, 1); /* put file at index 1 */
285 toclose = 1; /* close it after iteration */325 toclose = 1; /* close it after iteration */
286 }326 }
@@ -444,9 +484,10 @@ static int io_readline (lua_State *L) { · 157 unmodified lines
444 if (!lua_isnil(L, -n)) /* read at least one value? */484 if (!lua_isnil(L, -n)) /* read at least one value? */
445 return n; /* return them */485 return n; /* return them */
446 else { /* first result is nil: EOF or error */486 else { /* first result is nil: EOF or error */
447 if (!lua_isnil(L, -1)) /* is there error information? */487 if (n > 1) { /* is there error information? */
448 return luaL_error(L, "%s", lua_tostring(L, -1)); /* error */488 /* 2nd result is error message */
449 /* else EOF */489 return luaL_error(L, "%s", lua_tostring(L, -n + 1));
490 }
450 if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */491 if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */
451 lua_settop(L, 0);492 lua_settop(L, 0);
452 lua_pushvalue(L, lua_upvalueindex(1));493 lua_pushvalue(L, lua_upvalueindex(1));
@@ -496,12 +537,15 @@ static int f_seek (lua_State *L) { · 43 unmodified lines
496 static const char *const modenames[] = {"set", "cur", "end", NULL};537 static const char *const modenames[] = {"set", "cur", "end", NULL};
497 FILE *f = tofile(L);538 FILE *f = tofile(L);
498 int op = luaL_checkoption(L, 2, "cur", modenames);539 int op = luaL_checkoption(L, 2, "cur", modenames);
499 long offset = luaL_optlong(L, 3, 0);540 lua_Number p3 = luaL_optnumber(L, 3, 0);
500 op = fseek(f, offset, mode[op]);541 l_seeknum offset = (l_seeknum)p3;
542 luaL_argcheck(L, (lua_Number)offset == p3, 3,
543 "not an integer in proper range");
544 op = l_fseek(f, offset, mode[op]);
501 if (op)545 if (op)
502 return luaL_fileresult(L, 0, NULL); /* error */546 return luaL_fileresult(L, 0, NULL); /* error */
503 else {547 else {
504 lua_pushinteger(L, ftell(f));548 lua_pushnumber(L, (lua_Number)l_ftell(f));
505 return 1;549 return 1;
506 }550 }
507}551}
src/llex.c+40−47
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: llex.c,v 2.53 2011/07/08 20:01:38 roberto Exp $2** $Id: llex.c,v 2.58 2011/08/15 19:41:58 roberto Exp $
3** Lexical Analyzer3** Lexical Analyzer
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -126,8 +126,10 @@ TString *luaX_newstring (LexState *ls, const char *str, size_t l) { · 120 unmodified lines
126 TValue *o; /* entry for `str' */126 TValue *o; /* entry for `str' */
127 TString *ts = luaS_newlstr(L, str, l); /* create new string */127 TString *ts = luaS_newlstr(L, str, l); /* create new string */
128 setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */128 setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */
129 o = luaH_setstr(L, ls->fs->h, ts);129 o = luaH_set(L, ls->fs->h, L->top - 1);
130 if (ttisnil(o)) {130 if (ttisnil(o)) { /* not in use yet? (see 'addK') */
131 /* boolean value does not need GC barrier;
132 table has no metatable, so it does not need to invalidate cache */
131 setbvalue(o, 1); /* t[string] = true */133 setbvalue(o, 1); /* t[string] = true */
132 luaC_checkGC(L);134 luaC_checkGC(L);
133 }135 }
@@ -297,39 +299,29 @@ static void escerror (LexState *ls, int *c, int n, const char *msg) { · 163 unmodified lines
297 299
298 300
299static int readhexaesc (LexState *ls) {301static int readhexaesc (LexState *ls) {
300 int c[3]; /* keep input for error message */302 int c[3], i; /* keep input for error message */
301 int i = 2; /* at least 'x?' will go to error message */303 int r = 0; /* result accumulator */
302 c[0] = 'x';304 c[0] = 'x'; /* for error message */
303 c[1] = next(ls); /* first hexa digit */305 for (i = 1; i < 3; i++) { /* read two hexa digits */
304 if (lisxdigit(c[1])) {306 c[i] = next(ls);
305 c[i++] = next(ls); /* second hexa digit */307 if (!lisxdigit(c[i]))
306 if (lisxdigit(c[2]))308 escerror(ls, c, i + 1, "hexadecimal digit expected");
307 return (luaO_hexavalue(c[1]) << 4) + luaO_hexavalue(c[2]);309 r = (r << 4) + luaO_hexavalue(c[i]);
308 /* else go through to error */
309 }310 }
310 escerror(ls, c, i, "hexadecimal digit expected");311 return r;
311 return 0; /* to avoid warnings */
312}312}
313 313
314 314
315static int readdecesc (LexState *ls) {315static int readdecesc (LexState *ls) {
316 int c[3], r;316 int c[3], i;
317 int i = 2; /* at least two chars will be read */317 int r = 0; /* result accumulator */
318 c[0] = ls->current; /* first char must be a digit */318 for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */
319 c[1] = next(ls); /* read second char */319 c[i] = ls->current;
320 r = c[0] - '0'; /* partial result */320 r = 10*r + c[i] - '0';
321 if (lisdigit(c[1])) {321 next(ls);
322 c[i++] = next(ls); /* read third char */
323 r = 10*r + c[1] - '0'; /* update result */
324 if (lisdigit(c[2])) {
325 r = 10*r + c[2] - '0'; /* update result */
326 if (r > UCHAR_MAX)
327 escerror(ls, c, i, "decimal escape too large");
328 return r;
329 }
330 }322 }
331 /* else, has read one character that was not a digit */323 if (r > UCHAR_MAX)
332 zungetc(ls->z); /* return it to input stream */324 escerror(ls, c, i, "decimal escape too large");
333 return r;325 return r;
334}326}
335 327
@@ -349,37 +341,38 @@ static void read_string (LexState *ls, int del, SemInfo *seminfo) { · 13 unmodified lines
349 int c; /* final character to be saved */341 int c; /* final character to be saved */
350 next(ls); /* do not save the `\' */342 next(ls); /* do not save the `\' */
351 switch (ls->current) {343 switch (ls->current) {
352 case 'a': c = '\a'; break;344 case 'a': c = '\a'; goto read_save;
353 case 'b': c = '\b'; break;345 case 'b': c = '\b'; goto read_save;
354 case 'f': c = '\f'; break;346 case 'f': c = '\f'; goto read_save;
355 case 'n': c = '\n'; break;347 case 'n': c = '\n'; goto read_save;
356 case 'r': c = '\r'; break;348 case 'r': c = '\r'; goto read_save;
357 case 't': c = '\t'; break;349 case 't': c = '\t'; goto read_save;
358 case 'v': c = '\v'; break;350 case 'v': c = '\v'; goto read_save;
359 case 'x': c = readhexaesc(ls); break;351 case 'x': c = readhexaesc(ls); goto read_save;
360 case '\n':352 case '\n': case '\r':
361 case '\r': save(ls, '\n'); inclinenumber(ls); continue;353 inclinenumber(ls); c = '\n'; goto only_save;
362 case '\\': case '\"': case '\'': c = ls->current; break;354 case '\\': case '\"': case '\'':
363 case EOZ: continue; /* will raise an error next loop */355 c = ls->current; goto read_save;
356 case EOZ: goto no_save; /* will raise an error next loop */
364 case 'z': { /* zap following span of spaces */357 case 'z': { /* zap following span of spaces */
365 next(ls); /* skip the 'z' */358 next(ls); /* skip the 'z' */
366 while (lisspace(ls->current)) {359 while (lisspace(ls->current)) {
367 if (currIsNewline(ls)) inclinenumber(ls);360 if (currIsNewline(ls)) inclinenumber(ls);
368 else next(ls);361 else next(ls);
369 }362 }
370 continue; /* do not save 'c' */363 goto no_save;
371 }364 }
372 default: {365 default: {
373 if (!lisdigit(ls->current))366 if (!lisdigit(ls->current))
374 escerror(ls, &ls->current, 1, "invalid escape sequence");367 escerror(ls, &ls->current, 1, "invalid escape sequence");
375 /* digital escape \ddd */368 /* digital escape \ddd */
376 c = readdecesc(ls);369 c = readdecesc(ls);
377 break;370 goto only_save;
378 }371 }
379 }372 }
380 next(ls);373 read_save: next(ls); /* read next character */
381 save(ls, c);374 only_save: save(ls, c); /* save 'c' */
382 break;375 no_save: break;
383 }376 }
384 default:377 default:
385 save_and_next(ls);378 save_and_next(ls);
src/llimits.h+16−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: llimits.h,v 1.90 2011/07/02 15:57:25 roberto Exp $2** $Id: llimits.h,v 1.93 2011/10/07 20:45:19 roberto Exp $
3** Limits, basic types, and some other `installation-dependent' definitions3** Limits, basic types, and some other `installation-dependent' definitions
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -30,7 +30,6 @@ typedef unsigned char lu_byte; · 24 unmodified lines
30#define MAX_SIZET ((size_t)(~(size_t)0)-2)30#define MAX_SIZET ((size_t)(~(size_t)0)-2)
31 31
32#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2)32#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)-2)
33#define MIN_LMEM ((l_mem)~((~(lu_mem)0)>>1))
34 33
35 34
36#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */35#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */
@@ -62,9 +61,9 @@ typedef LUAI_UACNUMBER l_uacNumber; · 25 unmodified lines
62/* to avoid problems with conditions too long */61/* to avoid problems with conditions too long */
63#define lua_longassert(c) { if (!(c)) lua_assert(0); }62#define lua_longassert(c) { if (!(c)) lua_assert(0); }
64#else63#else
65#define lua_assert(c) /* empty */64#define lua_assert(c) ((void)0)
66#define check_exp(c,e) (e)65#define check_exp(c,e) (e)
67#define lua_longassert(c) /* empty */66#define lua_longassert(c) ((void)0)
68#endif67#endif
69 68
70/*69/*
@@ -97,6 +96,19 @@ typedef LUAI_UACNUMBER l_uacNumber; · 26 unmodified lines
97#define cast_uchar(i) cast(unsigned char, (i))96#define cast_uchar(i) cast(unsigned char, (i))
98 97
99 98
99/*
100** non-return type
101*/
102#if defined(__GNUC__)
103#define l_noret void __attribute__((noreturn))
104#elif defined(_MSC_VER)
105#define l_noret void __declspec(noreturn)
106#else
107#define l_noret void
108#endif
109
110
111
100/*112/*
101** maximum depth for nested C calls and syntactical nested non-terminals113** maximum depth for nested C calls and syntactical nested non-terminals
102** in a program. (Value must fit in an unsigned short int.)114** in a program. (Value must fit in an unsigned short int.)
src/lmem.c+2−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lmem.c,v 1.81 2010/12/20 19:40:07 roberto Exp $2** $Id: lmem.c,v 1.82 2011/09/20 19:25:23 roberto Exp $
3** Interface to Memory Manager3** Interface to Memory Manager
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -106,7 +106,7 @@ void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { · 100 unmodified lines
106 if ((total % 200) == 0) {106 if ((total % 200) == 0) {
107 if (f == NULL) f = fopen(TRACEMEM, "w");107 if (f == NULL) f = fopen(TRACEMEM, "w");
108 fprintf(f, "%lu %u %d %d\n", total,108 fprintf(f, "%lu %u %d %d\n", total,
109 g->totalbytes, g->GCdebt, g->gcstate * 1000);109 gettotalbytes(g), g->GCdebt, g->gcstate * 10000);
110 }110 }
111 }111 }
112#endif112#endif
src/loadlib.c+71−33
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: loadlib.c,v 1.100 2011/07/05 12:49:35 roberto Exp $2** $Id: loadlib.c,v 1.104 2011/11/10 11:42:58 roberto Exp $
3** Dynamic library loader for Lua3** Dynamic library loader for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5**5**
@@ -9,6 +9,14 @@ · 3 unmodified lines
9*/9*/
10 10
11 11
12/*
13** if needed, includes windows header before everything else
14*/
15#if defined(LUA_DL_DLL)
16#include <windows.h>
17#endif
18
19
12#include <stdlib.h>20#include <stdlib.h>
13#include <string.h>21#include <string.h>
14 22
@@ -62,6 +70,20 @@ · 47 unmodified lines
62#endif70#endif
63 71
64 72
73/*
74** LUA_CSUBSEP is the character that replaces dots in submodule names
75** when searching for a C loader.
76** LUA_LSUBSEP is the character that replaces dots in submodule names
77** when searching for a Lua loader.
78*/
79#if !defined(LUA_CSUBSEP)
80#define LUA_CSUBSEP LUA_DIRSEP
81#endif
82
83#if !defined(LUA_LSUBSEP)
84#define LUA_LSUBSEP LUA_DIRSEP
85#endif
86
65 87
66/* prefix for open functions in C libraries */88/* prefix for open functions in C libraries */
67#define LUA_POF "luaopen_"89#define LUA_POF "luaopen_"
@@ -133,8 +155,6 @@ static lua_CFunction ll_sym (lua_State *L, void *lib, const char *sym) { · 65 unmodified lines
133** =======================================================================155** =======================================================================
134*/156*/
135 157
136#include <windows.h>
137
138#undef setprogdir158#undef setprogdir
139 159
140/*160/*
@@ -322,10 +342,12 @@ static const char *pushnexttemplate (lua_State *L, const char *path) { · 181 unmodified lines
322 342
323static const char *searchpath (lua_State *L, const char *name,343static const char *searchpath (lua_State *L, const char *name,
324 const char *path,344 const char *path,
325 const char *sep) {345 const char *sep,
346 const char *dirsep) {
347 luaL_Buffer msg; /* to build error message */
348 luaL_buffinit(L, &msg);
326 if (*sep != '\0') /* non-empty separator? */349 if (*sep != '\0') /* non-empty separator? */
327 name = luaL_gsub(L, name, sep, LUA_DIRSEP); /* replace it by proper one */350 name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */
328 lua_pushliteral(L, ""); /* error accumulator */
329 while ((path = pushnexttemplate(L, path)) != NULL) {351 while ((path = pushnexttemplate(L, path)) != NULL) {
330 const char *filename = luaL_gsub(L, lua_tostring(L, -1),352 const char *filename = luaL_gsub(L, lua_tostring(L, -1),
331 LUA_PATH_MARK, name);353 LUA_PATH_MARK, name);
@@ -334,8 +356,9 @@ static const char *searchpath (lua_State *L, const char *name, · 2 unmodified lines
334 return filename; /* return that file name */356 return filename; /* return that file name */
335 lua_pushfstring(L, "\n\tno file " LUA_QS, filename);357 lua_pushfstring(L, "\n\tno file " LUA_QS, filename);
336 lua_remove(L, -2); /* remove file name */358 lua_remove(L, -2); /* remove file name */
337 lua_concat(L, 2); /* add entry to possible error message */359 luaL_addvalue(&msg); /* concatenate error msg. entry */
338 }360 }
361 luaL_pushresult(&msg); /* create error message */
339 return NULL; /* not found */362 return NULL; /* not found */
340}363}
341 364
@@ -343,7 +366,8 @@ static const char *searchpath (lua_State *L, const char *name, · 1 unmodified line
343static int ll_searchpath (lua_State *L) {366static int ll_searchpath (lua_State *L) {
344 const char *f = searchpath(L, luaL_checkstring(L, 1),367 const char *f = searchpath(L, luaL_checkstring(L, 1),
345 luaL_checkstring(L, 2),368 luaL_checkstring(L, 2),
346 luaL_optstring(L, 3, "."));369 luaL_optstring(L, 3, "."),
370 luaL_optstring(L, 4, LUA_DIRSEP));
347 if (f != NULL) return 1;371 if (f != NULL) return 1;
348 else { /* error message is on top of the stack */372 else { /* error message is on top of the stack */
349 lua_pushnil(L);373 lua_pushnil(L);
@@ -354,13 +378,14 @@ static int ll_searchpath (lua_State *L) { · 4 unmodified lines
354 378
355 379
356static const char *findfile (lua_State *L, const char *name,380static const char *findfile (lua_State *L, const char *name,
357 const char *pname) {381 const char *pname,
382 const char *dirsep) {
358 const char *path;383 const char *path;
359 lua_getfield(L, lua_upvalueindex(1), pname);384 lua_getfield(L, lua_upvalueindex(1), pname);
360 path = lua_tostring(L, -1);385 path = lua_tostring(L, -1);
361 if (path == NULL)386 if (path == NULL)
362 luaL_error(L, LUA_QL("package.%s") " must be a string", pname);387 luaL_error(L, LUA_QL("package.%s") " must be a string", pname);
363 return searchpath(L, name, path, ".");388 return searchpath(L, name, path, ".", dirsep);
364}389}
365 390
366 391
@@ -379,7 +404,7 @@ static int checkload (lua_State *L, int stat, const char *filename) { · 12 unmodified lines
379static int searcher_Lua (lua_State *L) {404static int searcher_Lua (lua_State *L) {
380 const char *filename;405 const char *filename;
381 const char *name = luaL_checkstring(L, 1);406 const char *name = luaL_checkstring(L, 1);
382 filename = findfile(L, name, "path");407 filename = findfile(L, name, "path", LUA_LSUBSEP);
383 if (filename == NULL) return 1; /* module not found in this path */408 if (filename == NULL) return 1; /* module not found in this path */
384 return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename);409 return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename);
385}410}
@@ -405,7 +430,7 @@ static int loadfunc (lua_State *L, const char *filename, const char *modname) { · 19 unmodified lines
405 430
406static int searcher_C (lua_State *L) {431static int searcher_C (lua_State *L) {
407 const char *name = luaL_checkstring(L, 1);432 const char *name = luaL_checkstring(L, 1);
408 const char *filename = findfile(L, name, "cpath");433 const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP);
409 if (filename == NULL) return 1; /* module not found in this path */434 if (filename == NULL) return 1; /* module not found in this path */
410 return checkload(L, (loadfunc(L, filename, name) == 0), filename);435 return checkload(L, (loadfunc(L, filename, name) == 0), filename);
411}436}
@@ -418,7 +443,7 @@ static int searcher_Croot (lua_State *L) { · 6 unmodified lines
418 int stat;443 int stat;
419 if (p == NULL) return 0; /* is root */444 if (p == NULL) return 0; /* is root */
420 lua_pushlstring(L, name, p - name);445 lua_pushlstring(L, name, p - name);
421 filename = findfile(L, lua_tostring(L, -1), "cpath");446 filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP);
422 if (filename == NULL) return 1; /* root not found */447 if (filename == NULL) return 1; /* root not found */
423 if ((stat = loadfunc(L, filename, name)) != 0) {448 if ((stat = loadfunc(L, filename, name)) != 0) {
424 if (stat != ERRFUNC)449 if (stat != ERRFUNC)
@@ -444,35 +469,46 @@ static int searcher_preload (lua_State *L) { · 19 unmodified lines
444}469}
445 470
446 471
447static int ll_require (lua_State *L) {472static void findloader (lua_State *L, const char *name) {
448 const char *name = luaL_checkstring(L, 1);
449 int i;473 int i;
450 lua_settop(L, 1); /* _LOADED table will be at index 2 */474 luaL_Buffer msg; /* to build error message */
451 lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");475 luaL_buffinit(L, &msg);
452 lua_getfield(L, 2, name);476 lua_getfield(L, lua_upvalueindex(1), "searchers"); /* will be at index 3 */
453 if (lua_toboolean(L, -1)) /* is it there? */477 if (!lua_istable(L, 3))
454 return 1; /* package is already loaded */
455 /* else must load it; iterate over available seachers to find a loader */
456 lua_getfield(L, lua_upvalueindex(1), "searchers");
457 if (!lua_istable(L, -1))
458 luaL_error(L, LUA_QL("package.searchers") " must be a table");478 luaL_error(L, LUA_QL("package.searchers") " must be a table");
459 lua_pushliteral(L, ""); /* error message accumulator */479 /* iterate over available seachers to find a loader */
460 for (i=1; ; i++) {480 for (i = 1; ; i++) {
461 lua_rawgeti(L, -2, i); /* get a seacher */481 lua_rawgeti(L, 3, i); /* get a seacher */
462 if (lua_isnil(L, -1)) /* no more searchers? */482 if (lua_isnil(L, -1)) { /* no more searchers? */
483 lua_pop(L, 1); /* remove nil */
484 luaL_pushresult(&msg); /* create error message */
463 luaL_error(L, "module " LUA_QS " not found:%s",485 luaL_error(L, "module " LUA_QS " not found:%s",
464 name, lua_tostring(L, -2));486 name, lua_tostring(L, -1));
487 }
465 lua_pushstring(L, name);488 lua_pushstring(L, name);
466 lua_call(L, 1, 2); /* call it */489 lua_call(L, 1, 2); /* call it */
467 if (lua_isfunction(L, -2)) /* did it find a loader? */490 if (lua_isfunction(L, -2)) /* did it find a loader? */
468 break; /* module loader found */491 return; /* module loader found */
469 else if (lua_isstring(L, -2)) { /* searcher returned error message? */492 else if (lua_isstring(L, -2)) { /* searcher returned error message? */
470 lua_pop(L, 1); /* remove extra return */493 lua_pop(L, 1); /* remove extra return */
471 lua_concat(L, 2); /* accumulate error message */494 luaL_addvalue(&msg); /* concatenate error message */
472 }495 }
473 else496 else
474 lua_pop(L, 2); /* remove both returns */497 lua_pop(L, 2); /* remove both returns */
475 }498 }
499}
500
501
502static int ll_require (lua_State *L) {
503 const char *name = luaL_checkstring(L, 1);
504 lua_settop(L, 1); /* _LOADED table will be at index 2 */
505 lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
506 lua_getfield(L, 2, name); /* _LOADED[name] */
507 if (lua_toboolean(L, -1)) /* is it there? */
508 return 1; /* package is already loaded */
509 /* else must load package */
510 lua_pop(L, 1); /* remove 'getfield' result */
511 findloader(L, name);
476 lua_pushstring(L, name); /* pass name as argument to module loader */512 lua_pushstring(L, name); /* pass name as argument to module loader */
477 lua_insert(L, -2); /* name is 1st argument (before search data) */513 lua_insert(L, -2); /* name is 1st argument (before search data) */
478 lua_call(L, 2, 1); /* run loader to load module */514 lua_call(L, 2, 1); /* run loader to load module */
@@ -516,9 +552,11 @@ static void set_env (lua_State *L) { · 37 unmodified lines
516static void dooptions (lua_State *L, int n) {552static void dooptions (lua_State *L, int n) {
517 int i;553 int i;
518 for (i = 2; i <= n; i++) {554 for (i = 2; i <= n; i++) {
519 lua_pushvalue(L, i); /* get option (a function) */555 if (lua_isfunction(L, i)) { /* avoid 'calling' extra info. */
520 lua_pushvalue(L, -2); /* module */556 lua_pushvalue(L, i); /* get option (a function) */
521 lua_call(L, 1, 0);557 lua_pushvalue(L, -2); /* module */
558 lua_call(L, 1, 0);
559 }
522 }560 }
523}561}
524 562
src/lobject.c+6−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lobject.c,v 2.52 2011/06/24 12:25:02 roberto Exp $2** $Id: lobject.c,v 2.53 2011/07/27 12:13:08 roberto Exp $
3** Some generic functions over Lua objects3** Some generic functions over Lua objects
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -103,8 +103,8 @@ static int isneg (const char **s) { · 97 unmodified lines
103 103
104 104
105static lua_Number readhexa (const char **s, lua_Number r, int *count) {105static lua_Number readhexa (const char **s, lua_Number r, int *count) {
106 while (lisxdigit(cast_uchar(**s))) { /* read integer part */106 for (; lisxdigit(cast_uchar(**s)); (*s)++) { /* read integer part */
107 r = (r * 16.0) + cast_num(luaO_hexavalue(cast_uchar(*(*s)++)));107 r = (r * 16.0) + cast_num(luaO_hexavalue(cast_uchar(**s)));
108 (*count)++;108 (*count)++;
109 }109 }
110 return r;110 return r;
@@ -157,7 +157,9 @@ static lua_Number lua_strx2number (const char *s, char **endptr) { · 46 unmodified lines
157 157
158int luaO_str2d (const char *s, size_t len, lua_Number *result) {158int luaO_str2d (const char *s, size_t len, lua_Number *result) {
159 char *endptr;159 char *endptr;
160 if (strpbrk(s, "xX")) /* hexa? */160 if (strpbrk(s, "nN")) /* reject 'inf' and 'nan' */
161 return 0;
162 else if (strpbrk(s, "xX")) /* hexa? */
161 *result = lua_strx2number(s, &endptr);163 *result = lua_strx2number(s, &endptr);
162 else164 else
163 *result = lua_str2number(s, &endptr);165 *result = lua_str2number(s, &endptr);
src/lobject.h+46−22
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lobject.h,v 2.61 2011/07/04 20:29:02 roberto Exp $2** $Id: lobject.h,v 2.64 2011/10/31 17:48:22 roberto Exp $
3** Type definitions for Lua objects3** Type definitions for Lua objects
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -132,7 +132,7 @@ typedef struct lua_TValue TValue; · 126 unmodified lines
132#define ttislcf(o) checktag((o), LUA_TLCF)132#define ttislcf(o) checktag((o), LUA_TLCF)
133#define ttisuserdata(o) checktag((o), ctb(LUA_TUSERDATA))133#define ttisuserdata(o) checktag((o), ctb(LUA_TUSERDATA))
134#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD))134#define ttisthread(o) checktag((o), ctb(LUA_TTHREAD))
135#define ttisdeadkey(o) checktag((o), ctb(LUA_TDEADKEY))135#define ttisdeadkey(o) checktag((o), LUA_TDEADKEY)
136 136
137#define ttisequal(o1,o2) (rttype(o1) == rttype(o2))137#define ttisequal(o1,o2) (rttype(o1) == rttype(o2))
138 138
@@ -151,6 +151,8 @@ typedef struct lua_TValue TValue; · 12 unmodified lines
151#define hvalue(o) check_exp(ttistable(o), &val_(o).gc->h)151#define hvalue(o) check_exp(ttistable(o), &val_(o).gc->h)
152#define bvalue(o) check_exp(ttisboolean(o), val_(o).b)152#define bvalue(o) check_exp(ttisboolean(o), val_(o).b)
153#define thvalue(o) check_exp(ttisthread(o), &val_(o).gc->th)153#define thvalue(o) check_exp(ttisthread(o), &val_(o).gc->th)
154/* a dead value may get the 'gc' field, but cannot access its contents */
155#define deadvalue(o) check_exp(ttisdeadkey(o), cast(void *, val_(o).gc))
154 156
155#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))157#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0))
156 158
@@ -224,7 +226,7 @@ typedef struct lua_TValue TValue; · 67 unmodified lines
224 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TPROTO)); \226 val_(io).gc=cast(GCObject *, (x)); settt_(io, ctb(LUA_TPROTO)); \
225 checkliveness(G(L),io); }227 checkliveness(G(L),io); }
226 228
227#define setdeadvalue(obj) settt_(obj, ctb(LUA_TDEADKEY))229#define setdeadvalue(obj) settt_(obj, LUA_TDEADKEY)
228 230
229 231
230 232
@@ -262,51 +264,73 @@ typedef struct lua_TValue TValue; · 31 unmodified lines
262** =======================================================264** =======================================================
263*/265*/
264 266
265#if defined(LUA_NANTRICKLE) || defined(LUA_NANTRICKBE)267#if defined(LUA_NANTRICK) \
268 || defined(LUA_NANTRICK_LE) \
269 || defined(LUA_NANTRICK_BE)
266 270
267/*271/*
268** numbers are represented in the 'd_' field. All other values have the272** numbers are represented in the 'd_' field. All other values have the
269** value (NNMARK | tag) in 'tt_'. A number with such pattern would be273** value (NNMARK | tag) in 'tt__'. A number with such pattern would be
270** a "signaled NaN", which is never generated by regular operations by274** a "signaled NaN", which is never generated by regular operations by
271** the CPU (nor by 'strtod')275** the CPU (nor by 'strtod')
272*/276*/
273#if !defined(NNMARK)277#if !defined(NNMARK)
274#define NNMARK 0x7FF7A500278#define NNMARK 0x7FF7A500
279#define NNMASK 0x7FFFFF00
275#endif280#endif
276 281
277#undef TValuefields282#undef TValuefields
278#undef NILCONSTANT283#undef NILCONSTANT
279#if defined(LUA_NANTRICKLE)284
285#if defined(LUA_NANTRICK_LE)
286
280/* little endian */287/* little endian */
281#define TValuefields \288#define TValuefields \
282 union { struct { Value v_; int tt_; } i; double d_; } u289 union { struct { Value v__; int tt__; } i; double d__; } u
283#define NILCONSTANT {{{NULL}, tag2tt(LUA_TNIL)}}290#define NILCONSTANT {{{NULL}, tag2tt(LUA_TNIL)}}
284#else291/* field-access macros */
292#define v_(o) ((o)->u.i.v__)
293#define d_(o) ((o)->u.d__)
294#define tt_(o) ((o)->u.i.tt__)
295
296#elif defined(LUA_NANTRICK_BE)
297
285/* big endian */298/* big endian */
286#define TValuefields \299#define TValuefields \
287 union { struct { int tt_; Value v_; } i; double d_; } u300 union { struct { int tt__; Value v__; } i; double d__; } u
288#define NILCONSTANT {{tag2tt(LUA_TNIL), {NULL}}}301#define NILCONSTANT {{tag2tt(LUA_TNIL), {NULL}}}
302/* field-access macros */
303#define v_(o) ((o)->u.i.v__)
304#define d_(o) ((o)->u.d__)
305#define tt_(o) ((o)->u.i.tt__)
306
307#elif !defined(TValuefields)
308#error option 'LUA_NANTRICK' needs declaration for 'TValuefields'
309
289#endif310#endif
290 311
312
313/* correspondence with standard representation */
314#undef val_
315#define val_(o) v_(o)
316#undef num_
317#define num_(o) d_(o)
318
319
291#undef numfield320#undef numfield
292#define numfield /* no such field; numbers are the entire struct */321#define numfield /* no such field; numbers are the entire struct */
293 322
294/* basic check to distinguish numbers from non-numbers */323/* basic check to distinguish numbers from non-numbers */
295#undef ttisnumber324#undef ttisnumber
296#define ttisnumber(o) (((o)->u.i.tt_ & 0x7fffff00) != NNMARK)325#define ttisnumber(o) ((tt_(o) & NNMASK) != NNMARK)
297 326
298#define tag2tt(t) (NNMARK | (t))327#define tag2tt(t) (NNMARK | (t))
299 328
300#undef val_
301#define val_(o) ((o)->u.i.v_)
302#undef num_
303#define num_(o) ((o)->u.d_)
304
305#undef rttype329#undef rttype
306#define rttype(o) (ttisnumber(o) ? LUA_TNUMBER : (o)->u.i.tt_ & 0xff)330#define rttype(o) (ttisnumber(o) ? LUA_TNUMBER : tt_(o) & 0xff)
307 331
308#undef settt_332#undef settt_
309#define settt_(o,t) ((o)->u.i.tt_=tag2tt(t))333#define settt_(o,t) (tt_(o) = tag2tt(t))
310 334
311#undef setnvalue335#undef setnvalue
312#define setnvalue(obj,x) \336#define setnvalue(obj,x) \
@@ -324,11 +348,11 @@ typedef struct lua_TValue TValue; · 11 unmodified lines
324*/348*/
325 349
326#undef checktag350#undef checktag
327#define checktag(o,t) ((o)->u.i.tt_ == tag2tt(t))351#define checktag(o,t) (tt_(o) == tag2tt(t))
328 352
329#undef ttisequal353#undef ttisequal
330#define ttisequal(o1,o2) \354#define ttisequal(o1,o2) \
331 (ttisnumber(o1) ? ttisnumber(o2) : ((o1)->u.i.tt_ == (o2)->u.i.tt_))355 (ttisnumber(o1) ? ttisnumber(o2) : (tt_(o1) == tt_(o2)))
332 356
333 357
334 358
@@ -435,11 +459,11 @@ typedef struct Proto { · 100 unmodified lines
435 TValue *k; /* constants used by the function */459 TValue *k; /* constants used by the function */
436 Instruction *code;460 Instruction *code;
437 struct Proto **p; /* functions defined inside the function */461 struct Proto **p; /* functions defined inside the function */
438 int *lineinfo; /* map from opcodes to source lines */462 int *lineinfo; /* map from opcodes to source lines (debug information) */
439 LocVar *locvars; /* information about local variables */463 LocVar *locvars; /* information about local variables (debug information) */
440 Upvaldesc *upvalues; /* upvalue information */464 Upvaldesc *upvalues; /* upvalue information */
441 union Closure *cache; /* last created closure with this prototype */465 union Closure *cache; /* last created closure with this prototype */
442 TString *source;466 TString *source; /* used for debug information */
443 int sizeupvalues; /* size of 'upvalues' */467 int sizeupvalues; /* size of 'upvalues' */
444 int sizek; /* size of `k' */468 int sizek; /* size of `k' */
445 int sizecode;469 int sizecode;
src/lopcodes.h+2−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lopcodes.h,v 1.141 2011/04/19 16:22:13 roberto Exp $2** $Id: lopcodes.h,v 1.142 2011/07/15 12:50:29 roberto Exp $
3** Opcodes for Lua virtual machine3** Opcodes for Lua virtual machine
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -196,7 +196,7 @@ OP_LEN,/* A B R(A) := length of R(B) */ · 190 unmodified lines
196 196
197OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */197OP_CONCAT,/* A B C R(A) := R(B).. ... ..R(C) */
198 198
199OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A) + 1 */ 199OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A) + 1 */
200OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */200OP_EQ,/* A B C if ((RK(B) == RK(C)) ~= A) then pc++ */
201OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */201OP_LT,/* A B C if ((RK(B) < RK(C)) ~= A) then pc++ */
202OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */202OP_LE,/* A B C if ((RK(B) <= RK(C)) ~= A) then pc++ */
src/lparser.c+90−70
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lparser.c,v 2.113 2011/07/02 15:58:14 roberto Exp $2** $Id: lparser.c,v 2.122 2011/10/31 17:46:04 roberto Exp $
3** Lua Parser3** Lua Parser
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -41,8 +41,8 @@ · 35 unmodified lines
41*/41*/
42typedef struct BlockCnt {42typedef struct BlockCnt {
43 struct BlockCnt *previous; /* chain */43 struct BlockCnt *previous; /* chain */
44 int firstlabel; /* index of first label in this block */44 short firstlabel; /* index of first label in this block */
45 int firstgoto; /* index of first pending goto in this block */45 short firstgoto; /* index of first pending goto in this block */
46 lu_byte nactvar; /* # active locals outside the block */46 lu_byte nactvar; /* # active locals outside the block */
47 lu_byte upval; /* true if some variable in the block is an upvalue */47 lu_byte upval; /* true if some variable in the block is an upvalue */
48 lu_byte isloop; /* true if `block' is a loop */48 lu_byte isloop; /* true if `block' is a loop */
@@ -81,13 +81,14 @@ static void error_expected (LexState *ls, int token) { · 32 unmodified lines
81 81
82 82
83static void errorlimit (FuncState *fs, int limit, const char *what) {83static void errorlimit (FuncState *fs, int limit, const char *what) {
84 lua_State *L = fs->ls->L;
84 const char *msg;85 const char *msg;
85 int line = fs->f->linedefined;86 int line = fs->f->linedefined;
86 const char *where = (line == 0)87 const char *where = (line == 0)
87 ? "main function"88 ? "main function"
88 : luaO_pushfstring(fs->L, "function at line %d", line);89 : luaO_pushfstring(L, "function at line %d", line);
89 msg = luaO_pushfstring(fs->L, "too many %s (limit is %d) in %s",90 msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s",
90 what, limit, where);91 what, limit, where);
91 luaX_syntaxerror(fs->ls, msg);92 luaX_syntaxerror(fs->ls, msg);
92}93}
93 94
@@ -182,7 +183,7 @@ static void new_localvar (LexState *ls, TString *name) { · 88 unmodified lines
182 MAXVARS, "local variables");183 MAXVARS, "local variables");
183 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1,184 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1,
184 dyd->actvar.size, Vardesc, MAX_INT, "local variables");185 dyd->actvar.size, Vardesc, MAX_INT, "local variables");
185 dyd->actvar.arr[dyd->actvar.n++].idx = cast(unsigned short, reg);186 dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg);
186}187}
187 188
188 189
@@ -231,13 +232,13 @@ static int newupvalue (FuncState *fs, TString *name, expdesc *v) { · 42 unmodified lines
231 Proto *f = fs->f;232 Proto *f = fs->f;
232 int oldsize = f->sizeupvalues;233 int oldsize = f->sizeupvalues;
233 checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues");234 checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues");
234 luaM_growvector(fs->L, f->upvalues, fs->nups, f->sizeupvalues,235 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,
235 Upvaldesc, MAXUPVAL, "upvalues");236 Upvaldesc, MAXUPVAL, "upvalues");
236 while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL;237 while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL;
237 f->upvalues[fs->nups].instack = (v->k == VLOCAL);238 f->upvalues[fs->nups].instack = (v->k == VLOCAL);
238 f->upvalues[fs->nups].idx = cast_byte(v->u.info);239 f->upvalues[fs->nups].idx = cast_byte(v->u.info);
239 f->upvalues[fs->nups].name = name;240 f->upvalues[fs->nups].name = name;
240 luaC_objbarrier(fs->L, f, name);241 luaC_objbarrier(fs->ls->L, f, name);
241 return fs->nups++;242 return fs->nups++;
242}243}
243 244
@@ -327,13 +328,13 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { · 83 unmodified lines
327 328
328 329
329static void enterlevel (LexState *ls) {330static void enterlevel (LexState *ls) {
330 global_State *g = G(ls->L);331 lua_State *L = ls->L;
331 ++g->nCcalls;332 ++L->nCcalls;
332 checklimit(ls->fs, g->nCcalls, LUAI_MAXCCALLS, "syntax levels");333 checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "syntax levels");
333}334}
334 335
335 336
336#define leavelevel(ls) (G((ls)->L)->nCcalls--)337#define leavelevel(ls) ((ls)->L->nCcalls--)
337 338
338 339
339static void closegoto (LexState *ls, int g, Labeldesc *label) {340static void closegoto (LexState *ls, int g, Labeldesc *label) {
@@ -343,9 +344,10 @@ static void closegoto (LexState *ls, int g, Labeldesc *label) { · 3 unmodified lines
343 Labeldesc *gt = &gl->arr[g];344 Labeldesc *gt = &gl->arr[g];
344 lua_assert(eqstr(gt->name, label->name));345 lua_assert(eqstr(gt->name, label->name));
345 if (gt->nactvar < label->nactvar) {346 if (gt->nactvar < label->nactvar) {
347 TString *vname = getlocvar(fs, gt->nactvar)->varname;
346 const char *msg = luaO_pushfstring(ls->L,348 const char *msg = luaO_pushfstring(ls->L,
347 "<goto %s> at line %d jumps into the scope of local " LUA_QS,349 "<goto %s> at line %d jumps into the scope of local " LUA_QS,
348 getstr(gt->name), gt->line, getstr(getlocvar(fs, gt->nactvar)->varname));350 getstr(gt->name), gt->line, getstr(vname));
349 semerror(ls, msg);351 semerror(ls, msg);
350 }352 }
351 luaK_patchlist(fs, gt->pc, label->pc);353 luaK_patchlist(fs, gt->pc, label->pc);
@@ -382,7 +384,8 @@ static int findlabel (LexState *ls, int g) { · 30 unmodified lines
382static int newlabelentry (LexState *ls, Labellist *l, TString *name,384static int newlabelentry (LexState *ls, Labellist *l, TString *name,
383 int line, int pc) {385 int line, int pc) {
384 int n = l->n;386 int n = l->n;
385 luaM_growvector(ls->L, l->arr, n, l->size, Labeldesc, MAX_INT, "labels");387 luaM_growvector(ls->L, l->arr, n, l->size,
388 Labeldesc, SHRT_MAX, "labels/gotos");
386 l->arr[n].name = name;389 l->arr[n].name = name;
387 l->arr[n].line = line;390 l->arr[n].line = line;
388 l->arr[n].nactvar = ls->fs->nactvar;391 l->arr[n].nactvar = ls->fs->nactvar;
@@ -418,7 +421,7 @@ static void movegotosout (FuncState *fs, BlockCnt *bl) { · 29 unmodified lines
418 int i = bl->firstgoto;421 int i = bl->firstgoto;
419 Labellist *gl = &fs->ls->dyd->gt;422 Labellist *gl = &fs->ls->dyd->gt;
420 /* correct pending gotos to current block and try to close it423 /* correct pending gotos to current block and try to close it
421 with visible labels */ 424 with visible labels */
422 while (i < gl->n) {425 while (i < gl->n) {
423 Labeldesc *gt = &gl->arr[i];426 Labeldesc *gt = &gl->arr[i];
424 if (gt->nactvar > bl->nactvar) {427 if (gt->nactvar > bl->nactvar) {
@@ -514,7 +517,6 @@ static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { · 89 unmodified lines
514 Proto *f;517 Proto *f;
515 fs->prev = ls->fs; /* linked list of funcstates */518 fs->prev = ls->fs; /* linked list of funcstates */
516 fs->ls = ls;519 fs->ls = ls;
517 fs->L = L;
518 ls->fs = fs;520 ls->fs = fs;
519 fs->pc = 0;521 fs->pc = 0;
520 fs->lasttarget = 0;522 fs->lasttarget = 0;
@@ -1039,7 +1041,7 @@ static const struct { · 518 unmodified lines
1039** subexpr -> (simpleexp | unop subexpr) { binop subexpr }1041** subexpr -> (simpleexp | unop subexpr) { binop subexpr }
1040** where `binop' is any binary operator with a priority higher than `limit'1042** where `binop' is any binary operator with a priority higher than `limit'
1041*/1043*/
1042static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) {1044static BinOpr subexpr (LexState *ls, expdesc *v, int limit) {
1043 BinOpr op;1045 BinOpr op;
1044 UnOpr uop;1046 UnOpr uop;
1045 enterlevel(ls);1047 enterlevel(ls);
@@ -1105,31 +1107,34 @@ struct LHS_assign { · 59 unmodified lines
1105 1107
1106 1108
1107/*1109/*
1108** check whether, in an assignment to a local variable, the local variable1110** check whether, in an assignment to an upvalue/local variable, the
1109** is needed in a previous assignment (to a table). If so, save original1111** upvalue/local variable is begin used in a previous assignment to a
1110** local value in a safe place and use this safe copy in the previous1112** table. If so, save original upvalue/local value in a safe place and
1111** assignment.1113** use this safe copy in the previous assignment.
1112*/1114*/
1113static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {1115static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {
1114 FuncState *fs = ls->fs;1116 FuncState *fs = ls->fs;
1115 int extra = fs->freereg; /* eventual position to save local variable */1117 int extra = fs->freereg; /* eventual position to save local variable */
1116 int conflict = 0;1118 int conflict = 0;
1117 for (; lh; lh = lh->prev) {1119 for (; lh; lh = lh->prev) { /* check all previous assignments */
1118 /* conflict in table 't'? */1120 if (lh->v.k == VINDEXED) { /* assigning to a table? */
1119 if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) {1121 /* table is the upvalue/local being assigned now? */
1120 conflict = 1;1122 if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) {
1121 lh->v.u.ind.vt = VLOCAL;1123 conflict = 1;
1122 lh->v.u.ind.t = extra; /* previous assignment will use safe copy */1124 lh->v.u.ind.vt = VLOCAL;
1123 }1125 lh->v.u.ind.t = extra; /* previous assignment will use safe copy */
1124 /* conflict in index 'idx'? */1126 }
1125 if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) {1127 /* index is the local being assigned? (index cannot be upvalue) */
1126 conflict = 1;1128 if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) {
1127 lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */1129 conflict = 1;
1130 lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */
1131 }
1128 }1132 }
1129 }1133 }
1130 if (conflict) {1134 if (conflict) {
1135 /* copy upvalue/local value to a temporary (in position 'extra') */
1131 OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;1136 OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
1132 luaK_codeABC(fs, op, fs->freereg, v->u.info, 0); /* make copy */1137 luaK_codeABC(fs, op, extra, v->u.info, 0);
1133 luaK_reserveregs(fs, 1);1138 luaK_reserveregs(fs, 1);
1134 }1139 }
1135}1140}
@@ -1144,7 +1149,7 @@ static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { · 8 unmodified lines
1144 primaryexp(ls, &nv.v);1149 primaryexp(ls, &nv.v);
1145 if (nv.v.k != VINDEXED)1150 if (nv.v.k != VINDEXED)
1146 check_conflict(ls, lh, &nv.v);1151 check_conflict(ls, lh, &nv.v);
1147 checklimit(ls->fs, nvars, LUAI_MAXCCALLS - G(ls->L)->nCcalls,1152 checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls,
1148 "variable names");1153 "variable names");
1149 assignment(ls, &nv, nvars+1);1154 assignment(ls, &nv, nvars+1);
1150 }1155 }
@@ -1178,10 +1183,18 @@ static int cond (LexState *ls) { · 27 unmodified lines
1178}1183}
1179 1184
1180 1185
1181static void gotostat (LexState *ls, TString *label, int line) {1186static void gotostat (LexState *ls, int pc) {
1182 /* create new entry for this goto */1187 int line = ls->linenumber;
1183 int g = newlabelentry(ls, &ls->dyd->gt, label, line, luaK_jump(ls->fs));1188 TString *label;
1184 findlabel(ls, g);1189 int g;
1190 if (testnext(ls, TK_GOTO))
1191 label = str_checkname(ls);
1192 else {
1193 luaX_next(ls); /* skip break */
1194 label = luaS_new(ls->L, "break");
1195 }
1196 g = newlabelentry(ls, &ls->dyd->gt, label, line, pc);
1197 findlabel(ls, g); /* close it if label already defined */
1185}1198}
1186 1199
1187 1200
@@ -1190,7 +1203,7 @@ static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) { · 2 unmodified lines
1190 int i;1203 int i;
1191 for (i = fs->bl->firstlabel; i < ll->n; i++) {1204 for (i = fs->bl->firstlabel; i < ll->n; i++) {
1192 if (eqstr(label, ll->arr[i].name)) {1205 if (eqstr(label, ll->arr[i].name)) {
1193 const char *msg = luaO_pushfstring(fs->ls->L, 1206 const char *msg = luaO_pushfstring(fs->ls->L,
1194 "label " LUA_QS " already defined on line %d",1207 "label " LUA_QS " already defined on line %d",
1195 getstr(label), ll->arr[i].line);1208 getstr(label), ll->arr[i].line);
1196 semerror(fs->ls, msg);1209 semerror(fs->ls, msg);
@@ -1360,38 +1373,51 @@ static void forstat (LexState *ls, int line) { · 163 unmodified lines
1360}1373}
1361 1374
1362 1375
1363static int test_then_block (LexState *ls) {1376static void test_then_block (LexState *ls, int *escapelist) {
1364 /* test_then_block -> [IF | ELSEIF] cond THEN block */1377 /* test_then_block -> [IF | ELSEIF] cond THEN block */
1365 int condexit;1378 BlockCnt bl;
1379 FuncState *fs = ls->fs;
1380 expdesc v;
1381 int jf; /* instruction to skip 'then' code (if condition is false) */
1366 luaX_next(ls); /* skip IF or ELSEIF */1382 luaX_next(ls); /* skip IF or ELSEIF */
1367 condexit = cond(ls);1383 expr(ls, &v); /* read condition */
1368 checknext(ls, TK_THEN);1384 checknext(ls, TK_THEN);
1369 block(ls); /* `then' part */1385 if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) {
1370 return condexit;1386 luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */
1387 enterblock(fs, &bl, 0); /* must enter block before 'goto' */
1388 gotostat(ls, v.t); /* handle goto/break */
1389 if (block_follow(ls, 0)) { /* 'goto' is the entire block? */
1390 leaveblock(fs);
1391 return; /* and that is it */
1392 }
1393 else /* must skip over 'then' part if condition is false */
1394 jf = luaK_jump(fs);
1395 }
1396 else { /* regular case (not goto/break) */
1397 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */
1398 enterblock(fs, &bl, 0);
1399 jf = v.f;
1400 }
1401 statlist(ls); /* `then' part */
1402 leaveblock(fs);
1403 if (ls->t.token == TK_ELSE ||
1404 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */
1405 luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */
1406 luaK_patchtohere(fs, jf);
1371}1407}
1372 1408
1373 1409
1374static void ifstat (LexState *ls, int line) {1410static void ifstat (LexState *ls, int line) {
1375 /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */1411 /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
1376 FuncState *fs = ls->fs;1412 FuncState *fs = ls->fs;
1377 int flist;1413 int escapelist = NO_JUMP; /* exit list for finished parts */
1378 int escapelist = NO_JUMP;1414 test_then_block(ls, &escapelist); /* IF cond THEN block */
1379 flist = test_then_block(ls); /* IF cond THEN block */1415 while (ls->t.token == TK_ELSEIF)
1380 while (ls->t.token == TK_ELSEIF) {1416 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */
1381 luaK_concat(fs, &escapelist, luaK_jump(fs));1417 if (testnext(ls, TK_ELSE))
1382 luaK_patchtohere(fs, flist);
1383 flist = test_then_block(ls); /* ELSEIF cond THEN block */
1384 }
1385 if (ls->t.token == TK_ELSE) {
1386 luaK_concat(fs, &escapelist, luaK_jump(fs));
1387 luaK_patchtohere(fs, flist);
1388 luaX_next(ls); /* skip ELSE (after patch, for correct line info) */
1389 block(ls); /* `else' part */1418 block(ls); /* `else' part */
1390 }
1391 else
1392 luaK_concat(fs, &escapelist, flist);
1393 luaK_patchtohere(fs, escapelist);
1394 check_match(ls, TK_END, TK_IF, line);1419 check_match(ls, TK_END, TK_IF, line);
1420 luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */
1395}1421}
1396 1422
1397 1423
@@ -1551,15 +1577,9 @@ static void statement (LexState *ls) { · 153 unmodified lines
1551 retstat(ls);1577 retstat(ls);
1552 break;1578 break;
1553 }1579 }
1554 case TK_BREAK: { /* stat -> breakstat */1580 case TK_BREAK: /* stat -> breakstat */
1555 luaX_next(ls); /* skip BREAK */
1556 /* code it as "goto 'break'" */
1557 gotostat(ls, luaS_new(ls->L, "break"), line);
1558 break;
1559 }
1560 case TK_GOTO: { /* stat -> 'goto' NAME */1581 case TK_GOTO: { /* stat -> 'goto' NAME */
1561 luaX_next(ls); /* skip GOTO */1582 gotostat(ls, luaK_jump(ls->fs));
1562 gotostat(ls, str_checkname(ls), line);
1563 break;1583 break;
1564 }1584 }
1565 default: { /* stat -> func | assignment */1585 default: { /* stat -> func | assignment */
@@ -1595,8 +1615,8 @@ Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, · 29 unmodified lines
1595 close_func(&lexstate);1615 close_func(&lexstate);
1596 L->top--; /* pop name */1616 L->top--; /* pop name */
1597 lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);1617 lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
1598 return funcstate.f;
1599 /* all scopes should be correctly finished */1618 /* all scopes should be correctly finished */
1600 lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);1619 lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);
1620 return funcstate.f;
1601}1621}
1602 1622
src/lparser.h+6−7
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lparser.h,v 1.68 2011/02/23 13:13:10 roberto Exp $2** $Id: lparser.h,v 1.69 2011/07/27 18:09:01 roberto Exp $
3** Lua Parser3** Lua Parser
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -55,7 +55,7 @@ typedef struct expdesc { · 49 unmodified lines
55 55
56/* description of active local variable */56/* description of active local variable */
57typedef struct Vardesc {57typedef struct Vardesc {
58 unsigned short idx; /* variable index in stack */58 short idx; /* variable index in stack */
59} Vardesc;59} Vardesc;
60 60
61 61
@@ -98,18 +98,17 @@ typedef struct FuncState { · 36 unmodified lines
98 Table *h; /* table to find (and reuse) elements in `k' */98 Table *h; /* table to find (and reuse) elements in `k' */
99 struct FuncState *prev; /* enclosing function */99 struct FuncState *prev; /* enclosing function */
100 struct LexState *ls; /* lexical state */100 struct LexState *ls; /* lexical state */
101 struct lua_State *L; /* copy of the Lua state */
102 struct BlockCnt *bl; /* chain of current blocks */101 struct BlockCnt *bl; /* chain of current blocks */
103 int pc; /* next position to code (equivalent to `ncode') */102 int pc; /* next position to code (equivalent to `ncode') */
104 int lasttarget; /* `pc' of last `jump target' */103 int lasttarget; /* 'label' of last 'jump label' */
105 int jpc; /* list of pending jumps to `pc' */104 int jpc; /* list of pending jumps to `pc' */
106 int freereg; /* first free register */
107 int nk; /* number of elements in `k' */105 int nk; /* number of elements in `k' */
108 int np; /* number of elements in `p' */106 int np; /* number of elements in `p' */
109 int firstlocal; /* index of first local var of this function */107 int firstlocal; /* index of first local var (in Dyndata array) */
110 short nlocvars; /* number of elements in `locvars' */108 short nlocvars; /* number of elements in 'f->locvars' */
111 lu_byte nactvar; /* number of active local variables */109 lu_byte nactvar; /* number of active local variables */
112 lu_byte nups; /* number of upvalues */110 lu_byte nups; /* number of upvalues */
111 lu_byte freereg; /* first free register */
113} FuncState;112} FuncState;
114 113
115 114
src/lstate.c+5−8
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstate.c,v 2.89 2010/12/20 19:40:07 roberto Exp $2** $Id: lstate.c,v 2.92 2011/10/03 17:54:25 roberto Exp $
3** Global State3** Global State
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -136,10 +136,10 @@ static void init_registry (lua_State *L, global_State *g) { · 130 unmodified lines
136 luaH_resize(L, registry, LUA_RIDX_LAST, 0);136 luaH_resize(L, registry, LUA_RIDX_LAST, 0);
137 /* registry[LUA_RIDX_MAINTHREAD] = L */137 /* registry[LUA_RIDX_MAINTHREAD] = L */
138 setthvalue(L, &mt, L);138 setthvalue(L, &mt, L);
139 setobj2t(L, luaH_setint(L, registry, LUA_RIDX_MAINTHREAD), &mt);139 luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &mt);
140 /* registry[LUA_RIDX_GLOBALS] = table of globals */140 /* registry[LUA_RIDX_GLOBALS] = table of globals */
141 sethvalue(L, &mt, luaH_new(L));141 sethvalue(L, &mt, luaH_new(L));
142 setobj2t(L, luaH_setint(L, registry, LUA_RIDX_GLOBALS), &mt);142 luaH_setint(L, registry, LUA_RIDX_GLOBALS, &mt);
143}143}
144 144
145 145
@@ -171,6 +171,7 @@ static void preinit_state (lua_State *L, global_State *g) { · 25 unmodified lines
171 L->ci = NULL;171 L->ci = NULL;
172 L->stacksize = 0;172 L->stacksize = 0;
173 L->errorJmp = NULL;173 L->errorJmp = NULL;
174 L->nCcalls = 0;
174 L->hook = NULL;175 L->hook = NULL;
175 L->hookmask = 0;176 L->hookmask = 0;
176 L->basehookcount = 0;177 L->basehookcount = 0;
@@ -191,7 +192,7 @@ static void close_state (lua_State *L) { · 14 unmodified lines
191 luaZ_freebuffer(L, &g->buff);192 luaZ_freebuffer(L, &g->buff);
192 freestack(L);193 freestack(L);
193 lua_assert(gettotalbytes(g) == sizeof(LG));194 lua_assert(gettotalbytes(g) == sizeof(LG));
194 (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0);195 (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */
195}196}
196 197
197 198
@@ -237,7 +238,6 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { · 39 unmodified lines
237 g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT);238 g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT);
238 L->marked = luaC_white(g);239 L->marked = luaC_white(g);
239 g->gckind = KGC_NORMAL;240 g->gckind = KGC_NORMAL;
240 g->nCcalls = 0;
241 preinit_state(L, g);241 preinit_state(L, g);
242 g->frealloc = f;242 g->frealloc = f;
243 g->ud = ud;243 g->ud = ud;
@@ -279,9 +279,6 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { · 35 unmodified lines
279LUA_API void lua_close (lua_State *L) {279LUA_API void lua_close (lua_State *L) {
280 L = G(L)->mainthread; /* only the main thread can be closed */280 L = G(L)->mainthread; /* only the main thread can be closed */
281 lua_lock(L);281 lua_lock(L);
282 luaF_close(L, L->stack); /* close all upvalues for this thread */
283 luaC_separateudata(L, 1); /* separate all udata with GC metamethods */
284 lua_assert(L->next == NULL);
285 luai_userstateclose(L);282 luai_userstateclose(L);
286 close_state(L);283 close_state(L);
287}284}
src/lstate.h+2−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstate.h,v 2.72 2011/06/02 19:31:40 roberto Exp $2** $Id: lstate.h,v 2.74 2011/09/30 12:45:07 roberto Exp $
3** Global State3** Global State
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -47,8 +47,6 @@ struct lua_longjmp; /* defined in ldo.c */ · 41 unmodified lines
47#define EXTRA_STACK 547#define EXTRA_STACK 5
48 48
49 49
50#define BASIC_CI_SIZE 8
51
52#define BASIC_STACK_SIZE (2*LUA_MINSTACK)50#define BASIC_STACK_SIZE (2*LUA_MINSTACK)
53 51
54 52
@@ -118,7 +116,6 @@ typedef struct global_State { · 63 unmodified lines
118 lu_mem lastmajormem; /* memory in use after last major collection */116 lu_mem lastmajormem; /* memory in use after last major collection */
119 stringtable strt; /* hash table for strings */117 stringtable strt; /* hash table for strings */
120 TValue l_registry;118 TValue l_registry;
121 unsigned short nCcalls; /* number of nested C calls */
122 lu_byte currentwhite;119 lu_byte currentwhite;
123 lu_byte gcstate; /* state of garbage collector */120 lu_byte gcstate; /* state of garbage collector */
124 lu_byte gckind; /* kind of GC running */121 lu_byte gckind; /* kind of GC running */
@@ -161,6 +158,7 @@ struct lua_State { · 36 unmodified lines
161 StkId stack; /* stack base */158 StkId stack; /* stack base */
162 int stacksize;159 int stacksize;
163 unsigned short nny; /* number of non-yieldable calls in stack */160 unsigned short nny; /* number of non-yieldable calls in stack */
161 unsigned short nCcalls; /* number of nested C calls */
164 lu_byte hookmask;162 lu_byte hookmask;
165 lu_byte allowhook;163 lu_byte allowhook;
166 int basehookcount;164 int basehookcount;
src/lstrlib.c+15−6
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lstrlib.c,v 1.170 2011/06/28 17:13:52 roberto Exp $2** $Id: lstrlib.c,v 1.172 2011/10/25 12:01:20 roberto Exp $
3** Standard library for string operations and pattern-matching3** Standard library for string operations and pattern-matching
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -138,7 +138,7 @@ static int str_byte (lua_State *L) { · 132 unmodified lines
138 if (pose > l) pose = l;138 if (pose > l) pose = l;
139 if (posi > pose) return 0; /* empty interval; return no values */139 if (posi > pose) return 0; /* empty interval; return no values */
140 n = (int)(pose - posi + 1);140 n = (int)(pose - posi + 1);
141 if (posi + n <= pose) /* overflow? */141 if (posi + n <= pose) /* (size_t -> int) overflow? */
142 return luaL_error(L, "string slice too long");142 return luaL_error(L, "string slice too long");
143 luaL_checkstack(L, n, "string slice too long");143 luaL_checkstack(L, n, "string slice too long");
144 for (i=0; i<n; i++)144 for (i=0; i<n; i++)
@@ -154,7 +154,7 @@ static int str_char (lua_State *L) { · 9 unmodified lines
154 char *p = luaL_buffinitsize(L, &b, n);154 char *p = luaL_buffinitsize(L, &b, n);
155 for (i=1; i<=n; i++) {155 for (i=1; i<=n; i++) {
156 int c = luaL_checkint(L, i);156 int c = luaL_checkint(L, i);
157 luaL_argcheck(L, uchar(c) == c, i, "invalid value");157 luaL_argcheck(L, uchar(c) == c, i, "value out of range");
158 p[i - 1] = uchar(c);158 p[i - 1] = uchar(c);
159 }159 }
160 luaL_pushresultsize(&b, n);160 luaL_pushresultsize(&b, n);
@@ -865,11 +865,20 @@ static int str_format (lua_State *L) { · 704 unmodified lines
865 nb = sprintf(buff, form, luaL_checkint(L, arg));865 nb = sprintf(buff, form, luaL_checkint(L, arg));
866 break;866 break;
867 }867 }
868 case 'd': case 'i':868 case 'd': case 'i': {
869 lua_Number n = luaL_checknumber(L, arg);
870 LUA_INTFRM_T r = (LUA_INTFRM_T)n;
871 luaL_argcheck(L, (lua_Number)r == n, arg,
872 "not an integer in proper range");
873 addlenmod(form, LUA_INTFRMLEN);
874 nb = sprintf(buff, form, r);
875 break;
876 }
869 case 'o': case 'u': case 'x': case 'X': {877 case 'o': case 'u': case 'x': case 'X': {
870 lua_Number n = luaL_checknumber(L, arg);878 lua_Number n = luaL_checknumber(L, arg);
871 LUA_INTFRM_T r = (n < 0) ? (LUA_INTFRM_T)n :879 unsigned LUA_INTFRM_T r = (unsigned LUA_INTFRM_T)n;
872 (LUA_INTFRM_T)(unsigned LUA_INTFRM_T)n;880 luaL_argcheck(L, (lua_Number)r == n, arg,
881 "not a non-negative integer in proper range");
873 addlenmod(form, LUA_INTFRMLEN);882 addlenmod(form, LUA_INTFRMLEN);
874 nb = sprintf(buff, form, r);883 nb = sprintf(buff, form, r);
875 break;884 break;
src/ltable.c+25−36
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ltable.c,v 2.60 2011/06/16 14:14:31 roberto Exp $2** $Id: ltable.c,v 2.65 2011/09/30 12:45:27 roberto Exp $
3** Lua tables (hash)3** Lua tables (hash)
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -64,13 +64,6 @@ · 58 unmodified lines
64#define hashpointer(t,p) hashmod(t, IntPoint(p))64#define hashpointer(t,p) hashmod(t, IntPoint(p))
65 65
66 66
67/*
68** number of ints inside a lua_Number
69*/
70#define numints cast_int(sizeof(lua_Number)/sizeof(int))
71
72
73
74#define dummynode (&dummynode_)67#define dummynode (&dummynode_)
75 68
76#define isdummy(n) ((n) == dummynode)69#define isdummy(n) ((n) == dummynode)
@@ -152,7 +145,7 @@ static int findindex (lua_State *L, Table *t, StkId key) { · 75 unmodified lines
152 /* key may be dead already, but it is ok to use it in `next' */145 /* key may be dead already, but it is ok to use it in `next' */
153 if (luaV_rawequalobj(gkey(n), key) ||146 if (luaV_rawequalobj(gkey(n), key) ||
154 (ttisdeadkey(gkey(n)) && iscollectable(key) &&147 (ttisdeadkey(gkey(n)) && iscollectable(key) &&
155 gcvalue(gkey(n)) == gcvalue(key))) {148 deadvalue(gkey(n)) == gcvalue(key))) {
156 i = cast_int(n - gnode(t, 0)); /* key index in hash table */149 i = cast_int(n - gnode(t, 0)); /* key index in hash table */
157 /* hash elements are numbered after array ones */150 /* hash elements are numbered after array ones */
158 return i + t->sizearray;151 return i + t->sizearray;
@@ -314,7 +307,7 @@ void luaH_resize (lua_State *L, Table *t, int nasize, int nhsize) { · 155 unmodified lines
314 /* re-insert elements from vanishing slice */307 /* re-insert elements from vanishing slice */
315 for (i=nasize; i<oldasize; i++) {308 for (i=nasize; i<oldasize; i++) {
316 if (!ttisnil(&t->array[i]))309 if (!ttisnil(&t->array[i]))
317 setobjt2t(L, luaH_setint(L, t, i+1), &t->array[i]);310 luaH_setint(L, t, i + 1, &t->array[i]);
318 }311 }
319 /* shrink array */312 /* shrink array */
320 luaM_reallocvector(L, t->array, oldasize, nasize, TValue);313 luaM_reallocvector(L, t->array, oldasize, nasize, TValue);
@@ -322,8 +315,11 @@ void luaH_resize (lua_State *L, Table *t, int nasize, int nhsize) { · 1 unmodified line
322 /* re-insert elements from hash part */315 /* re-insert elements from hash part */
323 for (i = twoto(oldhsize) - 1; i >= 0; i--) {316 for (i = twoto(oldhsize) - 1; i >= 0; i--) {
324 Node *old = nold+i;317 Node *old = nold+i;
325 if (!ttisnil(gval(old)))318 if (!ttisnil(gval(old))) {
319 /* doesn't need barrier/invalidate cache, as entry was
320 already present in the table */
326 setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old));321 setobjt2t(L, luaH_set(L, t, gkey(old)), gval(old));
322 }
327 }323 }
328 if (!isdummy(nold))324 if (!isdummy(nold))
329 luaM_freearray(L, nold, twoto(oldhsize)); /* free old array */325 luaM_freearray(L, nold, twoto(oldhsize)); /* free old array */
@@ -398,14 +394,19 @@ static Node *getfreepos (Table *t) { · 68 unmodified lines
398** put new key in its main position; otherwise (colliding node is in its main394** put new key in its main position; otherwise (colliding node is in its main
399** position), new key goes to an empty position.395** position), new key goes to an empty position.
400*/396*/
401static TValue *newkey (lua_State *L, Table *t, const TValue *key) {397TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) {
402 Node *mp = mainposition(t, key);398 Node *mp;
399 if (ttisnil(key)) luaG_runerror(L, "table index is nil");
400 else if (ttisnumber(key) && luai_numisnan(L, nvalue(key)))
401 luaG_runerror(L, "table index is NaN");
402 mp = mainposition(t, key);
403 if (!ttisnil(gval(mp)) || isdummy(mp)) { /* main position is taken? */403 if (!ttisnil(gval(mp)) || isdummy(mp)) { /* main position is taken? */
404 Node *othern;404 Node *othern;
405 Node *n = getfreepos(t); /* get a free place */405 Node *n = getfreepos(t); /* get a free place */
406 if (n == NULL) { /* cannot find a free place? */406 if (n == NULL) { /* cannot find a free place? */
407 rehash(L, t, key); /* grow table */407 rehash(L, t, key); /* grow table */
408 return luaH_set(L, t, key); /* re-insert key into grown table */408 /* whatever called 'newkey' take care of TM cache and GC barrier */
409 return luaH_set(L, t, key); /* insert key into grown table */
409 }410 }
410 lua_assert(!isdummy(n));411 lua_assert(!isdummy(n));
411 othern = mainposition(t, gkey(mp));412 othern = mainposition(t, gkey(mp));
@@ -493,41 +494,29 @@ const TValue *luaH_get (Table *t, const TValue *key) { · 81 unmodified lines
493}494}
494 495
495 496
497/*
498** beware: when using this function you probably need to check a GC
499** barrier and invalidate the TM cache.
500*/
496TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {501TValue *luaH_set (lua_State *L, Table *t, const TValue *key) {
497 const TValue *p = luaH_get(t, key);502 const TValue *p = luaH_get(t, key);
498 t->flags = 0;
499 if (p != luaO_nilobject)503 if (p != luaO_nilobject)
500 return cast(TValue *, p);504 return cast(TValue *, p);
501 else {505 else return luaH_newkey(L, t, key);
502 if (ttisnil(key)) luaG_runerror(L, "table index is nil");
503 else if (ttisnumber(key) && luai_numisnan(L, nvalue(key)))
504 luaG_runerror(L, "table index is NaN");
505 return newkey(L, t, key);
506 }
507}506}
508 507
509 508
510TValue *luaH_setint (lua_State *L, Table *t, int key) {509void luaH_setint (lua_State *L, Table *t, int key, TValue *value) {
511 const TValue *p = luaH_getint(t, key);510 const TValue *p = luaH_getint(t, key);
511 TValue *cell;
512 if (p != luaO_nilobject)512 if (p != luaO_nilobject)
513 return cast(TValue *, p);513 cell = cast(TValue *, p);
514 else {514 else {
515 TValue k;515 TValue k;
516 setnvalue(&k, cast_num(key));516 setnvalue(&k, cast_num(key));
517 return newkey(L, t, &k);517 cell = luaH_newkey(L, t, &k);
518 }
519}
520
521
522TValue *luaH_setstr (lua_State *L, Table *t, TString *key) {
523 const TValue *p = luaH_getstr(t, key);
524 if (p != luaO_nilobject)
525 return cast(TValue *, p);
526 else {
527 TValue k;
528 setsvalue(L, &k, key);
529 return newkey(L, t, &k);
530 }518 }
519 setobj2t(L, cell, value);
531}520}
532 521
533 522
src/ltable.h+5−3
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ltable.h,v 2.14 2010/06/25 12:18:10 roberto Exp $2** $Id: ltable.h,v 2.16 2011/08/17 20:26:47 roberto Exp $
3** Lua tables (hash)3** Lua tables (hash)
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -15,12 +15,14 @@ · 9 unmodified lines
15#define gval(n) (&(n)->i_val)15#define gval(n) (&(n)->i_val)
16#define gnext(n) ((n)->i_key.nk.next)16#define gnext(n) ((n)->i_key.nk.next)
17 17
18#define invalidateTMcache(t) ((t)->flags = 0)
19
18 20
19LUAI_FUNC const TValue *luaH_getint (Table *t, int key);21LUAI_FUNC const TValue *luaH_getint (Table *t, int key);
20LUAI_FUNC TValue *luaH_setint (lua_State *L, Table *t, int key);22LUAI_FUNC void luaH_setint (lua_State *L, Table *t, int key, TValue *value);
21LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);23LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
22LUAI_FUNC TValue *luaH_setstr (lua_State *L, Table *t, TString *key);
23LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);24LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
25LUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key);
24LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);26LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key);
25LUAI_FUNC Table *luaH_new (lua_State *L);27LUAI_FUNC Table *luaH_new (lua_State *L);
26LUAI_FUNC void luaH_resize (lua_State *L, Table *t, int nasize, int nhsize);28LUAI_FUNC void luaH_resize (lua_State *L, Table *t, int nasize, int nhsize);
src/ltablib.c+2−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: ltablib.c,v 1.61 2011/07/05 12:49:35 roberto Exp $2** $Id: ltablib.c,v 1.62 2011/09/30 12:45:45 roberto Exp $
3** Library for Table Manipulation3** Library for Table Manipulation
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -86,7 +86,7 @@ static void addfield (lua_State *L, luaL_Buffer *b, int i) { · 80 unmodified lines
86 if (!lua_isstring(L, -1))86 if (!lua_isstring(L, -1))
87 luaL_error(L, "invalid value (%s) at index %d in table for "87 luaL_error(L, "invalid value (%s) at index %d in table for "
88 LUA_QL("concat"), luaL_typename(L, -1), i);88 LUA_QL("concat"), luaL_typename(L, -1), i);
89 luaL_addvalue(b);89 luaL_addvalue(b);
90}90}
91 91
92 92
src/lua.c+39−12
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lua.c,v 1.200 2011/06/16 14:30:58 roberto Exp $2** $Id: lua.c,v 1.202 2011/08/17 20:19:52 roberto Exp $
3** Lua stand-alone interpreter3** Lua stand-alone interpreter
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -118,6 +118,7 @@ static void print_usage (const char *badoption) { · 112 unmodified lines
118 " -i enter interactive mode after executing " LUA_QL("script") "\n"118 " -i enter interactive mode after executing " LUA_QL("script") "\n"
119 " -l name require library " LUA_QL("name") "\n"119 " -l name require library " LUA_QL("name") "\n"
120 " -v show version information\n"120 " -v show version information\n"
121 " -E ignore environment variables\n"
121 " -- stop handling options\n"122 " -- stop handling options\n"
122 " - stop handling options and execute stdin\n"123 " - stop handling options and execute stdin\n"
123 ,124 ,
@@ -348,7 +349,16 @@ static int handle_script (lua_State *L, char **argv, int n) { · 224 unmodified lines
348#define noextrachars(x) {if ((x)[2] != '\0') return -1;}349#define noextrachars(x) {if ((x)[2] != '\0') return -1;}
349 350
350 351
351static int collectargs (char **argv, int *pi, int *pv, int *pe) {352/* indices of various argument indicators in array args */
353#define has_i 0 /* -i */
354#define has_v 1 /* -v */
355#define has_e 2 /* -e */
356#define has_E 3 /* -E */
357
358#define num_has 4 /* number of 'has_*' */
359
360
361static int collectargs (char **argv, int *args) {
352 int i;362 int i;
353 for (i = 1; argv[i] != NULL; i++) {363 for (i = 1; argv[i] != NULL; i++) {
354 if (argv[i][0] != '-') /* not an option? */364 if (argv[i][0] != '-') /* not an option? */
@@ -359,15 +369,18 @@ static int collectargs (char **argv, int *pi, int *pv, int *pe) { · 4 unmodified lines
359 return (argv[i+1] != NULL ? i+1 : 0);369 return (argv[i+1] != NULL ? i+1 : 0);
360 case '\0':370 case '\0':
361 return i;371 return i;
372 case 'E':
373 args[has_E] = 1;
374 break;
362 case 'i':375 case 'i':
363 noextrachars(argv[i]);376 noextrachars(argv[i]);
364 *pi = 1; /* go through */377 args[has_i] = 1; /* go through */
365 case 'v':378 case 'v':
366 noextrachars(argv[i]);379 noextrachars(argv[i]);
367 *pv = 1;380 args[has_v] = 1;
368 break;381 break;
369 case 'e':382 case 'e':
370 *pe = 1; /* go through */383 args[has_e] = 1; /* go through */
371 case 'l': /* both options need an argument */384 case 'l': /* both options need an argument */
372 if (argv[i][2] == '\0') { /* no concatenated argument? */385 if (argv[i][2] == '\0') { /* no concatenated argument? */
373 i++; /* try next 'argv' */386 i++; /* try next 'argv' */
@@ -426,32 +439,46 @@ static int handle_luainit (lua_State *L) { · 52 unmodified lines
426}439}
427 440
428 441
442static void resetpaths (lua_State *L) {
443 lua_getglobal(L, "package");
444 if (!lua_istable(L, -1)) /* no module 'package'? */
445 return; /* nothing to be done */
446 lua_pushliteral(L, LUA_PATH_DEFAULT);
447 lua_setfield(L, -2, "path"); /* package.path = default */
448 lua_pushliteral(L, LUA_CPATH_DEFAULT);
449 lua_setfield(L, -2, "cpath"); /* package.cpath = default */
450 lua_pop(L, 1); /* remove 'package' */
451}
452
453
429static int pmain (lua_State *L) {454static int pmain (lua_State *L) {
430 int argc = (int)lua_tointeger(L, 1);455 int argc = (int)lua_tointeger(L, 1);
431 char **argv = (char **)lua_touserdata(L, 2);456 char **argv = (char **)lua_touserdata(L, 2);
432 int script;457 int script;
433 int has_i = 0, has_v = 0, has_e = 0;458 int args[num_has];
459 args[has_i] = args[has_v] = args[has_e] = args[has_E] = 0;
434 if (argv[0] && argv[0][0]) progname = argv[0];460 if (argv[0] && argv[0][0]) progname = argv[0];
435 script = collectargs(argv, &has_i, &has_v, &has_e);461 script = collectargs(argv, args);
436 if (script < 0) { /* invalid arg? */462 if (script < 0) { /* invalid arg? */
437 print_usage(argv[-script]);463 print_usage(argv[-script]);
438 return 0;464 return 0;
439 }465 }
440 if (has_v) print_version();466 if (args[has_v]) print_version();
441 /* open standard libraries */467 /* open standard libraries */
442 luaL_checkversion(L);468 luaL_checkversion(L);
443 lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */469 lua_gc(L, LUA_GCSTOP, 0); /* stop collector during initialization */
444 luaL_openlibs(L); /* open libraries */470 luaL_openlibs(L); /* open libraries */
445 lua_gc(L, LUA_GCRESTART, 0);471 lua_gc(L, LUA_GCRESTART, 0);
446 /* run LUA_INIT */472 if (args[has_E]) /* avoid LUA_INIT? */
447 if (handle_luainit(L) != LUA_OK) return 0;473 resetpaths(L);
474 else if (handle_luainit(L) != LUA_OK) return 0;
448 /* execute arguments -e and -l */475 /* execute arguments -e and -l */
449 if (!runargs(L, argv, (script > 0) ? script : argc)) return 0;476 if (!runargs(L, argv, (script > 0) ? script : argc)) return 0;
450 /* execute main script (if there is one) */477 /* execute main script (if there is one) */
451 if (script && handle_script(L, argv, script) != LUA_OK) return 0;478 if (script && handle_script(L, argv, script) != LUA_OK) return 0;
452 if (has_i) /* -i option? */479 if (args[has_i]) /* -i option? */
453 dotty(L);480 dotty(L);
454 else if (script == 0 && !has_e && !has_v) { /* no arguments? */481 else if (script == 0 && !args[has_e] && !args[has_v]) { /* no arguments? */
455 if (lua_stdin_is_tty()) {482 if (lua_stdin_is_tty()) {
456 print_version();483 print_version();
457 dotty(L);484 dotty(L);
src/lua.h+7−10
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lua.h,v 1.278 2011/07/02 16:00:15 roberto Exp $2** $Id: lua.h,v 1.281 2011/10/24 16:53:05 roberto Exp $
3** Lua - A Scripting Language3** Lua - A Scripting Language
4** Lua.org, PUC-Rio, Brazil (http://www.lua.org)4** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
5** See Copyright Notice at the end of this file5** See Copyright Notice at the end of this file
@@ -19,7 +19,7 @@ · 13 unmodified lines
19#define LUA_VERSION_MAJOR "5"19#define LUA_VERSION_MAJOR "5"
20#define LUA_VERSION_MINOR "2"20#define LUA_VERSION_MINOR "2"
21#define LUA_VERSION_NUM 50221#define LUA_VERSION_NUM 502
22#define LUA_VERSION_RELEASE "0" " (beta)"22#define LUA_VERSION_RELEASE "0"
23 23
24#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR24#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
25#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE25#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE
@@ -215,10 +215,12 @@ LUA_API int (lua_pushthread) (lua_State *L); · 189 unmodified lines
215/*215/*
216** get functions (Lua -> stack)216** get functions (Lua -> stack)
217*/217*/
218LUA_API void (lua_getglobal) (lua_State *L, const char *var);
218LUA_API void (lua_gettable) (lua_State *L, int idx);219LUA_API void (lua_gettable) (lua_State *L, int idx);
219LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k);220LUA_API void (lua_getfield) (lua_State *L, int idx, const char *k);
220LUA_API void (lua_rawget) (lua_State *L, int idx);221LUA_API void (lua_rawget) (lua_State *L, int idx);
221LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n);222LUA_API void (lua_rawgeti) (lua_State *L, int idx, int n);
223LUA_API void (lua_rawgetp) (lua_State *L, int idx, const void *p);
222LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);224LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec);
223LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);225LUA_API void *(lua_newuserdata) (lua_State *L, size_t sz);
224LUA_API int (lua_getmetatable) (lua_State *L, int objindex);226LUA_API int (lua_getmetatable) (lua_State *L, int objindex);
@@ -228,10 +230,12 @@ LUA_API void (lua_getuservalue) (lua_State *L, int idx); · 3 unmodified lines
228/*230/*
229** set functions (stack -> Lua)231** set functions (stack -> Lua)
230*/232*/
233LUA_API void (lua_setglobal) (lua_State *L, const char *var);
231LUA_API void (lua_settable) (lua_State *L, int idx);234LUA_API void (lua_settable) (lua_State *L, int idx);
232LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);235LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k);
233LUA_API void (lua_rawset) (lua_State *L, int idx);236LUA_API void (lua_rawset) (lua_State *L, int idx);
234LUA_API void (lua_rawseti) (lua_State *L, int idx, int n);237LUA_API void (lua_rawseti) (lua_State *L, int idx, int n);
238LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p);
235LUA_API int (lua_setmetatable) (lua_State *L, int objindex);239LUA_API int (lua_setmetatable) (lua_State *L, int objindex);
236LUA_API void (lua_setuservalue) (lua_State *L, int idx);240LUA_API void (lua_setuservalue) (lua_State *L, int idx);
237 241
@@ -261,7 +265,7 @@ LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data); · 23 unmodified lines
261LUA_API int (lua_yieldk) (lua_State *L, int nresults, int ctx,265LUA_API int (lua_yieldk) (lua_State *L, int nresults, int ctx,
262 lua_CFunction k);266 lua_CFunction k);
263#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL)267#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL)
264LUA_API int (lua_resume) (lua_State *L, int narg);268LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg);
265LUA_API int (lua_status) (lua_State *L);269LUA_API int (lua_status) (lua_State *L);
266 270
267/*271/*
@@ -314,13 +318,6 @@ LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); · 46 unmodified lines
314 318
315#define lua_newtable(L) lua_createtable(L, 0, 0)319#define lua_newtable(L) lua_createtable(L, 0, 0)
316 320
317#define lua_setglobal(L,s) \
318 (lua_pushglobaltable(L), lua_pushvalue(L, -2), \
319 lua_setfield(L, -2, (s)), lua_pop(L, 2))
320
321#define lua_getglobal(L,s) \
322 (lua_pushglobaltable(L), lua_getfield(L, -1, (s)), lua_remove(L, -2))
323
324#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))321#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
325 322
326#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)323#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0)
src/luac.c+3−4
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: luac.c,v 1.67 2011/06/21 12:29:00 lhf Exp $2** $Id: luac.c,v 1.68 2011/11/23 17:48:18 lhf Exp $
3** Lua compiler (saves bytecodes to files; also list bytecodes)3** Lua compiler (saves bytecodes to files; also list bytecodes)
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -53,7 +53,7 @@ static void usage(const char* message) · 47 unmodified lines
53 fprintf(stderr,53 fprintf(stderr,
54 "usage: %s [options] [filenames]\n"54 "usage: %s [options] [filenames]\n"
55 "Available options are:\n"55 "Available options are:\n"
56 " -l list\n"56 " -l list (use -l -l for full listing)\n"
57 " -o name output to file " LUA_QL("name") " (default is \"%s\")\n"57 " -o name output to file " LUA_QL("name") " (default is \"%s\")\n"
58 " -p parse only\n"58 " -p parse only\n"
59 " -s strip debug information\n"59 " -s strip debug information\n"
@@ -203,7 +203,7 @@ int main(int argc, char* argv[]) · 143 unmodified lines
203}203}
204 204
205/*205/*
206** $Id: print.c,v 1.67 2011/05/06 13:37:15 lhf Exp $206** $Id: print.c,v 1.68 2011/09/30 10:21:20 lhf Exp $
207** print bytecodes207** print bytecodes
208** See Copyright Notice in lua.h208** See Copyright Notice in lua.h
209*/209*/
@@ -218,7 +218,6 @@ int main(int argc, char* argv[]) · 8 unmodified lines
218#include "lobject.h"218#include "lobject.h"
219#include "lopcodes.h"219#include "lopcodes.h"
220 220
221#define Sizeof(x) ((int)sizeof(x))
222#define VOID(p) ((const void*)(p))221#define VOID(p) ((const void*)(p))
223 222
224static void PrintString(const TString* ts)223static void PrintString(const TString* ts)
src/luaconf.h+16−11
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: luaconf.h,v 1.161 2011/07/08 20:07:11 roberto Exp $2** $Id: luaconf.h,v 1.166 2011/11/09 14:47:14 roberto Exp $
3** Configuration file for Lua3** Configuration file for Lua
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -29,8 +29,8 @@ · 23 unmodified lines
29#endif29#endif
30 30
31 31
32#if !defined(LUA_ANSI) && defined(_WIN32)32#if !defined(LUA_ANSI) && defined(_WIN32) && !defined(_WIN32_WCE)
33#define LUA_WIN33#define LUA_WIN /* enable goodies for regular Windows platforms */
34#endif34#endif
35 35
36#if defined(LUA_WIN)36#if defined(LUA_WIN)
@@ -210,10 +210,14 @@ · 173 unmodified lines
210 210
211/*211/*
212@@ luai_writestring/luai_writeline define how 'print' prints its results.212@@ luai_writestring/luai_writeline define how 'print' prints its results.
213** They are only used in libraries and the stand-alone program. (The #if
214** avoids including 'stdio.h' everywhere.)
213*/215*/
216#if defined(LUA_LIB) || defined(lua_c) || defined(luaall_c)
214#include <stdio.h>217#include <stdio.h>
215#define luai_writestring(s,l) fwrite((s), sizeof(char), (l), stdout)218#define luai_writestring(s,l) fwrite((s), sizeof(char), (l), stdout)
216#define luai_writeline() (luai_writestring("\n", 1), fflush(stdout))219#define luai_writeline() (luai_writestring("\n", 1), fflush(stdout))
220#endif
217 221
218/*222/*
219@@ luai_writestringerror defines how to print error messages.223@@ luai_writestringerror defines how to print error messages.
@@ -459,7 +463,7 @@ · 239 unmodified lines
459 463
460/* On a Microsoft compiler on a Pentium, use assembler to avoid clashes464/* On a Microsoft compiler on a Pentium, use assembler to avoid clashes
461 with a DirectX idiosyncrasy */465 with a DirectX idiosyncrasy */
462#if defined(_MSC_VER) && defined(M_IX86) /* { */466#if defined(LUA_WIN) && defined(_M_IX86) /* { */
463 467
464#define MS_ASMTRICK468#define MS_ASMTRICK
465 469
@@ -492,12 +496,13 @@ · 26 unmodified lines
492 496
493 497
494/*498/*
495@@ LUA_NANTRICKLE/LUA_NANTRICKBE controls the use of a trick to pack all499@@ LUA_NANTRICK_LE/LUA_NANTRICK_BE controls the use of a trick to
496** types into a single double value, using NaN values to represent500** pack all types into a single double value, using NaN values to
497** non-number values. The trick only works on 32-bit machines (ints and501** represent non-number values. The trick only works on 32-bit machines
498** pointers are 32-bit values) with numbers represented as IEEE 754-2008502** (ints and pointers are 32-bit values) with numbers represented as
499** doubles with conventional endianess (12345678 or 87654321), in CPUs503** IEEE 754-2008 doubles with conventional endianess (12345678 or
500** that do not produce signaling NaN values (all NaNs are quiet).504** 87654321), in CPUs that do not produce signaling NaN values (all NaNs
505** are quiet).
501*/506*/
502#if defined(LUA_CORE) && \507#if defined(LUA_CORE) && \
503 defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) /* { */508 defined(LUA_NUMBER_DOUBLE) && !defined(LUA_ANSI) /* { */
@@ -506,7 +511,7 @@ · 2 unmodified lines
506#if defined(__i386__) || defined(__i386) || defined(__X86__) || \511#if defined(__i386__) || defined(__i386) || defined(__X86__) || \
507 defined(_M_IX86)512 defined(_M_IX86)
508 513
509#define LUA_NANTRICKLE514#define LUA_NANTRICK_LE
510 515
511#endif516#endif
512 517
src/lvm.c+29−20
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lvm.c,v 2.141 2011/06/09 18:24:22 roberto Exp $2** $Id: lvm.c,v 2.144 2011/10/07 20:45:19 roberto Exp $
3** Lua virtual machine3** Lua virtual machine
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -127,29 +127,38 @@ void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { · 121 unmodified lines
127 127
128void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {128void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
129 int loop;129 int loop;
130 TValue temp;
131 for (loop = 0; loop < MAXTAGLOOP; loop++) {130 for (loop = 0; loop < MAXTAGLOOP; loop++) {
132 const TValue *tm;131 const TValue *tm;
133 if (ttistable(t)) { /* `t' is a table? */132 if (ttistable(t)) { /* `t' is a table? */
134 Table *h = hvalue(t);133 Table *h = hvalue(t);
135 TValue *oldval = luaH_set(L, h, key); /* do a primitive set */134 TValue *oldval = cast(TValue *, luaH_get(h, key));
136 if (!ttisnil(oldval) || /* result is not nil? */135 /* if previous value is not nil, there must be a previous entry
137 (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */136 in the table; moreover, a metamethod has no relevance */
138 setobj2t(L, oldval, val);137 if (!ttisnil(oldval) ||
138 /* previous value is nil; must check the metamethod */
139 ((tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL &&
140 /* no metamethod; is there a previous entry in the table? */
141 (oldval != luaO_nilobject ||
142 /* no previous entry; must create one. (The next test is
143 always true; we only need the assignment.) */
144 (oldval = luaH_newkey(L, h, key), 1)))) {
145 /* no metamethod and (now) there is an entry with given key */
146 setobj2t(L, oldval, val); /* assign new value to that entry */
147 invalidateTMcache(h);
139 luaC_barrierback(L, obj2gco(h), val);148 luaC_barrierback(L, obj2gco(h), val);
140 return;149 return;
141 }150 }
142 /* else will try the tag method */151 /* else will try the metamethod */
143 }152 }
144 else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))153 else /* not a table; check metamethod */
145 luaG_typeerror(L, t, "index");154 if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX)))
155 luaG_typeerror(L, t, "index");
156 /* there is a metamethod */
146 if (ttisfunction(tm)) {157 if (ttisfunction(tm)) {
147 callTM(L, tm, t, key, val, 0);158 callTM(L, tm, t, key, val, 0);
148 return;159 return;
149 }160 }
150 /* else repeat with 'tm' */161 t = tm; /* else repeat with 'tm' */
151 setobj(L, &temp, tm); /* avoid pointing inside table (may rehash) */
152 t = &temp;
153 }162 }
154 luaG_runerror(L, "loop in settable");163 luaG_runerror(L, "loop in settable");
155}164}
@@ -217,9 +226,9 @@ int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { · 61 unmodified lines
217 return luai_numlt(L, nvalue(l), nvalue(r));226 return luai_numlt(L, nvalue(l), nvalue(r));
218 else if (ttisstring(l) && ttisstring(r))227 else if (ttisstring(l) && ttisstring(r))
219 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;228 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0;
220 else if ((res = call_orderTM(L, l, r, TM_LT)) != -1)229 else if ((res = call_orderTM(L, l, r, TM_LT)) < 0)
221 return res;230 luaG_ordererror(L, l, r);
222 return luaG_ordererror(L, l, r);231 return res;
223}232}
224 233
225 234
@@ -229,11 +238,11 @@ int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { · 3 unmodified lines
229 return luai_numle(L, nvalue(l), nvalue(r));238 return luai_numle(L, nvalue(l), nvalue(r));
230 else if (ttisstring(l) && ttisstring(r))239 else if (ttisstring(l) && ttisstring(r))
231 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;240 return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0;
232 else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */241 else if ((res = call_orderTM(L, l, r, TM_LE)) >= 0) /* first try `le' */
233 return res;242 return res;
234 else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */243 else if ((res = call_orderTM(L, r, l, TM_LT)) < 0) /* else try `lt' */
235 return !res;244 luaG_ordererror(L, l, r);
236 return luaG_ordererror(L, l, r);245 return !res;
237}246}
238 247
239 248
@@ -808,7 +817,7 @@ void luaV_execute (lua_State *L) { · 568 unmodified lines
808 luaH_resizearray(L, h, last); /* pre-allocate it at once */817 luaH_resizearray(L, h, last); /* pre-allocate it at once */
809 for (; n > 0; n--) {818 for (; n > 0; n--) {
810 TValue *val = ra+n;819 TValue *val = ra+n;
811 setobj2t(L, luaH_setint(L, h, last--), val);820 luaH_setint(L, h, last--, val);
812 luaC_barrierback(L, obj2gco(h), val);821 luaC_barrierback(L, obj2gco(h), val);
813 }822 }
814 L->top = ci->top; /* correct top (in case of previous open call) */823 L->top = ci->top; /* correct top (in case of previous open call) */
src/lzio.c+2−2
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lzio.c,v 1.33 2011/02/23 13:13:10 roberto Exp $2** $Id: lzio.c,v 1.34 2011/07/15 12:35:32 roberto Exp $
3** a generic input stream interface3** a generic input stream interface
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -29,7 +29,7 @@ int luaZ_fill (ZIO *z) { · 23 unmodified lines
29 return EOZ;29 return EOZ;
30 z->n = size - 1; /* discount char being returned */30 z->n = size - 1; /* discount char being returned */
31 z->p = buff;31 z->p = buff;
32 return char2int(*(z->p++));32 return cast_uchar(*(z->p++));
33}33}
34 34
35 35
src/lzio.h+2−6
@@ -1,5 +1,5 @@
1/*1/*
2** $Id: lzio.h,v 1.24 2011/02/23 13:13:10 roberto Exp $2** $Id: lzio.h,v 1.26 2011/07/15 12:48:03 roberto Exp $
3** Buffered streams3** Buffered streams
4** See Copyright Notice in lua.h4** See Copyright Notice in lua.h
5*/5*/
@@ -17,11 +17,7 @@ · 11 unmodified lines
17 17
18typedef struct Zio ZIO;18typedef struct Zio ZIO;
19 19
20#define char2int(c) cast(int, cast(unsigned char, (c)))20#define zgetc(z) (((z)->n--)>0 ? cast_uchar(*(z)->p++) : luaZ_fill(z))
21
22#define zgetc(z) (((z)->n--)>0 ? char2int(*(z)->p++) : luaZ_fill(z))
23
24#define zungetc(z) ((z)->n++, (z)->p--)
25 21
26 22
27typedef struct Mbuffer {23typedef struct Mbuffer {