Merge pull request #13 from natano/update-lua-5.1.5

Update lua from 5.1.1 to 5.1.5
This commit is contained in:
teejusb
2022-01-23 08:38:20 -08:00
committed by GitHub
78 changed files with 24687 additions and 24031 deletions
+1 -1
View File
@@ -9,7 +9,7 @@ For details and rationale, see http://www.lua.org/license.html .
=============================================================================== ===============================================================================
Copyright (C) 1994-2006 Lua.org, PUC-Rio. Copyright (C) 1994-2012 Lua.org, PUC-Rio.
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+1 -1
View File
@@ -14,7 +14,7 @@ HISTORY for Lua 5.1
API: API:
+ new functions: lua_createtable, lua_get(set)field, lua_push(to)integer. + new functions: lua_createtable, lua_get(set)field, lua_push(to)integer.
+ user supplies memory allocator (lua_open becomes lua_newstate). + user supplies memory allocator (lua_open becomes lua_newstate).
+ luaopen_* functionst must be called through Lua. + luaopen_* functions must be called through Lua.
Implementation: Implementation:
+ new configuration scheme via luaconf.h. + new configuration scheme via luaconf.h.
+ incremental garbage collection. + incremental garbage collection.
+6 -3
View File
@@ -8,7 +8,10 @@ INSTALL for Lua 5.1
Building Lua on Unix systems should be very easy. First do "make" and Building Lua on Unix systems should be very easy. First do "make" and
see if your platform is listed. If so, just do "make xxx", where xxx see if your platform is listed. If so, just do "make xxx", where xxx
is your platform name. The platforms currently supported are: is your platform name. The platforms currently supported are:
ansi bsd generic linux macosx mingw posix solaris aix ansi bsd freebsd generic linux macosx mingw posix solaris
If your platform is not listed, try the closest one or posix, generic,
ansi, in this order.
See below for customization instructions and for instructions on how See below for customization instructions and for instructions on how
to build with other Windows compilers. to build with other Windows compilers.
@@ -81,8 +84,8 @@ INSTALL for Lua 5.1
compiler: library, luac.c print.c compiler: library, luac.c print.c
If you use Visual Studio .NET, you can use etc/luavs.bat If you use Visual Studio .NET, you can use etc/luavs.bat in its
in its "Command Prompt". "Command Prompt".
If all you want is to build the Lua interpreter, you may put all .c files If all you want is to build the Lua interpreter, you may put all .c files
in a single project, except for luac.c and print.c. Or just use etc/all.c. in a single project, except for luac.c and print.c. Or just use etc/all.c.
+2 -2
View File
@@ -24,8 +24,8 @@ See HISTORY for a summary of changes since the last released version.
* Installation * Installation
------------ ------------
Lua is implemented in pure ANSI C, and compiles unmodified in all known Lua is implemented in pure ANSI C, and compiles unmodified in all known
platforms that have an ANSI C compiler. Under Unix, simply typing "make" platforms that have an ANSI C compiler. In most Unix-like platforms, simply
should work. See INSTALL for detailed instructions. do "make" with a suitable target. See INSTALL for detailed instructions.
* Origin * Origin
------ ------
+151 -83
View File
@@ -1,122 +1,163 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Lua 5.1 reference manual - contents</TITLE> <TITLE>Lua 5.1 Reference Manual - contents</TITLE>
<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css"> <LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">
<style type="text/css"> <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=utf-8">
<STYLE TYPE="text/css">
ul { ul {
list-style-type: none ; list-style-type: none ;
list-style-position: outside ;
} }
</style> </STYLE>
</HEAD> </HEAD>
<BODY> <BODY>
<HR> <HR>
<H1> <H1>
<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua" BORDER=0></A> <A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="" BORDER=0></A>
Reference manual for Lua 5.1 Lua 5.1 Reference Manual
</H1> </H1>
<P>
The reference manual is the official definition of the Lua language.
For a complete introduction to Lua programming, see the book
<A HREF="http://www.lua.org/docs.html#pil">Programming in Lua</A>.
<P>
This manual is also available as a book:
<BLOCKQUOTE>
<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">
<IMG SRC="cover.png" ALT="" TITLE="buy from Amazon" BORDER=1 ALIGN="left" HSPACE=12>
</A>
<B>Lua 5.1 Reference Manual</B>
<BR>by R. Ierusalimschy, L. H. de Figueiredo, W. Celes
<BR>Lua.org, August 2006
<BR>ISBN 85-903798-3-3
<BR CLEAR="all">
</BLOCKQUOTE>
<P>
<A HREF="http://www.amazon.com/exec/obidos/ASIN/8590379833/lua-indexmanual-20">Buy a copy</A>
of this book and
<A HREF="http://www.lua.org/donations.html">help to support</A>
the Lua project.
<P>
<A HREF="manual.html">start</A>
&middot;
<A HREF="#contents">contents</A> <A HREF="#contents">contents</A>
&middot; &middot;
<A HREF="#index">index</A> <A HREF="#index">index</A>
&middot;
<A HREF="http://www.lua.org/manual/">other versions</A>
<HR> <HR>
<P> <SMALL>
Copyright &copy; 2006&ndash;2012 Lua.org, PUC-Rio.
Freely available under the terms of the
<A HREF="http://www.lua.org/license.html">Lua license</A>.
</SMALL>
<H2><A NAME="contents">Contents</A></H2> <H2><A NAME="contents">Contents</A></H2>
<UL style="padding: 0"> <UL style="padding: 0">
<LI><A HREF="manual.html">Top</A> <LI><A HREF="manual.html">1 &ndash; Introduction</A>
<LI><A HREF="manual.html#1">1 - Introduction</A> <P>
<LI><A HREF="manual.html#2">2 - The Language</A> <LI><A HREF="manual.html#2">2 &ndash; The Language</A>
<UL> <UL>
<LI><A HREF="manual.html#2.1">2.1 - Lexical Conventions</A> <LI><A HREF="manual.html#2.1">2.1 &ndash; Lexical Conventions</A>
<LI><A HREF="manual.html#2.2">2.2 - Values and Types</A> <LI><A HREF="manual.html#2.2">2.2 &ndash; Values and Types</A>
<UL> <UL>
<LI><A HREF="manual.html#2.2.1">2.2.1 - Coercion</A> <LI><A HREF="manual.html#2.2.1">2.2.1 &ndash; Coercion</A>
</UL> </UL>
<LI><A HREF="manual.html#2.3">2.3 - Variables</A> <LI><A HREF="manual.html#2.3">2.3 &ndash; Variables</A>
<LI><A HREF="manual.html#2.4">2.4 - Statements</A> <LI><A HREF="manual.html#2.4">2.4 &ndash; Statements</A>
<UL> <UL>
<LI><A HREF="manual.html#2.4.1">2.4.1 - Chunks</A> <LI><A HREF="manual.html#2.4.1">2.4.1 &ndash; Chunks</A>
<LI><A HREF="manual.html#2.4.2">2.4.2 - Blocks</A> <LI><A HREF="manual.html#2.4.2">2.4.2 &ndash; Blocks</A>
<LI><A HREF="manual.html#2.4.3">2.4.3 - Assignment</A> <LI><A HREF="manual.html#2.4.3">2.4.3 &ndash; Assignment</A>
<LI><A HREF="manual.html#2.4.4">2.4.4 - Control Structures</A> <LI><A HREF="manual.html#2.4.4">2.4.4 &ndash; Control Structures</A>
<LI><A HREF="manual.html#2.4.5">2.4.5 - For Statement</A> <LI><A HREF="manual.html#2.4.5">2.4.5 &ndash; For Statement</A>
<LI><A HREF="manual.html#2.4.6">2.4.6 - Function Calls as Statements</A> <LI><A HREF="manual.html#2.4.6">2.4.6 &ndash; Function Calls as Statements</A>
<LI><A HREF="manual.html#2.4.7">2.4.7 - Local Declarations</A> <LI><A HREF="manual.html#2.4.7">2.4.7 &ndash; Local Declarations</A>
</UL> </UL>
<LI><A HREF="manual.html#2.5">2.5 - Expressions</A> <LI><A HREF="manual.html#2.5">2.5 &ndash; Expressions</A>
<UL> <UL>
<LI><A HREF="manual.html#2.5.1">2.5.1 - Arithmetic Operators</A> <LI><A HREF="manual.html#2.5.1">2.5.1 &ndash; Arithmetic Operators</A>
<LI><A HREF="manual.html#2.5.2">2.5.2 - Relational Operators</A> <LI><A HREF="manual.html#2.5.2">2.5.2 &ndash; Relational Operators</A>
<LI><A HREF="manual.html#2.5.3">2.5.3 - Logical Operators</A> <LI><A HREF="manual.html#2.5.3">2.5.3 &ndash; Logical Operators</A>
<LI><A HREF="manual.html#2.5.4">2.5.4 - Concatenation</A> <LI><A HREF="manual.html#2.5.4">2.5.4 &ndash; Concatenation</A>
<LI><A HREF="manual.html#2.5.5">2.5.5 - The Length Operator</A> <LI><A HREF="manual.html#2.5.5">2.5.5 &ndash; The Length Operator</A>
<LI><A HREF="manual.html#2.5.6">2.5.6 - Precedence</A> <LI><A HREF="manual.html#2.5.6">2.5.6 &ndash; Precedence</A>
<LI><A HREF="manual.html#2.5.7">2.5.7 - Table Constructors</A> <LI><A HREF="manual.html#2.5.7">2.5.7 &ndash; Table Constructors</A>
<LI><A HREF="manual.html#2.5.8">2.5.8 - Function Calls</A> <LI><A HREF="manual.html#2.5.8">2.5.8 &ndash; Function Calls</A>
<LI><A HREF="manual.html#2.5.9">2.5.9 - Function Definitions</A> <LI><A HREF="manual.html#2.5.9">2.5.9 &ndash; Function Definitions</A>
</UL> </UL>
<LI><A HREF="manual.html#2.6">2.6 - Visibility Rules</A> <LI><A HREF="manual.html#2.6">2.6 &ndash; Visibility Rules</A>
<LI><A HREF="manual.html#2.7">2.7 - Error Handling</A> <LI><A HREF="manual.html#2.7">2.7 &ndash; Error Handling</A>
<LI><A HREF="manual.html#2.8">2.8 - Metatables</A> <LI><A HREF="manual.html#2.8">2.8 &ndash; Metatables</A>
<LI><A HREF="manual.html#2.9">2.9 - Environments</A> <LI><A HREF="manual.html#2.9">2.9 &ndash; Environments</A>
<LI><A HREF="manual.html#2.10">2.10 - Garbage Collection</A> <LI><A HREF="manual.html#2.10">2.10 &ndash; Garbage Collection</A>
<UL> <UL>
<LI><A HREF="manual.html#2.10.1">2.10.1 - Garbage-Collection Metamethods</A> <LI><A HREF="manual.html#2.10.1">2.10.1 &ndash; Garbage-Collection Metamethods</A>
<LI><A HREF="manual.html#2.10.2">2.10.2 - Weak Tables</A> <LI><A HREF="manual.html#2.10.2">2.10.2 &ndash; Weak Tables</A>
</UL> </UL>
<LI><A HREF="manual.html#2.11">2.11 - Coroutines</A> <LI><A HREF="manual.html#2.11">2.11 &ndash; Coroutines</A>
</UL> </UL>
<LI><A HREF="manual.html#3">3 - The Application Program Interface</A> <P>
<LI><A HREF="manual.html#3">3 &ndash; The Application Program Interface</A>
<UL> <UL>
<LI><A HREF="manual.html#3.1">3.1 - The Stack</A> <LI><A HREF="manual.html#3.1">3.1 &ndash; The Stack</A>
<LI><A HREF="manual.html#3.2">3.2 - Stack Size</A> <LI><A HREF="manual.html#3.2">3.2 &ndash; Stack Size</A>
<LI><A HREF="manual.html#3.3">3.3 - Pseudo-Indices</A> <LI><A HREF="manual.html#3.3">3.3 &ndash; Pseudo-Indices</A>
<LI><A HREF="manual.html#3.4">3.4 - C Closures</A> <LI><A HREF="manual.html#3.4">3.4 &ndash; C Closures</A>
<LI><A HREF="manual.html#3.5">3.5 - Registry</A> <LI><A HREF="manual.html#3.5">3.5 &ndash; Registry</A>
<LI><A HREF="manual.html#3.6">3.6 - Error Handling in C</A> <LI><A HREF="manual.html#3.6">3.6 &ndash; Error Handling in C</A>
<LI><A HREF="manual.html#3.7">3.7 - Functions and Types</A> <LI><A HREF="manual.html#3.7">3.7 &ndash; Functions and Types</A>
<LI><A HREF="manual.html#3.8">3.8 - The Debug Interface</A> <LI><A HREF="manual.html#3.8">3.8 &ndash; The Debug Interface</A>
</UL> </UL>
<LI><A HREF="manual.html#4">4 - The Auxiliary Library</A> <P>
<LI><A HREF="manual.html#4">4 &ndash; The Auxiliary Library</A>
<UL> <UL>
<LI><A HREF="manual.html#4.1">4.1 - Functions and Types</A> <LI><A HREF="manual.html#4.1">4.1 &ndash; Functions and Types</A>
</UL> </UL>
<LI><A HREF="manual.html#5">5 - Standard Libraries</A> <P>
<LI><A HREF="manual.html#5">5 &ndash; Standard Libraries</A>
<UL> <UL>
<LI><A HREF="manual.html#5.1">5.1 - Basic Functions</A> <LI><A HREF="manual.html#5.1">5.1 &ndash; Basic Functions</A>
<LI><A HREF="manual.html#5.2">5.2 - Coroutine Manipulation</A> <LI><A HREF="manual.html#5.2">5.2 &ndash; Coroutine Manipulation</A>
<LI><A HREF="manual.html#5.3">5.3 - Modules</A> <LI><A HREF="manual.html#5.3">5.3 &ndash; Modules</A>
<LI><A HREF="manual.html#5.4">5.4 - String Manipulation</A> <LI><A HREF="manual.html#5.4">5.4 &ndash; String Manipulation</A>
<UL> <UL>
<LI><A HREF="manual.html#5.4.1">5.4.1 - Patterns</A> <LI><A HREF="manual.html#5.4.1">5.4.1 &ndash; Patterns</A>
</UL> </UL>
<LI><A HREF="manual.html#5.5">5.5 - Table Manipulation</A> <LI><A HREF="manual.html#5.5">5.5 &ndash; Table Manipulation</A>
<LI><A HREF="manual.html#5.6">5.6 - Mathematical Functions</A> <LI><A HREF="manual.html#5.6">5.6 &ndash; Mathematical Functions</A>
<LI><A HREF="manual.html#5.7">5.7 - Input and Output Facilities</A> <LI><A HREF="manual.html#5.7">5.7 &ndash; Input and Output Facilities</A>
<LI><A HREF="manual.html#5.8">5.8 - Operating System Facilities</A> <LI><A HREF="manual.html#5.8">5.8 &ndash; Operating System Facilities</A>
<LI><A HREF="manual.html#5.9">5.9 - The Debug Library</A> <LI><A HREF="manual.html#5.9">5.9 &ndash; The Debug Library</A>
</UL> </UL>
<LI><A HREF="manual.html#6">6 - Lua Stand-alone</A> <P>
<LI><A HREF="manual.html#7">7 - Incompatibilities with the Previous Version</A> <LI><A HREF="manual.html#6">6 &ndash; Lua Stand-alone</A>
<P>
<LI><A HREF="manual.html#7">7 &ndash; Incompatibilities with the Previous Version</A>
<UL> <UL>
<LI><A HREF="manual.html#7.1">7.1 - Changes in the Language</A> <LI><A HREF="manual.html#7.1">7.1 &ndash; Changes in the Language</A>
<LI><A HREF="manual.html#7.2">7.2 - Changes in the Libraries</A> <LI><A HREF="manual.html#7.2">7.2 &ndash; Changes in the Libraries</A>
<LI><A HREF="manual.html#7.3">7.3 - Changes in the API</A> <LI><A HREF="manual.html#7.3">7.3 &ndash; Changes in the API</A>
</UL> </UL>
<LI><A HREF="manual.html#8">8 - The Complete Syntax of Lua</A> <P>
<LI><A HREF="manual.html#8">8 &ndash; The Complete Syntax of Lua</A>
</UL> </UL>
<H2><A NAME="index">Index</A></H2> <H2><A NAME="index">Index</A></H2>
<TABLE> <TABLE WIDTH="100%">
<TR VALIGN="top"> <TR VALIGN="top">
<TD WIDTH="20%"> <TD>
<H3><A NAME="functions">Lua functions</A></H3> <H3><A NAME="functions">Lua functions</A></H3>
<A HREF="manual.html#pdf-_G">_G</A><BR> <A HREF="manual.html#pdf-_G">_G</A><BR>
<A HREF="manual.html#pdf-_VERSION">_VERSION</A><BR> <A HREF="manual.html#pdf-_VERSION">_VERSION</A><BR>
<P>
<A HREF="manual.html#pdf-assert">assert</A><BR> <A HREF="manual.html#pdf-assert">assert</A><BR>
<A HREF="manual.html#pdf-collectgarbage">collectgarbage</A><BR> <A HREF="manual.html#pdf-collectgarbage">collectgarbage</A><BR>
<A HREF="manual.html#pdf-dofile">dofile</A><BR> <A HREF="manual.html#pdf-dofile">dofile</A><BR>
@@ -144,16 +185,16 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-type">type</A><BR> <A HREF="manual.html#pdf-type">type</A><BR>
<A HREF="manual.html#pdf-unpack">unpack</A><BR> <A HREF="manual.html#pdf-unpack">unpack</A><BR>
<A HREF="manual.html#pdf-xpcall">xpcall</A><BR> <A HREF="manual.html#pdf-xpcall">xpcall</A><BR>
<P>
</TD>
<TD WIDTH="30%">
<H3>&nbsp;</H3>
<A HREF="manual.html#pdf-coroutine.create">coroutine.create</A><BR> <A HREF="manual.html#pdf-coroutine.create">coroutine.create</A><BR>
<A HREF="manual.html#pdf-coroutine.resume">coroutine.resume</A><BR> <A HREF="manual.html#pdf-coroutine.resume">coroutine.resume</A><BR>
<A HREF="manual.html#pdf-coroutine.running">coroutine.running</A><BR> <A HREF="manual.html#pdf-coroutine.running">coroutine.running</A><BR>
<A HREF="manual.html#pdf-coroutine.status">coroutine.status</A><BR> <A HREF="manual.html#pdf-coroutine.status">coroutine.status</A><BR>
<A HREF="manual.html#pdf-coroutine.wrap">coroutine.wrap</A><BR> <A HREF="manual.html#pdf-coroutine.wrap">coroutine.wrap</A><BR>
<A HREF="manual.html#pdf-coroutine.yield">coroutine.yield</A><BR> <A HREF="manual.html#pdf-coroutine.yield">coroutine.yield</A><BR>
<P>
<A HREF="manual.html#pdf-debug.debug">debug.debug</A><BR> <A HREF="manual.html#pdf-debug.debug">debug.debug</A><BR>
<A HREF="manual.html#pdf-debug.getfenv">debug.getfenv</A><BR> <A HREF="manual.html#pdf-debug.getfenv">debug.getfenv</A><BR>
<A HREF="manual.html#pdf-debug.gethook">debug.gethook</A><BR> <A HREF="manual.html#pdf-debug.gethook">debug.gethook</A><BR>
@@ -168,6 +209,10 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-debug.setmetatable">debug.setmetatable</A><BR> <A HREF="manual.html#pdf-debug.setmetatable">debug.setmetatable</A><BR>
<A HREF="manual.html#pdf-debug.setupvalue">debug.setupvalue</A><BR> <A HREF="manual.html#pdf-debug.setupvalue">debug.setupvalue</A><BR>
<A HREF="manual.html#pdf-debug.traceback">debug.traceback</A><BR> <A HREF="manual.html#pdf-debug.traceback">debug.traceback</A><BR>
</TD>
<TD>
<H3>&nbsp;</H3>
<A HREF="manual.html#pdf-file:close">file:close</A><BR> <A HREF="manual.html#pdf-file:close">file:close</A><BR>
<A HREF="manual.html#pdf-file:flush">file:flush</A><BR> <A HREF="manual.html#pdf-file:flush">file:flush</A><BR>
<A HREF="manual.html#pdf-file:lines">file:lines</A><BR> <A HREF="manual.html#pdf-file:lines">file:lines</A><BR>
@@ -175,6 +220,8 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-file:seek">file:seek</A><BR> <A HREF="manual.html#pdf-file:seek">file:seek</A><BR>
<A HREF="manual.html#pdf-file:setvbuf">file:setvbuf</A><BR> <A HREF="manual.html#pdf-file:setvbuf">file:setvbuf</A><BR>
<A HREF="manual.html#pdf-file:write">file:write</A><BR> <A HREF="manual.html#pdf-file:write">file:write</A><BR>
<P>
<A HREF="manual.html#pdf-io.close">io.close</A><BR> <A HREF="manual.html#pdf-io.close">io.close</A><BR>
<A HREF="manual.html#pdf-io.flush">io.flush</A><BR> <A HREF="manual.html#pdf-io.flush">io.flush</A><BR>
<A HREF="manual.html#pdf-io.input">io.input</A><BR> <A HREF="manual.html#pdf-io.input">io.input</A><BR>
@@ -183,17 +230,22 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-io.output">io.output</A><BR> <A HREF="manual.html#pdf-io.output">io.output</A><BR>
<A HREF="manual.html#pdf-io.popen">io.popen</A><BR> <A HREF="manual.html#pdf-io.popen">io.popen</A><BR>
<A HREF="manual.html#pdf-io.read">io.read</A><BR> <A HREF="manual.html#pdf-io.read">io.read</A><BR>
<A HREF="manual.html#pdf-io.stderr">io.stderr</A><BR>
<A HREF="manual.html#pdf-io.stdin">io.stdin</A><BR>
<A HREF="manual.html#pdf-io.stdout">io.stdout</A><BR>
<A HREF="manual.html#pdf-io.tmpfile">io.tmpfile</A><BR> <A HREF="manual.html#pdf-io.tmpfile">io.tmpfile</A><BR>
<A HREF="manual.html#pdf-io.type">io.type</A><BR> <A HREF="manual.html#pdf-io.type">io.type</A><BR>
<A HREF="manual.html#pdf-io.write">io.write</A><BR> <A HREF="manual.html#pdf-io.write">io.write</A><BR>
<P>
<A HREF="manual.html#pdf-math.abs">math.abs</A><BR> <A HREF="manual.html#pdf-math.abs">math.abs</A><BR>
<A HREF="manual.html#pdf-math.acos">math.acos</A><BR> <A HREF="manual.html#pdf-math.acos">math.acos</A><BR>
<A HREF="manual.html#pdf-math.asin">math.asin</A><BR> <A HREF="manual.html#pdf-math.asin">math.asin</A><BR>
<A HREF="manual.html#pdf-math.atan2">math.atan2</A><BR>
<A HREF="manual.html#pdf-math.atan">math.atan</A><BR> <A HREF="manual.html#pdf-math.atan">math.atan</A><BR>
<A HREF="manual.html#pdf-math.atan2">math.atan2</A><BR>
<A HREF="manual.html#pdf-math.ceil">math.ceil</A><BR> <A HREF="manual.html#pdf-math.ceil">math.ceil</A><BR>
<A HREF="manual.html#pdf-math.cosh">math.cosh</A><BR>
<A HREF="manual.html#pdf-math.cos">math.cos</A><BR> <A HREF="manual.html#pdf-math.cos">math.cos</A><BR>
<A HREF="manual.html#pdf-math.cosh">math.cosh</A><BR>
<A HREF="manual.html#pdf-math.deg">math.deg</A><BR> <A HREF="manual.html#pdf-math.deg">math.deg</A><BR>
<A HREF="manual.html#pdf-math.exp">math.exp</A><BR> <A HREF="manual.html#pdf-math.exp">math.exp</A><BR>
<A HREF="manual.html#pdf-math.floor">math.floor</A><BR> <A HREF="manual.html#pdf-math.floor">math.floor</A><BR>
@@ -201,8 +253,8 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-math.frexp">math.frexp</A><BR> <A HREF="manual.html#pdf-math.frexp">math.frexp</A><BR>
<A HREF="manual.html#pdf-math.huge">math.huge</A><BR> <A HREF="manual.html#pdf-math.huge">math.huge</A><BR>
<A HREF="manual.html#pdf-math.ldexp">math.ldexp</A><BR> <A HREF="manual.html#pdf-math.ldexp">math.ldexp</A><BR>
<A HREF="manual.html#pdf-math.log10">math.log10</A><BR>
<A HREF="manual.html#pdf-math.log">math.log</A><BR> <A HREF="manual.html#pdf-math.log">math.log</A><BR>
<A HREF="manual.html#pdf-math.log10">math.log10</A><BR>
<A HREF="manual.html#pdf-math.max">math.max</A><BR> <A HREF="manual.html#pdf-math.max">math.max</A><BR>
<A HREF="manual.html#pdf-math.min">math.min</A><BR> <A HREF="manual.html#pdf-math.min">math.min</A><BR>
<A HREF="manual.html#pdf-math.modf">math.modf</A><BR> <A HREF="manual.html#pdf-math.modf">math.modf</A><BR>
@@ -211,11 +263,13 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-math.rad">math.rad</A><BR> <A HREF="manual.html#pdf-math.rad">math.rad</A><BR>
<A HREF="manual.html#pdf-math.random">math.random</A><BR> <A HREF="manual.html#pdf-math.random">math.random</A><BR>
<A HREF="manual.html#pdf-math.randomseed">math.randomseed</A><BR> <A HREF="manual.html#pdf-math.randomseed">math.randomseed</A><BR>
<A HREF="manual.html#pdf-math.sinh">math.sinh</A><BR>
<A HREF="manual.html#pdf-math.sin">math.sin</A><BR> <A HREF="manual.html#pdf-math.sin">math.sin</A><BR>
<A HREF="manual.html#pdf-math.sinh">math.sinh</A><BR>
<A HREF="manual.html#pdf-math.sqrt">math.sqrt</A><BR> <A HREF="manual.html#pdf-math.sqrt">math.sqrt</A><BR>
<A HREF="manual.html#pdf-math.tanh">math.tanh</A><BR>
<A HREF="manual.html#pdf-math.tan">math.tan</A><BR> <A HREF="manual.html#pdf-math.tan">math.tan</A><BR>
<A HREF="manual.html#pdf-math.tanh">math.tanh</A><BR>
<P>
<A HREF="manual.html#pdf-os.clock">os.clock</A><BR> <A HREF="manual.html#pdf-os.clock">os.clock</A><BR>
<A HREF="manual.html#pdf-os.date">os.date</A><BR> <A HREF="manual.html#pdf-os.date">os.date</A><BR>
<A HREF="manual.html#pdf-os.difftime">os.difftime</A><BR> <A HREF="manual.html#pdf-os.difftime">os.difftime</A><BR>
@@ -227,12 +281,17 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-os.setlocale">os.setlocale</A><BR> <A HREF="manual.html#pdf-os.setlocale">os.setlocale</A><BR>
<A HREF="manual.html#pdf-os.time">os.time</A><BR> <A HREF="manual.html#pdf-os.time">os.time</A><BR>
<A HREF="manual.html#pdf-os.tmpname">os.tmpname</A><BR> <A HREF="manual.html#pdf-os.tmpname">os.tmpname</A><BR>
<P>
<A HREF="manual.html#pdf-package.cpath">package.cpath</A><BR> <A HREF="manual.html#pdf-package.cpath">package.cpath</A><BR>
<A HREF="manual.html#pdf-package.loaded">package.loaded</A><BR> <A HREF="manual.html#pdf-package.loaded">package.loaded</A><BR>
<A HREF="manual.html#pdf-package.loaders">package.loaders</A><BR>
<A HREF="manual.html#pdf-package.loadlib">package.loadlib</A><BR> <A HREF="manual.html#pdf-package.loadlib">package.loadlib</A><BR>
<A HREF="manual.html#pdf-package.path">package.path</A><BR> <A HREF="manual.html#pdf-package.path">package.path</A><BR>
<A HREF="manual.html#pdf-package.preload">package.preload</A><BR> <A HREF="manual.html#pdf-package.preload">package.preload</A><BR>
<A HREF="manual.html#pdf-package.seeall">package.seeall</A><BR> <A HREF="manual.html#pdf-package.seeall">package.seeall</A><BR>
<P>
<A HREF="manual.html#pdf-string.byte">string.byte</A><BR> <A HREF="manual.html#pdf-string.byte">string.byte</A><BR>
<A HREF="manual.html#pdf-string.char">string.char</A><BR> <A HREF="manual.html#pdf-string.char">string.char</A><BR>
<A HREF="manual.html#pdf-string.dump">string.dump</A><BR> <A HREF="manual.html#pdf-string.dump">string.dump</A><BR>
@@ -247,6 +306,8 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-string.reverse">string.reverse</A><BR> <A HREF="manual.html#pdf-string.reverse">string.reverse</A><BR>
<A HREF="manual.html#pdf-string.sub">string.sub</A><BR> <A HREF="manual.html#pdf-string.sub">string.sub</A><BR>
<A HREF="manual.html#pdf-string.upper">string.upper</A><BR> <A HREF="manual.html#pdf-string.upper">string.upper</A><BR>
<P>
<A HREF="manual.html#pdf-table.concat">table.concat</A><BR> <A HREF="manual.html#pdf-table.concat">table.concat</A><BR>
<A HREF="manual.html#pdf-table.insert">table.insert</A><BR> <A HREF="manual.html#pdf-table.insert">table.insert</A><BR>
<A HREF="manual.html#pdf-table.maxn">table.maxn</A><BR> <A HREF="manual.html#pdf-table.maxn">table.maxn</A><BR>
@@ -254,7 +315,7 @@ Reference manual for Lua 5.1
<A HREF="manual.html#pdf-table.sort">table.sort</A><BR> <A HREF="manual.html#pdf-table.sort">table.sort</A><BR>
</TD> </TD>
<TD WIDTH="25%"> <TD>
<H3>C API</H3> <H3>C API</H3>
<A HREF="manual.html#lua_Alloc">lua_Alloc</A><BR> <A HREF="manual.html#lua_Alloc">lua_Alloc</A><BR>
<A HREF="manual.html#lua_CFunction">lua_CFunction</A><BR> <A HREF="manual.html#lua_CFunction">lua_CFunction</A><BR>
@@ -265,6 +326,8 @@ Reference manual for Lua 5.1
<A HREF="manual.html#lua_Reader">lua_Reader</A><BR> <A HREF="manual.html#lua_Reader">lua_Reader</A><BR>
<A HREF="manual.html#lua_State">lua_State</A><BR> <A HREF="manual.html#lua_State">lua_State</A><BR>
<A HREF="manual.html#lua_Writer">lua_Writer</A><BR> <A HREF="manual.html#lua_Writer">lua_Writer</A><BR>
<P>
<A HREF="manual.html#lua_atpanic">lua_atpanic</A><BR> <A HREF="manual.html#lua_atpanic">lua_atpanic</A><BR>
<A HREF="manual.html#lua_call">lua_call</A><BR> <A HREF="manual.html#lua_call">lua_call</A><BR>
<A HREF="manual.html#lua_checkstack">lua_checkstack</A><BR> <A HREF="manual.html#lua_checkstack">lua_checkstack</A><BR>
@@ -296,6 +359,8 @@ Reference manual for Lua 5.1
<A HREF="manual.html#lua_isfunction">lua_isfunction</A><BR> <A HREF="manual.html#lua_isfunction">lua_isfunction</A><BR>
<A HREF="manual.html#lua_islightuserdata">lua_islightuserdata</A><BR> <A HREF="manual.html#lua_islightuserdata">lua_islightuserdata</A><BR>
<A HREF="manual.html#lua_isnil">lua_isnil</A><BR> <A HREF="manual.html#lua_isnil">lua_isnil</A><BR>
<A HREF="manual.html#lua_isnone">lua_isnone</A><BR>
<A HREF="manual.html#lua_isnoneornil">lua_isnoneornil</A><BR>
<A HREF="manual.html#lua_isnumber">lua_isnumber</A><BR> <A HREF="manual.html#lua_isnumber">lua_isnumber</A><BR>
<A HREF="manual.html#lua_isstring">lua_isstring</A><BR> <A HREF="manual.html#lua_isstring">lua_isstring</A><BR>
<A HREF="manual.html#lua_istable">lua_istable</A><BR> <A HREF="manual.html#lua_istable">lua_istable</A><BR>
@@ -317,6 +382,7 @@ Reference manual for Lua 5.1
<A HREF="manual.html#lua_pushfstring">lua_pushfstring</A><BR> <A HREF="manual.html#lua_pushfstring">lua_pushfstring</A><BR>
<A HREF="manual.html#lua_pushinteger">lua_pushinteger</A><BR> <A HREF="manual.html#lua_pushinteger">lua_pushinteger</A><BR>
<A HREF="manual.html#lua_pushlightuserdata">lua_pushlightuserdata</A><BR> <A HREF="manual.html#lua_pushlightuserdata">lua_pushlightuserdata</A><BR>
<A HREF="manual.html#lua_pushliteral">lua_pushliteral</A><BR>
<A HREF="manual.html#lua_pushlstring">lua_pushlstring</A><BR> <A HREF="manual.html#lua_pushlstring">lua_pushlstring</A><BR>
<A HREF="manual.html#lua_pushnil">lua_pushnil</A><BR> <A HREF="manual.html#lua_pushnil">lua_pushnil</A><BR>
<A HREF="manual.html#lua_pushnumber">lua_pushnumber</A><BR> <A HREF="manual.html#lua_pushnumber">lua_pushnumber</A><BR>
@@ -364,6 +430,8 @@ Reference manual for Lua 5.1
<H3>auxiliary library</H3> <H3>auxiliary library</H3>
<A HREF="manual.html#luaL_Buffer">luaL_Buffer</A><BR> <A HREF="manual.html#luaL_Buffer">luaL_Buffer</A><BR>
<A HREF="manual.html#luaL_Reg">luaL_Reg</A><BR> <A HREF="manual.html#luaL_Reg">luaL_Reg</A><BR>
<P>
<A HREF="manual.html#luaL_addchar">luaL_addchar</A><BR> <A HREF="manual.html#luaL_addchar">luaL_addchar</A><BR>
<A HREF="manual.html#luaL_addlstring">luaL_addlstring</A><BR> <A HREF="manual.html#luaL_addlstring">luaL_addlstring</A><BR>
<A HREF="manual.html#luaL_addsize">luaL_addsize</A><BR> <A HREF="manual.html#luaL_addsize">luaL_addsize</A><BR>
@@ -417,12 +485,12 @@ Reference manual for Lua 5.1
<P> <P>
<HR> <HR>
<SMALL> <SMALL CLASS="footer">
Last update: Last update:
Tue Jun 6 14:55:31 BRT 2006 Mon Feb 13 18:53:32 BRST 2012
</SMALL> </SMALL>
<!-- <!--
Last change: reformatted index Last change: revised for Lua 5.1.5
--> -->
</BODY> </BODY>
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

+2 -2
View File
@@ -1,5 +1,5 @@
.\" $Id: lua.1 23036 2006-09-25 07:35:34Z gmaynard $ .\" $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $
.TH LUA 1 "$Date: 2006-09-25 02:35:34 -0500 (Mon, 25 Sep 2006) $" .TH LUA 1 "$Date: 2006/01/06 16:03:34 $"
.SH NAME .SH NAME
lua \- Lua interpreter lua \- Lua interpreter
.SH SYNOPSIS .SH SYNOPSIS
+64 -3
View File
@@ -1,17 +1,45 @@
body { body {
color: #000000 ; color: #000000 ;
background-color: #FFFFFF ; background-color: #FFFFFF ;
font-family: sans-serif ; font-family: Helvetica, Arial, sans-serif ;
text-align: justify ;
margin-right: 30px ;
margin-left: 30px ;
}
h1, h2, h3, h4 {
font-family: Verdana, Geneva, sans-serif ;
font-weight: normal ;
font-style: italic ;
}
h2 {
padding-top: 0.4em ;
padding-bottom: 0.4em ;
padding-left: 30px ;
padding-right: 30px ;
margin-left: -30px ;
background-color: #E0E0FF ;
}
h3 {
padding-left: 0.5em ;
border-left: solid #E0E0FF 1em ;
}
table h3 {
padding-left: 0px ;
border-left: none ;
} }
a:link { a:link {
color: #000080 ; color: #000080 ;
background-color: #FFFFFF ; background-color: inherit ;
text-decoration: none ; text-decoration: none ;
} }
a:visited { a:visited {
background-color: #FFFFFF ; background-color: inherit ;
text-decoration: none ; text-decoration: none ;
} }
@@ -20,3 +48,36 @@ a:link:hover, a:visited:hover {
background-color: #E0E0FF ; background-color: #E0E0FF ;
} }
a:link:active, a:visited:active {
color: #FF0000 ;
}
hr {
border: 0 ;
height: 1px ;
color: #a0a0a0 ;
background-color: #a0a0a0 ;
}
:target {
background-color: #F8F8F8 ;
padding: 8px ;
border: solid #a0a0a0 2px ;
}
.footer {
color: gray ;
font-size: small ;
}
input[type=text] {
border: solid #a0a0a0 2px ;
border-radius: 2em ;
-moz-border-radius: 2em ;
background-image: url('images/search.png') ;
background-repeat: no-repeat;
background-position: 4px center ;
padding-left: 20px ;
height: 2em ;
}
+1 -1
View File
@@ -1,4 +1,4 @@
<!-- $Id: lua.html 23036 2006-09-25 07:35:34Z gmaynard $ --> <!-- $Id: lua.man,v 1.11 2006/01/06 16:03:34 lhf Exp $ -->
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>LUA man page</TITLE> <TITLE>LUA man page</TITLE>
+2 -2
View File
@@ -1,5 +1,5 @@
.\" $Id: luac.1 23036 2006-09-25 07:35:34Z gmaynard $ .\" $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $
.TH LUAC 1 "$Date: 2006-09-25 02:35:34 -0500 (Mon, 25 Sep 2006) $" .TH LUAC 1 "$Date: 2006/01/06 16:03:34 $"
.SH NAME .SH NAME
luac \- Lua compiler luac \- Lua compiler
.SH SYNOPSIS .SH SYNOPSIS
+1 -1
View File
@@ -1,4 +1,4 @@
<!-- $Id: luac.html 23036 2006-09-25 07:35:34Z gmaynard $ --> <!-- $Id: luac.man,v 1.28 2006/01/06 16:03:34 lhf Exp $ -->
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>LUAC man page</TITLE> <TITLE>LUAC man page</TITLE>
+24
View File
@@ -0,0 +1,24 @@
h3 code {
font-family: inherit ;
font-size: inherit ;
}
pre, code {
font-size: 12pt ;
}
span.apii {
float: right ;
font-family: inherit ;
font-style: normal ;
font-size: small ;
color: gray ;
}
p+h1, ul+h1 {
padding-top: 0.4em ;
padding-bottom: 0.4em ;
padding-left: 30px ;
margin-left: -30px ;
background-color: #E0E0FF ;
}
+897 -549
View File
File diff suppressed because it is too large Load Diff
+11 -3
View File
@@ -4,7 +4,7 @@
<LINK REL="stylesheet" TYPE="text/css" HREF="lua.css"> <LINK REL="stylesheet" TYPE="text/css" HREF="lua.css">
</HEAD> </HEAD>
<BODY BGCOLOR="#FFFFFF"> <BODY>
<HR> <HR>
<H1> <H1>
@@ -12,8 +12,9 @@
Documentation Documentation
</H1> </H1>
This is the documentation included in the source distribution of Lua 5.1.5.
<UL> <UL>
<LI><A HREF="http://www.lua.org/">Official web site</A>
<LI><A HREF="contents.html">Reference manual</A> <LI><A HREF="contents.html">Reference manual</A>
<LI><A HREF="lua.html">lua man page</A> <LI><A HREF="lua.html">lua man page</A>
<LI><A HREF="luac.html">luac man page</A> <LI><A HREF="luac.html">luac man page</A>
@@ -22,10 +23,17 @@ Documentation
<LI><A HREF="../test/README">lua/test/README</A> <LI><A HREF="../test/README">lua/test/README</A>
</UL> </UL>
Lua's
<A HREF="http://www.lua.org/">official web site</A>
contains updated documentation,
especially the
<A HREF="http://www.lua.org/manual/5.1/">reference manual</A>.
<P>
<HR> <HR>
<SMALL> <SMALL>
Last update: Last update:
Wed Sep 7 12:57:50 BRST 2005 Fri Feb 3 09:44:42 BRST 2012
</SMALL> </SMALL>
</BODY> </BODY>
+1
View File
@@ -20,6 +20,7 @@ lua.pc
luavs.bat luavs.bat
Script to build Lua under "Visual Studio .NET Command Prompt". Script to build Lua under "Visual Studio .NET Command Prompt".
Run it from the toplevel as etc\luavs.bat.
min.c min.c
A minimal Lua interpreter. A minimal Lua interpreter.
+1 -1
View File
@@ -5,7 +5,7 @@
# grep '^V=' ../Makefile # grep '^V=' ../Makefile
V= 5.1 V= 5.1
# grep '^R=' ../Makefile # grep '^R=' ../Makefile
R= 5.1.1 R= 5.1.5
# grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/' # grep '^INSTALL_.*=' ../Makefile | sed 's/INSTALL_TOP/prefix/'
prefix= /usr/local prefix= /usr/local
+25 -4
View File
@@ -1,7 +1,28 @@
@rem Script to build Lua under "Visual Studio .NET Command Prompt".
@rem Do not run from this directory; run it from the toplevel: etc\luavs.bat .
@rem It creates lua51.dll, lua51.lib, lua.exe, and luac.exe in src.
@rem (contributed by David Manura and Mike Pall)
@setlocal
@set MYCOMPILE=cl /nologo /MD /O2 /W3 /c /D_CRT_SECURE_NO_DEPRECATE
@set MYLINK=link /nologo
@set MYMT=mt /nologo
cd src cd src
cl /O2 /W3 /c /DLUA_BUILD_AS_DLL l*.c %MYCOMPILE% /DLUA_BUILD_AS_DLL l*.c
del lua.obj luac.obj del lua.obj luac.obj
link /DLL /out:lua51.dll l*.obj %MYLINK% /DLL /out:lua51.dll l*.obj
cl /O2 /W3 /c /DLUA_BUILD_AS_DLL lua.c if exist lua51.dll.manifest^
link /out:lua.exe lua.obj lua51.lib %MYMT% -manifest lua51.dll.manifest -outputresource:lua51.dll;2
%MYCOMPILE% /DLUA_BUILD_AS_DLL lua.c
%MYLINK% /out:lua.exe lua.obj lua51.lib
if exist lua.exe.manifest^
%MYMT% -manifest lua.exe.manifest -outputresource:lua.exe
%MYCOMPILE% l*.c print.c
del lua.obj linit.obj lbaselib.obj ldblib.obj liolib.obj lmathlib.obj^
loslib.obj ltablib.obj lstrlib.obj loadlib.obj
%MYLINK% /out:luac.exe *.obj
if exist luac.exe.manifest^
%MYMT% -manifest luac.exe.manifest -outputresource:luac.exe
del *.obj *.manifest
cd .. cd ..
+1 -1
View File
@@ -18,7 +18,7 @@ static int print(lua_State *L)
if (i>1) printf("\t"); if (i>1) printf("\t");
if (lua_isstring(L,i)) if (lua_isstring(L,i))
printf("%s",lua_tostring(L,i)); printf("%s",lua_tostring(L,i));
else if (lua_isnil(L,i)==2) else if (lua_isnil(L,i))
printf("%s","nil"); printf("%s","nil");
else if (lua_isboolean(L,i)) else if (lua_isboolean(L,i))
printf("%s",lua_toboolean(L,i) ? "true" : "false"); printf("%s",lua_toboolean(L,i) ? "true" : "false");
+9 -2
View File
@@ -6,6 +6,8 @@
-- anywhere or assigned to inside a function. -- anywhere or assigned to inside a function.
-- --
local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget
local mt = getmetatable(_G) local mt = getmetatable(_G)
if mt == nil then if mt == nil then
mt = {} mt = {}
@@ -14,9 +16,14 @@ end
mt.__declared = {} mt.__declared = {}
local function what ()
local d = getinfo(3, "S")
return d and d.what or "C"
end
mt.__newindex = function (t, n, v) mt.__newindex = function (t, n, v)
if not mt.__declared[n] then if not mt.__declared[n] then
local w = debug.getinfo(2, "S").what local w = what()
if w ~= "main" and w ~= "C" then if w ~= "main" and w ~= "C" then
error("assign to undeclared variable '"..n.."'", 2) error("assign to undeclared variable '"..n.."'", 2)
end end
@@ -26,7 +33,7 @@ mt.__newindex = function (t, n, v)
end end
mt.__index = function (t, n) mt.__index = function (t, n)
if not mt.__declared[n] and debug.getinfo(2, "S").what ~= "C" then if not mt.__declared[n] and what() ~= "C" then
error("variable '"..n.."' is not declared", 2) error("variable '"..n.."' is not declared", 2)
end end
return rawget(t, n) return rawget(t, n)
+16 -9
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lapi.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lapi.c,v 2.55.1.5 2008/07/04 18:41:18 roberto Exp $
** Lua API ** Lua API
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -93,15 +93,14 @@ void luaA_pushobject (lua_State *L, const TValue *o) {
LUA_API int lua_checkstack (lua_State *L, int size) { LUA_API int lua_checkstack (lua_State *L, int size) {
int res; int res = 1;
lua_lock(L); lua_lock(L);
if ((L->top - L->base + size) > LUAI_MAXCSTACK) if (size > LUAI_MAXCSTACK || (L->top - L->base + size) > LUAI_MAXCSTACK)
res = 0; /* stack overflow */ res = 0; /* stack overflow */
else { else if (size > 0) {
luaD_checkstack(L, size); luaD_checkstack(L, size);
if (L->ci->top < L->top + size) if (L->ci->top < L->top + size)
L->ci->top = L->top + size; L->ci->top = L->top + size;
res = 1;
} }
lua_unlock(L); lua_unlock(L);
return res; return res;
@@ -123,6 +122,11 @@ LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) {
} }
LUA_API void lua_setlevel (lua_State *from, lua_State *to) {
to->nCcalls = from->nCcalls;
}
LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) {
lua_CFunction old; lua_CFunction old;
lua_lock(L); lua_lock(L);
@@ -749,7 +753,7 @@ LUA_API int lua_setfenv (lua_State *L, int idx) {
res = 0; res = 0;
break; break;
} }
luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1)); if (res) luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
L->top--; L->top--;
lua_unlock(L); lua_unlock(L);
return res; return res;
@@ -925,10 +929,13 @@ LUA_API int lua_gc (lua_State *L, int what, int data) {
g->GCthreshold = g->totalbytes - a; g->GCthreshold = g->totalbytes - a;
else else
g->GCthreshold = 0; g->GCthreshold = 0;
while (g->GCthreshold <= g->totalbytes) while (g->GCthreshold <= g->totalbytes) {
luaC_step(L); luaC_step(L);
if (g->gcstate == GCSpause) /* end of cycle? */ if (g->gcstate == GCSpause) { /* end of cycle? */
res = 1; /* signal it */ res = 1; /* signal it */
break;
}
}
break; break;
} }
case LUA_GCSETPAUSE: { case LUA_GCSETPAUSE: {
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lapi.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lapi.h,v 2.2.1.1 2007/12/27 13:02:25 roberto Exp $
** Auxiliary functions from Lua API ** Auxiliary functions from Lua API
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+6 -7
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lauxlib.c 23349 2006-10-05 02:43:36Z gmaynard $ ** $Id: lauxlib.c,v 1.159.1.3 2008/01/21 13:20:51 roberto Exp $
** Auxiliary functions for building Lua libraries ** Auxiliary functions for building Lua libraries
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -252,7 +252,7 @@ LUALIB_API void luaI_openlib (lua_State *L, const char *libname,
if (libname) { if (libname) {
int size = libsize(l); int size = libsize(l);
/* check whether lib already exists */ /* check whether lib already exists */
luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", size); luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 1);
lua_getfield(L, -1, libname); /* get _LOADED[libname] */ lua_getfield(L, -1, libname); /* get _LOADED[libname] */
if (!lua_istable(L, -1)) { /* not found? */ if (!lua_istable(L, -1)) { /* not found? */
lua_pop(L, 1); /* remove previous result */ lua_pop(L, 1); /* remove previous result */
@@ -543,7 +543,7 @@ static const char *getF (lua_State *L, void *ud, size_t *size) {
return "\n"; return "\n";
} }
if (feof(lf->f)) return NULL; if (feof(lf->f)) return NULL;
*size = fread(lf->buff, 1, LUAL_BUFFERSIZE, lf->f); *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f);
return (*size > 0) ? lf->buff : NULL; return (*size > 0) ? lf->buff : NULL;
} }
@@ -578,9 +578,8 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */ while ((c = getc(lf.f)) != EOF && c != '\n') ; /* skip first line */
if (c == '\n') c = getc(lf.f); if (c == '\n') c = getc(lf.f);
} }
if (c == LUA_SIGNATURE[0] && lf.f != stdin) { /* binary file? */ if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */
fclose(lf.f); lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
lf.f = fopen(filename, "rb"); /* reopen in binary mode */
if (lf.f == NULL) return errfile(L, "reopen", fnameindex); if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
/* skip eventual `#!...' */ /* skip eventual `#!...' */
while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ; while ((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) ;
@@ -589,7 +588,7 @@ LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) {
ungetc(c, lf.f); ungetc(c, lf.f);
status = lua_load(L, getF, &lf, lua_tostring(L, -1)); status = lua_load(L, getF, &lf, lua_tostring(L, -1));
readstatus = ferror(lf.f); readstatus = ferror(lf.f);
if (lf.f != stdin) fclose(lf.f); /* close file (even in case of errors) */ if (filename) fclose(lf.f); /* close file (even in case of errors) */
if (readstatus) { if (readstatus) {
lua_settop(L, fnameindex); /* ignore results from `lua_load' */ lua_settop(L, fnameindex); /* ignore results from `lua_load' */
return errfile(L, "read", fnameindex); return errfile(L, "read", fnameindex);
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lauxlib.h 23349 2006-10-05 02:43:36Z gmaynard $ ** $Id: lauxlib.h,v 1.88.1.1 2007/12/27 13:02:25 roberto Exp $
** Auxiliary functions for building Lua libraries ** Auxiliary functions for building Lua libraries
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+54 -42
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lbaselib.c 23613 2006-10-15 21:01:34Z gmaynard $ ** $Id: lbaselib.c,v 1.191.1.6 2008/02/14 16:46:22 roberto Exp $
** Basic library ** Basic library
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -114,11 +114,11 @@ static int luaB_setmetatable (lua_State *L) {
} }
static void getfunc (lua_State *L) { static void getfunc (lua_State *L, int opt) {
if (lua_isfunction(L, 1)) lua_pushvalue(L, 1); if (lua_isfunction(L, 1)) lua_pushvalue(L, 1);
else { else {
lua_Debug ar; lua_Debug ar;
int level = luaL_optint(L, 1, 1); int level = opt ? luaL_optint(L, 1, 1) : luaL_checkint(L, 1);
luaL_argcheck(L, level >= 0, 1, "level must be non-negative"); luaL_argcheck(L, level >= 0, 1, "level must be non-negative");
if (lua_getstack(L, level, &ar) == 0) if (lua_getstack(L, level, &ar) == 0)
luaL_argerror(L, 1, "invalid level"); luaL_argerror(L, 1, "invalid level");
@@ -131,7 +131,7 @@ static void getfunc (lua_State *L) {
static int luaB_getfenv (lua_State *L) { static int luaB_getfenv (lua_State *L) {
getfunc(L); getfunc(L, 1);
if (lua_iscfunction(L, -1)) /* is a C function? */ if (lua_iscfunction(L, -1)) /* is a C function? */
lua_pushvalue(L, LUA_GLOBALSINDEX); /* return the thread's global env. */ lua_pushvalue(L, LUA_GLOBALSINDEX); /* return the thread's global env. */
else else
@@ -142,7 +142,7 @@ static int luaB_getfenv (lua_State *L) {
static int luaB_setfenv (lua_State *L) { static int luaB_setfenv (lua_State *L) {
luaL_checktype(L, 2, LUA_TTABLE); luaL_checktype(L, 2, LUA_TTABLE);
getfunc(L); getfunc(L, 0);
lua_pushvalue(L, 2); lua_pushvalue(L, 2);
if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) { if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) {
/* change environment of current thread */ /* change environment of current thread */
@@ -344,10 +344,12 @@ static int luaB_unpack (lua_State *L) {
luaL_checktype(L, 1, LUA_TTABLE); luaL_checktype(L, 1, LUA_TTABLE);
i = luaL_optint(L, 2, 1); i = luaL_optint(L, 2, 1);
e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1)); e = luaL_opt(L, luaL_checkint, 3, luaL_getn(L, 1));
if (i > e) return 0; /* empty range */
n = e - i + 1; /* number of elements */ n = e - i + 1; /* number of elements */
if (n <= 0) return 0; /* empty range */ if (n <= 0 || !lua_checkstack(L, n)) /* n <= 0 means arith. overflow */
luaL_checkstack(L, n, "table too big to unpack"); return luaL_error(L, "too many results to unpack");
for (; i<=e; i++) /* push arg[i...e] */ lua_rawgeti(L, 1, i); /* push arg[i] (avoiding overflow problems) */
while (i++ < e) /* push arg[i + 1...e] */
lua_rawgeti(L, 1, i); lua_rawgeti(L, 1, i);
return n; return n;
} }
@@ -477,19 +479,56 @@ static const luaL_Reg base_funcs[] = {
** ======================================================= ** =======================================================
*/ */
#define CO_RUN 0 /* running */
#define CO_SUS 1 /* suspended */
#define CO_NOR 2 /* 'normal' (it resumed another coroutine) */
#define CO_DEAD 3
static const char *const statnames[] =
{"running", "suspended", "normal", "dead"};
static int costatus (lua_State *L, lua_State *co) {
if (L == co) return CO_RUN;
switch (lua_status(co)) {
case LUA_YIELD:
return CO_SUS;
case 0: {
lua_Debug ar;
if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */
return CO_NOR; /* it is running */
else if (lua_gettop(co) == 0)
return CO_DEAD;
else
return CO_SUS; /* initial state */
}
default: /* some error occured */
return CO_DEAD;
}
}
static int luaB_costatus (lua_State *L) {
lua_State *co = lua_tothread(L, 1);
luaL_argcheck(L, co, 1, "coroutine expected");
lua_pushstring(L, statnames[costatus(L, co)]);
return 1;
}
static int auxresume (lua_State *L, lua_State *co, int narg) { static int auxresume (lua_State *L, lua_State *co, int narg) {
int status; int status = costatus(L, co);
if (!lua_checkstack(co, narg)) if (!lua_checkstack(co, narg))
luaL_error(L, "too many arguments to resume"); luaL_error(L, "too many arguments to resume");
if (lua_status(co) == 0 && lua_gettop(co) == 0) { if (status != CO_SUS) {
lua_pushliteral(L, "cannot resume dead coroutine"); lua_pushfstring(L, "cannot resume %s coroutine", statnames[status]);
return -1; /* error flag */ return -1; /* error flag */
} }
lua_xmove(L, co, narg); lua_xmove(L, co, narg);
lua_setlevel(L, co);
status = lua_resume(co, narg); status = lua_resume(co, narg);
if (status == 0 || status == LUA_YIELD) { if (status == 0 || status == LUA_YIELD) {
int nres = lua_gettop(co); int nres = lua_gettop(co);
if (!lua_checkstack(L, nres)) if (!lua_checkstack(L, nres + 1))
luaL_error(L, "too many results to resume"); luaL_error(L, "too many results to resume");
lua_xmove(co, L, nres); /* move yielded values */ lua_xmove(co, L, nres); /* move yielded values */
return nres; return nres;
@@ -556,36 +595,9 @@ static int luaB_yield (lua_State *L) {
} }
static int luaB_costatus (lua_State *L) {
lua_State *co = lua_tothread(L, 1);
luaL_argcheck(L, co, 1, "coroutine expected");
if (L == co) lua_pushliteral(L, "running");
else {
switch (lua_status(co)) {
case LUA_YIELD:
lua_pushliteral(L, "suspended");
break;
case 0: {
lua_Debug ar;
if (lua_getstack(co, 0, &ar) > 0) /* does it have frames? */
lua_pushliteral(L, "normal"); /* it is running */
else if (lua_gettop(co) == 0)
lua_pushliteral(L, "dead");
else
lua_pushliteral(L, "suspended"); /* initial state */
break;
}
default: /* some error occured */
lua_pushliteral(L, "dead");
break;
}
}
return 1;
}
static int luaB_corunning (lua_State *L) { static int luaB_corunning (lua_State *L) {
lua_pushthread(L); if (lua_pushthread(L))
lua_pushnil(L); /* main thread is not a coroutine */
return 1; return 1;
} }
@@ -619,7 +631,7 @@ static void base_open (lua_State *L) {
luaL_register(L, "_G", base_funcs); luaL_register(L, "_G", base_funcs);
lua_pushliteral(L, LUA_VERSION); lua_pushliteral(L, LUA_VERSION);
lua_setglobal(L, "_VERSION"); /* set global _VERSION */ lua_setglobal(L, "_VERSION"); /* set global _VERSION */
/* `ipairs' and `pairs' need auxliliary functions as upvalues */ /* `ipairs' and `pairs' need auxiliary functions as upvalues */
auxopen(L, "ipairs", luaB_ipairs, ipairsaux); auxopen(L, "ipairs", luaB_ipairs, ipairsaux);
auxopen(L, "pairs", luaB_pairs, luaB_next); auxopen(L, "pairs", luaB_pairs, luaB_next);
/* `newproxy' needs a weaktable as upvalue */ /* `newproxy' needs a weaktable as upvalue */
+31 -23
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lcode.c 25893 2007-04-21 20:08:12Z stevecheckoway $ ** $Id: lcode.c,v 2.25.1.5 2011/01/31 14:53:16 roberto Exp $
** Code generator for Lua ** Code generator for Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -35,15 +35,20 @@ static int isnumeral(expdesc *e) {
void luaK_nil (FuncState *fs, int from, int n) { void luaK_nil (FuncState *fs, int from, int n) {
Instruction *previous; Instruction *previous;
if (fs->pc > fs->lasttarget) { /* no jumps to current position? */ if (fs->pc > fs->lasttarget) { /* no jumps to current position? */
if (fs->pc == 0) /* function start? */ if (fs->pc == 0) { /* function start? */
return; /* positions are already clean */ if (from >= fs->nactvar)
if (GET_OPCODE(*(previous = &fs->f->code[fs->pc-1])) == OP_LOADNIL) { return; /* positions are already clean */
int pfrom = GETARG_A(*previous); }
int pto = GETARG_B(*previous); else {
if (pfrom <= from && from <= pto+1) { /* can connect both? */ previous = &fs->f->code[fs->pc-1];
if (from+n-1 > pto) if (GET_OPCODE(*previous) == OP_LOADNIL) {
SETARG_B(*previous, from+n-1); int pfrom = GETARG_A(*previous);
return; int pto = GETARG_B(*previous);
if (pfrom <= from && from <= pto+1) { /* can connect both? */
if (from+n-1 > pto)
SETARG_B(*previous, from+n-1);
return;
}
} }
} }
} }
@@ -539,10 +544,6 @@ void luaK_goiftrue (FuncState *fs, expdesc *e) {
pc = NO_JUMP; /* always true; do nothing */ pc = NO_JUMP; /* always true; do nothing */
break; break;
} }
case VFALSE: {
pc = luaK_jump(fs); /* always jump */
break;
}
case VJMP: { case VJMP: {
invertjump(fs, e); invertjump(fs, e);
pc = e->u.s.info; pc = e->u.s.info;
@@ -567,10 +568,6 @@ static void luaK_goiffalse (FuncState *fs, expdesc *e) {
pc = NO_JUMP; /* always false; do nothing */ pc = NO_JUMP; /* always false; do nothing */
break; break;
} }
case VTRUE: {
pc = luaK_jump(fs); /* always jump */
break;
}
case VJMP: { case VJMP: {
pc = e->u.s.info; pc = e->u.s.info;
break; break;
@@ -657,10 +654,16 @@ static void codearith (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
if (constfolding(op, e1, e2)) if (constfolding(op, e1, e2))
return; return;
else { else {
int o1 = luaK_exp2RK(fs, e1);
int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0; int o2 = (op != OP_UNM && op != OP_LEN) ? luaK_exp2RK(fs, e2) : 0;
freeexp(fs, e2); int o1 = luaK_exp2RK(fs, e1);
freeexp(fs, e1); if (o1 > o2) {
freeexp(fs, e1);
freeexp(fs, e2);
}
else {
freeexp(fs, e2);
freeexp(fs, e1);
}
e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2); e1->u.s.info = luaK_codeABC(fs, op, 0, o1, o2);
e1->k = VRELOCABLE; e1->k = VRELOCABLE;
} }
@@ -688,7 +691,7 @@ void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) {
e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0; e2.t = e2.f = NO_JUMP; e2.k = VKNUM; e2.u.nval = 0;
switch (op) { switch (op) {
case OPR_MINUS: { case OPR_MINUS: {
if (e->k == VK) if (!isnumeral(e))
luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */ luaK_exp2anyreg(fs, e); /* cannot operate on non-numeric constants */
codearith(fs, OP_UNM, e, &e2); codearith(fs, OP_UNM, e, &e2);
break; break;
@@ -718,10 +721,15 @@ void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) {
luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */
break; break;
} }
default: { case OPR_ADD: case OPR_SUB: case OPR_MUL: case OPR_DIV:
case OPR_MOD: case OPR_POW: {
if (!isnumeral(v)) luaK_exp2RK(fs, v); if (!isnumeral(v)) luaK_exp2RK(fs, v);
break; break;
} }
default: {
luaK_exp2RK(fs, v);
break;
}
} }
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lcode.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lcode.h,v 1.48.1.1 2007/12/27 13:02:25 roberto Exp $
** Code generator for Lua ** Code generator for Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+16 -15
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ldblib.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ldblib.c,v 1.104.1.4 2009/08/04 18:50:18 roberto Exp $
** Interface from Lua to its debug API ** Interface from Lua to its debug API
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -45,6 +45,7 @@ static int db_setmetatable (lua_State *L) {
static int db_getfenv (lua_State *L) { static int db_getfenv (lua_State *L) {
luaL_checkany(L, 1);
lua_getfenv(L, 1); lua_getfenv(L, 1);
return 1; return 1;
} }
@@ -255,24 +256,25 @@ static void gethooktable (lua_State *L) {
static int db_sethook (lua_State *L) { static int db_sethook (lua_State *L) {
int arg; int arg, mask, count;
lua_Hook func;
lua_State *L1 = getthread(L, &arg); lua_State *L1 = getthread(L, &arg);
if (lua_isnoneornil(L, arg+1)) { if (lua_isnoneornil(L, arg+1)) {
lua_settop(L, arg+1); lua_settop(L, arg+1);
lua_sethook(L1, NULL, 0, 0); /* turn off hooks */ func = NULL; mask = 0; count = 0; /* turn off hooks */
} }
else { else {
const char *smask = luaL_checkstring(L, arg+2); const char *smask = luaL_checkstring(L, arg+2);
int count = luaL_optint(L, arg+3, 0);
luaL_checktype(L, arg+1, LUA_TFUNCTION); luaL_checktype(L, arg+1, LUA_TFUNCTION);
lua_sethook(L1, hookf, makemask(smask, count), count); count = luaL_optint(L, arg+3, 0);
func = hookf; mask = makemask(smask, count);
} }
gethooktable(L1); gethooktable(L);
lua_pushlightuserdata(L1, L1); lua_pushlightuserdata(L, L1);
lua_pushvalue(L, arg+1); lua_pushvalue(L, arg+1);
lua_xmove(L, L1, 1); lua_rawset(L, -3); /* set new hook */
lua_rawset(L1, -3); /* set new hook */ lua_pop(L, 1); /* remove hook table */
lua_pop(L1, 1); /* remove hook table */ lua_sethook(L1, func, mask, count); /* set hooks */
return 0; return 0;
} }
@@ -286,11 +288,10 @@ static int db_gethook (lua_State *L) {
if (hook != NULL && hook != hookf) /* external hook? */ if (hook != NULL && hook != hookf) /* external hook? */
lua_pushliteral(L, "external hook"); lua_pushliteral(L, "external hook");
else { else {
gethooktable(L1); gethooktable(L);
lua_pushlightuserdata(L1, L1); lua_pushlightuserdata(L, L1);
lua_rawget(L1, -2); /* get hook */ lua_rawget(L, -2); /* get hook */
lua_remove(L1, -2); /* remove hook table */ lua_remove(L, -2); /* remove hook table */
lua_xmove(L1, L, 1);
} }
lua_pushstring(L, unmakemask(mask, buff)); lua_pushstring(L, unmakemask(mask, buff));
lua_pushinteger(L, lua_gethookcount(L1)); lua_pushinteger(L, lua_gethookcount(L1));
+32 -14
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ldebug.c 25893 2007-04-21 20:08:12Z stevecheckoway $ ** $Id: ldebug.c,v 2.29.1.6 2008/05/08 16:56:26 roberto Exp $
** Debug Interface ** Debug Interface
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -275,12 +275,12 @@ LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) {
static int precheck (const Proto *pt) { static int precheck (const Proto *pt) {
check(pt->maxstacksize <= MAXSTACK); check(pt->maxstacksize <= MAXSTACK);
lua_assert(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize); check(pt->numparams+(pt->is_vararg & VARARG_HASARG) <= pt->maxstacksize);
lua_assert(!(pt->is_vararg & VARARG_NEEDSARG) || check(!(pt->is_vararg & VARARG_NEEDSARG) ||
(pt->is_vararg & VARARG_HASARG)); (pt->is_vararg & VARARG_HASARG));
check(pt->sizeupvalues <= pt->nups); check(pt->sizeupvalues <= pt->nups);
check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0);
check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); check(pt->sizecode > 0 && GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN);
return 1; return 1;
} }
@@ -346,9 +346,18 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
int dest = pc+1+b; int dest = pc+1+b;
check(0 <= dest && dest < pt->sizecode); check(0 <= dest && dest < pt->sizecode);
if (dest > 0) { if (dest > 0) {
/* cannot jump to a setlist count */ int j;
Instruction d = pt->code[dest-1]; /* check that it does not jump to a setlist count; this
check(!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)); is tricky, because the count from a previous setlist may
have the same value of an invalid setlist; so, we must
go all the way back to the first of them (if any) */
for (j = 0; j < dest; j++) {
Instruction d = pt->code[dest-1-j];
if (!(GET_OPCODE(d) == OP_SETLIST && GETARG_C(d) == 0)) break;
}
/* if 'j' is even, previous value is not a setlist (even if
it looks like one) */
check((j&1) == 0);
} }
} }
break; break;
@@ -363,7 +372,11 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
} }
switch (op) { switch (op) {
case OP_LOADBOOL: { case OP_LOADBOOL: {
check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ if (c == 1) { /* does it jump? */
check(pc+2 < pt->sizecode); /* check its jump */
check(GET_OPCODE(pt->code[pc+1]) != OP_SETLIST ||
GETARG_C(pt->code[pc+1]) != 0);
}
break; break;
} }
case OP_LOADNIL: { case OP_LOADNIL: {
@@ -428,18 +441,23 @@ static Instruction symbexec (const Proto *pt, int lastpc, int reg) {
} }
case OP_SETLIST: { case OP_SETLIST: {
if (b > 0) checkreg(pt, a + b); if (b > 0) checkreg(pt, a + b);
if (c == 0) pc++; if (c == 0) {
pc++;
check(pc < pt->sizecode - 1);
}
break; break;
} }
case OP_CLOSURE: { case OP_CLOSURE: {
int nup; int nup, j;
check(b < pt->sizep); check(b < pt->sizep);
nup = pt->p[b]->nups; nup = pt->p[b]->nups;
check(pc + nup < pt->sizecode); check(pc + nup < pt->sizecode);
for (; nup>0; nup--) { for (j = 1; j <= nup; j++) {
OpCode op1 = GET_OPCODE(pt->code[pc+nup]); OpCode op1 = GET_OPCODE(pt->code[pc + j]);
check(op1 == OP_GETUPVAL || op1 == OP_MOVE); check(op1 == OP_GETUPVAL || op1 == OP_MOVE);
} }
if (reg != NO_REG) /* tracing? */
pc += nup; /* do not 'execute' these pseudo-instructions */
break; break;
} }
case OP_VARARG: { case OP_VARARG: {
@@ -561,8 +579,8 @@ void luaG_typeerror (lua_State *L, const TValue *o, const char *op) {
void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { void luaG_concaterror (lua_State *L, StkId p1, StkId p2) {
if (ttisstring(p1)) p1 = p2; if (ttisstring(p1) || ttisnumber(p1)) p1 = p2;
lua_assert(!ttisstring(p1)); lua_assert(!ttisstring(p1) && !ttisnumber(p1));
luaG_typeerror(L, p1, "concatenate"); luaG_typeerror(L, p1, "concatenate");
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ldebug.h 25893 2007-04-21 20:08:12Z stevecheckoway $ ** $Id: ldebug.h,v 2.3.1.1 2007/12/27 13:02:25 roberto Exp $
** Auxiliary functions from Debug Interface module ** Auxiliary functions from Debug Interface module
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+14 -11
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ldo.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ldo.c,v 2.38.1.4 2012/01/18 02:27:10 roberto Exp $
** Stack and Call structure of Lua ** Stack and Call structure of Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -83,7 +83,7 @@ static void resetstack (lua_State *L, int status) {
L->base = L->ci->base; L->base = L->ci->base;
luaF_close(L, L->base); /* close eventual pending closures */ luaF_close(L, L->base); /* close eventual pending closures */
luaD_seterrorobj(L, status, L->base); luaD_seterrorobj(L, status, L->base);
L->nCcalls = 0; L->nCcalls = L->baseCcalls;
L->allowhook = 1; L->allowhook = 1;
restore_stack_limit(L); restore_stack_limit(L);
L->errfunc = 0; L->errfunc = 0;
@@ -217,6 +217,7 @@ static StkId adjust_varargs (lua_State *L, Proto *p, int actual) {
int nvar = actual - nfixargs; /* number of extra arguments */ int nvar = actual - nfixargs; /* number of extra arguments */
lua_assert(p->is_vararg & VARARG_HASARG); lua_assert(p->is_vararg & VARARG_HASARG);
luaC_checkGC(L); luaC_checkGC(L);
luaD_checkstack(L, p->maxstacksize);
htab = luaH_new(L, nvar, 1); /* create `arg' table */ htab = luaH_new(L, nvar, 1); /* create `arg' table */
for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */ for (i=0; i<nvar; i++) /* put extra arguments into `arg' table */
setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i); setobj2n(L, luaH_setnum(L, htab, i+1), L->top - nvar + i);
@@ -332,7 +333,7 @@ static StkId callrethooks (lua_State *L, StkId firstResult) {
ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */
luaD_callhook(L, LUA_HOOKRET, -1); luaD_callhook(L, LUA_HOOKRET, -1);
if (f_isLua(L->ci)) { /* Lua function? */ if (f_isLua(L->ci)) { /* Lua function? */
while (L->ci->tailcalls--) /* call hook for eventual tail calls */ while ((L->hookmask & LUA_MASKRET) && L->ci->tailcalls--) /* tail calls */
luaD_callhook(L, LUA_HOOKTAILRET, -1); luaD_callhook(L, LUA_HOOKTAILRET, -1);
} }
return restorestack(L, fr); return restorestack(L, fr);
@@ -417,22 +418,24 @@ static int resume_error (lua_State *L, const char *msg) {
LUA_API int lua_resume (lua_State *L, int nargs) { LUA_API int lua_resume (lua_State *L, int nargs) {
int status; int status;
lua_lock(L); lua_lock(L);
if (L->status != LUA_YIELD) { if (L->status != LUA_YIELD && (L->status != 0 || L->ci != L->base_ci))
if (L->status != 0)
return resume_error(L, "cannot resume dead coroutine");
else if (L->ci != L->base_ci)
return resume_error(L, "cannot resume non-suspended coroutine"); return resume_error(L, "cannot resume non-suspended coroutine");
} if (L->nCcalls >= LUAI_MAXCCALLS)
return resume_error(L, "C stack overflow");
luai_userstateresume(L, nargs); luai_userstateresume(L, nargs);
lua_assert(L->errfunc == 0 && L->nCcalls == 0); lua_assert(L->errfunc == 0);
L->baseCcalls = ++L->nCcalls;
status = luaD_rawrunprotected(L, resume, L->top - nargs); status = luaD_rawrunprotected(L, resume, L->top - nargs);
if (status != 0) { /* error? */ if (status != 0) { /* error? */
L->status = cast_byte(status); /* mark thread as `dead' */ L->status = cast_byte(status); /* mark thread as `dead' */
luaD_seterrorobj(L, status, L->top); luaD_seterrorobj(L, status, L->top);
L->ci->top = L->top; L->ci->top = L->top;
} }
else else {
lua_assert(L->nCcalls == L->baseCcalls);
status = L->status; status = L->status;
}
--L->nCcalls;
lua_unlock(L); lua_unlock(L);
return status; return status;
} }
@@ -441,7 +444,7 @@ LUA_API int lua_resume (lua_State *L, int nargs) {
LUA_API int lua_yield (lua_State *L, int nresults) { LUA_API int lua_yield (lua_State *L, int nresults) {
luai_userstateyield(L, nresults); luai_userstateyield(L, nresults);
lua_lock(L); lua_lock(L);
if (L->nCcalls > 0) if (L->nCcalls > L->baseCcalls)
luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
L->base = L->top - nresults; /* protect stack slots below */ L->base = L->top - nresults; /* protect stack slots below */
L->status = LUA_YIELD; L->status = LUA_YIELD;
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ldo.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ldo.h,v 2.7.1.1 2007/12/27 13:02:25 roberto Exp $
** Stack and Call structure of Lua ** Stack and Call structure of Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ldump.c 25893 2007-04-21 20:08:12Z stevecheckoway $ ** $Id: ldump.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
** save precompiled Lua chunks ** save precompiled Lua chunks
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+3 -3
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lfunc.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lfunc.c,v 2.12.1.2 2007/12/28 14:58:43 roberto Exp $
** Auxiliary functions to manipulate prototypes and closures ** Auxiliary functions to manipulate prototypes and closures
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -55,7 +55,7 @@ UpVal *luaF_findupval (lua_State *L, StkId level) {
GCObject **pp = &L->openupval; GCObject **pp = &L->openupval;
UpVal *p; UpVal *p;
UpVal *uv; UpVal *uv;
while ((p = ngcotouv(*pp)) != NULL && p->v >= level) { while (*pp != NULL && (p = ngcotouv(*pp))->v >= level) {
lua_assert(p->v != &p->u.value); lua_assert(p->v != &p->u.value);
if (p->v == level) { /* found a corresponding upvalue? */ if (p->v == level) { /* found a corresponding upvalue? */
if (isdead(g, obj2gco(p))) /* is it dead? */ if (isdead(g, obj2gco(p))) /* is it dead? */
@@ -96,7 +96,7 @@ void luaF_freeupval (lua_State *L, UpVal *uv) {
void luaF_close (lua_State *L, StkId level) { void luaF_close (lua_State *L, StkId level) {
UpVal *uv; UpVal *uv;
global_State *g = G(L); global_State *g = G(L);
while ((uv = ngcotouv(L->openupval)) != NULL && uv->v >= level) { while (L->openupval != NULL && (uv = ngcotouv(L->openupval))->v >= level) {
GCObject *o = obj2gco(uv); GCObject *o = obj2gco(uv);
lua_assert(!isblack(o) && uv->v != &uv->u.value); lua_assert(!isblack(o) && uv->v != &uv->u.value);
L->openupval = uv->next; /* remove from `open' list */ L->openupval = uv->next; /* remove from `open' list */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lfunc.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lfunc.h,v 2.4.1.1 2007/12/27 13:02:25 roberto Exp $
** Auxiliary functions to manipulate prototypes and closures ** Auxiliary functions to manipulate prototypes and closures
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -2
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lgc.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lgc.c,v 2.38.1.2 2011/03/18 18:05:38 roberto Exp $
** Garbage Collector ** Garbage Collector
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -627,7 +627,6 @@ void luaC_step (lua_State *L) {
} }
} }
else { else {
lua_assert(g->totalbytes >= g->estimate);
setthreshold(g); setthreshold(g);
} }
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lgc.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lgc.h,v 2.15.1.1 2007/12/27 13:02:25 roberto Exp $
** Garbage Collector ** Garbage Collector
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: linit.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: linit.c,v 1.14.1.1 2007/12/27 13:02:25 roberto Exp $
** Initialization of libraries for lua.c ** Initialization of libraries for lua.c
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+49 -25
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: liolib.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: liolib.c,v 2.73.1.4 2010/05/14 15:33:51 roberto Exp $
** Standard I/O (and system) library ** Standard I/O (and system) library
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -51,7 +51,7 @@ static void fileerror (lua_State *L, int arg, const char *filename) {
} }
#define topfile(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE)) #define tofilep(L) ((FILE **)luaL_checkudata(L, 1, LUA_FILEHANDLE))
static int io_type (lua_State *L) { static int io_type (lua_State *L) {
@@ -70,7 +70,7 @@ static int io_type (lua_State *L) {
static FILE *tofile (lua_State *L) { static FILE *tofile (lua_State *L) {
FILE **f = topfile(L); FILE **f = tofilep(L);
if (*f == NULL) if (*f == NULL)
luaL_error(L, "attempt to use a closed file"); luaL_error(L, "attempt to use a closed file");
return *f; return *f;
@@ -93,19 +93,31 @@ static FILE **newfile (lua_State *L) {
/* /*
** this function has a separated environment, which defines the ** function to (not) close the standard files stdin, stdout, and stderr
** correct __close for 'popen' files */
static int io_noclose (lua_State *L) {
lua_pushnil(L);
lua_pushliteral(L, "cannot close standard file");
return 2;
}
/*
** function to close 'popen' files
*/ */
static int io_pclose (lua_State *L) { static int io_pclose (lua_State *L) {
FILE **p = topfile(L); FILE **p = tofilep(L);
int ok = lua_pclose(L, *p); int ok = lua_pclose(L, *p);
*p = NULL; *p = NULL;
return pushresult(L, ok, NULL); return pushresult(L, ok, NULL);
} }
/*
** function to close regular files
*/
static int io_fclose (lua_State *L) { static int io_fclose (lua_State *L) {
FILE **p = topfile(L); FILE **p = tofilep(L);
int ok = (fclose(*p) == 0); int ok = (fclose(*p) == 0);
*p = NULL; *p = NULL;
return pushresult(L, ok, NULL); return pushresult(L, ok, NULL);
@@ -128,18 +140,18 @@ static int io_close (lua_State *L) {
static int io_gc (lua_State *L) { static int io_gc (lua_State *L) {
FILE *f = *topfile(L); FILE *f = *tofilep(L);
/* ignore closed files and standard files */ /* ignore closed files */
if (f != NULL && f != stdin && f != stdout && f != stderr) if (f != NULL)
aux_close(L); aux_close(L);
return 0; return 0;
} }
static int io_tostring (lua_State *L) { static int io_tostring (lua_State *L) {
FILE *f = *topfile(L); FILE *f = *tofilep(L);
if (f == NULL) if (f == NULL)
lua_pushstring(L, "file (closed)"); lua_pushliteral(L, "file (closed)");
else else
lua_pushfstring(L, "file (%p)", f); lua_pushfstring(L, "file (%p)", f);
return 1; return 1;
@@ -155,6 +167,10 @@ static int io_open (lua_State *L) {
} }
/*
** this function has a separated environment, which defines the
** correct __close for 'popen' files
*/
static int io_popen (lua_State *L) { static int io_popen (lua_State *L) {
const char *filename = luaL_checkstring(L, 1); const char *filename = luaL_checkstring(L, 1);
const char *mode = luaL_optstring(L, 2, "r"); const char *mode = luaL_optstring(L, 2, "r");
@@ -260,7 +276,10 @@ static int read_number (lua_State *L, FILE *f) {
lua_pushnumber(L, d); lua_pushnumber(L, d);
return 1; return 1;
} }
else return 0; /* read fails */ else {
lua_pushnil(L); /* "result" to be removed */
return 0; /* read fails */
}
} }
@@ -280,7 +299,7 @@ static int read_line (lua_State *L, FILE *f) {
char *p = luaL_prepbuffer(&b); char *p = luaL_prepbuffer(&b);
if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */
luaL_pushresult(&b); /* close buffer */ luaL_pushresult(&b); /* close buffer */
return (lua_strlen(L, -1) > 0); /* check whether read something */ return (lua_objlen(L, -1) > 0); /* check whether read something */
} }
l = strlen(p); l = strlen(p);
if (l == 0 || p[l-1] != '\n') if (l == 0 || p[l-1] != '\n')
@@ -308,7 +327,7 @@ static int read_chars (lua_State *L, FILE *f, size_t n) {
n -= nr; /* still have to read `n' chars */ n -= nr; /* still have to read `n' chars */
} while (n > 0 && nr == rlen); /* until end of count or eof */ } while (n > 0 && nr == rlen); /* until end of count or eof */
luaL_pushresult(&b); /* close buffer */ luaL_pushresult(&b); /* close buffer */
return (n == 0 || lua_strlen(L, -1) > 0); return (n == 0 || lua_objlen(L, -1) > 0);
} }
@@ -502,31 +521,36 @@ static void createstdfile (lua_State *L, FILE *f, int k, const char *fname) {
lua_pushvalue(L, -1); lua_pushvalue(L, -1);
lua_rawseti(L, LUA_ENVIRONINDEX, k); lua_rawseti(L, LUA_ENVIRONINDEX, k);
} }
lua_setfield(L, -2, fname); lua_pushvalue(L, -2); /* copy environment */
lua_setfenv(L, -2); /* set it */
lua_setfield(L, -3, fname);
}
static void newfenv (lua_State *L, lua_CFunction cls) {
lua_createtable(L, 0, 1);
lua_pushcfunction(L, cls);
lua_setfield(L, -2, "__close");
} }
LUALIB_API int luaopen_io (lua_State *L) { LUALIB_API int luaopen_io (lua_State *L) {
createmeta(L); createmeta(L);
/* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */ /* create (private) environment (with fields IO_INPUT, IO_OUTPUT, __close) */
lua_createtable(L, 2, 1); newfenv(L, io_fclose);
lua_replace(L, LUA_ENVIRONINDEX); lua_replace(L, LUA_ENVIRONINDEX);
/* open library */ /* open library */
luaL_register(L, LUA_IOLIBNAME, iolib); luaL_register(L, LUA_IOLIBNAME, iolib);
/* create (and set) default files */ /* create (and set) default files */
newfenv(L, io_noclose); /* close function for default files */
createstdfile(L, stdin, IO_INPUT, "stdin"); createstdfile(L, stdin, IO_INPUT, "stdin");
createstdfile(L, stdout, IO_OUTPUT, "stdout"); createstdfile(L, stdout, IO_OUTPUT, "stdout");
createstdfile(L, stderr, 0, "stderr"); createstdfile(L, stderr, 0, "stderr");
/* create environment for 'popen' */ lua_pop(L, 1); /* pop environment for default files */
lua_getfield(L, -1, "popen"); lua_getfield(L, -1, "popen");
lua_createtable(L, 0, 1); newfenv(L, io_pclose); /* create environment for 'popen' */
lua_pushcfunction(L, io_pclose); lua_setfenv(L, -2); /* set fenv for 'popen' */
lua_setfield(L, -2, "__close");
lua_setfenv(L, -2);
lua_pop(L, 1); /* pop 'popen' */ lua_pop(L, 1); /* pop 'popen' */
/* set default close function */
lua_pushcfunction(L, io_fclose);
lua_setfield(L, LUA_ENVIRONINDEX, "__close");
return 1; return 1;
} }
+4 -2
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: llex.c 23491 2006-10-12 09:18:05Z gmaynard $ ** $Id: llex.c,v 2.20.1.2 2009/11/23 14:58:22 roberto Exp $
** Lexical Analyzer ** Lexical Analyzer
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -118,8 +118,10 @@ TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
lua_State *L = ls->L; lua_State *L = ls->L;
TString *ts = luaS_newlstr(L, str, l); TString *ts = luaS_newlstr(L, str, l);
TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */ TValue *o = luaH_setstr(L, ls->fs->h, ts); /* entry for `str' */
if (ttisnil(o)) if (ttisnil(o)) {
setbvalue(o, 1); /* make sure `str' will not be collected */ setbvalue(o, 1); /* make sure `str' will not be collected */
luaC_checkGC(L);
}
return ts; return ts;
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: llex.h 23491 2006-10-12 09:18:05Z gmaynard $ ** $Id: llex.h,v 1.58.1.1 2007/12/27 13:02:25 roberto Exp $
** Lexical Analyzer ** Lexical Analyzer
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: llimits.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: llimits.h,v 1.69.1.1 2007/12/27 13:02:25 roberto Exp $
** Limits, basic types, and some other `installation-dependent' definitions ** Limits, basic types, and some other `installation-dependent' definitions
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lmathlib.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lmathlib.c,v 1.67.1.1 2007/12/27 13:02:25 roberto Exp $
** Standard mathematical library ** Standard mathematical library
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lmem.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lmem.c,v 1.70.1.1 2007/12/27 13:02:25 roberto Exp $
** Interface to Memory Manager ** Interface to Memory Manager
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lmem.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lmem.h,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
** Interface to Memory Manager ** Interface to Memory Manager
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+22 -19
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: loadlib.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: loadlib.c,v 1.52.1.4 2009/09/09 13:17:16 roberto Exp $
** Dynamic library loader for Lua ** Dynamic library loader for Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
** **
@@ -16,9 +16,9 @@
#define loadlib_c #define loadlib_c
#define LUA_LIB #define LUA_LIB
#include "lauxlib.h"
#include "lobject.h"
#include "lua.h" #include "lua.h"
#include "lauxlib.h"
#include "lualib.h" #include "lualib.h"
@@ -98,7 +98,7 @@ static void setprogdir (lua_State *L) {
char buff[MAX_PATH + 1]; char buff[MAX_PATH + 1];
char *lb; char *lb;
DWORD nsize = sizeof(buff)/sizeof(char); DWORD nsize = sizeof(buff)/sizeof(char);
DWORD n = GetModuleFileName(NULL, buff, nsize); DWORD n = GetModuleFileNameA(NULL, buff, nsize);
if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL)
luaL_error(L, "unable to get ModuleFileName"); luaL_error(L, "unable to get ModuleFileName");
else { else {
@@ -112,7 +112,7 @@ static void setprogdir (lua_State *L) {
static void pusherror (lua_State *L) { static void pusherror (lua_State *L) {
int error = GetLastError(); int error = GetLastError();
char buffer[128]; char buffer[128];
if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, error, 0, buffer, sizeof(buffer), NULL)) NULL, error, 0, buffer, sizeof(buffer), NULL))
lua_pushstring(L, buffer); lua_pushstring(L, buffer);
else else
@@ -125,7 +125,7 @@ static void ll_unloadlib (void *lib) {
static void *ll_load (lua_State *L, const char *path) { static void *ll_load (lua_State *L, const char *path) {
HINSTANCE lib = LoadLibrary(path); HINSTANCE lib = LoadLibraryA(path);
if (lib == NULL) pusherror(L); if (lib == NULL) pusherror(L);
return lib; return lib;
} }
@@ -356,15 +356,16 @@ static const char *findfile (lua_State *L, const char *name,
path = lua_tostring(L, -1); path = lua_tostring(L, -1);
if (path == NULL) if (path == NULL)
luaL_error(L, LUA_QL("package.%s") " must be a string", pname); luaL_error(L, LUA_QL("package.%s") " must be a string", pname);
lua_pushstring(L, ""); /* error accumulator */ lua_pushliteral(L, ""); /* error accumulator */
while ((path = pushnexttemplate(L, path)) != NULL) { while ((path = pushnexttemplate(L, path)) != NULL) {
const char *filename; const char *filename;
filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name); filename = luaL_gsub(L, lua_tostring(L, -1), LUA_PATH_MARK, name);
lua_remove(L, -2); /* remove path template */
if (readable(filename)) /* does file exist and is readable? */ if (readable(filename)) /* does file exist and is readable? */
return filename; /* return that file name */ return filename; /* return that file name */
lua_pop(L, 2); /* remove path template and file name */ lua_pushfstring(L, "\n\tno file " LUA_QS, filename);
luaO_pushfstring(L, "\n\tno file " LUA_QS, filename); lua_remove(L, -2); /* remove file name */
lua_concat(L, 2); lua_concat(L, 2); /* add entry to possible error message */
} }
return NULL; /* not found */ return NULL; /* not found */
} }
@@ -423,8 +424,8 @@ static int loader_Croot (lua_State *L) {
funcname = mkfuncname(L, name); funcname = mkfuncname(L, name);
if ((stat = ll_loadfunc(L, filename, funcname)) != 0) { if ((stat = ll_loadfunc(L, filename, funcname)) != 0) {
if (stat != ERRFUNC) loaderror(L, filename); /* real error */ if (stat != ERRFUNC) loaderror(L, filename); /* real error */
luaO_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS, lua_pushfstring(L, "\n\tno module " LUA_QS " in file " LUA_QS,
name, filename); name, filename);
return 1; /* function not found */ return 1; /* function not found */
} }
return 1; return 1;
@@ -438,7 +439,7 @@ static int loader_preload (lua_State *L) {
luaL_error(L, LUA_QL("package.preload") " must be a table"); luaL_error(L, LUA_QL("package.preload") " must be a table");
lua_getfield(L, -1, name); lua_getfield(L, -1, name);
if (lua_isnil(L, -1)) /* not found? */ if (lua_isnil(L, -1)) /* not found? */
luaO_pushfstring(L, "\n\tno field package.preload['%s']", name); lua_pushfstring(L, "\n\tno field package.preload['%s']", name);
return 1; return 1;
} }
@@ -462,7 +463,7 @@ static int ll_require (lua_State *L) {
lua_getfield(L, LUA_ENVIRONINDEX, "loaders"); lua_getfield(L, LUA_ENVIRONINDEX, "loaders");
if (!lua_istable(L, -1)) if (!lua_istable(L, -1))
luaL_error(L, LUA_QL("package.loaders") " must be a table"); luaL_error(L, LUA_QL("package.loaders") " must be a table");
lua_pushstring(L, ""); /* error message accumulator */ lua_pushliteral(L, ""); /* error message accumulator */
for (i=1; ; i++) { for (i=1; ; i++) {
lua_rawgeti(L, -2, i); /* get a loader */ lua_rawgeti(L, -2, i); /* get a loader */
if (lua_isnil(L, -1)) if (lua_isnil(L, -1))
@@ -505,8 +506,10 @@ static int ll_require (lua_State *L) {
static void setfenv (lua_State *L) { static void setfenv (lua_State *L) {
lua_Debug ar; lua_Debug ar;
lua_getstack(L, 1, &ar); if (lua_getstack(L, 1, &ar) == 0 ||
lua_getinfo(L, "f", &ar); lua_getinfo(L, "f", &ar) == 0 || /* get calling function */
lua_iscfunction(L, -1))
luaL_error(L, LUA_QL("module") " not called from a Lua function");
lua_pushvalue(L, -2); lua_pushvalue(L, -2);
lua_setfenv(L, -2); lua_setfenv(L, -2);
lua_pop(L, 1); lua_pop(L, 1);
@@ -636,7 +639,7 @@ LUALIB_API int luaopen_package (lua_State *L) {
lua_pushvalue(L, -1); lua_pushvalue(L, -1);
lua_replace(L, LUA_ENVIRONINDEX); lua_replace(L, LUA_ENVIRONINDEX);
/* create `loaders' table */ /* create `loaders' table */
lua_createtable(L, 0, sizeof(loaders)/sizeof(loaders[0]) - 1); lua_createtable(L, sizeof(loaders)/sizeof(loaders[0]) - 1, 0);
/* fill it with pre-defined loaders */ /* fill it with pre-defined loaders */
for (i=0; loaders[i] != NULL; i++) { for (i=0; loaders[i] != NULL; i++) {
lua_pushcfunction(L, loaders[i]); lua_pushcfunction(L, loaders[i]);
@@ -646,8 +649,8 @@ LUALIB_API int luaopen_package (lua_State *L) {
setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT); /* set field `path' */ setpath(L, "path", LUA_PATH, LUA_PATH_DEFAULT); /* set field `path' */
setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */ setpath(L, "cpath", LUA_CPATH, LUA_CPATH_DEFAULT); /* set field `cpath' */
/* store config information */ /* store config information */
lua_pushstring(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n" lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATHSEP "\n" LUA_PATH_MARK "\n"
LUA_EXECDIR "\n" LUA_IGMARK); LUA_EXECDIR "\n" LUA_IGMARK);
lua_setfield(L, -2, "config"); lua_setfield(L, -2, "config");
/* set field `loaded' */ /* set field `loaded' */
luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2); luaL_findtable(L, LUA_REGISTRYINDEX, "_LOADED", 2);
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lobject.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lobject.c,v 2.22.1.1 2007/12/27 13:02:25 roberto Exp $
** Some generic functions over Lua objects ** Some generic functions over Lua objects
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+2 -2
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lobject.h 25893 2007-04-21 20:08:12Z stevecheckoway $ ** $Id: lobject.h,v 2.20.1.2 2008/08/06 13:29:48 roberto Exp $
** Type definitions for Lua objects ** Type definitions for Lua objects
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -208,7 +208,7 @@ typedef union TString {
#define getstr(ts) cast(const char *, (ts) + 1) #define getstr(ts) cast(const char *, (ts) + 1)
#define svalue(o) getstr(tsvalue(o)) #define svalue(o) getstr(rawtsvalue(o))
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lopcodes.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lopcodes.c,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lopcodes.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lopcodes.h,v 1.125.1.1 2007/12/27 13:02:25 roberto Exp $
** Opcodes for Lua virtual machine ** Opcodes for Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+17 -7
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: loslib.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: loslib.c,v 1.19.1.3 2008/01/18 16:38:18 roberto Exp $
** Standard Operating System library ** Standard Operating System library
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -146,11 +146,22 @@ static int os_date (lua_State *L) {
setboolfield(L, "isdst", stm->tm_isdst); setboolfield(L, "isdst", stm->tm_isdst);
} }
else { else {
char b[256]; char cc[3];
if (strftime(b, sizeof(b), s, stm)) luaL_Buffer b;
lua_pushstring(L, b); cc[0] = '%'; cc[2] = '\0';
else luaL_buffinit(L, &b);
return luaL_error(L, LUA_QL("date") " format too long"); for (; *s; s++) {
if (*s != '%' || *(s + 1) == '\0') /* no conversion specifier? */
luaL_addchar(&b, *s);
else {
size_t reslen;
char buff[200]; /* should be big enough for any conversion result */
cc[1] = *(++s);
reslen = strftime(buff, sizeof(buff), cc, stm);
luaL_addlstring(&b, buff, reslen);
}
}
luaL_pushresult(&b);
} }
return 1; return 1;
} }
@@ -204,7 +215,6 @@ static int os_setlocale (lua_State *L) {
static int os_exit (lua_State *L) { static int os_exit (lua_State *L) {
exit(luaL_optint(L, 1, EXIT_SUCCESS)); exit(luaL_optint(L, 1, EXIT_SUCCESS));
return 0; /* to avoid warnings */
} }
static const luaL_Reg syslib[] = { static const luaL_Reg syslib[] = {
+5 -3
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lparser.c 25896 2007-04-21 20:58:22Z stevecheckoway $ ** $Id: lparser.c,v 2.42.1.4 2011/10/21 19:31:42 roberto Exp $
** Lua Parser ** Lua Parser
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -374,9 +374,9 @@ static void close_func (LexState *ls) {
lua_assert(luaG_checkcode(f)); lua_assert(luaG_checkcode(f));
lua_assert(fs->bl == NULL); lua_assert(fs->bl == NULL);
ls->fs = fs->prev; ls->fs = fs->prev;
L->top -= 2; /* remove table and prototype from the stack */
/* last token read was anchored in defunct function; must reanchor it */ /* last token read was anchored in defunct function; must reanchor it */
if (fs) anchor_token(ls); if (fs) anchor_token(ls);
L->top -= 2; /* remove table and prototype from the stack */
} }
@@ -489,7 +489,7 @@ static void lastlistfield (FuncState *fs, struct ConsControl *cc) {
static void listfield (LexState *ls, struct ConsControl *cc) { static void listfield (LexState *ls, struct ConsControl *cc) {
expr(ls, &cc->v); expr(ls, &cc->v);
luaY_checklimit(ls->fs, cc->na, MAXARG_Bx, "items in a constructor"); luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor");
cc->na++; cc->na++;
cc->tostore++; cc->tostore++;
} }
@@ -1023,6 +1023,8 @@ static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
primaryexp(ls, &nv.v); primaryexp(ls, &nv.v);
if (nv.v.k == VLOCAL) if (nv.v.k == VLOCAL)
check_conflict(ls, lh, &nv.v); check_conflict(ls, lh, &nv.v);
luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls,
"variables in assignment");
assignment(ls, &nv, nvars+1); assignment(ls, &nv, nvars+1);
} }
else { /* assignment -> `=' explist1 */ else { /* assignment -> `=' explist1 */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lparser.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lparser.h,v 1.57.1.1 2007/12/27 13:02:25 roberto Exp $
** Lua Parser ** Lua Parser
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+3 -3
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lstate.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lstate.c,v 2.36.1.2 2008/01/03 15:20:39 roberto Exp $
** Global State ** Global State
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -93,7 +93,7 @@ static void preinit_state (lua_State *L, global_State *g) {
resethookcount(L); resethookcount(L);
L->openupval = NULL; L->openupval = NULL;
L->size_ci = 0; L->size_ci = 0;
L->nCcalls = 0; L->nCcalls = L->baseCcalls = 0;
L->status = 0; L->status = 0;
L->base_ci = L->ci = NULL; L->base_ci = L->ci = NULL;
L->savedpc = NULL; L->savedpc = NULL;
@@ -205,7 +205,7 @@ LUA_API void lua_close (lua_State *L) {
do { /* repeat until no more errors */ do { /* repeat until no more errors */
L->ci = L->base_ci; L->ci = L->base_ci;
L->base = L->top = L->ci->base; L->base = L->top = L->ci->base;
L->nCcalls = 0; L->nCcalls = L->baseCcalls = 0;
} while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0);
lua_assert(G(L)->tmudata == NULL); lua_assert(G(L)->tmudata == NULL);
luai_userstateclose(L); luai_userstateclose(L);
+2 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lstate.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lstate.h,v 2.24.1.2 2008/01/03 15:20:39 roberto Exp $
** Global State ** Global State
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -112,6 +112,7 @@ struct lua_State {
int stacksize; int stacksize;
int size_ci; /* size of array `base_ci' */ int size_ci; /* size of array `base_ci' */
unsigned short nCcalls; /* number of nested C calls */ unsigned short nCcalls; /* number of nested C calls */
unsigned short baseCcalls; /* nested C calls when resuming coroutine */
lu_byte hookmask; lu_byte hookmask;
lu_byte allowhook; lu_byte allowhook;
int basehookcount; int basehookcount;
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lstring.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lstring.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
** String table (keeps all strings handled by Lua) ** String table (keeps all strings handled by Lua)
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lstring.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lstring.h,v 1.43.1.1 2007/12/27 13:02:25 roberto Exp $
** String table (keep all strings handled by Lua) ** String table (keep all strings handled by Lua)
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+11 -8
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lstrlib.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lstrlib.c,v 1.132.1.5 2010/05/14 15:34:19 roberto Exp $
** Standard library for string operations and pattern-matching ** Standard library for string operations and pattern-matching
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -35,7 +35,8 @@ static int str_len (lua_State *L) {
static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) { static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
/* relative string position: negative means back from end */ /* relative string position: negative means back from end */
return (pos>=0) ? pos : (ptrdiff_t)len+pos+1; if (pos < 0) pos += (ptrdiff_t)len + 1;
return (pos >= 0) ? pos : 0;
} }
@@ -629,10 +630,6 @@ static void add_value (MatchState *ms, luaL_Buffer *b, const char *s,
lua_gettable(L, 3); lua_gettable(L, 3);
break; break;
} }
default: {
luaL_argerror(L, 3, "string/function/table expected");
return;
}
} }
if (!lua_toboolean(L, -1)) { /* nil or false? */ if (!lua_toboolean(L, -1)) { /* nil or false? */
lua_pop(L, 1); lua_pop(L, 1);
@@ -648,11 +645,15 @@ static int str_gsub (lua_State *L) {
size_t srcl; size_t srcl;
const char *src = luaL_checklstring(L, 1, &srcl); const char *src = luaL_checklstring(L, 1, &srcl);
const char *p = luaL_checkstring(L, 2); const char *p = luaL_checkstring(L, 2);
int tr = lua_type(L, 3);
int max_s = luaL_optint(L, 4, srcl+1); int max_s = luaL_optint(L, 4, srcl+1);
int anchor = (*p == '^') ? (p++, 1) : 0; int anchor = (*p == '^') ? (p++, 1) : 0;
int n = 0; int n = 0;
MatchState ms; MatchState ms;
luaL_Buffer b; luaL_Buffer b;
luaL_argcheck(L, tr == LUA_TNUMBER || tr == LUA_TSTRING ||
tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3,
"string/function/table expected");
luaL_buffinit(L, &b); luaL_buffinit(L, &b);
ms.L = L; ms.L = L;
ms.src_init = src; ms.src_init = src;
@@ -723,7 +724,7 @@ static void addquoted (lua_State *L, luaL_Buffer *b, int arg) {
static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { static const char *scanformat (lua_State *L, const char *strfrmt, char *form) {
const char *p = strfrmt; const char *p = strfrmt;
while (strchr(FLAGS, *p)) p++; /* skip flags */ while (*p != '\0' && strchr(FLAGS, *p) != NULL) p++; /* skip flags */
if ((size_t)(p - strfrmt) >= sizeof(FLAGS)) if ((size_t)(p - strfrmt) >= sizeof(FLAGS))
luaL_error(L, "invalid format (repeated flags)"); luaL_error(L, "invalid format (repeated flags)");
if (isdigit(uchar(*p))) p++; /* skip width */ if (isdigit(uchar(*p))) p++; /* skip width */
@@ -753,6 +754,7 @@ static void addintlen (char *form) {
static int str_format (lua_State *L) { static int str_format (lua_State *L) {
int top = lua_gettop(L);
int arg = 1; int arg = 1;
size_t sfl; size_t sfl;
const char *strfrmt = luaL_checklstring(L, arg, &sfl); const char *strfrmt = luaL_checklstring(L, arg, &sfl);
@@ -767,7 +769,8 @@ static int str_format (lua_State *L) {
else { /* format item */ else { /* format item */
char form[MAX_FORMAT]; /* to store the format (`%...') */ char form[MAX_FORMAT]; /* to store the format (`%...') */
char buff[MAX_ITEM]; /* to store the formatted item */ char buff[MAX_ITEM]; /* to store the formatted item */
arg++; if (++arg > top)
luaL_argerror(L, arg, "no value");
strfrmt = scanformat(L, strfrmt, form); strfrmt = scanformat(L, strfrmt, form);
switch (*strfrmt++) { switch (*strfrmt++) {
case 'c': { case 'c': {
+3 -3
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ltable.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ltable.c,v 2.32.1.2 2007/12/28 15:32:23 roberto Exp $
** Lua tables (hash) ** Lua tables (hash)
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -84,8 +84,8 @@ static const Node dummynode_ = {
static Node *hashnum (const Table *t, lua_Number n) { static Node *hashnum (const Table *t, lua_Number n) {
unsigned int a[numints]; unsigned int a[numints];
int i; int i;
n += 1; /* normalize number (avoid -0) */ if (luai_numeq(n, 0)) /* avoid problems with -0 */
lua_assert(sizeof(a) <= sizeof(n)); return gnode(t, 0);
memcpy(a, &n, sizeof(a)); memcpy(a, &n, sizeof(a));
for (i = 1; i < numints; i++) a[0] += a[i]; for (i = 1; i < numints; i++) a[0] += a[i];
return hashmod(t, a[0]); return hashmod(t, a[0]);
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ltable.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ltable.h,v 2.10.1.1 2007/12/27 13:02:25 roberto Exp $
** Lua tables (hash) ** Lua tables (hash)
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+17 -8
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ltablib.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ltablib.c,v 1.38.1.3 2008/02/14 16:46:58 roberto Exp $
** Library for Table Manipulation ** Library for Table Manipulation
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -118,7 +118,8 @@ static int tinsert (lua_State *L) {
static int tremove (lua_State *L) { static int tremove (lua_State *L) {
int e = aux_getn(L, 1); int e = aux_getn(L, 1);
int pos = luaL_optint(L, 2, e); int pos = luaL_optint(L, 2, e);
if (e == 0) return 0; /* table is `empty' */ if (!(1 <= pos && pos <= e)) /* position is outside bounds? */
return 0; /* nothing to remove */
luaL_setn(L, 1, e - 1); /* t.n = n-1 */ luaL_setn(L, 1, e - 1); /* t.n = n-1 */
lua_rawgeti(L, 1, pos); /* result = t[pos] */ lua_rawgeti(L, 1, pos); /* result = t[pos] */
for ( ;pos<e; pos++) { for ( ;pos<e; pos++) {
@@ -131,6 +132,15 @@ static int tremove (lua_State *L) {
} }
static void addfield (lua_State *L, luaL_Buffer *b, int i) {
lua_rawgeti(L, 1, i);
if (!lua_isstring(L, -1))
luaL_error(L, "invalid value (%s) at index %d in table for "
LUA_QL("concat"), luaL_typename(L, -1), i);
luaL_addvalue(b);
}
static int tconcat (lua_State *L) { static int tconcat (lua_State *L) {
luaL_Buffer b; luaL_Buffer b;
size_t lsep; size_t lsep;
@@ -140,13 +150,12 @@ static int tconcat (lua_State *L) {
i = luaL_optint(L, 3, 1); i = luaL_optint(L, 3, 1);
last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1)); last = luaL_opt(L, luaL_checkint, 4, luaL_getn(L, 1));
luaL_buffinit(L, &b); luaL_buffinit(L, &b);
for (; i <= last; i++) { for (; i < last; i++) {
lua_rawgeti(L, 1, i); addfield(L, &b, i);
luaL_argcheck(L, lua_isstring(L, -1), 1, "table contains non-strings"); luaL_addlstring(&b, sep, lsep);
luaL_addvalue(&b);
if (i != last)
luaL_addlstring(&b, sep, lsep);
} }
if (i == last) /* add last value (if interval was not empty) */
addfield(L, &b, i);
luaL_pushresult(&b); luaL_pushresult(&b);
return 1; return 1;
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ltm.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ltm.c,v 2.8.1.1 2007/12/27 13:02:25 roberto Exp $
** Tag methods ** Tag methods
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: ltm.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: ltm.h,v 2.6.1.1 2007/12/27 13:02:25 roberto Exp $
** Tag methods ** Tag methods
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+4 -2
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lua.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lua.c,v 1.160.1.2 2007/12/28 15:32:23 roberto Exp $
** Lua stand-alone interpreter ** Lua stand-alone interpreter
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -74,6 +74,8 @@ static int report (lua_State *L, int status) {
static int traceback (lua_State *L) { static int traceback (lua_State *L) {
if (!lua_isstring(L, 1)) /* 'message' not a string? */
return 1; /* keep it intact */
lua_getfield(L, LUA_GLOBALSINDEX, "debug"); lua_getfield(L, LUA_GLOBALSINDEX, "debug");
if (!lua_istable(L, -1)) { if (!lua_istable(L, -1)) {
lua_pop(L, 1); lua_pop(L, 1);
@@ -144,7 +146,7 @@ static int dostring (lua_State *L, const char *s, const char *name) {
static int dolibrary (lua_State *L, const char *name) { static int dolibrary (lua_State *L, const char *name) {
lua_getglobal(L, "require"); lua_getglobal(L, "require");
lua_pushstring(L, name); lua_pushstring(L, name);
return report(L, lua_pcall(L, 1, 0, 0)); return report(L, docall(L, 1, 1));
} }
+7 -4
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lua.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lua.h,v 1.218.1.7 2012/01/13 20:36:20 roberto Exp $
** Lua - An Extensible Extension Language ** Lua - An Extensible Extension Language
** Lua.org, PUC-Rio, Brazil (http://www.lua.org) ** Lua.org, PUC-Rio, Brazil (http://www.lua.org)
** See Copyright Notice at the end of this file ** See Copyright Notice at the end of this file
@@ -17,9 +17,9 @@
#define LUA_VERSION "Lua 5.1" #define LUA_VERSION "Lua 5.1"
#define LUA_RELEASE "Lua 5.1.1" #define LUA_RELEASE "Lua 5.1.5"
#define LUA_VERSION_NUM 501 #define LUA_VERSION_NUM 501
#define LUA_COPYRIGHT "Copyright (C) 1994-2006 Lua.org, PUC-Rio" #define LUA_COPYRIGHT "Copyright (C) 1994-2012 Lua.org, PUC-Rio"
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" #define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes"
@@ -294,6 +294,9 @@ LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud);
#define lua_Chunkwriter lua_Writer #define lua_Chunkwriter lua_Writer
/* hack */
LUA_API void lua_setlevel (lua_State *from, lua_State *to);
/* /*
** {====================================================================== ** {======================================================================
@@ -359,7 +362,7 @@ struct lua_Debug {
/****************************************************************************** /******************************************************************************
* Copyright (C) 1994-2006 Lua.org, PUC-Rio. All rights reserved. * Copyright (C) 1994-2012 Lua.org, PUC-Rio. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining * Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the * a copy of this software and associated documentation files (the
+6 -5
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: luaconf.h 27862 2009-01-05 22:02:30Z GRIM657 $ ** $Id: luaconf.h,v 1.82.1.7 2008/02/11 16:25:08 roberto Exp $
** Configuration file for Lua ** Configuration file for Lua
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -369,7 +369,7 @@ typedef int int32_t;
/* /*
@@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib' @@ LUA_COMPAT_OPENLIB controls compatibility with old 'luaL_openlib'
@* behavior. @* behavior.
** CHANGE it to undefined as soon as you replace to 'luaL_registry' ** CHANGE it to undefined as soon as you replace to 'luaL_register'
** your uses of 'luaL_openlib' ** your uses of 'luaL_openlib'
*/ */
#define LUA_COMPAT_OPENLIB #define LUA_COMPAT_OPENLIB
@@ -440,9 +440,10 @@ typedef int int32_t;
@* can use. @* can use.
** CHANGE it if you need lots of (Lua) stack space for your C ** CHANGE it if you need lots of (Lua) stack space for your C
** functions. This limit is arbitrary; its only purpose is to stop C ** functions. This limit is arbitrary; its only purpose is to stop C
** functions to consume unlimited stack space. ** functions to consume unlimited stack space. (must be smaller than
** -LUA_REGISTRYINDEX)
*/ */
#define LUAI_MAXCSTACK 2048 #define LUAI_MAXCSTACK 8000
@@ -666,7 +667,7 @@ union luai_Cast { double l_d; long l_l; };
*/ */
#if defined(LUA_USE_POPEN) #if defined(LUA_USE_POPEN)
#define lua_popen(L,c,m) ((void)L, popen(c,m)) #define lua_popen(L,c,m) ((void)L, fflush(NULL), popen(c,m))
#define lua_pclose(L,file) ((void)L, (pclose(file) != -1)) #define lua_pclose(L,file) ((void)L, (pclose(file) != -1))
#elif defined(LUA_WIN) #elif defined(LUA_WIN)
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lualib.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lualib.h,v 1.36.1.1 2007/12/27 13:02:25 roberto Exp $
** Lua standard libraries ** Lua standard libraries
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+8 -4
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lundump.c 27856 2009-01-05 06:17:44Z steve $ ** $Id: lundump.c,v 2.7.1.4 2008/04/04 19:51:41 roberto Exp $
** load precompiled Lua chunks ** load precompiled Lua chunks
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -30,6 +30,7 @@ typedef struct {
#ifdef LUAC_TRUST_BINARIES #ifdef LUAC_TRUST_BINARIES
#define IF(c,s) #define IF(c,s)
#define error(S,s)
#else #else
#define IF(c,s) if (c) error(S,s) #define IF(c,s) if (c) error(S,s)
@@ -142,7 +143,7 @@ static void LoadConstants(LoadState* S, Proto* f)
setnilvalue(o); setnilvalue(o);
break; break;
case LUA_TBOOLEAN: case LUA_TBOOLEAN:
setbvalue(o,LoadChar(S)); setbvalue(o,LoadChar(S)!=0);
break; break;
case LUA_TNUMBER: case LUA_TNUMBER:
setnvalue(o,LoadNumber(S)); setnvalue(o,LoadNumber(S));
@@ -151,7 +152,7 @@ static void LoadConstants(LoadState* S, Proto* f)
setsvalue2n(S->L,o,LoadString(S)); setsvalue2n(S->L,o,LoadString(S));
break; break;
default: default:
IF (1, "bad constant"); error(S,"bad constant");
break; break;
} }
} }
@@ -191,7 +192,9 @@ static void LoadDebug(LoadState* S, Proto* f)
static Proto* LoadFunction(LoadState* S, TString* p) static Proto* LoadFunction(LoadState* S, TString* p)
{ {
Proto* f=luaF_newproto(S->L); Proto* f;
if (++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep");
f=luaF_newproto(S->L);
setptvalue2s(S->L,S->L->top,f); incr_top(S->L); setptvalue2s(S->L,S->L->top,f); incr_top(S->L);
f->source=LoadString(S); if (f->source==NULL) f->source=p; f->source=LoadString(S); if (f->source==NULL) f->source=p;
f->linedefined=LoadInt(S); f->linedefined=LoadInt(S);
@@ -205,6 +208,7 @@ static Proto* LoadFunction(LoadState* S, TString* p)
LoadDebug(S,f); LoadDebug(S,f);
IF (!luaG_checkcode(f), "bad code"); IF (!luaG_checkcode(f), "bad code");
S->L->top--; S->L->top--;
S->L->nCcalls--;
return f; return f;
} }
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lundump.h 25893 2007-04-21 20:08:12Z stevecheckoway $ ** $Id: lundump.h,v 1.37.1.1 2007/12/27 13:02:25 roberto Exp $
** load precompiled Lua chunks ** load precompiled Lua chunks
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+14 -10
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lvm.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lvm.c,v 2.63.1.5 2011/08/17 20:43:11 roberto Exp $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -61,11 +61,9 @@ static void traceexec (lua_State *L, const Instruction *pc) {
lu_byte mask = L->hookmask; lu_byte mask = L->hookmask;
const Instruction *oldpc = L->savedpc; const Instruction *oldpc = L->savedpc;
L->savedpc = pc; L->savedpc = pc;
if (mask > LUA_MASKLINE) { /* instruction-hook set? */ if ((mask & LUA_MASKCOUNT) && L->hookcount == 0) {
if (L->hookcount == 0) { resethookcount(L);
resethookcount(L); luaD_callhook(L, LUA_HOOKCOUNT, -1);
luaD_callhook(L, LUA_HOOKCOUNT, -1);
}
} }
if (mask & LUA_MASKLINE) { if (mask & LUA_MASKLINE) {
Proto *p = ci_func(L->ci)->l.p; Proto *p = ci_func(L->ci)->l.p;
@@ -135,6 +133,7 @@ void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) {
void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
int loop; int loop;
TValue temp;
for (loop = 0; loop < MAXTAGLOOP; loop++) { for (loop = 0; loop < MAXTAGLOOP; loop++) {
const TValue *tm; const TValue *tm;
if (ttistable(t)) { /* `t' is a table? */ if (ttistable(t)) { /* `t' is a table? */
@@ -143,6 +142,7 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
if (!ttisnil(oldval) || /* result is no nil? */ if (!ttisnil(oldval) || /* result is no nil? */
(tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */
setobj2t(L, oldval, val); setobj2t(L, oldval, val);
h->flags = 0;
luaC_barriert(L, h, val); luaC_barriert(L, h, val);
return; return;
} }
@@ -154,7 +154,9 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) {
callTM(L, tm, t, key, val); callTM(L, tm, t, key, val);
return; return;
} }
t = tm; /* else repeat with `tm' */ /* else repeat with `tm' */
setobj(L, &temp, tm); /* avoid pointing inside table (may rehash) */
t = &temp;
} }
luaG_runerror(L, "loop in settable"); luaG_runerror(L, "loop in settable");
} }
@@ -165,7 +167,7 @@ static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2,
const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */
if (ttisnil(tm)) if (ttisnil(tm))
tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ tm = luaT_gettmbyobj(L, p2, event); /* try second operand */
if (!ttisfunction(tm)) return 0; if (ttisnil(tm)) return 0;
callTMres(L, res, tm, p1, p2); callTMres(L, res, tm, p1, p2);
return 1; return 1;
} }
@@ -281,10 +283,12 @@ void luaV_concat (lua_State *L, int total, int last) {
do { do {
StkId top = L->base + last + 1; StkId top = L->base + last + 1;
int n = 2; /* number of elements handled in this pass (at least 2) */ int n = 2; /* number of elements handled in this pass (at least 2) */
if (!tostring(L, top-2) || !tostring(L, top-1)) { if (!(ttisstring(top-2) || ttisnumber(top-2)) || !tostring(L, top-1)) {
if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT))
luaG_concaterror(L, top-2, top-1); luaG_concaterror(L, top-2, top-1);
} else if (tsvalue(top-1)->len > 0) { /* if len=0, do nothing */ } else if (tsvalue(top-1)->len == 0) /* second op is empty? */
(void)tostring(L, top - 2); /* result is first op (as string) */
else {
/* at least two string values; get as many as possible */ /* at least two string values; get as many as possible */
size_t tl = tsvalue(top-1)->len; size_t tl = tsvalue(top-1)->len;
char *buffer; char *buffer;
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lvm.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lvm.h,v 2.5.1.1 2007/12/27 13:02:25 roberto Exp $
** Lua virtual machine ** Lua virtual machine
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lzio.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lzio.c,v 1.31.1.1 2007/12/27 13:02:25 roberto Exp $
** a generic input stream interface ** a generic input stream interface
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+1 -1
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: lzio.h 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: lzio.h,v 1.21.1.1 2007/12/27 13:02:25 roberto Exp $
** Buffered streams ** Buffered streams
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
+3 -3
View File
@@ -1,5 +1,5 @@
/* /*
** $Id: print.c 23036 2006-09-25 07:35:34Z gmaynard $ ** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $
** print bytecodes ** print bytecodes
** See Copyright Notice in lua.h ** See Copyright Notice in lua.h
*/ */
@@ -23,8 +23,7 @@
static void PrintString(const TString* ts) static void PrintString(const TString* ts)
{ {
const char* s=getstr(ts); const char* s=getstr(ts);
int n=ts->tsv.len; size_t i,n=ts->tsv.len;
int i;
putchar('"'); putchar('"');
for (i=0; i<n; i++) for (i=0; i<n; i++)
{ {
@@ -32,6 +31,7 @@ static void PrintString(const TString* ts)
switch (c) switch (c)
{ {
case '"': printf("\\\""); break; case '"': printf("\\\""); break;
case '\\': printf("\\\\"); break;
case '\a': printf("\\a"); break; case '\a': printf("\\a"); break;
case '\b': printf("\\b"); break; case '\b': printf("\\b"); break;
case '\f': printf("\\f"); break; case '\f': printf("\\f"); break;