aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2012-06-09 15:02:02 +0200
committerMike Pall <mike>2012-06-09 15:03:40 +0200
commit0a6c8338d240dd318db2f5269414dcf7ddc9ed35 (patch)
tree953561aad7b19aaefda674a1962d47c754d552f6 /src
parent6c8aaef2bbb005a2176e35c08f85957a9bc428d0 (diff)
downloadluajit-0a6c8338d240dd318db2f5269414dcf7ddc9ed35.tar.gz
luajit-0a6c8338d240dd318db2f5269414dcf7ddc9ed35.tar.bz2
luajit-0a6c8338d240dd318db2f5269414dcf7ddc9ed35.zip
Add minified Lua interpreter (minilua). Used by the build process.
Diffstat (limited to 'src')
-rw-r--r--src/host/README4
-rw-r--r--src/host/genminilua.lua363
-rw-r--r--src/host/minilua.c7906
3 files changed, 8273 insertions, 0 deletions
diff --git a/src/host/README b/src/host/README
new file mode 100644
index 00000000..abfcdaa7
--- /dev/null
+++ b/src/host/README
@@ -0,0 +1,4 @@
1The files in this directory are only used during the build process of LuaJIT.
2For cross-compilation, they must be executed on the host, not on the target.
3
4These files should NOT be installed!
diff --git a/src/host/genminilua.lua b/src/host/genminilua.lua
new file mode 100644
index 00000000..7282cf16
--- /dev/null
+++ b/src/host/genminilua.lua
@@ -0,0 +1,363 @@
1----------------------------------------------------------------------------
2-- Lua script to generate a customized, minified version of Lua.
3-- The resulting 'minilua' is used for the build process of LuaJIT.
4----------------------------------------------------------------------------
5-- Copyright (C) 2005-2012 Mike Pall. All rights reserved.
6-- Released under the MIT license. See Copyright Notice in luajit.h
7----------------------------------------------------------------------------
8
9local sub, match, gsub = string.sub, string.match, string.gsub
10
11local LUA_VERSION = "5.1.5"
12local LUA_SOURCE
13
14local function usage()
15 io.stderr:write("Usage: ", arg and arg[0] or "genminilua",
16 " lua-", LUA_VERSION, "-source-dir\n")
17 os.exit(1)
18end
19
20local function find_sources()
21 LUA_SOURCE = arg and arg[1]
22 if not LUA_SOURCE then usage() end
23 if sub(LUA_SOURCE, -1) ~= "/" then LUA_SOURCE = LUA_SOURCE.."/" end
24 local fp = io.open(LUA_SOURCE .. "lua.h")
25 if not fp then
26 LUA_SOURCE = LUA_SOURCE.."src/"
27 fp = io.open(LUA_SOURCE .. "lua.h")
28 if not fp then usage() end
29 end
30 local all = fp:read("*a")
31 fp:close()
32 if not match(all, 'LUA_RELEASE%s*"Lua '..LUA_VERSION..'"') then
33 io.stderr:write("Error: version mismatch\n")
34 usage()
35 end
36end
37
38local LUA_FILES = {
39"lmem.c", "lobject.c", "ltm.c", "lfunc.c", "ldo.c", "lstring.c", "ltable.c",
40"lgc.c", "lstate.c", "ldebug.c", "lzio.c", "lopcodes.c",
41"llex.c", "lcode.c", "lparser.c", "lvm.c", "lapi.c", "lauxlib.c",
42"lbaselib.c", "ltablib.c", "liolib.c", "loslib.c", "lstrlib.c", "linit.c",
43}
44
45local REMOVE_LIB = {}
46gsub([[
47collectgarbage dofile gcinfo getfenv getmetatable load print rawequal rawset
48select tostring xpcall
49foreach foreachi getn maxn setn
50popen tmpfile seek setvbuf __tostring
51clock date difftime execute getenv rename setlocale time tmpname
52dump gfind len reverse
53LUA_LOADLIBNAME LUA_MATHLIBNAME LUA_DBLIBNAME
54]], "%S+", function(name)
55 REMOVE_LIB[name] = true
56end)
57
58local REMOVE_EXTINC = { ["<assert.h>"] = true, ["<locale.h>"] = true, }
59
60local CUSTOM_MAIN = [[
61int main(int argc, char **argv){
62 lua_State *L = luaL_newstate();
63 int i;
64 luaL_openlibs(L);
65 if (argc < 2) return 1;
66 lua_createtable(L, 0, 1);
67 lua_pushstring(L, argv[1]);
68 lua_rawseti(L, -2, 0);
69 lua_setglobal(L, "arg");
70 if (luaL_loadfile(L, argv[1]))
71 goto err;
72 for (i = 2; i < argc; i++)
73 lua_pushstring(L, argv[i]);
74 if (lua_pcall(L, argc - 2, 0, 0)) {
75 err:
76 fprintf(stderr, "Error: %s\n", lua_tostring(L, -1));
77 return 1;
78 }
79 lua_close(L);
80 return 0;
81}
82]]
83
84local function read_sources()
85 local t = {}
86 for i, name in ipairs(LUA_FILES) do
87 local fp = assert(io.open(LUA_SOURCE..name, "r"))
88 t[i] = fp:read("*a")
89 assert(fp:close())
90 end
91 t[#t+1] = CUSTOM_MAIN
92 return table.concat(t)
93end
94
95local includes = {}
96
97local function merge_includes(src)
98 return gsub(src, '#include%s*"([^"]*)"%s*\n', function(name)
99 if includes[name] then return "" end
100 includes[name] = true
101 local fp = assert(io.open(LUA_SOURCE..name, "r"))
102 local src = fp:read("*a")
103 assert(fp:close())
104 src = gsub(src, "#ifndef%s+%w+_h\n#define%s+%w+_h\n", "")
105 src = gsub(src, "#endif%s*$", "")
106 return merge_includes(src)
107 end)
108end
109
110local function get_license(src)
111 return match(src, "/%*+\n%* Copyright %(.-%*/\n")
112end
113
114local function fold_lines(src)
115 return gsub(src, "\\\n", " ")
116end
117
118local strings = {}
119
120local function save_str(str)
121 local n = #strings+1
122 strings[n] = str
123 return "\1"..n.."\2"
124end
125
126local function save_strings(src)
127 src = gsub(src, '"[^"\n]*"', save_str)
128 return gsub(src, "'[^'\n]*'", save_str)
129end
130
131local function restore_strings(src)
132 return gsub(src, "\1(%d+)\2", function(numstr)
133 return strings[tonumber(numstr)]
134 end)
135end
136
137local function def_istrue(def)
138 return def == "INT_MAX > 2147483640L" or
139 def == "LUAI_BITSINT >= 32" or
140 def == "SIZE_Bx < LUAI_BITSINT-1" or
141 def == "cast" or
142 def == "defined(LUA_CORE)" or
143 def == "MINSTRTABSIZE" or
144 def == "LUA_MINBUFFER" or
145 def == "HARDSTACKTESTS" or
146 def == "UNUSED"
147end
148
149local head, defs = {}, {}
150
151local function preprocess(src)
152 local t = { match(src, "^(.-)#") }
153 local lvl, on, oldon = 0, true, {}
154 for pp, def, txt in string.gmatch(src, "#(%w+) *([^\n]*)\n([^#]*)") do
155 if pp == "if" or pp == "ifdef" or pp == "ifndef" then
156 lvl = lvl + 1
157 oldon[lvl] = on
158 on = def_istrue(def)
159 elseif pp == "else" then
160 if oldon[lvl] then
161 if on == false then on = true else on = false end
162 end
163 elseif pp == "elif" then
164 if oldon[lvl] then
165 on = def_istrue(def)
166 end
167 elseif pp == "endif" then
168 on = oldon[lvl]
169 lvl = lvl - 1
170 elseif on then
171 if pp == "include" then
172 if not head[def] and not REMOVE_EXTINC[def] then
173 head[def] = true
174 head[#head+1] = "#include "..def.."\n"
175 end
176 elseif pp == "define" then
177 local k, sp, v = match(def, "([%w_]+)(%s*)(.*)")
178 if k and not (sp == "" and sub(v, 1, 1) == "(") then
179 defs[k] = gsub(v, "%a[%w_]*", function(tok)
180 return defs[tok] or tok
181 end)
182 else
183 t[#t+1] = "#define "..def.."\n"
184 end
185 elseif pp ~= "undef" then
186 error("unexpected directive: "..pp.." "..def)
187 end
188 end
189 if on then t[#t+1] = txt end
190 end
191 return gsub(table.concat(t), "%a[%w_]*", function(tok)
192 return defs[tok] or tok
193 end)
194end
195
196local function merge_header(src, license)
197 local hdr = string.format([[
198/* This is a heavily customized and minimized copy of Lua %s. */
199/* It's only used to build LuaJIT. It does NOT have all standard functions! */
200]], LUA_VERSION)
201 return hdr..license..table.concat(head)..src
202end
203
204local function strip_unused1(src)
205 return gsub(src, '( {"?([%w_]+)"?,%s+%a[%w_]*},\n)', function(line, func)
206 return REMOVE_LIB[func] and "" or line
207 end)
208end
209
210local function strip_unused2(src)
211 return gsub(src, "Symbolic Execution.-}=", "")
212end
213
214local function strip_unused3(src)
215 src = gsub(src, "extern", "static")
216 src = gsub(src, "\nstatic([^\n]-)%(([^)]*)%)%(", "\nstatic%1 %2(")
217 src = gsub(src, "#define lua_assert[^\n]*\n", "")
218 src = gsub(src, "lua_assert%b();?", "")
219 src = gsub(src, "default:\n}", "default:;\n}")
220 src = gsub(src, "lua_lock%b();", "")
221 src = gsub(src, "lua_unlock%b();", "")
222 src = gsub(src, "luai_threadyield%b();", "")
223 src = gsub(src, "luai_userstateopen%b();", "{}")
224 src = gsub(src, "luai_userstate%w+%b();", "")
225 src = gsub(src, "%(%(c==.*luaY_parser%)", "luaY_parser")
226 src = gsub(src, "trydecpoint%(ls,seminfo%)",
227 "luaX_lexerror(ls,\"malformed number\",TK_NUMBER)")
228 src = gsub(src, "int c=luaZ_lookahead%b();", "")
229 src = gsub(src, "luaL_register%(L,\"coroutine\",co_funcs%);\nreturn 2;",
230 "return 1;")
231 src = gsub(src, "getfuncname%b():", "NULL:")
232 src = gsub(src, "getobjname%b():", "NULL:")
233 src = gsub(src, "if%([^\n]*hookmask[^\n]*%)\n[^\n]*\n", "")
234 src = gsub(src, "if%([^\n]*hookmask[^\n]*%)%b{}\n", "")
235 src = gsub(src, "if%([^\n]*hookmask[^\n]*&&\n[^\n]*%b{}\n", "")
236 src = gsub(src, "(twoto%b()%()", "%1(size_t)")
237 src = gsub(src, "i<sizenode", "i<(int)sizenode")
238 return gsub(src, "\n\n+", "\n")
239end
240
241local function strip_comments(src)
242 return gsub(src, "/%*.-%*/", " ")
243end
244
245local function strip_whitespace(src)
246 src = gsub(src, "^%s+", "")
247 src = gsub(src, "%s*\n%s*", "\n")
248 src = gsub(src, "[ \t]+", " ")
249 src = gsub(src, "(%W) ", "%1")
250 return gsub(src, " (%W)", "%1")
251end
252
253local function rename_tokens1(src)
254 src = gsub(src, "getline", "getline_")
255 src = gsub(src, "struct ([%w_]+)", "ZX%1")
256 return gsub(src, "union ([%w_]+)", "ZY%1")
257end
258
259local function rename_tokens2(src)
260 src = gsub(src, "ZX([%w_]+)", "struct %1")
261 return gsub(src, "ZY([%w_]+)", "union %1")
262end
263
264local function func_gather(src)
265 local nodes, list = {}, {}
266 local pos, len = 1, #src
267 while pos < len do
268 local d, w = match(src, "^(#define ([%w_]+)[^\n]*\n)", pos)
269 if d then
270 local n = #list+1
271 list[n] = d
272 nodes[w] = n
273 else
274 local s
275 d, w, s = match(src, "^(([%w_]+)[^\n]*([{;])\n)", pos)
276 if not d then
277 d, w, s = match(src, "^(([%w_]+)[^(]*%b()([{;])\n)", pos)
278 if not d then d = match(src, "^[^\n]*\n", pos) end
279 end
280 if s == "{" then
281 d = d..sub(match(src, "^%b{}[^;\n]*;?\n", pos+#d-2), 3)
282 if sub(d, -2) == "{\n" then
283 d = d..sub(match(src, "^%b{}[^;\n]*;?\n", pos+#d-2), 3)
284 end
285 end
286 local k, v = nil, d
287 if w == "typedef" then
288 if match(d, "^typedef enum") then
289 head[#head+1] = d
290 else
291 k = match(d, "([%w_]+);\n$")
292 if not k then k = match(d, "^.-%(.-([%w_]+)%)%(") end
293 end
294 elseif w == "enum" then
295 head[#head+1] = v
296 elseif w ~= nil then
297 k = match(d, "^[^\n]-([%w_]+)[(%[=]")
298 if k then
299 if w ~= "static" and k ~= "main" then v = "static "..d end
300 else
301 k = w
302 end
303 end
304 if w and k then
305 local o = nodes[k]
306 if o then nodes["*"..k] = o end
307 local n = #list+1
308 list[n] = v
309 nodes[k] = n
310 end
311 end
312 pos = pos + #d
313 end
314 return nodes, list
315end
316
317local function func_visit(nodes, list, used, n)
318 local i = nodes[n]
319 for m in string.gmatch(list[i], "[%w_]+") do
320 if nodes[m] then
321 local j = used[m]
322 if not j then
323 used[m] = i
324 func_visit(nodes, list, used, m)
325 elseif i < j then
326 used[m] = i
327 end
328 end
329 end
330end
331
332local function func_collect(src)
333 local nodes, list = func_gather(src)
334 local used = {}
335 func_visit(nodes, list, used, "main")
336 for n,i in pairs(nodes) do
337 local j = used[n]
338 if j and j < i then used["*"..n] = j end
339 end
340 for n,i in pairs(nodes) do
341 if not used[n] then list[i] = "" end
342 end
343 return table.concat(list)
344end
345
346find_sources()
347local src = read_sources()
348src = merge_includes(src)
349local license = get_license(src)
350src = fold_lines(src)
351src = strip_unused1(src)
352src = save_strings(src)
353src = strip_unused2(src)
354src = strip_comments(src)
355src = preprocess(src)
356src = strip_whitespace(src)
357src = strip_unused3(src)
358src = rename_tokens1(src)
359src = func_collect(src)
360src = rename_tokens2(src)
361src = restore_strings(src)
362src = merge_header(src, license)
363io.write(src)
diff --git a/src/host/minilua.c b/src/host/minilua.c
new file mode 100644
index 00000000..4db07033
--- /dev/null
+++ b/src/host/minilua.c
@@ -0,0 +1,7906 @@
1/* This is a heavily customized and minimized copy of Lua 5.1.5. */
2/* It's only used to build LuaJIT. It does NOT have all standard functions! */
3/******************************************************************************
4* Copyright (C) 1994-2012 Lua.org, PUC-Rio. All rights reserved.
5*
6* Permission is hereby granted, free of charge, to any person obtaining
7* a copy of this software and associated documentation files (the
8* "Software"), to deal in the Software without restriction, including
9* without limitation the rights to use, copy, modify, merge, publish,
10* distribute, sublicense, and/or sell copies of the Software, and to
11* permit persons to whom the Software is furnished to do so, subject to
12* the following conditions:
13*
14* The above copyright notice and this permission notice shall be
15* included in all copies or substantial portions of the Software.
16*
17* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
21* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24******************************************************************************/
25#include <stddef.h>
26#include <stdarg.h>
27#include <limits.h>
28#include <math.h>
29#include <ctype.h>
30#include <stdio.h>
31#include <stdlib.h>
32#include <string.h>
33#include <setjmp.h>
34#include <errno.h>
35#include <time.h>
36typedef enum{
37TM_INDEX,
38TM_NEWINDEX,
39TM_GC,
40TM_MODE,
41TM_EQ,
42TM_ADD,
43TM_SUB,
44TM_MUL,
45TM_DIV,
46TM_MOD,
47TM_POW,
48TM_UNM,
49TM_LEN,
50TM_LT,
51TM_LE,
52TM_CONCAT,
53TM_CALL,
54TM_N
55}TMS;
56enum OpMode{iABC,iABx,iAsBx};
57typedef enum{
58OP_MOVE,
59OP_LOADK,
60OP_LOADBOOL,
61OP_LOADNIL,
62OP_GETUPVAL,
63OP_GETGLOBAL,
64OP_GETTABLE,
65OP_SETGLOBAL,
66OP_SETUPVAL,
67OP_SETTABLE,
68OP_NEWTABLE,
69OP_SELF,
70OP_ADD,
71OP_SUB,
72OP_MUL,
73OP_DIV,
74OP_MOD,
75OP_POW,
76OP_UNM,
77OP_NOT,
78OP_LEN,
79OP_CONCAT,
80OP_JMP,
81OP_EQ,
82OP_LT,
83OP_LE,
84OP_TEST,
85OP_TESTSET,
86OP_CALL,
87OP_TAILCALL,
88OP_RETURN,
89OP_FORLOOP,
90OP_FORPREP,
91OP_TFORLOOP,
92OP_SETLIST,
93OP_CLOSE,
94OP_CLOSURE,
95OP_VARARG
96}OpCode;
97enum OpArgMask{
98OpArgN,
99OpArgU,
100OpArgR,
101OpArgK
102};
103typedef enum{
104VVOID,
105VNIL,
106VTRUE,
107VFALSE,
108VK,
109VKNUM,
110VLOCAL,
111VUPVAL,
112VGLOBAL,
113VINDEXED,
114VJMP,
115VRELOCABLE,
116VNONRELOC,
117VCALL,
118VVARARG
119}expkind;
120enum RESERVED{
121TK_AND=257,TK_BREAK,
122TK_DO,TK_ELSE,TK_ELSEIF,TK_END,TK_FALSE,TK_FOR,TK_FUNCTION,
123TK_IF,TK_IN,TK_LOCAL,TK_NIL,TK_NOT,TK_OR,TK_REPEAT,
124TK_RETURN,TK_THEN,TK_TRUE,TK_UNTIL,TK_WHILE,
125TK_CONCAT,TK_DOTS,TK_EQ,TK_GE,TK_LE,TK_NE,TK_NUMBER,
126TK_NAME,TK_STRING,TK_EOS
127};
128typedef enum BinOpr{
129OPR_ADD,OPR_SUB,OPR_MUL,OPR_DIV,OPR_MOD,OPR_POW,
130OPR_CONCAT,
131OPR_NE,OPR_EQ,
132OPR_LT,OPR_LE,OPR_GT,OPR_GE,
133OPR_AND,OPR_OR,
134OPR_NOBINOPR
135}BinOpr;
136typedef enum UnOpr{OPR_MINUS,OPR_NOT,OPR_LEN,OPR_NOUNOPR}UnOpr;
137#define LUA_QL(x)"'"x"'"
138#define luai_apicheck(L,o){(void)L;}
139#define lua_number2str(s,n)sprintf((s),"%.14g",(n))
140#define lua_str2number(s,p)strtod((s),(p))
141#define luai_numadd(a,b)((a)+(b))
142#define luai_numsub(a,b)((a)-(b))
143#define luai_nummul(a,b)((a)*(b))
144#define luai_numdiv(a,b)((a)/(b))
145#define luai_nummod(a,b)((a)-floor((a)/(b))*(b))
146#define luai_numpow(a,b)(pow(a,b))
147#define luai_numunm(a)(-(a))
148#define luai_numeq(a,b)((a)==(b))
149#define luai_numlt(a,b)((a)<(b))
150#define luai_numle(a,b)((a)<=(b))
151#define luai_numisnan(a)(!luai_numeq((a),(a)))
152#define lua_number2int(i,d)((i)=(int)(d))
153#define lua_number2integer(i,d)((i)=(lua_Integer)(d))
154#define LUAI_THROW(L,c)longjmp((c)->b,1)
155#define LUAI_TRY(L,c,a)if(setjmp((c)->b)==0){a}
156#define lua_pclose(L,file)((void)((void)L,file),0)
157#define lua_upvalueindex(i)((-10002)-(i))
158typedef struct lua_State lua_State;
159typedef int(*lua_CFunction)(lua_State*L);
160typedef const char*(*lua_Reader)(lua_State*L,void*ud,size_t*sz);
161typedef void*(*lua_Alloc)(void*ud,void*ptr,size_t osize,size_t nsize);
162typedef double lua_Number;
163typedef ptrdiff_t lua_Integer;
164static void lua_settop(lua_State*L,int idx);
165static int lua_type(lua_State*L,int idx);
166static const char* lua_tolstring(lua_State*L,int idx,size_t*len);
167static size_t lua_objlen(lua_State*L,int idx);
168static void lua_pushlstring(lua_State*L,const char*s,size_t l);
169static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n);
170static void lua_createtable(lua_State*L,int narr,int nrec);
171static void lua_setfield(lua_State*L,int idx,const char*k);
172#define lua_pop(L,n)lua_settop(L,-(n)-1)
173#define lua_newtable(L)lua_createtable(L,0,0)
174#define lua_pushcfunction(L,f)lua_pushcclosure(L,(f),0)
175#define lua_strlen(L,i)lua_objlen(L,(i))
176#define lua_isfunction(L,n)(lua_type(L,(n))==6)
177#define lua_istable(L,n)(lua_type(L,(n))==5)
178#define lua_isnil(L,n)(lua_type(L,(n))==0)
179#define lua_isboolean(L,n)(lua_type(L,(n))==1)
180#define lua_isnone(L,n)(lua_type(L,(n))==(-1))
181#define lua_isnoneornil(L,n)(lua_type(L,(n))<=0)
182#define lua_pushliteral(L,s)lua_pushlstring(L,""s,(sizeof(s)/sizeof(char))-1)
183#define lua_setglobal(L,s)lua_setfield(L,(-10002),(s))
184#define lua_tostring(L,i)lua_tolstring(L,(i),NULL)
185typedef struct lua_Debug lua_Debug;
186typedef void(*lua_Hook)(lua_State*L,lua_Debug*ar);
187struct lua_Debug{
188int event;
189const char*name;
190const char*namewhat;
191const char*what;
192const char*source;
193int currentline;
194int nups;
195int linedefined;
196int lastlinedefined;
197char short_src[60];
198int i_ci;
199};
200typedef unsigned int lu_int32;
201typedef size_t lu_mem;
202typedef ptrdiff_t l_mem;
203typedef unsigned char lu_byte;
204#define IntPoint(p)((unsigned int)(lu_mem)(p))
205typedef union{double u;void*s;long l;}L_Umaxalign;
206typedef double l_uacNumber;
207#define check_exp(c,e)(e)
208#define UNUSED(x)((void)(x))
209#define cast(t,exp)((t)(exp))
210#define cast_byte(i)cast(lu_byte,(i))
211#define cast_num(i)cast(lua_Number,(i))
212#define cast_int(i)cast(int,(i))
213typedef lu_int32 Instruction;
214#define condhardstacktests(x)((void)0)
215typedef union GCObject GCObject;
216typedef struct GCheader{
217GCObject*next;lu_byte tt;lu_byte marked;
218}GCheader;
219typedef union{
220GCObject*gc;
221void*p;
222lua_Number n;
223int b;
224}Value;
225typedef struct lua_TValue{
226Value value;int tt;
227}TValue;
228#define ttisnil(o)(ttype(o)==0)
229#define ttisnumber(o)(ttype(o)==3)
230#define ttisstring(o)(ttype(o)==4)
231#define ttistable(o)(ttype(o)==5)
232#define ttisfunction(o)(ttype(o)==6)
233#define ttisboolean(o)(ttype(o)==1)
234#define ttisuserdata(o)(ttype(o)==7)
235#define ttisthread(o)(ttype(o)==8)
236#define ttislightuserdata(o)(ttype(o)==2)
237#define ttype(o)((o)->tt)
238#define gcvalue(o)check_exp(iscollectable(o),(o)->value.gc)
239#define pvalue(o)check_exp(ttislightuserdata(o),(o)->value.p)
240#define nvalue(o)check_exp(ttisnumber(o),(o)->value.n)
241#define rawtsvalue(o)check_exp(ttisstring(o),&(o)->value.gc->ts)
242#define tsvalue(o)(&rawtsvalue(o)->tsv)
243#define rawuvalue(o)check_exp(ttisuserdata(o),&(o)->value.gc->u)
244#define uvalue(o)(&rawuvalue(o)->uv)
245#define clvalue(o)check_exp(ttisfunction(o),&(o)->value.gc->cl)
246#define hvalue(o)check_exp(ttistable(o),&(o)->value.gc->h)
247#define bvalue(o)check_exp(ttisboolean(o),(o)->value.b)
248#define thvalue(o)check_exp(ttisthread(o),&(o)->value.gc->th)
249#define l_isfalse(o)(ttisnil(o)||(ttisboolean(o)&&bvalue(o)==0))
250#define checkconsistency(obj)
251#define checkliveness(g,obj)
252#define setnilvalue(obj)((obj)->tt=0)
253#define setnvalue(obj,x){TValue*i_o=(obj);i_o->value.n=(x);i_o->tt=3;}
254#define setbvalue(obj,x){TValue*i_o=(obj);i_o->value.b=(x);i_o->tt=1;}
255#define setsvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=4;checkliveness(G(L),i_o);}
256#define setuvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=7;checkliveness(G(L),i_o);}
257#define setthvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=8;checkliveness(G(L),i_o);}
258#define setclvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=6;checkliveness(G(L),i_o);}
259#define sethvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=5;checkliveness(G(L),i_o);}
260#define setptvalue(L,obj,x){TValue*i_o=(obj);i_o->value.gc=cast(GCObject*,(x));i_o->tt=(8+1);checkliveness(G(L),i_o);}
261#define setobj(L,obj1,obj2){const TValue*o2=(obj2);TValue*o1=(obj1);o1->value=o2->value;o1->tt=o2->tt;checkliveness(G(L),o1);}
262#define setttype(obj,tt)(ttype(obj)=(tt))
263#define iscollectable(o)(ttype(o)>=4)
264typedef TValue*StkId;
265typedef union TString{
266L_Umaxalign dummy;
267struct{
268GCObject*next;lu_byte tt;lu_byte marked;
269lu_byte reserved;
270unsigned int hash;
271size_t len;
272}tsv;
273}TString;
274#define getstr(ts)cast(const char*,(ts)+1)
275#define svalue(o)getstr(rawtsvalue(o))
276typedef union Udata{
277L_Umaxalign dummy;
278struct{
279GCObject*next;lu_byte tt;lu_byte marked;
280struct Table*metatable;
281struct Table*env;
282size_t len;
283}uv;
284}Udata;
285typedef struct Proto{
286GCObject*next;lu_byte tt;lu_byte marked;
287TValue*k;
288Instruction*code;
289struct Proto**p;
290int*lineinfo;
291struct LocVar*locvars;
292TString**upvalues;
293TString*source;
294int sizeupvalues;
295int sizek;
296int sizecode;
297int sizelineinfo;
298int sizep;
299int sizelocvars;
300int linedefined;
301int lastlinedefined;
302GCObject*gclist;
303lu_byte nups;
304lu_byte numparams;
305lu_byte is_vararg;
306lu_byte maxstacksize;
307}Proto;
308typedef struct LocVar{
309TString*varname;
310int startpc;
311int endpc;
312}LocVar;
313typedef struct UpVal{
314GCObject*next;lu_byte tt;lu_byte marked;
315TValue*v;
316union{
317TValue value;
318struct{
319struct UpVal*prev;
320struct UpVal*next;
321}l;
322}u;
323}UpVal;
324typedef struct CClosure{
325GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env;
326lua_CFunction f;
327TValue upvalue[1];
328}CClosure;
329typedef struct LClosure{
330GCObject*next;lu_byte tt;lu_byte marked;lu_byte isC;lu_byte nupvalues;GCObject*gclist;struct Table*env;
331struct Proto*p;
332UpVal*upvals[1];
333}LClosure;
334typedef union Closure{
335CClosure c;
336LClosure l;
337}Closure;
338#define iscfunction(o)(ttype(o)==6&&clvalue(o)->c.isC)
339typedef union TKey{
340struct{
341Value value;int tt;
342struct Node*next;
343}nk;
344TValue tvk;
345}TKey;
346typedef struct Node{
347TValue i_val;
348TKey i_key;
349}Node;
350typedef struct Table{
351GCObject*next;lu_byte tt;lu_byte marked;
352lu_byte flags;
353lu_byte lsizenode;
354struct Table*metatable;
355TValue*array;
356Node*node;
357Node*lastfree;
358GCObject*gclist;
359int sizearray;
360}Table;
361#define lmod(s,size)(check_exp((size&(size-1))==0,(cast(int,(s)&((size)-1)))))
362#define twoto(x)((size_t)1<<(x))
363#define sizenode(t)(twoto((t)->lsizenode))
364static const TValue luaO_nilobject_;
365#define ceillog2(x)(luaO_log2((x)-1)+1)
366static int luaO_log2(unsigned int x);
367#define gfasttm(g,et,e)((et)==NULL?NULL:((et)->flags&(1u<<(e)))?NULL:luaT_gettm(et,e,(g)->tmname[e]))
368#define fasttm(l,et,e)gfasttm(G(l),et,e)
369static const TValue*luaT_gettm(Table*events,TMS event,TString*ename);
370#define luaM_reallocv(L,b,on,n,e)((cast(size_t,(n)+1)<=((size_t)(~(size_t)0)-2)/(e))?luaM_realloc_(L,(b),(on)*(e),(n)*(e)):luaM_toobig(L))
371#define luaM_freemem(L,b,s)luaM_realloc_(L,(b),(s),0)
372#define luaM_free(L,b)luaM_realloc_(L,(b),sizeof(*(b)),0)
373#define luaM_freearray(L,b,n,t)luaM_reallocv(L,(b),n,0,sizeof(t))
374#define luaM_malloc(L,t)luaM_realloc_(L,NULL,0,(t))
375#define luaM_new(L,t)cast(t*,luaM_malloc(L,sizeof(t)))
376#define luaM_newvector(L,n,t)cast(t*,luaM_reallocv(L,NULL,0,n,sizeof(t)))
377#define luaM_growvector(L,v,nelems,size,t,limit,e)if((nelems)+1>(size))((v)=cast(t*,luaM_growaux_(L,v,&(size),sizeof(t),limit,e)))
378#define luaM_reallocvector(L,v,oldn,n,t)((v)=cast(t*,luaM_reallocv(L,v,oldn,n,sizeof(t))))
379static void*luaM_realloc_(lua_State*L,void*block,size_t oldsize,
380size_t size);
381static void*luaM_toobig(lua_State*L);
382static void*luaM_growaux_(lua_State*L,void*block,int*size,
383size_t size_elem,int limit,
384const char*errormsg);
385typedef struct Zio ZIO;
386#define char2int(c)cast(int,cast(unsigned char,(c)))
387#define zgetc(z)(((z)->n--)>0?char2int(*(z)->p++):luaZ_fill(z))
388typedef struct Mbuffer{
389char*buffer;
390size_t n;
391size_t buffsize;
392}Mbuffer;
393#define luaZ_initbuffer(L,buff)((buff)->buffer=NULL,(buff)->buffsize=0)
394#define luaZ_buffer(buff)((buff)->buffer)
395#define luaZ_sizebuffer(buff)((buff)->buffsize)
396#define luaZ_bufflen(buff)((buff)->n)
397#define luaZ_resetbuffer(buff)((buff)->n=0)
398#define luaZ_resizebuffer(L,buff,size)(luaM_reallocvector(L,(buff)->buffer,(buff)->buffsize,size,char),(buff)->buffsize=size)
399#define luaZ_freebuffer(L,buff)luaZ_resizebuffer(L,buff,0)
400struct Zio{
401size_t n;
402const char*p;
403lua_Reader reader;
404void*data;
405lua_State*L;
406};
407static int luaZ_fill(ZIO*z);
408struct lua_longjmp;
409#define gt(L)(&L->l_gt)
410#define registry(L)(&G(L)->l_registry)
411typedef struct stringtable{
412GCObject**hash;
413lu_int32 nuse;
414int size;
415}stringtable;
416typedef struct CallInfo{
417StkId base;
418StkId func;
419StkId top;
420const Instruction*savedpc;
421int nresults;
422int tailcalls;
423}CallInfo;
424#define curr_func(L)(clvalue(L->ci->func))
425#define ci_func(ci)(clvalue((ci)->func))
426#define f_isLua(ci)(!ci_func(ci)->c.isC)
427#define isLua(ci)(ttisfunction((ci)->func)&&f_isLua(ci))
428typedef struct global_State{
429stringtable strt;
430lua_Alloc frealloc;
431void*ud;
432lu_byte currentwhite;
433lu_byte gcstate;
434int sweepstrgc;
435GCObject*rootgc;
436GCObject**sweepgc;
437GCObject*gray;
438GCObject*grayagain;
439GCObject*weak;
440GCObject*tmudata;
441Mbuffer buff;
442lu_mem GCthreshold;
443lu_mem totalbytes;
444lu_mem estimate;
445lu_mem gcdept;
446int gcpause;
447int gcstepmul;
448lua_CFunction panic;
449TValue l_registry;
450struct lua_State*mainthread;
451UpVal uvhead;
452struct Table*mt[(8+1)];
453TString*tmname[TM_N];
454}global_State;
455struct lua_State{
456GCObject*next;lu_byte tt;lu_byte marked;
457lu_byte status;
458StkId top;
459StkId base;
460global_State*l_G;
461CallInfo*ci;
462const Instruction*savedpc;
463StkId stack_last;
464StkId stack;
465CallInfo*end_ci;
466CallInfo*base_ci;
467int stacksize;
468int size_ci;
469unsigned short nCcalls;
470unsigned short baseCcalls;
471lu_byte hookmask;
472lu_byte allowhook;
473int basehookcount;
474int hookcount;
475lua_Hook hook;
476TValue l_gt;
477TValue env;
478GCObject*openupval;
479GCObject*gclist;
480struct lua_longjmp*errorJmp;
481ptrdiff_t errfunc;
482};
483#define G(L)(L->l_G)
484union GCObject{
485GCheader gch;
486union TString ts;
487union Udata u;
488union Closure cl;
489struct Table h;
490struct Proto p;
491struct UpVal uv;
492struct lua_State th;
493};
494#define rawgco2ts(o)check_exp((o)->gch.tt==4,&((o)->ts))
495#define gco2ts(o)(&rawgco2ts(o)->tsv)
496#define rawgco2u(o)check_exp((o)->gch.tt==7,&((o)->u))
497#define gco2u(o)(&rawgco2u(o)->uv)
498#define gco2cl(o)check_exp((o)->gch.tt==6,&((o)->cl))
499#define gco2h(o)check_exp((o)->gch.tt==5,&((o)->h))
500#define gco2p(o)check_exp((o)->gch.tt==(8+1),&((o)->p))
501#define gco2uv(o)check_exp((o)->gch.tt==(8+2),&((o)->uv))
502#define ngcotouv(o)check_exp((o)==NULL||(o)->gch.tt==(8+2),&((o)->uv))
503#define gco2th(o)check_exp((o)->gch.tt==8,&((o)->th))
504#define obj2gco(v)(cast(GCObject*,(v)))
505static void luaE_freethread(lua_State*L,lua_State*L1);
506#define pcRel(pc,p)(cast(int,(pc)-(p)->code)-1)
507#define getline_(f,pc)(((f)->lineinfo)?(f)->lineinfo[pc]:0)
508#define resethookcount(L)(L->hookcount=L->basehookcount)
509static void luaG_typeerror(lua_State*L,const TValue*o,
510const char*opname);
511static void luaG_runerror(lua_State*L,const char*fmt,...);
512#define luaD_checkstack(L,n)if((char*)L->stack_last-(char*)L->top<=(n)*(int)sizeof(TValue))luaD_growstack(L,n);else condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));
513#define incr_top(L){luaD_checkstack(L,1);L->top++;}
514#define savestack(L,p)((char*)(p)-(char*)L->stack)
515#define restorestack(L,n)((TValue*)((char*)L->stack+(n)))
516#define saveci(L,p)((char*)(p)-(char*)L->base_ci)
517#define restoreci(L,n)((CallInfo*)((char*)L->base_ci+(n)))
518typedef void(*Pfunc)(lua_State*L,void*ud);
519static int luaD_poscall(lua_State*L,StkId firstResult);
520static void luaD_reallocCI(lua_State*L,int newsize);
521static void luaD_reallocstack(lua_State*L,int newsize);
522static void luaD_growstack(lua_State*L,int n);
523static void luaD_throw(lua_State*L,int errcode);
524static void*luaM_growaux_(lua_State*L,void*block,int*size,size_t size_elems,
525int limit,const char*errormsg){
526void*newblock;
527int newsize;
528if(*size>=limit/2){
529if(*size>=limit)
530luaG_runerror(L,errormsg);
531newsize=limit;
532}
533else{
534newsize=(*size)*2;
535if(newsize<4)
536newsize=4;
537}
538newblock=luaM_reallocv(L,block,*size,newsize,size_elems);
539*size=newsize;
540return newblock;
541}
542static void*luaM_toobig(lua_State*L){
543luaG_runerror(L,"memory allocation error: block too big");
544return NULL;
545}
546static void*luaM_realloc_(lua_State*L,void*block,size_t osize,size_t nsize){
547global_State*g=G(L);
548block=(*g->frealloc)(g->ud,block,osize,nsize);
549if(block==NULL&&nsize>0)
550luaD_throw(L,4);
551g->totalbytes=(g->totalbytes-osize)+nsize;
552return block;
553}
554#define resetbits(x,m)((x)&=cast(lu_byte,~(m)))
555#define setbits(x,m)((x)|=(m))
556#define testbits(x,m)((x)&(m))
557#define bitmask(b)(1<<(b))
558#define bit2mask(b1,b2)(bitmask(b1)|bitmask(b2))
559#define l_setbit(x,b)setbits(x,bitmask(b))
560#define resetbit(x,b)resetbits(x,bitmask(b))
561#define testbit(x,b)testbits(x,bitmask(b))
562#define set2bits(x,b1,b2)setbits(x,(bit2mask(b1,b2)))
563#define reset2bits(x,b1,b2)resetbits(x,(bit2mask(b1,b2)))
564#define test2bits(x,b1,b2)testbits(x,(bit2mask(b1,b2)))
565#define iswhite(x)test2bits((x)->gch.marked,0,1)
566#define isblack(x)testbit((x)->gch.marked,2)
567#define isgray(x)(!isblack(x)&&!iswhite(x))
568#define otherwhite(g)(g->currentwhite^bit2mask(0,1))
569#define isdead(g,v)((v)->gch.marked&otherwhite(g)&bit2mask(0,1))
570#define changewhite(x)((x)->gch.marked^=bit2mask(0,1))
571#define gray2black(x)l_setbit((x)->gch.marked,2)
572#define valiswhite(x)(iscollectable(x)&&iswhite(gcvalue(x)))
573#define luaC_white(g)cast(lu_byte,(g)->currentwhite&bit2mask(0,1))
574#define luaC_checkGC(L){condhardstacktests(luaD_reallocstack(L,L->stacksize-5-1));if(G(L)->totalbytes>=G(L)->GCthreshold)luaC_step(L);}
575#define luaC_barrier(L,p,v){if(valiswhite(v)&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),gcvalue(v));}
576#define luaC_barriert(L,t,v){if(valiswhite(v)&&isblack(obj2gco(t)))luaC_barrierback(L,t);}
577#define luaC_objbarrier(L,p,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(p)))luaC_barrierf(L,obj2gco(p),obj2gco(o));}
578#define luaC_objbarriert(L,t,o){if(iswhite(obj2gco(o))&&isblack(obj2gco(t)))luaC_barrierback(L,t);}
579static void luaC_step(lua_State*L);
580static void luaC_link(lua_State*L,GCObject*o,lu_byte tt);
581static void luaC_linkupval(lua_State*L,UpVal*uv);
582static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v);
583static void luaC_barrierback(lua_State*L,Table*t);
584#define sizestring(s)(sizeof(union TString)+((s)->len+1)*sizeof(char))
585#define sizeudata(u)(sizeof(union Udata)+(u)->len)
586#define luaS_new(L,s)(luaS_newlstr(L,s,strlen(s)))
587#define luaS_newliteral(L,s)(luaS_newlstr(L,""s,(sizeof(s)/sizeof(char))-1))
588#define luaS_fix(s)l_setbit((s)->tsv.marked,5)
589static TString*luaS_newlstr(lua_State*L,const char*str,size_t l);
590#define tostring(L,o)((ttype(o)==4)||(luaV_tostring(L,o)))
591#define tonumber(o,n)(ttype(o)==3||(((o)=luaV_tonumber(o,n))!=NULL))
592#define equalobj(L,o1,o2)(ttype(o1)==ttype(o2)&&luaV_equalval(L,o1,o2))
593static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2);
594static const TValue*luaV_tonumber(const TValue*obj,TValue*n);
595static int luaV_tostring(lua_State*L,StkId obj);
596static void luaV_execute(lua_State*L,int nexeccalls);
597static void luaV_concat(lua_State*L,int total,int last);
598static const TValue luaO_nilobject_={{NULL},0};
599static int luaO_int2fb(unsigned int x){
600int e=0;
601while(x>=16){
602x=(x+1)>>1;
603e++;
604}
605if(x<8)return x;
606else return((e+1)<<3)|(cast_int(x)-8);
607}
608static int luaO_fb2int(int x){
609int e=(x>>3)&31;
610if(e==0)return x;
611else return((x&7)+8)<<(e-1);
612}
613static int luaO_log2(unsigned int x){
614static const lu_byte log_2[256]={
6150,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
6166,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6177,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
6187,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
6198,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
6208,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
6218,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
6228,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8
623};
624int l=-1;
625while(x>=256){l+=8;x>>=8;}
626return l+log_2[x];
627}
628static int luaO_rawequalObj(const TValue*t1,const TValue*t2){
629if(ttype(t1)!=ttype(t2))return 0;
630else switch(ttype(t1)){
631case 0:
632return 1;
633case 3:
634return luai_numeq(nvalue(t1),nvalue(t2));
635case 1:
636return bvalue(t1)==bvalue(t2);
637case 2:
638return pvalue(t1)==pvalue(t2);
639default:
640return gcvalue(t1)==gcvalue(t2);
641}
642}
643static int luaO_str2d(const char*s,lua_Number*result){
644char*endptr;
645*result=lua_str2number(s,&endptr);
646if(endptr==s)return 0;
647if(*endptr=='x'||*endptr=='X')
648*result=cast_num(strtoul(s,&endptr,16));
649if(*endptr=='\0')return 1;
650while(isspace(cast(unsigned char,*endptr)))endptr++;
651if(*endptr!='\0')return 0;
652return 1;
653}
654static void pushstr(lua_State*L,const char*str){
655setsvalue(L,L->top,luaS_new(L,str));
656incr_top(L);
657}
658static const char*luaO_pushvfstring(lua_State*L,const char*fmt,va_list argp){
659int n=1;
660pushstr(L,"");
661for(;;){
662const char*e=strchr(fmt,'%');
663if(e==NULL)break;
664setsvalue(L,L->top,luaS_newlstr(L,fmt,e-fmt));
665incr_top(L);
666switch(*(e+1)){
667case's':{
668const char*s=va_arg(argp,char*);
669if(s==NULL)s="(null)";
670pushstr(L,s);
671break;
672}
673case'c':{
674char buff[2];
675buff[0]=cast(char,va_arg(argp,int));
676buff[1]='\0';
677pushstr(L,buff);
678break;
679}
680case'd':{
681setnvalue(L->top,cast_num(va_arg(argp,int)));
682incr_top(L);
683break;
684}
685case'f':{
686setnvalue(L->top,cast_num(va_arg(argp,l_uacNumber)));
687incr_top(L);
688break;
689}
690case'p':{
691char buff[4*sizeof(void*)+8];
692sprintf(buff,"%p",va_arg(argp,void*));
693pushstr(L,buff);
694break;
695}
696case'%':{
697pushstr(L,"%");
698break;
699}
700default:{
701char buff[3];
702buff[0]='%';
703buff[1]=*(e+1);
704buff[2]='\0';
705pushstr(L,buff);
706break;
707}
708}
709n+=2;
710fmt=e+2;
711}
712pushstr(L,fmt);
713luaV_concat(L,n+1,cast_int(L->top-L->base)-1);
714L->top-=n;
715return svalue(L->top-1);
716}
717static const char*luaO_pushfstring(lua_State*L,const char*fmt,...){
718const char*msg;
719va_list argp;
720va_start(argp,fmt);
721msg=luaO_pushvfstring(L,fmt,argp);
722va_end(argp);
723return msg;
724}
725static void luaO_chunkid(char*out,const char*source,size_t bufflen){
726if(*source=='='){
727strncpy(out,source+1,bufflen);
728out[bufflen-1]='\0';
729}
730else{
731if(*source=='@'){
732size_t l;
733source++;
734bufflen-=sizeof(" '...' ");
735l=strlen(source);
736strcpy(out,"");
737if(l>bufflen){
738source+=(l-bufflen);
739strcat(out,"...");
740}
741strcat(out,source);
742}
743else{
744size_t len=strcspn(source,"\n\r");
745bufflen-=sizeof(" [string \"...\"] ");
746if(len>bufflen)len=bufflen;
747strcpy(out,"[string \"");
748if(source[len]!='\0'){
749strncat(out,source,len);
750strcat(out,"...");
751}
752else
753strcat(out,source);
754strcat(out,"\"]");
755}
756}
757}
758#define gnode(t,i)(&(t)->node[i])
759#define gkey(n)(&(n)->i_key.nk)
760#define gval(n)(&(n)->i_val)
761#define gnext(n)((n)->i_key.nk.next)
762#define key2tval(n)(&(n)->i_key.tvk)
763static TValue*luaH_setnum(lua_State*L,Table*t,int key);
764static const TValue*luaH_getstr(Table*t,TString*key);
765static TValue*luaH_set(lua_State*L,Table*t,const TValue*key);
766static const char*const luaT_typenames[]={
767"nil","boolean","userdata","number",
768"string","table","function","userdata","thread",
769"proto","upval"
770};
771static void luaT_init(lua_State*L){
772static const char*const luaT_eventname[]={
773"__index","__newindex",
774"__gc","__mode","__eq",
775"__add","__sub","__mul","__div","__mod",
776"__pow","__unm","__len","__lt","__le",
777"__concat","__call"
778};
779int i;
780for(i=0;i<TM_N;i++){
781G(L)->tmname[i]=luaS_new(L,luaT_eventname[i]);
782luaS_fix(G(L)->tmname[i]);
783}
784}
785static const TValue*luaT_gettm(Table*events,TMS event,TString*ename){
786const TValue*tm=luaH_getstr(events,ename);
787if(ttisnil(tm)){
788events->flags|=cast_byte(1u<<event);
789return NULL;
790}
791else return tm;
792}
793static const TValue*luaT_gettmbyobj(lua_State*L,const TValue*o,TMS event){
794Table*mt;
795switch(ttype(o)){
796case 5:
797mt=hvalue(o)->metatable;
798break;
799case 7:
800mt=uvalue(o)->metatable;
801break;
802default:
803mt=G(L)->mt[ttype(o)];
804}
805return(mt?luaH_getstr(mt,G(L)->tmname[event]):(&luaO_nilobject_));
806}
807#define sizeCclosure(n)(cast(int,sizeof(CClosure))+cast(int,sizeof(TValue)*((n)-1)))
808#define sizeLclosure(n)(cast(int,sizeof(LClosure))+cast(int,sizeof(TValue*)*((n)-1)))
809static Closure*luaF_newCclosure(lua_State*L,int nelems,Table*e){
810Closure*c=cast(Closure*,luaM_malloc(L,sizeCclosure(nelems)));
811luaC_link(L,obj2gco(c),6);
812c->c.isC=1;
813c->c.env=e;
814c->c.nupvalues=cast_byte(nelems);
815return c;
816}
817static Closure*luaF_newLclosure(lua_State*L,int nelems,Table*e){
818Closure*c=cast(Closure*,luaM_malloc(L,sizeLclosure(nelems)));
819luaC_link(L,obj2gco(c),6);
820c->l.isC=0;
821c->l.env=e;
822c->l.nupvalues=cast_byte(nelems);
823while(nelems--)c->l.upvals[nelems]=NULL;
824return c;
825}
826static UpVal*luaF_newupval(lua_State*L){
827UpVal*uv=luaM_new(L,UpVal);
828luaC_link(L,obj2gco(uv),(8+2));
829uv->v=&uv->u.value;
830setnilvalue(uv->v);
831return uv;
832}
833static UpVal*luaF_findupval(lua_State*L,StkId level){
834global_State*g=G(L);
835GCObject**pp=&L->openupval;
836UpVal*p;
837UpVal*uv;
838while(*pp!=NULL&&(p=ngcotouv(*pp))->v>=level){
839if(p->v==level){
840if(isdead(g,obj2gco(p)))
841changewhite(obj2gco(p));
842return p;
843}
844pp=&p->next;
845}
846uv=luaM_new(L,UpVal);
847uv->tt=(8+2);
848uv->marked=luaC_white(g);
849uv->v=level;
850uv->next=*pp;
851*pp=obj2gco(uv);
852uv->u.l.prev=&g->uvhead;
853uv->u.l.next=g->uvhead.u.l.next;
854uv->u.l.next->u.l.prev=uv;
855g->uvhead.u.l.next=uv;
856return uv;
857}
858static void unlinkupval(UpVal*uv){
859uv->u.l.next->u.l.prev=uv->u.l.prev;
860uv->u.l.prev->u.l.next=uv->u.l.next;
861}
862static void luaF_freeupval(lua_State*L,UpVal*uv){
863if(uv->v!=&uv->u.value)
864unlinkupval(uv);
865luaM_free(L,uv);
866}
867static void luaF_close(lua_State*L,StkId level){
868UpVal*uv;
869global_State*g=G(L);
870while(L->openupval!=NULL&&(uv=ngcotouv(L->openupval))->v>=level){
871GCObject*o=obj2gco(uv);
872L->openupval=uv->next;
873if(isdead(g,o))
874luaF_freeupval(L,uv);
875else{
876unlinkupval(uv);
877setobj(L,&uv->u.value,uv->v);
878uv->v=&uv->u.value;
879luaC_linkupval(L,uv);
880}
881}
882}
883static Proto*luaF_newproto(lua_State*L){
884Proto*f=luaM_new(L,Proto);
885luaC_link(L,obj2gco(f),(8+1));
886f->k=NULL;
887f->sizek=0;
888f->p=NULL;
889f->sizep=0;
890f->code=NULL;
891f->sizecode=0;
892f->sizelineinfo=0;
893f->sizeupvalues=0;
894f->nups=0;
895f->upvalues=NULL;
896f->numparams=0;
897f->is_vararg=0;
898f->maxstacksize=0;
899f->lineinfo=NULL;
900f->sizelocvars=0;
901f->locvars=NULL;
902f->linedefined=0;
903f->lastlinedefined=0;
904f->source=NULL;
905return f;
906}
907static void luaF_freeproto(lua_State*L,Proto*f){
908luaM_freearray(L,f->code,f->sizecode,Instruction);
909luaM_freearray(L,f->p,f->sizep,Proto*);
910luaM_freearray(L,f->k,f->sizek,TValue);
911luaM_freearray(L,f->lineinfo,f->sizelineinfo,int);
912luaM_freearray(L,f->locvars,f->sizelocvars,struct LocVar);
913luaM_freearray(L,f->upvalues,f->sizeupvalues,TString*);
914luaM_free(L,f);
915}
916static void luaF_freeclosure(lua_State*L,Closure*c){
917int size=(c->c.isC)?sizeCclosure(c->c.nupvalues):
918sizeLclosure(c->l.nupvalues);
919luaM_freemem(L,c,size);
920}
921#define MASK1(n,p)((~((~(Instruction)0)<<n))<<p)
922#define MASK0(n,p)(~MASK1(n,p))
923#define GET_OPCODE(i)(cast(OpCode,((i)>>0)&MASK1(6,0)))
924#define SET_OPCODE(i,o)((i)=(((i)&MASK0(6,0))|((cast(Instruction,o)<<0)&MASK1(6,0))))
925#define GETARG_A(i)(cast(int,((i)>>(0+6))&MASK1(8,0)))
926#define SETARG_A(i,u)((i)=(((i)&MASK0(8,(0+6)))|((cast(Instruction,u)<<(0+6))&MASK1(8,(0+6)))))
927#define GETARG_B(i)(cast(int,((i)>>(((0+6)+8)+9))&MASK1(9,0)))
928#define SETARG_B(i,b)((i)=(((i)&MASK0(9,(((0+6)+8)+9)))|((cast(Instruction,b)<<(((0+6)+8)+9))&MASK1(9,(((0+6)+8)+9)))))
929#define GETARG_C(i)(cast(int,((i)>>((0+6)+8))&MASK1(9,0)))
930#define SETARG_C(i,b)((i)=(((i)&MASK0(9,((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1(9,((0+6)+8)))))
931#define GETARG_Bx(i)(cast(int,((i)>>((0+6)+8))&MASK1((9+9),0)))
932#define SETARG_Bx(i,b)((i)=(((i)&MASK0((9+9),((0+6)+8)))|((cast(Instruction,b)<<((0+6)+8))&MASK1((9+9),((0+6)+8)))))
933#define GETARG_sBx(i)(GETARG_Bx(i)-(((1<<(9+9))-1)>>1))
934#define SETARG_sBx(i,b)SETARG_Bx((i),cast(unsigned int,(b)+(((1<<(9+9))-1)>>1)))
935#define CREATE_ABC(o,a,b,c)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,b)<<(((0+6)+8)+9))|(cast(Instruction,c)<<((0+6)+8)))
936#define CREATE_ABx(o,a,bc)((cast(Instruction,o)<<0)|(cast(Instruction,a)<<(0+6))|(cast(Instruction,bc)<<((0+6)+8)))
937#define ISK(x)((x)&(1<<(9-1)))
938#define INDEXK(r)((int)(r)&~(1<<(9-1)))
939#define RKASK(x)((x)|(1<<(9-1)))
940static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)];
941#define getBMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>4)&3))
942#define getCMode(m)(cast(enum OpArgMask,(luaP_opmodes[m]>>2)&3))
943#define testTMode(m)(luaP_opmodes[m]&(1<<7))
944typedef struct expdesc{
945expkind k;
946union{
947struct{int info,aux;}s;
948lua_Number nval;
949}u;
950int t;
951int f;
952}expdesc;
953typedef struct upvaldesc{
954lu_byte k;
955lu_byte info;
956}upvaldesc;
957struct BlockCnt;
958typedef struct FuncState{
959Proto*f;
960Table*h;
961struct FuncState*prev;
962struct LexState*ls;
963struct lua_State*L;
964struct BlockCnt*bl;
965int pc;
966int lasttarget;
967int jpc;
968int freereg;
969int nk;
970int np;
971short nlocvars;
972lu_byte nactvar;
973upvaldesc upvalues[60];
974unsigned short actvar[200];
975}FuncState;
976static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,
977const char*name);
978struct lua_longjmp{
979struct lua_longjmp*previous;
980jmp_buf b;
981volatile int status;
982};
983static void luaD_seterrorobj(lua_State*L,int errcode,StkId oldtop){
984switch(errcode){
985case 4:{
986setsvalue(L,oldtop,luaS_newliteral(L,"not enough memory"));
987break;
988}
989case 5:{
990setsvalue(L,oldtop,luaS_newliteral(L,"error in error handling"));
991break;
992}
993case 3:
994case 2:{
995setobj(L,oldtop,L->top-1);
996break;
997}
998}
999L->top=oldtop+1;
1000}
1001static void restore_stack_limit(lua_State*L){
1002if(L->size_ci>20000){
1003int inuse=cast_int(L->ci-L->base_ci);
1004if(inuse+1<20000)
1005luaD_reallocCI(L,20000);
1006}
1007}
1008static void resetstack(lua_State*L,int status){
1009L->ci=L->base_ci;
1010L->base=L->ci->base;
1011luaF_close(L,L->base);
1012luaD_seterrorobj(L,status,L->base);
1013L->nCcalls=L->baseCcalls;
1014L->allowhook=1;
1015restore_stack_limit(L);
1016L->errfunc=0;
1017L->errorJmp=NULL;
1018}
1019static void luaD_throw(lua_State*L,int errcode){
1020if(L->errorJmp){
1021L->errorJmp->status=errcode;
1022LUAI_THROW(L,L->errorJmp);
1023}
1024else{
1025L->status=cast_byte(errcode);
1026if(G(L)->panic){
1027resetstack(L,errcode);
1028G(L)->panic(L);
1029}
1030exit(EXIT_FAILURE);
1031}
1032}
1033static int luaD_rawrunprotected(lua_State*L,Pfunc f,void*ud){
1034struct lua_longjmp lj;
1035lj.status=0;
1036lj.previous=L->errorJmp;
1037L->errorJmp=&lj;
1038LUAI_TRY(L,&lj,
1039(*f)(L,ud);
1040);
1041L->errorJmp=lj.previous;
1042return lj.status;
1043}
1044static void correctstack(lua_State*L,TValue*oldstack){
1045CallInfo*ci;
1046GCObject*up;
1047L->top=(L->top-oldstack)+L->stack;
1048for(up=L->openupval;up!=NULL;up=up->gch.next)
1049gco2uv(up)->v=(gco2uv(up)->v-oldstack)+L->stack;
1050for(ci=L->base_ci;ci<=L->ci;ci++){
1051ci->top=(ci->top-oldstack)+L->stack;
1052ci->base=(ci->base-oldstack)+L->stack;
1053ci->func=(ci->func-oldstack)+L->stack;
1054}
1055L->base=(L->base-oldstack)+L->stack;
1056}
1057static void luaD_reallocstack(lua_State*L,int newsize){
1058TValue*oldstack=L->stack;
1059int realsize=newsize+1+5;
1060luaM_reallocvector(L,L->stack,L->stacksize,realsize,TValue);
1061L->stacksize=realsize;
1062L->stack_last=L->stack+newsize;
1063correctstack(L,oldstack);
1064}
1065static void luaD_reallocCI(lua_State*L,int newsize){
1066CallInfo*oldci=L->base_ci;
1067luaM_reallocvector(L,L->base_ci,L->size_ci,newsize,CallInfo);
1068L->size_ci=newsize;
1069L->ci=(L->ci-oldci)+L->base_ci;
1070L->end_ci=L->base_ci+L->size_ci-1;
1071}
1072static void luaD_growstack(lua_State*L,int n){
1073if(n<=L->stacksize)
1074luaD_reallocstack(L,2*L->stacksize);
1075else
1076luaD_reallocstack(L,L->stacksize+n);
1077}
1078static CallInfo*growCI(lua_State*L){
1079if(L->size_ci>20000)
1080luaD_throw(L,5);
1081else{
1082luaD_reallocCI(L,2*L->size_ci);
1083if(L->size_ci>20000)
1084luaG_runerror(L,"stack overflow");
1085}
1086return++L->ci;
1087}
1088static StkId adjust_varargs(lua_State*L,Proto*p,int actual){
1089int i;
1090int nfixargs=p->numparams;
1091Table*htab=NULL;
1092StkId base,fixed;
1093for(;actual<nfixargs;++actual)
1094setnilvalue(L->top++);
1095fixed=L->top-actual;
1096base=L->top;
1097for(i=0;i<nfixargs;i++){
1098setobj(L,L->top++,fixed+i);
1099setnilvalue(fixed+i);
1100}
1101if(htab){
1102sethvalue(L,L->top++,htab);
1103}
1104return base;
1105}
1106static StkId tryfuncTM(lua_State*L,StkId func){
1107const TValue*tm=luaT_gettmbyobj(L,func,TM_CALL);
1108StkId p;
1109ptrdiff_t funcr=savestack(L,func);
1110if(!ttisfunction(tm))
1111luaG_typeerror(L,func,"call");
1112for(p=L->top;p>func;p--)setobj(L,p,p-1);
1113incr_top(L);
1114func=restorestack(L,funcr);
1115setobj(L,func,tm);
1116return func;
1117}
1118#define inc_ci(L)((L->ci==L->end_ci)?growCI(L):(condhardstacktests(luaD_reallocCI(L,L->size_ci)),++L->ci))
1119static int luaD_precall(lua_State*L,StkId func,int nresults){
1120LClosure*cl;
1121ptrdiff_t funcr;
1122if(!ttisfunction(func))
1123func=tryfuncTM(L,func);
1124funcr=savestack(L,func);
1125cl=&clvalue(func)->l;
1126L->ci->savedpc=L->savedpc;
1127if(!cl->isC){
1128CallInfo*ci;
1129StkId st,base;
1130Proto*p=cl->p;
1131luaD_checkstack(L,p->maxstacksize);
1132func=restorestack(L,funcr);
1133if(!p->is_vararg){
1134base=func+1;
1135if(L->top>base+p->numparams)
1136L->top=base+p->numparams;
1137}
1138else{
1139int nargs=cast_int(L->top-func)-1;
1140base=adjust_varargs(L,p,nargs);
1141func=restorestack(L,funcr);
1142}
1143ci=inc_ci(L);
1144ci->func=func;
1145L->base=ci->base=base;
1146ci->top=L->base+p->maxstacksize;
1147L->savedpc=p->code;
1148ci->tailcalls=0;
1149ci->nresults=nresults;
1150for(st=L->top;st<ci->top;st++)
1151setnilvalue(st);
1152L->top=ci->top;
1153return 0;
1154}
1155else{
1156CallInfo*ci;
1157int n;
1158luaD_checkstack(L,20);
1159ci=inc_ci(L);
1160ci->func=restorestack(L,funcr);
1161L->base=ci->base=ci->func+1;
1162ci->top=L->top+20;
1163ci->nresults=nresults;
1164n=(*curr_func(L)->c.f)(L);
1165if(n<0)
1166return 2;
1167else{
1168luaD_poscall(L,L->top-n);
1169return 1;
1170}
1171}
1172}
1173static int luaD_poscall(lua_State*L,StkId firstResult){
1174StkId res;
1175int wanted,i;
1176CallInfo*ci;
1177ci=L->ci--;
1178res=ci->func;
1179wanted=ci->nresults;
1180L->base=(ci-1)->base;
1181L->savedpc=(ci-1)->savedpc;
1182for(i=wanted;i!=0&&firstResult<L->top;i--)
1183setobj(L,res++,firstResult++);
1184while(i-->0)
1185setnilvalue(res++);
1186L->top=res;
1187return(wanted-(-1));
1188}
1189static void luaD_call(lua_State*L,StkId func,int nResults){
1190if(++L->nCcalls>=200){
1191if(L->nCcalls==200)
1192luaG_runerror(L,"C stack overflow");
1193else if(L->nCcalls>=(200+(200>>3)))
1194luaD_throw(L,5);
1195}
1196if(luaD_precall(L,func,nResults)==0)
1197luaV_execute(L,1);
1198L->nCcalls--;
1199luaC_checkGC(L);
1200}
1201static void resume(lua_State*L,void*ud){
1202StkId firstArg=cast(StkId,ud);
1203CallInfo*ci=L->ci;
1204if(L->status==0){
1205if(luaD_precall(L,firstArg-1,(-1))!=0)
1206return;
1207}
1208else{
1209L->status=0;
1210if(!f_isLua(ci)){
1211if(luaD_poscall(L,firstArg))
1212L->top=L->ci->top;
1213}
1214else
1215L->base=L->ci->base;
1216}
1217luaV_execute(L,cast_int(L->ci-L->base_ci));
1218}
1219static int resume_error(lua_State*L,const char*msg){
1220L->top=L->ci->base;
1221setsvalue(L,L->top,luaS_new(L,msg));
1222incr_top(L);
1223return 2;
1224}
1225static int lua_resume(lua_State*L,int nargs){
1226int status;
1227if(L->status!=1&&(L->status!=0||L->ci!=L->base_ci))
1228return resume_error(L,"cannot resume non-suspended coroutine");
1229if(L->nCcalls>=200)
1230return resume_error(L,"C stack overflow");
1231L->baseCcalls=++L->nCcalls;
1232status=luaD_rawrunprotected(L,resume,L->top-nargs);
1233if(status!=0){
1234L->status=cast_byte(status);
1235luaD_seterrorobj(L,status,L->top);
1236L->ci->top=L->top;
1237}
1238else{
1239status=L->status;
1240}
1241--L->nCcalls;
1242return status;
1243}
1244static int lua_yield(lua_State*L,int nresults){
1245if(L->nCcalls>L->baseCcalls)
1246luaG_runerror(L,"attempt to yield across metamethod/C-call boundary");
1247L->base=L->top-nresults;
1248L->status=1;
1249return-1;
1250}
1251static int luaD_pcall(lua_State*L,Pfunc func,void*u,
1252ptrdiff_t old_top,ptrdiff_t ef){
1253int status;
1254unsigned short oldnCcalls=L->nCcalls;
1255ptrdiff_t old_ci=saveci(L,L->ci);
1256lu_byte old_allowhooks=L->allowhook;
1257ptrdiff_t old_errfunc=L->errfunc;
1258L->errfunc=ef;
1259status=luaD_rawrunprotected(L,func,u);
1260if(status!=0){
1261StkId oldtop=restorestack(L,old_top);
1262luaF_close(L,oldtop);
1263luaD_seterrorobj(L,status,oldtop);
1264L->nCcalls=oldnCcalls;
1265L->ci=restoreci(L,old_ci);
1266L->base=L->ci->base;
1267L->savedpc=L->ci->savedpc;
1268L->allowhook=old_allowhooks;
1269restore_stack_limit(L);
1270}
1271L->errfunc=old_errfunc;
1272return status;
1273}
1274struct SParser{
1275ZIO*z;
1276Mbuffer buff;
1277const char*name;
1278};
1279static void f_parser(lua_State*L,void*ud){
1280int i;
1281Proto*tf;
1282Closure*cl;
1283struct SParser*p=cast(struct SParser*,ud);
1284luaC_checkGC(L);
1285tf=luaY_parser(L,p->z,
1286&p->buff,p->name);
1287cl=luaF_newLclosure(L,tf->nups,hvalue(gt(L)));
1288cl->l.p=tf;
1289for(i=0;i<tf->nups;i++)
1290cl->l.upvals[i]=luaF_newupval(L);
1291setclvalue(L,L->top,cl);
1292incr_top(L);
1293}
1294static int luaD_protectedparser(lua_State*L,ZIO*z,const char*name){
1295struct SParser p;
1296int status;
1297p.z=z;p.name=name;
1298luaZ_initbuffer(L,&p.buff);
1299status=luaD_pcall(L,f_parser,&p,savestack(L,L->top),L->errfunc);
1300luaZ_freebuffer(L,&p.buff);
1301return status;
1302}
1303static void luaS_resize(lua_State*L,int newsize){
1304GCObject**newhash;
1305stringtable*tb;
1306int i;
1307if(G(L)->gcstate==2)
1308return;
1309newhash=luaM_newvector(L,newsize,GCObject*);
1310tb=&G(L)->strt;
1311for(i=0;i<newsize;i++)newhash[i]=NULL;
1312for(i=0;i<tb->size;i++){
1313GCObject*p=tb->hash[i];
1314while(p){
1315GCObject*next=p->gch.next;
1316unsigned int h=gco2ts(p)->hash;
1317int h1=lmod(h,newsize);
1318p->gch.next=newhash[h1];
1319newhash[h1]=p;
1320p=next;
1321}
1322}
1323luaM_freearray(L,tb->hash,tb->size,TString*);
1324tb->size=newsize;
1325tb->hash=newhash;
1326}
1327static TString*newlstr(lua_State*L,const char*str,size_t l,
1328unsigned int h){
1329TString*ts;
1330stringtable*tb;
1331if(l+1>(((size_t)(~(size_t)0)-2)-sizeof(TString))/sizeof(char))
1332luaM_toobig(L);
1333ts=cast(TString*,luaM_malloc(L,(l+1)*sizeof(char)+sizeof(TString)));
1334ts->tsv.len=l;
1335ts->tsv.hash=h;
1336ts->tsv.marked=luaC_white(G(L));
1337ts->tsv.tt=4;
1338ts->tsv.reserved=0;
1339memcpy(ts+1,str,l*sizeof(char));
1340((char*)(ts+1))[l]='\0';
1341tb=&G(L)->strt;
1342h=lmod(h,tb->size);
1343ts->tsv.next=tb->hash[h];
1344tb->hash[h]=obj2gco(ts);
1345tb->nuse++;
1346if(tb->nuse>cast(lu_int32,tb->size)&&tb->size<=(INT_MAX-2)/2)
1347luaS_resize(L,tb->size*2);
1348return ts;
1349}
1350static TString*luaS_newlstr(lua_State*L,const char*str,size_t l){
1351GCObject*o;
1352unsigned int h=cast(unsigned int,l);
1353size_t step=(l>>5)+1;
1354size_t l1;
1355for(l1=l;l1>=step;l1-=step)
1356h=h^((h<<5)+(h>>2)+cast(unsigned char,str[l1-1]));
1357for(o=G(L)->strt.hash[lmod(h,G(L)->strt.size)];
1358o!=NULL;
1359o=o->gch.next){
1360TString*ts=rawgco2ts(o);
1361if(ts->tsv.len==l&&(memcmp(str,getstr(ts),l)==0)){
1362if(isdead(G(L),o))changewhite(o);
1363return ts;
1364}
1365}
1366return newlstr(L,str,l,h);
1367}
1368static Udata*luaS_newudata(lua_State*L,size_t s,Table*e){
1369Udata*u;
1370if(s>((size_t)(~(size_t)0)-2)-sizeof(Udata))
1371luaM_toobig(L);
1372u=cast(Udata*,luaM_malloc(L,s+sizeof(Udata)));
1373u->uv.marked=luaC_white(G(L));
1374u->uv.tt=7;
1375u->uv.len=s;
1376u->uv.metatable=NULL;
1377u->uv.env=e;
1378u->uv.next=G(L)->mainthread->next;
1379G(L)->mainthread->next=obj2gco(u);
1380return u;
1381}
1382#define hashpow2(t,n)(gnode(t,lmod((n),sizenode(t))))
1383#define hashstr(t,str)hashpow2(t,(str)->tsv.hash)
1384#define hashboolean(t,p)hashpow2(t,p)
1385#define hashmod(t,n)(gnode(t,((n)%((sizenode(t)-1)|1))))
1386#define hashpointer(t,p)hashmod(t,IntPoint(p))
1387static const Node dummynode_={
1388{{NULL},0},
1389{{{NULL},0,NULL}}
1390};
1391static Node*hashnum(const Table*t,lua_Number n){
1392unsigned int a[cast_int(sizeof(lua_Number)/sizeof(int))];
1393int i;
1394if(luai_numeq(n,0))
1395return gnode(t,0);
1396memcpy(a,&n,sizeof(a));
1397for(i=1;i<cast_int(sizeof(lua_Number)/sizeof(int));i++)a[0]+=a[i];
1398return hashmod(t,a[0]);
1399}
1400static Node*mainposition(const Table*t,const TValue*key){
1401switch(ttype(key)){
1402case 3:
1403return hashnum(t,nvalue(key));
1404case 4:
1405return hashstr(t,rawtsvalue(key));
1406case 1:
1407return hashboolean(t,bvalue(key));
1408case 2:
1409return hashpointer(t,pvalue(key));
1410default:
1411return hashpointer(t,gcvalue(key));
1412}
1413}
1414static int arrayindex(const TValue*key){
1415if(ttisnumber(key)){
1416lua_Number n=nvalue(key);
1417int k;
1418lua_number2int(k,n);
1419if(luai_numeq(cast_num(k),n))
1420return k;
1421}
1422return-1;
1423}
1424static int findindex(lua_State*L,Table*t,StkId key){
1425int i;
1426if(ttisnil(key))return-1;
1427i=arrayindex(key);
1428if(0<i&&i<=t->sizearray)
1429return i-1;
1430else{
1431Node*n=mainposition(t,key);
1432do{
1433if(luaO_rawequalObj(key2tval(n),key)||
1434(ttype(gkey(n))==(8+3)&&iscollectable(key)&&
1435gcvalue(gkey(n))==gcvalue(key))){
1436i=cast_int(n-gnode(t,0));
1437return i+t->sizearray;
1438}
1439else n=gnext(n);
1440}while(n);
1441luaG_runerror(L,"invalid key to "LUA_QL("next"));
1442return 0;
1443}
1444}
1445static int luaH_next(lua_State*L,Table*t,StkId key){
1446int i=findindex(L,t,key);
1447for(i++;i<t->sizearray;i++){
1448if(!ttisnil(&t->array[i])){
1449setnvalue(key,cast_num(i+1));
1450setobj(L,key+1,&t->array[i]);
1451return 1;
1452}
1453}
1454for(i-=t->sizearray;i<(int)sizenode(t);i++){
1455if(!ttisnil(gval(gnode(t,i)))){
1456setobj(L,key,key2tval(gnode(t,i)));
1457setobj(L,key+1,gval(gnode(t,i)));
1458return 1;
1459}
1460}
1461return 0;
1462}
1463static int computesizes(int nums[],int*narray){
1464int i;
1465int twotoi;
1466int a=0;
1467int na=0;
1468int n=0;
1469for(i=0,twotoi=1;twotoi/2<*narray;i++,twotoi*=2){
1470if(nums[i]>0){
1471a+=nums[i];
1472if(a>twotoi/2){
1473n=twotoi;
1474na=a;
1475}
1476}
1477if(a==*narray)break;
1478}
1479*narray=n;
1480return na;
1481}
1482static int countint(const TValue*key,int*nums){
1483int k=arrayindex(key);
1484if(0<k&&k<=(1<<(32-2))){
1485nums[ceillog2(k)]++;
1486return 1;
1487}
1488else
1489return 0;
1490}
1491static int numusearray(const Table*t,int*nums){
1492int lg;
1493int ttlg;
1494int ause=0;
1495int i=1;
1496for(lg=0,ttlg=1;lg<=(32-2);lg++,ttlg*=2){
1497int lc=0;
1498int lim=ttlg;
1499if(lim>t->sizearray){
1500lim=t->sizearray;
1501if(i>lim)
1502break;
1503}
1504for(;i<=lim;i++){
1505if(!ttisnil(&t->array[i-1]))
1506lc++;
1507}
1508nums[lg]+=lc;
1509ause+=lc;
1510}
1511return ause;
1512}
1513static int numusehash(const Table*t,int*nums,int*pnasize){
1514int totaluse=0;
1515int ause=0;
1516int i=sizenode(t);
1517while(i--){
1518Node*n=&t->node[i];
1519if(!ttisnil(gval(n))){
1520ause+=countint(key2tval(n),nums);
1521totaluse++;
1522}
1523}
1524*pnasize+=ause;
1525return totaluse;
1526}
1527static void setarrayvector(lua_State*L,Table*t,int size){
1528int i;
1529luaM_reallocvector(L,t->array,t->sizearray,size,TValue);
1530for(i=t->sizearray;i<size;i++)
1531setnilvalue(&t->array[i]);
1532t->sizearray=size;
1533}
1534static void setnodevector(lua_State*L,Table*t,int size){
1535int lsize;
1536if(size==0){
1537t->node=cast(Node*,(&dummynode_));
1538lsize=0;
1539}
1540else{
1541int i;
1542lsize=ceillog2(size);
1543if(lsize>(32-2))
1544luaG_runerror(L,"table overflow");
1545size=twoto(lsize);
1546t->node=luaM_newvector(L,size,Node);
1547for(i=0;i<size;i++){
1548Node*n=gnode(t,i);
1549gnext(n)=NULL;
1550setnilvalue(gkey(n));
1551setnilvalue(gval(n));
1552}
1553}
1554t->lsizenode=cast_byte(lsize);
1555t->lastfree=gnode(t,size);
1556}
1557static void resize(lua_State*L,Table*t,int nasize,int nhsize){
1558int i;
1559int oldasize=t->sizearray;
1560int oldhsize=t->lsizenode;
1561Node*nold=t->node;
1562if(nasize>oldasize)
1563setarrayvector(L,t,nasize);
1564setnodevector(L,t,nhsize);
1565if(nasize<oldasize){
1566t->sizearray=nasize;
1567for(i=nasize;i<oldasize;i++){
1568if(!ttisnil(&t->array[i]))
1569setobj(L,luaH_setnum(L,t,i+1),&t->array[i]);
1570}
1571luaM_reallocvector(L,t->array,oldasize,nasize,TValue);
1572}
1573for(i=twoto(oldhsize)-1;i>=0;i--){
1574Node*old=nold+i;
1575if(!ttisnil(gval(old)))
1576setobj(L,luaH_set(L,t,key2tval(old)),gval(old));
1577}
1578if(nold!=(&dummynode_))
1579luaM_freearray(L,nold,twoto(oldhsize),Node);
1580}
1581static void luaH_resizearray(lua_State*L,Table*t,int nasize){
1582int nsize=(t->node==(&dummynode_))?0:sizenode(t);
1583resize(L,t,nasize,nsize);
1584}
1585static void rehash(lua_State*L,Table*t,const TValue*ek){
1586int nasize,na;
1587int nums[(32-2)+1];
1588int i;
1589int totaluse;
1590for(i=0;i<=(32-2);i++)nums[i]=0;
1591nasize=numusearray(t,nums);
1592totaluse=nasize;
1593totaluse+=numusehash(t,nums,&nasize);
1594nasize+=countint(ek,nums);
1595totaluse++;
1596na=computesizes(nums,&nasize);
1597resize(L,t,nasize,totaluse-na);
1598}
1599static Table*luaH_new(lua_State*L,int narray,int nhash){
1600Table*t=luaM_new(L,Table);
1601luaC_link(L,obj2gco(t),5);
1602t->metatable=NULL;
1603t->flags=cast_byte(~0);
1604t->array=NULL;
1605t->sizearray=0;
1606t->lsizenode=0;
1607t->node=cast(Node*,(&dummynode_));
1608setarrayvector(L,t,narray);
1609setnodevector(L,t,nhash);
1610return t;
1611}
1612static void luaH_free(lua_State*L,Table*t){
1613if(t->node!=(&dummynode_))
1614luaM_freearray(L,t->node,sizenode(t),Node);
1615luaM_freearray(L,t->array,t->sizearray,TValue);
1616luaM_free(L,t);
1617}
1618static Node*getfreepos(Table*t){
1619while(t->lastfree-->t->node){
1620if(ttisnil(gkey(t->lastfree)))
1621return t->lastfree;
1622}
1623return NULL;
1624}
1625static TValue*newkey(lua_State*L,Table*t,const TValue*key){
1626Node*mp=mainposition(t,key);
1627if(!ttisnil(gval(mp))||mp==(&dummynode_)){
1628Node*othern;
1629Node*n=getfreepos(t);
1630if(n==NULL){
1631rehash(L,t,key);
1632return luaH_set(L,t,key);
1633}
1634othern=mainposition(t,key2tval(mp));
1635if(othern!=mp){
1636while(gnext(othern)!=mp)othern=gnext(othern);
1637gnext(othern)=n;
1638*n=*mp;
1639gnext(mp)=NULL;
1640setnilvalue(gval(mp));
1641}
1642else{
1643gnext(n)=gnext(mp);
1644gnext(mp)=n;
1645mp=n;
1646}
1647}
1648gkey(mp)->value=key->value;gkey(mp)->tt=key->tt;
1649luaC_barriert(L,t,key);
1650return gval(mp);
1651}
1652static const TValue*luaH_getnum(Table*t,int key){
1653if(cast(unsigned int,key-1)<cast(unsigned int,t->sizearray))
1654return&t->array[key-1];
1655else{
1656lua_Number nk=cast_num(key);
1657Node*n=hashnum(t,nk);
1658do{
1659if(ttisnumber(gkey(n))&&luai_numeq(nvalue(gkey(n)),nk))
1660return gval(n);
1661else n=gnext(n);
1662}while(n);
1663return(&luaO_nilobject_);
1664}
1665}
1666static const TValue*luaH_getstr(Table*t,TString*key){
1667Node*n=hashstr(t,key);
1668do{
1669if(ttisstring(gkey(n))&&rawtsvalue(gkey(n))==key)
1670return gval(n);
1671else n=gnext(n);
1672}while(n);
1673return(&luaO_nilobject_);
1674}
1675static const TValue*luaH_get(Table*t,const TValue*key){
1676switch(ttype(key)){
1677case 0:return(&luaO_nilobject_);
1678case 4:return luaH_getstr(t,rawtsvalue(key));
1679case 3:{
1680int k;
1681lua_Number n=nvalue(key);
1682lua_number2int(k,n);
1683if(luai_numeq(cast_num(k),nvalue(key)))
1684return luaH_getnum(t,k);
1685}
1686default:{
1687Node*n=mainposition(t,key);
1688do{
1689if(luaO_rawequalObj(key2tval(n),key))
1690return gval(n);
1691else n=gnext(n);
1692}while(n);
1693return(&luaO_nilobject_);
1694}
1695}
1696}
1697static TValue*luaH_set(lua_State*L,Table*t,const TValue*key){
1698const TValue*p=luaH_get(t,key);
1699t->flags=0;
1700if(p!=(&luaO_nilobject_))
1701return cast(TValue*,p);
1702else{
1703if(ttisnil(key))luaG_runerror(L,"table index is nil");
1704else if(ttisnumber(key)&&luai_numisnan(nvalue(key)))
1705luaG_runerror(L,"table index is NaN");
1706return newkey(L,t,key);
1707}
1708}
1709static TValue*luaH_setnum(lua_State*L,Table*t,int key){
1710const TValue*p=luaH_getnum(t,key);
1711if(p!=(&luaO_nilobject_))
1712return cast(TValue*,p);
1713else{
1714TValue k;
1715setnvalue(&k,cast_num(key));
1716return newkey(L,t,&k);
1717}
1718}
1719static TValue*luaH_setstr(lua_State*L,Table*t,TString*key){
1720const TValue*p=luaH_getstr(t,key);
1721if(p!=(&luaO_nilobject_))
1722return cast(TValue*,p);
1723else{
1724TValue k;
1725setsvalue(L,&k,key);
1726return newkey(L,t,&k);
1727}
1728}
1729static int unbound_search(Table*t,unsigned int j){
1730unsigned int i=j;
1731j++;
1732while(!ttisnil(luaH_getnum(t,j))){
1733i=j;
1734j*=2;
1735if(j>cast(unsigned int,(INT_MAX-2))){
1736i=1;
1737while(!ttisnil(luaH_getnum(t,i)))i++;
1738return i-1;
1739}
1740}
1741while(j-i>1){
1742unsigned int m=(i+j)/2;
1743if(ttisnil(luaH_getnum(t,m)))j=m;
1744else i=m;
1745}
1746return i;
1747}
1748static int luaH_getn(Table*t){
1749unsigned int j=t->sizearray;
1750if(j>0&&ttisnil(&t->array[j-1])){
1751unsigned int i=0;
1752while(j-i>1){
1753unsigned int m=(i+j)/2;
1754if(ttisnil(&t->array[m-1]))j=m;
1755else i=m;
1756}
1757return i;
1758}
1759else if(t->node==(&dummynode_))
1760return j;
1761else return unbound_search(t,j);
1762}
1763#define makewhite(g,x)((x)->gch.marked=cast_byte(((x)->gch.marked&cast_byte(~(bitmask(2)|bit2mask(0,1))))|luaC_white(g)))
1764#define white2gray(x)reset2bits((x)->gch.marked,0,1)
1765#define black2gray(x)resetbit((x)->gch.marked,2)
1766#define stringmark(s)reset2bits((s)->tsv.marked,0,1)
1767#define isfinalized(u)testbit((u)->marked,3)
1768#define markfinalized(u)l_setbit((u)->marked,3)
1769#define markvalue(g,o){checkconsistency(o);if(iscollectable(o)&&iswhite(gcvalue(o)))reallymarkobject(g,gcvalue(o));}
1770#define markobject(g,t){if(iswhite(obj2gco(t)))reallymarkobject(g,obj2gco(t));}
1771#define setthreshold(g)(g->GCthreshold=(g->estimate/100)*g->gcpause)
1772static void removeentry(Node*n){
1773if(iscollectable(gkey(n)))
1774setttype(gkey(n),(8+3));
1775}
1776static void reallymarkobject(global_State*g,GCObject*o){
1777white2gray(o);
1778switch(o->gch.tt){
1779case 4:{
1780return;
1781}
1782case 7:{
1783Table*mt=gco2u(o)->metatable;
1784gray2black(o);
1785if(mt)markobject(g,mt);
1786markobject(g,gco2u(o)->env);
1787return;
1788}
1789case(8+2):{
1790UpVal*uv=gco2uv(o);
1791markvalue(g,uv->v);
1792if(uv->v==&uv->u.value)
1793gray2black(o);
1794return;
1795}
1796case 6:{
1797gco2cl(o)->c.gclist=g->gray;
1798g->gray=o;
1799break;
1800}
1801case 5:{
1802gco2h(o)->gclist=g->gray;
1803g->gray=o;
1804break;
1805}
1806case 8:{
1807gco2th(o)->gclist=g->gray;
1808g->gray=o;
1809break;
1810}
1811case(8+1):{
1812gco2p(o)->gclist=g->gray;
1813g->gray=o;
1814break;
1815}
1816default:;
1817}
1818}
1819static void marktmu(global_State*g){
1820GCObject*u=g->tmudata;
1821if(u){
1822do{
1823u=u->gch.next;
1824makewhite(g,u);
1825reallymarkobject(g,u);
1826}while(u!=g->tmudata);
1827}
1828}
1829static size_t luaC_separateudata(lua_State*L,int all){
1830global_State*g=G(L);
1831size_t deadmem=0;
1832GCObject**p=&g->mainthread->next;
1833GCObject*curr;
1834while((curr=*p)!=NULL){
1835if(!(iswhite(curr)||all)||isfinalized(gco2u(curr)))
1836p=&curr->gch.next;
1837else if(fasttm(L,gco2u(curr)->metatable,TM_GC)==NULL){
1838markfinalized(gco2u(curr));
1839p=&curr->gch.next;
1840}
1841else{
1842deadmem+=sizeudata(gco2u(curr));
1843markfinalized(gco2u(curr));
1844*p=curr->gch.next;
1845if(g->tmudata==NULL)
1846g->tmudata=curr->gch.next=curr;
1847else{
1848curr->gch.next=g->tmudata->gch.next;
1849g->tmudata->gch.next=curr;
1850g->tmudata=curr;
1851}
1852}
1853}
1854return deadmem;
1855}
1856static int traversetable(global_State*g,Table*h){
1857int i;
1858int weakkey=0;
1859int weakvalue=0;
1860const TValue*mode;
1861if(h->metatable)
1862markobject(g,h->metatable);
1863mode=gfasttm(g,h->metatable,TM_MODE);
1864if(mode&&ttisstring(mode)){
1865weakkey=(strchr(svalue(mode),'k')!=NULL);
1866weakvalue=(strchr(svalue(mode),'v')!=NULL);
1867if(weakkey||weakvalue){
1868h->marked&=~(bitmask(3)|bitmask(4));
1869h->marked|=cast_byte((weakkey<<3)|
1870(weakvalue<<4));
1871h->gclist=g->weak;
1872g->weak=obj2gco(h);
1873}
1874}
1875if(weakkey&&weakvalue)return 1;
1876if(!weakvalue){
1877i=h->sizearray;
1878while(i--)
1879markvalue(g,&h->array[i]);
1880}
1881i=sizenode(h);
1882while(i--){
1883Node*n=gnode(h,i);
1884if(ttisnil(gval(n)))
1885removeentry(n);
1886else{
1887if(!weakkey)markvalue(g,gkey(n));
1888if(!weakvalue)markvalue(g,gval(n));
1889}
1890}
1891return weakkey||weakvalue;
1892}
1893static void traverseproto(global_State*g,Proto*f){
1894int i;
1895if(f->source)stringmark(f->source);
1896for(i=0;i<f->sizek;i++)
1897markvalue(g,&f->k[i]);
1898for(i=0;i<f->sizeupvalues;i++){
1899if(f->upvalues[i])
1900stringmark(f->upvalues[i]);
1901}
1902for(i=0;i<f->sizep;i++){
1903if(f->p[i])
1904markobject(g,f->p[i]);
1905}
1906for(i=0;i<f->sizelocvars;i++){
1907if(f->locvars[i].varname)
1908stringmark(f->locvars[i].varname);
1909}
1910}
1911static void traverseclosure(global_State*g,Closure*cl){
1912markobject(g,cl->c.env);
1913if(cl->c.isC){
1914int i;
1915for(i=0;i<cl->c.nupvalues;i++)
1916markvalue(g,&cl->c.upvalue[i]);
1917}
1918else{
1919int i;
1920markobject(g,cl->l.p);
1921for(i=0;i<cl->l.nupvalues;i++)
1922markobject(g,cl->l.upvals[i]);
1923}
1924}
1925static void checkstacksizes(lua_State*L,StkId max){
1926int ci_used=cast_int(L->ci-L->base_ci);
1927int s_used=cast_int(max-L->stack);
1928if(L->size_ci>20000)
1929return;
1930if(4*ci_used<L->size_ci&&2*8<L->size_ci)
1931luaD_reallocCI(L,L->size_ci/2);
1932condhardstacktests(luaD_reallocCI(L,ci_used+1));
1933if(4*s_used<L->stacksize&&
19342*((2*20)+5)<L->stacksize)
1935luaD_reallocstack(L,L->stacksize/2);
1936condhardstacktests(luaD_reallocstack(L,s_used));
1937}
1938static void traversestack(global_State*g,lua_State*l){
1939StkId o,lim;
1940CallInfo*ci;
1941markvalue(g,gt(l));
1942lim=l->top;
1943for(ci=l->base_ci;ci<=l->ci;ci++){
1944if(lim<ci->top)lim=ci->top;
1945}
1946for(o=l->stack;o<l->top;o++)
1947markvalue(g,o);
1948for(;o<=lim;o++)
1949setnilvalue(o);
1950checkstacksizes(l,lim);
1951}
1952static l_mem propagatemark(global_State*g){
1953GCObject*o=g->gray;
1954gray2black(o);
1955switch(o->gch.tt){
1956case 5:{
1957Table*h=gco2h(o);
1958g->gray=h->gclist;
1959if(traversetable(g,h))
1960black2gray(o);
1961return sizeof(Table)+sizeof(TValue)*h->sizearray+
1962sizeof(Node)*sizenode(h);
1963}
1964case 6:{
1965Closure*cl=gco2cl(o);
1966g->gray=cl->c.gclist;
1967traverseclosure(g,cl);
1968return(cl->c.isC)?sizeCclosure(cl->c.nupvalues):
1969sizeLclosure(cl->l.nupvalues);
1970}
1971case 8:{
1972lua_State*th=gco2th(o);
1973g->gray=th->gclist;
1974th->gclist=g->grayagain;
1975g->grayagain=o;
1976black2gray(o);
1977traversestack(g,th);
1978return sizeof(lua_State)+sizeof(TValue)*th->stacksize+
1979sizeof(CallInfo)*th->size_ci;
1980}
1981case(8+1):{
1982Proto*p=gco2p(o);
1983g->gray=p->gclist;
1984traverseproto(g,p);
1985return sizeof(Proto)+sizeof(Instruction)*p->sizecode+
1986sizeof(Proto*)*p->sizep+
1987sizeof(TValue)*p->sizek+
1988sizeof(int)*p->sizelineinfo+
1989sizeof(LocVar)*p->sizelocvars+
1990sizeof(TString*)*p->sizeupvalues;
1991}
1992default:return 0;
1993}
1994}
1995static size_t propagateall(global_State*g){
1996size_t m=0;
1997while(g->gray)m+=propagatemark(g);
1998return m;
1999}
2000static int iscleared(const TValue*o,int iskey){
2001if(!iscollectable(o))return 0;
2002if(ttisstring(o)){
2003stringmark(rawtsvalue(o));
2004return 0;
2005}
2006return iswhite(gcvalue(o))||
2007(ttisuserdata(o)&&(!iskey&&isfinalized(uvalue(o))));
2008}
2009static void cleartable(GCObject*l){
2010while(l){
2011Table*h=gco2h(l);
2012int i=h->sizearray;
2013if(testbit(h->marked,4)){
2014while(i--){
2015TValue*o=&h->array[i];
2016if(iscleared(o,0))
2017setnilvalue(o);
2018}
2019}
2020i=sizenode(h);
2021while(i--){
2022Node*n=gnode(h,i);
2023if(!ttisnil(gval(n))&&
2024(iscleared(key2tval(n),1)||iscleared(gval(n),0))){
2025setnilvalue(gval(n));
2026removeentry(n);
2027}
2028}
2029l=h->gclist;
2030}
2031}
2032static void freeobj(lua_State*L,GCObject*o){
2033switch(o->gch.tt){
2034case(8+1):luaF_freeproto(L,gco2p(o));break;
2035case 6:luaF_freeclosure(L,gco2cl(o));break;
2036case(8+2):luaF_freeupval(L,gco2uv(o));break;
2037case 5:luaH_free(L,gco2h(o));break;
2038case 8:{
2039luaE_freethread(L,gco2th(o));
2040break;
2041}
2042case 4:{
2043G(L)->strt.nuse--;
2044luaM_freemem(L,o,sizestring(gco2ts(o)));
2045break;
2046}
2047case 7:{
2048luaM_freemem(L,o,sizeudata(gco2u(o)));
2049break;
2050}
2051default:;
2052}
2053}
2054#define sweepwholelist(L,p)sweeplist(L,p,((lu_mem)(~(lu_mem)0)-2))
2055static GCObject**sweeplist(lua_State*L,GCObject**p,lu_mem count){
2056GCObject*curr;
2057global_State*g=G(L);
2058int deadmask=otherwhite(g);
2059while((curr=*p)!=NULL&&count-->0){
2060if(curr->gch.tt==8)
2061sweepwholelist(L,&gco2th(curr)->openupval);
2062if((curr->gch.marked^bit2mask(0,1))&deadmask){
2063makewhite(g,curr);
2064p=&curr->gch.next;
2065}
2066else{
2067*p=curr->gch.next;
2068if(curr==g->rootgc)
2069g->rootgc=curr->gch.next;
2070freeobj(L,curr);
2071}
2072}
2073return p;
2074}
2075static void checkSizes(lua_State*L){
2076global_State*g=G(L);
2077if(g->strt.nuse<cast(lu_int32,g->strt.size/4)&&
2078g->strt.size>32*2)
2079luaS_resize(L,g->strt.size/2);
2080if(luaZ_sizebuffer(&g->buff)>32*2){
2081size_t newsize=luaZ_sizebuffer(&g->buff)/2;
2082luaZ_resizebuffer(L,&g->buff,newsize);
2083}
2084}
2085static void GCTM(lua_State*L){
2086global_State*g=G(L);
2087GCObject*o=g->tmudata->gch.next;
2088Udata*udata=rawgco2u(o);
2089const TValue*tm;
2090if(o==g->tmudata)
2091g->tmudata=NULL;
2092else
2093g->tmudata->gch.next=udata->uv.next;
2094udata->uv.next=g->mainthread->next;
2095g->mainthread->next=o;
2096makewhite(g,o);
2097tm=fasttm(L,udata->uv.metatable,TM_GC);
2098if(tm!=NULL){
2099lu_byte oldah=L->allowhook;
2100lu_mem oldt=g->GCthreshold;
2101L->allowhook=0;
2102g->GCthreshold=2*g->totalbytes;
2103setobj(L,L->top,tm);
2104setuvalue(L,L->top+1,udata);
2105L->top+=2;
2106luaD_call(L,L->top-2,0);
2107L->allowhook=oldah;
2108g->GCthreshold=oldt;
2109}
2110}
2111static void luaC_callGCTM(lua_State*L){
2112while(G(L)->tmudata)
2113GCTM(L);
2114}
2115static void luaC_freeall(lua_State*L){
2116global_State*g=G(L);
2117int i;
2118g->currentwhite=bit2mask(0,1)|bitmask(6);
2119sweepwholelist(L,&g->rootgc);
2120for(i=0;i<g->strt.size;i++)
2121sweepwholelist(L,&g->strt.hash[i]);
2122}
2123static void markmt(global_State*g){
2124int i;
2125for(i=0;i<(8+1);i++)
2126if(g->mt[i])markobject(g,g->mt[i]);
2127}
2128static void markroot(lua_State*L){
2129global_State*g=G(L);
2130g->gray=NULL;
2131g->grayagain=NULL;
2132g->weak=NULL;
2133markobject(g,g->mainthread);
2134markvalue(g,gt(g->mainthread));
2135markvalue(g,registry(L));
2136markmt(g);
2137g->gcstate=1;
2138}
2139static void remarkupvals(global_State*g){
2140UpVal*uv;
2141for(uv=g->uvhead.u.l.next;uv!=&g->uvhead;uv=uv->u.l.next){
2142if(isgray(obj2gco(uv)))
2143markvalue(g,uv->v);
2144}
2145}
2146static void atomic(lua_State*L){
2147global_State*g=G(L);
2148size_t udsize;
2149remarkupvals(g);
2150propagateall(g);
2151g->gray=g->weak;
2152g->weak=NULL;
2153markobject(g,L);
2154markmt(g);
2155propagateall(g);
2156g->gray=g->grayagain;
2157g->grayagain=NULL;
2158propagateall(g);
2159udsize=luaC_separateudata(L,0);
2160marktmu(g);
2161udsize+=propagateall(g);
2162cleartable(g->weak);
2163g->currentwhite=cast_byte(otherwhite(g));
2164g->sweepstrgc=0;
2165g->sweepgc=&g->rootgc;
2166g->gcstate=2;
2167g->estimate=g->totalbytes-udsize;
2168}
2169static l_mem singlestep(lua_State*L){
2170global_State*g=G(L);
2171switch(g->gcstate){
2172case 0:{
2173markroot(L);
2174return 0;
2175}
2176case 1:{
2177if(g->gray)
2178return propagatemark(g);
2179else{
2180atomic(L);
2181return 0;
2182}
2183}
2184case 2:{
2185lu_mem old=g->totalbytes;
2186sweepwholelist(L,&g->strt.hash[g->sweepstrgc++]);
2187if(g->sweepstrgc>=g->strt.size)
2188g->gcstate=3;
2189g->estimate-=old-g->totalbytes;
2190return 10;
2191}
2192case 3:{
2193lu_mem old=g->totalbytes;
2194g->sweepgc=sweeplist(L,g->sweepgc,40);
2195if(*g->sweepgc==NULL){
2196checkSizes(L);
2197g->gcstate=4;
2198}
2199g->estimate-=old-g->totalbytes;
2200return 40*10;
2201}
2202case 4:{
2203if(g->tmudata){
2204GCTM(L);
2205if(g->estimate>100)
2206g->estimate-=100;
2207return 100;
2208}
2209else{
2210g->gcstate=0;
2211g->gcdept=0;
2212return 0;
2213}
2214}
2215default:return 0;
2216}
2217}
2218static void luaC_step(lua_State*L){
2219global_State*g=G(L);
2220l_mem lim=(1024u/100)*g->gcstepmul;
2221if(lim==0)
2222lim=(((lu_mem)(~(lu_mem)0)-2)-1)/2;
2223g->gcdept+=g->totalbytes-g->GCthreshold;
2224do{
2225lim-=singlestep(L);
2226if(g->gcstate==0)
2227break;
2228}while(lim>0);
2229if(g->gcstate!=0){
2230if(g->gcdept<1024u)
2231g->GCthreshold=g->totalbytes+1024u;
2232else{
2233g->gcdept-=1024u;
2234g->GCthreshold=g->totalbytes;
2235}
2236}
2237else{
2238setthreshold(g);
2239}
2240}
2241static void luaC_barrierf(lua_State*L,GCObject*o,GCObject*v){
2242global_State*g=G(L);
2243if(g->gcstate==1)
2244reallymarkobject(g,v);
2245else
2246makewhite(g,o);
2247}
2248static void luaC_barrierback(lua_State*L,Table*t){
2249global_State*g=G(L);
2250GCObject*o=obj2gco(t);
2251black2gray(o);
2252t->gclist=g->grayagain;
2253g->grayagain=o;
2254}
2255static void luaC_link(lua_State*L,GCObject*o,lu_byte tt){
2256global_State*g=G(L);
2257o->gch.next=g->rootgc;
2258g->rootgc=o;
2259o->gch.marked=luaC_white(g);
2260o->gch.tt=tt;
2261}
2262static void luaC_linkupval(lua_State*L,UpVal*uv){
2263global_State*g=G(L);
2264GCObject*o=obj2gco(uv);
2265o->gch.next=g->rootgc;
2266g->rootgc=o;
2267if(isgray(o)){
2268if(g->gcstate==1){
2269gray2black(o);
2270luaC_barrier(L,uv,uv->v);
2271}
2272else{
2273makewhite(g,o);
2274}
2275}
2276}
2277typedef union{
2278lua_Number r;
2279TString*ts;
2280}SemInfo;
2281typedef struct Token{
2282int token;
2283SemInfo seminfo;
2284}Token;
2285typedef struct LexState{
2286int current;
2287int linenumber;
2288int lastline;
2289Token t;
2290Token lookahead;
2291struct FuncState*fs;
2292struct lua_State*L;
2293ZIO*z;
2294Mbuffer*buff;
2295TString*source;
2296char decpoint;
2297}LexState;
2298static void luaX_init(lua_State*L);
2299static void luaX_lexerror(LexState*ls,const char*msg,int token);
2300#define state_size(x)(sizeof(x)+0)
2301#define fromstate(l)(cast(lu_byte*,(l))-0)
2302#define tostate(l)(cast(lua_State*,cast(lu_byte*,l)+0))
2303typedef struct LG{
2304lua_State l;
2305global_State g;
2306}LG;
2307static void stack_init(lua_State*L1,lua_State*L){
2308L1->base_ci=luaM_newvector(L,8,CallInfo);
2309L1->ci=L1->base_ci;
2310L1->size_ci=8;
2311L1->end_ci=L1->base_ci+L1->size_ci-1;
2312L1->stack=luaM_newvector(L,(2*20)+5,TValue);
2313L1->stacksize=(2*20)+5;
2314L1->top=L1->stack;
2315L1->stack_last=L1->stack+(L1->stacksize-5)-1;
2316L1->ci->func=L1->top;
2317setnilvalue(L1->top++);
2318L1->base=L1->ci->base=L1->top;
2319L1->ci->top=L1->top+20;
2320}
2321static void freestack(lua_State*L,lua_State*L1){
2322luaM_freearray(L,L1->base_ci,L1->size_ci,CallInfo);
2323luaM_freearray(L,L1->stack,L1->stacksize,TValue);
2324}
2325static void f_luaopen(lua_State*L,void*ud){
2326global_State*g=G(L);
2327UNUSED(ud);
2328stack_init(L,L);
2329sethvalue(L,gt(L),luaH_new(L,0,2));
2330sethvalue(L,registry(L),luaH_new(L,0,2));
2331luaS_resize(L,32);
2332luaT_init(L);
2333luaX_init(L);
2334luaS_fix(luaS_newliteral(L,"not enough memory"));
2335g->GCthreshold=4*g->totalbytes;
2336}
2337static void preinit_state(lua_State*L,global_State*g){
2338G(L)=g;
2339L->stack=NULL;
2340L->stacksize=0;
2341L->errorJmp=NULL;
2342L->hook=NULL;
2343L->hookmask=0;
2344L->basehookcount=0;
2345L->allowhook=1;
2346resethookcount(L);
2347L->openupval=NULL;
2348L->size_ci=0;
2349L->nCcalls=L->baseCcalls=0;
2350L->status=0;
2351L->base_ci=L->ci=NULL;
2352L->savedpc=NULL;
2353L->errfunc=0;
2354setnilvalue(gt(L));
2355}
2356static void close_state(lua_State*L){
2357global_State*g=G(L);
2358luaF_close(L,L->stack);
2359luaC_freeall(L);
2360luaM_freearray(L,G(L)->strt.hash,G(L)->strt.size,TString*);
2361luaZ_freebuffer(L,&g->buff);
2362freestack(L,L);
2363(*g->frealloc)(g->ud,fromstate(L),state_size(LG),0);
2364}
2365static lua_State*luaE_newthread(lua_State*L){
2366lua_State*L1=tostate(luaM_malloc(L,state_size(lua_State)));
2367luaC_link(L,obj2gco(L1),8);
2368preinit_state(L1,G(L));
2369stack_init(L1,L);
2370setobj(L,gt(L1),gt(L));
2371L1->hookmask=L->hookmask;
2372L1->basehookcount=L->basehookcount;
2373L1->hook=L->hook;
2374resethookcount(L1);
2375return L1;
2376}
2377static void luaE_freethread(lua_State*L,lua_State*L1){
2378luaF_close(L1,L1->stack);
2379freestack(L,L1);
2380luaM_freemem(L,fromstate(L1),state_size(lua_State));
2381}
2382static lua_State*lua_newstate(lua_Alloc f,void*ud){
2383int i;
2384lua_State*L;
2385global_State*g;
2386void*l=(*f)(ud,NULL,0,state_size(LG));
2387if(l==NULL)return NULL;
2388L=tostate(l);
2389g=&((LG*)L)->g;
2390L->next=NULL;
2391L->tt=8;
2392g->currentwhite=bit2mask(0,5);
2393L->marked=luaC_white(g);
2394set2bits(L->marked,5,6);
2395preinit_state(L,g);
2396g->frealloc=f;
2397g->ud=ud;
2398g->mainthread=L;
2399g->uvhead.u.l.prev=&g->uvhead;
2400g->uvhead.u.l.next=&g->uvhead;
2401g->GCthreshold=0;
2402g->strt.size=0;
2403g->strt.nuse=0;
2404g->strt.hash=NULL;
2405setnilvalue(registry(L));
2406luaZ_initbuffer(L,&g->buff);
2407g->panic=NULL;
2408g->gcstate=0;
2409g->rootgc=obj2gco(L);
2410g->sweepstrgc=0;
2411g->sweepgc=&g->rootgc;
2412g->gray=NULL;
2413g->grayagain=NULL;
2414g->weak=NULL;
2415g->tmudata=NULL;
2416g->totalbytes=sizeof(LG);
2417g->gcpause=200;
2418g->gcstepmul=200;
2419g->gcdept=0;
2420for(i=0;i<(8+1);i++)g->mt[i]=NULL;
2421if(luaD_rawrunprotected(L,f_luaopen,NULL)!=0){
2422close_state(L);
2423L=NULL;
2424}
2425else
2426{}
2427return L;
2428}
2429static void callallgcTM(lua_State*L,void*ud){
2430UNUSED(ud);
2431luaC_callGCTM(L);
2432}
2433static void lua_close(lua_State*L){
2434L=G(L)->mainthread;
2435luaF_close(L,L->stack);
2436luaC_separateudata(L,1);
2437L->errfunc=0;
2438do{
2439L->ci=L->base_ci;
2440L->base=L->top=L->ci->base;
2441L->nCcalls=L->baseCcalls=0;
2442}while(luaD_rawrunprotected(L,callallgcTM,NULL)!=0);
2443close_state(L);
2444}
2445#define getcode(fs,e)((fs)->f->code[(e)->u.s.info])
2446#define luaK_codeAsBx(fs,o,A,sBx)luaK_codeABx(fs,o,A,(sBx)+(((1<<(9+9))-1)>>1))
2447#define luaK_setmultret(fs,e)luaK_setreturns(fs,e,(-1))
2448static int luaK_codeABx(FuncState*fs,OpCode o,int A,unsigned int Bx);
2449static int luaK_codeABC(FuncState*fs,OpCode o,int A,int B,int C);
2450static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults);
2451static void luaK_patchtohere(FuncState*fs,int list);
2452static void luaK_concat(FuncState*fs,int*l1,int l2);
2453static int currentpc(lua_State*L,CallInfo*ci){
2454if(!isLua(ci))return-1;
2455if(ci==L->ci)
2456ci->savedpc=L->savedpc;
2457return pcRel(ci->savedpc,ci_func(ci)->l.p);
2458}
2459static int currentline(lua_State*L,CallInfo*ci){
2460int pc=currentpc(L,ci);
2461if(pc<0)
2462return-1;
2463else
2464return getline_(ci_func(ci)->l.p,pc);
2465}
2466static int lua_getstack(lua_State*L,int level,lua_Debug*ar){
2467int status;
2468CallInfo*ci;
2469for(ci=L->ci;level>0&&ci>L->base_ci;ci--){
2470level--;
2471if(f_isLua(ci))
2472level-=ci->tailcalls;
2473}
2474if(level==0&&ci>L->base_ci){
2475status=1;
2476ar->i_ci=cast_int(ci-L->base_ci);
2477}
2478else if(level<0){
2479status=1;
2480ar->i_ci=0;
2481}
2482else status=0;
2483return status;
2484}
2485static Proto*getluaproto(CallInfo*ci){
2486return(isLua(ci)?ci_func(ci)->l.p:NULL);
2487}
2488static void funcinfo(lua_Debug*ar,Closure*cl){
2489if(cl->c.isC){
2490ar->source="=[C]";
2491ar->linedefined=-1;
2492ar->lastlinedefined=-1;
2493ar->what="C";
2494}
2495else{
2496ar->source=getstr(cl->l.p->source);
2497ar->linedefined=cl->l.p->linedefined;
2498ar->lastlinedefined=cl->l.p->lastlinedefined;
2499ar->what=(ar->linedefined==0)?"main":"Lua";
2500}
2501luaO_chunkid(ar->short_src,ar->source,60);
2502}
2503static void info_tailcall(lua_Debug*ar){
2504ar->name=ar->namewhat="";
2505ar->what="tail";
2506ar->lastlinedefined=ar->linedefined=ar->currentline=-1;
2507ar->source="=(tail call)";
2508luaO_chunkid(ar->short_src,ar->source,60);
2509ar->nups=0;
2510}
2511static void collectvalidlines(lua_State*L,Closure*f){
2512if(f==NULL||f->c.isC){
2513setnilvalue(L->top);
2514}
2515else{
2516Table*t=luaH_new(L,0,0);
2517int*lineinfo=f->l.p->lineinfo;
2518int i;
2519for(i=0;i<f->l.p->sizelineinfo;i++)
2520setbvalue(luaH_setnum(L,t,lineinfo[i]),1);
2521sethvalue(L,L->top,t);
2522}
2523incr_top(L);
2524}
2525static int auxgetinfo(lua_State*L,const char*what,lua_Debug*ar,
2526Closure*f,CallInfo*ci){
2527int status=1;
2528if(f==NULL){
2529info_tailcall(ar);
2530return status;
2531}
2532for(;*what;what++){
2533switch(*what){
2534case'S':{
2535funcinfo(ar,f);
2536break;
2537}
2538case'l':{
2539ar->currentline=(ci)?currentline(L,ci):-1;
2540break;
2541}
2542case'u':{
2543ar->nups=f->c.nupvalues;
2544break;
2545}
2546case'n':{
2547ar->namewhat=(ci)?NULL:NULL;
2548if(ar->namewhat==NULL){
2549ar->namewhat="";
2550ar->name=NULL;
2551}
2552break;
2553}
2554case'L':
2555case'f':
2556break;
2557default:status=0;
2558}
2559}
2560return status;
2561}
2562static int lua_getinfo(lua_State*L,const char*what,lua_Debug*ar){
2563int status;
2564Closure*f=NULL;
2565CallInfo*ci=NULL;
2566if(*what=='>'){
2567StkId func=L->top-1;
2568luai_apicheck(L,ttisfunction(func));
2569what++;
2570f=clvalue(func);
2571L->top--;
2572}
2573else if(ar->i_ci!=0){
2574ci=L->base_ci+ar->i_ci;
2575f=clvalue(ci->func);
2576}
2577status=auxgetinfo(L,what,ar,f,ci);
2578if(strchr(what,'f')){
2579if(f==NULL)setnilvalue(L->top);
2580else setclvalue(L,L->top,f);
2581incr_top(L);
2582}
2583if(strchr(what,'L'))
2584collectvalidlines(L,f);
2585return status;
2586}
2587static int isinstack(CallInfo*ci,const TValue*o){
2588StkId p;
2589for(p=ci->base;p<ci->top;p++)
2590if(o==p)return 1;
2591return 0;
2592}
2593static void luaG_typeerror(lua_State*L,const TValue*o,const char*op){
2594const char*name=NULL;
2595const char*t=luaT_typenames[ttype(o)];
2596const char*kind=(isinstack(L->ci,o))?
2597NULL:
2598NULL;
2599if(kind)
2600luaG_runerror(L,"attempt to %s %s "LUA_QL("%s")" (a %s value)",
2601op,kind,name,t);
2602else
2603luaG_runerror(L,"attempt to %s a %s value",op,t);
2604}
2605static void luaG_concaterror(lua_State*L,StkId p1,StkId p2){
2606if(ttisstring(p1)||ttisnumber(p1))p1=p2;
2607luaG_typeerror(L,p1,"concatenate");
2608}
2609static void luaG_aritherror(lua_State*L,const TValue*p1,const TValue*p2){
2610TValue temp;
2611if(luaV_tonumber(p1,&temp)==NULL)
2612p2=p1;
2613luaG_typeerror(L,p2,"perform arithmetic on");
2614}
2615static int luaG_ordererror(lua_State*L,const TValue*p1,const TValue*p2){
2616const char*t1=luaT_typenames[ttype(p1)];
2617const char*t2=luaT_typenames[ttype(p2)];
2618if(t1[2]==t2[2])
2619luaG_runerror(L,"attempt to compare two %s values",t1);
2620else
2621luaG_runerror(L,"attempt to compare %s with %s",t1,t2);
2622return 0;
2623}
2624static void addinfo(lua_State*L,const char*msg){
2625CallInfo*ci=L->ci;
2626if(isLua(ci)){
2627char buff[60];
2628int line=currentline(L,ci);
2629luaO_chunkid(buff,getstr(getluaproto(ci)->source),60);
2630luaO_pushfstring(L,"%s:%d: %s",buff,line,msg);
2631}
2632}
2633static void luaG_errormsg(lua_State*L){
2634if(L->errfunc!=0){
2635StkId errfunc=restorestack(L,L->errfunc);
2636if(!ttisfunction(errfunc))luaD_throw(L,5);
2637setobj(L,L->top,L->top-1);
2638setobj(L,L->top-1,errfunc);
2639incr_top(L);
2640luaD_call(L,L->top-2,1);
2641}
2642luaD_throw(L,2);
2643}
2644static void luaG_runerror(lua_State*L,const char*fmt,...){
2645va_list argp;
2646va_start(argp,fmt);
2647addinfo(L,luaO_pushvfstring(L,fmt,argp));
2648va_end(argp);
2649luaG_errormsg(L);
2650}
2651static int luaZ_fill(ZIO*z){
2652size_t size;
2653lua_State*L=z->L;
2654const char*buff;
2655buff=z->reader(L,z->data,&size);
2656if(buff==NULL||size==0)return(-1);
2657z->n=size-1;
2658z->p=buff;
2659return char2int(*(z->p++));
2660}
2661static void luaZ_init(lua_State*L,ZIO*z,lua_Reader reader,void*data){
2662z->L=L;
2663z->reader=reader;
2664z->data=data;
2665z->n=0;
2666z->p=NULL;
2667}
2668static char*luaZ_openspace(lua_State*L,Mbuffer*buff,size_t n){
2669if(n>buff->buffsize){
2670if(n<32)n=32;
2671luaZ_resizebuffer(L,buff,n);
2672}
2673return buff->buffer;
2674}
2675#define opmode(t,a,b,c,m)(((t)<<7)|((a)<<6)|((b)<<4)|((c)<<2)|(m))
2676static const lu_byte luaP_opmodes[(cast(int,OP_VARARG)+1)]={
2677opmode(0,1,OpArgR,OpArgN,iABC)
2678,opmode(0,1,OpArgK,OpArgN,iABx)
2679,opmode(0,1,OpArgU,OpArgU,iABC)
2680,opmode(0,1,OpArgR,OpArgN,iABC)
2681,opmode(0,1,OpArgU,OpArgN,iABC)
2682,opmode(0,1,OpArgK,OpArgN,iABx)
2683,opmode(0,1,OpArgR,OpArgK,iABC)
2684,opmode(0,0,OpArgK,OpArgN,iABx)
2685,opmode(0,0,OpArgU,OpArgN,iABC)
2686,opmode(0,0,OpArgK,OpArgK,iABC)
2687,opmode(0,1,OpArgU,OpArgU,iABC)
2688,opmode(0,1,OpArgR,OpArgK,iABC)
2689,opmode(0,1,OpArgK,OpArgK,iABC)
2690,opmode(0,1,OpArgK,OpArgK,iABC)
2691,opmode(0,1,OpArgK,OpArgK,iABC)
2692,opmode(0,1,OpArgK,OpArgK,iABC)
2693,opmode(0,1,OpArgK,OpArgK,iABC)
2694,opmode(0,1,OpArgK,OpArgK,iABC)
2695,opmode(0,1,OpArgR,OpArgN,iABC)
2696,opmode(0,1,OpArgR,OpArgN,iABC)
2697,opmode(0,1,OpArgR,OpArgN,iABC)
2698,opmode(0,1,OpArgR,OpArgR,iABC)
2699,opmode(0,0,OpArgR,OpArgN,iAsBx)
2700,opmode(1,0,OpArgK,OpArgK,iABC)
2701,opmode(1,0,OpArgK,OpArgK,iABC)
2702,opmode(1,0,OpArgK,OpArgK,iABC)
2703,opmode(1,1,OpArgR,OpArgU,iABC)
2704,opmode(1,1,OpArgR,OpArgU,iABC)
2705,opmode(0,1,OpArgU,OpArgU,iABC)
2706,opmode(0,1,OpArgU,OpArgU,iABC)
2707,opmode(0,0,OpArgU,OpArgN,iABC)
2708,opmode(0,1,OpArgR,OpArgN,iAsBx)
2709,opmode(0,1,OpArgR,OpArgN,iAsBx)
2710,opmode(1,0,OpArgN,OpArgU,iABC)
2711,opmode(0,0,OpArgU,OpArgU,iABC)
2712,opmode(0,0,OpArgN,OpArgN,iABC)
2713,opmode(0,1,OpArgU,OpArgN,iABx)
2714,opmode(0,1,OpArgU,OpArgN,iABC)
2715};
2716#define next(ls)(ls->current=zgetc(ls->z))
2717#define currIsNewline(ls)(ls->current=='\n'||ls->current=='\r')
2718static const char*const luaX_tokens[]={
2719"and","break","do","else","elseif",
2720"end","false","for","function","if",
2721"in","local","nil","not","or","repeat",
2722"return","then","true","until","while",
2723"..","...","==",">=","<=","~=",
2724"<number>","<name>","<string>","<eof>",
2725NULL
2726};
2727#define save_and_next(ls)(save(ls,ls->current),next(ls))
2728static void save(LexState*ls,int c){
2729Mbuffer*b=ls->buff;
2730if(b->n+1>b->buffsize){
2731size_t newsize;
2732if(b->buffsize>=((size_t)(~(size_t)0)-2)/2)
2733luaX_lexerror(ls,"lexical element too long",0);
2734newsize=b->buffsize*2;
2735luaZ_resizebuffer(ls->L,b,newsize);
2736}
2737b->buffer[b->n++]=cast(char,c);
2738}
2739static void luaX_init(lua_State*L){
2740int i;
2741for(i=0;i<(cast(int,TK_WHILE-257+1));i++){
2742TString*ts=luaS_new(L,luaX_tokens[i]);
2743luaS_fix(ts);
2744ts->tsv.reserved=cast_byte(i+1);
2745}
2746}
2747static const char*luaX_token2str(LexState*ls,int token){
2748if(token<257){
2749return(iscntrl(token))?luaO_pushfstring(ls->L,"char(%d)",token):
2750luaO_pushfstring(ls->L,"%c",token);
2751}
2752else
2753return luaX_tokens[token-257];
2754}
2755static const char*txtToken(LexState*ls,int token){
2756switch(token){
2757case TK_NAME:
2758case TK_STRING:
2759case TK_NUMBER:
2760save(ls,'\0');
2761return luaZ_buffer(ls->buff);
2762default:
2763return luaX_token2str(ls,token);
2764}
2765}
2766static void luaX_lexerror(LexState*ls,const char*msg,int token){
2767char buff[80];
2768luaO_chunkid(buff,getstr(ls->source),80);
2769msg=luaO_pushfstring(ls->L,"%s:%d: %s",buff,ls->linenumber,msg);
2770if(token)
2771luaO_pushfstring(ls->L,"%s near "LUA_QL("%s"),msg,txtToken(ls,token));
2772luaD_throw(ls->L,3);
2773}
2774static void luaX_syntaxerror(LexState*ls,const char*msg){
2775luaX_lexerror(ls,msg,ls->t.token);
2776}
2777static TString*luaX_newstring(LexState*ls,const char*str,size_t l){
2778lua_State*L=ls->L;
2779TString*ts=luaS_newlstr(L,str,l);
2780TValue*o=luaH_setstr(L,ls->fs->h,ts);
2781if(ttisnil(o)){
2782setbvalue(o,1);
2783luaC_checkGC(L);
2784}
2785return ts;
2786}
2787static void inclinenumber(LexState*ls){
2788int old=ls->current;
2789next(ls);
2790if(currIsNewline(ls)&&ls->current!=old)
2791next(ls);
2792if(++ls->linenumber>=(INT_MAX-2))
2793luaX_syntaxerror(ls,"chunk has too many lines");
2794}
2795static void luaX_setinput(lua_State*L,LexState*ls,ZIO*z,TString*source){
2796ls->decpoint='.';
2797ls->L=L;
2798ls->lookahead.token=TK_EOS;
2799ls->z=z;
2800ls->fs=NULL;
2801ls->linenumber=1;
2802ls->lastline=1;
2803ls->source=source;
2804luaZ_resizebuffer(ls->L,ls->buff,32);
2805next(ls);
2806}
2807static int check_next(LexState*ls,const char*set){
2808if(!strchr(set,ls->current))
2809return 0;
2810save_and_next(ls);
2811return 1;
2812}
2813static void buffreplace(LexState*ls,char from,char to){
2814size_t n=luaZ_bufflen(ls->buff);
2815char*p=luaZ_buffer(ls->buff);
2816while(n--)
2817if(p[n]==from)p[n]=to;
2818}
2819static void read_numeral(LexState*ls,SemInfo*seminfo){
2820do{
2821save_and_next(ls);
2822}while(isdigit(ls->current)||ls->current=='.');
2823if(check_next(ls,"Ee"))
2824check_next(ls,"+-");
2825while(isalnum(ls->current)||ls->current=='_')
2826save_and_next(ls);
2827save(ls,'\0');
2828buffreplace(ls,'.',ls->decpoint);
2829if(!luaO_str2d(luaZ_buffer(ls->buff),&seminfo->r))
2830luaX_lexerror(ls,"malformed number",TK_NUMBER);
2831}
2832static int skip_sep(LexState*ls){
2833int count=0;
2834int s=ls->current;
2835save_and_next(ls);
2836while(ls->current=='='){
2837save_and_next(ls);
2838count++;
2839}
2840return(ls->current==s)?count:(-count)-1;
2841}
2842static void read_long_string(LexState*ls,SemInfo*seminfo,int sep){
2843int cont=0;
2844(void)(cont);
2845save_and_next(ls);
2846if(currIsNewline(ls))
2847inclinenumber(ls);
2848for(;;){
2849switch(ls->current){
2850case(-1):
2851luaX_lexerror(ls,(seminfo)?"unfinished long string":
2852"unfinished long comment",TK_EOS);
2853break;
2854case']':{
2855if(skip_sep(ls)==sep){
2856save_and_next(ls);
2857goto endloop;
2858}
2859break;
2860}
2861case'\n':
2862case'\r':{
2863save(ls,'\n');
2864inclinenumber(ls);
2865if(!seminfo)luaZ_resetbuffer(ls->buff);
2866break;
2867}
2868default:{
2869if(seminfo)save_and_next(ls);
2870else next(ls);
2871}
2872}
2873}endloop:
2874if(seminfo)
2875seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+(2+sep),
2876luaZ_bufflen(ls->buff)-2*(2+sep));
2877}
2878static void read_string(LexState*ls,int del,SemInfo*seminfo){
2879save_and_next(ls);
2880while(ls->current!=del){
2881switch(ls->current){
2882case(-1):
2883luaX_lexerror(ls,"unfinished string",TK_EOS);
2884continue;
2885case'\n':
2886case'\r':
2887luaX_lexerror(ls,"unfinished string",TK_STRING);
2888continue;
2889case'\\':{
2890int c;
2891next(ls);
2892switch(ls->current){
2893case'a':c='\a';break;
2894case'b':c='\b';break;
2895case'f':c='\f';break;
2896case'n':c='\n';break;
2897case'r':c='\r';break;
2898case't':c='\t';break;
2899case'v':c='\v';break;
2900case'\n':
2901case'\r':save(ls,'\n');inclinenumber(ls);continue;
2902case(-1):continue;
2903default:{
2904if(!isdigit(ls->current))
2905save_and_next(ls);
2906else{
2907int i=0;
2908c=0;
2909do{
2910c=10*c+(ls->current-'0');
2911next(ls);
2912}while(++i<3&&isdigit(ls->current));
2913if(c>UCHAR_MAX)
2914luaX_lexerror(ls,"escape sequence too large",TK_STRING);
2915save(ls,c);
2916}
2917continue;
2918}
2919}
2920save(ls,c);
2921next(ls);
2922continue;
2923}
2924default:
2925save_and_next(ls);
2926}
2927}
2928save_and_next(ls);
2929seminfo->ts=luaX_newstring(ls,luaZ_buffer(ls->buff)+1,
2930luaZ_bufflen(ls->buff)-2);
2931}
2932static int llex(LexState*ls,SemInfo*seminfo){
2933luaZ_resetbuffer(ls->buff);
2934for(;;){
2935switch(ls->current){
2936case'\n':
2937case'\r':{
2938inclinenumber(ls);
2939continue;
2940}
2941case'-':{
2942next(ls);
2943if(ls->current!='-')return'-';
2944next(ls);
2945if(ls->current=='['){
2946int sep=skip_sep(ls);
2947luaZ_resetbuffer(ls->buff);
2948if(sep>=0){
2949read_long_string(ls,NULL,sep);
2950luaZ_resetbuffer(ls->buff);
2951continue;
2952}
2953}
2954while(!currIsNewline(ls)&&ls->current!=(-1))
2955next(ls);
2956continue;
2957}
2958case'[':{
2959int sep=skip_sep(ls);
2960if(sep>=0){
2961read_long_string(ls,seminfo,sep);
2962return TK_STRING;
2963}
2964else if(sep==-1)return'[';
2965else luaX_lexerror(ls,"invalid long string delimiter",TK_STRING);
2966}
2967case'=':{
2968next(ls);
2969if(ls->current!='=')return'=';
2970else{next(ls);return TK_EQ;}
2971}
2972case'<':{
2973next(ls);
2974if(ls->current!='=')return'<';
2975else{next(ls);return TK_LE;}
2976}
2977case'>':{
2978next(ls);
2979if(ls->current!='=')return'>';
2980else{next(ls);return TK_GE;}
2981}
2982case'~':{
2983next(ls);
2984if(ls->current!='=')return'~';
2985else{next(ls);return TK_NE;}
2986}
2987case'"':
2988case'\'':{
2989read_string(ls,ls->current,seminfo);
2990return TK_STRING;
2991}
2992case'.':{
2993save_and_next(ls);
2994if(check_next(ls,".")){
2995if(check_next(ls,"."))
2996return TK_DOTS;
2997else return TK_CONCAT;
2998}
2999else if(!isdigit(ls->current))return'.';
3000else{
3001read_numeral(ls,seminfo);
3002return TK_NUMBER;
3003}
3004}
3005case(-1):{
3006return TK_EOS;
3007}
3008default:{
3009if(isspace(ls->current)){
3010next(ls);
3011continue;
3012}
3013else if(isdigit(ls->current)){
3014read_numeral(ls,seminfo);
3015return TK_NUMBER;
3016}
3017else if(isalpha(ls->current)||ls->current=='_'){
3018TString*ts;
3019do{
3020save_and_next(ls);
3021}while(isalnum(ls->current)||ls->current=='_');
3022ts=luaX_newstring(ls,luaZ_buffer(ls->buff),
3023luaZ_bufflen(ls->buff));
3024if(ts->tsv.reserved>0)
3025return ts->tsv.reserved-1+257;
3026else{
3027seminfo->ts=ts;
3028return TK_NAME;
3029}
3030}
3031else{
3032int c=ls->current;
3033next(ls);
3034return c;
3035}
3036}
3037}
3038}
3039}
3040static void luaX_next(LexState*ls){
3041ls->lastline=ls->linenumber;
3042if(ls->lookahead.token!=TK_EOS){
3043ls->t=ls->lookahead;
3044ls->lookahead.token=TK_EOS;
3045}
3046else
3047ls->t.token=llex(ls,&ls->t.seminfo);
3048}
3049static void luaX_lookahead(LexState*ls){
3050ls->lookahead.token=llex(ls,&ls->lookahead.seminfo);
3051}
3052#define hasjumps(e)((e)->t!=(e)->f)
3053static int isnumeral(expdesc*e){
3054return(e->k==VKNUM&&e->t==(-1)&&e->f==(-1));
3055}
3056static void luaK_nil(FuncState*fs,int from,int n){
3057Instruction*previous;
3058if(fs->pc>fs->lasttarget){
3059if(fs->pc==0){
3060if(from>=fs->nactvar)
3061return;
3062}
3063else{
3064previous=&fs->f->code[fs->pc-1];
3065if(GET_OPCODE(*previous)==OP_LOADNIL){
3066int pfrom=GETARG_A(*previous);
3067int pto=GETARG_B(*previous);
3068if(pfrom<=from&&from<=pto+1){
3069if(from+n-1>pto)
3070SETARG_B(*previous,from+n-1);
3071return;
3072}
3073}
3074}
3075}
3076luaK_codeABC(fs,OP_LOADNIL,from,from+n-1,0);
3077}
3078static int luaK_jump(FuncState*fs){
3079int jpc=fs->jpc;
3080int j;
3081fs->jpc=(-1);
3082j=luaK_codeAsBx(fs,OP_JMP,0,(-1));
3083luaK_concat(fs,&j,jpc);
3084return j;
3085}
3086static void luaK_ret(FuncState*fs,int first,int nret){
3087luaK_codeABC(fs,OP_RETURN,first,nret+1,0);
3088}
3089static int condjump(FuncState*fs,OpCode op,int A,int B,int C){
3090luaK_codeABC(fs,op,A,B,C);
3091return luaK_jump(fs);
3092}
3093static void fixjump(FuncState*fs,int pc,int dest){
3094Instruction*jmp=&fs->f->code[pc];
3095int offset=dest-(pc+1);
3096if(abs(offset)>(((1<<(9+9))-1)>>1))
3097luaX_syntaxerror(fs->ls,"control structure too long");
3098SETARG_sBx(*jmp,offset);
3099}
3100static int luaK_getlabel(FuncState*fs){
3101fs->lasttarget=fs->pc;
3102return fs->pc;
3103}
3104static int getjump(FuncState*fs,int pc){
3105int offset=GETARG_sBx(fs->f->code[pc]);
3106if(offset==(-1))
3107return(-1);
3108else
3109return(pc+1)+offset;
3110}
3111static Instruction*getjumpcontrol(FuncState*fs,int pc){
3112Instruction*pi=&fs->f->code[pc];
3113if(pc>=1&&testTMode(GET_OPCODE(*(pi-1))))
3114return pi-1;
3115else
3116return pi;
3117}
3118static int need_value(FuncState*fs,int list){
3119for(;list!=(-1);list=getjump(fs,list)){
3120Instruction i=*getjumpcontrol(fs,list);
3121if(GET_OPCODE(i)!=OP_TESTSET)return 1;
3122}
3123return 0;
3124}
3125static int patchtestreg(FuncState*fs,int node,int reg){
3126Instruction*i=getjumpcontrol(fs,node);
3127if(GET_OPCODE(*i)!=OP_TESTSET)
3128return 0;
3129if(reg!=((1<<8)-1)&&reg!=GETARG_B(*i))
3130SETARG_A(*i,reg);
3131else
3132*i=CREATE_ABC(OP_TEST,GETARG_B(*i),0,GETARG_C(*i));
3133return 1;
3134}
3135static void removevalues(FuncState*fs,int list){
3136for(;list!=(-1);list=getjump(fs,list))
3137patchtestreg(fs,list,((1<<8)-1));
3138}
3139static void patchlistaux(FuncState*fs,int list,int vtarget,int reg,
3140int dtarget){
3141while(list!=(-1)){
3142int next=getjump(fs,list);
3143if(patchtestreg(fs,list,reg))
3144fixjump(fs,list,vtarget);
3145else
3146fixjump(fs,list,dtarget);
3147list=next;
3148}
3149}
3150static void dischargejpc(FuncState*fs){
3151patchlistaux(fs,fs->jpc,fs->pc,((1<<8)-1),fs->pc);
3152fs->jpc=(-1);
3153}
3154static void luaK_patchlist(FuncState*fs,int list,int target){
3155if(target==fs->pc)
3156luaK_patchtohere(fs,list);
3157else{
3158patchlistaux(fs,list,target,((1<<8)-1),target);
3159}
3160}
3161static void luaK_patchtohere(FuncState*fs,int list){
3162luaK_getlabel(fs);
3163luaK_concat(fs,&fs->jpc,list);
3164}
3165static void luaK_concat(FuncState*fs,int*l1,int l2){
3166if(l2==(-1))return;
3167else if(*l1==(-1))
3168*l1=l2;
3169else{
3170int list=*l1;
3171int next;
3172while((next=getjump(fs,list))!=(-1))
3173list=next;
3174fixjump(fs,list,l2);
3175}
3176}
3177static void luaK_checkstack(FuncState*fs,int n){
3178int newstack=fs->freereg+n;
3179if(newstack>fs->f->maxstacksize){
3180if(newstack>=250)
3181luaX_syntaxerror(fs->ls,"function or expression too complex");
3182fs->f->maxstacksize=cast_byte(newstack);
3183}
3184}
3185static void luaK_reserveregs(FuncState*fs,int n){
3186luaK_checkstack(fs,n);
3187fs->freereg+=n;
3188}
3189static void freereg(FuncState*fs,int reg){
3190if(!ISK(reg)&&reg>=fs->nactvar){
3191fs->freereg--;
3192}
3193}
3194static void freeexp(FuncState*fs,expdesc*e){
3195if(e->k==VNONRELOC)
3196freereg(fs,e->u.s.info);
3197}
3198static int addk(FuncState*fs,TValue*k,TValue*v){
3199lua_State*L=fs->L;
3200TValue*idx=luaH_set(L,fs->h,k);
3201Proto*f=fs->f;
3202int oldsize=f->sizek;
3203if(ttisnumber(idx)){
3204return cast_int(nvalue(idx));
3205}
3206else{
3207setnvalue(idx,cast_num(fs->nk));
3208luaM_growvector(L,f->k,fs->nk,f->sizek,TValue,
3209((1<<(9+9))-1),"constant table overflow");
3210while(oldsize<f->sizek)setnilvalue(&f->k[oldsize++]);
3211setobj(L,&f->k[fs->nk],v);
3212luaC_barrier(L,f,v);
3213return fs->nk++;
3214}
3215}
3216static int luaK_stringK(FuncState*fs,TString*s){
3217TValue o;
3218setsvalue(fs->L,&o,s);
3219return addk(fs,&o,&o);
3220}
3221static int luaK_numberK(FuncState*fs,lua_Number r){
3222TValue o;
3223setnvalue(&o,r);
3224return addk(fs,&o,&o);
3225}
3226static int boolK(FuncState*fs,int b){
3227TValue o;
3228setbvalue(&o,b);
3229return addk(fs,&o,&o);
3230}
3231static int nilK(FuncState*fs){
3232TValue k,v;
3233setnilvalue(&v);
3234sethvalue(fs->L,&k,fs->h);
3235return addk(fs,&k,&v);
3236}
3237static void luaK_setreturns(FuncState*fs,expdesc*e,int nresults){
3238if(e->k==VCALL){
3239SETARG_C(getcode(fs,e),nresults+1);
3240}
3241else if(e->k==VVARARG){
3242SETARG_B(getcode(fs,e),nresults+1);
3243SETARG_A(getcode(fs,e),fs->freereg);
3244luaK_reserveregs(fs,1);
3245}
3246}
3247static void luaK_setoneret(FuncState*fs,expdesc*e){
3248if(e->k==VCALL){
3249e->k=VNONRELOC;
3250e->u.s.info=GETARG_A(getcode(fs,e));
3251}
3252else if(e->k==VVARARG){
3253SETARG_B(getcode(fs,e),2);
3254e->k=VRELOCABLE;
3255}
3256}
3257static void luaK_dischargevars(FuncState*fs,expdesc*e){
3258switch(e->k){
3259case VLOCAL:{
3260e->k=VNONRELOC;
3261break;
3262}
3263case VUPVAL:{
3264e->u.s.info=luaK_codeABC(fs,OP_GETUPVAL,0,e->u.s.info,0);
3265e->k=VRELOCABLE;
3266break;
3267}
3268case VGLOBAL:{
3269e->u.s.info=luaK_codeABx(fs,OP_GETGLOBAL,0,e->u.s.info);
3270e->k=VRELOCABLE;
3271break;
3272}
3273case VINDEXED:{
3274freereg(fs,e->u.s.aux);
3275freereg(fs,e->u.s.info);
3276e->u.s.info=luaK_codeABC(fs,OP_GETTABLE,0,e->u.s.info,e->u.s.aux);
3277e->k=VRELOCABLE;
3278break;
3279}
3280case VVARARG:
3281case VCALL:{
3282luaK_setoneret(fs,e);
3283break;
3284}
3285default:break;
3286}
3287}
3288static int code_label(FuncState*fs,int A,int b,int jump){
3289luaK_getlabel(fs);
3290return luaK_codeABC(fs,OP_LOADBOOL,A,b,jump);
3291}
3292static void discharge2reg(FuncState*fs,expdesc*e,int reg){
3293luaK_dischargevars(fs,e);
3294switch(e->k){
3295case VNIL:{
3296luaK_nil(fs,reg,1);
3297break;
3298}
3299case VFALSE:case VTRUE:{
3300luaK_codeABC(fs,OP_LOADBOOL,reg,e->k==VTRUE,0);
3301break;
3302}
3303case VK:{
3304luaK_codeABx(fs,OP_LOADK,reg,e->u.s.info);
3305break;
3306}
3307case VKNUM:{
3308luaK_codeABx(fs,OP_LOADK,reg,luaK_numberK(fs,e->u.nval));
3309break;
3310}
3311case VRELOCABLE:{
3312Instruction*pc=&getcode(fs,e);
3313SETARG_A(*pc,reg);
3314break;
3315}
3316case VNONRELOC:{
3317if(reg!=e->u.s.info)
3318luaK_codeABC(fs,OP_MOVE,reg,e->u.s.info,0);
3319break;
3320}
3321default:{
3322return;
3323}
3324}
3325e->u.s.info=reg;
3326e->k=VNONRELOC;
3327}
3328static void discharge2anyreg(FuncState*fs,expdesc*e){
3329if(e->k!=VNONRELOC){
3330luaK_reserveregs(fs,1);
3331discharge2reg(fs,e,fs->freereg-1);
3332}
3333}
3334static void exp2reg(FuncState*fs,expdesc*e,int reg){
3335discharge2reg(fs,e,reg);
3336if(e->k==VJMP)
3337luaK_concat(fs,&e->t,e->u.s.info);
3338if(hasjumps(e)){
3339int final;
3340int p_f=(-1);
3341int p_t=(-1);
3342if(need_value(fs,e->t)||need_value(fs,e->f)){
3343int fj=(e->k==VJMP)?(-1):luaK_jump(fs);
3344p_f=code_label(fs,reg,0,1);
3345p_t=code_label(fs,reg,1,0);
3346luaK_patchtohere(fs,fj);
3347}
3348final=luaK_getlabel(fs);
3349patchlistaux(fs,e->f,final,reg,p_f);
3350patchlistaux(fs,e->t,final,reg,p_t);
3351}
3352e->f=e->t=(-1);
3353e->u.s.info=reg;
3354e->k=VNONRELOC;
3355}
3356static void luaK_exp2nextreg(FuncState*fs,expdesc*e){
3357luaK_dischargevars(fs,e);
3358freeexp(fs,e);
3359luaK_reserveregs(fs,1);
3360exp2reg(fs,e,fs->freereg-1);
3361}
3362static int luaK_exp2anyreg(FuncState*fs,expdesc*e){
3363luaK_dischargevars(fs,e);
3364if(e->k==VNONRELOC){
3365if(!hasjumps(e))return e->u.s.info;
3366if(e->u.s.info>=fs->nactvar){
3367exp2reg(fs,e,e->u.s.info);
3368return e->u.s.info;
3369}
3370}
3371luaK_exp2nextreg(fs,e);
3372return e->u.s.info;
3373}
3374static void luaK_exp2val(FuncState*fs,expdesc*e){
3375if(hasjumps(e))
3376luaK_exp2anyreg(fs,e);
3377else
3378luaK_dischargevars(fs,e);
3379}
3380static int luaK_exp2RK(FuncState*fs,expdesc*e){
3381luaK_exp2val(fs,e);
3382switch(e->k){
3383case VKNUM:
3384case VTRUE:
3385case VFALSE:
3386case VNIL:{
3387if(fs->nk<=((1<<(9-1))-1)){
3388e->u.s.info=(e->k==VNIL)?nilK(fs):
3389(e->k==VKNUM)?luaK_numberK(fs,e->u.nval):
3390boolK(fs,(e->k==VTRUE));
3391e->k=VK;
3392return RKASK(e->u.s.info);
3393}
3394else break;
3395}
3396case VK:{
3397if(e->u.s.info<=((1<<(9-1))-1))
3398return RKASK(e->u.s.info);
3399else break;
3400}
3401default:break;
3402}
3403return luaK_exp2anyreg(fs,e);
3404}
3405static void luaK_storevar(FuncState*fs,expdesc*var,expdesc*ex){
3406switch(var->k){
3407case VLOCAL:{
3408freeexp(fs,ex);
3409exp2reg(fs,ex,var->u.s.info);
3410return;
3411}
3412case VUPVAL:{
3413int e=luaK_exp2anyreg(fs,ex);
3414luaK_codeABC(fs,OP_SETUPVAL,e,var->u.s.info,0);
3415break;
3416}
3417case VGLOBAL:{
3418int e=luaK_exp2anyreg(fs,ex);
3419luaK_codeABx(fs,OP_SETGLOBAL,e,var->u.s.info);
3420break;
3421}
3422case VINDEXED:{
3423int e=luaK_exp2RK(fs,ex);
3424luaK_codeABC(fs,OP_SETTABLE,var->u.s.info,var->u.s.aux,e);
3425break;
3426}
3427default:{
3428break;
3429}
3430}
3431freeexp(fs,ex);
3432}
3433static void luaK_self(FuncState*fs,expdesc*e,expdesc*key){
3434int func;
3435luaK_exp2anyreg(fs,e);
3436freeexp(fs,e);
3437func=fs->freereg;
3438luaK_reserveregs(fs,2);
3439luaK_codeABC(fs,OP_SELF,func,e->u.s.info,luaK_exp2RK(fs,key));
3440freeexp(fs,key);
3441e->u.s.info=func;
3442e->k=VNONRELOC;
3443}
3444static void invertjump(FuncState*fs,expdesc*e){
3445Instruction*pc=getjumpcontrol(fs,e->u.s.info);
3446SETARG_A(*pc,!(GETARG_A(*pc)));
3447}
3448static int jumponcond(FuncState*fs,expdesc*e,int cond){
3449if(e->k==VRELOCABLE){
3450Instruction ie=getcode(fs,e);
3451if(GET_OPCODE(ie)==OP_NOT){
3452fs->pc--;
3453return condjump(fs,OP_TEST,GETARG_B(ie),0,!cond);
3454}
3455}
3456discharge2anyreg(fs,e);
3457freeexp(fs,e);
3458return condjump(fs,OP_TESTSET,((1<<8)-1),e->u.s.info,cond);
3459}
3460static void luaK_goiftrue(FuncState*fs,expdesc*e){
3461int pc;
3462luaK_dischargevars(fs,e);
3463switch(e->k){
3464case VK:case VKNUM:case VTRUE:{
3465pc=(-1);
3466break;
3467}
3468case VJMP:{
3469invertjump(fs,e);
3470pc=e->u.s.info;
3471break;
3472}
3473default:{
3474pc=jumponcond(fs,e,0);
3475break;
3476}
3477}
3478luaK_concat(fs,&e->f,pc);
3479luaK_patchtohere(fs,e->t);
3480e->t=(-1);
3481}
3482static void luaK_goiffalse(FuncState*fs,expdesc*e){
3483int pc;
3484luaK_dischargevars(fs,e);
3485switch(e->k){
3486case VNIL:case VFALSE:{
3487pc=(-1);
3488break;
3489}
3490case VJMP:{
3491pc=e->u.s.info;
3492break;
3493}
3494default:{
3495pc=jumponcond(fs,e,1);
3496break;
3497}
3498}
3499luaK_concat(fs,&e->t,pc);
3500luaK_patchtohere(fs,e->f);
3501e->f=(-1);
3502}
3503static void codenot(FuncState*fs,expdesc*e){
3504luaK_dischargevars(fs,e);
3505switch(e->k){
3506case VNIL:case VFALSE:{
3507e->k=VTRUE;
3508break;
3509}
3510case VK:case VKNUM:case VTRUE:{
3511e->k=VFALSE;
3512break;
3513}
3514case VJMP:{
3515invertjump(fs,e);
3516break;
3517}
3518case VRELOCABLE:
3519case VNONRELOC:{
3520discharge2anyreg(fs,e);
3521freeexp(fs,e);
3522e->u.s.info=luaK_codeABC(fs,OP_NOT,0,e->u.s.info,0);
3523e->k=VRELOCABLE;
3524break;
3525}
3526default:{
3527break;
3528}
3529}
3530{int temp=e->f;e->f=e->t;e->t=temp;}
3531removevalues(fs,e->f);
3532removevalues(fs,e->t);
3533}
3534static void luaK_indexed(FuncState*fs,expdesc*t,expdesc*k){
3535t->u.s.aux=luaK_exp2RK(fs,k);
3536t->k=VINDEXED;
3537}
3538static int constfolding(OpCode op,expdesc*e1,expdesc*e2){
3539lua_Number v1,v2,r;
3540if(!isnumeral(e1)||!isnumeral(e2))return 0;
3541v1=e1->u.nval;
3542v2=e2->u.nval;
3543switch(op){
3544case OP_ADD:r=luai_numadd(v1,v2);break;
3545case OP_SUB:r=luai_numsub(v1,v2);break;
3546case OP_MUL:r=luai_nummul(v1,v2);break;
3547case OP_DIV:
3548if(v2==0)return 0;
3549r=luai_numdiv(v1,v2);break;
3550case OP_MOD:
3551if(v2==0)return 0;
3552r=luai_nummod(v1,v2);break;
3553case OP_POW:r=luai_numpow(v1,v2);break;
3554case OP_UNM:r=luai_numunm(v1);break;
3555case OP_LEN:return 0;
3556default:r=0;break;
3557}
3558if(luai_numisnan(r))return 0;
3559e1->u.nval=r;
3560return 1;
3561}
3562static void codearith(FuncState*fs,OpCode op,expdesc*e1,expdesc*e2){
3563if(constfolding(op,e1,e2))
3564return;
3565else{
3566int o2=(op!=OP_UNM&&op!=OP_LEN)?luaK_exp2RK(fs,e2):0;
3567int o1=luaK_exp2RK(fs,e1);
3568if(o1>o2){
3569freeexp(fs,e1);
3570freeexp(fs,e2);
3571}
3572else{
3573freeexp(fs,e2);
3574freeexp(fs,e1);
3575}
3576e1->u.s.info=luaK_codeABC(fs,op,0,o1,o2);
3577e1->k=VRELOCABLE;
3578}
3579}
3580static void codecomp(FuncState*fs,OpCode op,int cond,expdesc*e1,
3581expdesc*e2){
3582int o1=luaK_exp2RK(fs,e1);
3583int o2=luaK_exp2RK(fs,e2);
3584freeexp(fs,e2);
3585freeexp(fs,e1);
3586if(cond==0&&op!=OP_EQ){
3587int temp;
3588temp=o1;o1=o2;o2=temp;
3589cond=1;
3590}
3591e1->u.s.info=condjump(fs,op,cond,o1,o2);
3592e1->k=VJMP;
3593}
3594static void luaK_prefix(FuncState*fs,UnOpr op,expdesc*e){
3595expdesc e2;
3596e2.t=e2.f=(-1);e2.k=VKNUM;e2.u.nval=0;
3597switch(op){
3598case OPR_MINUS:{
3599if(!isnumeral(e))
3600luaK_exp2anyreg(fs,e);
3601codearith(fs,OP_UNM,e,&e2);
3602break;
3603}
3604case OPR_NOT:codenot(fs,e);break;
3605case OPR_LEN:{
3606luaK_exp2anyreg(fs,e);
3607codearith(fs,OP_LEN,e,&e2);
3608break;
3609}
3610default:;
3611}
3612}
3613static void luaK_infix(FuncState*fs,BinOpr op,expdesc*v){
3614switch(op){
3615case OPR_AND:{
3616luaK_goiftrue(fs,v);
3617break;
3618}
3619case OPR_OR:{
3620luaK_goiffalse(fs,v);
3621break;
3622}
3623case OPR_CONCAT:{
3624luaK_exp2nextreg(fs,v);
3625break;
3626}
3627case OPR_ADD:case OPR_SUB:case OPR_MUL:case OPR_DIV:
3628case OPR_MOD:case OPR_POW:{
3629if(!isnumeral(v))luaK_exp2RK(fs,v);
3630break;
3631}
3632default:{
3633luaK_exp2RK(fs,v);
3634break;
3635}
3636}
3637}
3638static void luaK_posfix(FuncState*fs,BinOpr op,expdesc*e1,expdesc*e2){
3639switch(op){
3640case OPR_AND:{
3641luaK_dischargevars(fs,e2);
3642luaK_concat(fs,&e2->f,e1->f);
3643*e1=*e2;
3644break;
3645}
3646case OPR_OR:{
3647luaK_dischargevars(fs,e2);
3648luaK_concat(fs,&e2->t,e1->t);
3649*e1=*e2;
3650break;
3651}
3652case OPR_CONCAT:{
3653luaK_exp2val(fs,e2);
3654if(e2->k==VRELOCABLE&&GET_OPCODE(getcode(fs,e2))==OP_CONCAT){
3655freeexp(fs,e1);
3656SETARG_B(getcode(fs,e2),e1->u.s.info);
3657e1->k=VRELOCABLE;e1->u.s.info=e2->u.s.info;
3658}
3659else{
3660luaK_exp2nextreg(fs,e2);
3661codearith(fs,OP_CONCAT,e1,e2);
3662}
3663break;
3664}
3665case OPR_ADD:codearith(fs,OP_ADD,e1,e2);break;
3666case OPR_SUB:codearith(fs,OP_SUB,e1,e2);break;
3667case OPR_MUL:codearith(fs,OP_MUL,e1,e2);break;
3668case OPR_DIV:codearith(fs,OP_DIV,e1,e2);break;
3669case OPR_MOD:codearith(fs,OP_MOD,e1,e2);break;
3670case OPR_POW:codearith(fs,OP_POW,e1,e2);break;
3671case OPR_EQ:codecomp(fs,OP_EQ,1,e1,e2);break;
3672case OPR_NE:codecomp(fs,OP_EQ,0,e1,e2);break;
3673case OPR_LT:codecomp(fs,OP_LT,1,e1,e2);break;
3674case OPR_LE:codecomp(fs,OP_LE,1,e1,e2);break;
3675case OPR_GT:codecomp(fs,OP_LT,0,e1,e2);break;
3676case OPR_GE:codecomp(fs,OP_LE,0,e1,e2);break;
3677default:;
3678}
3679}
3680static void luaK_fixline(FuncState*fs,int line){
3681fs->f->lineinfo[fs->pc-1]=line;
3682}
3683static int luaK_code(FuncState*fs,Instruction i,int line){
3684Proto*f=fs->f;
3685dischargejpc(fs);
3686luaM_growvector(fs->L,f->code,fs->pc,f->sizecode,Instruction,
3687(INT_MAX-2),"code size overflow");
3688f->code[fs->pc]=i;
3689luaM_growvector(fs->L,f->lineinfo,fs->pc,f->sizelineinfo,int,
3690(INT_MAX-2),"code size overflow");
3691f->lineinfo[fs->pc]=line;
3692return fs->pc++;
3693}
3694static int luaK_codeABC(FuncState*fs,OpCode o,int a,int b,int c){
3695return luaK_code(fs,CREATE_ABC(o,a,b,c),fs->ls->lastline);
3696}
3697static int luaK_codeABx(FuncState*fs,OpCode o,int a,unsigned int bc){
3698return luaK_code(fs,CREATE_ABx(o,a,bc),fs->ls->lastline);
3699}
3700static void luaK_setlist(FuncState*fs,int base,int nelems,int tostore){
3701int c=(nelems-1)/50+1;
3702int b=(tostore==(-1))?0:tostore;
3703if(c<=((1<<9)-1))
3704luaK_codeABC(fs,OP_SETLIST,base,b,c);
3705else{
3706luaK_codeABC(fs,OP_SETLIST,base,b,0);
3707luaK_code(fs,cast(Instruction,c),fs->ls->lastline);
3708}
3709fs->freereg=base+1;
3710}
3711#define hasmultret(k)((k)==VCALL||(k)==VVARARG)
3712#define getlocvar(fs,i)((fs)->f->locvars[(fs)->actvar[i]])
3713#define luaY_checklimit(fs,v,l,m)if((v)>(l))errorlimit(fs,l,m)
3714typedef struct BlockCnt{
3715struct BlockCnt*previous;
3716int breaklist;
3717lu_byte nactvar;
3718lu_byte upval;
3719lu_byte isbreakable;
3720}BlockCnt;
3721static void chunk(LexState*ls);
3722static void expr(LexState*ls,expdesc*v);
3723static void anchor_token(LexState*ls){
3724if(ls->t.token==TK_NAME||ls->t.token==TK_STRING){
3725TString*ts=ls->t.seminfo.ts;
3726luaX_newstring(ls,getstr(ts),ts->tsv.len);
3727}
3728}
3729static void error_expected(LexState*ls,int token){
3730luaX_syntaxerror(ls,
3731luaO_pushfstring(ls->L,LUA_QL("%s")" expected",luaX_token2str(ls,token)));
3732}
3733static void errorlimit(FuncState*fs,int limit,const char*what){
3734const char*msg=(fs->f->linedefined==0)?
3735luaO_pushfstring(fs->L,"main function has more than %d %s",limit,what):
3736luaO_pushfstring(fs->L,"function at line %d has more than %d %s",
3737fs->f->linedefined,limit,what);
3738luaX_lexerror(fs->ls,msg,0);
3739}
3740static int testnext(LexState*ls,int c){
3741if(ls->t.token==c){
3742luaX_next(ls);
3743return 1;
3744}
3745else return 0;
3746}
3747static void check(LexState*ls,int c){
3748if(ls->t.token!=c)
3749error_expected(ls,c);
3750}
3751static void checknext(LexState*ls,int c){
3752check(ls,c);
3753luaX_next(ls);
3754}
3755#define check_condition(ls,c,msg){if(!(c))luaX_syntaxerror(ls,msg);}
3756static void check_match(LexState*ls,int what,int who,int where){
3757if(!testnext(ls,what)){
3758if(where==ls->linenumber)
3759error_expected(ls,what);
3760else{
3761luaX_syntaxerror(ls,luaO_pushfstring(ls->L,
3762LUA_QL("%s")" expected (to close "LUA_QL("%s")" at line %d)",
3763luaX_token2str(ls,what),luaX_token2str(ls,who),where));
3764}
3765}
3766}
3767static TString*str_checkname(LexState*ls){
3768TString*ts;
3769check(ls,TK_NAME);
3770ts=ls->t.seminfo.ts;
3771luaX_next(ls);
3772return ts;
3773}
3774static void init_exp(expdesc*e,expkind k,int i){
3775e->f=e->t=(-1);
3776e->k=k;
3777e->u.s.info=i;
3778}
3779static void codestring(LexState*ls,expdesc*e,TString*s){
3780init_exp(e,VK,luaK_stringK(ls->fs,s));
3781}
3782static void checkname(LexState*ls,expdesc*e){
3783codestring(ls,e,str_checkname(ls));
3784}
3785static int registerlocalvar(LexState*ls,TString*varname){
3786FuncState*fs=ls->fs;
3787Proto*f=fs->f;
3788int oldsize=f->sizelocvars;
3789luaM_growvector(ls->L,f->locvars,fs->nlocvars,f->sizelocvars,
3790LocVar,SHRT_MAX,"too many local variables");
3791while(oldsize<f->sizelocvars)f->locvars[oldsize++].varname=NULL;
3792f->locvars[fs->nlocvars].varname=varname;
3793luaC_objbarrier(ls->L,f,varname);
3794return fs->nlocvars++;
3795}
3796#define new_localvarliteral(ls,v,n)new_localvar(ls,luaX_newstring(ls,""v,(sizeof(v)/sizeof(char))-1),n)
3797static void new_localvar(LexState*ls,TString*name,int n){
3798FuncState*fs=ls->fs;
3799luaY_checklimit(fs,fs->nactvar+n+1,200,"local variables");
3800fs->actvar[fs->nactvar+n]=cast(unsigned short,registerlocalvar(ls,name));
3801}
3802static void adjustlocalvars(LexState*ls,int nvars){
3803FuncState*fs=ls->fs;
3804fs->nactvar=cast_byte(fs->nactvar+nvars);
3805for(;nvars;nvars--){
3806getlocvar(fs,fs->nactvar-nvars).startpc=fs->pc;
3807}
3808}
3809static void removevars(LexState*ls,int tolevel){
3810FuncState*fs=ls->fs;
3811while(fs->nactvar>tolevel)
3812getlocvar(fs,--fs->nactvar).endpc=fs->pc;
3813}
3814static int indexupvalue(FuncState*fs,TString*name,expdesc*v){
3815int i;
3816Proto*f=fs->f;
3817int oldsize=f->sizeupvalues;
3818for(i=0;i<f->nups;i++){
3819if(fs->upvalues[i].k==v->k&&fs->upvalues[i].info==v->u.s.info){
3820return i;
3821}
3822}
3823luaY_checklimit(fs,f->nups+1,60,"upvalues");
3824luaM_growvector(fs->L,f->upvalues,f->nups,f->sizeupvalues,
3825TString*,(INT_MAX-2),"");
3826while(oldsize<f->sizeupvalues)f->upvalues[oldsize++]=NULL;
3827f->upvalues[f->nups]=name;
3828luaC_objbarrier(fs->L,f,name);
3829fs->upvalues[f->nups].k=cast_byte(v->k);
3830fs->upvalues[f->nups].info=cast_byte(v->u.s.info);
3831return f->nups++;
3832}
3833static int searchvar(FuncState*fs,TString*n){
3834int i;
3835for(i=fs->nactvar-1;i>=0;i--){
3836if(n==getlocvar(fs,i).varname)
3837return i;
3838}
3839return-1;
3840}
3841static void markupval(FuncState*fs,int level){
3842BlockCnt*bl=fs->bl;
3843while(bl&&bl->nactvar>level)bl=bl->previous;
3844if(bl)bl->upval=1;
3845}
3846static int singlevaraux(FuncState*fs,TString*n,expdesc*var,int base){
3847if(fs==NULL){
3848init_exp(var,VGLOBAL,((1<<8)-1));
3849return VGLOBAL;
3850}
3851else{
3852int v=searchvar(fs,n);
3853if(v>=0){
3854init_exp(var,VLOCAL,v);
3855if(!base)
3856markupval(fs,v);
3857return VLOCAL;
3858}
3859else{
3860if(singlevaraux(fs->prev,n,var,0)==VGLOBAL)
3861return VGLOBAL;
3862var->u.s.info=indexupvalue(fs,n,var);
3863var->k=VUPVAL;
3864return VUPVAL;
3865}
3866}
3867}
3868static void singlevar(LexState*ls,expdesc*var){
3869TString*varname=str_checkname(ls);
3870FuncState*fs=ls->fs;
3871if(singlevaraux(fs,varname,var,1)==VGLOBAL)
3872var->u.s.info=luaK_stringK(fs,varname);
3873}
3874static void adjust_assign(LexState*ls,int nvars,int nexps,expdesc*e){
3875FuncState*fs=ls->fs;
3876int extra=nvars-nexps;
3877if(hasmultret(e->k)){
3878extra++;
3879if(extra<0)extra=0;
3880luaK_setreturns(fs,e,extra);
3881if(extra>1)luaK_reserveregs(fs,extra-1);
3882}
3883else{
3884if(e->k!=VVOID)luaK_exp2nextreg(fs,e);
3885if(extra>0){
3886int reg=fs->freereg;
3887luaK_reserveregs(fs,extra);
3888luaK_nil(fs,reg,extra);
3889}
3890}
3891}
3892static void enterlevel(LexState*ls){
3893if(++ls->L->nCcalls>200)
3894luaX_lexerror(ls,"chunk has too many syntax levels",0);
3895}
3896#define leavelevel(ls)((ls)->L->nCcalls--)
3897static void enterblock(FuncState*fs,BlockCnt*bl,lu_byte isbreakable){
3898bl->breaklist=(-1);
3899bl->isbreakable=isbreakable;
3900bl->nactvar=fs->nactvar;
3901bl->upval=0;
3902bl->previous=fs->bl;
3903fs->bl=bl;
3904}
3905static void leaveblock(FuncState*fs){
3906BlockCnt*bl=fs->bl;
3907fs->bl=bl->previous;
3908removevars(fs->ls,bl->nactvar);
3909if(bl->upval)
3910luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0);
3911fs->freereg=fs->nactvar;
3912luaK_patchtohere(fs,bl->breaklist);
3913}
3914static void pushclosure(LexState*ls,FuncState*func,expdesc*v){
3915FuncState*fs=ls->fs;
3916Proto*f=fs->f;
3917int oldsize=f->sizep;
3918int i;
3919luaM_growvector(ls->L,f->p,fs->np,f->sizep,Proto*,
3920((1<<(9+9))-1),"constant table overflow");
3921while(oldsize<f->sizep)f->p[oldsize++]=NULL;
3922f->p[fs->np++]=func->f;
3923luaC_objbarrier(ls->L,f,func->f);
3924init_exp(v,VRELOCABLE,luaK_codeABx(fs,OP_CLOSURE,0,fs->np-1));
3925for(i=0;i<func->f->nups;i++){
3926OpCode o=(func->upvalues[i].k==VLOCAL)?OP_MOVE:OP_GETUPVAL;
3927luaK_codeABC(fs,o,0,func->upvalues[i].info,0);
3928}
3929}
3930static void open_func(LexState*ls,FuncState*fs){
3931lua_State*L=ls->L;
3932Proto*f=luaF_newproto(L);
3933fs->f=f;
3934fs->prev=ls->fs;
3935fs->ls=ls;
3936fs->L=L;
3937ls->fs=fs;
3938fs->pc=0;
3939fs->lasttarget=-1;
3940fs->jpc=(-1);
3941fs->freereg=0;
3942fs->nk=0;
3943fs->np=0;
3944fs->nlocvars=0;
3945fs->nactvar=0;
3946fs->bl=NULL;
3947f->source=ls->source;
3948f->maxstacksize=2;
3949fs->h=luaH_new(L,0,0);
3950sethvalue(L,L->top,fs->h);
3951incr_top(L);
3952setptvalue(L,L->top,f);
3953incr_top(L);
3954}
3955static void close_func(LexState*ls){
3956lua_State*L=ls->L;
3957FuncState*fs=ls->fs;
3958Proto*f=fs->f;
3959removevars(ls,0);
3960luaK_ret(fs,0,0);
3961luaM_reallocvector(L,f->code,f->sizecode,fs->pc,Instruction);
3962f->sizecode=fs->pc;
3963luaM_reallocvector(L,f->lineinfo,f->sizelineinfo,fs->pc,int);
3964f->sizelineinfo=fs->pc;
3965luaM_reallocvector(L,f->k,f->sizek,fs->nk,TValue);
3966f->sizek=fs->nk;
3967luaM_reallocvector(L,f->p,f->sizep,fs->np,Proto*);
3968f->sizep=fs->np;
3969luaM_reallocvector(L,f->locvars,f->sizelocvars,fs->nlocvars,LocVar);
3970f->sizelocvars=fs->nlocvars;
3971luaM_reallocvector(L,f->upvalues,f->sizeupvalues,f->nups,TString*);
3972f->sizeupvalues=f->nups;
3973ls->fs=fs->prev;
3974if(fs)anchor_token(ls);
3975L->top-=2;
3976}
3977static Proto*luaY_parser(lua_State*L,ZIO*z,Mbuffer*buff,const char*name){
3978struct LexState lexstate;
3979struct FuncState funcstate;
3980lexstate.buff=buff;
3981luaX_setinput(L,&lexstate,z,luaS_new(L,name));
3982open_func(&lexstate,&funcstate);
3983funcstate.f->is_vararg=2;
3984luaX_next(&lexstate);
3985chunk(&lexstate);
3986check(&lexstate,TK_EOS);
3987close_func(&lexstate);
3988return funcstate.f;
3989}
3990static void field(LexState*ls,expdesc*v){
3991FuncState*fs=ls->fs;
3992expdesc key;
3993luaK_exp2anyreg(fs,v);
3994luaX_next(ls);
3995checkname(ls,&key);
3996luaK_indexed(fs,v,&key);
3997}
3998static void yindex(LexState*ls,expdesc*v){
3999luaX_next(ls);
4000expr(ls,v);
4001luaK_exp2val(ls->fs,v);
4002checknext(ls,']');
4003}
4004struct ConsControl{
4005expdesc v;
4006expdesc*t;
4007int nh;
4008int na;
4009int tostore;
4010};
4011static void recfield(LexState*ls,struct ConsControl*cc){
4012FuncState*fs=ls->fs;
4013int reg=ls->fs->freereg;
4014expdesc key,val;
4015int rkkey;
4016if(ls->t.token==TK_NAME){
4017luaY_checklimit(fs,cc->nh,(INT_MAX-2),"items in a constructor");
4018checkname(ls,&key);
4019}
4020else
4021yindex(ls,&key);
4022cc->nh++;
4023checknext(ls,'=');
4024rkkey=luaK_exp2RK(fs,&key);
4025expr(ls,&val);
4026luaK_codeABC(fs,OP_SETTABLE,cc->t->u.s.info,rkkey,luaK_exp2RK(fs,&val));
4027fs->freereg=reg;
4028}
4029static void closelistfield(FuncState*fs,struct ConsControl*cc){
4030if(cc->v.k==VVOID)return;
4031luaK_exp2nextreg(fs,&cc->v);
4032cc->v.k=VVOID;
4033if(cc->tostore==50){
4034luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore);
4035cc->tostore=0;
4036}
4037}
4038static void lastlistfield(FuncState*fs,struct ConsControl*cc){
4039if(cc->tostore==0)return;
4040if(hasmultret(cc->v.k)){
4041luaK_setmultret(fs,&cc->v);
4042luaK_setlist(fs,cc->t->u.s.info,cc->na,(-1));
4043cc->na--;
4044}
4045else{
4046if(cc->v.k!=VVOID)
4047luaK_exp2nextreg(fs,&cc->v);
4048luaK_setlist(fs,cc->t->u.s.info,cc->na,cc->tostore);
4049}
4050}
4051static void listfield(LexState*ls,struct ConsControl*cc){
4052expr(ls,&cc->v);
4053luaY_checklimit(ls->fs,cc->na,(INT_MAX-2),"items in a constructor");
4054cc->na++;
4055cc->tostore++;
4056}
4057static void constructor(LexState*ls,expdesc*t){
4058FuncState*fs=ls->fs;
4059int line=ls->linenumber;
4060int pc=luaK_codeABC(fs,OP_NEWTABLE,0,0,0);
4061struct ConsControl cc;
4062cc.na=cc.nh=cc.tostore=0;
4063cc.t=t;
4064init_exp(t,VRELOCABLE,pc);
4065init_exp(&cc.v,VVOID,0);
4066luaK_exp2nextreg(ls->fs,t);
4067checknext(ls,'{');
4068do{
4069if(ls->t.token=='}')break;
4070closelistfield(fs,&cc);
4071switch(ls->t.token){
4072case TK_NAME:{
4073luaX_lookahead(ls);
4074if(ls->lookahead.token!='=')
4075listfield(ls,&cc);
4076else
4077recfield(ls,&cc);
4078break;
4079}
4080case'[':{
4081recfield(ls,&cc);
4082break;
4083}
4084default:{
4085listfield(ls,&cc);
4086break;
4087}
4088}
4089}while(testnext(ls,',')||testnext(ls,';'));
4090check_match(ls,'}','{',line);
4091lastlistfield(fs,&cc);
4092SETARG_B(fs->f->code[pc],luaO_int2fb(cc.na));
4093SETARG_C(fs->f->code[pc],luaO_int2fb(cc.nh));
4094}
4095static void parlist(LexState*ls){
4096FuncState*fs=ls->fs;
4097Proto*f=fs->f;
4098int nparams=0;
4099f->is_vararg=0;
4100if(ls->t.token!=')'){
4101do{
4102switch(ls->t.token){
4103case TK_NAME:{
4104new_localvar(ls,str_checkname(ls),nparams++);
4105break;
4106}
4107case TK_DOTS:{
4108luaX_next(ls);
4109f->is_vararg|=2;
4110break;
4111}
4112default:luaX_syntaxerror(ls,"<name> or "LUA_QL("...")" expected");
4113}
4114}while(!f->is_vararg&&testnext(ls,','));
4115}
4116adjustlocalvars(ls,nparams);
4117f->numparams=cast_byte(fs->nactvar-(f->is_vararg&1));
4118luaK_reserveregs(fs,fs->nactvar);
4119}
4120static void body(LexState*ls,expdesc*e,int needself,int line){
4121FuncState new_fs;
4122open_func(ls,&new_fs);
4123new_fs.f->linedefined=line;
4124checknext(ls,'(');
4125if(needself){
4126new_localvarliteral(ls,"self",0);
4127adjustlocalvars(ls,1);
4128}
4129parlist(ls);
4130checknext(ls,')');
4131chunk(ls);
4132new_fs.f->lastlinedefined=ls->linenumber;
4133check_match(ls,TK_END,TK_FUNCTION,line);
4134close_func(ls);
4135pushclosure(ls,&new_fs,e);
4136}
4137static int explist1(LexState*ls,expdesc*v){
4138int n=1;
4139expr(ls,v);
4140while(testnext(ls,',')){
4141luaK_exp2nextreg(ls->fs,v);
4142expr(ls,v);
4143n++;
4144}
4145return n;
4146}
4147static void funcargs(LexState*ls,expdesc*f){
4148FuncState*fs=ls->fs;
4149expdesc args;
4150int base,nparams;
4151int line=ls->linenumber;
4152switch(ls->t.token){
4153case'(':{
4154if(line!=ls->lastline)
4155luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)");
4156luaX_next(ls);
4157if(ls->t.token==')')
4158args.k=VVOID;
4159else{
4160explist1(ls,&args);
4161luaK_setmultret(fs,&args);
4162}
4163check_match(ls,')','(',line);
4164break;
4165}
4166case'{':{
4167constructor(ls,&args);
4168break;
4169}
4170case TK_STRING:{
4171codestring(ls,&args,ls->t.seminfo.ts);
4172luaX_next(ls);
4173break;
4174}
4175default:{
4176luaX_syntaxerror(ls,"function arguments expected");
4177return;
4178}
4179}
4180base=f->u.s.info;
4181if(hasmultret(args.k))
4182nparams=(-1);
4183else{
4184if(args.k!=VVOID)
4185luaK_exp2nextreg(fs,&args);
4186nparams=fs->freereg-(base+1);
4187}
4188init_exp(f,VCALL,luaK_codeABC(fs,OP_CALL,base,nparams+1,2));
4189luaK_fixline(fs,line);
4190fs->freereg=base+1;
4191}
4192static void prefixexp(LexState*ls,expdesc*v){
4193switch(ls->t.token){
4194case'(':{
4195int line=ls->linenumber;
4196luaX_next(ls);
4197expr(ls,v);
4198check_match(ls,')','(',line);
4199luaK_dischargevars(ls->fs,v);
4200return;
4201}
4202case TK_NAME:{
4203singlevar(ls,v);
4204return;
4205}
4206default:{
4207luaX_syntaxerror(ls,"unexpected symbol");
4208return;
4209}
4210}
4211}
4212static void primaryexp(LexState*ls,expdesc*v){
4213FuncState*fs=ls->fs;
4214prefixexp(ls,v);
4215for(;;){
4216switch(ls->t.token){
4217case'.':{
4218field(ls,v);
4219break;
4220}
4221case'[':{
4222expdesc key;
4223luaK_exp2anyreg(fs,v);
4224yindex(ls,&key);
4225luaK_indexed(fs,v,&key);
4226break;
4227}
4228case':':{
4229expdesc key;
4230luaX_next(ls);
4231checkname(ls,&key);
4232luaK_self(fs,v,&key);
4233funcargs(ls,v);
4234break;
4235}
4236case'(':case TK_STRING:case'{':{
4237luaK_exp2nextreg(fs,v);
4238funcargs(ls,v);
4239break;
4240}
4241default:return;
4242}
4243}
4244}
4245static void simpleexp(LexState*ls,expdesc*v){
4246switch(ls->t.token){
4247case TK_NUMBER:{
4248init_exp(v,VKNUM,0);
4249v->u.nval=ls->t.seminfo.r;
4250break;
4251}
4252case TK_STRING:{
4253codestring(ls,v,ls->t.seminfo.ts);
4254break;
4255}
4256case TK_NIL:{
4257init_exp(v,VNIL,0);
4258break;
4259}
4260case TK_TRUE:{
4261init_exp(v,VTRUE,0);
4262break;
4263}
4264case TK_FALSE:{
4265init_exp(v,VFALSE,0);
4266break;
4267}
4268case TK_DOTS:{
4269FuncState*fs=ls->fs;
4270check_condition(ls,fs->f->is_vararg,
4271"cannot use "LUA_QL("...")" outside a vararg function");
4272fs->f->is_vararg&=~4;
4273init_exp(v,VVARARG,luaK_codeABC(fs,OP_VARARG,0,1,0));
4274break;
4275}
4276case'{':{
4277constructor(ls,v);
4278return;
4279}
4280case TK_FUNCTION:{
4281luaX_next(ls);
4282body(ls,v,0,ls->linenumber);
4283return;
4284}
4285default:{
4286primaryexp(ls,v);
4287return;
4288}
4289}
4290luaX_next(ls);
4291}
4292static UnOpr getunopr(int op){
4293switch(op){
4294case TK_NOT:return OPR_NOT;
4295case'-':return OPR_MINUS;
4296case'#':return OPR_LEN;
4297default:return OPR_NOUNOPR;
4298}
4299}
4300static BinOpr getbinopr(int op){
4301switch(op){
4302case'+':return OPR_ADD;
4303case'-':return OPR_SUB;
4304case'*':return OPR_MUL;
4305case'/':return OPR_DIV;
4306case'%':return OPR_MOD;
4307case'^':return OPR_POW;
4308case TK_CONCAT:return OPR_CONCAT;
4309case TK_NE:return OPR_NE;
4310case TK_EQ:return OPR_EQ;
4311case'<':return OPR_LT;
4312case TK_LE:return OPR_LE;
4313case'>':return OPR_GT;
4314case TK_GE:return OPR_GE;
4315case TK_AND:return OPR_AND;
4316case TK_OR:return OPR_OR;
4317default:return OPR_NOBINOPR;
4318}
4319}
4320static const struct{
4321lu_byte left;
4322lu_byte right;
4323}priority[]={
4324{6,6},{6,6},{7,7},{7,7},{7,7},
4325{10,9},{5,4},
4326{3,3},{3,3},
4327{3,3},{3,3},{3,3},{3,3},
4328{2,2},{1,1}
4329};
4330static BinOpr subexpr(LexState*ls,expdesc*v,unsigned int limit){
4331BinOpr op;
4332UnOpr uop;
4333enterlevel(ls);
4334uop=getunopr(ls->t.token);
4335if(uop!=OPR_NOUNOPR){
4336luaX_next(ls);
4337subexpr(ls,v,8);
4338luaK_prefix(ls->fs,uop,v);
4339}
4340else simpleexp(ls,v);
4341op=getbinopr(ls->t.token);
4342while(op!=OPR_NOBINOPR&&priority[op].left>limit){
4343expdesc v2;
4344BinOpr nextop;
4345luaX_next(ls);
4346luaK_infix(ls->fs,op,v);
4347nextop=subexpr(ls,&v2,priority[op].right);
4348luaK_posfix(ls->fs,op,v,&v2);
4349op=nextop;
4350}
4351leavelevel(ls);
4352return op;
4353}
4354static void expr(LexState*ls,expdesc*v){
4355subexpr(ls,v,0);
4356}
4357static int block_follow(int token){
4358switch(token){
4359case TK_ELSE:case TK_ELSEIF:case TK_END:
4360case TK_UNTIL:case TK_EOS:
4361return 1;
4362default:return 0;
4363}
4364}
4365static void block(LexState*ls){
4366FuncState*fs=ls->fs;
4367BlockCnt bl;
4368enterblock(fs,&bl,0);
4369chunk(ls);
4370leaveblock(fs);
4371}
4372struct LHS_assign{
4373struct LHS_assign*prev;
4374expdesc v;
4375};
4376static void check_conflict(LexState*ls,struct LHS_assign*lh,expdesc*v){
4377FuncState*fs=ls->fs;
4378int extra=fs->freereg;
4379int conflict=0;
4380for(;lh;lh=lh->prev){
4381if(lh->v.k==VINDEXED){
4382if(lh->v.u.s.info==v->u.s.info){
4383conflict=1;
4384lh->v.u.s.info=extra;
4385}
4386if(lh->v.u.s.aux==v->u.s.info){
4387conflict=1;
4388lh->v.u.s.aux=extra;
4389}
4390}
4391}
4392if(conflict){
4393luaK_codeABC(fs,OP_MOVE,fs->freereg,v->u.s.info,0);
4394luaK_reserveregs(fs,1);
4395}
4396}
4397static void assignment(LexState*ls,struct LHS_assign*lh,int nvars){
4398expdesc e;
4399check_condition(ls,VLOCAL<=lh->v.k&&lh->v.k<=VINDEXED,
4400"syntax error");
4401if(testnext(ls,',')){
4402struct LHS_assign nv;
4403nv.prev=lh;
4404primaryexp(ls,&nv.v);
4405if(nv.v.k==VLOCAL)
4406check_conflict(ls,lh,&nv.v);
4407luaY_checklimit(ls->fs,nvars,200-ls->L->nCcalls,
4408"variables in assignment");
4409assignment(ls,&nv,nvars+1);
4410}
4411else{
4412int nexps;
4413checknext(ls,'=');
4414nexps=explist1(ls,&e);
4415if(nexps!=nvars){
4416adjust_assign(ls,nvars,nexps,&e);
4417if(nexps>nvars)
4418ls->fs->freereg-=nexps-nvars;
4419}
4420else{
4421luaK_setoneret(ls->fs,&e);
4422luaK_storevar(ls->fs,&lh->v,&e);
4423return;
4424}
4425}
4426init_exp(&e,VNONRELOC,ls->fs->freereg-1);
4427luaK_storevar(ls->fs,&lh->v,&e);
4428}
4429static int cond(LexState*ls){
4430expdesc v;
4431expr(ls,&v);
4432if(v.k==VNIL)v.k=VFALSE;
4433luaK_goiftrue(ls->fs,&v);
4434return v.f;
4435}
4436static void breakstat(LexState*ls){
4437FuncState*fs=ls->fs;
4438BlockCnt*bl=fs->bl;
4439int upval=0;
4440while(bl&&!bl->isbreakable){
4441upval|=bl->upval;
4442bl=bl->previous;
4443}
4444if(!bl)
4445luaX_syntaxerror(ls,"no loop to break");
4446if(upval)
4447luaK_codeABC(fs,OP_CLOSE,bl->nactvar,0,0);
4448luaK_concat(fs,&bl->breaklist,luaK_jump(fs));
4449}
4450static void whilestat(LexState*ls,int line){
4451FuncState*fs=ls->fs;
4452int whileinit;
4453int condexit;
4454BlockCnt bl;
4455luaX_next(ls);
4456whileinit=luaK_getlabel(fs);
4457condexit=cond(ls);
4458enterblock(fs,&bl,1);
4459checknext(ls,TK_DO);
4460block(ls);
4461luaK_patchlist(fs,luaK_jump(fs),whileinit);
4462check_match(ls,TK_END,TK_WHILE,line);
4463leaveblock(fs);
4464luaK_patchtohere(fs,condexit);
4465}
4466static void repeatstat(LexState*ls,int line){
4467int condexit;
4468FuncState*fs=ls->fs;
4469int repeat_init=luaK_getlabel(fs);
4470BlockCnt bl1,bl2;
4471enterblock(fs,&bl1,1);
4472enterblock(fs,&bl2,0);
4473luaX_next(ls);
4474chunk(ls);
4475check_match(ls,TK_UNTIL,TK_REPEAT,line);
4476condexit=cond(ls);
4477if(!bl2.upval){
4478leaveblock(fs);
4479luaK_patchlist(ls->fs,condexit,repeat_init);
4480}
4481else{
4482breakstat(ls);
4483luaK_patchtohere(ls->fs,condexit);
4484leaveblock(fs);
4485luaK_patchlist(ls->fs,luaK_jump(fs),repeat_init);
4486}
4487leaveblock(fs);
4488}
4489static int exp1(LexState*ls){
4490expdesc e;
4491int k;
4492expr(ls,&e);
4493k=e.k;
4494luaK_exp2nextreg(ls->fs,&e);
4495return k;
4496}
4497static void forbody(LexState*ls,int base,int line,int nvars,int isnum){
4498BlockCnt bl;
4499FuncState*fs=ls->fs;
4500int prep,endfor;
4501adjustlocalvars(ls,3);
4502checknext(ls,TK_DO);
4503prep=isnum?luaK_codeAsBx(fs,OP_FORPREP,base,(-1)):luaK_jump(fs);
4504enterblock(fs,&bl,0);
4505adjustlocalvars(ls,nvars);
4506luaK_reserveregs(fs,nvars);
4507block(ls);
4508leaveblock(fs);
4509luaK_patchtohere(fs,prep);
4510endfor=(isnum)?luaK_codeAsBx(fs,OP_FORLOOP,base,(-1)):
4511luaK_codeABC(fs,OP_TFORLOOP,base,0,nvars);
4512luaK_fixline(fs,line);
4513luaK_patchlist(fs,(isnum?endfor:luaK_jump(fs)),prep+1);
4514}
4515static void fornum(LexState*ls,TString*varname,int line){
4516FuncState*fs=ls->fs;
4517int base=fs->freereg;
4518new_localvarliteral(ls,"(for index)",0);
4519new_localvarliteral(ls,"(for limit)",1);
4520new_localvarliteral(ls,"(for step)",2);
4521new_localvar(ls,varname,3);
4522checknext(ls,'=');
4523exp1(ls);
4524checknext(ls,',');
4525exp1(ls);
4526if(testnext(ls,','))
4527exp1(ls);
4528else{
4529luaK_codeABx(fs,OP_LOADK,fs->freereg,luaK_numberK(fs,1));
4530luaK_reserveregs(fs,1);
4531}
4532forbody(ls,base,line,1,1);
4533}
4534static void forlist(LexState*ls,TString*indexname){
4535FuncState*fs=ls->fs;
4536expdesc e;
4537int nvars=0;
4538int line;
4539int base=fs->freereg;
4540new_localvarliteral(ls,"(for generator)",nvars++);
4541new_localvarliteral(ls,"(for state)",nvars++);
4542new_localvarliteral(ls,"(for control)",nvars++);
4543new_localvar(ls,indexname,nvars++);
4544while(testnext(ls,','))
4545new_localvar(ls,str_checkname(ls),nvars++);
4546checknext(ls,TK_IN);
4547line=ls->linenumber;
4548adjust_assign(ls,3,explist1(ls,&e),&e);
4549luaK_checkstack(fs,3);
4550forbody(ls,base,line,nvars-3,0);
4551}
4552static void forstat(LexState*ls,int line){
4553FuncState*fs=ls->fs;
4554TString*varname;
4555BlockCnt bl;
4556enterblock(fs,&bl,1);
4557luaX_next(ls);
4558varname=str_checkname(ls);
4559switch(ls->t.token){
4560case'=':fornum(ls,varname,line);break;
4561case',':case TK_IN:forlist(ls,varname);break;
4562default:luaX_syntaxerror(ls,LUA_QL("=")" or "LUA_QL("in")" expected");
4563}
4564check_match(ls,TK_END,TK_FOR,line);
4565leaveblock(fs);
4566}
4567static int test_then_block(LexState*ls){
4568int condexit;
4569luaX_next(ls);
4570condexit=cond(ls);
4571checknext(ls,TK_THEN);
4572block(ls);
4573return condexit;
4574}
4575static void ifstat(LexState*ls,int line){
4576FuncState*fs=ls->fs;
4577int flist;
4578int escapelist=(-1);
4579flist=test_then_block(ls);
4580while(ls->t.token==TK_ELSEIF){
4581luaK_concat(fs,&escapelist,luaK_jump(fs));
4582luaK_patchtohere(fs,flist);
4583flist=test_then_block(ls);
4584}
4585if(ls->t.token==TK_ELSE){
4586luaK_concat(fs,&escapelist,luaK_jump(fs));
4587luaK_patchtohere(fs,flist);
4588luaX_next(ls);
4589block(ls);
4590}
4591else
4592luaK_concat(fs,&escapelist,flist);
4593luaK_patchtohere(fs,escapelist);
4594check_match(ls,TK_END,TK_IF,line);
4595}
4596static void localfunc(LexState*ls){
4597expdesc v,b;
4598FuncState*fs=ls->fs;
4599new_localvar(ls,str_checkname(ls),0);
4600init_exp(&v,VLOCAL,fs->freereg);
4601luaK_reserveregs(fs,1);
4602adjustlocalvars(ls,1);
4603body(ls,&b,0,ls->linenumber);
4604luaK_storevar(fs,&v,&b);
4605getlocvar(fs,fs->nactvar-1).startpc=fs->pc;
4606}
4607static void localstat(LexState*ls){
4608int nvars=0;
4609int nexps;
4610expdesc e;
4611do{
4612new_localvar(ls,str_checkname(ls),nvars++);
4613}while(testnext(ls,','));
4614if(testnext(ls,'='))
4615nexps=explist1(ls,&e);
4616else{
4617e.k=VVOID;
4618nexps=0;
4619}
4620adjust_assign(ls,nvars,nexps,&e);
4621adjustlocalvars(ls,nvars);
4622}
4623static int funcname(LexState*ls,expdesc*v){
4624int needself=0;
4625singlevar(ls,v);
4626while(ls->t.token=='.')
4627field(ls,v);
4628if(ls->t.token==':'){
4629needself=1;
4630field(ls,v);
4631}
4632return needself;
4633}
4634static void funcstat(LexState*ls,int line){
4635int needself;
4636expdesc v,b;
4637luaX_next(ls);
4638needself=funcname(ls,&v);
4639body(ls,&b,needself,line);
4640luaK_storevar(ls->fs,&v,&b);
4641luaK_fixline(ls->fs,line);
4642}
4643static void exprstat(LexState*ls){
4644FuncState*fs=ls->fs;
4645struct LHS_assign v;
4646primaryexp(ls,&v.v);
4647if(v.v.k==VCALL)
4648SETARG_C(getcode(fs,&v.v),1);
4649else{
4650v.prev=NULL;
4651assignment(ls,&v,1);
4652}
4653}
4654static void retstat(LexState*ls){
4655FuncState*fs=ls->fs;
4656expdesc e;
4657int first,nret;
4658luaX_next(ls);
4659if(block_follow(ls->t.token)||ls->t.token==';')
4660first=nret=0;
4661else{
4662nret=explist1(ls,&e);
4663if(hasmultret(e.k)){
4664luaK_setmultret(fs,&e);
4665if(e.k==VCALL&&nret==1){
4666SET_OPCODE(getcode(fs,&e),OP_TAILCALL);
4667}
4668first=fs->nactvar;
4669nret=(-1);
4670}
4671else{
4672if(nret==1)
4673first=luaK_exp2anyreg(fs,&e);
4674else{
4675luaK_exp2nextreg(fs,&e);
4676first=fs->nactvar;
4677}
4678}
4679}
4680luaK_ret(fs,first,nret);
4681}
4682static int statement(LexState*ls){
4683int line=ls->linenumber;
4684switch(ls->t.token){
4685case TK_IF:{
4686ifstat(ls,line);
4687return 0;
4688}
4689case TK_WHILE:{
4690whilestat(ls,line);
4691return 0;
4692}
4693case TK_DO:{
4694luaX_next(ls);
4695block(ls);
4696check_match(ls,TK_END,TK_DO,line);
4697return 0;
4698}
4699case TK_FOR:{
4700forstat(ls,line);
4701return 0;
4702}
4703case TK_REPEAT:{
4704repeatstat(ls,line);
4705return 0;
4706}
4707case TK_FUNCTION:{
4708funcstat(ls,line);
4709return 0;
4710}
4711case TK_LOCAL:{
4712luaX_next(ls);
4713if(testnext(ls,TK_FUNCTION))
4714localfunc(ls);
4715else
4716localstat(ls);
4717return 0;
4718}
4719case TK_RETURN:{
4720retstat(ls);
4721return 1;
4722}
4723case TK_BREAK:{
4724luaX_next(ls);
4725breakstat(ls);
4726return 1;
4727}
4728default:{
4729exprstat(ls);
4730return 0;
4731}
4732}
4733}
4734static void chunk(LexState*ls){
4735int islast=0;
4736enterlevel(ls);
4737while(!islast&&!block_follow(ls->t.token)){
4738islast=statement(ls);
4739testnext(ls,';');
4740ls->fs->freereg=ls->fs->nactvar;
4741}
4742leavelevel(ls);
4743}
4744static const TValue*luaV_tonumber(const TValue*obj,TValue*n){
4745lua_Number num;
4746if(ttisnumber(obj))return obj;
4747if(ttisstring(obj)&&luaO_str2d(svalue(obj),&num)){
4748setnvalue(n,num);
4749return n;
4750}
4751else
4752return NULL;
4753}
4754static int luaV_tostring(lua_State*L,StkId obj){
4755if(!ttisnumber(obj))
4756return 0;
4757else{
4758char s[32];
4759lua_Number n=nvalue(obj);
4760lua_number2str(s,n);
4761setsvalue(L,obj,luaS_new(L,s));
4762return 1;
4763}
4764}
4765static void callTMres(lua_State*L,StkId res,const TValue*f,
4766const TValue*p1,const TValue*p2){
4767ptrdiff_t result=savestack(L,res);
4768setobj(L,L->top,f);
4769setobj(L,L->top+1,p1);
4770setobj(L,L->top+2,p2);
4771luaD_checkstack(L,3);
4772L->top+=3;
4773luaD_call(L,L->top-3,1);
4774res=restorestack(L,result);
4775L->top--;
4776setobj(L,res,L->top);
4777}
4778static void callTM(lua_State*L,const TValue*f,const TValue*p1,
4779const TValue*p2,const TValue*p3){
4780setobj(L,L->top,f);
4781setobj(L,L->top+1,p1);
4782setobj(L,L->top+2,p2);
4783setobj(L,L->top+3,p3);
4784luaD_checkstack(L,4);
4785L->top+=4;
4786luaD_call(L,L->top-4,0);
4787}
4788static void luaV_gettable(lua_State*L,const TValue*t,TValue*key,StkId val){
4789int loop;
4790for(loop=0;loop<100;loop++){
4791const TValue*tm;
4792if(ttistable(t)){
4793Table*h=hvalue(t);
4794const TValue*res=luaH_get(h,key);
4795if(!ttisnil(res)||
4796(tm=fasttm(L,h->metatable,TM_INDEX))==NULL){
4797setobj(L,val,res);
4798return;
4799}
4800}
4801else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_INDEX)))
4802luaG_typeerror(L,t,"index");
4803if(ttisfunction(tm)){
4804callTMres(L,val,tm,t,key);
4805return;
4806}
4807t=tm;
4808}
4809luaG_runerror(L,"loop in gettable");
4810}
4811static void luaV_settable(lua_State*L,const TValue*t,TValue*key,StkId val){
4812int loop;
4813TValue temp;
4814for(loop=0;loop<100;loop++){
4815const TValue*tm;
4816if(ttistable(t)){
4817Table*h=hvalue(t);
4818TValue*oldval=luaH_set(L,h,key);
4819if(!ttisnil(oldval)||
4820(tm=fasttm(L,h->metatable,TM_NEWINDEX))==NULL){
4821setobj(L,oldval,val);
4822h->flags=0;
4823luaC_barriert(L,h,val);
4824return;
4825}
4826}
4827else if(ttisnil(tm=luaT_gettmbyobj(L,t,TM_NEWINDEX)))
4828luaG_typeerror(L,t,"index");
4829if(ttisfunction(tm)){
4830callTM(L,tm,t,key,val);
4831return;
4832}
4833setobj(L,&temp,tm);
4834t=&temp;
4835}
4836luaG_runerror(L,"loop in settable");
4837}
4838static int call_binTM(lua_State*L,const TValue*p1,const TValue*p2,
4839StkId res,TMS event){
4840const TValue*tm=luaT_gettmbyobj(L,p1,event);
4841if(ttisnil(tm))
4842tm=luaT_gettmbyobj(L,p2,event);
4843if(ttisnil(tm))return 0;
4844callTMres(L,res,tm,p1,p2);
4845return 1;
4846}
4847static const TValue*get_compTM(lua_State*L,Table*mt1,Table*mt2,
4848TMS event){
4849const TValue*tm1=fasttm(L,mt1,event);
4850const TValue*tm2;
4851if(tm1==NULL)return NULL;
4852if(mt1==mt2)return tm1;
4853tm2=fasttm(L,mt2,event);
4854if(tm2==NULL)return NULL;
4855if(luaO_rawequalObj(tm1,tm2))
4856return tm1;
4857return NULL;
4858}
4859static int call_orderTM(lua_State*L,const TValue*p1,const TValue*p2,
4860TMS event){
4861const TValue*tm1=luaT_gettmbyobj(L,p1,event);
4862const TValue*tm2;
4863if(ttisnil(tm1))return-1;
4864tm2=luaT_gettmbyobj(L,p2,event);
4865if(!luaO_rawequalObj(tm1,tm2))
4866return-1;
4867callTMres(L,L->top,tm1,p1,p2);
4868return!l_isfalse(L->top);
4869}
4870static int l_strcmp(const TString*ls,const TString*rs){
4871const char*l=getstr(ls);
4872size_t ll=ls->tsv.len;
4873const char*r=getstr(rs);
4874size_t lr=rs->tsv.len;
4875for(;;){
4876int temp=strcoll(l,r);
4877if(temp!=0)return temp;
4878else{
4879size_t len=strlen(l);
4880if(len==lr)
4881return(len==ll)?0:1;
4882else if(len==ll)
4883return-1;
4884len++;
4885l+=len;ll-=len;r+=len;lr-=len;
4886}
4887}
4888}
4889static int luaV_lessthan(lua_State*L,const TValue*l,const TValue*r){
4890int res;
4891if(ttype(l)!=ttype(r))
4892return luaG_ordererror(L,l,r);
4893else if(ttisnumber(l))
4894return luai_numlt(nvalue(l),nvalue(r));
4895else if(ttisstring(l))
4896return l_strcmp(rawtsvalue(l),rawtsvalue(r))<0;
4897else if((res=call_orderTM(L,l,r,TM_LT))!=-1)
4898return res;
4899return luaG_ordererror(L,l,r);
4900}
4901static int lessequal(lua_State*L,const TValue*l,const TValue*r){
4902int res;
4903if(ttype(l)!=ttype(r))
4904return luaG_ordererror(L,l,r);
4905else if(ttisnumber(l))
4906return luai_numle(nvalue(l),nvalue(r));
4907else if(ttisstring(l))
4908return l_strcmp(rawtsvalue(l),rawtsvalue(r))<=0;
4909else if((res=call_orderTM(L,l,r,TM_LE))!=-1)
4910return res;
4911else if((res=call_orderTM(L,r,l,TM_LT))!=-1)
4912return!res;
4913return luaG_ordererror(L,l,r);
4914}
4915static int luaV_equalval(lua_State*L,const TValue*t1,const TValue*t2){
4916const TValue*tm;
4917switch(ttype(t1)){
4918case 0:return 1;
4919case 3:return luai_numeq(nvalue(t1),nvalue(t2));
4920case 1:return bvalue(t1)==bvalue(t2);
4921case 2:return pvalue(t1)==pvalue(t2);
4922case 7:{
4923if(uvalue(t1)==uvalue(t2))return 1;
4924tm=get_compTM(L,uvalue(t1)->metatable,uvalue(t2)->metatable,
4925TM_EQ);
4926break;
4927}
4928case 5:{
4929if(hvalue(t1)==hvalue(t2))return 1;
4930tm=get_compTM(L,hvalue(t1)->metatable,hvalue(t2)->metatable,TM_EQ);
4931break;
4932}
4933default:return gcvalue(t1)==gcvalue(t2);
4934}
4935if(tm==NULL)return 0;
4936callTMres(L,L->top,tm,t1,t2);
4937return!l_isfalse(L->top);
4938}
4939static void luaV_concat(lua_State*L,int total,int last){
4940do{
4941StkId top=L->base+last+1;
4942int n=2;
4943if(!(ttisstring(top-2)||ttisnumber(top-2))||!tostring(L,top-1)){
4944if(!call_binTM(L,top-2,top-1,top-2,TM_CONCAT))
4945luaG_concaterror(L,top-2,top-1);
4946}else if(tsvalue(top-1)->len==0)
4947(void)tostring(L,top-2);
4948else{
4949size_t tl=tsvalue(top-1)->len;
4950char*buffer;
4951int i;
4952for(n=1;n<total&&tostring(L,top-n-1);n++){
4953size_t l=tsvalue(top-n-1)->len;
4954if(l>=((size_t)(~(size_t)0)-2)-tl)luaG_runerror(L,"string length overflow");
4955tl+=l;
4956}
4957buffer=luaZ_openspace(L,&G(L)->buff,tl);
4958tl=0;
4959for(i=n;i>0;i--){
4960size_t l=tsvalue(top-i)->len;
4961memcpy(buffer+tl,svalue(top-i),l);
4962tl+=l;
4963}
4964setsvalue(L,top-n,luaS_newlstr(L,buffer,tl));
4965}
4966total-=n-1;
4967last-=n-1;
4968}while(total>1);
4969}
4970static void Arith(lua_State*L,StkId ra,const TValue*rb,
4971const TValue*rc,TMS op){
4972TValue tempb,tempc;
4973const TValue*b,*c;
4974if((b=luaV_tonumber(rb,&tempb))!=NULL&&
4975(c=luaV_tonumber(rc,&tempc))!=NULL){
4976lua_Number nb=nvalue(b),nc=nvalue(c);
4977switch(op){
4978case TM_ADD:setnvalue(ra,luai_numadd(nb,nc));break;
4979case TM_SUB:setnvalue(ra,luai_numsub(nb,nc));break;
4980case TM_MUL:setnvalue(ra,luai_nummul(nb,nc));break;
4981case TM_DIV:setnvalue(ra,luai_numdiv(nb,nc));break;
4982case TM_MOD:setnvalue(ra,luai_nummod(nb,nc));break;
4983case TM_POW:setnvalue(ra,luai_numpow(nb,nc));break;
4984case TM_UNM:setnvalue(ra,luai_numunm(nb));break;
4985default:break;
4986}
4987}
4988else if(!call_binTM(L,rb,rc,ra,op))
4989luaG_aritherror(L,rb,rc);
4990}
4991#define runtime_check(L,c){if(!(c))break;}
4992#define RA(i)(base+GETARG_A(i))
4993#define RB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgR,base+GETARG_B(i))
4994#define RKB(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_B(i))?k+INDEXK(GETARG_B(i)):base+GETARG_B(i))
4995#define RKC(i)check_exp(getCMode(GET_OPCODE(i))==OpArgK,ISK(GETARG_C(i))?k+INDEXK(GETARG_C(i)):base+GETARG_C(i))
4996#define KBx(i)check_exp(getBMode(GET_OPCODE(i))==OpArgK,k+GETARG_Bx(i))
4997#define dojump(L,pc,i){(pc)+=(i);}
4998#define Protect(x){L->savedpc=pc;{x;};base=L->base;}
4999#define arith_op(op,tm){TValue*rb=RKB(i);TValue*rc=RKC(i);if(ttisnumber(rb)&&ttisnumber(rc)){lua_Number nb=nvalue(rb),nc=nvalue(rc);setnvalue(ra,op(nb,nc));}else Protect(Arith(L,ra,rb,rc,tm));}
5000static void luaV_execute(lua_State*L,int nexeccalls){
5001LClosure*cl;
5002StkId base;
5003TValue*k;
5004const Instruction*pc;
5005reentry:
5006pc=L->savedpc;
5007cl=&clvalue(L->ci->func)->l;
5008base=L->base;
5009k=cl->p->k;
5010for(;;){
5011const Instruction i=*pc++;
5012StkId ra;
5013ra=RA(i);
5014switch(GET_OPCODE(i)){
5015case OP_MOVE:{
5016setobj(L,ra,RB(i));
5017continue;
5018}
5019case OP_LOADK:{
5020setobj(L,ra,KBx(i));
5021continue;
5022}
5023case OP_LOADBOOL:{
5024setbvalue(ra,GETARG_B(i));
5025if(GETARG_C(i))pc++;
5026continue;
5027}
5028case OP_LOADNIL:{
5029TValue*rb=RB(i);
5030do{
5031setnilvalue(rb--);
5032}while(rb>=ra);
5033continue;
5034}
5035case OP_GETUPVAL:{
5036int b=GETARG_B(i);
5037setobj(L,ra,cl->upvals[b]->v);
5038continue;
5039}
5040case OP_GETGLOBAL:{
5041TValue g;
5042TValue*rb=KBx(i);
5043sethvalue(L,&g,cl->env);
5044Protect(luaV_gettable(L,&g,rb,ra));
5045continue;
5046}
5047case OP_GETTABLE:{
5048Protect(luaV_gettable(L,RB(i),RKC(i),ra));
5049continue;
5050}
5051case OP_SETGLOBAL:{
5052TValue g;
5053sethvalue(L,&g,cl->env);
5054Protect(luaV_settable(L,&g,KBx(i),ra));
5055continue;
5056}
5057case OP_SETUPVAL:{
5058UpVal*uv=cl->upvals[GETARG_B(i)];
5059setobj(L,uv->v,ra);
5060luaC_barrier(L,uv,ra);
5061continue;
5062}
5063case OP_SETTABLE:{
5064Protect(luaV_settable(L,ra,RKB(i),RKC(i)));
5065continue;
5066}
5067case OP_NEWTABLE:{
5068int b=GETARG_B(i);
5069int c=GETARG_C(i);
5070sethvalue(L,ra,luaH_new(L,luaO_fb2int(b),luaO_fb2int(c)));
5071Protect(luaC_checkGC(L));
5072continue;
5073}
5074case OP_SELF:{
5075StkId rb=RB(i);
5076setobj(L,ra+1,rb);
5077Protect(luaV_gettable(L,rb,RKC(i),ra));
5078continue;
5079}
5080case OP_ADD:{
5081arith_op(luai_numadd,TM_ADD);
5082continue;
5083}
5084case OP_SUB:{
5085arith_op(luai_numsub,TM_SUB);
5086continue;
5087}
5088case OP_MUL:{
5089arith_op(luai_nummul,TM_MUL);
5090continue;
5091}
5092case OP_DIV:{
5093arith_op(luai_numdiv,TM_DIV);
5094continue;
5095}
5096case OP_MOD:{
5097arith_op(luai_nummod,TM_MOD);
5098continue;
5099}
5100case OP_POW:{
5101arith_op(luai_numpow,TM_POW);
5102continue;
5103}
5104case OP_UNM:{
5105TValue*rb=RB(i);
5106if(ttisnumber(rb)){
5107lua_Number nb=nvalue(rb);
5108setnvalue(ra,luai_numunm(nb));
5109}
5110else{
5111Protect(Arith(L,ra,rb,rb,TM_UNM));
5112}
5113continue;
5114}
5115case OP_NOT:{
5116int res=l_isfalse(RB(i));
5117setbvalue(ra,res);
5118continue;
5119}
5120case OP_LEN:{
5121const TValue*rb=RB(i);
5122switch(ttype(rb)){
5123case 5:{
5124setnvalue(ra,cast_num(luaH_getn(hvalue(rb))));
5125break;
5126}
5127case 4:{
5128setnvalue(ra,cast_num(tsvalue(rb)->len));
5129break;
5130}
5131default:{
5132Protect(
5133if(!call_binTM(L,rb,(&luaO_nilobject_),ra,TM_LEN))
5134luaG_typeerror(L,rb,"get length of");
5135)
5136}
5137}
5138continue;
5139}
5140case OP_CONCAT:{
5141int b=GETARG_B(i);
5142int c=GETARG_C(i);
5143Protect(luaV_concat(L,c-b+1,c);luaC_checkGC(L));
5144setobj(L,RA(i),base+b);
5145continue;
5146}
5147case OP_JMP:{
5148dojump(L,pc,GETARG_sBx(i));
5149continue;
5150}
5151case OP_EQ:{
5152TValue*rb=RKB(i);
5153TValue*rc=RKC(i);
5154Protect(
5155if(equalobj(L,rb,rc)==GETARG_A(i))
5156dojump(L,pc,GETARG_sBx(*pc));
5157)
5158pc++;
5159continue;
5160}
5161case OP_LT:{
5162Protect(
5163if(luaV_lessthan(L,RKB(i),RKC(i))==GETARG_A(i))
5164dojump(L,pc,GETARG_sBx(*pc));
5165)
5166pc++;
5167continue;
5168}
5169case OP_LE:{
5170Protect(
5171if(lessequal(L,RKB(i),RKC(i))==GETARG_A(i))
5172dojump(L,pc,GETARG_sBx(*pc));
5173)
5174pc++;
5175continue;
5176}
5177case OP_TEST:{
5178if(l_isfalse(ra)!=GETARG_C(i))
5179dojump(L,pc,GETARG_sBx(*pc));
5180pc++;
5181continue;
5182}
5183case OP_TESTSET:{
5184TValue*rb=RB(i);
5185if(l_isfalse(rb)!=GETARG_C(i)){
5186setobj(L,ra,rb);
5187dojump(L,pc,GETARG_sBx(*pc));
5188}
5189pc++;
5190continue;
5191}
5192case OP_CALL:{
5193int b=GETARG_B(i);
5194int nresults=GETARG_C(i)-1;
5195if(b!=0)L->top=ra+b;
5196L->savedpc=pc;
5197switch(luaD_precall(L,ra,nresults)){
5198case 0:{
5199nexeccalls++;
5200goto reentry;
5201}
5202case 1:{
5203if(nresults>=0)L->top=L->ci->top;
5204base=L->base;
5205continue;
5206}
5207default:{
5208return;
5209}
5210}
5211}
5212case OP_TAILCALL:{
5213int b=GETARG_B(i);
5214if(b!=0)L->top=ra+b;
5215L->savedpc=pc;
5216switch(luaD_precall(L,ra,(-1))){
5217case 0:{
5218CallInfo*ci=L->ci-1;
5219int aux;
5220StkId func=ci->func;
5221StkId pfunc=(ci+1)->func;
5222if(L->openupval)luaF_close(L,ci->base);
5223L->base=ci->base=ci->func+((ci+1)->base-pfunc);
5224for(aux=0;pfunc+aux<L->top;aux++)
5225setobj(L,func+aux,pfunc+aux);
5226ci->top=L->top=func+aux;
5227ci->savedpc=L->savedpc;
5228ci->tailcalls++;
5229L->ci--;
5230goto reentry;
5231}
5232case 1:{
5233base=L->base;
5234continue;
5235}
5236default:{
5237return;
5238}
5239}
5240}
5241case OP_RETURN:{
5242int b=GETARG_B(i);
5243if(b!=0)L->top=ra+b-1;
5244if(L->openupval)luaF_close(L,base);
5245L->savedpc=pc;
5246b=luaD_poscall(L,ra);
5247if(--nexeccalls==0)
5248return;
5249else{
5250if(b)L->top=L->ci->top;
5251goto reentry;
5252}
5253}
5254case OP_FORLOOP:{
5255lua_Number step=nvalue(ra+2);
5256lua_Number idx=luai_numadd(nvalue(ra),step);
5257lua_Number limit=nvalue(ra+1);
5258if(luai_numlt(0,step)?luai_numle(idx,limit)
5259:luai_numle(limit,idx)){
5260dojump(L,pc,GETARG_sBx(i));
5261setnvalue(ra,idx);
5262setnvalue(ra+3,idx);
5263}
5264continue;
5265}
5266case OP_FORPREP:{
5267const TValue*init=ra;
5268const TValue*plimit=ra+1;
5269const TValue*pstep=ra+2;
5270L->savedpc=pc;
5271if(!tonumber(init,ra))
5272luaG_runerror(L,LUA_QL("for")" initial value must be a number");
5273else if(!tonumber(plimit,ra+1))
5274luaG_runerror(L,LUA_QL("for")" limit must be a number");
5275else if(!tonumber(pstep,ra+2))
5276luaG_runerror(L,LUA_QL("for")" step must be a number");
5277setnvalue(ra,luai_numsub(nvalue(ra),nvalue(pstep)));
5278dojump(L,pc,GETARG_sBx(i));
5279continue;
5280}
5281case OP_TFORLOOP:{
5282StkId cb=ra+3;
5283setobj(L,cb+2,ra+2);
5284setobj(L,cb+1,ra+1);
5285setobj(L,cb,ra);
5286L->top=cb+3;
5287Protect(luaD_call(L,cb,GETARG_C(i)));
5288L->top=L->ci->top;
5289cb=RA(i)+3;
5290if(!ttisnil(cb)){
5291setobj(L,cb-1,cb);
5292dojump(L,pc,GETARG_sBx(*pc));
5293}
5294pc++;
5295continue;
5296}
5297case OP_SETLIST:{
5298int n=GETARG_B(i);
5299int c=GETARG_C(i);
5300int last;
5301Table*h;
5302if(n==0){
5303n=cast_int(L->top-ra)-1;
5304L->top=L->ci->top;
5305}
5306if(c==0)c=cast_int(*pc++);
5307runtime_check(L,ttistable(ra));
5308h=hvalue(ra);
5309last=((c-1)*50)+n;
5310if(last>h->sizearray)
5311luaH_resizearray(L,h,last);
5312for(;n>0;n--){
5313TValue*val=ra+n;
5314setobj(L,luaH_setnum(L,h,last--),val);
5315luaC_barriert(L,h,val);
5316}
5317continue;
5318}
5319case OP_CLOSE:{
5320luaF_close(L,ra);
5321continue;
5322}
5323case OP_CLOSURE:{
5324Proto*p;
5325Closure*ncl;
5326int nup,j;
5327p=cl->p->p[GETARG_Bx(i)];
5328nup=p->nups;
5329ncl=luaF_newLclosure(L,nup,cl->env);
5330ncl->l.p=p;
5331for(j=0;j<nup;j++,pc++){
5332if(GET_OPCODE(*pc)==OP_GETUPVAL)
5333ncl->l.upvals[j]=cl->upvals[GETARG_B(*pc)];
5334else{
5335ncl->l.upvals[j]=luaF_findupval(L,base+GETARG_B(*pc));
5336}
5337}
5338setclvalue(L,ra,ncl);
5339Protect(luaC_checkGC(L));
5340continue;
5341}
5342case OP_VARARG:{
5343int b=GETARG_B(i)-1;
5344int j;
5345CallInfo*ci=L->ci;
5346int n=cast_int(ci->base-ci->func)-cl->p->numparams-1;
5347if(b==(-1)){
5348Protect(luaD_checkstack(L,n));
5349ra=RA(i);
5350b=n;
5351L->top=ra+n;
5352}
5353for(j=0;j<b;j++){
5354if(j<n){
5355setobj(L,ra+j,ci->base-n+j);
5356}
5357else{
5358setnilvalue(ra+j);
5359}
5360}
5361continue;
5362}
5363}
5364}
5365}
5366#define api_checknelems(L,n)luai_apicheck(L,(n)<=(L->top-L->base))
5367#define api_checkvalidindex(L,i)luai_apicheck(L,(i)!=(&luaO_nilobject_))
5368#define api_incr_top(L){luai_apicheck(L,L->top<L->ci->top);L->top++;}
5369static TValue*index2adr(lua_State*L,int idx){
5370if(idx>0){
5371TValue*o=L->base+(idx-1);
5372luai_apicheck(L,idx<=L->ci->top-L->base);
5373if(o>=L->top)return cast(TValue*,(&luaO_nilobject_));
5374else return o;
5375}
5376else if(idx>(-10000)){
5377luai_apicheck(L,idx!=0&&-idx<=L->top-L->base);
5378return L->top+idx;
5379}
5380else switch(idx){
5381case(-10000):return registry(L);
5382case(-10001):{
5383Closure*func=curr_func(L);
5384sethvalue(L,&L->env,func->c.env);
5385return&L->env;
5386}
5387case(-10002):return gt(L);
5388default:{
5389Closure*func=curr_func(L);
5390idx=(-10002)-idx;
5391return(idx<=func->c.nupvalues)
5392?&func->c.upvalue[idx-1]
5393:cast(TValue*,(&luaO_nilobject_));
5394}
5395}
5396}
5397static Table*getcurrenv(lua_State*L){
5398if(L->ci==L->base_ci)
5399return hvalue(gt(L));
5400else{
5401Closure*func=curr_func(L);
5402return func->c.env;
5403}
5404}
5405static int lua_checkstack(lua_State*L,int size){
5406int res=1;
5407if(size>8000||(L->top-L->base+size)>8000)
5408res=0;
5409else if(size>0){
5410luaD_checkstack(L,size);
5411if(L->ci->top<L->top+size)
5412L->ci->top=L->top+size;
5413}
5414return res;
5415}
5416static void lua_xmove(lua_State*from,lua_State*to,int n){
5417int i;
5418if(from==to)return;
5419api_checknelems(from,n);
5420luai_apicheck(from,G(from)==G(to));
5421luai_apicheck(from,to->ci->top-to->top>=n);
5422from->top-=n;
5423for(i=0;i<n;i++){
5424setobj(to,to->top++,from->top+i);
5425}
5426}
5427static void lua_setlevel(lua_State*from,lua_State*to){
5428to->nCcalls=from->nCcalls;
5429}
5430static lua_CFunction lua_atpanic(lua_State*L,lua_CFunction panicf){
5431lua_CFunction old;
5432old=G(L)->panic;
5433G(L)->panic=panicf;
5434return old;
5435}
5436static lua_State*lua_newthread(lua_State*L){
5437lua_State*L1;
5438luaC_checkGC(L);
5439L1=luaE_newthread(L);
5440setthvalue(L,L->top,L1);
5441api_incr_top(L);
5442return L1;
5443}
5444static int lua_gettop(lua_State*L){
5445return cast_int(L->top-L->base);
5446}
5447static void lua_settop(lua_State*L,int idx){
5448if(idx>=0){
5449luai_apicheck(L,idx<=L->stack_last-L->base);
5450while(L->top<L->base+idx)
5451setnilvalue(L->top++);
5452L->top=L->base+idx;
5453}
5454else{
5455luai_apicheck(L,-(idx+1)<=(L->top-L->base));
5456L->top+=idx+1;
5457}
5458}
5459static void lua_remove(lua_State*L,int idx){
5460StkId p;
5461p=index2adr(L,idx);
5462api_checkvalidindex(L,p);
5463while(++p<L->top)setobj(L,p-1,p);
5464L->top--;
5465}
5466static void lua_insert(lua_State*L,int idx){
5467StkId p;
5468StkId q;
5469p=index2adr(L,idx);
5470api_checkvalidindex(L,p);
5471for(q=L->top;q>p;q--)setobj(L,q,q-1);
5472setobj(L,p,L->top);
5473}
5474static void lua_replace(lua_State*L,int idx){
5475StkId o;
5476if(idx==(-10001)&&L->ci==L->base_ci)
5477luaG_runerror(L,"no calling environment");
5478api_checknelems(L,1);
5479o=index2adr(L,idx);
5480api_checkvalidindex(L,o);
5481if(idx==(-10001)){
5482Closure*func=curr_func(L);
5483luai_apicheck(L,ttistable(L->top-1));
5484func->c.env=hvalue(L->top-1);
5485luaC_barrier(L,func,L->top-1);
5486}
5487else{
5488setobj(L,o,L->top-1);
5489if(idx<(-10002))
5490luaC_barrier(L,curr_func(L),L->top-1);
5491}
5492L->top--;
5493}
5494static void lua_pushvalue(lua_State*L,int idx){
5495setobj(L,L->top,index2adr(L,idx));
5496api_incr_top(L);
5497}
5498static int lua_type(lua_State*L,int idx){
5499StkId o=index2adr(L,idx);
5500return(o==(&luaO_nilobject_))?(-1):ttype(o);
5501}
5502static const char*lua_typename(lua_State*L,int t){
5503UNUSED(L);
5504return(t==(-1))?"no value":luaT_typenames[t];
5505}
5506static int lua_iscfunction(lua_State*L,int idx){
5507StkId o=index2adr(L,idx);
5508return iscfunction(o);
5509}
5510static int lua_isnumber(lua_State*L,int idx){
5511TValue n;
5512const TValue*o=index2adr(L,idx);
5513return tonumber(o,&n);
5514}
5515static int lua_isstring(lua_State*L,int idx){
5516int t=lua_type(L,idx);
5517return(t==4||t==3);
5518}
5519static int lua_rawequal(lua_State*L,int index1,int index2){
5520StkId o1=index2adr(L,index1);
5521StkId o2=index2adr(L,index2);
5522return(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0
5523:luaO_rawequalObj(o1,o2);
5524}
5525static int lua_lessthan(lua_State*L,int index1,int index2){
5526StkId o1,o2;
5527int i;
5528o1=index2adr(L,index1);
5529o2=index2adr(L,index2);
5530i=(o1==(&luaO_nilobject_)||o2==(&luaO_nilobject_))?0
5531:luaV_lessthan(L,o1,o2);
5532return i;
5533}
5534static lua_Number lua_tonumber(lua_State*L,int idx){
5535TValue n;
5536const TValue*o=index2adr(L,idx);
5537if(tonumber(o,&n))
5538return nvalue(o);
5539else
5540return 0;
5541}
5542static lua_Integer lua_tointeger(lua_State*L,int idx){
5543TValue n;
5544const TValue*o=index2adr(L,idx);
5545if(tonumber(o,&n)){
5546lua_Integer res;
5547lua_Number num=nvalue(o);
5548lua_number2integer(res,num);
5549return res;
5550}
5551else
5552return 0;
5553}
5554static int lua_toboolean(lua_State*L,int idx){
5555const TValue*o=index2adr(L,idx);
5556return!l_isfalse(o);
5557}
5558static const char*lua_tolstring(lua_State*L,int idx,size_t*len){
5559StkId o=index2adr(L,idx);
5560if(!ttisstring(o)){
5561if(!luaV_tostring(L,o)){
5562if(len!=NULL)*len=0;
5563return NULL;
5564}
5565luaC_checkGC(L);
5566o=index2adr(L,idx);
5567}
5568if(len!=NULL)*len=tsvalue(o)->len;
5569return svalue(o);
5570}
5571static size_t lua_objlen(lua_State*L,int idx){
5572StkId o=index2adr(L,idx);
5573switch(ttype(o)){
5574case 4:return tsvalue(o)->len;
5575case 7:return uvalue(o)->len;
5576case 5:return luaH_getn(hvalue(o));
5577case 3:{
5578size_t l;
5579l=(luaV_tostring(L,o)?tsvalue(o)->len:0);
5580return l;
5581}
5582default:return 0;
5583}
5584}
5585static lua_CFunction lua_tocfunction(lua_State*L,int idx){
5586StkId o=index2adr(L,idx);
5587return(!iscfunction(o))?NULL:clvalue(o)->c.f;
5588}
5589static void*lua_touserdata(lua_State*L,int idx){
5590StkId o=index2adr(L,idx);
5591switch(ttype(o)){
5592case 7:return(rawuvalue(o)+1);
5593case 2:return pvalue(o);
5594default:return NULL;
5595}
5596}
5597static lua_State*lua_tothread(lua_State*L,int idx){
5598StkId o=index2adr(L,idx);
5599return(!ttisthread(o))?NULL:thvalue(o);
5600}
5601static void lua_pushnil(lua_State*L){
5602setnilvalue(L->top);
5603api_incr_top(L);
5604}
5605static void lua_pushnumber(lua_State*L,lua_Number n){
5606setnvalue(L->top,n);
5607api_incr_top(L);
5608}
5609static void lua_pushinteger(lua_State*L,lua_Integer n){
5610setnvalue(L->top,cast_num(n));
5611api_incr_top(L);
5612}
5613static void lua_pushlstring(lua_State*L,const char*s,size_t len){
5614luaC_checkGC(L);
5615setsvalue(L,L->top,luaS_newlstr(L,s,len));
5616api_incr_top(L);
5617}
5618static void lua_pushstring(lua_State*L,const char*s){
5619if(s==NULL)
5620lua_pushnil(L);
5621else
5622lua_pushlstring(L,s,strlen(s));
5623}
5624static const char*lua_pushvfstring(lua_State*L,const char*fmt,
5625va_list argp){
5626const char*ret;
5627luaC_checkGC(L);
5628ret=luaO_pushvfstring(L,fmt,argp);
5629return ret;
5630}
5631static const char*lua_pushfstring(lua_State*L,const char*fmt,...){
5632const char*ret;
5633va_list argp;
5634luaC_checkGC(L);
5635va_start(argp,fmt);
5636ret=luaO_pushvfstring(L,fmt,argp);
5637va_end(argp);
5638return ret;
5639}
5640static void lua_pushcclosure(lua_State*L,lua_CFunction fn,int n){
5641Closure*cl;
5642luaC_checkGC(L);
5643api_checknelems(L,n);
5644cl=luaF_newCclosure(L,n,getcurrenv(L));
5645cl->c.f=fn;
5646L->top-=n;
5647while(n--)
5648setobj(L,&cl->c.upvalue[n],L->top+n);
5649setclvalue(L,L->top,cl);
5650api_incr_top(L);
5651}
5652static void lua_pushboolean(lua_State*L,int b){
5653setbvalue(L->top,(b!=0));
5654api_incr_top(L);
5655}
5656static int lua_pushthread(lua_State*L){
5657setthvalue(L,L->top,L);
5658api_incr_top(L);
5659return(G(L)->mainthread==L);
5660}
5661static void lua_gettable(lua_State*L,int idx){
5662StkId t;
5663t=index2adr(L,idx);
5664api_checkvalidindex(L,t);
5665luaV_gettable(L,t,L->top-1,L->top-1);
5666}
5667static void lua_getfield(lua_State*L,int idx,const char*k){
5668StkId t;
5669TValue key;
5670t=index2adr(L,idx);
5671api_checkvalidindex(L,t);
5672setsvalue(L,&key,luaS_new(L,k));
5673luaV_gettable(L,t,&key,L->top);
5674api_incr_top(L);
5675}
5676static void lua_rawget(lua_State*L,int idx){
5677StkId t;
5678t=index2adr(L,idx);
5679luai_apicheck(L,ttistable(t));
5680setobj(L,L->top-1,luaH_get(hvalue(t),L->top-1));
5681}
5682static void lua_rawgeti(lua_State*L,int idx,int n){
5683StkId o;
5684o=index2adr(L,idx);
5685luai_apicheck(L,ttistable(o));
5686setobj(L,L->top,luaH_getnum(hvalue(o),n));
5687api_incr_top(L);
5688}
5689static void lua_createtable(lua_State*L,int narray,int nrec){
5690luaC_checkGC(L);
5691sethvalue(L,L->top,luaH_new(L,narray,nrec));
5692api_incr_top(L);
5693}
5694static int lua_getmetatable(lua_State*L,int objindex){
5695const TValue*obj;
5696Table*mt=NULL;
5697int res;
5698obj=index2adr(L,objindex);
5699switch(ttype(obj)){
5700case 5:
5701mt=hvalue(obj)->metatable;
5702break;
5703case 7:
5704mt=uvalue(obj)->metatable;
5705break;
5706default:
5707mt=G(L)->mt[ttype(obj)];
5708break;
5709}
5710if(mt==NULL)
5711res=0;
5712else{
5713sethvalue(L,L->top,mt);
5714api_incr_top(L);
5715res=1;
5716}
5717return res;
5718}
5719static void lua_getfenv(lua_State*L,int idx){
5720StkId o;
5721o=index2adr(L,idx);
5722api_checkvalidindex(L,o);
5723switch(ttype(o)){
5724case 6:
5725sethvalue(L,L->top,clvalue(o)->c.env);
5726break;
5727case 7:
5728sethvalue(L,L->top,uvalue(o)->env);
5729break;
5730case 8:
5731setobj(L,L->top,gt(thvalue(o)));
5732break;
5733default:
5734setnilvalue(L->top);
5735break;
5736}
5737api_incr_top(L);
5738}
5739static void lua_settable(lua_State*L,int idx){
5740StkId t;
5741api_checknelems(L,2);
5742t=index2adr(L,idx);
5743api_checkvalidindex(L,t);
5744luaV_settable(L,t,L->top-2,L->top-1);
5745L->top-=2;
5746}
5747static void lua_setfield(lua_State*L,int idx,const char*k){
5748StkId t;
5749TValue key;
5750api_checknelems(L,1);
5751t=index2adr(L,idx);
5752api_checkvalidindex(L,t);
5753setsvalue(L,&key,luaS_new(L,k));
5754luaV_settable(L,t,&key,L->top-1);
5755L->top--;
5756}
5757static void lua_rawset(lua_State*L,int idx){
5758StkId t;
5759api_checknelems(L,2);
5760t=index2adr(L,idx);
5761luai_apicheck(L,ttistable(t));
5762setobj(L,luaH_set(L,hvalue(t),L->top-2),L->top-1);
5763luaC_barriert(L,hvalue(t),L->top-1);
5764L->top-=2;
5765}
5766static void lua_rawseti(lua_State*L,int idx,int n){
5767StkId o;
5768api_checknelems(L,1);
5769o=index2adr(L,idx);
5770luai_apicheck(L,ttistable(o));
5771setobj(L,luaH_setnum(L,hvalue(o),n),L->top-1);
5772luaC_barriert(L,hvalue(o),L->top-1);
5773L->top--;
5774}
5775static int lua_setmetatable(lua_State*L,int objindex){
5776TValue*obj;
5777Table*mt;
5778api_checknelems(L,1);
5779obj=index2adr(L,objindex);
5780api_checkvalidindex(L,obj);
5781if(ttisnil(L->top-1))
5782mt=NULL;
5783else{
5784luai_apicheck(L,ttistable(L->top-1));
5785mt=hvalue(L->top-1);
5786}
5787switch(ttype(obj)){
5788case 5:{
5789hvalue(obj)->metatable=mt;
5790if(mt)
5791luaC_objbarriert(L,hvalue(obj),mt);
5792break;
5793}
5794case 7:{
5795uvalue(obj)->metatable=mt;
5796if(mt)
5797luaC_objbarrier(L,rawuvalue(obj),mt);
5798break;
5799}
5800default:{
5801G(L)->mt[ttype(obj)]=mt;
5802break;
5803}
5804}
5805L->top--;
5806return 1;
5807}
5808static int lua_setfenv(lua_State*L,int idx){
5809StkId o;
5810int res=1;
5811api_checknelems(L,1);
5812o=index2adr(L,idx);
5813api_checkvalidindex(L,o);
5814luai_apicheck(L,ttistable(L->top-1));
5815switch(ttype(o)){
5816case 6:
5817clvalue(o)->c.env=hvalue(L->top-1);
5818break;
5819case 7:
5820uvalue(o)->env=hvalue(L->top-1);
5821break;
5822case 8:
5823sethvalue(L,gt(thvalue(o)),hvalue(L->top-1));
5824break;
5825default:
5826res=0;
5827break;
5828}
5829if(res)luaC_objbarrier(L,gcvalue(o),hvalue(L->top-1));
5830L->top--;
5831return res;
5832}
5833#define adjustresults(L,nres){if(nres==(-1)&&L->top>=L->ci->top)L->ci->top=L->top;}
5834#define checkresults(L,na,nr)luai_apicheck(L,(nr)==(-1)||(L->ci->top-L->top>=(nr)-(na)))
5835static void lua_call(lua_State*L,int nargs,int nresults){
5836StkId func;
5837api_checknelems(L,nargs+1);
5838checkresults(L,nargs,nresults);
5839func=L->top-(nargs+1);
5840luaD_call(L,func,nresults);
5841adjustresults(L,nresults);
5842}
5843struct CallS{
5844StkId func;
5845int nresults;
5846};
5847static void f_call(lua_State*L,void*ud){
5848struct CallS*c=cast(struct CallS*,ud);
5849luaD_call(L,c->func,c->nresults);
5850}
5851static int lua_pcall(lua_State*L,int nargs,int nresults,int errfunc){
5852struct CallS c;
5853int status;
5854ptrdiff_t func;
5855api_checknelems(L,nargs+1);
5856checkresults(L,nargs,nresults);
5857if(errfunc==0)
5858func=0;
5859else{
5860StkId o=index2adr(L,errfunc);
5861api_checkvalidindex(L,o);
5862func=savestack(L,o);
5863}
5864c.func=L->top-(nargs+1);
5865c.nresults=nresults;
5866status=luaD_pcall(L,f_call,&c,savestack(L,c.func),func);
5867adjustresults(L,nresults);
5868return status;
5869}
5870static int lua_load(lua_State*L,lua_Reader reader,void*data,
5871const char*chunkname){
5872ZIO z;
5873int status;
5874if(!chunkname)chunkname="?";
5875luaZ_init(L,&z,reader,data);
5876status=luaD_protectedparser(L,&z,chunkname);
5877return status;
5878}
5879static int lua_status(lua_State*L){
5880return L->status;
5881}
5882static int lua_error(lua_State*L){
5883api_checknelems(L,1);
5884luaG_errormsg(L);
5885return 0;
5886}
5887static int lua_next(lua_State*L,int idx){
5888StkId t;
5889int more;
5890t=index2adr(L,idx);
5891luai_apicheck(L,ttistable(t));
5892more=luaH_next(L,hvalue(t),L->top-1);
5893if(more){
5894api_incr_top(L);
5895}
5896else
5897L->top-=1;
5898return more;
5899}
5900static void lua_concat(lua_State*L,int n){
5901api_checknelems(L,n);
5902if(n>=2){
5903luaC_checkGC(L);
5904luaV_concat(L,n,cast_int(L->top-L->base)-1);
5905L->top-=(n-1);
5906}
5907else if(n==0){
5908setsvalue(L,L->top,luaS_newlstr(L,"",0));
5909api_incr_top(L);
5910}
5911}
5912static void*lua_newuserdata(lua_State*L,size_t size){
5913Udata*u;
5914luaC_checkGC(L);
5915u=luaS_newudata(L,size,getcurrenv(L));
5916setuvalue(L,L->top,u);
5917api_incr_top(L);
5918return u+1;
5919}
5920#define luaL_getn(L,i)((int)lua_objlen(L,i))
5921#define luaL_setn(L,i,j)((void)0)
5922typedef struct luaL_Reg{
5923const char*name;
5924lua_CFunction func;
5925}luaL_Reg;
5926static void luaI_openlib(lua_State*L,const char*libname,
5927const luaL_Reg*l,int nup);
5928static int luaL_argerror(lua_State*L,int numarg,const char*extramsg);
5929static const char* luaL_checklstring(lua_State*L,int numArg,
5930size_t*l);
5931static const char* luaL_optlstring(lua_State*L,int numArg,
5932const char*def,size_t*l);
5933static lua_Integer luaL_checkinteger(lua_State*L,int numArg);
5934static lua_Integer luaL_optinteger(lua_State*L,int nArg,
5935lua_Integer def);
5936static int luaL_error(lua_State*L,const char*fmt,...);
5937static const char* luaL_findtable(lua_State*L,int idx,
5938const char*fname,int szhint);
5939#define luaL_argcheck(L,cond,numarg,extramsg)((void)((cond)||luaL_argerror(L,(numarg),(extramsg))))
5940#define luaL_checkstring(L,n)(luaL_checklstring(L,(n),NULL))
5941#define luaL_optstring(L,n,d)(luaL_optlstring(L,(n),(d),NULL))
5942#define luaL_checkint(L,n)((int)luaL_checkinteger(L,(n)))
5943#define luaL_optint(L,n,d)((int)luaL_optinteger(L,(n),(d)))
5944#define luaL_typename(L,i)lua_typename(L,lua_type(L,(i)))
5945#define luaL_getmetatable(L,n)(lua_getfield(L,(-10000),(n)))
5946#define luaL_opt(L,f,n,d)(lua_isnoneornil(L,(n))?(d):f(L,(n)))
5947typedef struct luaL_Buffer{
5948char*p;
5949int lvl;
5950lua_State*L;
5951char buffer[BUFSIZ];
5952}luaL_Buffer;
5953#define luaL_addchar(B,c)((void)((B)->p<((B)->buffer+BUFSIZ)||luaL_prepbuffer(B)),(*(B)->p++=(char)(c)))
5954#define luaL_addsize(B,n)((B)->p+=(n))
5955static char* luaL_prepbuffer(luaL_Buffer*B);
5956static int luaL_argerror(lua_State*L,int narg,const char*extramsg){
5957lua_Debug ar;
5958if(!lua_getstack(L,0,&ar))
5959return luaL_error(L,"bad argument #%d (%s)",narg,extramsg);
5960lua_getinfo(L,"n",&ar);
5961if(strcmp(ar.namewhat,"method")==0){
5962narg--;
5963if(narg==0)
5964return luaL_error(L,"calling "LUA_QL("%s")" on bad self (%s)",
5965ar.name,extramsg);
5966}
5967if(ar.name==NULL)
5968ar.name="?";
5969return luaL_error(L,"bad argument #%d to "LUA_QL("%s")" (%s)",
5970narg,ar.name,extramsg);
5971}
5972static int luaL_typerror(lua_State*L,int narg,const char*tname){
5973const char*msg=lua_pushfstring(L,"%s expected, got %s",
5974tname,luaL_typename(L,narg));
5975return luaL_argerror(L,narg,msg);
5976}
5977static void tag_error(lua_State*L,int narg,int tag){
5978luaL_typerror(L,narg,lua_typename(L,tag));
5979}
5980static void luaL_where(lua_State*L,int level){
5981lua_Debug ar;
5982if(lua_getstack(L,level,&ar)){
5983lua_getinfo(L,"Sl",&ar);
5984if(ar.currentline>0){
5985lua_pushfstring(L,"%s:%d: ",ar.short_src,ar.currentline);
5986return;
5987}
5988}
5989lua_pushliteral(L,"");
5990}
5991static int luaL_error(lua_State*L,const char*fmt,...){
5992va_list argp;
5993va_start(argp,fmt);
5994luaL_where(L,1);
5995lua_pushvfstring(L,fmt,argp);
5996va_end(argp);
5997lua_concat(L,2);
5998return lua_error(L);
5999}
6000static int luaL_newmetatable(lua_State*L,const char*tname){
6001lua_getfield(L,(-10000),tname);
6002if(!lua_isnil(L,-1))
6003return 0;
6004lua_pop(L,1);
6005lua_newtable(L);
6006lua_pushvalue(L,-1);
6007lua_setfield(L,(-10000),tname);
6008return 1;
6009}
6010static void*luaL_checkudata(lua_State*L,int ud,const char*tname){
6011void*p=lua_touserdata(L,ud);
6012if(p!=NULL){
6013if(lua_getmetatable(L,ud)){
6014lua_getfield(L,(-10000),tname);
6015if(lua_rawequal(L,-1,-2)){
6016lua_pop(L,2);
6017return p;
6018}
6019}
6020}
6021luaL_typerror(L,ud,tname);
6022return NULL;
6023}
6024static void luaL_checkstack(lua_State*L,int space,const char*mes){
6025if(!lua_checkstack(L,space))
6026luaL_error(L,"stack overflow (%s)",mes);
6027}
6028static void luaL_checktype(lua_State*L,int narg,int t){
6029if(lua_type(L,narg)!=t)
6030tag_error(L,narg,t);
6031}
6032static void luaL_checkany(lua_State*L,int narg){
6033if(lua_type(L,narg)==(-1))
6034luaL_argerror(L,narg,"value expected");
6035}
6036static const char*luaL_checklstring(lua_State*L,int narg,size_t*len){
6037const char*s=lua_tolstring(L,narg,len);
6038if(!s)tag_error(L,narg,4);
6039return s;
6040}
6041static const char*luaL_optlstring(lua_State*L,int narg,
6042const char*def,size_t*len){
6043if(lua_isnoneornil(L,narg)){
6044if(len)
6045*len=(def?strlen(def):0);
6046return def;
6047}
6048else return luaL_checklstring(L,narg,len);
6049}
6050static lua_Number luaL_checknumber(lua_State*L,int narg){
6051lua_Number d=lua_tonumber(L,narg);
6052if(d==0&&!lua_isnumber(L,narg))
6053tag_error(L,narg,3);
6054return d;
6055}
6056static lua_Integer luaL_checkinteger(lua_State*L,int narg){
6057lua_Integer d=lua_tointeger(L,narg);
6058if(d==0&&!lua_isnumber(L,narg))
6059tag_error(L,narg,3);
6060return d;
6061}
6062static lua_Integer luaL_optinteger(lua_State*L,int narg,
6063lua_Integer def){
6064return luaL_opt(L,luaL_checkinteger,narg,def);
6065}
6066static int luaL_getmetafield(lua_State*L,int obj,const char*event){
6067if(!lua_getmetatable(L,obj))
6068return 0;
6069lua_pushstring(L,event);
6070lua_rawget(L,-2);
6071if(lua_isnil(L,-1)){
6072lua_pop(L,2);
6073return 0;
6074}
6075else{
6076lua_remove(L,-2);
6077return 1;
6078}
6079}
6080static void luaL_register(lua_State*L,const char*libname,
6081const luaL_Reg*l){
6082luaI_openlib(L,libname,l,0);
6083}
6084static int libsize(const luaL_Reg*l){
6085int size=0;
6086for(;l->name;l++)size++;
6087return size;
6088}
6089static void luaI_openlib(lua_State*L,const char*libname,
6090const luaL_Reg*l,int nup){
6091if(libname){
6092int size=libsize(l);
6093luaL_findtable(L,(-10000),"_LOADED",1);
6094lua_getfield(L,-1,libname);
6095if(!lua_istable(L,-1)){
6096lua_pop(L,1);
6097if(luaL_findtable(L,(-10002),libname,size)!=NULL)
6098luaL_error(L,"name conflict for module "LUA_QL("%s"),libname);
6099lua_pushvalue(L,-1);
6100lua_setfield(L,-3,libname);
6101}
6102lua_remove(L,-2);
6103lua_insert(L,-(nup+1));
6104}
6105for(;l->name;l++){
6106int i;
6107for(i=0;i<nup;i++)
6108lua_pushvalue(L,-nup);
6109lua_pushcclosure(L,l->func,nup);
6110lua_setfield(L,-(nup+2),l->name);
6111}
6112lua_pop(L,nup);
6113}
6114static const char*luaL_findtable(lua_State*L,int idx,
6115const char*fname,int szhint){
6116const char*e;
6117lua_pushvalue(L,idx);
6118do{
6119e=strchr(fname,'.');
6120if(e==NULL)e=fname+strlen(fname);
6121lua_pushlstring(L,fname,e-fname);
6122lua_rawget(L,-2);
6123if(lua_isnil(L,-1)){
6124lua_pop(L,1);
6125lua_createtable(L,0,(*e=='.'?1:szhint));
6126lua_pushlstring(L,fname,e-fname);
6127lua_pushvalue(L,-2);
6128lua_settable(L,-4);
6129}
6130else if(!lua_istable(L,-1)){
6131lua_pop(L,2);
6132return fname;
6133}
6134lua_remove(L,-2);
6135fname=e+1;
6136}while(*e=='.');
6137return NULL;
6138}
6139#define bufflen(B)((B)->p-(B)->buffer)
6140#define bufffree(B)((size_t)(BUFSIZ-bufflen(B)))
6141static int emptybuffer(luaL_Buffer*B){
6142size_t l=bufflen(B);
6143if(l==0)return 0;
6144else{
6145lua_pushlstring(B->L,B->buffer,l);
6146B->p=B->buffer;
6147B->lvl++;
6148return 1;
6149}
6150}
6151static void adjuststack(luaL_Buffer*B){
6152if(B->lvl>1){
6153lua_State*L=B->L;
6154int toget=1;
6155size_t toplen=lua_strlen(L,-1);
6156do{
6157size_t l=lua_strlen(L,-(toget+1));
6158if(B->lvl-toget+1>=(20/2)||toplen>l){
6159toplen+=l;
6160toget++;
6161}
6162else break;
6163}while(toget<B->lvl);
6164lua_concat(L,toget);
6165B->lvl=B->lvl-toget+1;
6166}
6167}
6168static char*luaL_prepbuffer(luaL_Buffer*B){
6169if(emptybuffer(B))
6170adjuststack(B);
6171return B->buffer;
6172}
6173static void luaL_addlstring(luaL_Buffer*B,const char*s,size_t l){
6174while(l--)
6175luaL_addchar(B,*s++);
6176}
6177static void luaL_pushresult(luaL_Buffer*B){
6178emptybuffer(B);
6179lua_concat(B->L,B->lvl);
6180B->lvl=1;
6181}
6182static void luaL_addvalue(luaL_Buffer*B){
6183lua_State*L=B->L;
6184size_t vl;
6185const char*s=lua_tolstring(L,-1,&vl);
6186if(vl<=bufffree(B)){
6187memcpy(B->p,s,vl);
6188B->p+=vl;
6189lua_pop(L,1);
6190}
6191else{
6192if(emptybuffer(B))
6193lua_insert(L,-2);
6194B->lvl++;
6195adjuststack(B);
6196}
6197}
6198static void luaL_buffinit(lua_State*L,luaL_Buffer*B){
6199B->L=L;
6200B->p=B->buffer;
6201B->lvl=0;
6202}
6203typedef struct LoadF{
6204int extraline;
6205FILE*f;
6206char buff[BUFSIZ];
6207}LoadF;
6208static const char*getF(lua_State*L,void*ud,size_t*size){
6209LoadF*lf=(LoadF*)ud;
6210(void)L;
6211if(lf->extraline){
6212lf->extraline=0;
6213*size=1;
6214return"\n";
6215}
6216if(feof(lf->f))return NULL;
6217*size=fread(lf->buff,1,sizeof(lf->buff),lf->f);
6218return(*size>0)?lf->buff:NULL;
6219}
6220static int errfile(lua_State*L,const char*what,int fnameindex){
6221const char*serr=strerror(errno);
6222const char*filename=lua_tostring(L,fnameindex)+1;
6223lua_pushfstring(L,"cannot %s %s: %s",what,filename,serr);
6224lua_remove(L,fnameindex);
6225return(5+1);
6226}
6227static int luaL_loadfile(lua_State*L,const char*filename){
6228LoadF lf;
6229int status,readstatus;
6230int c;
6231int fnameindex=lua_gettop(L)+1;
6232lf.extraline=0;
6233if(filename==NULL){
6234lua_pushliteral(L,"=stdin");
6235lf.f=stdin;
6236}
6237else{
6238lua_pushfstring(L,"@%s",filename);
6239lf.f=fopen(filename,"r");
6240if(lf.f==NULL)return errfile(L,"open",fnameindex);
6241}
6242c=getc(lf.f);
6243if(c=='#'){
6244lf.extraline=1;
6245while((c=getc(lf.f))!=EOF&&c!='\n');
6246if(c=='\n')c=getc(lf.f);
6247}
6248if(c=="\033Lua"[0]&&filename){
6249lf.f=freopen(filename,"rb",lf.f);
6250if(lf.f==NULL)return errfile(L,"reopen",fnameindex);
6251while((c=getc(lf.f))!=EOF&&c!="\033Lua"[0]);
6252lf.extraline=0;
6253}
6254ungetc(c,lf.f);
6255status=lua_load(L,getF,&lf,lua_tostring(L,-1));
6256readstatus=ferror(lf.f);
6257if(filename)fclose(lf.f);
6258if(readstatus){
6259lua_settop(L,fnameindex);
6260return errfile(L,"read",fnameindex);
6261}
6262lua_remove(L,fnameindex);
6263return status;
6264}
6265typedef struct LoadS{
6266const char*s;
6267size_t size;
6268}LoadS;
6269static const char*getS(lua_State*L,void*ud,size_t*size){
6270LoadS*ls=(LoadS*)ud;
6271(void)L;
6272if(ls->size==0)return NULL;
6273*size=ls->size;
6274ls->size=0;
6275return ls->s;
6276}
6277static int luaL_loadbuffer(lua_State*L,const char*buff,size_t size,
6278const char*name){
6279LoadS ls;
6280ls.s=buff;
6281ls.size=size;
6282return lua_load(L,getS,&ls,name);
6283}
6284static void*l_alloc(void*ud,void*ptr,size_t osize,size_t nsize){
6285(void)ud;
6286(void)osize;
6287if(nsize==0){
6288free(ptr);
6289return NULL;
6290}
6291else
6292return realloc(ptr,nsize);
6293}
6294static int panic(lua_State*L){
6295(void)L;
6296fprintf(stderr,"PANIC: unprotected error in call to Lua API (%s)\n",
6297lua_tostring(L,-1));
6298return 0;
6299}
6300static lua_State*luaL_newstate(void){
6301lua_State*L=lua_newstate(l_alloc,NULL);
6302if(L)lua_atpanic(L,&panic);
6303return L;
6304}
6305static int luaB_tonumber(lua_State*L){
6306int base=luaL_optint(L,2,10);
6307if(base==10){
6308luaL_checkany(L,1);
6309if(lua_isnumber(L,1)){
6310lua_pushnumber(L,lua_tonumber(L,1));
6311return 1;
6312}
6313}
6314else{
6315const char*s1=luaL_checkstring(L,1);
6316char*s2;
6317unsigned long n;
6318luaL_argcheck(L,2<=base&&base<=36,2,"base out of range");
6319n=strtoul(s1,&s2,base);
6320if(s1!=s2){
6321while(isspace((unsigned char)(*s2)))s2++;
6322if(*s2=='\0'){
6323lua_pushnumber(L,(lua_Number)n);
6324return 1;
6325}
6326}
6327}
6328lua_pushnil(L);
6329return 1;
6330}
6331static int luaB_error(lua_State*L){
6332int level=luaL_optint(L,2,1);
6333lua_settop(L,1);
6334if(lua_isstring(L,1)&&level>0){
6335luaL_where(L,level);
6336lua_pushvalue(L,1);
6337lua_concat(L,2);
6338}
6339return lua_error(L);
6340}
6341static int luaB_setmetatable(lua_State*L){
6342int t=lua_type(L,2);
6343luaL_checktype(L,1,5);
6344luaL_argcheck(L,t==0||t==5,2,
6345"nil or table expected");
6346if(luaL_getmetafield(L,1,"__metatable"))
6347luaL_error(L,"cannot change a protected metatable");
6348lua_settop(L,2);
6349lua_setmetatable(L,1);
6350return 1;
6351}
6352static void getfunc(lua_State*L,int opt){
6353if(lua_isfunction(L,1))lua_pushvalue(L,1);
6354else{
6355lua_Debug ar;
6356int level=opt?luaL_optint(L,1,1):luaL_checkint(L,1);
6357luaL_argcheck(L,level>=0,1,"level must be non-negative");
6358if(lua_getstack(L,level,&ar)==0)
6359luaL_argerror(L,1,"invalid level");
6360lua_getinfo(L,"f",&ar);
6361if(lua_isnil(L,-1))
6362luaL_error(L,"no function environment for tail call at level %d",
6363level);
6364}
6365}
6366static int luaB_setfenv(lua_State*L){
6367luaL_checktype(L,2,5);
6368getfunc(L,0);
6369lua_pushvalue(L,2);
6370if(lua_isnumber(L,1)&&lua_tonumber(L,1)==0){
6371lua_pushthread(L);
6372lua_insert(L,-2);
6373lua_setfenv(L,-2);
6374return 0;
6375}
6376else if(lua_iscfunction(L,-2)||lua_setfenv(L,-2)==0)
6377luaL_error(L,
6378LUA_QL("setfenv")" cannot change environment of given object");
6379return 1;
6380}
6381static int luaB_rawget(lua_State*L){
6382luaL_checktype(L,1,5);
6383luaL_checkany(L,2);
6384lua_settop(L,2);
6385lua_rawget(L,1);
6386return 1;
6387}
6388static int luaB_type(lua_State*L){
6389luaL_checkany(L,1);
6390lua_pushstring(L,luaL_typename(L,1));
6391return 1;
6392}
6393static int luaB_next(lua_State*L){
6394luaL_checktype(L,1,5);
6395lua_settop(L,2);
6396if(lua_next(L,1))
6397return 2;
6398else{
6399lua_pushnil(L);
6400return 1;
6401}
6402}
6403static int luaB_pairs(lua_State*L){
6404luaL_checktype(L,1,5);
6405lua_pushvalue(L,lua_upvalueindex(1));
6406lua_pushvalue(L,1);
6407lua_pushnil(L);
6408return 3;
6409}
6410static int ipairsaux(lua_State*L){
6411int i=luaL_checkint(L,2);
6412luaL_checktype(L,1,5);
6413i++;
6414lua_pushinteger(L,i);
6415lua_rawgeti(L,1,i);
6416return(lua_isnil(L,-1))?0:2;
6417}
6418static int luaB_ipairs(lua_State*L){
6419luaL_checktype(L,1,5);
6420lua_pushvalue(L,lua_upvalueindex(1));
6421lua_pushvalue(L,1);
6422lua_pushinteger(L,0);
6423return 3;
6424}
6425static int load_aux(lua_State*L,int status){
6426if(status==0)
6427return 1;
6428else{
6429lua_pushnil(L);
6430lua_insert(L,-2);
6431return 2;
6432}
6433}
6434static int luaB_loadstring(lua_State*L){
6435size_t l;
6436const char*s=luaL_checklstring(L,1,&l);
6437const char*chunkname=luaL_optstring(L,2,s);
6438return load_aux(L,luaL_loadbuffer(L,s,l,chunkname));
6439}
6440static int luaB_loadfile(lua_State*L){
6441const char*fname=luaL_optstring(L,1,NULL);
6442return load_aux(L,luaL_loadfile(L,fname));
6443}
6444static int luaB_assert(lua_State*L){
6445luaL_checkany(L,1);
6446if(!lua_toboolean(L,1))
6447return luaL_error(L,"%s",luaL_optstring(L,2,"assertion failed!"));
6448return lua_gettop(L);
6449}
6450static int luaB_unpack(lua_State*L){
6451int i,e,n;
6452luaL_checktype(L,1,5);
6453i=luaL_optint(L,2,1);
6454e=luaL_opt(L,luaL_checkint,3,luaL_getn(L,1));
6455if(i>e)return 0;
6456n=e-i+1;
6457if(n<=0||!lua_checkstack(L,n))
6458return luaL_error(L,"too many results to unpack");
6459lua_rawgeti(L,1,i);
6460while(i++<e)
6461lua_rawgeti(L,1,i);
6462return n;
6463}
6464static int luaB_pcall(lua_State*L){
6465int status;
6466luaL_checkany(L,1);
6467status=lua_pcall(L,lua_gettop(L)-1,(-1),0);
6468lua_pushboolean(L,(status==0));
6469lua_insert(L,1);
6470return lua_gettop(L);
6471}
6472static int luaB_newproxy(lua_State*L){
6473lua_settop(L,1);
6474lua_newuserdata(L,0);
6475if(lua_toboolean(L,1)==0)
6476return 1;
6477else if(lua_isboolean(L,1)){
6478lua_newtable(L);
6479lua_pushvalue(L,-1);
6480lua_pushboolean(L,1);
6481lua_rawset(L,lua_upvalueindex(1));
6482}
6483else{
6484int validproxy=0;
6485if(lua_getmetatable(L,1)){
6486lua_rawget(L,lua_upvalueindex(1));
6487validproxy=lua_toboolean(L,-1);
6488lua_pop(L,1);
6489}
6490luaL_argcheck(L,validproxy,1,"boolean or proxy expected");
6491lua_getmetatable(L,1);
6492}
6493lua_setmetatable(L,2);
6494return 1;
6495}
6496static const luaL_Reg base_funcs[]={
6497{"assert",luaB_assert},
6498{"error",luaB_error},
6499{"loadfile",luaB_loadfile},
6500{"loadstring",luaB_loadstring},
6501{"next",luaB_next},
6502{"pcall",luaB_pcall},
6503{"rawget",luaB_rawget},
6504{"setfenv",luaB_setfenv},
6505{"setmetatable",luaB_setmetatable},
6506{"tonumber",luaB_tonumber},
6507{"type",luaB_type},
6508{"unpack",luaB_unpack},
6509{NULL,NULL}
6510};
6511static const char*const statnames[]=
6512{"running","suspended","normal","dead"};
6513static int costatus(lua_State*L,lua_State*co){
6514if(L==co)return 0;
6515switch(lua_status(co)){
6516case 1:
6517return 1;
6518case 0:{
6519lua_Debug ar;
6520if(lua_getstack(co,0,&ar)>0)
6521return 2;
6522else if(lua_gettop(co)==0)
6523return 3;
6524else
6525return 1;
6526}
6527default:
6528return 3;
6529}
6530}
6531static int luaB_costatus(lua_State*L){
6532lua_State*co=lua_tothread(L,1);
6533luaL_argcheck(L,co,1,"coroutine expected");
6534lua_pushstring(L,statnames[costatus(L,co)]);
6535return 1;
6536}
6537static int auxresume(lua_State*L,lua_State*co,int narg){
6538int status=costatus(L,co);
6539if(!lua_checkstack(co,narg))
6540luaL_error(L,"too many arguments to resume");
6541if(status!=1){
6542lua_pushfstring(L,"cannot resume %s coroutine",statnames[status]);
6543return-1;
6544}
6545lua_xmove(L,co,narg);
6546lua_setlevel(L,co);
6547status=lua_resume(co,narg);
6548if(status==0||status==1){
6549int nres=lua_gettop(co);
6550if(!lua_checkstack(L,nres+1))
6551luaL_error(L,"too many results to resume");
6552lua_xmove(co,L,nres);
6553return nres;
6554}
6555else{
6556lua_xmove(co,L,1);
6557return-1;
6558}
6559}
6560static int luaB_coresume(lua_State*L){
6561lua_State*co=lua_tothread(L,1);
6562int r;
6563luaL_argcheck(L,co,1,"coroutine expected");
6564r=auxresume(L,co,lua_gettop(L)-1);
6565if(r<0){
6566lua_pushboolean(L,0);
6567lua_insert(L,-2);
6568return 2;
6569}
6570else{
6571lua_pushboolean(L,1);
6572lua_insert(L,-(r+1));
6573return r+1;
6574}
6575}
6576static int luaB_auxwrap(lua_State*L){
6577lua_State*co=lua_tothread(L,lua_upvalueindex(1));
6578int r=auxresume(L,co,lua_gettop(L));
6579if(r<0){
6580if(lua_isstring(L,-1)){
6581luaL_where(L,1);
6582lua_insert(L,-2);
6583lua_concat(L,2);
6584}
6585lua_error(L);
6586}
6587return r;
6588}
6589static int luaB_cocreate(lua_State*L){
6590lua_State*NL=lua_newthread(L);
6591luaL_argcheck(L,lua_isfunction(L,1)&&!lua_iscfunction(L,1),1,
6592"Lua function expected");
6593lua_pushvalue(L,1);
6594lua_xmove(L,NL,1);
6595return 1;
6596}
6597static int luaB_cowrap(lua_State*L){
6598luaB_cocreate(L);
6599lua_pushcclosure(L,luaB_auxwrap,1);
6600return 1;
6601}
6602static int luaB_yield(lua_State*L){
6603return lua_yield(L,lua_gettop(L));
6604}
6605static int luaB_corunning(lua_State*L){
6606if(lua_pushthread(L))
6607lua_pushnil(L);
6608return 1;
6609}
6610static const luaL_Reg co_funcs[]={
6611{"create",luaB_cocreate},
6612{"resume",luaB_coresume},
6613{"running",luaB_corunning},
6614{"status",luaB_costatus},
6615{"wrap",luaB_cowrap},
6616{"yield",luaB_yield},
6617{NULL,NULL}
6618};
6619static void auxopen(lua_State*L,const char*name,
6620lua_CFunction f,lua_CFunction u){
6621lua_pushcfunction(L,u);
6622lua_pushcclosure(L,f,1);
6623lua_setfield(L,-2,name);
6624}
6625static void base_open(lua_State*L){
6626lua_pushvalue(L,(-10002));
6627lua_setglobal(L,"_G");
6628luaL_register(L,"_G",base_funcs);
6629lua_pushliteral(L,"Lua 5.1");
6630lua_setglobal(L,"_VERSION");
6631auxopen(L,"ipairs",luaB_ipairs,ipairsaux);
6632auxopen(L,"pairs",luaB_pairs,luaB_next);
6633lua_createtable(L,0,1);
6634lua_pushvalue(L,-1);
6635lua_setmetatable(L,-2);
6636lua_pushliteral(L,"kv");
6637lua_setfield(L,-2,"__mode");
6638lua_pushcclosure(L,luaB_newproxy,1);
6639lua_setglobal(L,"newproxy");
6640}
6641static int luaopen_base(lua_State*L){
6642base_open(L);
6643luaL_register(L,"coroutine",co_funcs);
6644return 2;
6645}
6646#define aux_getn(L,n)(luaL_checktype(L,n,5),luaL_getn(L,n))
6647static int tinsert(lua_State*L){
6648int e=aux_getn(L,1)+1;
6649int pos;
6650switch(lua_gettop(L)){
6651case 2:{
6652pos=e;
6653break;
6654}
6655case 3:{
6656int i;
6657pos=luaL_checkint(L,2);
6658if(pos>e)e=pos;
6659for(i=e;i>pos;i--){
6660lua_rawgeti(L,1,i-1);
6661lua_rawseti(L,1,i);
6662}
6663break;
6664}
6665default:{
6666return luaL_error(L,"wrong number of arguments to "LUA_QL("insert"));
6667}
6668}
6669luaL_setn(L,1,e);
6670lua_rawseti(L,1,pos);
6671return 0;
6672}
6673static int tremove(lua_State*L){
6674int e=aux_getn(L,1);
6675int pos=luaL_optint(L,2,e);
6676if(!(1<=pos&&pos<=e))
6677return 0;
6678luaL_setn(L,1,e-1);
6679lua_rawgeti(L,1,pos);
6680for(;pos<e;pos++){
6681lua_rawgeti(L,1,pos+1);
6682lua_rawseti(L,1,pos);
6683}
6684lua_pushnil(L);
6685lua_rawseti(L,1,e);
6686return 1;
6687}
6688static void addfield(lua_State*L,luaL_Buffer*b,int i){
6689lua_rawgeti(L,1,i);
6690if(!lua_isstring(L,-1))
6691luaL_error(L,"invalid value (%s) at index %d in table for "
6692LUA_QL("concat"),luaL_typename(L,-1),i);
6693luaL_addvalue(b);
6694}
6695static int tconcat(lua_State*L){
6696luaL_Buffer b;
6697size_t lsep;
6698int i,last;
6699const char*sep=luaL_optlstring(L,2,"",&lsep);
6700luaL_checktype(L,1,5);
6701i=luaL_optint(L,3,1);
6702last=luaL_opt(L,luaL_checkint,4,luaL_getn(L,1));
6703luaL_buffinit(L,&b);
6704for(;i<last;i++){
6705addfield(L,&b,i);
6706luaL_addlstring(&b,sep,lsep);
6707}
6708if(i==last)
6709addfield(L,&b,i);
6710luaL_pushresult(&b);
6711return 1;
6712}
6713static void set2(lua_State*L,int i,int j){
6714lua_rawseti(L,1,i);
6715lua_rawseti(L,1,j);
6716}
6717static int sort_comp(lua_State*L,int a,int b){
6718if(!lua_isnil(L,2)){
6719int res;
6720lua_pushvalue(L,2);
6721lua_pushvalue(L,a-1);
6722lua_pushvalue(L,b-2);
6723lua_call(L,2,1);
6724res=lua_toboolean(L,-1);
6725lua_pop(L,1);
6726return res;
6727}
6728else
6729return lua_lessthan(L,a,b);
6730}
6731static void auxsort(lua_State*L,int l,int u){
6732while(l<u){
6733int i,j;
6734lua_rawgeti(L,1,l);
6735lua_rawgeti(L,1,u);
6736if(sort_comp(L,-1,-2))
6737set2(L,l,u);
6738else
6739lua_pop(L,2);
6740if(u-l==1)break;
6741i=(l+u)/2;
6742lua_rawgeti(L,1,i);
6743lua_rawgeti(L,1,l);
6744if(sort_comp(L,-2,-1))
6745set2(L,i,l);
6746else{
6747lua_pop(L,1);
6748lua_rawgeti(L,1,u);
6749if(sort_comp(L,-1,-2))
6750set2(L,i,u);
6751else
6752lua_pop(L,2);
6753}
6754if(u-l==2)break;
6755lua_rawgeti(L,1,i);
6756lua_pushvalue(L,-1);
6757lua_rawgeti(L,1,u-1);
6758set2(L,i,u-1);
6759i=l;j=u-1;
6760for(;;){
6761while(lua_rawgeti(L,1,++i),sort_comp(L,-1,-2)){
6762if(i>u)luaL_error(L,"invalid order function for sorting");
6763lua_pop(L,1);
6764}
6765while(lua_rawgeti(L,1,--j),sort_comp(L,-3,-1)){
6766if(j<l)luaL_error(L,"invalid order function for sorting");
6767lua_pop(L,1);
6768}
6769if(j<i){
6770lua_pop(L,3);
6771break;
6772}
6773set2(L,i,j);
6774}
6775lua_rawgeti(L,1,u-1);
6776lua_rawgeti(L,1,i);
6777set2(L,u-1,i);
6778if(i-l<u-i){
6779j=l;i=i-1;l=i+2;
6780}
6781else{
6782j=i+1;i=u;u=j-2;
6783}
6784auxsort(L,j,i);
6785}
6786}
6787static int sort(lua_State*L){
6788int n=aux_getn(L,1);
6789luaL_checkstack(L,40,"");
6790if(!lua_isnoneornil(L,2))
6791luaL_checktype(L,2,6);
6792lua_settop(L,2);
6793auxsort(L,1,n);
6794return 0;
6795}
6796static const luaL_Reg tab_funcs[]={
6797{"concat",tconcat},
6798{"insert",tinsert},
6799{"remove",tremove},
6800{"sort",sort},
6801{NULL,NULL}
6802};
6803static int luaopen_table(lua_State*L){
6804luaL_register(L,"table",tab_funcs);
6805return 1;
6806}
6807static const char*const fnames[]={"input","output"};
6808static int pushresult(lua_State*L,int i,const char*filename){
6809int en=errno;
6810if(i){
6811lua_pushboolean(L,1);
6812return 1;
6813}
6814else{
6815lua_pushnil(L);
6816if(filename)
6817lua_pushfstring(L,"%s: %s",filename,strerror(en));
6818else
6819lua_pushfstring(L,"%s",strerror(en));
6820lua_pushinteger(L,en);
6821return 3;
6822}
6823}
6824static void fileerror(lua_State*L,int arg,const char*filename){
6825lua_pushfstring(L,"%s: %s",filename,strerror(errno));
6826luaL_argerror(L,arg,lua_tostring(L,-1));
6827}
6828#define tofilep(L)((FILE**)luaL_checkudata(L,1,"FILE*"))
6829static int io_type(lua_State*L){
6830void*ud;
6831luaL_checkany(L,1);
6832ud=lua_touserdata(L,1);
6833lua_getfield(L,(-10000),"FILE*");
6834if(ud==NULL||!lua_getmetatable(L,1)||!lua_rawequal(L,-2,-1))
6835lua_pushnil(L);
6836else if(*((FILE**)ud)==NULL)
6837lua_pushliteral(L,"closed file");
6838else
6839lua_pushliteral(L,"file");
6840return 1;
6841}
6842static FILE*tofile(lua_State*L){
6843FILE**f=tofilep(L);
6844if(*f==NULL)
6845luaL_error(L,"attempt to use a closed file");
6846return*f;
6847}
6848static FILE**newfile(lua_State*L){
6849FILE**pf=(FILE**)lua_newuserdata(L,sizeof(FILE*));
6850*pf=NULL;
6851luaL_getmetatable(L,"FILE*");
6852lua_setmetatable(L,-2);
6853return pf;
6854}
6855static int io_noclose(lua_State*L){
6856lua_pushnil(L);
6857lua_pushliteral(L,"cannot close standard file");
6858return 2;
6859}
6860static int io_pclose(lua_State*L){
6861FILE**p=tofilep(L);
6862int ok=lua_pclose(L,*p);
6863*p=NULL;
6864return pushresult(L,ok,NULL);
6865}
6866static int io_fclose(lua_State*L){
6867FILE**p=tofilep(L);
6868int ok=(fclose(*p)==0);
6869*p=NULL;
6870return pushresult(L,ok,NULL);
6871}
6872static int aux_close(lua_State*L){
6873lua_getfenv(L,1);
6874lua_getfield(L,-1,"__close");
6875return(lua_tocfunction(L,-1))(L);
6876}
6877static int io_close(lua_State*L){
6878if(lua_isnone(L,1))
6879lua_rawgeti(L,(-10001),2);
6880tofile(L);
6881return aux_close(L);
6882}
6883static int io_gc(lua_State*L){
6884FILE*f=*tofilep(L);
6885if(f!=NULL)
6886aux_close(L);
6887return 0;
6888}
6889static int io_open(lua_State*L){
6890const char*filename=luaL_checkstring(L,1);
6891const char*mode=luaL_optstring(L,2,"r");
6892FILE**pf=newfile(L);
6893*pf=fopen(filename,mode);
6894return(*pf==NULL)?pushresult(L,0,filename):1;
6895}
6896static FILE*getiofile(lua_State*L,int findex){
6897FILE*f;
6898lua_rawgeti(L,(-10001),findex);
6899f=*(FILE**)lua_touserdata(L,-1);
6900if(f==NULL)
6901luaL_error(L,"standard %s file is closed",fnames[findex-1]);
6902return f;
6903}
6904static int g_iofile(lua_State*L,int f,const char*mode){
6905if(!lua_isnoneornil(L,1)){
6906const char*filename=lua_tostring(L,1);
6907if(filename){
6908FILE**pf=newfile(L);
6909*pf=fopen(filename,mode);
6910if(*pf==NULL)
6911fileerror(L,1,filename);
6912}
6913else{
6914tofile(L);
6915lua_pushvalue(L,1);
6916}
6917lua_rawseti(L,(-10001),f);
6918}
6919lua_rawgeti(L,(-10001),f);
6920return 1;
6921}
6922static int io_input(lua_State*L){
6923return g_iofile(L,1,"r");
6924}
6925static int io_output(lua_State*L){
6926return g_iofile(L,2,"w");
6927}
6928static int io_readline(lua_State*L);
6929static void aux_lines(lua_State*L,int idx,int toclose){
6930lua_pushvalue(L,idx);
6931lua_pushboolean(L,toclose);
6932lua_pushcclosure(L,io_readline,2);
6933}
6934static int f_lines(lua_State*L){
6935tofile(L);
6936aux_lines(L,1,0);
6937return 1;
6938}
6939static int io_lines(lua_State*L){
6940if(lua_isnoneornil(L,1)){
6941lua_rawgeti(L,(-10001),1);
6942return f_lines(L);
6943}
6944else{
6945const char*filename=luaL_checkstring(L,1);
6946FILE**pf=newfile(L);
6947*pf=fopen(filename,"r");
6948if(*pf==NULL)
6949fileerror(L,1,filename);
6950aux_lines(L,lua_gettop(L),1);
6951return 1;
6952}
6953}
6954static int read_number(lua_State*L,FILE*f){
6955lua_Number d;
6956if(fscanf(f,"%lf",&d)==1){
6957lua_pushnumber(L,d);
6958return 1;
6959}
6960else{
6961lua_pushnil(L);
6962return 0;
6963}
6964}
6965static int test_eof(lua_State*L,FILE*f){
6966int c=getc(f);
6967ungetc(c,f);
6968lua_pushlstring(L,NULL,0);
6969return(c!=EOF);
6970}
6971static int read_line(lua_State*L,FILE*f){
6972luaL_Buffer b;
6973luaL_buffinit(L,&b);
6974for(;;){
6975size_t l;
6976char*p=luaL_prepbuffer(&b);
6977if(fgets(p,BUFSIZ,f)==NULL){
6978luaL_pushresult(&b);
6979return(lua_objlen(L,-1)>0);
6980}
6981l=strlen(p);
6982if(l==0||p[l-1]!='\n')
6983luaL_addsize(&b,l);
6984else{
6985luaL_addsize(&b,l-1);
6986luaL_pushresult(&b);
6987return 1;
6988}
6989}
6990}
6991static int read_chars(lua_State*L,FILE*f,size_t n){
6992size_t rlen;
6993size_t nr;
6994luaL_Buffer b;
6995luaL_buffinit(L,&b);
6996rlen=BUFSIZ;
6997do{
6998char*p=luaL_prepbuffer(&b);
6999if(rlen>n)rlen=n;
7000nr=fread(p,sizeof(char),rlen,f);
7001luaL_addsize(&b,nr);
7002n-=nr;
7003}while(n>0&&nr==rlen);
7004luaL_pushresult(&b);
7005return(n==0||lua_objlen(L,-1)>0);
7006}
7007static int g_read(lua_State*L,FILE*f,int first){
7008int nargs=lua_gettop(L)-1;
7009int success;
7010int n;
7011clearerr(f);
7012if(nargs==0){
7013success=read_line(L,f);
7014n=first+1;
7015}
7016else{
7017luaL_checkstack(L,nargs+20,"too many arguments");
7018success=1;
7019for(n=first;nargs--&&success;n++){
7020if(lua_type(L,n)==3){
7021size_t l=(size_t)lua_tointeger(L,n);
7022success=(l==0)?test_eof(L,f):read_chars(L,f,l);
7023}
7024else{
7025const char*p=lua_tostring(L,n);
7026luaL_argcheck(L,p&&p[0]=='*',n,"invalid option");
7027switch(p[1]){
7028case'n':
7029success=read_number(L,f);
7030break;
7031case'l':
7032success=read_line(L,f);
7033break;
7034case'a':
7035read_chars(L,f,~((size_t)0));
7036success=1;
7037break;
7038default:
7039return luaL_argerror(L,n,"invalid format");
7040}
7041}
7042}
7043}
7044if(ferror(f))
7045return pushresult(L,0,NULL);
7046if(!success){
7047lua_pop(L,1);
7048lua_pushnil(L);
7049}
7050return n-first;
7051}
7052static int io_read(lua_State*L){
7053return g_read(L,getiofile(L,1),1);
7054}
7055static int f_read(lua_State*L){
7056return g_read(L,tofile(L),2);
7057}
7058static int io_readline(lua_State*L){
7059FILE*f=*(FILE**)lua_touserdata(L,lua_upvalueindex(1));
7060int sucess;
7061if(f==NULL)
7062luaL_error(L,"file is already closed");
7063sucess=read_line(L,f);
7064if(ferror(f))
7065return luaL_error(L,"%s",strerror(errno));
7066if(sucess)return 1;
7067else{
7068if(lua_toboolean(L,lua_upvalueindex(2))){
7069lua_settop(L,0);
7070lua_pushvalue(L,lua_upvalueindex(1));
7071aux_close(L);
7072}
7073return 0;
7074}
7075}
7076static int g_write(lua_State*L,FILE*f,int arg){
7077int nargs=lua_gettop(L)-1;
7078int status=1;
7079for(;nargs--;arg++){
7080if(lua_type(L,arg)==3){
7081status=status&&
7082fprintf(f,"%.14g",lua_tonumber(L,arg))>0;
7083}
7084else{
7085size_t l;
7086const char*s=luaL_checklstring(L,arg,&l);
7087status=status&&(fwrite(s,sizeof(char),l,f)==l);
7088}
7089}
7090return pushresult(L,status,NULL);
7091}
7092static int io_write(lua_State*L){
7093return g_write(L,getiofile(L,2),1);
7094}
7095static int f_write(lua_State*L){
7096return g_write(L,tofile(L),2);
7097}
7098static int io_flush(lua_State*L){
7099return pushresult(L,fflush(getiofile(L,2))==0,NULL);
7100}
7101static int f_flush(lua_State*L){
7102return pushresult(L,fflush(tofile(L))==0,NULL);
7103}
7104static const luaL_Reg iolib[]={
7105{"close",io_close},
7106{"flush",io_flush},
7107{"input",io_input},
7108{"lines",io_lines},
7109{"open",io_open},
7110{"output",io_output},
7111{"read",io_read},
7112{"type",io_type},
7113{"write",io_write},
7114{NULL,NULL}
7115};
7116static const luaL_Reg flib[]={
7117{"close",io_close},
7118{"flush",f_flush},
7119{"lines",f_lines},
7120{"read",f_read},
7121{"write",f_write},
7122{"__gc",io_gc},
7123{NULL,NULL}
7124};
7125static void createmeta(lua_State*L){
7126luaL_newmetatable(L,"FILE*");
7127lua_pushvalue(L,-1);
7128lua_setfield(L,-2,"__index");
7129luaL_register(L,NULL,flib);
7130}
7131static void createstdfile(lua_State*L,FILE*f,int k,const char*fname){
7132*newfile(L)=f;
7133if(k>0){
7134lua_pushvalue(L,-1);
7135lua_rawseti(L,(-10001),k);
7136}
7137lua_pushvalue(L,-2);
7138lua_setfenv(L,-2);
7139lua_setfield(L,-3,fname);
7140}
7141static void newfenv(lua_State*L,lua_CFunction cls){
7142lua_createtable(L,0,1);
7143lua_pushcfunction(L,cls);
7144lua_setfield(L,-2,"__close");
7145}
7146static int luaopen_io(lua_State*L){
7147createmeta(L);
7148newfenv(L,io_fclose);
7149lua_replace(L,(-10001));
7150luaL_register(L,"io",iolib);
7151newfenv(L,io_noclose);
7152createstdfile(L,stdin,1,"stdin");
7153createstdfile(L,stdout,2,"stdout");
7154createstdfile(L,stderr,0,"stderr");
7155lua_pop(L,1);
7156lua_getfield(L,-1,"popen");
7157newfenv(L,io_pclose);
7158lua_setfenv(L,-2);
7159lua_pop(L,1);
7160return 1;
7161}
7162static int os_pushresult(lua_State*L,int i,const char*filename){
7163int en=errno;
7164if(i){
7165lua_pushboolean(L,1);
7166return 1;
7167}
7168else{
7169lua_pushnil(L);
7170lua_pushfstring(L,"%s: %s",filename,strerror(en));
7171lua_pushinteger(L,en);
7172return 3;
7173}
7174}
7175static int os_remove(lua_State*L){
7176const char*filename=luaL_checkstring(L,1);
7177return os_pushresult(L,remove(filename)==0,filename);
7178}
7179static int os_exit(lua_State*L){
7180exit(luaL_optint(L,1,EXIT_SUCCESS));
7181}
7182static const luaL_Reg syslib[]={
7183{"exit",os_exit},
7184{"remove",os_remove},
7185{NULL,NULL}
7186};
7187static int luaopen_os(lua_State*L){
7188luaL_register(L,"os",syslib);
7189return 1;
7190}
7191#define uchar(c)((unsigned char)(c))
7192static ptrdiff_t posrelat(ptrdiff_t pos,size_t len){
7193if(pos<0)pos+=(ptrdiff_t)len+1;
7194return(pos>=0)?pos:0;
7195}
7196static int str_sub(lua_State*L){
7197size_t l;
7198const char*s=luaL_checklstring(L,1,&l);
7199ptrdiff_t start=posrelat(luaL_checkinteger(L,2),l);
7200ptrdiff_t end=posrelat(luaL_optinteger(L,3,-1),l);
7201if(start<1)start=1;
7202if(end>(ptrdiff_t)l)end=(ptrdiff_t)l;
7203if(start<=end)
7204lua_pushlstring(L,s+start-1,end-start+1);
7205else lua_pushliteral(L,"");
7206return 1;
7207}
7208static int str_lower(lua_State*L){
7209size_t l;
7210size_t i;
7211luaL_Buffer b;
7212const char*s=luaL_checklstring(L,1,&l);
7213luaL_buffinit(L,&b);
7214for(i=0;i<l;i++)
7215luaL_addchar(&b,tolower(uchar(s[i])));
7216luaL_pushresult(&b);
7217return 1;
7218}
7219static int str_upper(lua_State*L){
7220size_t l;
7221size_t i;
7222luaL_Buffer b;
7223const char*s=luaL_checklstring(L,1,&l);
7224luaL_buffinit(L,&b);
7225for(i=0;i<l;i++)
7226luaL_addchar(&b,toupper(uchar(s[i])));
7227luaL_pushresult(&b);
7228return 1;
7229}
7230static int str_rep(lua_State*L){
7231size_t l;
7232luaL_Buffer b;
7233const char*s=luaL_checklstring(L,1,&l);
7234int n=luaL_checkint(L,2);
7235luaL_buffinit(L,&b);
7236while(n-->0)
7237luaL_addlstring(&b,s,l);
7238luaL_pushresult(&b);
7239return 1;
7240}
7241static int str_byte(lua_State*L){
7242size_t l;
7243const char*s=luaL_checklstring(L,1,&l);
7244ptrdiff_t posi=posrelat(luaL_optinteger(L,2,1),l);
7245ptrdiff_t pose=posrelat(luaL_optinteger(L,3,posi),l);
7246int n,i;
7247if(posi<=0)posi=1;
7248if((size_t)pose>l)pose=l;
7249if(posi>pose)return 0;
7250n=(int)(pose-posi+1);
7251if(posi+n<=pose)
7252luaL_error(L,"string slice too long");
7253luaL_checkstack(L,n,"string slice too long");
7254for(i=0;i<n;i++)
7255lua_pushinteger(L,uchar(s[posi+i-1]));
7256return n;
7257}
7258static int str_char(lua_State*L){
7259int n=lua_gettop(L);
7260int i;
7261luaL_Buffer b;
7262luaL_buffinit(L,&b);
7263for(i=1;i<=n;i++){
7264int c=luaL_checkint(L,i);
7265luaL_argcheck(L,uchar(c)==c,i,"invalid value");
7266luaL_addchar(&b,uchar(c));
7267}
7268luaL_pushresult(&b);
7269return 1;
7270}
7271typedef struct MatchState{
7272const char*src_init;
7273const char*src_end;
7274lua_State*L;
7275int level;
7276struct{
7277const char*init;
7278ptrdiff_t len;
7279}capture[32];
7280}MatchState;
7281static int check_capture(MatchState*ms,int l){
7282l-='1';
7283if(l<0||l>=ms->level||ms->capture[l].len==(-1))
7284return luaL_error(ms->L,"invalid capture index");
7285return l;
7286}
7287static int capture_to_close(MatchState*ms){
7288int level=ms->level;
7289for(level--;level>=0;level--)
7290if(ms->capture[level].len==(-1))return level;
7291return luaL_error(ms->L,"invalid pattern capture");
7292}
7293static const char*classend(MatchState*ms,const char*p){
7294switch(*p++){
7295case'%':{
7296if(*p=='\0')
7297luaL_error(ms->L,"malformed pattern (ends with "LUA_QL("%%")")");
7298return p+1;
7299}
7300case'[':{
7301if(*p=='^')p++;
7302do{
7303if(*p=='\0')
7304luaL_error(ms->L,"malformed pattern (missing "LUA_QL("]")")");
7305if(*(p++)=='%'&&*p!='\0')
7306p++;
7307}while(*p!=']');
7308return p+1;
7309}
7310default:{
7311return p;
7312}
7313}
7314}
7315static int match_class(int c,int cl){
7316int res;
7317switch(tolower(cl)){
7318case'a':res=isalpha(c);break;
7319case'c':res=iscntrl(c);break;
7320case'd':res=isdigit(c);break;
7321case'l':res=islower(c);break;
7322case'p':res=ispunct(c);break;
7323case's':res=isspace(c);break;
7324case'u':res=isupper(c);break;
7325case'w':res=isalnum(c);break;
7326case'x':res=isxdigit(c);break;
7327case'z':res=(c==0);break;
7328default:return(cl==c);
7329}
7330return(islower(cl)?res:!res);
7331}
7332static int matchbracketclass(int c,const char*p,const char*ec){
7333int sig=1;
7334if(*(p+1)=='^'){
7335sig=0;
7336p++;
7337}
7338while(++p<ec){
7339if(*p=='%'){
7340p++;
7341if(match_class(c,uchar(*p)))
7342return sig;
7343}
7344else if((*(p+1)=='-')&&(p+2<ec)){
7345p+=2;
7346if(uchar(*(p-2))<=c&&c<=uchar(*p))
7347return sig;
7348}
7349else if(uchar(*p)==c)return sig;
7350}
7351return!sig;
7352}
7353static int singlematch(int c,const char*p,const char*ep){
7354switch(*p){
7355case'.':return 1;
7356case'%':return match_class(c,uchar(*(p+1)));
7357case'[':return matchbracketclass(c,p,ep-1);
7358default:return(uchar(*p)==c);
7359}
7360}
7361static const char*match(MatchState*ms,const char*s,const char*p);
7362static const char*matchbalance(MatchState*ms,const char*s,
7363const char*p){
7364if(*p==0||*(p+1)==0)
7365luaL_error(ms->L,"unbalanced pattern");
7366if(*s!=*p)return NULL;
7367else{
7368int b=*p;
7369int e=*(p+1);
7370int cont=1;
7371while(++s<ms->src_end){
7372if(*s==e){
7373if(--cont==0)return s+1;
7374}
7375else if(*s==b)cont++;
7376}
7377}
7378return NULL;
7379}
7380static const char*max_expand(MatchState*ms,const char*s,
7381const char*p,const char*ep){
7382ptrdiff_t i=0;
7383while((s+i)<ms->src_end&&singlematch(uchar(*(s+i)),p,ep))
7384i++;
7385while(i>=0){
7386const char*res=match(ms,(s+i),ep+1);
7387if(res)return res;
7388i--;
7389}
7390return NULL;
7391}
7392static const char*min_expand(MatchState*ms,const char*s,
7393const char*p,const char*ep){
7394for(;;){
7395const char*res=match(ms,s,ep+1);
7396if(res!=NULL)
7397return res;
7398else if(s<ms->src_end&&singlematch(uchar(*s),p,ep))
7399s++;
7400else return NULL;
7401}
7402}
7403static const char*start_capture(MatchState*ms,const char*s,
7404const char*p,int what){
7405const char*res;
7406int level=ms->level;
7407if(level>=32)luaL_error(ms->L,"too many captures");
7408ms->capture[level].init=s;
7409ms->capture[level].len=what;
7410ms->level=level+1;
7411if((res=match(ms,s,p))==NULL)
7412ms->level--;
7413return res;
7414}
7415static const char*end_capture(MatchState*ms,const char*s,
7416const char*p){
7417int l=capture_to_close(ms);
7418const char*res;
7419ms->capture[l].len=s-ms->capture[l].init;
7420if((res=match(ms,s,p))==NULL)
7421ms->capture[l].len=(-1);
7422return res;
7423}
7424static const char*match_capture(MatchState*ms,const char*s,int l){
7425size_t len;
7426l=check_capture(ms,l);
7427len=ms->capture[l].len;
7428if((size_t)(ms->src_end-s)>=len&&
7429memcmp(ms->capture[l].init,s,len)==0)
7430return s+len;
7431else return NULL;
7432}
7433static const char*match(MatchState*ms,const char*s,const char*p){
7434init:
7435switch(*p){
7436case'(':{
7437if(*(p+1)==')')
7438return start_capture(ms,s,p+2,(-2));
7439else
7440return start_capture(ms,s,p+1,(-1));
7441}
7442case')':{
7443return end_capture(ms,s,p+1);
7444}
7445case'%':{
7446switch(*(p+1)){
7447case'b':{
7448s=matchbalance(ms,s,p+2);
7449if(s==NULL)return NULL;
7450p+=4;goto init;
7451}
7452case'f':{
7453const char*ep;char previous;
7454p+=2;
7455if(*p!='[')
7456luaL_error(ms->L,"missing "LUA_QL("[")" after "
7457LUA_QL("%%f")" in pattern");
7458ep=classend(ms,p);
7459previous=(s==ms->src_init)?'\0':*(s-1);
7460if(matchbracketclass(uchar(previous),p,ep-1)||
7461!matchbracketclass(uchar(*s),p,ep-1))return NULL;
7462p=ep;goto init;
7463}
7464default:{
7465if(isdigit(uchar(*(p+1)))){
7466s=match_capture(ms,s,uchar(*(p+1)));
7467if(s==NULL)return NULL;
7468p+=2;goto init;
7469}
7470goto dflt;
7471}
7472}
7473}
7474case'\0':{
7475return s;
7476}
7477case'$':{
7478if(*(p+1)=='\0')
7479return(s==ms->src_end)?s:NULL;
7480else goto dflt;
7481}
7482default:dflt:{
7483const char*ep=classend(ms,p);
7484int m=s<ms->src_end&&singlematch(uchar(*s),p,ep);
7485switch(*ep){
7486case'?':{
7487const char*res;
7488if(m&&((res=match(ms,s+1,ep+1))!=NULL))
7489return res;
7490p=ep+1;goto init;
7491}
7492case'*':{
7493return max_expand(ms,s,p,ep);
7494}
7495case'+':{
7496return(m?max_expand(ms,s+1,p,ep):NULL);
7497}
7498case'-':{
7499return min_expand(ms,s,p,ep);
7500}
7501default:{
7502if(!m)return NULL;
7503s++;p=ep;goto init;
7504}
7505}
7506}
7507}
7508}
7509static const char*lmemfind(const char*s1,size_t l1,
7510const char*s2,size_t l2){
7511if(l2==0)return s1;
7512else if(l2>l1)return NULL;
7513else{
7514const char*init;
7515l2--;
7516l1=l1-l2;
7517while(l1>0&&(init=(const char*)memchr(s1,*s2,l1))!=NULL){
7518init++;
7519if(memcmp(init,s2+1,l2)==0)
7520return init-1;
7521else{
7522l1-=init-s1;
7523s1=init;
7524}
7525}
7526return NULL;
7527}
7528}
7529static void push_onecapture(MatchState*ms,int i,const char*s,
7530const char*e){
7531if(i>=ms->level){
7532if(i==0)
7533lua_pushlstring(ms->L,s,e-s);
7534else
7535luaL_error(ms->L,"invalid capture index");
7536}
7537else{
7538ptrdiff_t l=ms->capture[i].len;
7539if(l==(-1))luaL_error(ms->L,"unfinished capture");
7540if(l==(-2))
7541lua_pushinteger(ms->L,ms->capture[i].init-ms->src_init+1);
7542else
7543lua_pushlstring(ms->L,ms->capture[i].init,l);
7544}
7545}
7546static int push_captures(MatchState*ms,const char*s,const char*e){
7547int i;
7548int nlevels=(ms->level==0&&s)?1:ms->level;
7549luaL_checkstack(ms->L,nlevels,"too many captures");
7550for(i=0;i<nlevels;i++)
7551push_onecapture(ms,i,s,e);
7552return nlevels;
7553}
7554static int str_find_aux(lua_State*L,int find){
7555size_t l1,l2;
7556const char*s=luaL_checklstring(L,1,&l1);
7557const char*p=luaL_checklstring(L,2,&l2);
7558ptrdiff_t init=posrelat(luaL_optinteger(L,3,1),l1)-1;
7559if(init<0)init=0;
7560else if((size_t)(init)>l1)init=(ptrdiff_t)l1;
7561if(find&&(lua_toboolean(L,4)||
7562strpbrk(p,"^$*+?.([%-")==NULL)){
7563const char*s2=lmemfind(s+init,l1-init,p,l2);
7564if(s2){
7565lua_pushinteger(L,s2-s+1);
7566lua_pushinteger(L,s2-s+l2);
7567return 2;
7568}
7569}
7570else{
7571MatchState ms;
7572int anchor=(*p=='^')?(p++,1):0;
7573const char*s1=s+init;
7574ms.L=L;
7575ms.src_init=s;
7576ms.src_end=s+l1;
7577do{
7578const char*res;
7579ms.level=0;
7580if((res=match(&ms,s1,p))!=NULL){
7581if(find){
7582lua_pushinteger(L,s1-s+1);
7583lua_pushinteger(L,res-s);
7584return push_captures(&ms,NULL,0)+2;
7585}
7586else
7587return push_captures(&ms,s1,res);
7588}
7589}while(s1++<ms.src_end&&!anchor);
7590}
7591lua_pushnil(L);
7592return 1;
7593}
7594static int str_find(lua_State*L){
7595return str_find_aux(L,1);
7596}
7597static int str_match(lua_State*L){
7598return str_find_aux(L,0);
7599}
7600static int gmatch_aux(lua_State*L){
7601MatchState ms;
7602size_t ls;
7603const char*s=lua_tolstring(L,lua_upvalueindex(1),&ls);
7604const char*p=lua_tostring(L,lua_upvalueindex(2));
7605const char*src;
7606ms.L=L;
7607ms.src_init=s;
7608ms.src_end=s+ls;
7609for(src=s+(size_t)lua_tointeger(L,lua_upvalueindex(3));
7610src<=ms.src_end;
7611src++){
7612const char*e;
7613ms.level=0;
7614if((e=match(&ms,src,p))!=NULL){
7615lua_Integer newstart=e-s;
7616if(e==src)newstart++;
7617lua_pushinteger(L,newstart);
7618lua_replace(L,lua_upvalueindex(3));
7619return push_captures(&ms,src,e);
7620}
7621}
7622return 0;
7623}
7624static int gmatch(lua_State*L){
7625luaL_checkstring(L,1);
7626luaL_checkstring(L,2);
7627lua_settop(L,2);
7628lua_pushinteger(L,0);
7629lua_pushcclosure(L,gmatch_aux,3);
7630return 1;
7631}
7632static void add_s(MatchState*ms,luaL_Buffer*b,const char*s,
7633const char*e){
7634size_t l,i;
7635const char*news=lua_tolstring(ms->L,3,&l);
7636for(i=0;i<l;i++){
7637if(news[i]!='%')
7638luaL_addchar(b,news[i]);
7639else{
7640i++;
7641if(!isdigit(uchar(news[i])))
7642luaL_addchar(b,news[i]);
7643else if(news[i]=='0')
7644luaL_addlstring(b,s,e-s);
7645else{
7646push_onecapture(ms,news[i]-'1',s,e);
7647luaL_addvalue(b);
7648}
7649}
7650}
7651}
7652static void add_value(MatchState*ms,luaL_Buffer*b,const char*s,
7653const char*e){
7654lua_State*L=ms->L;
7655switch(lua_type(L,3)){
7656case 3:
7657case 4:{
7658add_s(ms,b,s,e);
7659return;
7660}
7661case 6:{
7662int n;
7663lua_pushvalue(L,3);
7664n=push_captures(ms,s,e);
7665lua_call(L,n,1);
7666break;
7667}
7668case 5:{
7669push_onecapture(ms,0,s,e);
7670lua_gettable(L,3);
7671break;
7672}
7673}
7674if(!lua_toboolean(L,-1)){
7675lua_pop(L,1);
7676lua_pushlstring(L,s,e-s);
7677}
7678else if(!lua_isstring(L,-1))
7679luaL_error(L,"invalid replacement value (a %s)",luaL_typename(L,-1));
7680luaL_addvalue(b);
7681}
7682static int str_gsub(lua_State*L){
7683size_t srcl;
7684const char*src=luaL_checklstring(L,1,&srcl);
7685const char*p=luaL_checkstring(L,2);
7686int tr=lua_type(L,3);
7687int max_s=luaL_optint(L,4,srcl+1);
7688int anchor=(*p=='^')?(p++,1):0;
7689int n=0;
7690MatchState ms;
7691luaL_Buffer b;
7692luaL_argcheck(L,tr==3||tr==4||
7693tr==6||tr==5,3,
7694"string/function/table expected");
7695luaL_buffinit(L,&b);
7696ms.L=L;
7697ms.src_init=src;
7698ms.src_end=src+srcl;
7699while(n<max_s){
7700const char*e;
7701ms.level=0;
7702e=match(&ms,src,p);
7703if(e){
7704n++;
7705add_value(&ms,&b,src,e);
7706}
7707if(e&&e>src)
7708src=e;
7709else if(src<ms.src_end)
7710luaL_addchar(&b,*src++);
7711else break;
7712if(anchor)break;
7713}
7714luaL_addlstring(&b,src,ms.src_end-src);
7715luaL_pushresult(&b);
7716lua_pushinteger(L,n);
7717return 2;
7718}
7719static void addquoted(lua_State*L,luaL_Buffer*b,int arg){
7720size_t l;
7721const char*s=luaL_checklstring(L,arg,&l);
7722luaL_addchar(b,'"');
7723while(l--){
7724switch(*s){
7725case'"':case'\\':case'\n':{
7726luaL_addchar(b,'\\');
7727luaL_addchar(b,*s);
7728break;
7729}
7730case'\r':{
7731luaL_addlstring(b,"\\r",2);
7732break;
7733}
7734case'\0':{
7735luaL_addlstring(b,"\\000",4);
7736break;
7737}
7738default:{
7739luaL_addchar(b,*s);
7740break;
7741}
7742}
7743s++;
7744}
7745luaL_addchar(b,'"');
7746}
7747static const char*scanformat(lua_State*L,const char*strfrmt,char*form){
7748const char*p=strfrmt;
7749while(*p!='\0'&&strchr("-+ #0",*p)!=NULL)p++;
7750if((size_t)(p-strfrmt)>=sizeof("-+ #0"))
7751luaL_error(L,"invalid format (repeated flags)");
7752if(isdigit(uchar(*p)))p++;
7753if(isdigit(uchar(*p)))p++;
7754if(*p=='.'){
7755p++;
7756if(isdigit(uchar(*p)))p++;
7757if(isdigit(uchar(*p)))p++;
7758}
7759if(isdigit(uchar(*p)))
7760luaL_error(L,"invalid format (width or precision too long)");
7761*(form++)='%';
7762strncpy(form,strfrmt,p-strfrmt+1);
7763form+=p-strfrmt+1;
7764*form='\0';
7765return p;
7766}
7767static void addintlen(char*form){
7768size_t l=strlen(form);
7769char spec=form[l-1];
7770strcpy(form+l-1,"l");
7771form[l+sizeof("l")-2]=spec;
7772form[l+sizeof("l")-1]='\0';
7773}
7774static int str_format(lua_State*L){
7775int top=lua_gettop(L);
7776int arg=1;
7777size_t sfl;
7778const char*strfrmt=luaL_checklstring(L,arg,&sfl);
7779const char*strfrmt_end=strfrmt+sfl;
7780luaL_Buffer b;
7781luaL_buffinit(L,&b);
7782while(strfrmt<strfrmt_end){
7783if(*strfrmt!='%')
7784luaL_addchar(&b,*strfrmt++);
7785else if(*++strfrmt=='%')
7786luaL_addchar(&b,*strfrmt++);
7787else{
7788char form[(sizeof("-+ #0")+sizeof("l")+10)];
7789char buff[512];
7790if(++arg>top)
7791luaL_argerror(L,arg,"no value");
7792strfrmt=scanformat(L,strfrmt,form);
7793switch(*strfrmt++){
7794case'c':{
7795sprintf(buff,form,(int)luaL_checknumber(L,arg));
7796break;
7797}
7798case'd':case'i':{
7799addintlen(form);
7800sprintf(buff,form,(long)luaL_checknumber(L,arg));
7801break;
7802}
7803case'o':case'u':case'x':case'X':{
7804addintlen(form);
7805sprintf(buff,form,(unsigned long)luaL_checknumber(L,arg));
7806break;
7807}
7808case'e':case'E':case'f':
7809case'g':case'G':{
7810sprintf(buff,form,(double)luaL_checknumber(L,arg));
7811break;
7812}
7813case'q':{
7814addquoted(L,&b,arg);
7815continue;
7816}
7817case's':{
7818size_t l;
7819const char*s=luaL_checklstring(L,arg,&l);
7820if(!strchr(form,'.')&&l>=100){
7821lua_pushvalue(L,arg);
7822luaL_addvalue(&b);
7823continue;
7824}
7825else{
7826sprintf(buff,form,s);
7827break;
7828}
7829}
7830default:{
7831return luaL_error(L,"invalid option "LUA_QL("%%%c")" to "
7832LUA_QL("format"),*(strfrmt-1));
7833}
7834}
7835luaL_addlstring(&b,buff,strlen(buff));
7836}
7837}
7838luaL_pushresult(&b);
7839return 1;
7840}
7841static const luaL_Reg strlib[]={
7842{"byte",str_byte},
7843{"char",str_char},
7844{"find",str_find},
7845{"format",str_format},
7846{"gmatch",gmatch},
7847{"gsub",str_gsub},
7848{"lower",str_lower},
7849{"match",str_match},
7850{"rep",str_rep},
7851{"sub",str_sub},
7852{"upper",str_upper},
7853{NULL,NULL}
7854};
7855static void createmetatable(lua_State*L){
7856lua_createtable(L,0,1);
7857lua_pushliteral(L,"");
7858lua_pushvalue(L,-2);
7859lua_setmetatable(L,-2);
7860lua_pop(L,1);
7861lua_pushvalue(L,-2);
7862lua_setfield(L,-2,"__index");
7863lua_pop(L,1);
7864}
7865static int luaopen_string(lua_State*L){
7866luaL_register(L,"string",strlib);
7867createmetatable(L);
7868return 1;
7869}
7870static const luaL_Reg lualibs[]={
7871{"",luaopen_base},
7872{"table",luaopen_table},
7873{"io",luaopen_io},
7874{"os",luaopen_os},
7875{"string",luaopen_string},
7876{NULL,NULL}
7877};
7878static void luaL_openlibs(lua_State*L){
7879const luaL_Reg*lib=lualibs;
7880for(;lib->func;lib++){
7881lua_pushcfunction(L,lib->func);
7882lua_pushstring(L,lib->name);
7883lua_call(L,1,0);
7884}
7885}
7886int main(int argc,char**argv){
7887lua_State*L=luaL_newstate();
7888int i;
7889luaL_openlibs(L);
7890if(argc<2)return 1;
7891lua_createtable(L,0,1);
7892lua_pushstring(L,argv[1]);
7893lua_rawseti(L,-2,0);
7894lua_setglobal(L,"arg");
7895if(luaL_loadfile(L,argv[1]))
7896goto err;
7897for(i=2;i<argc;i++)
7898lua_pushstring(L,argv[i]);
7899if(lua_pcall(L,argc-2,0,0)){
7900err:
7901fprintf(stderr,"Error: %s\n",lua_tostring(L,-1));
7902return 1;
7903}
7904lua_close(L);
7905return 0;
7906}