From 8d475383b680c1e11b0870fa28268292c595f18a Mon Sep 17 00:00:00 2001 From: Dreagonmon <531486058@qq.com> Date: Tue, 21 Jul 2020 16:16:24 +0800 Subject: [PATCH 1/4] upgrade to lua 5.4.0 --- .gitignore | 3 +- .vscode/c_cpp_properties.json | 27 +- index.html | 61 + lua-5.3.4/src/lua | Bin 733152 -> 253598 bytes lua-5.3.4/src/luac | Bin 560412 -> 223516 bytes lua-5.4.0/Makefile | 106 + lua-5.4.0/README | 6 + lua-5.4.0/doc/contents.html | 674 ++ lua-5.4.0/doc/index.css | 21 + lua-5.4.0/doc/logo.gif | Bin 0 -> 9893 bytes lua-5.4.0/doc/lua.1 | 149 + lua-5.4.0/doc/lua.css | 161 + lua-5.4.0/doc/luac.1 | 118 + lua-5.4.0/doc/manual.css | 21 + lua-5.4.0/doc/manual.html | 11896 ++++++++++++++++++++++++ lua-5.4.0/doc/osi-certified-72x60.png | Bin 0 -> 3774 bytes lua-5.4.0/doc/readme.html | 340 + lua-5.4.0/src/Makefile | 220 + lua-5.4.0/src/lapi.c | 1411 +++ lua-5.4.0/src/lapi.h | 47 + lua-5.4.0/src/lauxlib.c | 1057 +++ lua-5.4.0/src/lauxlib.h | 276 + lua-5.4.0/src/lbaselib.c | 527 ++ lua-5.4.0/src/lcode.c | 1814 ++++ lua-5.4.0/src/lcode.h | 104 + lua-5.4.0/src/lcorolib.c | 206 + lua-5.4.0/src/lctype.c | 64 + lua-5.4.0/src/lctype.h | 95 + lua-5.4.0/src/ldblib.c | 477 + lua-5.4.0/src/ldebug.c | 841 ++ lua-5.4.0/src/ldebug.h | 47 + lua-5.4.0/src/ldo.c | 822 ++ lua-5.4.0/src/ldo.h | 75 + lua-5.4.0/src/ldump.c | 226 + lua-5.4.0/src/lfunc.c | 299 + lua-5.4.0/src/lfunc.h | 69 + lua-5.4.0/src/lgc.c | 1616 ++++ lua-5.4.0/src/lgc.h | 186 + lua-5.4.0/src/linit.c | 65 + lua-5.4.0/src/liolib.c | 814 ++ lua-5.4.0/src/ljumptab.h | 112 + lua-5.4.0/src/llex.c | 578 ++ lua-5.4.0/src/llex.h | 85 + lua-5.4.0/src/llimits.h | 349 + lua-5.4.0/src/lmathlib.c | 763 ++ lua-5.4.0/src/lmem.c | 202 + lua-5.4.0/src/lmem.h | 93 + lua-5.4.0/src/loadlib.c | 759 ++ lua-5.4.0/src/lobject.c | 583 ++ lua-5.4.0/src/lobject.h | 787 ++ lua-5.4.0/src/lopcodes.c | 104 + lua-5.4.0/src/lopcodes.h | 392 + lua-5.4.0/src/lopnames.h | 103 + lua-5.4.0/src/loslib.c | 430 + lua-5.4.0/src/lparser.c | 1996 ++++ lua-5.4.0/src/lparser.h | 170 + lua-5.4.0/src/lprefix.h | 45 + lua-5.4.0/src/lstate.c | 467 + lua-5.4.0/src/lstate.h | 364 + lua-5.4.0/src/lstring.c | 285 + lua-5.4.0/src/lstring.h | 58 + lua-5.4.0/src/lstrlib.c | 1805 ++++ lua-5.4.0/src/ltable.c | 924 ++ lua-5.4.0/src/ltable.h | 57 + lua-5.4.0/src/ltablib.c | 428 + lua-5.4.0/src/ltm.c | 270 + lua-5.4.0/src/ltm.h | 94 + lua-5.4.0/src/lua | 6030 ++++++++++++ lua-5.4.0/src/lua.c | 635 ++ lua-5.4.0/src/lua.h | 517 + lua-5.4.0/src/lua.hpp | 9 + lua-5.4.0/src/luac | 5315 +++++++++++ lua-5.4.0/src/luac.c | 724 ++ lua-5.4.0/src/luaconf.h | 776 ++ lua-5.4.0/src/lualib.h | 58 + lua-5.4.0/src/lundump.c | 323 + lua-5.4.0/src/lundump.h | 36 + lua-5.4.0/src/lutf8lib.c | 289 + lua-5.4.0/src/lvm.c | 1812 ++++ lua-5.4.0/src/lvm.h | 134 + lua-5.4.0/src/lzio.c | 68 + lua-5.4.0/src/lzio.h | 66 + main.html | 64 - main.js | 20 +- main.wasm | Bin 246887 -> 239035 bytes makefile | 4 +- 86 files changed, 54051 insertions(+), 73 deletions(-) create mode 100644 index.html create mode 100644 lua-5.4.0/Makefile create mode 100644 lua-5.4.0/README create mode 100644 lua-5.4.0/doc/contents.html create mode 100644 lua-5.4.0/doc/index.css create mode 100644 lua-5.4.0/doc/logo.gif create mode 100644 lua-5.4.0/doc/lua.1 create mode 100644 lua-5.4.0/doc/lua.css create mode 100644 lua-5.4.0/doc/luac.1 create mode 100644 lua-5.4.0/doc/manual.css create mode 100644 lua-5.4.0/doc/manual.html create mode 100644 lua-5.4.0/doc/osi-certified-72x60.png create mode 100644 lua-5.4.0/doc/readme.html create mode 100644 lua-5.4.0/src/Makefile create mode 100644 lua-5.4.0/src/lapi.c create mode 100644 lua-5.4.0/src/lapi.h create mode 100644 lua-5.4.0/src/lauxlib.c create mode 100644 lua-5.4.0/src/lauxlib.h create mode 100644 lua-5.4.0/src/lbaselib.c create mode 100644 lua-5.4.0/src/lcode.c create mode 100644 lua-5.4.0/src/lcode.h create mode 100644 lua-5.4.0/src/lcorolib.c create mode 100644 lua-5.4.0/src/lctype.c create mode 100644 lua-5.4.0/src/lctype.h create mode 100644 lua-5.4.0/src/ldblib.c create mode 100644 lua-5.4.0/src/ldebug.c create mode 100644 lua-5.4.0/src/ldebug.h create mode 100644 lua-5.4.0/src/ldo.c create mode 100644 lua-5.4.0/src/ldo.h create mode 100644 lua-5.4.0/src/ldump.c create mode 100644 lua-5.4.0/src/lfunc.c create mode 100644 lua-5.4.0/src/lfunc.h create mode 100644 lua-5.4.0/src/lgc.c create mode 100644 lua-5.4.0/src/lgc.h create mode 100644 lua-5.4.0/src/linit.c create mode 100644 lua-5.4.0/src/liolib.c create mode 100644 lua-5.4.0/src/ljumptab.h create mode 100644 lua-5.4.0/src/llex.c create mode 100644 lua-5.4.0/src/llex.h create mode 100644 lua-5.4.0/src/llimits.h create mode 100644 lua-5.4.0/src/lmathlib.c create mode 100644 lua-5.4.0/src/lmem.c create mode 100644 lua-5.4.0/src/lmem.h create mode 100644 lua-5.4.0/src/loadlib.c create mode 100644 lua-5.4.0/src/lobject.c create mode 100644 lua-5.4.0/src/lobject.h create mode 100644 lua-5.4.0/src/lopcodes.c create mode 100644 lua-5.4.0/src/lopcodes.h create mode 100644 lua-5.4.0/src/lopnames.h create mode 100644 lua-5.4.0/src/loslib.c create mode 100644 lua-5.4.0/src/lparser.c create mode 100644 lua-5.4.0/src/lparser.h create mode 100644 lua-5.4.0/src/lprefix.h create mode 100644 lua-5.4.0/src/lstate.c create mode 100644 lua-5.4.0/src/lstate.h create mode 100644 lua-5.4.0/src/lstring.c create mode 100644 lua-5.4.0/src/lstring.h create mode 100644 lua-5.4.0/src/lstrlib.c create mode 100644 lua-5.4.0/src/ltable.c create mode 100644 lua-5.4.0/src/ltable.h create mode 100644 lua-5.4.0/src/ltablib.c create mode 100644 lua-5.4.0/src/ltm.c create mode 100644 lua-5.4.0/src/ltm.h create mode 100644 lua-5.4.0/src/lua create mode 100644 lua-5.4.0/src/lua.c create mode 100644 lua-5.4.0/src/lua.h create mode 100644 lua-5.4.0/src/lua.hpp create mode 100644 lua-5.4.0/src/luac create mode 100644 lua-5.4.0/src/luac.c create mode 100644 lua-5.4.0/src/luaconf.h create mode 100644 lua-5.4.0/src/lualib.h create mode 100644 lua-5.4.0/src/lundump.c create mode 100644 lua-5.4.0/src/lundump.h create mode 100644 lua-5.4.0/src/lutf8lib.c create mode 100644 lua-5.4.0/src/lvm.c create mode 100644 lua-5.4.0/src/lvm.h create mode 100644 lua-5.4.0/src/lzio.c create mode 100644 lua-5.4.0/src/lzio.h delete mode 100644 main.html diff --git a/.gitignore b/.gitignore index 9277185..2196d56 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ **/*.o -**/*.a \ No newline at end of file +**/*.a +lua-*/**/*.wasm \ No newline at end of file diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index d6e0f84..46f3e21 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -9,7 +9,15 @@ "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" - } + }, + "macFrameworkPath": [ + "/System/Library/Frameworks", + "/Library/Frameworks" + ], + "intelliSenseMode": "clang-x64", + "compilerPath": "D:/IDE/VisualStudio2019/VC/Tools/MSVC/14.26.28801/bin/Hostx64/x64/cl.exe", + "cStandard": "c11", + "cppStandard": "c++17" }, { "name": "Linux", @@ -20,7 +28,11 @@ "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" - } + }, + "intelliSenseMode": "gcc-x64", + "compilerPath": "D:/IDE/VisualStudio2019/VC/Tools/MSVC/14.26.28801/bin/Hostx64/x64/cl.exe", + "cStandard": "c11", + "cppStandard": "c++17" }, { "name": "Win32", @@ -31,7 +43,12 @@ "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" - } + }, + "intelliSenseMode": "msvc-x64", + "compilerPath": "D:/IDE/VisualStudio2019/VC/Tools/MSVC/14.26.28801/bin/Hostx64/x64/cl.exe", + "cStandard": "c11", + "cppStandard": "c++17" } - ] -} + ], + "version": 4 +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..51bc247 --- /dev/null +++ b/index.html @@ -0,0 +1,61 @@ + + + + + + + + + +
+ +
+
+ + + \ No newline at end of file diff --git a/lua-5.3.4/src/lua b/lua-5.3.4/src/lua index 5e5ea24ded797dff85f211ef7bd12d27c2508819..3bab21c141731a24853c91c735fda623fa39d868 100644 GIT binary patch literal 253598 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%0D`>s1` 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 F{{stVJK_KU literal 733152 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

PhnD9IJy4{l!R&^=KJEru2i*;F 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

` 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

  • @ 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%0A}KWk+LNXL=X|=S7e`{?*!3(aS3@c zm*U0LcKe-{ln>c_dH!*iAj$v*&l?m)(a3(kco21}4 zaSTE73$_(E>%#r^kY_SEBdmyUfcrb7n*=}Jta{9>Dy693tjaJF9w2-8vOmuRf4@XL zj@G^4;~$AiI4%fQ^UyHAOs+irgK4KQh`#kDtJ>rJZYxZ_5P^26PpDdkjx%FqDZa0M zYc-en6XE|9sn_0+)N4kn10m+x49ZpD%?0~@H1%D4Ji#Z1^MiNXaD*X(4Z=Z@qy1|E z-yAL?1JyOF&5HfPq^Cc8*aNJP*ch*0B zAG25r2)2Lv&ifeo-~*aHf4a9wn70uW`YnA`Xm)iH(02aj@oj0`=8I<@7j0edWfb!T z=L9LX{=+n0lPFQ7Cb*DkT}B=$6t&=iwDxC?NSmNQMzcSzOk*!s#g$ad{FGUSk+yJ6>u`CMHi94#ba@ z=eT`%?IEAYWJ1vQ0WIC)pn@2lkZ`K|gZ?Omu!P1G3P6mVSVCr#Dq!e&t-jE3!h)!T z0WmdWKU8fffL8ibPXK~N)Hi(pzR^iXaYzHN_Z)vnHL*u?chNj}`*%boPr!NHbI5rt z#hPOlqz5iO=#V#D8fm}u>R(M7y?6AIk(K$h{wvh&X*M_~9k>&YRr?_GsKGwPE(ya%d%H~58AM;*1)0ihFWjcTv zYNR(KrP$k#2nC<()IbxaWqld+C2V9j zr$v0g%!R#0Z*LwG#P&w^BI1}M@)8qHgFHZx#G>PVr6towjI0rH)RZDQ^?IRRV%v;j z+K2fjB(u57fm8C{Z~Yk+*=S2MdVC3KW_ew(QUak{s|DlZ50Y3}A|y8B zz7k%)RsFH*7^(bI0j_RAwKbCM0HVg(M7{O$`Bg0j=s)68H4oK~5%o|(!42PYbO;%Z z)}`FT5UoV>4x40*zI0vSXcC}!+!ym>W*--2K@3d4gw`RksrHLak*Frdh~XyW3E9R= zaVcHRa8;g_CF6!LPw*F(kZTL}%gb<4UYKkt{h-zt4hB3iJz_n|Jn;a*6K|!-Oz#rw z^y~B+8D;`r_UK%&CVjlSE6_}1PtWD|9Z9c3iHJUvxBm}OS{K5@c7_6V`iRxHR#`Ou z6@E1m%6uGu8J?cN6M>6M4|YOGF-C|mfu$ylDM3?pY+S{N3E!i8qT7JP5)99NtUSl{!*Bj^BYO?I zeDt9fS%sg>;kUQHMQM=4HZKw}AfE&>>JEHZrAUOItPhb>Y~SVHibYt1Aq<3G2eWW? zn&7pG@Cc1jm$4!|kO*;jR~RdS3n%ap>E5xPw$j{!CpO?O9K`#htC5LkG%m?Y&8sY7 z(qKyRSTYDbQkPIbMI;OPWmi2?0|`hCOnvGb<5(vMh5m&5<~v5+`o0vD3ch~V`4<&m z(SMx(3`b^gLp2ivX_vSswo`upr?H=iXYu=$e|bLQ!TBAT4m?g>u*3mPk*+=8g?KqM zde_~DZd+B!%XKWX#U2`&E%Bk}T$U*TWwVFg{Ef%zobK#==r`_obnB-}3p@qEl|HG+ zHH*T16*E7)L8pox9`4;LSyh$@nHpijp6?B>w+B4KPJG-qQ5TseWJgv%MNq5n#-9AY7;L|Adcm+NZ2C*o`t(a5g)$eKBRx1;PGy%^d z*fGDG;I7DX95fs61gT=;GlzvLL+>EvIWKPsKRGQirAX@UsdY+M0+EHhQj-5t++8mL z#7gGX2t<#7Y>h1IFC!0!g6&(HQlu2cUKswR88D2K(cDd#2)IYbDJ=kxCeI!#Hshi> z=$x1TF58CwC_EKiV>VY`v$+y-0HlvvK>{{1Bm{K86u)?frJ6+S{}KONQzd}=O<@-C z@17gs6qJ8?Skp5??$_N2NOi! zJ%0K4Y)2?qa~aA~i{XM+3-#}*GzE-CbJ0g3Tv?1Rr(4kQ0#sq)1Gs+YNuu+u#o^3Ikiz~%*TO8Z=XH^YxkMKS2h%ZBRh z58L??pW>0LHImSp`35oGv-BU@$7Y44JTRZU^d^do-^G==LH(mw_U&_cz8J0Tnf#+; zfYNFhXZI^l@2d876db_wzp{R;YSxLdt?`DY?=9u}z6ix6o4jibYDw=(UxI06~PI}ryK@(4*v{2if`_r3l z^>CTs4%9?EMIqYcA9v>yZ*^E}!M9>u2YxQ|mMZkC8gK-{^0yiE_HM;CG105YR!=Ub zg$%6i=Y?PEMz`l-cl8ww7t_J>sndzvm?KuG&6}5}v9v>n`<3iSN68#;nTjci@T?p- zT>7xq!vOZXZwXynlT@Nhet{UapXo}{6^DJ<`hWKb9kKWfF?f|TL*-}TPB%|Ex5BTT z`p?`>jjUxcT=hn{bvIk@Lw^ST;)*p)Ojabl)hsqOXm$>-=j^< z{<+mI&m2^UYpcnfXFdj<3;vj8F;xmlSE4LOs+Xd{fkMS=Bw6)`YIup%%CE00Txd0g zqAUk2nYehaKr0lz5bDZ4T*!1(x&R9-1~Zt*#6NBEc9Xhq`}fiiNm_0~x5UhZaqbH%!d23^ZG=O5~~U zwXc26L!?C_PFn2x^y^rE{UYpORnFOI(of~DB&6~3U+%JKn?6w;A{dlvGc1GOiOOk# zuL&NCd)+@&FJx?yep#ZZk}4XbjQl%6&*VTA0HIJ|B`Mt|xs}QWMzfL&ez%Vk&(ae6 zc=Yeip#>I7=sh_6jPLc6-PLtU`Og|J7U@$m1RugvdDd_tIVl&7{V_KE8Mi?M?27Y6 zd*{>1hUWFpTar}L4XqK44S%+Ve0;i66whaagc+%VZL!f0~KVli%Yp%^z4 zjhk0KaR1yw>GKkNMn6`b<8Wx_+K}OQii0x<*TEvJ3r=58um=lwD2QlzK3O#;v7nLz z*p|HIhRLQ^z>ZYvf|Za>9gpYI_&6cPp!jDV^Gm%t-#nkru}tvC{bri9Q$V(SLmxKd zWhfxH8)(q|)4kySp(W}~)~zaHnFTBy!viBl?IgUqo* zqhUi$cOQ$WF7#My4F#2iA+pEPj20eCO^+4U^|81fxG%^*Y(?Av#!2)V5>AK3Y`jQK z&0$Zb+cNmiMYvXg>EQV!r4%$Ww4;ciIGBr+f(DBDkWT4*R%INXRo31AtR#1TjsKpc z_wKFr+G+|7OV#0hQAQU`Uz?WUa!SJ*tCnZxBw0?`p+BmY=j0_B<4Fn$Np-w(c$HZr z(FK+d8T?aIVNFw^;XE%F=6OiqRZ-Oq*>}^C0H=Y~0<^7vQx!L_8J-7*|Pf2y# zYQyy3MLKs%(M{hRXetD!coyPVDp@j}WapU9WI03HXWX^8+j*VlZoVk_{s4bSwtOQZ zl-BmRX`3E zl4*jTdD93zlTC&!!Az8?yE3Ukm7e4vN=x9MFrY~Y+pRpuQGDjl5z)G%g_V2Oif(ou zICK&TYKycQuiHe+>x%Avl@jOytzGEZ1;Pza1BP2?@#&!NYw{zl zI_{pF(Gqrjf%i#cOL4g=W~u}=T*f|O5{l1Bx51s9lOc0KZi4ShKf!2qd&t z`hF;LPZ2agx#do)U3bcYe}dC!Qj7c!?z!i?g?#;DKP_lnuzyKnQJ0_~joH^CGi%)@ zl9YD!NtI-1=EqgbQA=0|@tkTVfg$Y7Sh>RsV(1n_^&-!WA%p@Dw`=ucE_lne+#M{P<|sfzLMc|7B7rgwmq8Z;>dBtp$PlTCEg2oUXLXfA7L>2Sk81GYKl zuZuZf^z!;-%SB*GlqV5bXj{%$AmCRK#rOm*=M6DbVJNI=!qx?Osv~*Y9zacq6#c1w z3I0%??-)KOokquD&TMdHkYudQAd^%6wF+5`u22=h+K^wWYlI53+*NNnAZP8R&WuIr|sjGm3|k?IQVf2k`R z`M-S*)J@WJpl>M&LIcUlng6Jvo^ zAw5%Lo|PHPm~8FbYjKB|K4vAM;=~Tj);KB%8+^%D%FnIJ^Z8xs3Sln)KcA81(bNL* z64$iy95)xQeqM(#S2_V-hEw9l>Hdfc`+CHA?XJJ%!^>COz;J66VaLp4s$sR1obw?t4E)!1&dla2;%$C;9sC3#iTdh*eRP4I(y=gYqG39(cgAPU| z9~}&itN$i`iAr9p2m*6+J&KPaXafV2~%VQRn6Wb?scD0i&?_ydw1iI=H8I?O;W2tSu@E^+sPr`g^5oO`=3ohV zA36*w4X6yFk{*SSrY7M-FlO=I@`cDO!)E&F4bxbb7{sd3(9%h>K+QyYVt8<;pP(_S zm6t#P8CSrMF=-r}{SfY4n41K=0@nq!zX%i~qRDkKUhBo+bXU>$rqJrz(B2~dV9)yh zQXLf;3zAoMt)lF>FrM#3Mal*VJ`ctIBf4O|cq-BBA+#}h!tyRT@&0*<>FL%6HV6yr z1!sWnoz^?_fwnWhjlb!~%5&TsFd#kTlUWWf7VnX-rc?x&kb}MDyx%=mpjQ528EjM| zy0J#i7H|c|C^U+JPM8-Z^#&>BZBZY%Rrrq2tjekuzrNh8$S{u}Xn9C`?TdcuCeH7< zd+e^xW68~f4SD@j;w6eT!P~mPo|fqGzJR+H1)Tc(FmeJde0a1aJcrjWYML>W3Tlxr zU|c3{((Q-a681fy|E(=Xa>n?6``SLx239Zx-Bf=E$?Vwmg{#|5F>S{WSrL-5Ao{_i zIlWfaDbsn4*XF8pAfZTzhrpS-zYlSy1ny0Z^IIPFgb2YS9Cy5$UW>Z%@;RdOx4Phl zq!$u-f}bR*u3S^8tUT_gk#EIc=MzjQpW7>?oDu*W~h*gRLczdMRwUfO|3_2dORYeU)#}; zS6@-uj3#b2R$nPdLZ1eHYY#cjLlc%+IFKku5aGRVz-Wyce6IG_8y|rGkSLI{tr=&L zRTom=C~b=>kwjjVlyKcfYr5lD`=n(l?XKh;mqmPTgYP#_wULXRAiWf9jbkgLfQWB2}Zf zI!13_lMt%f)9XBY)C>dxBIV!P-xgh6`}t2kw`pGpyvLfN8@_=}%d{%fK%D1+oKHPr z@oG4xVH{%ZXIhqNn};TC8c|@T`1OwIjKeUl9cli*GbiE}W>hFNd?WgRv=7Kxa3p<` zzFIDlvye5Yee~~OWVP4e*S7Q@WjTjsQ`%%|$6!E6b6|7#bXmVXnLPiKMVpDFlvphL zqbli?s>@$B?J6oCD98F3U6_S(xi3|$I!pGiFE~aNKe^~@5o($?i=w;M4<^hIGqmpt z@XpdRU(ZVHn6ykOfJBE9XD}et`F(hy72OUl9Gp+-+v-&cVdt&6*U1<8dEp-n#(#TO zy-=L6kSWoFYuL*n2YV5cf7LNFGz}MC_B6Ddf44yZStox}ELP-A_##bUyMHuG{AE$@ zss?*ftw49ReDgX{7m{2b=I#`7jm3*@)AfrNekD5V{qszQkB$1L2|h!a-YeOCy@rlY z!tS{Hu=>K0i_566@Wh9`JsBvzJJ}lsc&6ZVon-YDCtGHjL`r?{<)t-YBSZ-8Sa#&Z z%R$I~u7n3x@r+6csSYl>s7rN3%a|Q_chPz}chE#|2q*JF$mm-?)j2F1*qfVjS7ew8 z#6!3KlCQG+!o(b`pfYc=tfb|_U=#Ypm!_U4!?~k;|;NZ z&LaiRL%ZEIe#-Iu`Q+GM-&@JHGf~#*75<=}(^9DPquX_XY@v zt9>ibGF}z#ePxIQc0dog$t~-L_}$f`2DnFH4*E7I&<|7Z@*oVEt3A++vUew9lU=N# z_eeDk(5fUS7DRkUeUDwy)I2l3ln#EK4vx{$!G}}5z)5n|w<#7OdqeRo>`e!&k^gB( zLZ*gKM&F~N+#IjkXAHA1;n$^}t98b3mXSge3{;`**{xQWn4adT3N5Ru(JC;B(OZRi ze1fg|2P|J*iTuw+k4YwJAJ975*e%Y#?C62rFv(Odser~Q{mEBXrG5jKbF&>B~y1g;sB{Q zdT?{(29fpp$g)xDvQbCu9Y1r43r(I~E~`XAiaCH3bKV2J#v@lBnl3Sp>%7F5FZeH^ zZ4FnVj{3Kpf}5w>1EJ$Afp)7*`YUeiN&qRWX{4~qm!b+@E9>`)VI`-F$LTIAWPrY> z!X%jc`k?No(5X2Xts7r%W2Y{k)os(K;URBI0p<}TQ5pShB(la$#<2q;2Sss%qU3|3 z)Hvb5$eIMMCP7}40Q@dJ0v2OjB^qb!OVCQUn39o!fL@uI)zSTQd?PuuMbbb*k~>f( z3YrmIp^rc_5?f46dexVh{7k#1IwLzQGmdg5>T%Xj#AM$JTD_A|XZe+GoKR=a_Y9lqS#2!s-!eBH?*4>WaB6 z%Z8^Io$ny*3lHW+7Ca?K*PbXxC*7 zdwa^+g$1_8LSVsv$%*(eFj7 zgL^>!vkV-*Y+PHr!)eh>u7sorcuEzEiCc8($O8Z>X%Jc4ks_@aY5%W80z%u8jFvXB zGNFH0_RdHFIe~{xISD^QgfTXu>JedqjskTi~mj$2Tbw6)AgXhu!q_~aja~#UX^nSeh<6i+w34rhU?AhnZ$xwt##~wgYj2DpB`oXF?YbSC(EZQU8Oaq4Lh97SN zo4p#PTu{(HHf%B3@-3m++VWvq0hkdUn&QS8pb*DIWWBtkv?deZCH+lvjvhlRsmG8P z_zeA6d5#lecmbmno*{-?#aYz?ObkD35V<-otsDSa3KLX^8Ap(c!);*_99Mty4v zC&XeD-xha?H=2O5N?6s|Hm_j&k)mp~)apu*al#D07MdLfTpjVd=x5;jbgwMFRmRv~ z9Fj(J13!k=>)(*34mAS=bBT!1k2i0U(o^Oiv7P;y(RtB<|o zjuFwmMxE<2V>XOt@gcr)cRtE!KI-n7k2HMlU#GNu(O{*Op2r^^ABYO;tWVQ+a#xFf z@QGw}-}si&Bz+K(C+7tP`pSxOc!%;+5qt7cLL0saM8kVHQ zH3?K?>vXA{@z$$t8K$Y}!w88YSEX~>2#6_TIheM2BB!elbL)Nc!)Bb}d5Os; z0ck!VvbN6S5^UYEICE10>VkkZNs(rwhsKYU=eWsu^^Xb3F^vgA&5$_!?jM(a(UE?H zqUmi_CTv~}gE7+mLGs`Btn%>wqd$sDKsPa>mZO$5O=Q5OAcOE6#zBarx&HCdN$cPD z2V0<3qjFmyp!bhXY6N5mq`oHbEmg47TWDj$*C)xom$UC>!$*AdF+z(Y(4*5clAaqV z=1K%wHC(!WejWjhA4(uu`=v?#O2ASqbWjYKj;j-?)#s_6o8fytovTORVkS{}oxDWS zUrJmT{!=pIb!Vi5)1+G&CEaev`}AYwIaWjJ$L;BO3??xF?)$0x6L*;ac>jOkN(tN- zf$}W<&Ie`1O8q?jZ$?F4>EA-7KLH)Pe8CvJN8rMJ*K1$$gA3L5V{1AQ1!bvODi%U62|C;&!WOJk!6HANVG3L9 z{}r8;xB)^AH?2=&Xy>mepz5qaK{dL_yeJaBhI{Z6clSqTo*H&u+s1^K%F&2X>|4KW zweiz)wlw=rCb5$tv6SNoA z@|i8o%TA#8Gt{5J(ytmT2)uW|ou~zqL1aX*iEBz;+O^uduvGx}t{?kIbs?B^jBT5lSr|yn~2c~81wcY7QM@Hywrz&LoKIbHr^Ms{=T4Q5okjm=t+-K zxF+9!c61GHn+u-0?45S~C&tnp$@P?K!h;qd1JV01s#t05Utf1ZWxF2Wv&l@a(-R0S zig1+W^le9Exv$x;Iu5VlRkQDo>&w?y^QvJg7L9Ywo}ksC=ETA zjffWI!gZ*%v}<0ND}1`|W#Q8w=gp+VI0C$jEL^+L`zb%ME>ws>N3PMp2S;}A-HPg! zq)rMxE1OBxhb+F^u;$#;?9DG5SsdH;-iOR$-ClH^dEzI9qR`1Nv)WMSIrg$e)J|xV z#+}$f-O{L9dxcos{j9tcJEq%$aCwvnpwZ1*+CcrAwYJQvX!*fK=nn_>)bpYmtX@r5 zFZv>U78oS6f9bNqp9&G{TdiLTF~K&u5JayDTtDZIEQ@O$nqM0;{TXfBfq-mH(5XBZ zQMY>6*K2#2`TC*Mtzx7A{aUZ-#tSh-#rdBjK!AZ2YCZTywm~4Crxcx2IfQ!H>Q$vN z$tNw}kH{A|$*;hE-Ry9WWm&mj{1n5Ig=~n1uMumqkvJfoOS%g>SN)U4w}r>HR}H)z zQEB@D&Hi`Z*ddkZ-KowUkI&bS8P&ZW#?2{3zk9tZHnRs>JX1Q3{aAU9`vSl9kWc80 zQK6UasaJ2RAK%=mmlXZXWHWz)<3m+&v16Jlvy^ff`L7F>TgT6uJooY5fk%9*2fb?_ zY%{b5qswyH_C?n(0wMJ;u7qeFd~z?df^x>jONFkPcxS06vN6F?vmzp_XK-GU2L;*Z zwRTqG&VBCFl<${XT~O7IUWTnXhO*hniXq5cUGkM{ zevQY0WzGWwl@-ZzC61N%)jU1WOs0d>%%0{|c13ufz;dA{gYo$#-G=sS3sk$)9aJP? zV?`2Sar!+uRp}b{+jebU&zuj#_8_DV0hq{5z5Ouf^2Vj2Xq*9#d-nZc(r2PjB0fnd zl$bzpXboat$*^(Wt@^Ez6=IoR$r`g#D5NRCm{sMU^0)h(H1?>Sl{eJn`njqF{^F=Z zc~-dLt-ppY6Sn<4C~o3D zPFIF(UB4HXmI67-|8fAYV@Q&}{m{e6bLrY27kBS$6=T)QQ?_iRU^i!3#%WH2E$I7A zU*3>q-q=3nv_fps1i|IqlRkTI(%9FvIAxEMHNS26@*ymY(KAh%Q(JPE0^yqU;VinX zuAQVzM9<2xWz?LPOkpJ$#lLMuc|^KtxN}0b9-;cyWkP^_z zW^>BFjLg={VrdBiXLNN8m^dubnJr!yho%qvJ+)-~BiK82(pby``Tv1<1;=L3%R^-0 zZ6~WtLEnLjW94WPEeLR?1mksNUoKkwA6j5?tFd7VC2J<)peylvlCF9la8wvh5dX%sn8Cem2 z(ECxSzC5qh3iJfQesrjhsnq@&FF^K1e!Twj)0H)a-W_5-rvn{K)*TV8>zmC_SIUnj zIMAx_VvUwJDlZzjP+VJxpQK&tM5mMX|BQlRXfL?nRMkvD-b;+RTfnkdp;mOW&~9mv-wWKDs@uw4GaxfB#vsBNv_~bZ z#Te-C8H3E@s*V0J*at`2KL#C7x7QbHclyVm>6q$cIMriB3n`2%^c@1K(GjO7ow&ee4IS&?JF0^Va0=9lPR( z_Y$3-_PD{(nKws>3ZnLVM@c$0WfD#@_Jr#6(8YpEY>&GyI`f3BZc3+@BzU^DH+<>h zA%?j2sPU&091hG^e~e*x-V(#dEu3bFLTJssG`UWhHBatLo~5-O!FbvoBxIoUUABqBxwwYt)q z+6kR?btJd6F32tf1zNPur*h4xO)WW8V_EMxI=?z&Y-JrMMFVhF`)@&qE;}_F#nHkV z$ic$$+acn9P_U&`1g7@^QzOhIk)C3NES5h;jPU3f##3y1j9!65f*NaDcYSqB*RV^@T|}2(*p8>_Y~dS_^CNZ*HH!-oXo!DDQ7Ye%-ZXr(_s%Q^~zF-m2xvwj?)> z_e7v$vkVQoY|%L(gPu4XV`es?lCSQkRSr60FkH<+@7t}3hH{H1^^Rtgdg2v+(iMK3 z8pU(!GaU5@i9y7%0GxXJJGVx;OF~`s==ZDyFH-*oGL96V#!1m)1qvf2)nAnOcNT8M3aMV}gf zo0IN>6NpTbB)gTy*Tz#%xbCS}XPOWE@d! z;GMWAMeB4lF#}#r7e*D>f-c$6ozYh)_$3CWzl2mAp2XXKVRX6l^9#5r zBeM>v{nZ!UVj@i_)cl4EEeluh_qMNGo}JKLM~NFWFdBmXcbKyQ`xbmgApBH}4(m@Mv-k!OcePQx1^8|`%F_jC(p5T45RBmjRM(<05PA^(KN(wdH=}n%LvsS?$@#-S&HSwr-e0+v=V%9 z!Gq4{{LKda0Q4DMT6^5rxD!0Y!G$+;*d!VyF^3kOzS~l*$zKPFaz_dIyt2BQ%qb;F zWkk^ar*8da>Y;q#!`{n@MwCw;Y}*ln**+Jbs3J{ks^qIb&8I^{yB{1+is)|d=5KT= zcD=JRFJ`6~G@B>=wt*k(?Uy9S@^%5z*aUWIzTAcT#cq|YQ#s+)RXu6MxECd@TXIeG~3 z@ZdP4MydA8Q$yI=AiXZwh5-UR)Y;rbK@tXQK*)$sr~tyT^gJ@W68Bi(q~j0#Sb6mG zz-tdVAVphe7+@x7;hB9$C5hv}JkV3A!-rRv7}fjbb;i=zS5tYl*oTgCb))kVQA#em z*I&6l{*;L4>#2W2|GcbZ;Jowv5Z5_d#wkFhex{_31z9*3-6z>DjJw`XUb6CtZSbBS zXD7c#gk$!GFEEMt3dbe=GnG*l5OlQFUy$uMUl!_0i^5+&%>G7Z1(hQZR4o3H;uQVl z43~{(IKD83guV&bY|aw4P+w**1u`acbU(RD-b;3neylvlJ%(35mx|`1)np1JKxg5_ z@a29S=;A}g{$GCzw=LfLh>zm5WGM>J=e%VE2cz-Dx$)(edQO7pEPi5_Yrv9{=~5Zv9a3OfCd`fCm~`lb zI@zm!T9iossS?QZy9NA~1_Lnd)bu%UEg(f=qc+Bc`b9+KKA}&77Jp3qs3QSXbRrT0 z4hZDwF5}iOnS4u{R~kReD{x8VRS+G=E14`B<#zHvjQCU-TL)hKbKMue6E-)bUHUhF zuZMnS1-*rhki@q%%gxVs{`$K#`Kq55L|=Q=59wk5pIiP9&^yA}`GL0K?yrhH{=;#e zl1CYR$!9)#zuhH%fcrsyi%P7Uss^bh*46rZ52m2A!+vn;4{MzkKKISYlp2wstIdqo}>_#opke2+k~8nVfJ-oV5J+y>{H;YM$?fFd!^;RP0&Zp3voD zA7>r;j~8ov|36+V>|n3|bg{IOh5zwl_TB&SVzt-)2g2-iS@J~}LQ;MOsBp8wPM-d5PZU!%j?pEW9^*x?61 zjY<3-yQ9xV?qs1C46C-#kjegztuY2Lx;*OQlC;vDl1<7m&+y{BG|x^`y02TEc8$#U zgHbCba{bf?&THpTToYyrj#;bAo6%6(Uk+}RzSgT5-$c$}xulm^z*ZMLCIUX4Y|D$L z0N=+$!_Y0z$!XyOW8xg*?~t|+wWG`Wtw$fbpAK)%Xa zYFnDU)T_)k^)dznvrwVPr!5r)_>13ITB$<1o}vsv-wY72K-bHw8u&gN_GW7~Ov+uA zAxUzr>1``DXWoXZbkg$W$d-hOm+xPDxu-Wav??E=z6H(z{FHU%4748D%w7)7&*qI` z68+G;dB}1%Px+#ly?j4LY?$*cr5J`U{)E~&k02M!{Mm?ErsT~RUS3lg(`N%3L$fVT z8uJrz$s0OnkLfEF5>49T@9BFZ7Ji|Vw`hL#o21pK@N&GJy8_ghPZqZ5YU6TjimddI z*&yYx9UF@2%-C=t;}WY^ zOiz(q<(9>$pGU6IeY`3r;QAc&9Ie?q*G5~$-p#d(7@wJ83?|foZSrW9(hjE1;1cjs zBPi37?rK1L)Y1-7m-KFQg=^4{mB;^JP|cP)epS8pLP4)?TaDeEpp%bCk?epZSfsepBrBfBri)=N(9 z^Lsmo8L`xyB7rv!+bUe@=C#|(x}P|L3yeIl zyxmLlW}?bR^2v*)Kj!oG%j&df9%+iKX2{{?8#+Qi%wQh=XOv+!9M8?Rl4_SJF!_k$+ zs#Km*)T1=q8>y<B?Z+y;uL_ZB=^B2d?{X30F71OP8)z4zf*HA2#2!<7RAXY$H3#>fjcK zGeoU>r2K+I8wN6vLBsu#s;YB7&H2Dz3h{BfSSt+fPsn%plZ0Nh{*p0=`Wv>#fufi8 z%AW$_S3g#8Np9VqWd-Ef;T|=k@9DiLeeQ6Z&=el{dqvKQj99~@g;XECG9$LnW@=fJ zvsw|xc4E2~mqJ9Lo4R!XQ73~AB-z@v4=s*$WTywkPGAAeXYV3X8Q2-nbhy9Gjzo;- z2GJh+bKZPwz{ke+e=p_#9VXd`Ha6+$XC|=XQu8;5W^LwAf0>E!MP+3a!>_W5I~Q!F zd)ba!)-rZiuaTlXmfhDltRpl3H#fEv5R`0j;a-aAhU0FFWM`nZ{t>z5k&Lj5aX8_a z7JpedLcPMDs5AeE6~v)RDGGXlo&~hR4hbJ$Z_(oDswYLJ(Wie5PnX38sI(F3H`El! z31ty)WG9K7KHSjf*%-^#1Nbdq2EEO0x5J${gKiK*+!P^3Z5Y~jz@tn(IV1Dxf%mr+ zzx>7CmxJ!R|K0X02Zqlucnz&7lRv}72ei|U0mRzEDc58dmR^pl`zqUeN&G*;*pz~Q z>1LZVQ-CE(`JMM>P@MsW(Q#H;)5htF%z!kneU6FDc zvs=9ztd%ti%rJ(jz#iTR21UjBI@ZDZWQ;)!Lw|^CM13)&h`zHuJ6TNQP`vrME(1eR z6c8ljo-W0WnD0Q00gd0bywu!UJf9@2?Lg@aDqt>Ncum)hwHC_8kvZ2r+eyz8$$`>v*e?GK5)iyY{EMIMzeWE2uvS2~PGjyL+_ts+yhEDbwU=?`Xu6Hx)3k$f z%PQ5W3W{Gs@f?U>jEk*~M77aKJ0)N+aWeylvl;a_K*gQ0>S@Lm|jNRRC~_n2)#ME&#H1$`Qx*P{ASQjcJ; zDq1yxk>}_>`sam$4;CsPofoP`_t)gj5R;Du6@b#AiOYH~ZD>z_55X7|fHE&8YzxYm zPw#Cz1XA2l;LbV=rq{0*=EJ=KI*_NlNjfBg9fyleOv)DI#wWvN8hKcUUzvt(FdI?U?S-l)aXZoS8BX@JyfouZN1CtOY_v5Q!K1Q> zZBBMytlqkUS4+r!=zG8@1u$B<*kWmvOM{f!@guM28UTX)p+s=32;F*Vah^m4r=aOY z)5cDxz&8&cHip8fNi>|X?DSHLy<3Q|B;5`!(b{IT>@Ict9`nMv2zl z%&E$UL)#u#oX@sF0p3PBcQ~9@6R{`JD7GMTpOvYws-aQ|5ZNWL+qhdOn+N;AF5`;ojETpSpIGZTN&Gu*sWt*}g zwP$J9Wu)m-iiEV?myDTa6>{6_kchttQ*~}x>0bWyU+izUdP0x3N4N)wd%*ClI^tZUkcGIqm??>F@1G z*juaVC+Q7{pWi3`-}=Bf{=r%+>IN^s!G%xcd_UL=sJTH{Fu}vl^B?pkxZQ+;VlVqG zwI(*w6A?Tw$-}+9_fju3{^tXqfmc^&%;*`sspdg#3F>7=E5c?Nsl#~7NP}UgRPcU( z9YTA4Jxi`&f%?%qBi|VaUz5Mw>}g8!`A5d3c`en$FI1vU0x%;4aOMWcIuI z>4wUVTYZc{ipqbqCrJ&|re-vD$=L!+fTGA_ajjJXf{YE21h43`l!8`lkCXWv_R)DP z+aS0k(9ghbg{)EnSt!&^R8$u?V4nw^$lBF0x}Cq7t&nSR%9(yQ=TuMNz-7o6PtWwCFNvsoX(k+So;?Q9*4*2#Wd!VP)XPK!#~{QF#Wl zByj7f9-#-^0ijfX`ZC27zmI`^s@5(eT={FDSMae$UI+mTb2XdEr5kB#Nz zXTzyGB~kv^kChiV&VC$Af_Ga@OSs{lbB~!9gw}OY>rtw)0wzdrTJ<#2+>=?LUrfIifS5o?FMxEWi1A%3f3HoU_sOR4JfE6~8+dHjxyMX-3VEw` zfuaH1uTq=8#Xl{nk)y<&Y)TnwQjZq=)+Ahdh)7=b=`tMYr{{QesWC6w6sOYb=N!|O zU@rQwAiPKjz0qBO!fu=dKUV(U8gs$6#cZWltX0D)BSNLUagl-G+@h{RtK>^<_zJ@Z z1zcf7Ud%&IlmwK{Y0w>qS0PVV;sI!$=$YV4z`oaM-5?3je9(EJTkfebKZ5t}wP`V1 zQ~wXm+Jm**9j7d4ZiIV`iU_V|_lTg%IILImIh(96Mb37)B!HTw+5d&+L{_a+chPvE z(6&>eDBP&~OnbSI&$?b$-H$H|R$uOg)Z84;jt%P3ZGF_K2-0>+gND=?fg^SF)>kia zc%2gYnc$e78YKOiU`x|X^4H2Evw0?LLD_>me1{#uRFP)nq5lg;QF9-I;w ziHzas`+-DWuZ&bl^o6EZ!wZzz61`DT*VW{4R*c2tcXf*Vu1*0Fi|Ld|=>ao$Cum|E z_Z-=@D>~+T=d5U;#0)hEB0rTP8Y?yiLokI7!JXw8h#i(H_KSE5!W)5ahW+4tY?qOA zL>f=AEEpV4oG{CQ6SAp=c7o?m(VI_K5A6gu)_p6P)Y!Va!PPc9OOjCoQK3rXa@_8j zOPK#(q?+i+gL_N4q6+zOY^Go_%-sC`{ou(+uDXcM6T{`D)yM8wI8pt20Pc_c#?6-d6105_ms#>Xrm!0pUHdLol_h&SBcQUse`r%#Ts=SImPcFI74fOtZVy1w>F4g0#B&$@{Xxk!J+6IITqX%T8Z~==o`Pn?{r8N7eI{i{bgb zg?%;$Rd;%R4;=8w;Q3jKES55r;Q8&!BhPOTm3EE}-MX(R&(X_kOKT~bXSVfHCtfhf z(MZff`!Lve+?L%nD!AD$RULIZP7#Fu(5|BCk(8*4>_?nfPvLL6!c$y4D4ZGV9M7~tiBCJ>`#WxBMi*5 zq`LdR2?Kis7+Beu!1dQ-#x3!=(!ljNyB z*j3?)G09h*e+TB{aLumwUO{!PENajP32~^>9p+ z0^5~U?|~XCcfF^4uj}`o_=ay$^x1R8V%q0%tPj~z&keHnJRo0kIB=!p2{jt4t#nbj zZ;SnB=(_DQ(DX8h<(IUOIc1@PmPCrP_jVTecBmJ>7*2$?ExE;__E?jh)5Y2oT);dN zW`%R8UMQJ6>Lc8zVev6a$zt*K}^?SiPcjs^705>>{oT zNq=%gD%w^nWSX>Vao7WrHfRj)1P=VoY|j=lrF3xNP64;T_Q9P_$ECQk{H(rEI-hky zJ(JI5|HN=4u~+f#@Qnfra(~RmBE=@ZKZOo}6j#8zcVx#4iZ`X8l!BMTQKZroW4!C4U5YC% zbO_+eIZqdrRvtc43_4&1a$h4nzoPoJ21jN^+#SL$1jMe%v`Zqi61tQt#!b!szJzoa0V@=L_hDqiG0;XP9#NvT(r4+mw&b-j`+&tPQva3-_DF9uANn=V;4**cqQ0Y?K z>x{NSfZ0FN|Gl(>JX|tH0QzSAl;BRfL%Vh6e?i-Xy2-okaA(b+f@HGEjv0b!&RJ2~ z>FWZe(hdQ12S&=2^iZ5;bbic3wE+O}Knnz*6Pe*Rmg2se6*(T!p~t2gke}U!+x_Sd zpd$9{amrZ^7CT_`P2j9#?kjRumWuV2gp8Fvu^suJ-(dcmB9i=(LRb80{tT+VQ_i<$ zj+uj&gxF3Mpw??NGXyfNC>0DdJoH&hGRHtj3%=0>3bwd{*+lAXD%eCZ{{oxXLN;+F z*+kUkq0bT7#Cc>Bx5Fm34Q(>n2jnUrAjrqAq65+?BuyJAN7-a`DINSifl0oe1o`Yr zBQWVHR$xrFl=v4xZcaNbk9x4VgM!LAz1;baQbn1TlkNS2DvMjtCR!~qfXm@k%Pl;1 z+^EF%gxb<20;7Z2se;{|g;#%F64~fh(^FvxGI2ICAL*Zn&{fB8MF^ ze&O|2s+HjyzIxG>cP%Ki`8^oiHf0Q4O<{kb`*07t1$<*(K42jP`h*Q;WNU#h!XwE% zS|lICnzN7O7%RA4`E=1NlcZhRDSMD@+Roz~`VIMc3uOF&~J0fA~O^f35pV#rr+vUH2f7U@N;Z*cg3@ z1Oy9*vb5&h$)R$m*}bHnJlD6EGVd;nH}{#yBs4fTEB5){@I*dj8g;W+7mpk)wa@-w z_;Cj+UNj&C_TbsJ8H|S_aw-_##b2`ziqrasSy@BM=~+U@fQ^aSVH1~8jh7xeDh2%U zvSrvOxq2x=rj%NN12%nWDT265asBfJb{UWuam$y5;9Ec^Fi-gud8U~YPy?b3Ei*Bk zhjNxA%VO-4*_A6ZiH(QQUrVU%n!h#mr)~n0*Rv=~MDpP0T||E-kHx;kq_Uc%$dA<= zE<~>$#4vq6(|QX%W`p;z$E9CnkivIRyDf(=7E&fnk0bd{3tP-x(2bSJ>d1%Za^&V& z;O40{Dkinri*7obe^-Z`7+GkE(=uzLXUGePa2ACu4>kIv+Xa8&4&7Ru=Y zr@E;A=j;>hgz;87Z__a}c2qkNgaVAI0B~tD9U4pevGRzQ@ao@_>HppsYMt$yB-ELB zkuefOs&~U38$Y5~a#%9$_%IVYKD2L-3UQ8E9KpfY?o0R(T5Fr74veeELQS!7+nv4s z0AVo8ISqKv#3|pRo*m@A%lAi?crttN@e~$Od$615;T5oM9UV=IN(uH{{QCYdW7mC) z{}9Rd5LC8hlTT-wa#nY;rAVFh?HeZR7cktDXl=8Lhu_bxY ze(^x#B3nG-x%f(lNYPI|wcIRkyKPZFowO(ZiX8!1I6zaisU|M+0YmUx*Cbgb^AXEc zEBDJAZrcs@N!l~U@v^`XJbHaSSZmT82ZaFe>qw2H7xs9{KuSC+DfofF6#Y3@jG-QQ zYSV2?vTQ_f6MoH9$g&MekZin+Q=J~VpqqRb8qCusaGuxx^+56&zR-2C%rcRB@5g&A z9{Fp{JTG%<s|FbaO|J*^Js0qx)P!o$uJ2TXM1lrA zvR+pYD-+w!a3S*|%F{gUuEcTnZ8hG>9^6-&3i%`SI?c zHJ_7Rbl+#Td=iHJrCo9?Xm9AJ-AdZKby&Jx`OcDK4y5iN`z#zzFzE0TmcX!O#zEI* zebC;V(IWN)fRhx}^n^DMM2bN+>;lwVnniqxrhxmxC*}ki_y=7v-cOC;@p^u0%_c|4 zNckS>Xx-A|e7vPbD0B2Ya3HEW)zaMEC>!$1L)tgn_oVI&EFbg`V{C4QY`psyGWGM> z>h+6$B(BZ4S6<#N+MoQNbmL}(FZF%(Re0npBgO>HDUu$YZaZ%uT#`EUr@-x5<4;Rp z+~!>pzU?1U`M}jXBEGwDW3cAWb?S%S{UNaK*;wgk8{aR`Rv-OSSQ&WegCjL7xjjL+-A^0D$H(r(f^t!sRZ}j}Wu`eYY zE-PKwK=4WFs@pgy%>Zw|bJu^mm z;sCFS`6T!ZyV0u1cTF24^X30_z^LaZyJP--?V}yIzs3pg7gX>5Qyc%iF}$|twt3fI zbtkJW{EjDAhI=A@|Elu$fjiU>J>rlJ{QXk)K#+~0Zm*S<-ny&-dAe)mQgg7Ek2Z@hIRHGaX92jcDXyo(?F zJHPweFNPdR&FS0YK+d+gmC&m5BS-!gNc!=I#h&T*dDmY^yYad^_C7A|rGd4pcU@mM zZ_h8Y+?C%BP`YYv1s1&Y%)ixtQxqzn9o6^Q_3=9nz1@O``R1c*M`Dw&z8`B`aB4^O z?&x=eKdP;!IU07rY>$^3<{bXv-yz+1U4PwGxZuLCgVmU=9`C5%9F{C&=U?%~1C^!M z6?ljNu_02u`%2H)Ilr#+@d@ucwf4DtzYW~}Rz(aw6lR<0HPSP%u^eHs=P9oX-jq#V zyl<{qS`EM5G z`1%sKrmn5~goF?wV4@I$paiErfm)Q3+HnSV5deG$DXE6|ict4h_^= zTPIXNaA*mFVjYS?6{i-|R{ONh16JGq*FN_Kuf!IngaZK>(49^X|< zH1=(M>bjzFymfvdOqBcCErZq)J$OsbRoqcC}Cy$pW{XI3N%z7(#8&uwTeeWp$D z*W)w2mjSv;4?S4XLq0J@pw-0cSSV={6`R|S6{0sJXIGjE8Gd(DDo#~Eb%@dlia{I} zzX2ip@KJ8Ft2M*EXVK^x7a?_tHshGaP{>7`Ig~m@-?4JBJ>UBxZ5ewI0;s@7L zZ6@xU=eqY8SV^UgH=Y0CIvdRNa{Y?qzzGD4HwX*Qp>4bUK=m!qHZteR08cFUo`0aoUZQfH0~hE}H74^aIczFVcK|v3c&BXC1LDP4V%z`e zA0ui5`ODw56T08-A;Nl>2OruYsj|^BSo6VG-I>ldy-6#e+_dKeqrbvy#HsFX3o;u+ zH^4~k^lU&Hn~j_W62P;GI>DK!FF60VVKaVqG0pKg9+$@gO7fnNg!T=~|DLJ?c3$4+ z#nP3)U!FK9`us(Fq*-=9A>#B@bWn^54OOkB+ChVh_`LI3KAvwNsEr_neU!A+AKnNB z>8QY`$;~cVK(2D~muBuGPSpi4OwZ`+BysenU0T9J7VKra=Mte%VBbH*JzV`u%Hq?u zpM4gaI_L8Get+;Q$*J_-HkI3Zr&m_?&MMr#<~y5&mOxeEx$oXep-K|6m!JNoT`lZw zQ+>0y^o{*9R_*oP_Tj!ez4f`3UpN(>Osk5RezZ`KRdAubS&b=o_2C4;=axOaZGO1h zyMra^+shG4s($D#`L=Wzw)(u_Y>uAAw#V`3Z+lBEZrLH)+{!mTx13ErQYqhT-0?B) zJ>8cVdpr2Oov<5ct@92<{8&ckvhQ5W$cE`Fp~)WKe;N`FD#{N1n}!?;FSF{!t{<;l-Y=)w>CigQG_2h4bz?3AIt)IOcY^ z6^4Mrxi)4ta?1JWxJ|}jV=iI>^X@rOrykZs*kI?pnbFeGR-4uf6XWss`X^j&iH399 zzWMMm2ozaj=Y(m;Eda?QB$<_3pE0~bH7_&jZhx?^L0r7XX+j7?;-2d<`RSIm51ghb zdafFRq_z?aHIi_uUWPTk$6V;SIsne7Aj`bl>EqaZNE07va)29p~X%QY|We8X?r?*boG0Q)dn*c`(Cfe3oOT+tS71?4fVKKEaRIC|N zad%wS9}%Me*qnPVF8R#HvBtJ@r0sgdpi`I^Ce2gvveW)W-YPBTIwTQUZs;x-hR1$Z zJ51yUq+x^ws}s44`xy6ycz)i`v7fz!n!|fb^hF__>OjXI4C%rupJRD4fD?{4{pFY$ zF)dnXT5Q+huGDV8jyf~VrK9x{yc#mnYjziP?)n2-x|d| z#8w=q`mCjk*iOQ_!brvV;x?m)9J3^JrrV62rp17RQ zO2KnoZmr|aoAHlJR--Hy{kpluQafnsSQdIXH?(v-eQr?U+ z+0$|Wr2;4oK2U@;XU~n6MfRPbB~Ol+Wz|v5*=wS^JF17e$X|fD;!J!~jKKPoi?lp^ z(geFqAY&7M0m$?B9Qhi+_<$!%a~g>L33WlgWVj+wZ@Pv8MkJ{}Vq}<4&m^KuT}@{e zoNMlZ=0B4aWMT7})#yLw%%&yPBSXasMOIG3;ehdKtTh490!&cI!zU`d0gDEn1Hu_M zB5=gLZg1$xk>uH%R^8&YD~qeo3o1toVXpbyQMLA0J7dZ#7rI4TAhOVGoExUyxG;=X zvxbFX{6SQOwj=Hmdy?GSsf5+=C2veP<|4?CH2?R+vu!g^@bz9y0Q&TC@SGDKneMhn z9bGD$UOLfzWZ053M^KI$kV4ZO`ImwuWR2r^Q?pmIV7u2pIks z-pF-(QpbJlp*gj6O3Wnx1?LDEfc*%hjv-p{;tiI(a|YJ2Ml{m+C8mWnq=8n;QRg+M z_%C>ET9Jovt4Vi+PA)^ObAcQ)(BpIFLJrfkNKBoZ9;`@GZ|5=1+@#zQEtsZX{uIqh zhR3PhQnUl{YhW($xXs4TC7s(y3%oxuRn)~wpzH414!Ul&+YZ&bU@eFp-YSE`K&iuc zCulSy-U36j;spsR2ZgTX6`ulY(ug=OEuIT|Yf!t-Gk)fj%iug!^`QD9|twZ^Sc*sp)C$KRQ zl+fTZgoREBu-n zL@dcT_=L88|GC0*fJwp~>S5mJw06?CBMt<3iio?8k$<4E-K;664d^YPqBk4nD~8PG%tc zGtkEP7q1owHUrS?D83_i0N|&@-|BVaoMAD`(HKFcCB*K3>Uh@aS~wVQtHE{zb;HfZ zew`PRn-}d#-3AU9(jCQ5_;CQ|6K2v2;ud<$xmx;>TcF0V!ryEbp$T!SzUU*j@BAFg z#$~A$&wNCx+@y+$4~~tj6{3OO`%Wkob?}1N1-y>U9!ydSDkLq<0hHA2D$6nqGx?bt zm-`JN14M^Dhz?GI6zOuhg%tUbLAhBd1IN#CM{0^D>TgX--PDYYTXfbV?skn|@R4P;T0(cWOh8%&0^} z_>o(1!Dth67KgY7(}CIPea%&EerKG2PkM>JobZ0NcIx#V zd1;_@bg;ww?R=|x?6FyIu+M`3{RW5G~=o$ga4bQ2d#SZ`EhBv>{~eZX)xjoX%-Tgo&3b|tHo&aa?OI}6X; zY*7+Utw9gc-&w<(COla&%yoNd9EvM^=pj|;1(K<|Y`Hf`W6}}f2`;;Mnw>W5qTY9u zOqd8z+2Saf8nwvX%6SsFg8q{$nI=aReDwB}inqK|Q}Ni2LT+3UvaPdtR)KAGrZT}b z+Bl&N0dP8^b_sA`&(%iHe52M{j*nL$&*VA;oO7~PdM{Vw8~qV8tC|wkSF0KMKKNdGq zhwOI6K2wJaAwvu~I}Puev-F^N2fzxj%qW}ZM<+DeV4_zd%GmiTW}+iHy14Y0T8Dcg z_`T=?C3?MNSp~-iy{Qso=+3G%B7wST>>@r4rgf4GeC>N(+9hE>i67BRy$w@UX!w5Z(vF=Z1A* zu<7E5>c%K-rhY>s_AnfK$RFIvE}`un(jTiID8NsfZglpEf~}5vq+Ar`-4szQ?o)1G zA!Zb{Tr7xL?iU(+(D;n99R%&^Se%s0?J$5Bj=G`DOvh=Le3x{2V8IQ;C#EJzV3R_# zBXHlz#$LA-J#3g1V31Q|1}Qd8y^GWRhNLibB{kujvF)Fg}@>4Z5m~2XC2Yp)aTwUwa^Soa#2&O9>X; zI9y9vOq8C_PYJXWX;3zqZ`7(R9yd6=j;8 z-_<$X?Ng@nTU_WOjTL@@6Lh$3?aUtQxk_U z7RQf@S7waIe{1y0&Evfb#ukewmfKIaW%o3O-P0PgKiyO9@@P0L9lGt&P~bApuF{>& zXj0c=^#q#Hc1^{MmhT|r*2K?gM(h5NiFV(*8I0(mLxYSMEtIxKlfYO%u`qG)=@iKI%);#GEn=25sl5?dszj3^lHQ$)s3P%3S`EN%TMV zX_S3n=Re!ho+{Y`LIgn8zJKK))RU#UAQE7bWWk6*|Jn3k-9oa(UJNgS;17Fy7LrM#cX#K0SH}YC}hxKJCf4j<xdL9IE(1dQ*fjkJa#NC-T#2E@Ye`DSZ3r`K5JN(K{ zh88?HER1cdngT6Svz9K+?yTWOu@h$axD4${cV|^9~JR(si1__O41}>?{;u$uTiZ;_2$Se&*$H? zavn!MJ~Sqd-P(j-j+}}0L4#6!BVg;MSK#7(@JF|~X|er|YcD_gOHpI__YpBQ^R}!P1__dkD!9ALzx?kNwe0Erqz&eS_vYTHwY~{BZSX=b2KBhs z-o$BM>klurZIKz&3>&~P6eG`)m!xue$6s-hzs;~jp1`?Y?>6_lE8Qe@^g2X-hYcRO zzRw8!(oe2z<5JqG$$9*yS&PrHpGH1D`oZAiOIlyKhIwf{Hd$X^s|=|*GVM=_g?JF7WG-&Nb$)bJ4b1hBA0S~|Sc9kr>5+J!w8lgXvzf)y({HY`-=1XhemFAkk z{;N8^00GmsD6+~e$@*04k67u?_EhDeZ5=B&+acX0gvG}op~-N7#aG)LgBFCje*!x_Qd-bO*g_ycskykw3m^) zF)v*5KF-|&jQ!3ZdVt>fEal1~+x;XG3`*Fdq6;{B>lVOBuA_NExsv_q{)MExW|B8v zCv1*XmO-;VT5o+WyoxY%Hf|D}G={ZZ$?!t2@bOw?mu zihb?zyh%o9l6K{IgpLFZ=%1d`@J|?{We2ULb1n#DOxbdhel_f|x{x)wu42^c$TM~Q zrnePPd&LshmRPrgC;2l0b^W6IqtWcr0 z=E$uL52{;O-XrfHd^66U>k1!~aPjc(li0Ahb_F-Mu-eLZoC8Afl<}NiyRmpc0>Asn zJ$O(DRZ=jBM_znV5cb-Ymn5{R+y|swbA<-GDqvg-xtkZpO#aRFBq`?Wm!v#ZeuDFa zvIbMh+1R4Yf4x!QC1?J7nw^^*yDyA4SMccY@7b>Yue6CEmXo9N$cu;L6V!COJ{bHg z#lj#f9A?s$w6JtW2hUNJWnK?0$6K0wYr{&8cfPjn*>o#|UoveUJ;msI-4>^PkYk;e zvA56a->vBG0hY30E@>L)e!AiCgc^`1N?NZvLB$9@K+pyj6{Z7X(M0esE|-G)dY^7g+*FKGdjmTtY-L!_x;1qTH@_8Lxv+%M?@N<6-K{1vcEb}4z;}1To6YVp2#{qmiU}?`*DZoU(mbWE5`y3K% zYp!e$!|IHCIBC_rZptV>+-ELI7vC+s0EpzG@VJY~>Bm2EDZMPSZ z-4y30SE@2;wEUyQgo#lWx#h8BhJ{TDcwbVkXpVF8fp{2xD6qlRqx;5d_~BFe%dNFE zH!`b<`o;Hn_u$f{=XfT1G+{95b=?kobq}s@7m_K8uinDPnPyU`(lk%K~U120A zXpW5AbSRAG1sbPMk6yWvDdw6Q;Y98n{$Owx1`pBY)1NPY+~T`Yzc}TpYc}zz>z=Ri zwJxjf=1jb)PTs zp%EE0^2T$8AO9H6+&E!|X*k`Y?1>2){x*CtxM#KkBj>$Qbh34&_VtZKAy73A1- zk8aGL`R`G&KbFc3Cy3Z6|ED_=7@;6HUeW`OP0z0DQ z>{aHTfw+j2<78?;Z%cK8H>)z#KS}F1$3S6eP{I|2e*Zn-F`HRMMsOw%RrS~ZJGiQ; zp3ruU$eu`pg>R!^spXN3~5|_Wu&T5YrCs%E=UeRuvEq#~{4VlYWWr#3v5_zWzr%Bj>`ZncQ&s zQN;|A5Ul;^x?)Z!N~@(QS+2OtcHGNNi#y(EC+B4bJye+?2xETi0H^0Hw^^Rqy2}hNfGHLOi603p^F9^~>#GTyu z9+dozl2dLiN&a3r+ef#|A)s+Kd&d*2H-ja@dV<0mfLwq@j9~jmq0F+Am!Y z-{L(`KakeL&?U@S@vFZoms7W6ZPpdS!T$M%dPW~TZES-ovgQ#fSPTT8LXI!$>Vd+m@Be3#+>!xTO{#aQ;Av4MM2t{!<9r(rq4O{^|GR|$n9#QK`l zpKyf%Yp(ptWyIhw02;8iUW)lHlR+tX%_6s49Gi?#2ckL1OmkG*!ninU41S6Eqnblx zMm{cv*c11uiIbu3-E^m#;(`W$Jg#AJnD^iZ)o?K7FW1#K5n+yZ(lbNb}jNlspw3 zk8$=O`8A)%jeL$tcl)%5+yX`S=1B5$*NJUjGmKj)QhIcMh|h!~lSmTe zwl%V@3^#Qpm;V=1c)X~M+Wxw$j5DJe`S|II*Tkv);w&u~Q_T0(EsETcw+qObmoXL#g;2C~vJ-_$u zX+|z@|KbyVz<~u&7yfYpr8tLko|Fc}GSrE5r>fpr+!VU@muE>J2h_c+8NTUYHRrB9 z@=9?g@FHfZU9$U1i7m_5gA#VQuI8qD8pa7~l9GNfSh+fn4;LaVe1uZ-^QPz3U|%NG zl_|zUT-D$@kFC@DE9=viyv_t+vn9sh}y|%XZPrmZE zZ8!4glhVZer7I<&=U-x!0XMRrOt&qRynb|u;CBw_(I ztRfar8nGR`{OL4m!pXGeDp7_Wxa+WSWj8tOZ5D|4@1GKxL*$1$B(d}gV&@z|T+@G~ zkK#{hy3uLO>rQ0Ud^!#7r*zJ<=w1~JXYGC8Cw@^3-8X%2BBmbifpZoerj4^dQ;#i` zHFp5nRToG1(=e3wyq-3$?W4nZ^&j$OU;Q0)y#}4Sc~XpCD%8jqzYU>4#c!bh3#6ilk1B0G1hYf6 zkTe8d^pW5ueXHhhkzOhogO8CJV?v zJ}_S|sMLz5YYL*Np=ngtCurM zCb~RS$)NT|&UB962z4^k9`uJ!4%&lj&>m?m>+n*90gh>t&Ne;`C9BPsrhU~R-n&vQKn#0<7R~TL$`|V3z80skzfpheoVpucT zEUM*-yP=@3*KD`slP3t|O;Ov0@B}%QySCMGITdQKY^t=&!lOi|;%&E%Z7OIdlx4YR z1!zPaF9;+k;klb(<#x7@JWO*n^@tFz=<0m8b@IDDrV*%~uJkZl<{ax|XGt{$+a+nP zp=nms+D?gzLGxX9G1ui8sR7QhMv(cL>#}f6ntEQeu?z7597yQf<42u0ics~bA)THG zRUogf^WJ=IqXA9jy&CLM)|AP5Llt=N(Eut`8ZIA@?Wp+H_~ryFwWe9%IL)Q;9_Te; zI||zG$ATixs@IO2_x7ZZu>NWHr%ux$;x<3? zG5Ow}rgd;FDstYXO(7MT=!Q}&myOSOCE6tY#5o4qfvzg4ez9g<D z46HyaO4mrcqk8-8Fp8&s9=cWe%W^xy*T2y|G3uy#QU6mF{=trWQ%MB})?TO7MP_L;|@qC(23Jr& z;$z9A9TywvV}XZMUj?^Oa5A3l|6Si@Nr7vNY~}CvKijm(R+`^iuxfIdm)g#M$HI!E zo2D#K7i7&U>yW;2tl@yHYy5s;B=^8Cb(V%QV#1=@f$g3hwtuGkm|Rjc z=|c7dkG+3ndTs|-YN)IQ^JxQWdXj1OKlJ$R{xtQ9om%T7_dV}4wJZ09p;xENJK_r< zTWdQKJ-In#2)Mzz%qFmm$v@XmO&$@*UJu2EI^F2@TU

    ?WgxcneF{7;B-q?lmO*A) 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

    S?3x5O z*`~GIm?{@dfoZsLU26&bJemnCT*Ylndj|HN><@PMz9cHw42U`r+Twf5m>C#2h~u9K z_61?a4?m2!n{)gERqR1r%r%dVqgfSF(JeV)7XP#P)8Ze0nQQL;H2P`#^{qe7HJg8Y z@Kfu<^8CujUv~fVr^VN|_4=pQ?tixUa_g75ISTCR`b1oLa{xIr@x#MyvaF5JzjwOe9LnyE<+X^J5zH zVxwf{!XmtpD**e)+t7*bZ?Zb%c0)sMa*`=lihvk$pIcfmTGds? zwN@BxY?(G2i;cM!5*;?lmn zEBoZ(zkGg^;x6{<*nB}N2JKvRX2ph>P_IEsj_O-_D_?pFAIGxc&*}<)6swLI0pK}t zNe(MYb$dJ-C(b z&%ikt!%HL zYM&4Mux~lakawv`x_~`I%Kl)_B1h0k@tKmujmu`j2|y>o07mvqbjv>>OSs;9vij`#i^-jq!xH0c>@mK9hQQvKw-UY>vj@fO>$Lr`(TIoe?kEye1V(zqjeB0tJard zSdnCvwqr{0DV32O(ën@id7PeF^Cef)0)JVg$pHIP|tyq8 zW1Nx?%1ULI0KOVd^Mp$#qX--^A zIMbzRa#q>I?^sl)aOMgNb=HICXh-odg2h=$GP1w>mUSOD>2IW<564_jP!Z08)IA*T z+G|f8CXs0$pVgbZ<&r|ZdmU7Gn03HOt#C5Np)uC>jnuNBQSoV7Xcs2|NV`+RkH%cp zw`%zC>^iWt{gRs~!$Y70jo)=rtHQ}Mz_H|Wpbi^i+G|SlgpW>>_`=Sz%Mr~K=s`xs zSw(Fa<3Xh`m))1rcdclUnc_J^gzD5+;QOL8Yc71RHK2Gbd+j+=?Iim#lJ^nIn4*E%bS=|n?6RVMmQir(8CYo z@%iY%?(2COuoK70gVStto)J%=45P{$KtchsM0OU-?~9lkdyC8D^G|DnT|iS^i*J0s z`FK5_VoF(W+@z#)j6MA3A)irsZvK$7No<&tE?O*2#(iQmMx*zr6N})(&cg8W{;g$_ z79err<5V(#zeXseRp~sufm<=>aQ_9T;$s;dJ&|PDNrxa9d0PZ8-rg?o>m=&O~fMFJUG`v*5|cCB;M> zmZn*QEP%C(h(t$?*L*;V4NwuF*x>Ty`?;h;tw^39=SLwASt5<(>KD;b^dCzZ-992y zpBO*9a@-fzRtPJIeRpz>r{u6xERe*pG7oHwZDh>`u3a3w3JXx8DWV8ZJ7mnXBq2@1 zZ>1JfuPJL6td6;O+Q5cuzq+G#`v3!cJbu#W47t%yoJ?^D6Y&rviTa<{x#R|t5B@Ip zeotJEO@sg#xm3DX5iK?e`fzZIH(l}|5(Y*9MzI&31;;kuEI(J!YZhePKGo53g{gV^Z=UOP zffgjl1;eB9=wh@9|9EAChk`g?IU2ghTzeou;&7!E#xpwR+%Vj1OOAjBLwuc!meT_d z6T~U@%DlGDbXL?cy9xB~1HY^tsY=#?;&&a3rAvLa?ZQ{tgytJcc&Qx6|}fQT~v-QVPZxnKflY*GnGFNWw%25;gP z-&TYm@%tNEKiTjEWvP+@FB(~Y;A+|3I|(!uiL0)9jCqCSP1l#miuwu zCbY!+tii#^j(WIhjjY&P*$aj?d*)O( zxGIS=t`GlW1gw0WO}{mg5svFR5g?>o(j9SJP1z(cu4KsJRXVrpqtNe*R?WRn=~5x2 zn(0|k%uu=zrL?AfV|+x%J5iTTO*XH8WkC#XMv^1Ioj<6S`xhBxfNjD2T|Y^k&)Eh6#R>J`W%PAv{?t+t&ho4OPCi4}KUXthaKh`VE z!}||!0AS@y?m>)w`(IFLZiBNL!yW8AfV zrzuzPq$MeAAt0D=(mvc)v~X1>J0c#OT@1Vbd>lI76wZ8ep87p$9&hw>{;Sx=$;BkMO+nrI>r>5~S zjha5m32Md}5m!yL3KHa~d$~dY!&zgeee))Fo8K2lCrcnd5pIA zSt%_C6<$4D;#na2Gy)5FY;3qJkFp);hg%0oJ7wE4U5{5ojq>yD7Lw=vR?r=QepFh`W)n3AEs(ghg zod>l?g-MUoPYa!NZ;!`HVWX)sE0mU+?wi%~X^{>4$jl1i`E&*HhQ67cO?BXpr;DGy zLC~ElZBM5QGnonks{`+kr;AVeY`AZxiu>c~;=@xzWeqd-bVgxz|Cz=8`E-TR`RPn( z!t;!R#A-j*8*p`h)|3*$jvX(K(#zSL`ipwQmG8A~tH^mw|k+eD^I+w#%dx#FPwgwr2o|j9R}^7awY)`oC*~c z4CJFUC$&pyal`6ByZN11&E28Bklb3&7U#yGM3K zqFL+Ff_E@z;Ct46cb=`#9D`QG&gumjU%Dna7^O^c^aAf@nHwykBADLr=jxKVV}iwS z@1{t(gZ5ebAY7yB)M3I)$}}L$gPYULV~?kv(JLk(9ezS*(@{_}zJ>TU4k3~wfg`Lq zdvgE@AZSBxb}u$34GnBgl9olV84(PCKbI5qc-=E%1|_oHhBPfw>OFTyJh&K4l&#{2 z!8?Ui1693QC6++V?Ec++T9(DC28(qc{KiUpqQeixh+DjS*u6$?xEtp0xlsg|aBH=D zIPeHdwBR%Y(lTG070Zxi`+#tcD_WD%?N7-5jZ;)t>e7J~BI_Y}EfjZzU*+(@gSQ;! zX1sBFinrm6=E8`))~6M%&K6mmZ3y2q@zVH|okTH_^(ivXXVboRgwLRTt5&D|I$&$Y zc0U_5XN8{uT&Oq&UZOrj@Krt(h(YO4wX$RbRvk^IzB@Bb&4~;7qbjrXX9`gw{%1Ve zl`JbKkeVtPUCF$o;U#7<-oUtnxtd zjJ8iHQZ?margJ)b2^N(E6sol4UszFx&;d zHQI%U3hs@ot%@;Uj`ySrv9^9n#OsQ5a+YJQk zTv8}DV>-8UPWpk#;9Co%~r z$}AS&h2@aOh9{=dW!&r@D#|GWlqc*V-i~$|?O&s!`R($vM;rzVd#UYe zw^qs~=|qxX>{6@QhicU^kSIj`bb>Hpm(a3a$X4+dKMcWGDspSNwY>6WYK4I()+Z+U zcEAY)9gijYeUO|tLG@8cKLf$xK_7+%@A?#6cl+hgL>FtTFILw!c7EJ@y!rCcQ}W7k zd(U4XkmaS7yJY9ppGbg6l_h;qB;E+p%pT9fm2)DwRr~(!1s!tNTx$u>pN*QNr{8@i z*G}2<6!p1*H|zOAfN)6q3g!F&sp+^e<_Ll-(vqmH56}j4QpguoN{j;4b4VEmqDD0E!czxULmh&+XYyYEOb45iR+*@m6#5G%X|&g5T&EwZj5;FA)315!5r(mN(drOS+^N{ZcVUF9t#lx?Lj$L z5@fn%&!hSHEGKid(xM72nG!ao>qJ3@y^*b?L=Fk(RF#I~(unu?_{z4ovb@CC`aD(L z4BeENZg^tX0abz8yVB>pD-nf_?lO~57?2n+?c81Zx)O6!*9pa=FVqOD zO;zVUhpXP`r5f;zMooKl`km42hqQ<^BZj;%xC&Ow^%x2vFp-kp*_eXze3(hi%p{0V z;q+50aAVcAdw@wi-`rWZ+d#=fs+7PzyN1l7;B}sSZ=b!MV5%TJ={`83;Py1uMSJ^3 zA1mkRY1Drtx|)@U&A}Cn|C)4_;a)L3Y!3t{_7B^`?3hIu^M21-ok1yv=ouiD6M(F# zr4yQ{;L~?Qdtc5d!P~)^RbdI(nP{fU7)0sTxUD<|U8Kmclt zICl@$b+CA}d-rY@0snE{{ed%^yTE}Px5i+6{v;!}M8)b^euRcSaT?QD_po342NkLg z2ij*g{dAKAR9OLCgrkxf_fT=h+S&G08Q_x^ZpU8i)ONmwRJdydW0uj~4KvnoZ7;z4 zJR_hxmSmBEeV?%B)Rah58(}`nP%f&PUszBbdX=V=ENpnIm#mza$I23cNgDoig^PXY zUw&Cx<>Ea#+pT`f-!NHdwc=7Wa)URD*Yj=840;cJmVhQ+FI<<8#l|fd^UYlFgxg`xWQufnX6fPl|ntDYGX zpe2y*lZYn_IIT8)Ac5H%4_wG-QogEJf$p>;d! z6Cv5nx~*oUo3T`_(bVe_=2&Kh%xJTe4$#B5g0R$x5Q5}45xy@f3$BeR^CZG|NP80wd51?`9P zPPNV)yhKMLt{NA<#1;m!WZBs<@3-Y#-dX*!3>e~$!E76nFqzD6-`6G8L3JMtIm|du zPo6bT$J}+2R4SE9rIO&JULZcp92o;cF!B`y;-uEs$T~cz@u4c#Yz&UyqhD02-MrMk-VnW%`4AQqgcf(V2VTYCzj$WQ;v({g`0Xln&+X5 zpbKJ{Y(LG|X`PW6avj^4WM5HXcMRhf%@nZ0qZzr&>?HO~rbDgY=;|Ui~GDBeG+;q^sab7&z3u zHYmorFL_l#(kDU6q#G;MCeIuINd<;o1>_Fi{XjfX;NdA+ItQUK-X^(?(0{Vs7{O|K zTgdmu(M0dvz%ohnH`=XA4jq0h23t1!a1=Ebi0ZlFxS^{b^LJ#`XS{_Q^=#j3gyZA1 zU+qQh+6!#AOcPpHt#E_3pX+kQF%=_yEFYFu7}Y0?VDttqaGVMa-_onuk+Jb>z~IU! zz4mDmAVcmm{sWqx7b=|hJD^Hy>a|2Q(nCm)v}L!0MNxx`)v zcShWNizAZU)o!ou9_;RI{<6B?pjsl)-H{VGF>Dk4>`qOlA^S^)MsQlsSN9t0dX-EIm+XarjT;=VWup~dJ2qRYFov2i z!EqPdNg<2za`tpa6ibHabb8}dDvtePV_=G0giK<1A$MvKM>v@_8-AQpA@v8@@@tvlfEMXOT%J!MK3S5X| z0Q{6NPxNvX&H?Ye?zAsvn4T69hj9ODKQj`T*Ub_bFyn*H{q~XE7zx|47sqxX+XCH& zpsH{%gi3vlq5DS?@+?_;y4ZO}d(J)(Q8ist*lWqt4`=jqZc3DE4;+>yN}aOX9n{M& z&g#uvr6+qj6&WM;7< zd~PiWd`&-zs9}5@;0NR(PCF8hddhu9(Q2(eYv9%9Tz#UY zX{08m=j#&)_zT}foTM-Nn$U1!dZ9kC+d+^9O_zv-!`S#HrWaB7_!u{cI7d0pNf^U% z!kn01ibb4=Z~~c_UXCRvZFt7h!Vxki>yAZbMslKSg^B5v`UIk@i%%lTnD44HoS1$9 zuyJpVsLw1WrXSTOu*0~$j^2ze0{3lD-(0Q@&4S2fforY}0f;3D~78Hx5L$H_;LmllEdCT#`beiytC)c3JIaD0V7@AcVXA1VsN zJiGyCE`kQ3kg?)~4_N>jgaTg~_-`xonH9GP)VC3pq5Haz>}e1+2(dwGEdpI3ISd=T zm5~R|wjD6u>0B~3pWb*P&ZRte;VJ`8C*4yd4P-|kf}t&VM%nIM8)FHBETN~|TrPnk z0gs3v@4}S+Xs+u*cQmNWNv#q6Ix%lpa;NPgEqOH zi98M2JqH-pozo&_8y0hUG|CddBHJMDlC`IkGjt9I`Y0ENy}o<`C|*=Lzhtb2V~~4( zPS<6d7B~J0FrLa5h;e1J8evTwDon9MW z1N|wMQ#fJLB}2U1t+`z{m1a7RbU{@cHW+E1JM}g&WVB6p*2m(d8W<$^Ja_J0sJndE zLYl}W9n*KCJvVX6LzkKxU2rG91xU-|G8O7{(>4E?wcJ1&P32{+Ya;>Ge-%bVFl3bPh#;6+oqv znd2GYffzZk;PVnz?uUW^V=d5aPf+n92}&6!Prw1y)^K#iQCIS%Vv+EaKz#u*JMmAi zdx$=$3am;6YKeS@7SxKQ8fZ9!7C;uBm_Qo)UYqfPVgq(Ya_Y|QbWYiWQ1{X+4(Nk( zN_`=%$y{w*$YIn0@?x_l$l8+Cjd!{bhGCYdFN7VLa#Q*R;hd=pa>tb{l)! z^_9ix#!j=bvtM6Ynr^iA)}GfN%uhEqclP({3lH$4SzmaBD!<|f{8AbVPdA^{Q2}j! zZLHOomZuv}SJyY{52qVz&o{T$>+=iKjn!wXn>+QD>Bh_Ei>>viTg|nf`PWVp2g3Ri zs;;iBHClDl+*p0FwO?P54)>pK{al9#MUO99zv0((qw(uz3&r^L>w4pt`U8|P)cY^> zB>{VXeRHqA47fL2{Iw{6|FXJOU%(hU8=G5=`Vziv%dbUkvj1Cs83^tFy8je|JV4_O zqO<^DcABl-wfZtzw01Xl8}$bmcdxn8s;{8IHXd93Twg?eDO0_4cd}^ zyL-)jupU6)2CHm7Z|>F?G3t7AAOAxYvdii^$u5KKzu4LQJ3cEVHpq_{0wb?ICln;{ z=2NgAexp8qqj4R=O@6o5cJP}--h7H@b@&aa@LO0NqDWButyN#fXF85=?~%!1D|^ zVSQr~R=3dOIu;t)6={$Gz+M9rgugLoj80l#^!P>Ete_<^+>f8;Nmn)pL05lS-Q21J zAHb;8BP};uM7PelL>>9P41h2%+p9aj?KMDI$XzU~R$~u8g^T|Ff=q=Udm=!vUwwQ`p)3iy@F>*81(Q4)szD;6y7!fnujf#FH>qtx2-62~pC=b> z>XKdT;^%~iuXE!xw}cFTuq>oD7#;$Xxf{WlHhE+)?U z2Tmo%eYv-ZWxRmsbd3;oT|r2^*x3zLdOZ&ewFdX5jnk?UbkJ zuv~L4nT`$m3FA%i$)wt=Lo>3FivuD7U_t?Xabe?rcOY73T`n(d*d&~MuLi@;!4Z{E zJRJ`WO$eFb(&xN+{XnUupO6!&SEz;94Y*IJe7j+)1*oN2oFRJ|keHbLFvv|{Ajj+4 zhXBW2#k}W%9%%7dwmS9mfb}roR(&P0xL{@~8JCu4CM}ke1ZO1lM%u%#TO#l5mgEj& z<(Zg5>2nj9Mq_vwnJ`J>EEs!uz+rOAP)M+xFaW!O9a$O)Y>E#EA?mnnlA(t%?+V zw8hn}=19V< zxnFo*1AuUSpRx_fZLimoH6rr_%e)g1xX_V^hr47i36jKfi2}m2n>yB$43fe{sDu;- zFmnq-!UgT3e-0ayy2rYR7bpQoreavjzNsd&eqdecqDj^|2 znB>|kV^Aqrt8{v3hVc_q{w_(6UUI(G#mHL<(@MB3SsSFZWi&uQ7PQ&7#IT>?J{=6Spiei9JUuHOzZ^tCF_c05*)#yZ55$r{gS$s zfU|yyPL+zs&?P3V(7DAUa)lkI@E3IJ*avxp04JMDkS(ld`;K&ozo3JG((qY3!6h>9eEYaM zgPEIJoZhq?@rH>nt8h@ovtm_%f7xgS8R~WuECE#$lBlbJmbZ^w&UhRaBTqJx3|^`j zXQQ{^xXLL&>loz0$gMPfL&Hm*I-diIblZJ34A_gPmc2oES{NPB(#TGZ_Du7gk^- zofzDk!1c|5j6Syr|o}PG*FY@CZDl9*E$RhlDfa?#G`Co1J^zhO2L>ujJ z9e^I*^PBu?qZV$sF=Crd@e#eem#_E<4^2RYdp=kK_WNp=3}!kk!n`OT9<+;L@dcES zBz$1h5$+wl1Ej~7)&@CDk{{cpJz_Lyv8+vc*9!4o5QiT^2&mCd7ocMLtAQlHV)iTUmv>a*~2@nDR~05PE> zaw}Ifq;&)_@aBSLPAELZpfHhT9jxfRoKo)$sUYFn*Sv};#RD0~hb6PYZX=9&1X-#w z@CM|ng4_7{(#w)KP{i<-EMXDN@x+I~l7Ykp{)ppou@xxc3>qMFcep+xLVp-w*#t|q zqE0)Kexj{~cQ*KhCmg#lZm9AmTPHrsg^yh#)aV@5<_)9RK}wE^#On6YFD8-gB5mTY z(lyeA*KJ%O!5Y-58-P8qff?#lEt;`vNGHVvzBqQbK@w<$`5gXVg(?j9PjUGt#TScQAcU$Ywe z9(LLT2B1X&R--sSP9>c>Lfv|bFzb2IpfiJl(YOW~`*9jZ(Szo0W9MLF9bND{CY!j2k6LpTec$a6S1?qhV# zNBY_m|GIb2!Vp(5bTnl57`{3={ynV_*40Tkuy76|8^&K%hyTTxc1kR?(6caBToWe= zUEEY+A`DC(QGZa)ccE2<%#{R}HHL0CTG~3r(-eT>vv==if1_bsyfwjgcaa;yxl7lk z(m(EaM3F!e1Uwco371pfHX0Kz`Jq1no|^P8i-U^V+@lBch=nFgfBwd?_+|)7dP)*W-&BtLh{2FiIkH?S zVj801vqxi4Zv@oM4PwMixNoq_0CErc>gfuL)jnjX6h6)In-YF`ZwlU!dln3xicW+$ z&$2Qwf5DcbUu-_ku+lGR1OkI%Ev2lC#@g)F1#>%S75w&#$bzkfI-)j;wFs1m6L7dn zwwjkzL7>Ij+S81aKk+*nYmo?-08gyo7Q9ySpRv$;{UJ}DBSb}^Yl(5~h>9L0*@sD7 zq~0}A@aT{!@rbnZCYNI@*5|r-v?oCef+dR#$p7QE=dVM#li>bYd&h3b#5K5{;oY?M zJZWG1X*EY9m%~V_nQxvfZYc1;JA^WoF69hN17Kh#mFk6lXIL{uHe~VE%5nr?Er)B^ z>o{y&55<5KX|GlLzylj{3+_y3?LVv!5|Fn2IJT(OR4!Mboq>Og>U47Yp)slY(B((;zIH~*!9b|4?jTU$&L^Xx3+12p%3?c&b zu50oEQ=}KG!!QZTl%b{L7{w{lfB);;+^M<-erzrq{|)5G1u5Wy3jI)&CBAz1?y;9p?)31q4leX_VOwy7 zt4%^QQ2$n&SfOKH^zvY(WTCRIFR$PpgV%w*?&)hjU4f3x^jCN`bO@KnYdF}z)94sZ zIj4A+32#ND1|Gbz28RTjgtaghgy=TS9t z9J$NypIkJvBGPHT47p)UX?g#?oi)cwes05Hu}*@of$zK%Dkp5h2@D3A4*@f>h$yCr z4<^o$c=ng5!>o`odRQn0b?B@RLD4D>DY<CV22@maZ4aT>d(rXFcgVzh=q;NJEJ)N z5j)2uHf5~0oVWqG_-HD6`bxea`g?2PqI6) zX6%wRs6QnvLh4BGuopW4Vu|O0b4qg~cuCigWIc9m%pP}qZ+8@$v^T<_mODU+@$|P? zp(4oi+p?~HILFZG+j(jkD#s@1O}oM^B0P{}0$@rPEv|hy?DwwlN|r^YHE9vs6)2;^ z12EcqNVS!vINg#)xgFKXCh32am8iP+WgMjpI+0`eD-@98LMNd5A$&!zU^lo@bNQIB z^p8_7Ir}xz+4(`qA}iED%U8dL&g3W;{^A)9=MBsPlHib=h59^jQFlLyT6=(ZPkEjY z>Xzn2Q^Z-oVl^!Xg7PI-K{iES#@Z|oaC!bur_`;4d@J1z46_r7v?WC@gH=?z!?KCO zE1PkEI6x%4i}%(-7_K|1;yrMkpNf9ONyvw!FwKcl93=(Mg?yAQ6$*GOLmMp6HrZ4x z!K^0esY$vpR=IQ=WHYq-Qi1$6WdL#2SY+E_teTSqGC3*wRmZ0!Bwez6FrUsPLgxds zhbXbaws6c91a(v39?NSwnGh{VnVR5$p$u@5Q3KPXLY%tj$KdpSqUf%GquM7hh$IL+ z&=iB%3?4CvR>*rFai*J^Dem|55lM+eU_6_NkPhvm`&$_5CMPd;<{artU93z;DiH;p zVYt%tjTB2UiNXIqk!0jPELh{Y;=OO7`g25m3Jch&>ukm=gyhje z1kv}xryWO~8fs7D+~X+VHsYq%ul3Dm7VZvwPYn;N!V^H zI7B*5@Ukr6;q!MBmJvO(Sg6F+focFmZITy9yt?tRo-Hjt#1%v~x3aQ=n+HDtPbDb+ zi=?z#&VBu7&KWG6bvQSOMsh5S;^B^ZF%BzlaHsYafKGEOaEdM7RVRA))JaIq! zM9B9C9pizZD~)urBBl>KYl`6y zW`7XI$aif+v{?NooB>+k}9wg7J$11w^`G5O#3@hjr85me>MJtCd*l%G!K7H0`0h_;vCY3=V+;0F(IO1uA=2q$M|Oaq zPmCC$w0=qd&>ocqarmI!Si<%NQ4`kyY+{P3tU@9XVayA{idEyG9jRU6_Fc!pqANYx zWFr=(ko$)29r>%euk!P%(tJ|0RUn+KZI21GyE|@JFWT`ZWs0$XB~pl|0+)6iu}CpN z5)F&`Ji~TEG~?iwjOB(>^;=XGH=usG-LiUM^QA>W2w+?`gbEJf;8fAAoZP|RvI4*< z$~)vpBT~>S+Q}a8!r@geWAK7bEn|mjF=}uK+FRLTE<E+-+)w-GcVo6P% zCO(_Ggw#jVkB=n`6*wdKZG?@t#7~32c_mjGJoTU5$|Ztqq5)eGbnMB$UpDml1+Zuz&Ak!+RG z{QAi}nsoi|;Lws(w~P+)A&`~(a>dbyOJn4@gl$z2Rvk=OgVX2~!6ZLATxTGR=tE7o6 zI94#r4K7HxUT}%8NL~67@>ng9YAzxq$%Ke6{_=Y zv$grFq(^dDUyx`g(>T8@mf*$AAQKHlq7J~h%=?)^BYO85exrDdcJ*FPSy_!4Vo-$^ z9{3-?4Zg#t!(nfeE~tQ@LXUB@&=7H`kCI4JRVM?#P58ODBCJ&MYnFPu7OJ_fo5S_N~vj3*DPFenW(c*5eOd5qiwh25d9VzOuViVW->h+Y^ zp`&D%b;@4ibi@5l!u8#5ofcf8RP4DOBicIQTluy_vjseos5aGPP-V3#4dGV=K`Pl7 zA9z`4oO(%IaRR>Fkif4N;!oIR@4$`N^-%B#xz%QC$Njt+NOx9{2$?IsOh+!=vR%jd zExT7Ft3}Cmg}Gxr(YSKQ20rwHH8a(DyrV;;uI-fbL#*TGK~~heY`r~@yX;a2?5{Al z>fl(lwn`qVJ4PVOMUZprD4j+4cYg6Kmi8#qhhwMN#c4{e(~%OY;a?Co@)4ee(hf*X z(0%-ue6`NF%rJu)J-eu9>#$W}`Ms;fH{I5mzE?TDc1pn@QqOS+$1U*5Nv@|8?^0pV z;q>ZjI6drwYg_UN5pN%jfE3ZC^(++C3oyQ3vzkhPTDuY z`Oe~o7pv683XSfzEIyiBgD!lESBdJ+kLk%~IX~iu3+4_m=2&~g)LO<8MnPT2-f{LN zZmAavhyb5s7P7dnZ2KDnn-ltk%>!H!d|-2q*e(T!F65cC&~x?S6TGn)&o+>@di7N( z3jd*ffOC{=?*BtJ0FoJuH#)jY)rwn;F1l9YiQtq@8S^e~61Oy;jhIMxB2=->g>A2C z_;>z}hM@Rku5QxNuk1p62r5!v zwn)J&9%(;{&L)xeQvuTtWpsX*gf9op%xC<^N(vI_-(?27Ehm^gg-KCyvHZT4z#HV6 z-7@$*KaZsl-D|vs5DkX4Ia5?37k(mq&fG6L)ty?|)M)P@K zGCewbM@+pcnea# zhCZr~rRefX2c`2Akg%dwmX{Y-rX={K0JlCOc3u@tD(*^16LEPlo=@;fqQj%+KcPQc zTNAKiB}r5VKX*8!zzYDLY)FL5{Pcl}?9@Grr9q#eoX9o48^*Sw+3vpNq%{NMy@d1@ z3T=;kS^*bCJW#`xK$I@R8V;g#5pq>0Djx2Xn~YUM#`YogEa$N+ud$guknCDTRbSn9 z6PY0X0!8QnqK6epy9w{V4ioGmIcC6;0E9^|27txfd(L$@*kzpz2CqLp;dcqaHHVkH zy+xKWp8v53F7TEPKaq48Q$zVKfdb0 zGYtuL_aHNP1{_ZQu7QC4t~{UH3fYeDrzuCIfn3gqzp&|~0r{l9>bVGLku*$2iuf#r zeqNFL7@H}H^I3iU<+pqWc|)KLPPn?Hu^&SKyFEu@Dz7Bf0n!rBna+~&s-{Ub*4z8QB;!Ok4!j92lTD=EbFvTFE&(zSb98&Hqgt<>iZ41HxuSD^M<+MimQH3ok5VwPU-95lxPEot&~!)$=HG zc9Bb{5!l(N7Pl3wD2g;zI{mYPO)SiyJShuVU(JJcPR$)INwiDH4{ZZe`!AmBg6Tjz z5tg6v%RB9?ibxeJn8+MnUv?zqaOtWdy~3Khk+}bOYe4G}Y z{L_~m14*7Y-<91^VR`;3mS0Y9tD66BW%L6#5JGfOGPm)@m z<8lYc&u}YGyTyUTi$)wx@x1DDpHo@UnIqN5Y1kP0>D|2!n%7tCy5y|L&aBF@Bfu@U zFo<7%2u1@x^v~Il5x1C0H)s;Ez(YE}K<+9W zO#kl{yw7l(qz{NGu4%u)?I;?;iEVeUxql!g2RU;Xk92ggMhm-$a!Jl8;Z=>h8hr-sUf>`wfAVhIi)9D)G$Eh8LY9XHAE8GwdQbtL@5; zD5KG|2U{fe8fsQ*nU_mUiA0|tIT{!N7NbJKT8P@+lP=aX45AERuaBykc*0PWsrEy}THaiy@bAN+WjW#O{zg?{0_^PlH+1+i= zfyVw55Aipy^IIN9%J=SywMI_2toq4oI6YFD)yAH~O1pXIv`fbjifB8`<&sLH`x(=iWFhz_hAh_d11gL&MCL_wO1&Mz{HIsi}O|T|+e$%u` zu7djm)sPj+4}~Z^tOxrPM2j42)4y5!5Kor}*QN;xmR8fV@8!wENs5V*GS`QN-IBAR zc_cT_ks}B0nE@R7v1AiWBboMzaQRS}A`($f@K_7F$09kj%k~L6K&_z^c2;NUQ}?5M zeLR|y+QGlw48|Uv`oeR2`*Mc<+B$^0sL@vFlb*p(~s#1;N%b4)41ny zz2m2;TO_(V;*jVmS%E&rezCuy!|wN6;_6caOlg-U9&t)u>A7^uv~Tnj(T%hRIu)j0 zw-U_6xPyHelOH3r%U5G{o5%B3te_+3L$Q$h&Z&yvjfe%$K}O8}Q<_{jH#PP%bKU?qba~b8?OdHnRm>!|4J^(5ewa~dDwap#7L4XY|HoO8qpN5L;NKJz!e#R zU=f~xLF$DKoZ%$)W%xuG`Kg#ZVY>UJ+j*yWq#OuFNQc%b1!wce46Qs{&P;mS!9N&X zBw9M0+<0+5yt=sP516JxriW8iE+49R6gN2U%ySisk7Hi8)b#bckj0)ldw=WxGlg^~YitP73*u^(Bvc$#uqmOSn#QI3(tcNDhDqik$bAEEO&~>{QP*^l>rW zE6-clt%y$hu5fiBvK^bRo@b%m7%a#RH!?eF`E;i+xPgp}Ohr+gEKuIz$!*k39i;DN zXT5XMzUp0q8b}7$A9RuM*=Mz=S!!T(3CmiWoV`4|uoO(}{VoktZGJji z#3MXA4cw{VA#}1^8O;6`k1Gi5&4ZSys(SCps}j)J_oiE`&GlwI8x_^gTTFt- z2!UzxkO$)CDR6mtEuMnX7=O$Ma)7i$+@TH_x3P09p~5a8cM*^8>hc1y#IA^>>%1KoPsc_xOLINs%tVa@9+Nx4M1~NS@JJ)qn^%K4B1TX zJU|~jryI%F@AeE=8D{#l?GWrcn^ zz)ZqJ&@Tw}k8r!~(ct<5Cuz}0oVzYn%%t?yB(A^rr1xLiJs1(-ydn)ev*r{eK*ovS z*?Vvf=hegPaL|8;MHx*2x)m#Uy4^vBrPNXWj{7W2o^1|pa+!&vu688c0;cv z2_`z~tGVB?5+Y@ED-JZIEN|@mvbopX*>3FYA8fV`cAD!AE45?=5M7GmKWH_;^#}gs zzl@RR2<$dcSSK`LO&9`uKq34wr%u})fQaxN0=_igK!VmLwZIA?S`R>T2LR#`E=Y{Jl0ml_wf6(MEVXJGi_Xu9%Kesu%#{7L%Kb53xjc z*aVNlguu`9sDITvrk5aeuVcsxobh3>%DT+!bOv7zvGPcW26>5~{ehcck)p%s@Tz-B zmpNf&5ocNhi7w&g(K#C)4Z0Vw+}}q;iOy{NdlvcAdb1CZ8P{Ny0GlUz`w*H{Z35W~ zlq#o#_QmV&5g-tq3jjcg6EKo)W*BLE*u@&dEqCu4CNMnk##M`iWxVcRAx9ED2mAEU zL)_7`js|K(?1~QbEQA8hQ>$Ii1NUjn#D)w>H`R`xk@G{XdXGCUPY(_>kom zo7s=rJdJT#a#`dMRu|5Q+stP+Cpb&zysH+`-Y< zI3Y`IC_Eah{gUxS1|7~TEt!~2WFkAGm$60I>q*?AF@hBax{pBf)D0Y^sWt_LTC}nj ztgGF2??$Z*z>VqM50}LEcwX`xJb3T`c@Czt2lje`qMSX3 z$P8R+Vdh!t!!{eRG^PV0=rJH!p}K-8DQfSrMqESMotC@#5Ja%DTVl~kpMU%6B7U`g zbrfcME#e!BMk2LXkrZ9(|sF?V2U_gu0(45@sDiYgmUOs!Su z+`+&;a%CwXIUrm!B5B*jHgJ&sfd4nFn6P}11DDv{kylq|yy9pE-1d>I9+C{30q;9y zJtNv-P{UwXgc6R$O^nY^)2o{9IrkLAsa93rXPA_ef(SgkW8~|uVO&Nk%mYCH0KkMq z)C7M{8Ny(Y7P!`;Cd|QgB4K8srfD0)LES0(8u01*jL}d83s@M10Iso|OdzdnYu8lH z8LCSUXEFpR=pY=gduaj?a{bs2MCUo|;GW+{@a3I9l@yW15fAO1V$n7SIA`4X>a*8q{|^mFWVCo^ z;dU)Jcu5N)nQ!4zW(io{MHt4;$*#N4(8ocdOep9zUTK8txXqZd0L1P9p6?G9nTr01 zn(xpxsO}Nq`yLl6dnD?~B=>KWH+#k5EE_6whK$d`5QO2Pb2LNtFsV7X1Xh<+mRxgD{qUZW>L8NIR!V6y3|< zXfOXpWVp45Lj|(vQAKX-?d{-^Dvsr?d{=7eFcn^*joL1x<6?a`JZ|f#)S-4dHpf4N z$bOUm9K{{0*uRo(J0Xul-*zSCK0oafhuU_d)mnYlXuT4ce`o!$?B(FUuP<7mwqYZ| zi~26!N+T5V>rU_DgYIcX4T9B2Nm_{AJIU0WWiGWMwrUjZx}Iw!=yWzAAWblEFfKr^ z7`TbHCc%43;l-%1s>U~Rh3DQnbwbJ~5SnLgDmkmYo($n|wo@5-z;Hma7-xY0WuKNd zE+h|+ri~{T$(9Qk-F-u>KEs1Qo>9`8j;2Yc5d=`Yg;T$$9$tO2-Rof& z{z5PiwBPn|DNN1eH4bf@+d+p$15rC9pyg0*q`+N0vXUrT{Lwu>>Bk3rua=g6FXXYT zaVe$D0C-Q~sWa#v$pj2vu?i3Wq(Op=HjXF>MM~N#`O(AVkFHd)ru0(w|H)jhM{_q) zWYG+Cw0Yh&LGCQH04Fbrb%Me|K@Fa&B#o!TK`!xXi2k)AyS1$TlF(1I zecW}5vhRWfSem-+SMJEr5E(`B0#%|r;D&S(^yCN0@QuU9+io9$Qm^GTXXkh(+dRpv zZ7a5Q539xedW6^L{WG2@F*A5>4H4iX;ux=q%AbC}325&>P zm$$Nn0y5(*ZA0!z0?eQToD=fSd!`EQUV>PB7p*{F4Y3Uj;$g-p;yf<^LOq+o4<%O= zSDh)qoJu2|TRJr53rm|pfJ-y{3yGDsk}|fkBvRIHrAO1q+aISX!pc>m@_CRT!4Wpl z7<i)$QT z_iy)@&8}8LUzXA_?r$QMD;!gNt&h_nD0szqT)_=u58I8nt-s`rrX7`3JwtUcsPTd$ z4PCP-Eyi=*g+~jpsy$eYxVUPrQ|X5JHkVdn6=ywRng954`VS;kq2oYgEJ%<`u!Qi+ zp39Pz2a{Lc0F!}NXV}9GHrd{FO^>Y7fthCE0&<@3jhAig0e336Q)7JZa~OBWAjNC3%V{}GPphluxjbtzd-BK$rH7Vd_TI@dz(2tcS0z(cS&OSo88qp;LO zSz%DwD8)(wE6pwjjzbWPijHweC=J_#h<&({QH3q-NCP|WDKJ~@;pJ8?+%EY7po2O9 zx{Z_{*9wpG^osU>R$>d$6V6T_sn5_IrCJ~r*9*R0 z;pUSpV7hTD5_1*d{zUX4x2Q7H04FJ3xZ638WUf)<$`1B*wQwQg0U{(|?FDg=zilK% z)p9N>&HTxoJyMZH4H0EkX;J+B1L|Q3ei^rL zOr22lR*qsdJ1KHHy|+TkF(nZfOyknju9VYaSIWyOlw;kht8T$X^cz?$)P7+a#h<80 z*?@oiH*bkYNNrf;tVH1Tf^xR(lB2gvxAek3wBQ{ol~2@T1A7Th{0vj)z9x}p^cx&w z$OuNFncWz3?sjs&6Ppd(VmZ+^)l?1LB;}=?0e#cS}@Vr|ZjMNc4Ufx;7|IHb@ z6`m1XB8cYV?9Gu)vTSUPI2aE*QTv1g)@yw?!xr8(G!a_9KQNPYJ9E*$upKyUi)G~r zv)O@vN@8@21;}J&3TYY8abHKOU?o31Q75tye`Fe+sgiduUrKs9SGg5eP|g zZ?Bc(L|Tdz|7%o8zgQ3;;-t=YoMR5>^z&Ov1h$~)1;?O8HEnch5c5<)qvq_q(!>Q> z9MIe{Piv|s0jClSMU#@6W7x>A)rbcfK0Q{+>j1Pg^%2tz&nn?J`8d0GuPgp4>a8Mm zkREQZ2E>r~wi{-c{buSb{e=E4cEq?oWUm(ou^CKDopp@nK&{u3|(;$aukvoj8fxyCH!54K^gtSxg8GqwToHg|Zx^ zraaQX$q1{CgykVNt*Q+%F*8{XFiYV-w;A5Kh;3B(=yMj;%D7=5IyJQBSsb4dh&$wM+$-#pqjJT zVDqs~A;NYy_6pFQfd^(kfFVz?cy%BvGax|#I7iN^#TQm$yPUy`4#b|3Cs+1^7bD4* z&rY;iElJ?Y?~&VcXn+*f=Ub^T(vh34L%Ka5-FC0!6}2-tz& z^u+s+(8M3fhVYM$JjIU6)D3=x83A=Muq=jD<6(J~^2{<`y}?bmGOj_{|m2PICq91D9XK8*Y2uDPQ@zg-Y_ta{4{Wu!7^2Tbr`_AcP~$5<-b?@vj3hq zNNUGv#S|uzBJ^3DQn%9N6cnOyW5(8@io;-oge0RnchWlaZ|f!tR5q2u0v*ZPd00Q0 zTl1z3om;mk^R&#N`ETRR;^gQ9j6AkM27cMhbdwng%Q@b8<<4e!=@HLnFu!%)2EzDl zm^QeoO<0Xfy`JA=^>*q`C<0(Yt~6arT6{_u7`cRpxr&$9@ZC|t<( z0uFa$Gg;EJ#5;c1AH0D_fWGbEA2=Y-FvF?RW)4k%BJ6|FJW?8IVvB6hFM7 zYr|R~&x0*wP!7ODf%e=XFXdpeG3cMQ^Z_wDJE*bV)u0C}3>n2xg@Z~V?)IMYF$Q?a zcIq#H0vSiiw8)M{MJserV)@SV-6V)gA9&7jc=O_@0%E2tJ!3CSqhRDb-*EsTz@~T) z!M2`k`)*yiTAo#ch;qzZC8j{n8)OtFRrvhq^%Z9R*gPvod~p9{WJs48ah_8du15Iy z0)2{cO!&GuxYqDGnHM;C4S-JD@8E>NZ4D-+bEzke7LiZHISWjJ7V6z`cQ#ChfAA!5 z#xeQ+Db%431rHpB?q}@g3@lZcV5uXBl7$eWkt|KQ2oUu%?%DBZ`8{vLsr$=E7{9T! zqhD&AKN2niWc*Y}t(!c~(#8j9QtKYSPmv;n;A8faMeqJRr7u4hG9raNE=W($FkC|s za8+;xyQahv1+?t&f9W_<&`M$tm=<_Jj_LvzPe>qpsE;=*c0j);unzEpLqbieqKBzh zW^{8MYwi|O0vYOJp+ISCKa(B-N(F-)B=u?vKuTYMUJKBV{)h{;b(50?_YaUPAX1PRTZ@~_{8LMgldKlsVsV7{zQnf-VkR&xuH!; zL=M%Y9Bx5yo%jj2%X1QZ)qMOhTf{f8p7};&)Z!ddujJ+9#F~GGCK8evO#v7FJ28{N zzX79Y{Os6S0+Jm4G09HeJjuW_ScC#3=4r1pynwXmJjc#~uNX}B_WN3WA|~=A-?J|| zcy$tMlzeRuxuLW=gSYet1XpW4{32W>10j)e=i>7I9=zZ>LyW_7mTv=EOvnLYBJz-q z4yUr=vww6iZZm>MrQt%Slnio;u4IfHzl3#&aTu-eF8?D!ZjI6%4;20(kE;Yov^C9z z1@MB>kOKyKwxS$Bf3%7zb%~s5Ne*^zx2XkyX0W;79oeb7s-+yI6B4d&U+ir~k*}0F z?*ICHk7V(SxW@ZkdgrApRZqHd_X}Z&!UDf}pJ*MrMuwB>;5ax!;x7P)-&0g|;2kG4 z0ALautaE(Fs$par5(F)NGKk+tD5%1)q8GCJNFWa5`ftB&cYAcMyh8^jJa9ZagIz@~ z&fSQHlA>Ypxk+7A%Cr7IJe!Ncqz`xLq@cVHyfQT9PPr48jc46PRU61q2tV5ZA9!Su>mqA^j6OLHBijL;~aqBEFos?1$ox z`5-sBN7eWp9df;5OQ2HxWg<0gRotr?=q)*7aJhTJ?yG0&B+S?CYdt<2FG|lGY(dx2 z0ld<-k#UTz@;vJ(nyXctq{G7OMGvQd$DkYa=F2DV??Xxq?yDbf@$k!{N)N zxz5g=Z%dvlP?pMa%nN!-k#bIXAk)TqtEm@1Nc}<9#E+_*{X}PeLD>xL>hnOK1L>1Bd$C$TU}PAFEpvQ`IOfjy{-0x{MhwGO*OgfdL1(QKkf zl%++bDF->XFgWrKsBHQ=+1d~8Vxcf1kaX>eDRvO@$EwQl%M1k1{; zMG^_EjmgIX--A zSxx6xUJ{Cl1p=8_h(yC<`McMB1`ePN1VvN@__YT0pnnFRW;*9i6;)mMS(Yjqm>p$D z;T178h$YJ@>Tn~SRXQR)Qw11?E_y4e7@%kN=?^7yQza&ZDyS^+<>o_8P&6UQQw<@X zz^N&kgg9_)&C!Qx3>+!M_gai(o#Rvu$w_^I`5>SWC)UEGl`KWW??N^0%Ac20`)n$kY9|Q6Cc~aS0l=&^a>ENM~;Sg ziJfp_Mi#D*ev+0uC{h?v0M+iu1e=-5uWGF+wUTqEoqes73O9bUCw9kZ`DSUOm#!4jC5N<`%!2$SOGPgp@YDyaZ?&ig?@ezGMQ-4r7nt={qNd!YSDdfwa>%w_ z0n`93JK-%0fC{(hlv}~MiXJp@LDNTM6+TFjAFzGwQ$4`{+K~4+AL60a(Hk|SZ-y`| zx(%Qban;R%k4U((ozrdr5Ir)g3_r`G8+rEPp4@RqdDH1!h~!TCLJpjZ%WMp%>liaPy3f?3+J(xXJtY|qAIwMr3s80Sn2~_|85=~v$q7OX*B5vc*BJ;A zxIxL*EoK6Q1nCMjIlGbyQ_BZX)p&gx4_Q?*k#tGLA=C>s;OC`7Dh;y_8?7BQPG0Cz z946w)Q`~Re$r_F8)vDqkgg>$2F%+I!!rY7_G+fJF^eTC!3DV$N0-HJbLG_KG-$V{R z>4Fe}!dzI|7vpYl&6_32LfonFvm+J%5=SQYge4b2jm5?Hg!r2B2>U&uom&_%4li$g zBOmztRSx2w0Y^p<{I*~L=cXs3ARR+hUi$Eano^5H<^uOqOh!EyEpR{QBSt1S8bx{P zcAb;-2?^ZyuNbe&hNgogj+o`97Tg6McTeDW6BE!3^Aw4M!#*k)+i@&9U{P=j)AK)G z^|_o|y788$VfrL$-I7+3ll27W*&eVf$nqjRh^9y#1tz4&fl1dlbt@)5VC9UsIY{jH z!q#g33unDtCpa?tA$)k@#E$Dj4zL%1V12X{z|h|ikN9Xn;rUbF&uDzCFnNR$Tv!OK zMR8T(#*_Fyz$_=8B!0wK9&jnJgiH7PlHK@bK;&jAQ6$wGNj2B#w+V81VlRGI&hI4; zFHb8q3v)u~9L%O;H?u;f@YyV*ocIWgMS&5i;(B3a|IuGU?&8^$T%u7leA-PU)|H$d z`L9?-^&yn{?y)=X@=L9xgPW4>@U@jtPc^=xJU)e{POAU<>#reyIF;ax0pR+0%ZR9i zaOFG04uHWR+g;ng2AZHTt*>-Pb(QfD7LHjLojyY6aXXOcWs-asN(5vLPPIL}vz2XA zypLU+9@`~!8Rs(2Kt59Iu%o6GHD5}nd_V{BiEuY~sf*jvc=Ik|9^O^b62hKORn*DZ zzF#vApE{a*%P>{p!;FANm}qd+3yCANcXhtrp`#!oq+cV{;zhRA?vW!ipQ21#_Y6WefcW| z9JDa!Rn?r3i>wj2Bt5q|$;@YRk+;$jDPDqBOweSbv&4jAi_0Pbw&YUXbLxmysZc1# z;~qjdKM$wA*G}gHla=(E-xGX}=#ne%?GRU1*642U>J&UWSrV_{LW=SCb*PTGO0uOr$YP-OD`%$yb9-X_C=>74n zPfB1f5!>8psM*y}-B2;mI&FqoDP5EiQotIdw86DxceFiWa9i0;AR{Nh&7yO>{xt3v z79h9VyhFAAJ4km|ndW!*4Yy;PC7)p?degluD>)m6uO6w7)9X(Uc2>6=BY~J~Y(vr> zP$0UoCG{0j3go22UmAO@&E`&hVUFFm_M3YR9b{r-bE|Q%zPi6UF+GGBrGOdk z_bmh~6ApB`pQ{K;%?RZ`2 z9rx(mjwZu<5!0R+Q` z{=nTO%n-}L)`l0d{u{W}>;CwLs+`ah6GJl{0&%ETHD!;}Bv$MW!>QCTXXIFl!Q5Vp z0~`DP^uf}tHer}BvKu8%w>h??>%_yFYw>ZKCle90^f&!3YX5zr)>B^3?{f3Yr}R8F zaSr788}zqy@=EyHR7e>+ba880oZq#yp<%dB5POgw*QwNVFMDbQ-w(e+?6$=vrn_2X z=~UcMhWytHQ5;M2LR4%Y5XCw17;Bb`$5>v;MVu4v5v3wpgEZu~6gEM1WO>9>2o>gb zK3Nab}y z4PN6~)!aGc>pb*zq`U5Uzq-5mg`_S$L`GCzNh*sVudcl?m(;%M9*?LS&=QbON7hZz z8;m5^V!+SPtA@Ch7n>_f;MG?$9Pbf z`SO+Ke>Xy}&}W!3hB>WfgXJ(=GA-iVXl_&T-6GwKTMTqXyqtmY0axr03j6pMXZuaU+G98k@21|8nCCTMctR!)Pftzho=(OOWYiL^vGM#IU&VVC7*wkk);DIR9v&@Nr>j z`N2xzD`k1{cIq=S+W_%0f8-JR;Q`wI`_>_ruoJWXt6GL0LMUfRuiCy(XcQaVJ2dzX}7;fe)eKV2}F|%}Ww$XYCV~aCCt? zI@VEQM!JEJj-;eum?byEpsXh>g(06Q4oyxYN(8*;=Q_$WjC{=glKty}Es?iqyhZ_H znme6s!>EB@6V8eZPX@5AB5HHfK$OaO`g<2}xkWJ|T`_w?D{UhFP99gaYTRLk6naON z`%C6HlY)oH5EAlz(l~^30eN~XAs(?*xreJ(o7mn~TCkODN^n~Vk8EO3?{mXx$?V;j z_JMC>5P|`I6~WyE)39;S{27m&c&x;-CBnNV{W1TB+$X%bqoXIpLL^zFgDXsg&id6w zUf#G3et30?N3WL~>z34c{mDoeMII9>S95kriY>ns=?xCE+{dwXdYC5~sL$i<}>d~z(V zq4LzdTKBHkojsg1t+Bq!*{H3D`cRL&%9d|KBY={eLOiHTA~mJ~fYZ(#incW;L0U@y z0nZ`xwhBoA#%C@2*|Y@6KCqLT{OMVJ3jZn!y*_rBc67lma2&e#-Eyj4Qegjg%$3Oa z|HNdCra71n{MM-74BR(y{UA@HH9H7h8r_0w@?pkWP~ueUDsFS_I#76 z`@uNmxg=~j3FoM+iC}~4E#z@5Dk=Lg2~rcNvDR(+g=;u34L8=~04I3A_95(o>|e!7 zUi6_}9D$1_Bp9f2`?VHR;K(4t+O_XTG6}3KMOfgPIGw$QQ=SEhW6@_(d~Km^<6+-r zjg`b?Y~63=C2YO|pKb>992n@%fBX3Hu|LRU2L}hpn{se`b+J%Gj6|BhgH#4Y-m2<) zBdHik@kubb)4G8P2}IUT!tg`{4SY^9)3v9L-;F$Q?t5US<36@B=|i<2=}nKSu{Uj8 zwCQqq=Wd0EA`){oER{)m(%h*rlmd)3czps@6dP4Ee`5>Q+{XUy&w+N|#K-3H{P+X@ zQ$o;1HB7=mj9^SDpo zSNDsIQo_?=`G=Nywl*{1kFyxmu30(5&ZTc+xLyELZoQ;eI^>{|3mKj<(ILSOIfU}(A51hW^oa@XObDVrg%zI8QP`Yu1{ns5n{h}QR z&x3~KA*3hBUV2-khAQCO3VN4g9r>_!SR2>K#1SBuksd{!5Ehjsho|w#zCteuz9Dtv z%c8?_IYu64oOs$W8=WEq0@9Aj37(4;VJ&bj$GYT^ULGIz+U~KT+~opHcQGp(AA)4C zxy;we`O#$$S3f$KTDH&?D9QIJIG&*cNI>MvLQoB4nvZDU#a{>|Xw}LvG55_;FIX_` z5;p`6#PQ-v|NWLUrf#2q{A4w@RIv&tQ|vhx?p`+8x!n3N z---Y(%%0*WadAE+$F1;mXyELkOGs51T}Fa>WWy5tuu)o> zK|w6B%k&1UkD#y=RQl>pE%MIDj#m_NMS{B-eNY*&pB6nRb$L_gW?kU=tmRH2F z4^2ZO6Ccc}=?M<(-FQFeOv6qs`@;3LkW&Z)vX`Bs*XNos)5kQTG=hSK+boB?>Q%D$ z=>rl8#AoF-y2I5X#C{j2Nkj@B9u2w|*fr(8g4b!Xg)xUG?iD540gjxw!Sw4zyA7gR z=!cz+fqEtZhioxJxaNx*sTK&_!bwzC>`iiMm+fyh*PgxH+-dzE)6b_dZRvUl8;l-_ zCl4`Y!fpupG88iLWeudLXSQ!|gDIMzvAnQAKI_CtV}#r(rxK`zWQQyYWZ(*xd(X69 zlvJ#s+-**3zV~n|FIPUEv~Iz>HQ~+W-^O09>=E};_qT$cvy{XY!nnBy!^6Rw16cLU zBN&J2{KAq?C?Z{ewe^2Oyw2qx@SZw;GH0w>e3;de0)#cgO#z}ecJO{qGGuds+8b9a z+a1Vfyb(pxT=;|zu$!GAmRTJx1rSxz#@$-+x)QsZj3+Mf>~6!)`Up_^~4XvK!!QtV!s?9xri}OT?=rLduopL@jhV2C|BbZ^ki&ggM z?~=g2j;8DlK<&eEZm)AWR}+FvAxW&Y`-W41P9F+m^SH}%uDbW;<8=5UKzqt;B|OPV z4}L!Bbild9zjqhRJnAq{GKST_bNVBlf`8%?@8Mmk%~50q3@D*dx*XZcF`-+M{Nkpa zczRTBpn{VQISLR({4W}0;oWfAQd!W&=|ZaKWdIV$Gj?_)lm}h@jh_i5YAUQA%&;o( zcpNqdlm`rM!P~CMt=QX-s9KTS{zaxg#MHd0u7ObBs2e3S+00R}dhEdPoZ8s8XCuHt zx|MO5>)KJ`W1Nm&|NImJROPZ9z9UQw_Pzgl(0OM{X{L|&8LIY7x=!3Jyy@NSDI*6e zDOB{T_oy@Eez>?kIP9L*j=@r3p#hxH5xO+O&s7fZxTF5X^-IZZYipu9R3z3nBPE<_ zfaivYh}0JcWVPas=mvr=$m~b5c=LQOJ8$z`6C6ClV&6vi=D{^wbX>6H7J81LJH5{3 zL+G4iA4KeD;LIaHn=y1{r;-IgRWIoVe^0tt$+c#48;JxOKp#64GCxav4QQV#lh{Kf)+tz>~vlu^( zF=`f(VdNyc?q8`V+?j|zy%!ft&(4djtqc(?tGm(&%<9;n^u=&G+3)aRR=gx-1MQd*0hV zMCSn>SRwBLW{PglsG(g*h1W<4Q=gr^Kq7E)0>QR(burT)oX+AE9>OoOU>07{bB~r6 zA3d7&a$-2kK4)HEp7q>dGDgyWZmFIeA80y1x!(QKTOJ&zOOpfU&!7|P*9L(>_`L9pYH81Ku? z#UdL#-+cD`pt-RDlRx!{_k1uQ|0g!`h5vtXA+9|Mm3EGMo*`1|!3vH8E^@0wZo!1Y zlMAiP!`Iyt7#`?4aCi+D+xv$Ip=baMcRB`11e3O4+`|=qphhMFMdsM_vfh006hSez zHn%qwY~-CV|L0&|UW~BAT7it{@EU&IIeH@&e{4(bUib1El9=X`q|19a_dv6^-&|K* zZVm_d%HFp%s5rPH_)*xBD8YgXbblpS)7?f&{Rl#!hfw3-2|a9kUhr%Xcs+g5!0AQK zC|Bdoqo%_N% zFyn?r@IOxAgB8LlJIVw%f8cl;uN6a<S5&5q0 z(tQD5E3OCqp%_WYSsyAppw@yJ`7>XP-O(*~=~vpxnI96K=9*0c;vd^fsWa~KpQJPK zVJFt+D;wuR#!4S5qRL80FhJzripn#6o$~haHhM$Z!lQ-RyZ8_MHvXACSe(84VDauO z2W34G0Inj^XV2cnf3&nJj;~H`%)jMg`cmfk8z3;ejb9mn^Ix1#a;U!G+D@&#@<&a#dvl=?~- z2C6HH;m@y&W9YVkWGE?M>9c!&KBBxn9Ikf_A~I{V0<(LR47#v!CTdosls*gyDsFcuVYXKK@Hjhni9 ze7pnA#J|td^}toH?+euE!&lu{9qtc=pchk6e9Pr}oVq7^En8nb6f+J5AtF6U0L&U% z$uzSZ%7Zk22{(S;T1seQAf!*bw0?lob%uwBa5U47eL!MP6E^{d>2#<}2ooOlTYgv`=h0-#y?uZEi=q+#;R+OoE&h9HKx!T z!|I<v_*~TeO%IErufJ4jfC}hfqOot7EbJ847tf9Lx9@io{&T zug;n`k+aYG3rkk1C_*o$#2KA)_1)LBYBVPMc1-ADe^kFqVfukst8jq=PA^Ct>w;1xGl#ba(ag$-e5X6Eix{jVbZ*%?@$cpcDR;@}9D8U|VPy%h_k zb1wm%?&aM7ot2uKU>8=Ce=rx(QL=S3K!TckgQeNPV=Dg>*oH!-iw|6&Fu!em82hZ zSLrdwE2~ob3 z?hJXs=LTY!>~- z<9C`TG#5gBB{tuK<(Xl%a-8lye+yTHlJ?)Z-rb?5#Q(a~ zH}c*rhwt*ni~58pUyJMi=>Ac5rse1Fl+ROMsq(c*-|Zel;*?R}m3*Io`~(ETjG6=M zisrpn@Z=4NQm5PV(`~#$`~dGMdU*^PmL{CoG}42AA(Ul)y}{~}G^e+g3*iuR5=k#k z6|N0^a1FYqbtD5(=bpTC&_BYXSf9|zxhTg+wevntz(?`uy2(Rw?#nzRXT=W~UX}g( zr^w}sr%7-R!K;|d_8DAp_{1Gaj^J8}_oc(jtCJH}|G_)gOhRFw49+z_h*P<9ZH6yV z^WFLGfX|&Suh%;oW(8?%^s)qwJVgh~2|RrEcPS;MdF|5${+yUB)}5qll7v1�H7y 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 HUw!pAL(@*y literal 560412 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

    $(V38abU^5kFi^_ zg%T$9qOHfm;FmcyIb?hH*o;V`$%v%Q9o~-6$%rII=sNNr@x!YkhpbtClMpme*c@Jn zMGP-9-OZ^bg3S~w_O>->i4;Oh1Q!R^5}oB+qGW#QZhh3SC8AD=tc05sz@_;p#izFT z{Hsk?;_RHH?i8 zou=5QYx@1!XZsl^O+R9)pm*Ul{Vv#h7bi`>e&}89+p@yM7evnwT4KL}^V*NaS?e&1p0CYs^$yLVZKv zz^r|{=P-TFfi&W$bm$Q+b@ywZW{{nLuzST=t6@Lytw^TkPVu9WeqiIe>N@Xfa$>60 zvG=7D4hlt)BYyM}Mlt6R85*i$!jt3AZbakx_)*y)aQHpIAZ72A19H|2H5M_8x3SmY zOj7$oQHfrw+pNq0frN#M+ed8zvXwN!=~!x@AIHuaCE&(#vV@4SNvI2Zr|z;v44`7p zJ{ZMY7pa7J_*5h>KDDyS@moi2`z%|Wun8NkkVlU_#>Wbn z88I05!-la!#m5SjQ>=K%)FlYUZHpEE)xNh;tf*z&H5Mz(88n<`8c@J*@3-xHlkEFm zHgASl8_!?kHLmA6aX^$A!D5k07&A9;G~#>35T_XN^twctF^l+)kzz#?IJ#fIAiuJl zFOO}g0gg_+#g3zs%pAtLJ1@<4(6PTB?CrqOZDcq)=}sGt&ZW~36_2BvK{&dM`L@nc zq_}e|obMdDj}AfUE$V4XZ`_}h-c~$S>CMqn`uNsRa&kUpTq|v`Z)DpDX zW6B#x`(x*|L*E=xV}A%mjb(<`NtJ`g$)+!4HH*4o&9dUB8;+WV`-IgjqLU43mJRNB zoSw_y{LGv?Q>a-?3ZICCO1@?({Gw2_)YS!J>Jl+lPZMiX%w8K%!Mxir{`|$vxZ@$a z(AS@*#rXoBF0a&(WRCHix9(M&ymj(Vrn>5v3VG2ExC1)|$To7w{5rM6STRjNkt8#6 z$aGjviWC|D8n`q?h%e_GS2H05rAvNjvT#dd5N^Pw)qf+;)KnihB4EJt1*lvOrqncA zPW%x;4`#`vWokps+gT*zn-<2K_#HoXwm#_G9{xsu_zbOZ;C=s^oEFVsh}nORLaj=K zt-AYH_7U&Ui(d%xk*HPdRJF)bJ#)0euxbgfUY7%(N)QVBVsZwlqti4wgQdgcr-;_k zS+&4Dt&J=v@_hM#klZ+6VN z&P^2NTxQI<=3F1yxVPEb{o4dxO4EDpq)S=CN2~gYf-Ysj zM>lv~N_FFCmE+^*EYF|K8!Rq=2fCD&M$yVbx|HRL83n_pu?Q3)+1-VwwTV~K;=F@f zQ3scyZNg_-NGPLL{N7u6I=}7aa7}cxv;uMGMUsHrDaXv!J_8V!iVMc5u21-9!L1AW zpDu6*epue?29b8L95bye%aGr{3@~t_Out`qlM0@~e1jsm@`F^_-2QAUW}wjZnA)uu z1{DtXTfb{M+ozqRecDFar!DcmBsuZ{^PZ1B_1oIeU{Q1;9AjQ9aB21F(NxK66*aj; zAuc@K^JUqmBgMDNYL@rvV#DPX>`Y7nw7HvDHMMHA2qoF4!3ARX-J4Y6{ok<1*}NE! z^G|x56+U;8q}qZ{KB5j!bOF&)D@TW?8)W%VB5!4A z=Abb3;9Lrk+j!lx)9Bv}w<8a;Et7n3yDZ*O-SG2kOB3>jyij>n6)#ZtjyR^~C*<+e zMz(oark52XW&*AwglxOj%m_PC$Jt)^4;#GiQ{uN3Em>RfIas^l^J}px{JS4&-u13u6ML;_-y;TBIxn5z1}6}HGm~nifraQZvr~} zqmPgA{461gZ?Q-5%Qkt_Y!<~o=l2aC+xHCxUAM`s0&{6pu%?H!oMM|Ekb4zS5~6=aJ5|DSI1D#ahu6Obq}-E0b{aNvX( za78acobb8;F&xAohNf}hOm8anF<}hj4={}3h{L+aL*g7fjq&(r@HFBvVI2~8=|LYT ztzaTxEqUU!aB%39<{c^&V4Fo#>-dKK((|@F5R5Qg`;cswHN z(@iXCu=;d6%LB=*mz5K`V!EaVIVYTMT$g1SSETr!26LJKN*d-^GJJWPZmerTWW+lf zYcsy*r8=5?gfky9Erx>@v8%@Ydl{EvV2G=KGQ<^-jYf^6f?F|_)US5aEzSMyj1kK+ z_57hq!5l({efjHR4JYbuR2phlX(fgT=Mf#7(K&OX|FeD>`bC+4;T`|yemU6QFSimf zPci8%e^_n(veaWe-p-efP8}z!W&QHgyyF}9%Xb>|%MHBayEYPTNM?M+J(h$W4(#Ja zuha>Pmp`}TvPM(jGr7QleS}aC8R8oe!pH++}fxTkjLgFE3OM+h^yUg5HAeKFreH?Rg= zK9VMI-!~4EzY}X9nK2e&qX_`y;XVQw;uA_8@Cz*}WifxisW$cEGOBlHPPJJ{NQG#) zz#a|l&ggti`zap{H`$}%+j2nzHKme7!oGGCv|F2Wv--?w?|O{iyLP5%`Mq;n-Czbc z<)AQ`vlX;Jl``Fh>(E^wd)Aq#SRr;btx+K>m}p#fL^YLzwu$$b>R1AH{g?5JX~Pgd z`i^=(Jg5X*Cl$R;{dGRW8zd3lpo-xQQdvl1b2y=fRk8?F&?YoktWz=X0E3fvfW;Pa zf~9KZpS5DB_p<3ky5i5kS0;v%apI0dAh>|`@)6Vi)vZ&8X+V6Ji56(D%Cg(!Nl^8` zg}hvm+p~jD62xG{uJ{*ZHKIg^_>@FMcJ5O+_{4KN&!SmPa4DP^BAJzHy-7eJLu=>> z#1c^^ecX4SZC>3$4Gm7(L7H36Ik;?6om-lgr%TC)s@~ys3gPNC|r@B*co^cYUZkK0j z$NcI+Ue@o&<&&bvO_N$JJs{{ReJsy3R0~psGZ`1>b_`@yrU?3wkyEzGP19Z2=SbMY z(;mq40rf)_gbSRv3%I~4Ys6?Hl*e`#KsM-Q%6(zM3`eWM=Z|J2*u!g?hbFkaDzO=a zco5~uN7@~J(K^P4r@LogDQb?}%lek#tZ$)t%?#a8G6?HXl=S$t=;5LrFP+YR2g;y6 zCkW2>OcFHm0up5%Vm?fAgMPk5XH4wSUEJ04x5oOaK`LvE_L9ET8)dg71{l?Dvp0t6 z^dV9DlU||V(y!_CKFdun4H>UJp;bZ`UwP-)dLBYnbFo}8Hg`xHr%8-_yxWQ^(uf;X zSY-zTZ)cGH0nFhi-#-BlWz}s?%HT6p!Y##kH=iJvNT$3$5WHO4 zBxiG5{@^^ax_ zHKdQa=DU>UW_Q|!>r{p-(&0B;wEM3ZK2b1)R!OXBM^$o;_~z%M0~86H<1bn}n_; zHHC}poMj%d#XO=%7yR<)T5e5V%7jl|!nVpZ4uaS&Vf#M}NlZ6e_xMOhZxN4P_ce~F z%moQlagKxcXV7O8jHdo^t{)dbstD^o-&>Pf!aOs{?EbDrG&FjbZ;}{#B3?2xq`GNG zwSU<=*UXDuLO#rK*GJFykabjYlb{eRmH5!vgnCh7booDxT`#3K?;u7h&Gmso(oAmW zw1S!scTMyYpFaL9_;#7nm5Z)OHEM{TB)CHhDMn=&DV}JP)-@j~=$x)unvT!zVSHZa zV~T@O1NpC6_@3sZ(9@hdQ~>p}1aIxoGac;w=;ViGfkTa$-GmRdkRc{Y)!O>fDmZKY zV|eX=q{Q>HO4%G{&t3AOtT{L`Oi?!DvI$l4X@&HVwwuTJ-*Ap=N_z>a|0Q;nB-KN4 zdv?!<{g;JvXVNao`$Tt-nQ}|+=Gh19s994#p(wKTAe(^aT%g}i+Bet5rhZsuhXP%4 za)^q+MbsAU3Tx<-d6{Q6Ojn$`8i#^@t|-)NnisRVtSz|-(Im;h6}4wE1cy1?lgbe1 z_1lGdL3di9G1T-Hv}CO`Hy?3GCrem7>RMTJ+)!AI_6henBatn9D9o%>zm{DMEg!;u z=S3C(2+Ss&|iml_Z^1i#umLOCFeptQz!ByOoBcdB#@aGu8+zK>nkoqh$lf zp2(F)Pn_&GOB1!Yb9uOA`>t{7`8C~&6xWq&kLHO2OlKiv7pupOXUh7IJ;Al0lvS$< zMrHE?fg=m&7lh)vDQ7WUinQM`8R2_G3p22E)}u|RPMo4Plx+vY zR3qV_?z%pE zyY|p)FPoz*IimYCO+QpI%F8o4NLu+U!hg>D2m8g#wj#9CbQgPJVXXNgq{SLMaEZDYiJr99^x>Rcjd;9N9PL%%Y z7h~yEW!@(LV~o2*1>={`7~+e=W}$ce5ZQB6H(kx!HN{Un?>;ss8ay1g<6VL~Shj)t zl8|L7%8E+36_7A#zeQ#)Fh#%SCxyL&HVK;v{cH7|o3DWCtSy*VTJ!-G>ca@;J@8s} z;-^p4Rx@8(FlK1&dT9QaRfDufQ_!D`**j~7s%(OjnnX(U;tyt;G ztcMRS0MY^A0*Jxzh;E@?8x*GU6e;51@PH_J{Q!B_0$9O?o|t+-9{b|izPN61ucxf} zk)ok7OtOkf%fe7!{`m~2&kCJYs?kSDJJ6uo8+F~Fxon%fXpDP-=GRpkb*C(G+R>cojg;YQ zH%?8gi#io*gt)s*^r}<`9-%Mp?`Sc&>hQJ&!A}N zM~Naj?E{Cd%fOj&Ek1JH(y?NawtBM8Iyv#uWPR0Z=9wUcY$s=%#VLGx^}KCi~F zix$BtL-|V=&AM67X5IWazDK1M2X5(d#A|O)iyF#|2v_ zZmcn+SU8h=+qE5L!*X3bxF|KUfI=Y5p2&3MVg!e zoT7(8)Ei69aw8eB(A{TNt?73@Cz{oE&t83fEER?^c=*s((hF|0o-N-zBn5X|ZW1|u zVeLrK7^VvTc(@-bODbZIqloqDU>Dv$IR(P|c#f$<#rpjlWFcMi$0e`V?~9lm*a0Y7 zWp*3WyP^zv^Be^p;I(06>B_AJWsQLYhXrcm(qMpXNj{;rKygxkAf@?9H4hABKTec} zUZZ;nivl%ez47DN^n7XRjRMZKtZ#;;uZyK`hPkgxpD6|sxhDRr^q`I_H;?);2H|AT zcNVyBpH_7LaR?;HGei^#Z_%z|tpS{@Ln5<~Ua3+!Kq*#eL?~-SYP}aY<*@i-(@gE-6&S z#C7*Lqv|o&jjv`NPOXqH&?I>Oq^(XZlFKULJ@9oA2;YBj1I@kKFT3X5Vs}*b&@iQo zRy5*3f$-b)A*?n?{CO*@`7Re1hxyYb?rC$oETX4(p~M=O@JnZ>@$cy{%-a2#0hjej zcY1!t(sukPIP)jk*i|3c5vDL}*BWSaTs`8TR$D#Yh0Lqc+ZpMfYF=WVRmEtQPqb(& zWJz&KfO&?LZdEnv4n;!fUz)Ym``~l>hpP{{TH*DkvrKszXNmDW_n=;IdwDGS+s~-K zEr#y4@pb5K>%zc$t3m}4Heqq+Se0ZaY_{PwP^6fkTze!h+JkOc5{(;V_msUd_JpCC zX!2yg`)UL7aXZPbUEsZ`BS~0y4|1~xk4X^`F(UsW)6!M%vxqAv=J)BBTOOPfEi>%$ zXr@(Yw>+T3M+Zs3GXPjZc_O~JL!|H{CZ8MR;Atu?FpHbU@pOJr>X=nX*tQ$1uA{xzX zM`$zc7^evtONR*>_tVwf zD7;Qi*rT0%Keu1#=dKs?8*-z4nh5`x%Jh*xF~5%d+hW1O6uT92klVly6_3hgS_Qg> z{iL|~*E(67n;bK4cXWBTop67JyiV3uAak6}vy-vhr=G!SV})6vm*;TT(7AVmB85rp z-7s{3@b_gNj>Su?cLAG%ZydJoybgD{fcL43A@%*nf|T_K2`RaTH5StyVvaoNBiTm! z_}Ve8%y*DJ_^lR1=IAW`SN^_sOpubt52|T1!k;sS2h8R$ha?}6@2Ezpfewsa*C9s` zWrUxI$Uwh@uM{=MO~Q9?Nne&rshmcglE}pd=#|ocrq^AtyyoxmFg7=g<78B4(N~I^J0Xzu zKXUjRwTh>t=s&`IDv)Qpa$FK#lfNCmRy`$fneE#ja+CWOLm@0`<97b)q(J@uda#=B zjFOtsNIhdDQ_q;f)+v<^*^G7k)ME!lb*zs@I7x{euuF;M-zgIm{pj;dxtn@zOffux z4-yeRsE+0c+X){uf$%~5X;q?U)J%pC`jqAxJjS_BYC#jE!TnG_PW<;@SpVd_7m4-} zRGhys3*RQxPZ^$-R6ns^2z{j9bOAqN&y~s*Z^U8xJAI|7InE#7QMW+xd3uOo z;ig}iMs7+uBI{0tIQ%Daid0De!(%aIL@_$u*?i=Iqf$z~Ji*h`ygSM?G)z{lUnzI# zUd;*}x+Z$j_?oUX~P zij}SE)oA=uRtl<|bU>1(Ij!K z>(88JZnm!MnO-J&$ryK~3h;wj-7Vdx=JQ`_EXa{N@i(e zd>K5-c#0`ixk8mRH=ER(oJ}8o$}AqIgyv;3O4q7=`szrqgoa| z9#+fszI(Q4$~pOw;b(hKm*=31%l$Q{G~9kXuE^aV(gy?Mn_PHOq0~QC`bDtA}Gum(ZJ6EQiGtv5@{`qg*E+$c&$h zmQ?@d#?R618;o028vVeDsviy?0#w-*7)xAWS!B?!*nv2pPfJuk^0}q5OPu{*s}LG$gYrOr@cdfVJ9WQ}EO0u^ z=R}KNa(41YS!)UARF^z>=?iQ`8(+!(wtW%V)H|_^)H~ihE8XISv8?l40t$1+*V8zvh?& ze0x*C{_3zF=bd$Ip7foWCw*@Zn)T#eulEsk zLQj|I3fS=MwfZ*#W#eW>bI%W`Q_PTgEzKzc%M}L}^{$cdlf*xVsO=KQ+5v zX*6}myX1SLzb}tjF#H2Oq()^35?47~O_w~c$keq;6}8H4^T9}>*t@$|GW>!5pS6s+ z|2dfZ##d?L+S0Yn<8> ztBcC?7h}}BzxLhT{gPgyPqY+#t~l2cOQ27YdJ4Plc+}!VsHJ;itL-sc+?PEQ_c6Ca zyv2R_Gs&A(!JAd>H>v_90GwP%JHltU=|lVm;M3NgZn{NtHTf$sSWK$v?ONO-+Ckv>u6OEu1;5lPT^FwQFe@W} z1V@h_sqM9o)LwKX!Jm)X^4mdMe!EO$xQln${yv}JOJJuyLXL?(h4hK-Tyc2&5586| z9rE4YJ`q|*>;o+0c6=!aB{e}0r+zD6z%Fp+8+YX%FFxUGj(u~yZJ58s`~_Mc_2Q=? zmt2{3?pqErE|egf5K&FO=QNbdRq!jpb36vR(-jB5t~4av|LlWb6XuNi1tq`|6hDK) z+5?+G{A3^+yjoiKF0uYn#zg9tF0nos$}jt^5AX&LfhO#sLVh%d*Yb|N61lYRn84-* zOYhB={1`uSj;DhRJk0|duyI|h52A)(IW_-*IFO2)y>so8yL|kFxW4tcupxjOxP^y$ z2%j(OPj`G^MHL>Aj5XH?W1DC6` zkGtY;0xPF57L!5gTLe(dZDE;&%&noc7W2O$0ehG0n~2Fp(CSd@d{EdudC7mB5qf*du=E7O!|5N*6ae)$CcGS z?M`~dkY4?$vgXMFXy^j=sNaXlK2PfYYIfM-b=VKg_PI3B&WAf-g!-?*?Bc+zs|5lZRj#U zJEryagFc%FoNRT2`~_lWfAXs=Os0R$ZL9GEU2cBPzjB#VEywL|n17zmS-vYzVEx0M zp5g6L5bs&?IA@MM;9U)xB~<-agGS(}GfVC#vNz5UV7T|ypmXe}kMO7Kf=JU&2bJZB zP+8-rc|0IH2N7jCsBcR~+gOKI#}dGadw5%bAecAc|iZ5fY?!t;JRygiF|k8{2jC@rHI zrDbhw22HL9AqFi`-4_Q^W}{^a)4#Uf5L6JW^AGf1%cXusA$v(i<`ilH2;(*48i=&opRej9aMC#u(PjZ%A!nM%Q za|&I{6B9L1cO0}Bk8m}~Jm76>k{MI)Bp_@R1cV=$_#M&JAmqrY69Ewop18&wJ{PeE)M$W*)4tDV*AQq&w* z!D9A{|2}3zKNJs#n7zTT6XUS_8_%uoh(|UKWGB`KeQMu_=08vF$JmGRo?EN!`%ov( ztq|-(Pu_ou=hg%i;Rb&PJotgPv*v@d=a#fFhvg;OhfY~3o{&=-{klQ_k62l-Ya2_t zi~nYtOSSJ`IMMH1ycb+mU!+Cvgo0}wYt*6) zsYk0d>6t(9PwYs{d+do#?$b{6p{4U!L1$v!lb)kx3H!$>+9+RB!Vqbk48mW*QTimq z2*Qs*^J|ne<}-9a11gKgX>Z)>G^=xL;!88TBUj<&R`;=Zxct~^wyf^fPV`jVXIRDQ zzR6R>zhY@gF3i)TLF75)o-sxK(}R{TKlnPm+{+N{n(<}Cz$7j2;`)5-TesAwyb@K! zd%T6uQDjLX6`<$qY=rNtLHp*kXkkD2rtc#U>!MnmR{f6dV@0|$Ba1>JLU;1*m_Q~v zgEH5|O19q9A6-9a7IH(*lKi`LgT)kDGuhT|LTUY2<6$kP*<0ja zAiiD=>R6h~2eh;Chic*~l0@&nimR$A9vQAhlzfONGX4APL$)iI9UAqs30F>0@4H!t z*ahuJ13~&Ucr@NI1l7K-tLknU;bNgk7_K|f&QlsV2vFPJ)6Z``AmkMP3_eIxynE!! zbL#N|z^8Np3#PrNyCTFQXwIZW0!D>V@zRtJ>Dx+B9*{eVaOYdX)Fg;=6}D^OnGZ*p zwEiOY^31A9Je6jZAM5rze)QH{u_KA>4Ob)tCI4Qgg*-IgED(0sn60hIelgQ!xzPjB zDGrG9={-$zwh!M@B;Rw+FL5@p(Lc(r#2u>XR_@o0<)v!6rkf<3dZ*(7f-U2-a4DL< z>z#Ng)dQ0w$lpF!T4!r;uLkvaW4F9NfZrG>!gkSARXx5~-K_|K92yKR$^VHm5Z=CF zKNgh~;O)b$ta~)!-S||Jv!uGDXLvA)Eg`K2N z)F4CzqD5;LH47lFprXa9E$+6r3)ZD>*aXm`Vv9>H zDz@NCdtK0~#cJ*MoS6je|GU3$;dgI=7$%d+JMTH?InVPPaHA8mb}9mRJn&hPsQDLm zX}gd-9bM^T2km^JQ;oCBc*fK4nq`L?!xtJfg|P!macvGnO4lroOmO0*NZDqbRxIWF zd5KxSyK7&J=uL-3kwPu_6At|xDTGx3E$)hCqI!XyjYENv+)-`Br>j%+;6?$aN>7OE;WbAl6l>Y5&gJg!3HVz zf75qP!~1si8Y$+6)Dkr4l|I;qTrl&EYPV5c^G7|CTnDaNrTShht5U7#W6^s!M#Lwi z0oU7}JDXR36qq)$o;`fp8z6c&&~_?yY~L34bNBbUy$w>}u0{U)=B+}T5+))hl2v4S z$K?JVi`IfD1~J63We0Tw_lpo~-t0ddjEOoG_wMQu@eQMy+nKT`dpA;*~;v zyZ$#TkM?vWd-%~^goawPa4Xs>BGjY+IA}~b*&@d@0o;X}TS@I0-&qMOf)dhW*4?Uf zFsrWgEm|4jw*YDdkm8hV_YQ}O16OR3d;K`9;-;kDLkUAs^T^saSj& zoHIu@IA`W~XsYT0_|KZqUd0NlCJ!SBh+9s5OZv)Wg0sa~h=Sl@Lo@<^#R{^#)yIFDzQq&ScFoL2^A8;-0qZ+-E2%`YC0 z=0^VWcpaK$7mvA+KW6F+J={JegRp3;RBn-*0ATuH z`7||$T6tC1{h^syl72aqn6b*YcR*lsjsXiISD+huu1cf!|X%B2(AECYX##<-3)Od~Urd zQ-1sz`om#J5E?bj3Dq%-DMnWv6BaFZ7c(5rw;S7j#5MQt&5xm1m+I7~{RP3#tvIZ= z!jbE5ShZ~8>u2e0V|pb*2z5;)>-tbx#s_boUmrqWp7uB!an3Up3ncvd z<~cudPJS#dgJY8H$lik(=|)utKe1YgkzJbqrWL%$=k9`5km`Y4PFs?kRw5Q*?1sDF z1a6u!bf6ADmgwK5F7$#H_pkZZb8_dO;}!0obp9a4-7i(I?iY-|6?)L%V585_6Z@1} z4qife{ou`wYi99kIuLKBwxqw#+DEA&Pg5T2_c{RnIHpoPKFCS0cr~zijTEvrjRTBi zd6g>5PDr{D3(=x{aC}SSs$IPxDJvC57>YEM@`~Ipt+IqIU)ZLO5U-4ucozEy%NBu& zpo@9hpLx*a}38k>3Hg3IWCK22;p!NDrbeJq@mFn&CQB#4?hgf#`bRGxYps%Fz1$~y=rdSP z|MEsTq#o*Zj(rC6D!4fg+pYAD#Zy(E+nvS1?6=l(7xpMGXM9@eb|C^4f<$8b&^p82 zt*-d5TJ_dfdK%5OQ1DGEAMKdv#mwTi4@Fk#$p z>AJl`=W5ZMPLiWJ?bl7SbH7InXJnIw=~Pr0%daSq6^hoCI5wY%bd?W+zuS zR_5+W?!d}UX{oXv;Lb8$>KZ_gVTkV{Q z#)kT#h`5RM`coOfu7;S_LT#iUrC0qUV^v4{aZ=qXB+Mkvf|T%jf)lf@E@HHZiOB-Tyh!tm=dJz+dALGy9jRANYCAS8G3x?hH%OQs z9m#>*t2r@ixzh8DT%v9L!Oy>Ia?<$G($-XXb&4%d#aTBMOZjMvr_Zg)>9^wA**|97 za;oKy&}e3KYwMjTR@a&`>?EywDxTCt>3|oJc(5sWdxZdPUqe!ONN{CYA8b3#D4WiL z{Ea;IsiK4z-z~@`@!e{q=K}@n&(^}%+ibN0r956gXT}EQKc9W>uU_GJEpi?y+8_-X zYfq;0ug)K~Z$`dSXi4w81Nf~)&|!L~UdMSnRt!fT{lydbHoH`c`>4lX0NAAPcChSQ zy3}VAvvw<1{qxlRQ>mxJ7oK*C6ic5ZLGxKu|4mUnD>;Mrgr)?#1h~ATuAV>ce9fUK z$>L`0YBK;lO|{S(q`D6y`{CpM!S6AB=oO!sgP)&$0Z6!KXI@uST@4=dt#R1*SA!{* z#3Sdy(Tp<+H(dAGq(m^pJV?xH zR19KLt8WMMqa`6R^%R!y-rK<`HK-U(Hxsjd#Z^+~;VQXBhm5$UAm{pbT?B{1jq9}% zp5OosD?Xb%438)r6D}!~e9b|S;qVAKH}Slpi2wX(rCtfX+31%V6TX58N71%=BWV#@ z;l&V$8Wt3c7G5BF4*KdrJ53npBwIh$kOZ;{-&3))qJ-@(q#q$!gW? zP43S3dFQc2Daea0i_Fk^1<~1BLii&aIFu$O^3(|@?Y?vxZv?S?3Z}*Tqkygef5DiL zQKmFx268OB8Is5X4w6V>F7Sgkjd>!G)fPq&oKnON*X1#+j3!6?kf&ufcqH@UMjR)T zgYm4D!=R97F;ifyWZ81Eh-z)#;82;o#k@C*q zExZ`q`oW)JI}Pb|zvd*@A+9G!A?8l18;O|9X)KRd`|~mP?*}7ajJc+*-#cUOkk6Dt z69R!$zU}9K#9Yq(zs1~PF?j0m?Gv3bcg$OB8pT3+SdO=K4zi5p&TLMa+GJV(y#eJ^7ehu+4*yxqfLn1lVtkb#~n> z#ual-cxb{(MHXUipL= zK!{+YCThYaYSa%D3@}SJo8}C>3v&k6d*^j87?9Qe} z{hp=>-tZML14PoPfMD|RobvF4MdL+zB1?;#H`==hBlC#fsx9RqEg5uhMUV; z3wzNK0i0-9n>DtQlS4N02Q#=si~1)&5w@ezr!L*%S9^n=&wwh5 zU|#M6sNzWtNsbV~fhcMoxPaaIy%%`40aQPa&_{?Wk|J%u_^hx_gSC4RnwP+8EEWd9vO#n&pSZ?sHbhoBlQPe2{3GlFfJ{Ee)W<(}jVkfoIu^|JLM6Sf4NQ1F|v z6s9+wY2d*g3_KVonQdtNJ&JFO zleuuep*U%U8O~x|AjkO?)XIRx&FiX8Vq)=w3DL3~IzJA7OJA8R!*m3Q(@wfstv~@i z2#>YZy2cN3xoLGh$q(sqogzd>kApHBot6RlgVy*t2nr0! zgZiMe@ul>^qSGR`R3n!@SgYQ@W_0|+QJSMhFSj(mZE1nm)7a2aA(KXhZ5tJSeUvVA zbZq|Um#>f3KTLKnd9%OYkXp=jL@!D6RDkl(g^GRdXaw4cDz~c_Y1cGviSZAbXdw z{dLmry=SlYlMgp_dF$VU9!1&))OQ$g>&=3N`+L1t|E-#}jC)`ncj%3v<6ksbzj!@z zQ}bG?P>RKC!E$mVa7vd%`2KQhpFk^kZKYl9?Tt!BQubn#ndcb_+&;tAdOzyYL*^O!moP_?>?@2HYvyB_uszw>tu`X&Cr1LxL@o36$hW|VOw9_ zQ0p5aX>Sf>|E+bGw0HkimO8D*!3{Kd(sz}6jqbEhwdjIu$OT!^1=+a^vQ8IeuV0kS zF571bgd_dQl=ciz0>%RTXR$Z65epv47u>w1ttyW#-lR zi1VbHTf?Q972t5}2uKOi;OS9v8Q7bFfAnsL#1J1#H2-_ZvYClo!fUN+BIpSw+ry9c8&0ca_qT($HcsKs`E1JZ->i!Zv~OKLnUf zm7iOz?2?z$(I9G18MAKJ7JqTO2_9hY1J@Z!&k1oWk-0DHe9E}9bf{nt5*8#^+z*y? zIOhph^CVw@1*M^-vLRmkt&P9=gzR5}bMA|CT+4aE`PI`8Ff0~gb)Zzjz0Z*Ly_U?& zBEpf|{AP|Ipc24EGm|GZt!20L=O*8pTF`jxsg+mY&vLgg_+9%Qq`FLXxIWG(l9wJH z4-oz(sYo}Jb>FRQka=EnhqsbFDU#&v`z=e7>z^jnK}v%2NR-1efX?Hhy{B8J{2|qF zH*lLo?|&WPVmD=a)nxo;q2DB$J$i0o%L!z-qK^*9+;GfmN$9H{0816BDO;oG3jovM z3)6*UcgTjOlntBwaaVRerK`R0`twUv9U|$_s*tbXxIaWmEUwbd#gX8tvMMYOwIp7i z&0vm^q{Z`M*-Tq}%cVxuv$z~dovNPAmBgtpn^h_C8p#>ev9erAwC=K5IU=5woKw}X zb0pD5{5l4|o>$eB;ny7e`UZZj$G^_CMHgSTD<{V%NG_`C%I4Z)%P(`P?D!1ZSaDof zR`@yVE(Y}HfLh=3|Nf1;Ad35!smEJoFHhroOlA5`VS7wwdQ4)AMg80-uxBiq!dzAs z)VWY}-P&`)H%ZbhaW7R0(2>flEYU!J)3BTb=`E72r_D zeYP5p+~7Kp8P^8e2o<)rK>V$P`*G7*ePD4)QYVjTcG0xMqG>r>SFSu}=;SqRzeC2U z7meD&m~{>6{qERMYxTahzI6`nsOYT2Qj1A4BA7ZnJ>Fl|UH=jmMh2FGt@AmWA^g;K zzU8V|wARWTt1vLGdBd6OE$aHCAMAJYfld5kwf&+K7c;q^>p)3=SqYN+_uz>QwMaR6RE)4P>k zzR&&am?Q^3OZ8qsHi>;_LPX}1mm9!O4V&zd)HEX4+&N1328?LTvBub%HKw127Q0oP z4p=e1xONmE)YD2w#Y1;DIh3ABedf}nYZ|@P;=lVTm)=|B^$s2c_0cyn_~ft zR6-WmujsqnlH_$O1CVNAqqEG7aK+aLEYIY+r8NemBaT1g3;Ntpj2OAcNhOz6V-gt z#huZ;a!M%K4Y# zAZ0w211Pp!sp1i^hm^*Drb5SPZ;_^3a=h$4_FHQv5uOJc2>PNK?z*vwk{Dvm<2ohIj#@VHu_TQ-7yY=ViCg8?53Xfq)B|~E z=Uzb7b~X5&8K(*R#EZvoazWas;=&bY)TyHr_7`P@RPAO}QEIm{YA`_xPsfB);Z0}N zkhCXZCCu&KWR@E6>xLo0U87sI$*5e@;yEawP<7T6dUz` zljmQ`PPRF#>WZR_a963Ym9)YS(|H9}wecN8prRbBt;*_bzb2_tKi;E?4|5Vc zvI(PJO+L>cwhD=l>qQ3&b~S3 zf}LHiQ(ONYmNp|Gls|J-9%I7aKKhnpzcr7y@Bqk-<7Mn9Hv>1ZwdSEw=zk_&8Q?QZ zZRZR-1kGXAPs&9Y6_29)B-1N3S!uAuR+rD~+JpV)4uw^6Z*fn498x^)iERZkacwodoE{uyIVoze$W@QT2V$p{DJl^yW z9*72|tjPu2XRcN*nZu0Uh(Fd$Ovcq2{z(-OA#-g0Rk}xOR_bUI#OHq{cyetSDjKXo ztjw5xzDA!aB0k}Nfu|(K5B0;aK@gSdl!=++U!CVXz|yPzaMw;bLkojwW&q!6?ZP@I z)#Otrwl+UH{1okC7XXAzNe&{st!92e*JNJ1g7!xYA_Hw`Kj;KhjPC)_ySphw6P~QC zj}BXvJWxz{$)Dt=Ip&A*R-vhqI9ntrFA}qMD3|dbWU&jL6n+uILb!o*I{&THR;7Vv zEB!bF3X8Z{7wM|C=GT5p+danMYPa&#yrPV3Th#Es?*xxIAyDeD%Ib@0d}soYql?_I z)kPZ&&IpNXQ$Ixj&T5vgkH-!VSx4e*@rsEeZ-UBjg8YM=wCG5CBGXC`3WWHz|EF}hp?bgS^6z(KU)jC$0ax=>eqtf7P8MZJ-7_B z`v~uPZ}whQ0a!Ri89@?&ciC%{$ABmn)%TSI^Y9W~$b-tF#@OWLd_N5=^&?I+OY`gn zG%I6fRn+i>xH^-fW5w+U8e(vBAvVV7gz$h1+12#{Q3naXCuVI`J@4PlzWWZpFB@Vq zdR7JXNe@vI<9l&TIIr%)60DD{vZgNNZ|=gsVgSX6FrbP!kf5?1F;aZmfq@ZSq)@2J zPL#W7b+Z$P2v?-2baoZq-^M4r5rYVLPag6dXzkJWu~8>QME;lM1P@K6z7I!jleAUb{B4gLUnN=(;2py`I

    QpPuE@JBtMz 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 N8iR~f)q|fA{9m=&Jpup# diff --git a/lua-5.4.0/Makefile b/lua-5.4.0/Makefile new file mode 100644 index 0000000..416f444 --- /dev/null +++ b/lua-5.4.0/Makefile @@ -0,0 +1,106 @@ +# Makefile for installing Lua +# See doc/readme.html for installation and customization instructions. + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= guess + +# Where to install. The installation starts in the src and doc directories, +# so take care if INSTALL_TOP is not an absolute path. See the local target. +# You may want to make INSTALL_LMOD and INSTALL_CMOD consistent with +# LUA_ROOT, LUA_LDIR, and LUA_CDIR in luaconf.h. +INSTALL_TOP= /usr/local +INSTALL_BIN= $(INSTALL_TOP)/bin +INSTALL_INC= $(INSTALL_TOP)/include +INSTALL_LIB= $(INSTALL_TOP)/lib +INSTALL_MAN= $(INSTALL_TOP)/man/man1 +INSTALL_LMOD= $(INSTALL_TOP)/share/lua/$V +INSTALL_CMOD= $(INSTALL_TOP)/lib/lua/$V + +# How to install. If your install program does not support "-p", then +# you may have to run ranlib on the installed liblua.a. +INSTALL= install -p +INSTALL_EXEC= $(INSTALL) -m 0755 +INSTALL_DATA= $(INSTALL) -m 0644 +# +# If you don't have "install" you can use "cp" instead. +# INSTALL= cp -p +# INSTALL_EXEC= $(INSTALL) +# INSTALL_DATA= $(INSTALL) + +# Other utilities. +MKDIR= mkdir -p +RM= rm -f + +# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= + +# Convenience platforms targets. +PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris + +# What to install. +TO_BIN= lua luac +TO_INC= lua.h luaconf.h lualib.h lauxlib.h lua.hpp +TO_LIB= liblua.a +TO_MAN= lua.1 luac.1 + +# Lua version and release. +V= 5.4 +R= $V.0 + +# Targets start here. +all: $(PLAT) + +$(PLATS) help test clean: + @cd src && $(MAKE) $@ + +install: dummy + cd src && $(MKDIR) $(INSTALL_BIN) $(INSTALL_INC) $(INSTALL_LIB) $(INSTALL_MAN) $(INSTALL_LMOD) $(INSTALL_CMOD) + cd src && $(INSTALL_EXEC) $(TO_BIN) $(INSTALL_BIN) + cd src && $(INSTALL_DATA) $(TO_INC) $(INSTALL_INC) + cd src && $(INSTALL_DATA) $(TO_LIB) $(INSTALL_LIB) + cd doc && $(INSTALL_DATA) $(TO_MAN) $(INSTALL_MAN) + +uninstall: + cd src && cd $(INSTALL_BIN) && $(RM) $(TO_BIN) + cd src && cd $(INSTALL_INC) && $(RM) $(TO_INC) + cd src && cd $(INSTALL_LIB) && $(RM) $(TO_LIB) + cd doc && cd $(INSTALL_MAN) && $(RM) $(TO_MAN) + +local: + $(MAKE) install INSTALL_TOP=../install + +# make may get confused with install/ if it does not support .PHONY. +dummy: + +# Echo config parameters. +echo: + @cd src && $(MAKE) -s echo + @echo "PLAT= $(PLAT)" + @echo "V= $V" + @echo "R= $R" + @echo "TO_BIN= $(TO_BIN)" + @echo "TO_INC= $(TO_INC)" + @echo "TO_LIB= $(TO_LIB)" + @echo "TO_MAN= $(TO_MAN)" + @echo "INSTALL_TOP= $(INSTALL_TOP)" + @echo "INSTALL_BIN= $(INSTALL_BIN)" + @echo "INSTALL_INC= $(INSTALL_INC)" + @echo "INSTALL_LIB= $(INSTALL_LIB)" + @echo "INSTALL_MAN= $(INSTALL_MAN)" + @echo "INSTALL_LMOD= $(INSTALL_LMOD)" + @echo "INSTALL_CMOD= $(INSTALL_CMOD)" + @echo "INSTALL_EXEC= $(INSTALL_EXEC)" + @echo "INSTALL_DATA= $(INSTALL_DATA)" + +# Echo pkg-config data. +pc: + @echo "version=$R" + @echo "prefix=$(INSTALL_TOP)" + @echo "libdir=$(INSTALL_LIB)" + @echo "includedir=$(INSTALL_INC)" + +# Targets that do not create files (not all makes understand .PHONY). +.PHONY: all $(PLATS) help test clean install uninstall local dummy echo pc + +# (end of Makefile) diff --git a/lua-5.4.0/README b/lua-5.4.0/README new file mode 100644 index 0000000..57572c0 --- /dev/null +++ b/lua-5.4.0/README @@ -0,0 +1,6 @@ + +This is Lua 5.4.0, released on 18 Jun 2020. + +For installation instructions, license details, and +further information about Lua, see doc/readme.html. + diff --git a/lua-5.4.0/doc/contents.html b/lua-5.4.0/doc/contents.html new file mode 100644 index 0000000..ffc0323 --- /dev/null +++ b/lua-5.4.0/doc/contents.html @@ -0,0 +1,674 @@ + + + +Lua 5.4 Reference Manual - contents + + + + + + + +

    +Lua +Lua 5.4 Reference Manual +

    + +

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

    + +

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

    Contents

    + + +

    Index

    + + + + + + + + + + + + + + diff --git a/lua-5.4.0/doc/index.css b/lua-5.4.0/doc/index.css new file mode 100644 index 0000000..c961835 --- /dev/null +++ b/lua-5.4.0/doc/index.css @@ -0,0 +1,21 @@ +ul { + list-style-type: none ; +} + +ul.contents { + padding: 0 ; +} + +table { + border: none ; + border-spacing: 0 ; + border-collapse: collapse ; +} + +td { + vertical-align: top ; + padding: 0 ; + text-align: left ; + line-height: 1.25 ; + width: 15% ; +} diff --git a/lua-5.4.0/doc/logo.gif b/lua-5.4.0/doc/logo.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c77eacc3b8f397fb2e87d2aaecd89128e53a117 GIT binary patch literal 9893 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%0A-^7`I=ZfR-o#M>pI(&x#FQO~-wA&6X` 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 M5|b0H5Z3qqKj-ldMF0Q* literal 0 HcmV?d00001 diff --git a/lua-5.4.0/doc/lua.1 b/lua-5.4.0/doc/lua.1 new file mode 100644 index 0000000..a46a1a6 --- /dev/null +++ b/lua-5.4.0/doc/lua.1 @@ -0,0 +1,149 @@ +.\" $Id: lua.man,v 1.14 2020/05/21 19:31:21 lhf Exp $ +.TH LUA 1 "$Date: 2020/05/21 19:31:21 $" +.SH NAME +lua \- Lua interpreter +.SH SYNOPSIS +.B lua +[ +.I options +] +[ +.I script +[ +.I args +] +] +.SH DESCRIPTION +.B lua +is the standalone Lua interpreter. +It loads and executes Lua programs, +either in textual source form or +in precompiled binary form. +(Precompiled binaries are output by +.BR luac , +the Lua compiler.) +.B lua +can be used as a batch interpreter and also interactively. +.LP +After handling the +.IR options , +the Lua program in file +.I script +is loaded and executed. +The +.I args +are available to +.I script +as strings in a global table named +.B arg +and also as arguments to its main function. +When called without arguments, +.B lua +behaves as +.B "lua \-v \-i" +if the standard input is a terminal, +and as +.B "lua \-" +otherwise. +.LP +In interactive mode, +.B lua +prompts the user, +reads lines from the standard input, +and executes them as they are read. +If the line contains an expression, +then the line is evaluated and the result is printed. +If a line does not contain a complete statement, +then a secondary prompt is displayed and +lines are read until a complete statement is formed or +a syntax error is found. +.LP +Before handling command line options and scripts, +.B lua +checks the contents of the environment variables +.B LUA_INIT_5_4 +and +.BR LUA_INIT , +in that order. +If the contents are of the form +.RI '@ filename ', +then +.I filename +is executed. +Otherwise, the contents are assumed to be a Lua statement and is executed. +When +.B LUA_INIT_5_4 +is defined, +.B LUA_INIT +is ignored. +.SH OPTIONS +.TP +.BI \-e " stat" +execute statement +.IR stat . +.TP +.B \-i +enter interactive mode after executing +.IR script . +.TP +.BI \-l " name" +require library +.I name +into global +.IR name . +.TP +.B \-v +show version information. +.TP +.B \-E +ignore environment variables. +.TP +.B \-W +turn warnings on. +.TP +.B \-\- +stop handling options. +.TP +.B \- +stop handling options and execute the standard input as a file. +.SH ENVIRONMENT VARIABLES +The following environment variables affect the execution of +.BR lua . +When defined, +the version-specific variants take priority +and the version-neutral variants are ignored. +.TP +.B LUA_INIT, LUA_INIT_5_4 +Code to be executed before command line options and scripts. +.TP +.B LUA_PATH, LUA_PATH_5_4 +Initial value of package.cpath, +the path used by require to search for Lua loaders. +.TP +.B LUA_CPATH, LUA_CPATH_5_4 +Initial value of package.cpath, +the path used by require to search for C loaders. +.SH EXIT STATUS +If a script calls os.exit, +then +.B lua +exits with the given exit status. +Otherwise, +.B lua +exits +with EXIT_SUCCESS (0 on POSIX systems) if there were no errors +and +with EXIT_FAILURE (1 on POSIX systems) if there were errors. +Errors raised in interactive mode do not cause exits. +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH "SEE ALSO" +.BR luac (1) +.br +The documentation at lua.org, +especially section 7 of the reference manual. +.SH AUTHORS +R. Ierusalimschy, +L. H. de Figueiredo, +W. Celes +.\" EOF diff --git a/lua-5.4.0/doc/lua.css b/lua-5.4.0/doc/lua.css new file mode 100644 index 0000000..cbd0799 --- /dev/null +++ b/lua-5.4.0/doc/lua.css @@ -0,0 +1,161 @@ +html { + background-color: #F8F8F8 ; +} + +body { + background-color: #FFFFFF ; + color: #000000 ; + font-family: Helvetica, Arial, sans-serif ; + text-align: justify ; + line-height: 1.25 ; + margin: 16px auto ; + padding: 32px ; + border: solid #ccc 1px ; + border-radius: 20px ; + max-width: 70em ; + width: 90% ; +} + +h1, h2, h3, h4 { + color: #000080 ; + font-family: Verdana, Geneva, sans-serif ; + font-weight: normal ; + font-style: normal ; + text-align: left ; +} + +h1 { + font-size: 28pt ; +} + +h1 img { + vertical-align: text-bottom ; +} + +h2:before { + content: "\2756" ; + padding-right: 0.5em ; +} + +a { + text-decoration: none ; +} + +a:link { + color: #000080 ; +} + +a:link:hover, a:visited:hover { + background-color: #D0D0FF ; + color: #000080 ; + border-radius: 4px ; +} + +a:link:active, a:visited:active { + color: #FF0000 ; +} + +div.menubar { + padding-bottom: 0.5em ; +} + +p.menubar { + margin-left: 2.5em ; +} + +.menubar a:hover { + margin: -3px -3px -3px -3px ; + padding: 3px 3px 3px 3px ; + border-radius: 4px ; +} + +:target { + background-color: #F0F0F0 ; + margin: -8px ; + padding: 8px ; + border-radius: 8px ; + outline: none ; +} + +hr { + display: none ; +} + +table hr { + background-color: #a0a0a0 ; + color: #a0a0a0 ; + border: 0 ; + height: 1px ; + display: block ; +} + +.footer { + color: gray ; + font-size: x-small ; + text-transform: lowercase ; +} + +input[type=text] { + border: solid #a0a0a0 2px ; + border-radius: 2em ; + background-image: url('images/search.png') ; + background-repeat: no-repeat ; + background-position: 4px center ; + padding-left: 20px ; + height: 2em ; +} + +pre.session { + background-color: #F8F8F8 ; + padding: 1em ; + border-radius: 8px ; +} + +table { + border: none ; + border-spacing: 0 ; + border-collapse: collapse ; +} + +td { + padding: 0 ; + margin: 0 ; +} + +td.gutter { + width: 4% ; +} + +table.columns td { + vertical-align: top ; + padding-bottom: 1em ; + text-align: justify ; + line-height: 1.25 ; +} + +table.book td { + vertical-align: top ; +} + +table.book td.cover { + padding-right: 1em ; +} + +table.book img { + border: solid #000080 1px ; +} + +table.book span { + font-size: small ; + text-align: left ; + display: block ; + margin-top: 0.25em ; +} + +p.logos a:link:hover, p.logos a:visited:hover { + background-color: inherit ; +} + +img { + background-color: white ; +} diff --git a/lua-5.4.0/doc/luac.1 b/lua-5.4.0/doc/luac.1 new file mode 100644 index 0000000..33a4ed0 --- /dev/null +++ b/lua-5.4.0/doc/luac.1 @@ -0,0 +1,118 @@ +.\" $Id: luac.man,v 1.29 2011/11/16 13:53:40 lhf Exp $ +.TH LUAC 1 "$Date: 2011/11/16 13:53:40 $" +.SH NAME +luac \- Lua compiler +.SH SYNOPSIS +.B luac +[ +.I options +] [ +.I filenames +] +.SH DESCRIPTION +.B luac +is the Lua compiler. +It translates programs written in the Lua programming language +into binary files containing precompiled chunks +that can be later loaded and executed. +.LP +The main advantages of precompiling chunks are: +faster loading, +protecting source code from accidental user changes, +and +off-line syntax checking. +Precompiling does not imply faster execution +because in Lua chunks are always compiled into bytecodes before being executed. +.B luac +simply allows those bytecodes to be saved in a file for later execution. +Precompiled chunks are not necessarily smaller than the corresponding source. +The main goal in precompiling is faster loading. +.LP +In the command line, +you can mix +text files containing Lua source and +binary files containing precompiled chunks. +.B luac +produces a single output file containing the combined bytecodes +for all files given. +Executing the combined file is equivalent to executing the given files. +By default, +the output file is named +.BR luac.out , +but you can change this with the +.B \-o +option. +.LP +Precompiled chunks are +.I not +portable across different architectures. +Moreover, +the internal format of precompiled chunks +is likely to change when a new version of Lua is released. +Make sure you save the source files of all Lua programs that you precompile. +.LP +.SH OPTIONS +.TP +.B \-l +produce a listing of the compiled bytecode for Lua's virtual machine. +Listing bytecodes is useful to learn about Lua's virtual machine. +If no files are given, then +.B luac +loads +.B luac.out +and lists its contents. +Use +.B \-l \-l +for a full listing. +.TP +.BI \-o " file" +output to +.IR file , +instead of the default +.BR luac.out . +(You can use +.B "'\-'" +for standard output, +but not on platforms that open standard output in text mode.) +The output file may be one of the given files because +all files are loaded before the output file is written. +Be careful not to overwrite precious files. +.TP +.B \-p +load files but do not generate any output file. +Used mainly for syntax checking and for testing precompiled chunks: +corrupted files will probably generate errors when loaded. +If no files are given, then +.B luac +loads +.B luac.out +and tests its contents. +No messages are displayed if the file loads without errors. +.TP +.B \-s +strip debug information before writing the output file. +This saves some space in very large chunks, +but if errors occur when running a stripped chunk, +then the error messages may not contain the full information they usually do. +In particular, +line numbers and names of local variables are lost. +.TP +.B \-v +show version information. +.TP +.B \-\- +stop handling options. +.TP +.B \- +stop handling options and process standard input. +.SH "SEE ALSO" +.BR lua (1) +.br +The documentation at lua.org. +.SH DIAGNOSTICS +Error messages should be self explanatory. +.SH AUTHORS +R. Ierusalimschy, +L. H. de Figueiredo, +W. Celes +.\" EOF diff --git a/lua-5.4.0/doc/manual.css b/lua-5.4.0/doc/manual.css new file mode 100644 index 0000000..aa0e677 --- /dev/null +++ b/lua-5.4.0/doc/manual.css @@ -0,0 +1,21 @@ +h3 code { + font-family: inherit ; + font-size: inherit ; +} + +pre, code { + font-size: 12pt ; +} + +span.apii { + color: gray ; + float: right ; + font-family: inherit ; + font-style: normal ; + font-size: small ; +} + +h2:before { + content: "" ; + padding-right: 0em ; +} diff --git a/lua-5.4.0/doc/manual.html b/lua-5.4.0/doc/manual.html new file mode 100644 index 0000000..257f490 --- /dev/null +++ b/lua-5.4.0/doc/manual.html @@ -0,0 +1,11896 @@ + + + +Lua 5.4 Reference Manual + + + + + + + +

    +Lua +Lua 5.4 Reference Manual +

    + +

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

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

    + + +

    + + + + + + +

    1 – Introduction

    + +

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

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

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

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

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

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

    2 – Basic Concepts

    + + + +

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

    2.1 – Values and Types

    + +

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

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

    +There are eight basic types in Lua: +nil, boolean, number, +string, function, userdata, +thread, and table. +The type nil has one single value, nil, +whose main property is to be different from any other value; +it often represents the absence of a useful value. +The type boolean has two values, false and true. +Both nil and false make a condition false; +they are collectively called false values. +Any other value makes a condition true. + + +

    +The type number represents both +integer numbers and real (floating-point) numbers, +using two subtypes: integer and float. +Standard Lua uses 64-bit integers and double-precision (64-bit) floats, +but you can also compile Lua so that it +uses 32-bit integers and/or single-precision (32-bit) floats. +The option with 32 bits for both integers and floats +is particularly attractive +for small machines and embedded systems. +(See macro LUA_32BITS in file luaconf.h.) + + +

    +Unless stated otherwise, +any overflow when manipulating integer values wrap around, +according to the usual rules of two-complement arithmetic. +(In other words, +the actual result is the unique representable integer +that is equal modulo 2n to the mathematical result, +where n is the number of bits of the integer type.) + + +

    +Lua has explicit rules about when each subtype is used, +but it also converts between them automatically as needed (see §3.4.3). +Therefore, +the programmer may choose to mostly ignore the difference +between integers and floats +or to assume complete control over the representation of each number. + + +

    +The type string represents immutable sequences of bytes. + +Lua is 8-bit clean: +strings can contain any 8-bit value, +including embedded zeros ('\0'). +Lua is also encoding-agnostic; +it makes no assumptions about the contents of a string. +The length of any string in Lua must fit in a Lua integer. + + +

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

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

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

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

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

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

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

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

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

    2.2 – Environments and the Global Environment

    + +

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

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

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

    +Lua keeps a distinguished environment called the global environment. +This value is kept at a special index in the C registry (see §4.3). +In Lua, the global variable _G is initialized with this same value. +(_G is never used internally, +so changing its value will affect only your own code.) + + +

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

    2.3 – Error Handling

    + +

    +Several operations in Lua can raise an error. +An error interrupts the normal flow of the program, +which can continue by catching the error. + + +

    +Lua code can explicitly raise an error by calling the +error function. +(This function never returns.) + + +

    +To catch errors in Lua, +you can do a protected call, +using pcall (or xpcall). +The function pcall calls a given function in protected mode. +Any error while running the function stops its execution, +and control returns immediately to pcall, +which returns a status code. + + +

    +Because Lua is an embedded extension language, +Lua code starts running by a call +from C code in the host program. +(When you use Lua standalone, +the lua application is the host program.) +Usually, this call is protected; +so, when an otherwise unprotected error occurs during +the compilation or execution of a Lua chunk, +control returns to the host, +which can take appropriate measures, +such as printing an error message. + + +

    +Whenever there is an error, +an error object +is propagated with information about the error. +Lua itself only generates errors whose error object is a string, +but programs may generate errors with +any value as the error object. +It is up to the Lua program or its host to handle such error objects. +For historical reasons, +an error object is often called an error message, +even though it does not have to be a string. + + +

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

    +Lua also offers a system of warnings (see warn). +Unlike errors, warnings do not interfere +in any way with program execution. +They typically only generate a message to the user, +although this behavior can be adapted from C (see lua_setwarnf). + + + + + +

    2.4 – Metatables and Metamethods

    + +

    +Every value in Lua can have a metatable. +This metatable is an ordinary Lua table +that defines the behavior of the original value +under certain events. +You can change several aspects of the behavior +of a value by setting specific fields in its metatable. +For instance, when a non-numeric value is the operand of an addition, +Lua checks for a function in the field "__add" of the value's metatable. +If it finds one, +Lua calls this function to perform the addition. + + +

    +The key for each event in a metatable is a string +with the event name prefixed by two underscores; +the corresponding value is called a metavalue. +For most events, the metavalue must be a function, +which is then called a metamethod. +In the previous example, the key is the string "__add" +and the metamethod is the function that performs the addition. +Unless stated otherwise, +a metamethod may in fact be any callable value, +which is either a function or a value with a __call metamethod. + + +

    +You can query the metatable of any value +using the getmetatable function. +Lua queries metamethods in metatables using a raw access (see rawget). + + +

    +You can replace the metatable of tables +using the setmetatable function. +You cannot change the metatable of other types from Lua code, +except by using the debug library (§6.10). + + +

    +Tables and full userdata have individual metatables, +although multiple tables and userdata can share their metatables. +Values of all other types share one single metatable per type; +that is, there is one single metatable for all numbers, +one for all strings, etc. +By default, a value has no metatable, +but the string library sets a metatable for the string type (see §6.4). + + +

    +A detailed list of operations controlled by metatables is given next. +Each event is identified by its corresponding key. +By convention, all metatable keys used by Lua are composed by +two underscores followed by lowercase Latin letters. + + + +

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

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

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

      +Like with indexing, +the metavalue for this event can be either a function, a table, +or any value with an __newindex metavalue. +If it is a function, +it is called with table, key, and value as arguments. +Otherwise, +Lua repeats the indexing assignment over this metavalue +with the same key and value. +This assignment is regular, not raw, +and therefore can trigger another __newindex metavalue. + + +

      +Whenever a __newindex metavalue is invoked, +Lua does not perform the primitive assignment. +If needed, +the metamethod itself can call rawset +to do the assignment. +

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

    +In addition to the previous list, +the interpreter also respects the following keys in metatables: +__gc (see §2.5.3), +__close (see §3.3.8), +__mode (see §2.5.4), +and __name. +(The entry __name, +when it contains a string, +may be used by tostring and in error messages.) + + +

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

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

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

    2.5 – Garbage Collection

    + + + +

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

    +An object is considered dead +as soon as the collector can be sure the object +will not be accessed again in the normal execution of the program. +("Normal execution" here excludes finalizers, +which can resurrect dead objects (see §2.5.3), +and excludes also operations using the debug library.) +Note that the time when the collector can be sure that an object +is dead may not coincide with the programmer's expectations. +The only guarantees are that Lua will not collect an object +that may still be accessed in the normal execution of the program, +and it will eventually collect an object +that is inaccessible from Lua. +(Here, +inaccessible from Lua means that neither a variable nor +another live object refer to the object.) +Because Lua has no knowledge about C code, +it never collects objects accessible through the registry (see §4.3), +which includes the global environment (see §2.2). + + +

    +The garbage collector (GC) in Lua can work in two modes: +incremental and generational. + + +

    +The default GC mode with the default parameters +are adequate for most uses. +However, programs that waste a large proportion of their time +allocating and freeing memory can benefit from other settings. +Keep in mind that the GC behavior is non-portable +both across platforms and across different Lua releases; +therefore, optimal settings are also non-portable. + + +

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

    2.5.1 – Incremental Garbage Collection

    + +

    +In incremental mode, +each GC cycle performs a mark-and-sweep collection in small steps +interleaved with the program's execution. +In this mode, +the collector uses three numbers to control its garbage-collection cycles: +the garbage-collector pause, +the garbage-collector step multiplier, +and the garbage-collector step size. + + +

    +The garbage-collector pause +controls how long the collector waits before starting a new cycle. +The collector starts a new cycle when the use of memory +hits n% of the use after the previous collection. +Larger values make the collector less aggressive. +Values equal to or less than 100 mean the collector will not wait to +start a new cycle. +A value of 200 means that the collector waits for the total memory in use +to double before starting a new cycle. +The default value is 200; the maximum value is 1000. + + +

    +The garbage-collector step multiplier +controls the speed of the collector relative to +memory allocation, +that is, +how many elements it marks or sweeps for each +kilobyte of memory allocated. +Larger values make the collector more aggressive but also increase +the size of each incremental step. +You should not use values less than 100, +because they make the collector too slow and +can result in the collector never finishing a cycle. +The default value is 100; the maximum value is 1000. + + +

    +The garbage-collector step size controls the +size of each incremental step, +specifically how many bytes the interpreter allocates +before performing a step. +This parameter is logarithmic: +A value of n means the interpreter will allocate 2n +bytes between steps and perform equivalent work during the step. +A large value (e.g., 60) makes the collector a stop-the-world +(non-incremental) collector. +The default value is 13, +which means steps of approximately 8 Kbytes. + + + + + +

    2.5.2 – Generational Garbage Collection

    + +

    +In generational mode, +the collector does frequent minor collections, +which traverses only objects recently created. +If after a minor collection the use of memory is still above a limit, +the collector does a stop-the-world major collection, +which traverses all objects. +The generational mode uses two parameters: +the minor multiplier and the the major multiplier. + + +

    +The minor multiplier controls the frequency of minor collections. +For a minor multiplier x, +a new minor collection will be done when memory +grows x% larger than the memory in use after the previous major +collection. +For instance, for a multiplier of 20, +the collector will do a minor collection when the use of memory +gets 20% larger than the use after the previous major collection. +The default value is 20; the maximum value is 200. + + +

    +The major multiplier controls the frequency of major collections. +For a major multiplier x, +a new major collection will be done when memory +grows x% larger than the memory in use after the previous major +collection. +For instance, for a multiplier of 100, +the collector will do a major collection when the use of memory +gets larger than twice the use after the previous collection. +The default value is 100; the maximum value is 1000. + + + + + +

    2.5.3 – Garbage-Collection Metamethods

    + +

    +You can set garbage-collector metamethods for tables +and, using the C API, +for full userdata (see §2.4). +These metamethods, called finalizers, +are called when the garbage collector detects that the +corresponding table or userdata is dead. +Finalizers allow you to coordinate Lua's garbage collection +with external resource management such as closing files, +network or database connections, +or freeing your own memory. + + +

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

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

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

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

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

    +Finalizers cannot yield. +Except for that, they can do anything, +such as raise errors, create new objects, +or even run the garbage collector. +However, because they can run in unpredictable times, +it is good practice to restrict each finalizer +to the minimum necessary to properly release +its associated resource. + + +

    +Any error while running a finalizer generates a warning; +the error is not propagated. + + + + + +

    2.5.4 – Weak Tables

    + +

    +A weak table is a table whose elements are +weak references. +A weak reference is ignored by the garbage collector. +In other words, +if the only references to an object are weak references, +then the garbage collector will collect that object. + + +

    +A weak table can have weak keys, weak values, or both. +A table with weak values allows the collection of its values, +but prevents the collection of its keys. +A table with both weak keys and weak values allows the collection of +both keys and values. +In any case, if either the key or the value is collected, +the whole pair is removed from the table. +The weakness of a table is controlled by the +__mode field of its metatable. +This metavalue, if present, must be one of the following strings: +"k", for a table with weak keys; +"v", for a table with weak values; +or "kv", for a table with both weak keys and values. + + +

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

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

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

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

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

    2.6 – Coroutines

    + +

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

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

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

    +A coroutine can terminate its execution in two ways: +normally, when its main function returns +(explicitly or implicitly, after the last instruction); +and abnormally, if there is an unprotected error. +In case of normal termination, +coroutine.resume returns true, +plus any values returned by the coroutine main function. +In case of errors, coroutine.resume returns false +plus the error object. +In this case, the coroutine does not unwind its stack, +so that it is possible to inspect it after the error +with the debug API. + + +

    +A coroutine yields by calling coroutine.yield. +When a coroutine yields, +the corresponding coroutine.resume returns immediately, +even if the yield happens inside nested function calls +(that is, not in the main function, +but in a function directly or indirectly called by the main function). +In the case of a yield, coroutine.resume also returns true, +plus any values passed to coroutine.yield. +The next time you resume the same coroutine, +it continues its execution from the point where it yielded, +with the call to coroutine.yield returning any extra +arguments passed to coroutine.resume. + + +

    +Like coroutine.create, +the coroutine.wrap function also creates a coroutine, +but instead of returning the coroutine itself, +it returns a function that, when called, resumes the coroutine. +Any arguments passed to this function +go as extra arguments to coroutine.resume. +coroutine.wrap returns all the values returned by coroutine.resume, +except the first one (the boolean error code). +Unlike coroutine.resume, +the function created by coroutine.wrap +propagates any error to the caller. +In this case, +the function also closes the coroutine (see coroutine.close). + + +

    +As an example of how coroutines work, +consider the following code: + +

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

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

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

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

    3 – The Language

    + + + +

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

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

    3.1 – Lexical Conventions

    + +

    +Lua is a free-form language. +It ignores spaces and comments between lexical elements (tokens), +except as delimiters between two tokens. +In source code, +Lua recognizes as spaces the standard ASCII whitespace +characters space, form feed, newline, +carriage return, horizontal tab, and vertical tab. + + +

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

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

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

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

    +The following strings denote other tokens: + +

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

    +A short literal string +can be delimited by matching single or double quotes, +and can contain the following C-like escape sequences: +'\a' (bell), +'\b' (backspace), +'\f' (form feed), +'\n' (newline), +'\r' (carriage return), +'\t' (horizontal tab), +'\v' (vertical tab), +'\\' (backslash), +'\"' (quotation mark [double quote]), +and '\'' (apostrophe [single quote]). +A backslash followed by a line break +results in a newline in the string. +The escape sequence '\z' skips the following span +of whitespace characters, +including line breaks; +it is particularly useful to break and indent a long literal string +into multiple lines without adding the newlines and spaces +into the string contents. +A short literal string cannot contain unescaped line breaks +nor escapes not forming a valid escape sequence. + + +

    +We can specify any byte in a short literal string, +including embedded zeros, +by its numeric value. +This can be done +with the escape sequence \xXX, +where XX is a sequence of exactly two hexadecimal digits, +or with the escape sequence \ddd, +where ddd is a sequence of up to three decimal digits. +(Note that if a decimal escape sequence is to be followed by a digit, +it must be expressed using exactly three digits.) + + +

    +The UTF-8 encoding of a Unicode character +can be inserted in a literal string with +the escape sequence \u{XXX} +(with mandatory enclosing braces), +where XXX is a sequence of one or more hexadecimal digits +representing the character code point. +This code point can be any value less than 231. +(Lua uses the original UTF-8 specification here, +which is not restricted to valid Unicode code points.) + + +

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

    +As an example, in a system using ASCII +(in which 'a' is coded as 97, +newline is coded as 10, and '1' is coded as 49), +the five literal strings below denote the same string: + +

    +     a = 'alo\n123"'
    +     a = "alo\n123\""
    +     a = '\97lo\10\04923"'
    +     a = [[alo
    +     123"]]
    +     a = [==[
    +     alo
    +     123"]==]
    +
    + +

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

    +A numeric constant (or numeral) +can be written with an optional fractional part +and an optional decimal exponent, +marked by a letter 'e' or 'E'. +Lua also accepts hexadecimal constants, +which start with 0x or 0X. +Hexadecimal constants also accept an optional fractional part +plus an optional binary exponent, +marked by a letter 'p' or 'P'. + + +

    +A numeric constant with a radix point or an exponent +denotes a float; +otherwise, +if its value fits in an integer or it is a hexadecimal constant, +it denotes an integer; +otherwise (that is, a decimal integer numeral that overflows), +it denotes a float. +Hexadecimal numerals with neither a radix point nor an exponent +always denote an integer value; +if the value overflows, it wraps around +to fit into a valid integer. + + +

    +Examples of valid integer constants are + +

    +     3   345   0xff   0xBEBADA
    +

    +Examples of valid float constants are + +

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

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

    3.2 – Variables

    + +

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

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

    +	var ::= Name
    +

    +Name denotes identifiers (see §3.1). + + +

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

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

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

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

    +The meaning of accesses to table fields can be changed via metatables +(see §2.4). + + +

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

    +	var ::= prefixexp ‘.’ Name
    +
    + +

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

    3.3 – Statements

    + + + +

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

    3.3.1 – Blocks

    + +

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

    +	block ::= {stat}
    +

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

    +	stat ::= ‘;’
    +
    + +

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

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

    +The grammar could see this fragment in two ways: + +

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

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

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

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

    +	stat ::= do block end
    +

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

    3.3.2 – Chunks

    + +

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

    +	chunk ::= block
    +
    + +

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

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

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

    3.3.3 – Assignment

    + +

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

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

    +Expressions are discussed in §3.4. + + +

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

    +The assignment statement first evaluates all its expressions +and only then the assignments are performed. +Thus the code + +

    +     i = 3
    +     i, a[i] = i+1, 20
    +

    +sets a[3] to 20, without affecting a[4] +because the i in a[i] is evaluated (to 3) +before it is assigned 4. +Similarly, the line + +

    +     x, y = y, x
    +

    +exchanges the values of x and y, +and + +

    +     x, y, z = y, z, x
    +

    +cyclically permutes the values of x, y, and z. + + +

    +An assignment to a global name x = val +is equivalent to the assignment +_ENV.x = val (see §2.2). + + +

    +The meaning of assignments to table fields and +global variables (which are actually table fields, too) +can be changed via metatables (see §2.4). + + + + + +

    3.3.4 – Control Structures

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

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

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

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

    +In the repeatuntil loop, +the inner block does not end at the until keyword, +but only after the condition. +So, the condition can refer to local variables +declared inside the loop block. + + +

    +The goto statement transfers the program control to a label. +For syntactical reasons, +labels in Lua are considered statements too: + + + +

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

    +A label is visible in the entire block where it is defined, +except inside nested functions. +A goto may jump to any visible label as long as it does not +enter into the scope of a local variable. +A label should not be declared +where a label with the same name is visible, +even if this other label has been declared in an enclosing block. + + +

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

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

    +	stat ::= break
    +

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

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

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

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

    3.3.5 – For Statement

    + +

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

    The numerical for loop

    + +

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

    +	stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end
    +

    +The given identifier (Name) defines the control variable, +which is a new variable local to the loop body (block). + + +

    +The loop starts by evaluating once the three control expressions. +Their values are called respectively +the initial value, the limit, and the step. +If the step is absent, it defaults to 1. + + +

    +If both the initial value and the step are integers, +the loop is done with integers; +note that the limit may not be an integer. +Otherwise, the three values are converted to +floats and the loop is done with floats. +Beware of floating-point accuracy in this case. + + +

    +After that initialization, +the loop body is repeated with the value of the control variable +going through an arithmetic progression, +starting at the initial value, +with a common difference given by the step. +A negative step makes a decreasing sequence; +a step equal to zero raises an error. +The loop continues while the value is less than +or equal to the limit +(greater than or equal to for a negative step). +If the initial value is already greater than the limit +(or less than, if the step is negative), +the body is not executed. + + +

    +For integer loops, +the control variable never wraps around; +instead, the loop ends in case of an overflow. + + +

    +You should not change the value of the control variable +during the loop. +If you need its value after the loop, +assign it to another variable before exiting the loop. + + + + + +

    The generic for loop

    + +

    +The generic for statement works over functions, +called iterators. +On each iteration, the iterator function is called to produce a new value, +stopping when this new value is nil. +The generic for loop has the following syntax: + +

    +	stat ::= for namelist in explist do block end
    +	namelist ::= Name {‘,’ Name}
    +

    +A for statement like + +

    +     for var_1, ···, var_n in explist do body end
    +

    +works as follows. + + +

    +The names var_i declare loop variables local to the loop body. +The first of these variables is the control variable. + + +

    +The loop starts by evaluating explist +to produce four values: +an iterator function, +a state, +an initial value for the control variable, +and a closing value. + + +

    +Then, at each iteration, +Lua calls the iterator function with two arguments: +the state and the control variable. +The results from this call are then assigned to the loop variables, +following the rules of multiple assignments (see §3.3.3). +If the control variable becomes nil, +the loop terminates. +Otherwise, the body is executed and the loop goes +to the next iteration. + + +

    +The closing value behaves like a +to-be-closed variable (see §3.3.8), +which can be used to release resources when the loop ends. +Otherwise, it does not interfere with the loop. + + +

    +You should not change the value of the control variable +during the loop. + + + + + + + +

    3.3.6 – Function Calls as Statements

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

    +	stat ::= functioncall
    +

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

    3.3.7 – Local Declarations

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

    +	stat ::= local attnamelist [‘=’ explist]
    +	attnamelist ::=  Name attrib {‘,’ Name attrib}
    +

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

    +Each variable name may be postfixed by an attribute +(a name between angle brackets): + +

    +	attrib ::= [‘<’ Name ‘>’]
    +

    +There are two possible attributes: +const, which declares a constant variable, +that is, a variable that cannot be assigned to +after its initialization; +and close, which declares a to-be-closed variable (see §3.3.8). +A list of variables can contain at most one to-be-closed variable. + + +

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

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

    3.3.8 – To-be-closed Variables

    + +

    +A to-be-closed variable behaves like a constant local variable, +except that its value is closed whenever the variable +goes out of scope, including normal block termination, +exiting its block by break/goto/return, +or exiting by an error. + + +

    +Here, to close a value means +to call its __close metamethod. +When calling the metamethod, +the value itself is passed as the first argument +and the error object that caused the exit (if any) +is passed as a second argument; +if there was no error, the second argument is nil. + + +

    +The value assigned to a to-be-closed variable +must have a __close metamethod +or be a false value. +(nil and false are ignored as to-be-closed values.) + + +

    +If several to-be-closed variables go out of scope at the same event, +they are closed in the reverse order that they were declared. + + +

    +If there is any error while running a closing method, +that error is handled like an error in the regular code +where the variable was defined. +However, Lua may call the method one more time. + + +

    +After an error, +the other pending closing methods will still be called. +Errors in these methods +interrupt the respective method and generate a warning, +but are otherwise ignored; +the error reported is only the original one. + + +

    +If a coroutine yields and is never resumed again, +some variables may never go out of scope, +and therefore they will never be closed. +(These variables are the ones created inside the coroutine +and in scope at the point where the coroutine yielded.) +Similarly, if a coroutine ends with an error, +it does not unwind its stack, +so it does not close any variable. +In both cases, +you can either use finalizers +or call coroutine.close to close the variables. +However, if the coroutine was created +through coroutine.wrap, +then its corresponding function will close the coroutine +in case of errors. + + + + + + + +

    3.4 – Expressions

    + + + +

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

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

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

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

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

    +Here are some examples: + +

    +     f()                -- adjusted to 0 results
    +     g(f(), x)          -- f() is adjusted to 1 result
    +     g(x, f())          -- g gets x plus all results from f()
    +     a,b,c = f(), x     -- f() is adjusted to 1 result (c gets nil)
    +     a,b = ...          -- a gets the first vararg argument, b gets
    +                        -- the second (both a and b can get nil if there
    +                        -- is no corresponding vararg argument)
    +     
    +     a,b,c = x, f()     -- f() is adjusted to 2 results
    +     a,b,c = f()        -- f() is adjusted to 3 results
    +     return f()         -- returns all results from f()
    +     return ...         -- returns all received vararg arguments
    +     return x,y,f()     -- returns x, y, and all results from f()
    +     {f()}              -- creates a list with all results from f()
    +     {...}              -- creates a list with all vararg arguments
    +     {f(), nil}         -- f() is adjusted to 1 result
    +
    + +

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

    3.4.1 – Arithmetic Operators

    +Lua supports the following arithmetic operators: + +

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

    +With the exception of exponentiation and float division, +the arithmetic operators work as follows: +If both operands are integers, +the operation is performed over integers and the result is an integer. +Otherwise, if both operands are numbers, +then they are converted to floats, +the operation is performed following the machine's rules +for floating-point arithmetic +(usually the IEEE 754 standard), +and the result is a float. +(The string library coerces strings to numbers in +arithmetic operations; see §3.4.3 for details.) + + +

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

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

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

    +In case of overflows in integer arithmetic, +all operations wrap around. + + + +

    3.4.2 – Bitwise Operators

    +Lua supports the following bitwise operators: + +

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

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

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

    3.4.3 – Coercions and Conversions

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

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

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

    +Several places in Lua coerce strings to numbers when necessary. +In particular, +the string library sets metamethods that try to coerce +strings to numbers in all arithmetic operations. +If the conversion fails, +the library calls the metamethod of the other operand +(if present) or it raises an error. +Note that bitwise operators do not do this coercion. + + +

    +Nonetheless, it is always a good practice not to rely on these +implicit coercions, as they are not always applied; +in particular, "1"==1 is false and "1"<1 raises an error +(see §3.4.4). +These coercions exist mainly for compatibility and may be removed +in future versions of the language. + + +

    +A string is converted to an integer or a float +following its syntax and the rules of the Lua lexer. +The string may have also leading and trailing whitespaces and a sign. +All conversions from strings to numbers +accept both a dot and the current locale mark +as the radix character. +(The Lua lexer, however, accepts only a dot.) +If the string is not a valid numeral, +the conversion fails. +If necessary, the result of this first step is then converted +to a specific number subtype following the previous rules +for conversions between floats and integers. + + +

    +The conversion from numbers to strings uses a +non-specified human-readable format. +To convert numbers to strings in any specific way, +use the function string.format. + + + + + +

    3.4.4 – Relational Operators

    +Lua supports the following relational operators: + +

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

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

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

    +Tables, userdata, and threads +are compared by reference: +two objects are considered equal only if they are the same object. +Every time you create a new object +(a table, a userdata, or a thread), +this new object is different from any previously existing object. +A function is always equal to itself. +Functions with any detectable difference +(different behavior, different definition) are always different. +Functions created at different times but with no detectable differences +may be classified as equal or not +(depending on internal caching details). + + +

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

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

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

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

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

    3.4.5 – Logical Operators

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

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

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

    3.4.6 – Concatenation

    +The string concatenation operator in Lua is +denoted by two dots ('..'). +If both operands are strings or numbers, +then the numbers are converted to strings +in a non-specified format (see §3.4.3). +Otherwise, the __concat metamethod is called (see §2.4). + + + + + +

    3.4.7 – The Length Operator

    + +

    +The length operator is denoted by the unary prefix operator #. + + +

    +The length of a string is its number of bytes. +(That is the usual meaning of string length when each +character is one byte.) + + +

    +The length operator applied on a table +returns a border in that table. +A border in a table t is any natural number +that satisfies the following condition: + +

    +     (border == 0 or t[border] ~= nil) and t[border + 1] == nil
    +

    +In words, +a border is any (natural) index present in the table +that is followed by an absent index +(or zero, when index 1 is absent). + + +

    +A table with exactly one border is called a sequence. +For instance, the table {10, 20, 30, 40, 50} is a sequence, +as it has only one border (5). +The table {10, 20, 30, nil, 50} has two borders (3 and 5), +and therefore it is not a sequence. +(The nil at index 4 is called a hole.) +The table {nil, 20, 30, nil, nil, 60, nil} +has three borders (0, 3, and 6) and three holes +(at indices 1, 4, and 5), +so it is not a sequence, too. +The table {} is a sequence with border 0. +Note that non-natural keys do not interfere +with whether a table is a sequence. + + +

    +When t is a sequence, +#t returns its only border, +which corresponds to the intuitive notion of the length of the sequence. +When t is not a sequence, +#t can return any of its borders. +(The exact one depends on details of +the internal representation of the table, +which in turn can depend on how the table was populated and +the memory addresses of its non-numeric keys.) + + +

    +The computation of the length of a table +has a guaranteed worst time of O(log n), +where n is the largest natural key in the table. + + +

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

    3.4.8 – Precedence

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

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

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

    3.4.9 – Table Constructors

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

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

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

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

    +is equivalent to + +

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

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

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

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

    3.4.10 – Function Calls

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

    +	functioncall ::= prefixexp args
    +

    +In a function call, +first prefixexp and args are evaluated. +If the value of prefixexp has type function, +then this function is called +with the given arguments. +Otherwise, if present, +the prefixexp __call metamethod is called: +its first argument is the value of prefixexp, +followed by the original call arguments +(see §2.4). + + +

    +The form + +

    +	functioncall ::= prefixexp ‘:’ Name args
    +

    +can be used to emulate methods. +A call v:name(args) +is syntactic sugar for v.name(v,args), +except that v is evaluated only once. + + +

    +Arguments have the following syntax: + +

    +	args ::= ‘(’ [explist] ‘)’
    +	args ::= tableconstructor
    +	args ::= LiteralString
    +

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

    +A call of the form return functioncall not in the +scope of a to-be-closed variable is called a tail call. +Lua implements proper tail calls +(or proper tail recursion): +in a tail call, +the called function reuses the stack entry of the calling function. +Therefore, there is no limit on the number of nested tail calls that +a program can execute. +However, a tail call erases any debug information about the +calling function. +Note that a tail call only happens with a particular syntax, +where the return has one single function call as argument, +and it is outside the scope of any to-be-closed variable. +This syntax makes the calling function return exactly +the returns of the called function, +without any intervening action. +So, none of the following examples are tail calls: + +

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

    3.4.11 – Function Definitions

    + +

    +The syntax for function definition is + +

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

    +The following syntactic sugar simplifies function definitions: + +

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

    +The statement + +

    +     function f () body end
    +

    +translates to + +

    +     f = function () body end
    +

    +The statement + +

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

    +translates to + +

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

    +The statement + +

    +     local function f () body end
    +

    +translates to + +

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

    +not to + +

    +     local f = function () body end
    +

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

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

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

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

    +When a Lua function is called, +it adjusts its list of arguments to +the length of its list of parameters, +unless the function is a vararg function, +which is indicated by three dots ('...') +at the end of its parameter list. +A vararg function does not adjust its argument list; +instead, it collects all extra arguments and supplies them +to the function through a vararg expression, +which is also written as three dots. +The value of this expression is a list of all actual extra arguments, +similar to a function with multiple results. +If a vararg expression is used inside another expression +or in the middle of a list of expressions, +then its return list is adjusted to one element. +If the expression is used as the last element of a list of expressions, +then no adjustment is made +(unless that last expression is enclosed in parentheses). + + +

    +As an example, consider the following definitions: + +

    +     function f(a, b) end
    +     function g(a, b, ...) end
    +     function r() return 1,2,3 end
    +

    +Then, we have the following mapping from arguments to parameters and +to the vararg expression: + +

    +     CALL             PARAMETERS
    +     
    +     f(3)             a=3, b=nil
    +     f(3, 4)          a=3, b=4
    +     f(3, 4, 5)       a=3, b=4
    +     f(r(), 10)       a=1, b=10
    +     f(r())           a=1, b=2
    +     
    +     g(3)             a=3, b=nil, ... -->  (nothing)
    +     g(3, 4)          a=3, b=4,   ... -->  (nothing)
    +     g(3, 4, 5, 8)    a=3, b=4,   ... -->  5  8
    +     g(5, r())        a=5, b=1,   ... -->  2  3
    +
    + +

    +Results are returned using the return statement (see §3.3.4). +If control reaches the end of a function +without encountering a return statement, +then the function returns with no results. + + +

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

    +The colon syntax +is used to emulate methods, +adding an implicit extra parameter self to the function. +Thus, the statement + +

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

    +is syntactic sugar for + +

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

    3.5 – Visibility Rules

    + +

    + +Lua is a lexically scoped language. +The scope of a local variable begins at the first statement after +its declaration and lasts until the last non-void statement +of the innermost block that includes the declaration. +Consider the following example: + +

    +     x = 10                -- global variable
    +     do                    -- new block
    +       local x = x         -- new 'x', with value 10
    +       print(x)            --> 10
    +       x = x+1
    +       do                  -- another block
    +         local x = x+1     -- another 'x'
    +         print(x)          --> 12
    +       end
    +       print(x)            --> 11
    +     end
    +     print(x)              --> 10  (the global one)
    +
    + +

    +Notice that, in a declaration like local x = x, +the new x being declared is not in scope yet, +and so the second x refers to the outside variable. + + +

    +Because of the lexical scoping rules, +local variables can be freely accessed by functions +defined inside their scope. +A local variable used by an inner function is called an upvalue +(or external local variable, or simply external variable) +inside the inner function. + + +

    +Notice that each execution of a local statement +defines new local variables. +Consider the following example: + +

    +     a = {}
    +     local x = 20
    +     for i = 1, 10 do
    +       local y = 0
    +       a[i] = function () y = y + 1; return x + y end
    +     end
    +

    +The loop creates ten closures +(that is, ten instances of the anonymous function). +Each of these closures uses a different y variable, +while all of them share the same x. + + + + + +

    4 – The Application Program Interface

    + + + +

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

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

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

    +The Lua library is fully reentrant: +it has no global variables. +It keeps all information it needs in a dynamic structure, +called the Lua state. + + +

    +Each Lua state has one or more threads, +which correspond to independent, cooperative lines of execution. +The type lua_State (despite its name) refers to a thread. +(Indirectly, through the thread, it also refers to the +Lua state associated to the thread.) + + +

    +A pointer to a thread must be passed as the first argument to +every function in the library, except to lua_newstate, +which creates a Lua state from scratch and returns a pointer +to the main thread in the new state. + + + + + +

    4.1 – The Stack

    + + + +

    +Lua uses a virtual stack to pass values to and from C. +Each element in this stack represents a Lua value +(nil, number, string, etc.). +Functions in the API can access this stack through the +Lua state parameter that they receive. + + +

    +Whenever Lua calls C, the called function gets a new stack, +which is independent of previous stacks and of stacks of +C functions that are still active. +This stack initially contains any arguments to the C function +and it is where the C function can store temporary +Lua values and must push its results +to be returned to the caller (see lua_CFunction). + + +

    +For convenience, +most query operations in the API do not follow a strict stack discipline. +Instead, they can refer to any element in the stack +by using an index: +A positive index represents an absolute stack position, +starting at 1 as the bottom of the stack; +a negative index represents an offset relative to the top of the stack. +More specifically, if the stack has n elements, +then index 1 represents the first element +(that is, the element that was pushed onto the stack first) +and +index n represents the last element; +index -1 also represents the last element +(that is, the element at the top) +and index -n represents the first element. + + + + + +

    4.1.1 – Stack Size

    + +

    +When you interact with the Lua API, +you are responsible for ensuring consistency. +In particular, +you are responsible for controlling stack overflow. +You can use the function lua_checkstack +to ensure that the stack has enough space for pushing new elements. + + +

    +Whenever Lua calls C, +it ensures that the stack has space for +at least LUA_MINSTACK extra slots. +LUA_MINSTACK is defined as 20, +so that usually you do not have to worry about stack space +unless your code has loops pushing elements onto the stack. + + +

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

    4.1.2 – Valid and Acceptable Indices

    + +

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

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

    +Functions that do not need a specific mutable position, +but only a value (e.g., query functions), +can be called with acceptable indices. +An acceptable index can be any valid index, +but it also can be any positive index after the stack top +within the space allocated for the stack, +that is, indices up to the stack size. +(Note that 0 is never an acceptable index.) +Indices to upvalues (see §4.2) greater than the real number +of upvalues in the current C function are also acceptable (but invalid). +Except when noted otherwise, +functions in the API work with acceptable indices. + + +

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

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

    4.2 – C Closures

    + +

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

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

    +A C closure can also change the values +of its corresponding upvalues. + + + + + +

    4.3 – Registry

    + +

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

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

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

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

    4.4 – Error Handling in C

    + + + +

    +Internally, Lua uses the C longjmp facility to handle errors. +(Lua will use exceptions if you compile it as C++; +search for LUAI_THROW in the source code for details.) +When Lua faces any error, +such as a memory allocation error or a type error, +it raises an error; +that is, it does a long jump. +A protected environment uses setjmp +to set a recovery point; +any error jumps to the most recent active recovery point. + + +

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

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

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

    +The panic function, +as its name implies, +is a mechanism of last resort. +Programs should avoid it. +As a general rule, +when a C function is called by Lua with a Lua state, +it can do whatever it wants on that Lua state, +as it should be already protected. +However, +when C code operates on other Lua states +(e.g., a Lua-state argument to the function, +a Lua state stored in the registry, or +the result of lua_newthread), +it should use them only in API calls that cannot raise errors. + + +

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

    4.4.1 – Status Codes

    + +

    +Several functions that report errors in the API use the following +status codes to indicate different kinds of errors or other conditions: + +

      + +
    • LUA_OK (0): no errors.
    • + +
    • LUA_ERRRUN: a runtime error.
    • + +
    • LUA_ERRMEM: +memory allocation error. +For such errors, Lua does not call the message handler. +
    • + +
    • LUA_ERRERR: error while running the message handler.
    • + +
    • LUA_ERRSYNTAX: syntax error during precompilation.
    • + +
    • LUA_YIELD: the thread (coroutine) yields.
    • + +
    • LUA_ERRFILE: a file-related error; +e.g., it cannot open or read the file.
    • + +

    +These constants are defined in the header file lua.h. + + + + + + + +

    4.5 – Handling Yields in C

    + +

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

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

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

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

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

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

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

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

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

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

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

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

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

    4.6 – Functions and Types

    + +

    +Here we list all functions and types from the C API in +alphabetical order. +Each function has an indicator like this: +[-o, +p, x] + + +

    +The first field, o, +is how many elements the function pops from the stack. +The second field, p, +is how many elements the function pushes onto the stack. +(Any function always pushes its results after popping its arguments.) +A field in the form x|y means the function can push (or pop) +x or y elements, +depending on the situation; +an interrogation mark '?' means that +we cannot know how many elements the function pops/pushes +by looking only at its arguments. +(For instance, they may depend on what is on the stack.) +The third field, x, +tells whether the function may raise errors: +'-' means the function never raises any error; +'m' means the function may raise only out-of-memory errors; +'v' means the function may raise the errors explained in the text; +'e' means the function can run arbitrary Lua code, +either directly or through metamethods, +and therefore may raise any errors. + + + +


    lua_absindex

    +[-0, +0, –] +

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

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


    lua_Alloc

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

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

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

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

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

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

    +When nsize is not zero, +the allocator must behave like realloc. +In particular, the allocator returns NULL +if and only if it cannot fulfill the request. + + +

    +Here is a simple implementation for the allocator function. +It is used in the auxiliary library by luaL_newstate. + +

    +     static void *l_alloc (void *ud, void *ptr, size_t osize,
    +                                                size_t nsize) {
    +       (void)ud;  (void)osize;  /* not used */
    +       if (nsize == 0) {
    +         free(ptr);
    +         return NULL;
    +       }
    +       else
    +         return realloc(ptr, nsize);
    +     }
    +

    +Note that Standard C ensures +that free(NULL) has no effect and that +realloc(NULL,size) is equivalent to malloc(size). + + + + + +


    lua_arith

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

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

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

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

    + + + + +

    lua_atpanic

    +[-0, +0, –] +

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

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


    lua_call

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

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

    +Calls a function. +Like regular Lua calls, +lua_call respects the __call metamethod. +So, here the word "function" +means any callable value. + + +

    +To do a call you must use the following protocol: +first, the function to be called is pushed onto the stack; +then, the arguments to the call are pushed +in direct order; +that is, the first argument is pushed first. +Finally you call lua_call; +nargs is the number of arguments that you pushed onto the stack. +When the function returns, +all arguments and the function value are popped +and the call results are pushed onto the stack. +The number of results is adjusted to nresults, +unless nresults is LUA_MULTRET. +In this case, all results from the function are pushed; +Lua takes care that the returned values fit into the stack space, +but it does not ensure any extra space in the stack. +The function results are pushed onto the stack in direct order +(the first result is pushed first), +so that after the call the last result is on the top of the stack. + + +

    +Any error while calling and running the function is propagated upwards +(with a longjmp). + + +

    +The following example shows how the host program can do the +equivalent to this Lua code: + +

    +     a = f("how", t.x, 14)
    +

    +Here it is in C: + +

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

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


    lua_callk

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

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

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


    lua_CFunction

    +
    typedef int (*lua_CFunction) (lua_State *L);
    + +

    +Type for C functions. + + +

    +In order to communicate properly with Lua, +a C function must use the following protocol, +which defines the way parameters and results are passed: +a C function receives its arguments from Lua in its stack +in direct order (the first argument is pushed first). +So, when the function starts, +lua_gettop(L) returns the number of arguments received by the function. +The first argument (if any) is at index 1 +and its last argument is at index lua_gettop(L). +To return values to Lua, a C function just pushes them onto the stack, +in direct order (the first result is pushed first), +and returns in C the number of results. +Any other value in the stack below the results will be properly +discarded by Lua. +Like a Lua function, a C function called by Lua can also return +many results. + + +

    +As an example, the following function receives a variable number +of numeric arguments and returns their average and their sum: + +

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

    lua_checkstack

    +[-0, +0, –] +

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

    +Ensures that the stack has space for at least n extra slots, +that is, that you can safely push up to n values into it. +It returns false if it cannot fulfill the request, +either because it would cause the stack +to be greater than a fixed maximum size +(typically at least several thousand elements) or +because it cannot allocate memory for the extra space. +This function never shrinks the stack; +if the stack already has space for the extra slots, +it is left unchanged. + + + + + +


    lua_close

    +[-0, +0, –] +

    void lua_close (lua_State *L);
    + +

    +Close all active to-be-closed variables in the main thread, +release all objects in the given Lua state +(calling the corresponding garbage-collection metamethods, if any), +and frees all dynamic memory used by this state. + + +

    +On several platforms, you may not need to call this function, +because all resources are naturally released when the host program ends. +On the other hand, long-running programs that create multiple states, +such as daemons or web servers, +will probably need to close states as soon as they are not needed. + + + + + +


    lua_compare

    +[-0, +0, e] +

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

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

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

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

    lua_concat

    +[-n, +1, e] +

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

    +Concatenates the n values at the top of the stack, +pops them, and leaves the result on the top. +If n is 1, the result is the single value on the stack +(that is, the function does nothing); +if n is 0, the result is the empty string. +Concatenation is performed following the usual semantics of Lua +(see §3.4.6). + + + + + +


    lua_copy

    +[-0, +0, –] +

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

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


    lua_createtable

    +[-0, +1, m] +

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

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


    lua_dump

    +[-0, +0, –] +

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

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

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

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

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


    lua_error

    +[-1, +0, v] +

    int lua_error (lua_State *L);
    + +

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


    lua_gc

    +[-0, +0, –] +

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

    +Controls the garbage collector. + + +

    +This function performs several tasks, +according to the value of the parameter what. +For options that need extra arguments, +they are listed after the option. + +

      + +
    • LUA_GCCOLLECT: +Performs a full garbage-collection cycle. +
    • + +
    • LUA_GCSTOP: +Stops the garbage collector. +
    • + +
    • LUA_GCRESTART: +Restarts the garbage collector. +
    • + +
    • LUA_GCCOUNT: +Returns the current amount of memory (in Kbytes) in use by Lua. +
    • + +
    • LUA_GCCOUNTB: +Returns the remainder of dividing the current amount of bytes of +memory in use by Lua by 1024. +
    • + +
    • LUA_GCSTEP (int stepsize): +Performs an incremental step of garbage collection, +corresponding to the allocation of stepsize Kbytes. +
    • + +
    • LUA_GCISRUNNING: +Returns a boolean that tells whether the collector is running +(i.e., not stopped). +
    • + +
    • LUA_GCINC (int pause, int stepmul, stepsize): +Changes the collector to incremental mode +with the given parameters (see §2.5.1). +Returns the previous mode (LUA_GCGEN or LUA_GCINC). +
    • + +
    • LUA_GCGEN (int minormul, int majormul): +Changes the collector to generational mode +with the given parameters (see §2.5.2). +Returns the previous mode (LUA_GCGEN or LUA_GCINC). +
    • + +

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


    lua_getallocf

    +[-0, +0, –] +

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

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


    lua_getfield

    +[-0, +1, e] +

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

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

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


    lua_getextraspace

    +[-0, +0, –] +

    void *lua_getextraspace (lua_State *L);
    + +

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

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

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


    lua_getglobal

    +[-0, +1, e] +

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

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


    lua_geti

    +[-0, +1, e] +

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

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

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


    lua_getmetatable

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

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

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


    lua_gettable

    +[-1, +1, e] +

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

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

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

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


    lua_gettop

    +[-0, +0, –] +

    int lua_gettop (lua_State *L);
    + +

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


    lua_getiuservalue

    +[-0, +1, –] +

    int lua_getiuservalue (lua_State *L, int index, int n);
    + +

    +Pushes onto the stack the n-th user value associated with the +full userdata at the given index and +returns the type of the pushed value. + + +

    +If the userdata does not have that value, +pushes nil and returns LUA_TNONE. + + + + + +


    lua_insert

    +[-1, +1, –] +

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

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


    lua_Integer

    +
    typedef ... lua_Integer;
    + +

    +The type of integers in Lua. + + +

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

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


    lua_isboolean

    +[-0, +0, –] +

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

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


    lua_iscfunction

    +[-0, +0, –] +

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

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


    lua_isfunction

    +[-0, +0, –] +

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

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


    lua_isinteger

    +[-0, +0, –] +

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

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


    lua_islightuserdata

    +[-0, +0, –] +

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

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


    lua_isnil

    +[-0, +0, –] +

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

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


    lua_isnone

    +[-0, +0, –] +

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

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


    lua_isnoneornil

    +[-0, +0, –] +

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

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


    lua_isnumber

    +[-0, +0, –] +

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

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


    lua_isstring

    +[-0, +0, –] +

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

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


    lua_istable

    +[-0, +0, –] +

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

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


    lua_isthread

    +[-0, +0, –] +

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

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


    lua_isuserdata

    +[-0, +0, –] +

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

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


    lua_isyieldable

    +[-0, +0, –] +

    int lua_isyieldable (lua_State *L);
    + +

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


    lua_KContext

    +
    typedef ... lua_KContext;
    + +

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


    lua_KFunction

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

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


    lua_len

    +[-0, +1, e] +

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

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


    lua_load

    +[-0, +1, –] +

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

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

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

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

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

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

    +lua_load can return +LUA_OK, LUA_ERRSYNTAX, or LUA_ERRMEM. +The function may also return other values corresponding to +errors raised by the read function (see §4.4.1). + + +

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


    lua_newstate

    +[-0, +0, –] +

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

    +Creates a new independent state and returns its main thread. +Returns NULL if it cannot create the state +(due to lack of memory). +The argument f is the allocator function; +Lua will do all memory allocation for this state +through this function (see lua_Alloc). +The second argument, ud, is an opaque pointer that Lua +passes to the allocator in every call. + + + + + +


    lua_newtable

    +[-0, +1, m] +

    void lua_newtable (lua_State *L);
    + +

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


    lua_newthread

    +[-0, +1, m] +

    lua_State *lua_newthread (lua_State *L);
    + +

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

    +Threads are subject to garbage collection, +like any Lua object. + + + + + +


    lua_newuserdatauv

    +[-0, +1, m] +

    void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue);
    + +

    +This function creates and pushes on the stack a new full userdata, +with nuvalue associated Lua values, called user values, +plus an associated block of raw memory with size bytes. +(The user values can be set and read with the functions +lua_setiuservalue and lua_getiuservalue.) + + +

    +The function returns the address of the block of memory. + + + + + +


    lua_next

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

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

    +Pops a key from the stack, +and pushes a key–value pair from the table at the given index, +the "next" pair after the given key. +If there are no more elements in the table, +then lua_next returns 0 and pushes nothing. + + +

    +A typical table traversal looks like this: + +

    +     /* table is in the stack at index 't' */
    +     lua_pushnil(L);  /* first key */
    +     while (lua_next(L, t) != 0) {
    +       /* uses 'key' (at index -2) and 'value' (at index -1) */
    +       printf("%s - %s\n",
    +              lua_typename(L, lua_type(L, -2)),
    +              lua_typename(L, lua_type(L, -1)));
    +       /* removes 'value'; keeps 'key' for next iteration */
    +       lua_pop(L, 1);
    +     }
    +
    + +

    +While traversing a table, +avoid calling lua_tolstring directly on a key, +unless you know that the key is actually a string. +Recall that lua_tolstring may change +the value at the given index; +this confuses the next call to lua_next. + + +

    +This function may raise an error if the given key +is neither nil nor present in the table. +See function next for the caveats of modifying +the table during its traversal. + + + + + +


    lua_Number

    +
    typedef ... lua_Number;
    + +

    +The type of floats in Lua. + + +

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


    lua_numbertointeger

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

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

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


    lua_pcall

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

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

    +Calls a function (or a callable object) in protected mode. + + +

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

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

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

    +The lua_pcall function returns one of the following status codes: +LUA_OK, LUA_ERRRUN, LUA_ERRMEM, or LUA_ERRERR. + + + + + +


    lua_pcallk

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

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

    +This function behaves exactly like lua_pcall, +except that it allows the called function to yield (see §4.5). + + + + + +


    lua_pop

    +[-n, +0, –] +

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

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


    lua_pushboolean

    +[-0, +1, –] +

    void lua_pushboolean (lua_State *L, int b);
    + +

    +Pushes a boolean value with value b onto the stack. + + + + + +


    lua_pushcclosure

    +[-n, +1, m] +

    void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
    + +

    +Pushes a new C closure onto the stack. +This function receives a pointer to a C function +and pushes onto the stack a Lua value of type function that, +when called, invokes the corresponding C function. +The parameter n tells how many upvalues this function will have +(see §4.2). + + +

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

    +When a C function is created, +it is possible to associate some values with it, +the so called upvalues; +these upvalues are then accessible to the function whenever it is called. +This association is called a C closure (see §4.2). +To create a C closure, +first the initial values for its upvalues must be pushed onto the stack. +(When there are multiple upvalues, the first value is pushed first.) +Then lua_pushcclosure +is called to create and push the C function onto the stack, +with the argument n telling how many values will be +associated with the function. +lua_pushcclosure also pops these values from the stack. + + +

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

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


    lua_pushcfunction

    +[-0, +1, –] +

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

    +Pushes a C function onto the stack. +This function is equivalent to lua_pushcclosure with no upvalues. + + + + + +


    lua_pushfstring

    +[-0, +1, v] +

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

    +Pushes onto the stack a formatted string +and returns a pointer to this string. +It is similar to the ISO C function sprintf, +but has two important differences. +First, +you do not have to allocate space for the result; +the result is a Lua string and Lua takes care of memory allocation +(and deallocation, through garbage collection). +Second, +the conversion specifiers are quite restricted. +There are no flags, widths, or precisions. +The conversion specifiers can only be +'%%' (inserts the character '%'), +'%s' (inserts a zero-terminated string, with no size restrictions), +'%f' (inserts a lua_Number), +'%I' (inserts a lua_Integer), +'%p' (inserts a pointer), +'%d' (inserts an int), +'%c' (inserts an int as a one-byte character), and +'%U' (inserts a long int as a UTF-8 byte sequence). + + +

    +This function may raise errors due to memory overflow +or an invalid conversion specifier. + + + + + +


    lua_pushglobaltable

    +[-0, +1, –] +

    void lua_pushglobaltable (lua_State *L);
    + +

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


    lua_pushinteger

    +[-0, +1, –] +

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

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


    lua_pushlightuserdata

    +[-0, +1, –] +

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

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

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


    lua_pushliteral

    +[-0, +1, m] +

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

    +This macro is equivalent to lua_pushstring, +but should be used only when s is a literal string. +(Lua may optimize this case.) + + + + + +


    lua_pushlstring

    +[-0, +1, m] +

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

    +Pushes the string pointed to by s with size len +onto the stack. +Lua will make or reuse an internal copy of the given string, +so the memory at s can be freed or reused immediately after +the function returns. +The string can contain any binary data, +including embedded zeros. + + +

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


    lua_pushnil

    +[-0, +1, –] +

    void lua_pushnil (lua_State *L);
    + +

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


    lua_pushnumber

    +[-0, +1, –] +

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

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


    lua_pushstring

    +[-0, +1, m] +

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

    +Pushes the zero-terminated string pointed to by s +onto the stack. +Lua will make or reuse an internal copy of the given string, +so the memory at s can be freed or reused immediately after +the function returns. + + +

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

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


    lua_pushthread

    +[-0, +1, –] +

    int lua_pushthread (lua_State *L);
    + +

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


    lua_pushvalue

    +[-0, +1, –] +

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

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


    lua_pushvfstring

    +[-0, +1, v] +

    const char *lua_pushvfstring (lua_State *L,
    +                              const char *fmt,
    +                              va_list argp);
    + +

    +Equivalent to lua_pushfstring, except that it receives a va_list +instead of a variable number of arguments. + + + + + +


    lua_rawequal

    +[-0, +0, –] +

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

    +Returns 1 if the two values in indices index1 and +index2 are primitively equal +(that is, equal without calling the __eq metamethod). +Otherwise returns 0. +Also returns 0 if any of the indices are not valid. + + + + + +


    lua_rawget

    +[-1, +1, –] +

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

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


    lua_rawgeti

    +[-0, +1, –] +

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

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

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


    lua_rawgetp

    +[-0, +1, –] +

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

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

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


    lua_rawlen

    +[-0, +0, –] +

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

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


    lua_rawset

    +[-2, +0, m] +

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

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


    lua_rawseti

    +[-1, +0, m] +

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

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

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


    lua_rawsetp

    +[-1, +0, m] +

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

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

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


    lua_Reader

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

    +The reader function used by lua_load. +Every time lua_load needs another piece of the chunk, +it calls the reader, +passing along its data parameter. +The reader must return a pointer to a block of memory +with a new piece of the chunk +and set size to the block size. +The block must exist until the reader function is called again. +To signal the end of the chunk, +the reader must return NULL or set size to zero. +The reader function may return pieces of any size greater than zero. + + + + + +


    lua_register

    +[-0, +0, e] +

    void lua_register (lua_State *L, const char *name, lua_CFunction f);
    + +

    +Sets the C function f as the new value of global name. +It is defined as a macro: + +

    +     #define lua_register(L,n,f) \
    +            (lua_pushcfunction(L, f), lua_setglobal(L, n))
    +
    + + + + +

    lua_remove

    +[-1, +0, –] +

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

    +Removes the element at the given valid index, +shifting down the elements above this index to fill the gap. +This function cannot be called with a pseudo-index, +because a pseudo-index is not an actual stack position. + + + + + +


    lua_replace

    +[-1, +0, –] +

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

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


    lua_resetthread

    +[-0, +?, –] +

    int lua_resetthread (lua_State *L);
    + +

    +Resets a thread, cleaning its call stack and closing all pending +to-be-closed variables. +Returns a status code: +LUA_OK for no errors in closing methods, +or an error status otherwise. +In case of error, +leaves the error object on the top of the stack, + + + + + +


    lua_resume

    +[-?, +?, –] +

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

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

    +To start a coroutine, +you push the main function plus any arguments +onto the empty stack of the thread. +then you call lua_resume, +with nargs being the number of arguments. +This call returns when the coroutine suspends or finishes its execution. +When it returns, +*nresults is updated and +the top of the stack contains +the *nresults values passed to lua_yield +or returned by the body function. +lua_resume returns +LUA_YIELD if the coroutine yields, +LUA_OK if the coroutine finishes its execution +without errors, +or an error code in case of errors (see §4.4.1). +In case of errors, +the error object is on the top of the stack. + + +

    +To resume a coroutine, +you remove the *nresults yielded values from its stack, +push the values to be passed as results from yield, +and then call lua_resume. + + +

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


    lua_rotate

    +[-0, +0, –] +

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

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


    lua_setallocf

    +[-0, +0, –] +

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

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


    lua_setfield

    +[-1, +0, e] +

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

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

    +This function pops the value from the stack. +As in Lua, this function may trigger a metamethod +for the "newindex" event (see §2.4). + + + + + +


    lua_setglobal

    +[-1, +0, e] +

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

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


    lua_seti

    +[-1, +0, e] +

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

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

    +This function pops the value from the stack. +As in Lua, this function may trigger a metamethod +for the "newindex" event (see §2.4). + + + + + +


    lua_setiuservalue

    +[-1, +0, –] +

    int lua_setiuservalue (lua_State *L, int index, int n);
    + +

    +Pops a value from the stack and sets it as +the new n-th user value associated to the +full userdata at the given index. +Returns 0 if the userdata does not have that value. + + + + + +


    lua_setmetatable

    +[-1, +0, –] +

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

    +Pops a table or nil from the stack and +sets that value as the new metatable for the value at the given index. +(nil means no metatable.) + + +

    +(For historical reasons, this function returns an int, +which now is always 1.) + + + + + +


    lua_settable

    +[-2, +0, e] +

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

    +Does the equivalent to t[k] = v, +where t is the value at the given index, +v is the value on the top of the stack, +and k is the value just below the top. + + +

    +This function pops both the key and the value from the stack. +As in Lua, this function may trigger a metamethod +for the "newindex" event (see §2.4). + + + + + +


    lua_settop

    +[-?, +?, –] +

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

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


    lua_setwarnf

    +[-0, +0, –] +

    void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud);
    + +

    +Sets the warning function to be used by Lua to emit warnings +(see lua_WarnFunction). +The ud parameter sets the value ud passed to +the warning function. + + + + + +


    lua_State

    +
    typedef struct lua_State lua_State;
    + +

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

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


    lua_status

    +[-0, +0, –] +

    int lua_status (lua_State *L);
    + +

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

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

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


    lua_stringtonumber

    +[-0, +1, –] +

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

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


    lua_toboolean

    +[-0, +0, –] +

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

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


    lua_tocfunction

    +[-0, +0, –] +

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

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


    lua_toclose

    +[-0, +0, v] +

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

    +Marks the given index in the stack as a +to-be-closed "variable" (see §3.3.8). +Like a to-be-closed variable in Lua, +the value at that index in the stack will be closed +when it goes out of scope. +Here, in the context of a C function, +to go out of scope means that the running function returns to Lua, +there is an error, +or the index is removed from the stack through +lua_settop or lua_pop. +An index marked as to-be-closed should not be removed from the stack +by any other function in the API except lua_settop or lua_pop. + + +

    +This function should not be called for an index +that is equal to or below an active to-be-closed index. + + +

    +This function can raise an out-of-memory error. +In that case, the value in the given index is immediately closed, +as if it was already marked. + + + + + +


    lua_tointeger

    +[-0, +0, –] +

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

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


    lua_tointegerx

    +[-0, +0, –] +

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

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

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


    lua_tolstring

    +[-0, +0, m] +

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

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

    +lua_tolstring returns a pointer +to a string inside the Lua state. +This string always has a zero ('\0') +after its last character (as in C), +but can contain other zeros in its body. + + +

    +Because Lua has garbage collection, +there is no guarantee that the pointer returned by lua_tolstring +will be valid after the corresponding Lua value is removed from the stack. + + + + + +


    lua_tonumber

    +[-0, +0, –] +

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

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


    lua_tonumberx

    +[-0, +0, –] +

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

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

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


    lua_topointer

    +[-0, +0, –] +

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

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

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


    lua_tostring

    +[-0, +0, m] +

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

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


    lua_tothread

    +[-0, +0, –] +

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

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


    lua_touserdata

    +[-0, +0, –] +

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

    +If the value at the given index is a full userdata, +returns its memory-block address. +If the value is a light userdata, +returns its value (a pointer). +Otherwise, returns NULL. + + + + + +


    lua_type

    +[-0, +0, –] +

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

    +Returns the type of the value in the given valid index, +or LUA_TNONE for a non-valid but acceptable index. +The types returned by lua_type are coded by the following constants +defined in lua.h: +LUA_TNIL, +LUA_TNUMBER, +LUA_TBOOLEAN, +LUA_TSTRING, +LUA_TTABLE, +LUA_TFUNCTION, +LUA_TUSERDATA, +LUA_TTHREAD, +and +LUA_TLIGHTUSERDATA. + + + + + +


    lua_typename

    +[-0, +0, –] +

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

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


    lua_Unsigned

    +
    typedef ... lua_Unsigned;
    + +

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


    lua_upvalueindex

    +[-0, +0, –] +

    int lua_upvalueindex (int i);
    + +

    +Returns the pseudo-index that represents the i-th upvalue of +the running function (see §4.2). +i must be in the range [1,256]. + + + + + +


    lua_version

    +[-0, +0, –] +

    lua_Number lua_version (lua_State *L);
    + +

    +Returns the version number of this core. + + + + + +


    lua_WarnFunction

    +
    typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont);
    + +

    +The type of warning functions, called by Lua to emit warnings. +The first parameter is an opaque pointer +set by lua_setwarnf. +The second parameter is the warning message. +The third parameter is a boolean that +indicates whether the message is +to be continued by the message in the next call. + + +

    +See warn for more details about warnings. + + + + + +


    lua_warning

    +[-0, +0, –] +

    void lua_warning (lua_State *L, const char *msg, int tocont);
    + +

    +Emits a warning with the given message. +A message in a call with tocont true should be +continued in another call to this function. + + +

    +See warn for more details about warnings. + + + + + +


    lua_Writer

    +
    typedef int (*lua_Writer) (lua_State *L,
    +                           const void* p,
    +                           size_t sz,
    +                           void* ud);
    + +

    +The type of the writer function used by lua_dump. +Every time lua_dump produces another piece of chunk, +it calls the writer, +passing along the buffer to be written (p), +its size (sz), +and the ud parameter supplied to lua_dump. + + +

    +The writer returns an error code: +0 means no errors; +any other value means an error and stops lua_dump from +calling the writer again. + + + + + +


    lua_xmove

    +[-?, +?, –] +

    void lua_xmove (lua_State *from, lua_State *to, int n);
    + +

    +Exchange values between different threads of the same state. + + +

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


    lua_yield

    +[-?, +?, v] +

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

    +This function is equivalent to lua_yieldk, +but it has no continuation (see §4.5). +Therefore, when the thread resumes, +it continues the function that called +the function calling lua_yield. +To avoid surprises, +this function should be called only in a tail call. + + + + + +


    lua_yieldk

    +[-?, +?, v] +

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

    +Yields a coroutine (thread). + + +

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

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

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

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

    4.7 – The Debug Interface

    + +

    +Lua has no built-in debugging facilities. +Instead, it offers a special interface +by means of functions and hooks. +This interface allows the construction of different +kinds of debuggers, profilers, and other tools +that need "inside information" from the interpreter. + + + +


    lua_Debug

    +
    typedef struct lua_Debug {
    +  int event;
    +  const char *name;           /* (n) */
    +  const char *namewhat;       /* (n) */
    +  const char *what;           /* (S) */
    +  const char *source;         /* (S) */
    +  size_t srclen;              /* (S) */
    +  int currentline;            /* (l) */
    +  int linedefined;            /* (S) */
    +  int lastlinedefined;        /* (S) */
    +  unsigned char nups;         /* (u) number of upvalues */
    +  unsigned char nparams;      /* (u) number of parameters */
    +  char isvararg;              /* (u) */
    +  char istailcall;            /* (t) */
    +  unsigned short ftransfer;   /* (r) index of first value transferred */
    +  unsigned short ntransfer;   /* (r) number of transferred values */
    +  char short_src[LUA_IDSIZE]; /* (S) */
    +  /* private part */
    +  other fields
    +} lua_Debug;
    + +

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

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

      + +
    • source: +the source of the chunk that created the function. +If source starts with a '@', +it means that the function was defined in a file where +the file name follows the '@'. +If source starts with a '=', +the remainder of its contents describes the source in a user-dependent manner. +Otherwise, +the function was defined in a string where +source is that string. +
    • + +
    • srclen: +The length of the string source. +
    • + +
    • short_src: +a "printable" version of source, to be used in error messages. +
    • + +
    • linedefined: +the line number where the definition of the function starts. +
    • + +
    • lastlinedefined: +the line number where the definition of the function ends. +
    • + +
    • what: +the string "Lua" if the function is a Lua function, +"C" if it is a C function, +"main" if it is the main part of a chunk. +
    • + +
    • currentline: +the current line where the given function is executing. +When no line information is available, +currentline is set to -1. +
    • + +
    • name: +a reasonable name for the given function. +Because functions in Lua are first-class values, +they do not have a fixed name: +some functions can be the value of multiple global variables, +while others can be stored only in a table field. +The lua_getinfo function checks how the function was +called to find a suitable name. +If it cannot find a name, +then name is set to NULL. +
    • + +
    • namewhat: +explains the name field. +The value of namewhat can be +"global", "local", "method", +"field", "upvalue", or "" (the empty string), +according to how the function was called. +(Lua uses the empty string when no other option seems to apply.) +
    • + +
    • istailcall: +true if this function invocation was called by a tail call. +In this case, the caller of this level is not in the stack. +
    • + +
    • nups: +the number of upvalues of the function. +
    • + +
    • nparams: +the number of parameters of the function +(always 0 for C functions). +
    • + +
    • isvararg: +true if the function is a vararg function +(always true for C functions). +
    • + +
    • ftransfer: +the index on the stack of the first value being "transferred", +that is, parameters in a call or return values in a return. +(The other values are in consecutive indices.) +Using this index, you can access and modify these values +through lua_getlocal and lua_setlocal. +This field is only meaningful during a +call hook, denoting the first parameter, +or a return hook, denoting the first value being returned. +(For call hooks, this value is always 1.) +
    • + +
    • ntransfer: +The number of values being transferred (see previous item). +(For calls of Lua functions, +this value is always equal to nparams.) +
    • + +
    + + + + +

    lua_gethook

    +[-0, +0, –] +

    lua_Hook lua_gethook (lua_State *L);
    + +

    +Returns the current hook function. + + + + + +


    lua_gethookcount

    +[-0, +0, –] +

    int lua_gethookcount (lua_State *L);
    + +

    +Returns the current hook count. + + + + + +


    lua_gethookmask

    +[-0, +0, –] +

    int lua_gethookmask (lua_State *L);
    + +

    +Returns the current hook mask. + + + + + +


    lua_getinfo

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

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

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

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

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

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

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

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

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

      +This is the only option that can raise a memory error. +

    • + +
    + +

    +This function returns 0 to signal an invalid option in what; +even then the valid options are handled correctly. + + + + + +


    lua_getlocal

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

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

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

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

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

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

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


    lua_getstack

    +[-0, +0, –] +

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

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

    +This function fills parts of a lua_Debug structure with +an identification of the activation record +of the function executing at a given level. +Level 0 is the current running function, +whereas level n+1 is the function that has called level n +(except for tail calls, which do not count on the stack). +When called with a level greater than the stack depth, +lua_getstack returns 0; +otherwise it returns 1. + + + + + +


    lua_getupvalue

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

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

    +Gets information about the n-th upvalue +of the closure at index funcindex. +It pushes the upvalue's value onto the stack +and returns its name. +Returns NULL (and pushes nothing) +when the index n is greater than the number of upvalues. + + +

    +See debug.getupvalue for more information about upvalues. + + + + + +


    lua_Hook

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

    +Type for debugging hook functions. + + +

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

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

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

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

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


    lua_setcstacklimit

    +[-0, +0, –] +

    int (lua_setcstacklimit) (lua_State *L, unsigned int limit);
    + +

    +Sets a new limit for the C stack. +This limit controls how deeply nested calls can go in Lua, +with the intent of avoiding a stack overflow. +Returns the old limit in case of success, +or zero in case of error. +For more details about this function, +see debug.setcstacklimit, +its equivalent in the standard library. + + + + + +


    lua_sethook

    +[-0, +0, –] +

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

    +Sets the debugging hook function. + + +

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

      + +
    • The call hook: is called when the interpreter calls a function. +The hook is called just after Lua enters the new function, +before the function gets its arguments. +
    • + +
    • The return hook: is called when the interpreter returns from a function. +The hook is called just before Lua leaves the function. +
    • + +
    • The line hook: is called when the interpreter is about to +start the execution of a new line of code, +or when it jumps back in the code (even to the same line). +This event only happens while Lua is executing a Lua function. +
    • + +
    • The count hook: is called after the interpreter executes every +count instructions. +This event only happens while Lua is executing a Lua function. +
    • + +
    + +

    +Hooks are disabled by setting mask to zero. + + + + + +


    lua_setlocal

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

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

    +Sets the value of a local variable of a given activation record. +It assigns the value on the top of the stack +to the variable and returns its name. +It also pops the value from the stack. + + +

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

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


    lua_setupvalue

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

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

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

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

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


    lua_upvalueid

    +[-0, +0, –] +

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

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

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

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


    lua_upvaluejoin

    +[-0, +0, –] +

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

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

    5 – The Auxiliary Library

    + + + +

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

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

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

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

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

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

    5.1 – Functions and Types

    + +

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


    luaL_addchar

    +[-?, +?, m] +

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

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


    luaL_addgsub

    +[-0, +0, m] +

    const void luaL_addgsub (luaL_Buffer *B, const char *s,
    +                         const char *p, const char *r);
    + +

    +Adds a copy of the string s to the buffer B (see luaL_Buffer), +replacing any occurrence of the string p +with the string r. + + + + + +


    luaL_addlstring

    +[-?, +?, m] +

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

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


    luaL_addsize

    +[-?, +?, –] +

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

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


    luaL_addstring

    +[-?, +?, m] +

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

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


    luaL_addvalue

    +[-1, +?, m] +

    void luaL_addvalue (luaL_Buffer *B);
    + +

    +Adds the value on the top of the stack +to the buffer B +(see luaL_Buffer). +Pops the value. + + +

    +This is the only function on string buffers that can (and must) +be called with an extra element on the stack, +which is the value to be added to the buffer. + + + + + +


    luaL_argcheck

    +[-0, +0, v] +

    void luaL_argcheck (lua_State *L,
    +                    int cond,
    +                    int arg,
    +                    const char *extramsg);
    + +

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


    luaL_argerror

    +[-0, +0, v] +

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

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

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

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


    luaL_argexpected

    +[-0, +0, v] +

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

    +Checks whether cond is true. +If it is not, raises an error about the type of the argument arg +with a standard message (see luaL_typeerror). + + + + + +


    luaL_Buffer

    +
    typedef struct luaL_Buffer luaL_Buffer;
    + +

    +Type for a string buffer. + + +

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

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

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

      + +
    • First declare a variable b of type luaL_Buffer.
    • + +
    • Then initialize it and preallocate a space of +size sz with a call luaL_buffinitsize(L, &b, sz).
    • + +
    • Then produce the string into that space.
    • + +
    • +Finish by calling luaL_pushresultsize(&b, sz), +where sz is the total size of the resulting string +copied into that space (which may be less than or +equal to the preallocated size). +
    • + +
    + +

    +During its normal operation, +a string buffer uses a variable number of stack slots. +So, while using a buffer, you cannot assume that you know where +the top of the stack is. +You can use the stack between successive calls to buffer operations +as long as that use is balanced; +that is, +when you call a buffer operation, +the stack is at the same level +it was immediately after the previous buffer operation. +(The only exception to this rule is luaL_addvalue.) +After calling luaL_pushresult, +the stack is back to its level when the buffer was initialized, +plus the final string on its top. + + + + + +


    luaL_buffaddr

    +[-0, +0, –] +

    char *luaL_buffaddr (luaL_Buffer *B);
    + +

    +Returns the address of the current content of buffer B +(see luaL_Buffer). +Note that any addition to the buffer may invalidate this address. + + + + + +


    luaL_buffinit

    +[-0, +0, –] +

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

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


    luaL_bufflen

    +[-0, +0, –] +

    size_t luaL_bufflen (luaL_Buffer *B);
    + +

    +Returns the length of the current content of buffer B +(see luaL_Buffer). + + + + + +


    luaL_buffinitsize

    +[-?, +?, m] +

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

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


    luaL_buffsub

    +[-0, +0, –] +

    void luaL_buffsub (luaL_Buffer *B, int n);
    + +

    +Removes n bytes from the the buffer B +(see luaL_Buffer). +The buffer must have at least that many bytes. + + + + + +


    luaL_callmeta

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

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

    +Calls a metamethod. + + +

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


    luaL_checkany

    +[-0, +0, v] +

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

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


    luaL_checkinteger

    +[-0, +0, v] +

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

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


    luaL_checklstring

    +[-0, +0, v] +

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

    +Checks whether the function argument arg is a string +and returns this string; +if l is not NULL fills its referent +with the string's length. + + +

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


    luaL_checknumber

    +[-0, +0, v] +

    lua_Number luaL_checknumber (lua_State *L, int arg);
    + +

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


    luaL_checkoption

    +[-0, +0, v] +

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

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

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

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


    luaL_checkstack

    +[-0, +0, v] +

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

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


    luaL_checkstring

    +[-0, +0, v] +

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

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

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


    luaL_checktype

    +[-0, +0, v] +

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

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


    luaL_checkudata

    +[-0, +0, v] +

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

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


    luaL_checkversion

    +[-0, +0, v] +

    void luaL_checkversion (lua_State *L);
    + +

    +Checks whether the code making the call and the Lua library being called +are using the same version of Lua and the same numeric types. + + + + + +


    luaL_dofile

    +[-0, +?, m] +

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

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

    +     (luaL_loadfile(L, filename) || lua_pcall(L, 0, LUA_MULTRET, 0))
    +

    +It returns LUA_OK if there are no errors, +or an error code in case of errors (see §4.4.1). + + + + + +


    luaL_dostring

    +[-0, +?, –] +

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

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

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

    +It returns LUA_OK if there are no errors, +or an error code in case of errors (see §4.4.1). + + + + + +


    luaL_error

    +[-0, +0, v] +

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

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

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


    luaL_execresult

    +[-0, +3, m] +

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

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


    luaL_fileresult

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

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

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


    luaL_getmetafield

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

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

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


    luaL_getmetatable

    +[-0, +1, m] +

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

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


    luaL_getsubtable

    +[-0, +1, e] +

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

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


    luaL_gsub

    +[-0, +1, m] +

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

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


    luaL_len

    +[-0, +0, e] +

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

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


    luaL_loadbuffer

    +[-0, +1, –] +

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

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


    luaL_loadbufferx

    +[-0, +1, –] +

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

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

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


    luaL_loadfile

    +[-0, +1, m] +

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

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


    luaL_loadfilex

    +[-0, +1, m] +

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

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

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

    +This function returns the same results as lua_load +or LUA_ERRFILE for file-related errors. + + +

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


    luaL_loadstring

    +[-0, +1, –] +

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

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

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

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


    luaL_newlib

    +[-0, +1, m] +

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

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

    +It is implemented as the following macro: + +

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

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


    luaL_newlibtable

    +[-0, +1, m] +

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

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

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


    luaL_newmetatable

    +[-0, +1, m] +

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

    +If the registry already has the key tname, +returns 0. +Otherwise, +creates a new table to be used as a metatable for userdata, +adds to this new table the pair __name = tname, +adds to the registry the pair [tname] = new table, +and returns 1. + + +

    +In both cases, +the function pushes onto the stack the final value associated +with tname in the registry. + + + + + +


    luaL_newstate

    +[-0, +0, –] +

    lua_State *luaL_newstate (void);
    + +

    +Creates a new Lua state. +It calls lua_newstate with an +allocator based on the standard C allocation functions +and then sets a warning function and a panic function (see §4.4) +that print messages to the standard error output. + + +

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


    luaL_openlibs

    +[-0, +0, e] +

    void luaL_openlibs (lua_State *L);
    + +

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


    luaL_opt

    +[-0, +0, –] +

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

    +This macro is defined as follows: + +

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

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


    luaL_optinteger

    +[-0, +0, v] +

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

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


    luaL_optlstring

    +[-0, +0, v] +

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

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

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

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


    luaL_optnumber

    +[-0, +0, v] +

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

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


    luaL_optstring

    +[-0, +0, v] +

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

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


    luaL_prepbuffer

    +[-?, +?, m] +

    char *luaL_prepbuffer (luaL_Buffer *B);
    + +

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


    luaL_prepbuffsize

    +[-?, +?, m] +

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

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


    luaL_pushfail

    +[-0, +1, –] +

    void luaL_pushfail (lua_State *L);
    + +

    +Pushes the fail value onto the stack (see §6). + + + + + +


    luaL_pushresult

    +[-?, +1, m] +

    void luaL_pushresult (luaL_Buffer *B);
    + +

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


    luaL_pushresultsize

    +[-?, +1, m] +

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

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


    luaL_ref

    +[-1, +0, m] +

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

    +Creates and returns a reference, +in the table at index t, +for the object on the top of the stack (and pops the object). + + +

    +A reference is a unique integer key. +As long as you do not manually add integer keys into the table t, +luaL_ref ensures the uniqueness of the key it returns. +You can retrieve an object referred by the reference r +by calling lua_rawgeti(L, t, r). +The function luaL_unref frees a reference. + + +

    +If the object on the top of the stack is nil, +luaL_ref returns the constant LUA_REFNIL. +The constant LUA_NOREF is guaranteed to be different +from any reference returned by luaL_ref. + + + + + +


    luaL_Reg

    +
    typedef struct luaL_Reg {
    +  const char *name;
    +  lua_CFunction func;
    +} luaL_Reg;
    + +

    +Type for arrays of functions to be registered by +luaL_setfuncs. +name is the function name and func is a pointer to +the function. +Any array of luaL_Reg must end with a sentinel entry +in which both name and func are NULL. + + + + + +


    luaL_requiref

    +[-0, +1, e] +

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

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

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

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


    luaL_setfuncs

    +[-nup, +0, m] +

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

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

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


    luaL_setmetatable

    +[-0, +0, –] +

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

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


    luaL_Stream

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

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

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

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


    luaL_testudata

    +[-0, +0, m] +

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

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


    luaL_tolstring

    +[-0, +1, e] +

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

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

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


    luaL_traceback

    +[-0, +1, m] +

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

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


    luaL_typeerror

    +[-0, +0, v] +

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

    +Raises a type error for the argument arg +of the C function that called it, +using a standard message; +tname is a "name" for the expected type. +This function never returns. + + + + + +


    luaL_typename

    +[-0, +0, –] +

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

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


    luaL_unref

    +[-0, +0, –] +

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

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

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


    luaL_where

    +[-0, +1, m] +

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

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

    +     chunkname:currentline:
    +

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

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

    6 – The Standard Libraries

    + + + +

    +The standard Lua libraries provide useful functions +that are implemented in C through the C API. +Some of these functions provide essential services to the language +(e.g., type and getmetatable); +others provide access to outside services (e.g., I/O); +and others could be implemented in Lua itself, +but that for different reasons +deserve an implementation in C (e.g., table.sort). + + +

    +All libraries are implemented through the official C API +and are provided as separate C modules. +Unless otherwise noted, +these library functions do not adjust its number of arguments +to its expected parameters. +For instance, a function documented as foo(arg) +should not be called without an argument. + + +

    +The notation fail means a false value representing +some kind of failure. +(Currently, fail is equal to nil, +but that may change in future versions. +The recommendation is to always test the success of these functions +with (not status), instead of (status == nil).) + + +

    +Currently, Lua has the following standard libraries: + +

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

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

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

    6.1 – Basic Functions

    + +

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

    +


    assert (v [, message])

    + + +

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

    +


    collectgarbage ([opt [, arg]])

    + + +

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

      + +
    • "collect": +Performs a full garbage-collection cycle. +This is the default option. +
    • + +
    • "stop": +Stops automatic execution of the garbage collector. +The collector will run only when explicitly invoked, +until a call to restart it. +
    • + +
    • "restart": +Restarts automatic execution of the garbage collector. +
    • + +
    • "count": +Returns the total memory in use by Lua in Kbytes. +The value has a fractional part, +so that it multiplied by 1024 +gives the exact number of bytes in use by Lua. +
    • + +
    • "step": +Performs a garbage-collection step. +The step "size" is controlled by arg. +With a zero value, +the collector will perform one basic (indivisible) step. +For non-zero values, +the collector will perform as if that amount of memory +(in Kbytes) had been allocated by Lua. +Returns true if the step finished a collection cycle. +
    • + +
    • "isrunning": +Returns a boolean that tells whether the collector is running +(i.e., not stopped). +
    • + +
    • "incremental": +Change the collector mode to incremental. +This option can be followed by three numbers: +the garbage-collector pause, +the step multiplier, +and the step size (see §2.5.1). +A zero means to not change that value. +
    • + +
    • "generational": +Change the collector mode to generational. +This option can be followed by two numbers: +the garbage-collector minor multiplier +and the major multiplier (see §2.5.2). +A zero means to not change that value. +
    • + +

    +See §2.5 for more details about garbage collection +and some of these options. + + + + +

    +


    dofile ([filename])

    +Opens the named file and executes its content as a Lua chunk. +When called without arguments, +dofile executes the content of the standard input (stdin). +Returns all values returned by the chunk. +In case of errors, dofile propagates the error +to its caller. +(That is, dofile does not run in protected mode.) + + + + +

    +


    error (message [, level])

    +Raises an error (see §2.3) with @{message} as the error object. +This function never returns. + + +

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

    +


    _G

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

    +


    getmetatable (object)

    + + +

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

    +


    ipairs (t)

    + + +

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

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

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

    +


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

    + + +

    +Loads a chunk. + + +

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

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

    +When you load a main chunk, +the resulting function will always have exactly one upvalue, +the _ENV variable (see §2.2). +However, +when you load a binary chunk created from a function (see string.dump), +the resulting function can have an arbitrary number of upvalues, +and there is no guarantee that its first upvalue will be +the _ENV variable. +(A non-main function may not even have an _ENV upvalue.) + + +

    +Regardless, if the resulting function has any upvalues, +its first upvalue is set to the value of env, +if that parameter is given, +or to the value of the global environment. +Other upvalues are initialized with nil. +All upvalues are fresh, that is, +they are not shared with any other function. + + +

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

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

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

    +


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

    + + +

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

    +


    next (table [, index])

    + + +

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

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

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

    +


    pairs (t)

    + + +

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

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

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

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

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

    +


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

    + + +

    +Calls the function f with +the given arguments in protected mode. +This means that any error inside f is not propagated; +instead, pcall catches the error +and returns a status code. +Its first result is the status code (a boolean), +which is true if the call succeeds without errors. +In such case, pcall also returns all results from the call, +after this first result. +In case of any error, pcall returns false plus the error object. +Note that errors caught by pcall do not call a message handler. + + + + +

    +


    print (···)

    +Receives any number of arguments +and prints their values to stdout, +converting each argument to a string +following the same rules of tostring. + + +

    +The function print is not intended for formatted output, +but only as a quick way to show a value, +for instance for debugging. +For complete control over the output, +use string.format and io.write. + + + + +

    +


    rawequal (v1, v2)

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

    +


    rawget (table, index)

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

    +


    rawlen (v)

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

    +


    rawset (table, index, value)

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

    +This function returns table. + + + + +

    +


    select (index, ···)

    + + +

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

    +


    setmetatable (table, metatable)

    + + +

    +Sets the metatable for the given table. +If metatable is nil, +removes the metatable of the given table. +If the original metatable has a __metatable field, +raises an error. + + +

    +This function returns table. + + +

    +To change the metatable of other types from Lua code, +you must use the debug library (§6.10). + + + + +

    +


    tonumber (e [, base])

    + + +

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

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

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

    +


    tostring (v)

    + + +

    +Receives a value of any type and +converts it to a string in a human-readable format. + + +

    +If the metatable of v has a __tostring field, +then tostring calls the corresponding value +with v as argument, +and uses the result of the call as its result. +Otherwise, if the metatable of v has a __name field +with a string value, +tostring may use that string in its final result. + + +

    +For complete control of how numbers are converted, +use string.format. + + + + +

    +


    type (v)

    + + +

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

    +


    _VERSION

    + + +

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

    +


    warn (msg1, ···)

    + + +

    +Emits a warning with a message composed by the concatenation +of all its arguments (which should be strings). + + +

    +By convention, +a one-piece message starting with '@' +is intended to be a control message, +which is a message to the warning system itself. +In particular, the standard warning function in Lua +recognizes the control messages "@off", +to stop the emission of warnings, +and "@on", to (re)start the emission; +it ignores unknown control messages. + + + + +

    +


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

    + + +

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

    6.2 – Coroutine Manipulation

    + +

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

    +


    coroutine.close (co)

    + + +

    +Closes coroutine co, +that is, +closes all its pending to-be-closed variables +and puts the coroutine in a dead state. +The given coroutine must be dead or suspended. +In case of error closing some variable, +returns false plus the error object; +otherwise returns true. + + + + +

    +


    coroutine.create (f)

    + + +

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

    +


    coroutine.isyieldable ([co])

    + + +

    +Returns true when the coroutine co can yield. +The default for co is the running coroutine. + + +

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

    +


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

    + + +

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

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

    +


    coroutine.running ()

    + + +

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

    +


    coroutine.status (co)

    + + +

    +Returns the status of the coroutine co, as a string: +"running", +if the coroutine is running +(that is, it is the one that called status); +"suspended", if the coroutine is suspended in a call to yield, +or if it has not started running yet; +"normal" if the coroutine is active but not running +(that is, it has resumed another coroutine); +and "dead" if the coroutine has finished its body function, +or if it has stopped with an error. + + + + +

    +


    coroutine.wrap (f)

    + + +

    +Creates a new coroutine, with body f; +f must be a function. +Returns a function that resumes the coroutine each time it is called. +Any arguments passed to this function behave as the +extra arguments to resume. +The function returns the same values returned by resume, +except the first boolean. +In case of error, +the function closes the coroutine and propagates the error. + + + + +

    +


    coroutine.yield (···)

    + + +

    +Suspends the execution of the calling coroutine. +Any arguments to yield are passed as extra results to resume. + + + + + + + +

    6.3 – Modules

    + +

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

    +


    require (modname)

    + + +

    +Loads the given module. +The function starts by looking into the package.loaded table +to determine whether modname is already loaded. +If it is, then require returns the value stored +at package.loaded[modname]. +(The absence of a second result in this case +signals that this call did not have to load the module.) +Otherwise, it tries to find a loader for the module. + + +

    +To find a loader, +require is guided by the table package.searchers. +Each item in this table is a search function, +that searches for the module in a particular way. +By changing this table, +we can change how require looks for a module. +The following explanation is based on the default configuration +for package.searchers. + + +

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

    +Once a loader is found, +require calls the loader with two arguments: +modname and an extra value, +a loader data, +also returned by the searcher. +The loader data can be any value useful to the module; +for the default searchers, +it indicates where the loader was found. +(For instance, if the loader came from a file, +this extra value is the file path.) +If the loader returns any non-nil value, +require assigns the returned value to package.loaded[modname]. +If the loader does not return a non-nil value and +has not assigned any value to package.loaded[modname], +then require assigns true to this entry. +In any case, require returns the +final value of package.loaded[modname]. +Besides that value, require also returns as a second result +the loader data returned by the searcher, +which indicates how require found the module. + + +

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

    +


    package.config

    + + +

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

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

    +


    package.cpath

    + + +

    +A string with the path used by require +to search for a C loader. + + +

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

    +


    package.loaded

    + + +

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

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

    +


    package.loadlib (libname, funcname)

    + + +

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

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

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

    +This function is not supported by Standard C. +As such, it is only available on some platforms +(Windows, Linux, Mac OS X, Solaris, BSD, +plus other Unix systems that support the dlfcn standard). + + + + +

    +


    package.path

    + + +

    +A string with the path used by require +to search for a Lua loader. + + +

    +At start-up, Lua initializes this variable with +the value of the environment variable LUA_PATH_5_4 or +the environment variable LUA_PATH or +with a default path defined in luaconf.h, +if those environment variables are not defined. +A ";;" in the value of the environment variable +is replaced by the default path. + + + + +

    +


    package.preload

    + + +

    +A table to store loaders for specific modules +(see require). + + +

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

    +


    package.searchers

    + + +

    +A table used by require to control how to find modules. + + +

    +Each entry in this table is a searcher function. +When looking for a module, +require calls each of these searchers in ascending order, +with the module name (the argument given to require) as its +sole argument. +If the searcher finds the module, +it returns another function, the module loader, +plus an extra value, a loader data, +that will be passed to that loader and +returned as a second result by require. +If it cannot find the module, +it returns a string explaining why +(or nil if it has nothing to say). + + +

    +Lua initializes this table with four searcher functions. + + +

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

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

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

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

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

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

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

    +Searchers should raise no errors and have no side effects in Lua. +(They may have side effects in C, +for instance by linking the application with a library.) + + + + +

    +


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

    + + +

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

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

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

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

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

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

    6.4 – String Manipulation

    + + + +

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

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

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

    +


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

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

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

    +


    string.char (···)

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

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

    +


    string.dump (function [, strip])

    + + +

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

    +Functions with upvalues have only their number of upvalues saved. +When (re)loaded, +those upvalues receive fresh instances. +(See the load function for details about +how these upvalues are initialized. +You can use the debug library to serialize +and reload the upvalues of a function +in a way adequate to your needs.) + + + + +

    +


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

    + + +

    +Looks for the first match of +pattern (see §6.4.1) in the string s. +If it finds a match, then find returns the indices of s +where this occurrence starts and ends; +otherwise, it returns fail. +A third, optional numeric argument init specifies +where to start the search; +its default value is 1 and can be negative. +A value of true as a fourth, optional argument plain +turns off the pattern matching facilities, +so the function does a plain "find substring" operation, +with no characters in pattern being considered magic. + + +

    +If the pattern has captures, +then in a successful match +the captured values are also returned, +after the two indices. + + + + +

    +


    string.format (formatstring, ···)

    + + +

    +Returns a formatted version of its variable number of arguments +following the description given in its first argument, +which must be a string. +The format string follows the same rules as the ISO C function sprintf. +The only differences are that the conversion specifiers and modifiers +*, h, L, l, and n are not supported +and that there is an extra specifier, q. + + +

    +The specifier q formats booleans, nil, numbers, and strings +in a way that the result is a valid constant in Lua source code. +Booleans and nil are written in the obvious way +(true, false, nil). +Floats are written in hexadecimal, +to preserve full precision. +A string is written between double quotes, +using escape sequences when necessary to ensure that +it can safely be read back by the Lua interpreter. +For instance, the call + +

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

    +may produce the string: + +

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

    +This specifier does not support modifiers (flags, width, length). + + +

    +The conversion specifiers +A, a, E, e, f, +G, and g all expect a number as argument. +The specifiers c, d, +i, o, u, X, and x +expect an integer. +When Lua is compiled with a C89 compiler, +the specifiers A and a (hexadecimal floats) +do not support modifiers. + + +

    +The specifier s expects a string; +if its argument is not a string, +it is converted to one following the same rules of tostring. +If the specifier has any modifier, +the corresponding string argument should not contain embedded zeros. + + +

    +The specifier p formats the pointer +returned by lua_topointer. +That gives a unique string identifier for tables, userdata, +threads, strings, and functions. +For other values (numbers, nil, booleans), +this specifier results in a string representing +the pointer NULL. + + + + +

    +


    string.gmatch (s, pattern [, init])

    +Returns an iterator function that, +each time it is called, +returns the next captures from pattern (see §6.4.1) +over the string s. +If pattern specifies no captures, +then the whole match is produced in each call. +A third, optional numeric argument init specifies +where to start the search; +its default value is 1 and can be negative. + + +

    +As an example, the following loop +will iterate over all the words from string s, +printing one per line: + +

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

    +The next example collects all pairs key=value from the +given string into a table: + +

    +     t = {}
    +     s = "from=world, to=Lua"
    +     for k, v in string.gmatch(s, "(%w+)=(%w+)") do
    +       t[k] = v
    +     end
    +
    + +

    +For this function, a caret '^' at the start of a pattern does not +work as an anchor, as this would prevent the iteration. + + + + +

    +


    string.gsub (s, pattern, repl [, n])

    +Returns a copy of s +in which all (or the first n, if given) +occurrences of the pattern (see §6.4.1) have been +replaced by a replacement string specified by repl, +which can be a string, a table, or a function. +gsub also returns, as its second value, +the total number of matches that occurred. +The name gsub comes from Global SUBstitution. + + +

    +If repl is a string, then its value is used for replacement. +The character % works as an escape character: +any sequence in repl of the form %d, +with d between 1 and 9, +stands for the value of the d-th captured substring; +the sequence %0 stands for the whole match; +the sequence %% stands for a single %. + + +

    +If repl is a table, then the table is queried for every match, +using the first capture as the key. + + +

    +If repl is a function, then this function is called every time a +match occurs, with all captured substrings passed as arguments, +in order. + + +

    +In any case, +if the pattern specifies no captures, +then it behaves as if the whole pattern was inside a capture. + + +

    +If the value returned by the table query or by the function call +is a string or a number, +then it is used as the replacement string; +otherwise, if it is false or nil, +then there is no replacement +(that is, the original match is kept in the string). + + +

    +Here are some examples: + +

    +     x = string.gsub("hello world", "(%w+)", "%1 %1")
    +     --> x="hello hello world world"
    +     
    +     x = string.gsub("hello world", "%w+", "%0 %0", 1)
    +     --> x="hello hello world"
    +     
    +     x = string.gsub("hello world from Lua", "(%w+)%s*(%w+)", "%2 %1")
    +     --> x="world hello Lua from"
    +     
    +     x = string.gsub("home = $HOME, user = $USER", "%$(%w+)", os.getenv)
    +     --> x="home = /home/roberto, user = roberto"
    +     
    +     x = string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s)
    +           return load(s)()
    +         end)
    +     --> x="4+5 = 9"
    +     
    +     local t = {name="lua", version="5.4"}
    +     x = string.gsub("$name-$version.tar.gz", "%$(%w+)", t)
    +     --> x="lua-5.4.tar.gz"
    +
    + + + +

    +


    string.len (s)

    + + +

    +Receives a string and returns its length. +The empty string "" has length 0. +Embedded zeros are counted, +so "a\000bc\000" has length 5. + + + + +

    +


    string.lower (s)

    + + +

    +Receives a string and returns a copy of this string with all +uppercase letters changed to lowercase. +All other characters are left unchanged. +The definition of what an uppercase letter is depends on the current locale. + + + + +

    +


    string.match (s, pattern [, init])

    + + +

    +Looks for the first match of +the pattern (see §6.4.1) in the string s. +If it finds one, then match returns +the captures from the pattern; +otherwise it returns fail. +If pattern specifies no captures, +then the whole match is returned. +A third, optional numeric argument init specifies +where to start the search; +its default value is 1 and can be negative. + + + + +

    +


    string.pack (fmt, v1, v2, ···)

    + + +

    +Returns a binary string containing the values v1, v2, etc. +serialized in binary form (packed) +according to the format string fmt (see §6.4.2). + + + + +

    +


    string.packsize (fmt)

    + + +

    +Returns the size of a string resulting from string.pack +with the given format. +The format string cannot have the variable-length options +'s' or 'z' (see §6.4.2). + + + + +

    +


    string.rep (s, n [, sep])

    + + +

    +Returns a string that is the concatenation of n copies of +the string s separated by the string sep. +The default value for sep is the empty string +(that is, no separator). +Returns the empty string if n is not positive. + + +

    +(Note that it is very easy to exhaust the memory of your machine +with a single call to this function.) + + + + +

    +


    string.reverse (s)

    + + +

    +Returns a string that is the string s reversed. + + + + +

    +


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

    + + +

    +Returns the substring of s that +starts at i and continues until j; +i and j can be negative. +If j is absent, then it is assumed to be equal to -1 +(which is the same as the string length). +In particular, +the call string.sub(s,1,j) returns a prefix of s +with length j, +and string.sub(s, -i) (for a positive i) +returns a suffix of s +with length i. + + +

    +If, after the translation of negative indices, +i is less than 1, +it is corrected to 1. +If j is greater than the string length, +it is corrected to that length. +If, after these corrections, +i is greater than j, +the function returns the empty string. + + + + +

    +


    string.unpack (fmt, s [, pos])

    + + +

    +Returns the values packed in string s (see string.pack) +according to the format string fmt (see §6.4.2). +An optional pos marks where +to start reading in s (default is 1). +After the read values, +this function also returns the index of the first unread byte in s. + + + + +

    +


    string.upper (s)

    + + +

    +Receives a string and returns a copy of this string with all +lowercase letters changed to uppercase. +All other characters are left unchanged. +The definition of what a lowercase letter is depends on the current locale. + + + + + + + +

    6.4.1 – Patterns

    + + + +

    +Patterns in Lua are described by regular strings, +which are interpreted as patterns by the pattern-matching functions +string.find, +string.gmatch, +string.gsub, +and string.match. +This section describes the syntax and the meaning +(that is, what they match) of these strings. + + + + + +

    Character Class:

    +A character class is used to represent a set of characters. +The following combinations are allowed in describing a character class: + +

      + +
    • x: +(where x is not one of the magic characters +^$()%.[]*+-?) +represents the character x itself. +
    • + +
    • .: (a dot) represents all characters.
    • + +
    • %a: represents all letters.
    • + +
    • %c: represents all control characters.
    • + +
    • %d: represents all digits.
    • + +
    • %g: represents all printable characters except space.
    • + +
    • %l: represents all lowercase letters.
    • + +
    • %p: represents all punctuation characters.
    • + +
    • %s: represents all space characters.
    • + +
    • %u: represents all uppercase letters.
    • + +
    • %w: represents all alphanumeric characters.
    • + +
    • %x: represents all hexadecimal digits.
    • + +
    • %x: (where x is any non-alphanumeric character) +represents the character x. +This is the standard way to escape the magic characters. +Any non-alphanumeric character +(including all punctuation characters, even the non-magical) +can be preceded by a '%' to represent itself in a pattern. +
    • + +
    • [set]: +represents the class which is the union of all +characters in set. +A range of characters can be specified by +separating the end characters of the range, +in ascending order, with a '-'. +All classes %x described above can also be used as +components in set. +All other characters in set represent themselves. +For example, [%w_] (or [_%w]) +represents all alphanumeric characters plus the underscore, +[0-7] represents the octal digits, +and [0-7%l%-] represents the octal digits plus +the lowercase letters plus the '-' character. + + +

      +You can put a closing square bracket in a set +by positioning it as the first character in the set. +You can put a hyphen in a set +by positioning it as the first or the last character in the set. +(You can also use an escape for both cases.) + + +

      +The interaction between ranges and classes is not defined. +Therefore, patterns like [%a-z] or [a-%%] +have no meaning. +

    • + +
    • [^set]: +represents the complement of set, +where set is interpreted as above. +
    • + +

    +For all classes represented by single letters (%a, %c, etc.), +the corresponding uppercase letter represents the complement of the class. +For instance, %S represents all non-space characters. + + +

    +The definitions of letter, space, and other character groups +depend on the current locale. +In particular, the class [a-z] may not be equivalent to %l. + + + + + +

    Pattern Item:

    +A pattern item can be + +

      + +
    • +a single character class, +which matches any single character in the class; +
    • + +
    • +a single character class followed by '*', +which matches sequences of zero or more characters in the class. +These repetition items will always match the longest possible sequence; +
    • + +
    • +a single character class followed by '+', +which matches sequences of one or more characters in the class. +These repetition items will always match the longest possible sequence; +
    • + +
    • +a single character class followed by '-', +which also matches sequences of zero or more characters in the class. +Unlike '*', +these repetition items will always match the shortest possible sequence; +
    • + +
    • +a single character class followed by '?', +which matches zero or one occurrence of a character in the class. +It always matches one occurrence if possible; +
    • + +
    • +%n, for n between 1 and 9; +such item matches a substring equal to the n-th captured string +(see below); +
    • + +
    • +%bxy, where x and y are two distinct characters; +such item matches strings that start with x, end with y, +and where the x and y are balanced. +This means that, if one reads the string from left to right, +counting +1 for an x and -1 for a y, +the ending y is the first y where the count reaches 0. +For instance, the item %b() matches expressions with +balanced parentheses. +
    • + +
    • +%f[set], a frontier pattern; +such item matches an empty string at any position such that +the next character belongs to set +and the previous character does not belong to set. +The set set is interpreted as previously described. +The beginning and the end of the subject are handled as if +they were the character '\0'. +
    • + +
    + + + + +

    Pattern:

    +A pattern is a sequence of pattern items. +A caret '^' at the beginning of a pattern anchors the match at the +beginning of the subject string. +A '$' at the end of a pattern anchors the match at the +end of the subject string. +At other positions, +'^' and '$' have no special meaning and represent themselves. + + + + + +

    Captures:

    +A pattern can contain sub-patterns enclosed in parentheses; +they describe captures. +When a match succeeds, the substrings of the subject string +that match captures are stored (captured) for future use. +Captures are numbered according to their left parentheses. +For instance, in the pattern "(a*(.)%w(%s*))", +the part of the string matching "a*(.)%w(%s*)" is +stored as the first capture, and therefore has number 1; +the character matching "." is captured with number 2, +and the part matching "%s*" has number 3. + + +

    +As a special case, the capture () captures +the current string position (a number). +For instance, if we apply the pattern "()aa()" on the +string "flaaap", there will be two captures: 3 and 5. + + + + + +

    Multiple matches:

    +The function string.gsub and the iterator string.gmatch +match multiple occurrences of the given pattern in the subject. +For these functions, +a new match is considered valid only +if it ends at least one byte after the end of the previous match. +In other words, the pattern machine never accepts the +empty string as a match immediately after another match. +As an example, +consider the results of the following code: + +

    +     > string.gsub("abc", "()a*()", print);
    +     --> 1   2
    +     --> 3   3
    +     --> 4   4
    +

    +The second and third results come from Lua matching an empty +string after 'b' and another one after 'c'. +Lua does not match an empty string after 'a', +because it would end at the same position of the previous match. + + + + + + + +

    6.4.2 – Format Strings for Pack and Unpack

    + +

    +The first argument to string.pack, +string.packsize, and string.unpack +is a format string, +which describes the layout of the structure being created or read. + + +

    +A format string is a sequence of conversion options. +The conversion options are as follows: + +

      +
    • <: sets little endian
    • +
    • >: sets big endian
    • +
    • =: sets native endian
    • +
    • ![n]: sets maximum alignment to n +(default is native alignment)
    • +
    • b: a signed byte (char)
    • +
    • B: an unsigned byte (char)
    • +
    • h: a signed short (native size)
    • +
    • H: an unsigned short (native size)
    • +
    • l: a signed long (native size)
    • +
    • L: an unsigned long (native size)
    • +
    • j: a lua_Integer
    • +
    • J: a lua_Unsigned
    • +
    • T: a size_t (native size)
    • +
    • i[n]: a signed int with n bytes +(default is native size)
    • +
    • I[n]: an unsigned int with n bytes +(default is native size)
    • +
    • f: a float (native size)
    • +
    • d: a double (native size)
    • +
    • n: a lua_Number
    • +
    • cn: a fixed-sized string with n bytes
    • +
    • z: a zero-terminated string
    • +
    • s[n]: a string preceded by its length +coded as an unsigned integer with n bytes +(default is a size_t)
    • +
    • x: one byte of padding
    • +
    • Xop: an empty item that aligns +according to option op +(which is otherwise ignored)
    • +
    • ' ': (space) ignored
    • +

    +(A "[n]" means an optional integral numeral.) +Except for padding, spaces, and configurations +(options "xX <=>!"), +each option corresponds to an argument in string.pack +or a result in string.unpack. + + +

    +For options "!n", "sn", "in", and "In", +n can be any integer between 1 and 16. +All integral options check overflows; +string.pack checks whether the given value fits in the given size; +string.unpack checks whether the read value fits in a Lua integer. +For the unsigned options, +Lua integers are treated as unsigned values too. + + +

    +Any format string starts as if prefixed by "!1=", +that is, +with maximum alignment of 1 (no alignment) +and native endianness. + + +

    +Native endianness assumes that the whole system is +either big or little endian. +The packing functions will not emulate correctly the behavior +of mixed-endian formats. + + +

    +Alignment works as follows: +For each option, +the format gets extra padding until the data starts +at an offset that is a multiple of the minimum between the +option size and the maximum alignment; +this minimum must be a power of 2. +Options "c" and "z" are not aligned; +option "s" follows the alignment of its starting integer. + + +

    +All padding is filled with zeros by string.pack +and ignored by string.unpack. + + + + + + + +

    6.5 – UTF-8 Support

    + +

    +This library provides basic support for UTF-8 encoding. +It provides all its functions inside the table utf8. +This library does not provide any support for Unicode other +than the handling of the encoding. +Any operation that needs the meaning of a character, +such as character classification, is outside its scope. + + +

    +Unless stated otherwise, +all functions that expect a byte position as a parameter +assume that the given position is either the start of a byte sequence +or one plus the length of the subject string. +As in the string library, +negative indices count from the end of the string. + + +

    +Functions that create byte sequences +accept all values up to 0x7FFFFFFF, +as defined in the original UTF-8 specification; +that implies byte sequences of up to six bytes. + + +

    +Functions that interpret byte sequences only accept +valid sequences (well formed and not overlong). +By default, they only accept byte sequences +that result in valid Unicode code points, +rejecting values greater than 10FFFF and surrogates. +A boolean argument lax, when available, +lifts these checks, +so that all values up to 0x7FFFFFFF are accepted. +(Not well formed and overlong sequences are still rejected.) + + +

    +


    utf8.char (···)

    + + +

    +Receives zero or more integers, +converts each one to its corresponding UTF-8 byte sequence +and returns a string with the concatenation of all these sequences. + + + + +

    +


    utf8.charpattern

    + + +

    +The pattern (a string, not a function) "[\0-\x7F\xC2-\xFD][\x80-\xBF]*" +(see §6.4.1), +which matches exactly one UTF-8 byte sequence, +assuming that the subject is a valid UTF-8 string. + + + + +

    +


    utf8.codes (s [, lax])

    + + +

    +Returns values so that the construction + +

    +     for p, c in utf8.codes(s) do body end
    +

    +will iterate over all UTF-8 characters in string s, +with p being the position (in bytes) and c the code point +of each character. +It raises an error if it meets any invalid byte sequence. + + + + +

    +


    utf8.codepoint (s [, i [, j [, lax]]])

    + + +

    +Returns the code points (as integers) from all characters in s +that start between byte position i and j (both included). +The default for i is 1 and for j is i. +It raises an error if it meets any invalid byte sequence. + + + + +

    +


    utf8.len (s [, i [, j [, lax]]])

    + + +

    +Returns the number of UTF-8 characters in string s +that start between positions i and j (both inclusive). +The default for i is 1 and for j is -1. +If it finds any invalid byte sequence, +returns fail plus the position of the first invalid byte. + + + + +

    +


    utf8.offset (s, n [, i])

    + + +

    +Returns the position (in bytes) where the encoding of the +n-th character of s +(counting from position i) starts. +A negative n gets characters before position i. +The default for i is 1 when n is non-negative +and #s + 1 otherwise, +so that utf8.offset(s, -n) gets the offset of the +n-th character from the end of the string. +If the specified character is neither in the subject +nor right after its end, +the function returns fail. + + +

    +As a special case, +when n is 0 the function returns the start of the encoding +of the character that contains the i-th byte of s. + + +

    +This function assumes that s is a valid UTF-8 string. + + + + + + + +

    6.6 – Table Manipulation

    + +

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

    +Remember that, whenever an operation needs the length of a table, +all caveats about the length operator apply (see §3.4.7). +All functions ignore non-numeric keys +in the tables given as arguments. + + +

    +


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

    + + +

    +Given a list where all elements are strings or numbers, +returns the string list[i]..sep..list[i+1] ··· sep..list[j]. +The default value for sep is the empty string, +the default for i is 1, +and the default for j is #list. +If i is greater than j, returns the empty string. + + + + +

    +


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

    + + +

    +Inserts element value at position pos in list, +shifting up the elements +list[pos], list[pos+1], ···, list[#list]. +The default value for pos is #list+1, +so that a call table.insert(t,x) inserts x at the end +of the list t. + + + + +

    +


    table.move (a1, f, e, t [,a2])

    + + +

    +Moves elements from the table a1 to the table a2, +performing the equivalent to the following +multiple assignment: +a2[t],··· = a1[f],···,a1[e]. +The default for a2 is a1. +The destination range can overlap with the source range. +The number of elements to be moved must fit in a Lua integer. + + +

    +Returns the destination table a2. + + + + +

    +


    table.pack (···)

    + + +

    +Returns a new table with all arguments stored into keys 1, 2, etc. +and with a field "n" with the total number of arguments. +Note that the resulting table may not be a sequence, +if some arguments are nil. + + + + +

    +


    table.remove (list [, pos])

    + + +

    +Removes from list the element at position pos, +returning the value of the removed element. +When pos is an integer between 1 and #list, +it shifts down the elements +list[pos+1], list[pos+2], ···, list[#list] +and erases element list[#list]; +The index pos can also be 0 when #list is 0, +or #list + 1. + + +

    +The default value for pos is #list, +so that a call table.remove(l) removes the last element +of the list l. + + + + +

    +


    table.sort (list [, comp])

    + + +

    +Sorts the list elements in a given order, in-place, +from list[1] to list[#list]. +If comp is given, +then it must be a function that receives two list elements +and returns true when the first element must come +before the second in the final order +(so that, after the sort, +i < j implies not comp(list[j],list[i])). +If comp is not given, +then the standard Lua operator < is used instead. + + +

    +Note that the comp function must define +a strict partial order over the elements in the list; +that is, it must be asymmetric and transitive. +Otherwise, no valid sort may be possible. + + +

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

    +


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

    + + +

    +Returns the elements from the given list. +This function is equivalent to + +

    +     return list[i], list[i+1], ···, list[j]
    +

    +By default, i is 1 and j is #list. + + + + + + + +

    6.7 – Mathematical Functions

    + +

    +This library provides basic mathematical functions. +It provides all its functions and constants inside the table math. +Functions with the annotation "integer/float" give +integer results for integer arguments +and float results for non-integer arguments. +The rounding functions +math.ceil, math.floor, and math.modf +return an integer when the result fits in the range of an integer, +or a float otherwise. + + +

    +


    math.abs (x)

    + + +

    +Returns the maximum value between x and -x. (integer/float) + + + + +

    +


    math.acos (x)

    + + +

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

    +


    math.asin (x)

    + + +

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

    +


    math.atan (y [, x])

    + + +

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

    +The default value for x is 1, +so that the call math.atan(y) +returns the arc tangent of y. + + + + +

    +


    math.ceil (x)

    + + +

    +Returns the smallest integral value greater than or equal to x. + + + + +

    +


    math.cos (x)

    + + +

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

    +


    math.deg (x)

    + + +

    +Converts the angle x from radians to degrees. + + + + +

    +


    math.exp (x)

    + + +

    +Returns the value ex +(where e is the base of natural logarithms). + + + + +

    +


    math.floor (x)

    + + +

    +Returns the largest integral value less than or equal to x. + + + + +

    +


    math.fmod (x, y)

    + + +

    +Returns the remainder of the division of x by y +that rounds the quotient towards zero. (integer/float) + + + + +

    +


    math.huge

    + + +

    +The float value HUGE_VAL, +a value greater than any other numeric value. + + + + +

    +


    math.log (x [, base])

    + + +

    +Returns the logarithm of x in the given base. +The default for base is e +(so that the function returns the natural logarithm of x). + + + + +

    +


    math.max (x, ···)

    + + +

    +Returns the argument with the maximum value, +according to the Lua operator <. + + + + +

    +


    math.maxinteger

    +An integer with the maximum value for an integer. + + + + +

    +


    math.min (x, ···)

    + + +

    +Returns the argument with the minimum value, +according to the Lua operator <. + + + + +

    +


    math.mininteger

    +An integer with the minimum value for an integer. + + + + +

    +


    math.modf (x)

    + + +

    +Returns the integral part of x and the fractional part of x. +Its second result is always a float. + + + + +

    +


    math.pi

    + + +

    +The value of π. + + + + +

    +


    math.rad (x)

    + + +

    +Converts the angle x from degrees to radians. + + + + +

    +


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

    + + +

    +When called without arguments, +returns a pseudo-random float with uniform distribution +in the range [0,1). +When called with two integers m and n, +math.random returns a pseudo-random integer +with uniform distribution in the range [m, n]. +The call math.random(n), for a positive n, +is equivalent to math.random(1,n). +The call math.random(0) produces an integer with +all bits (pseudo)random. + + +

    +This function uses the xoshiro256** algorithm to produce +pseudo-random 64-bit integers, +which are the results of calls with argument 0. +Other results (ranges and floats) +are unbiased extracted from these integers. + + +

    +Lua initializes its pseudo-random generator with the equivalent of +a call to math.randomseed with no arguments, +so that math.random should generate +different sequences of results each time the program runs. + + + + +

    +


    math.randomseed ([x [, y]])

    + + +

    +When called with at least one argument, +the integer parameters x and y are +joined into a 128-bit seed that +is used to reinitialize the pseudo-random generator; +equal seeds produce equal sequences of numbers. +The default for y is zero. + + +

    +When called with no arguments, +Lua generates a seed with +a weak attempt for randomness. + + +

    +This function returns the two seed components +that were effectively used, +so that setting them again repeats the sequence. + + +

    +To ensure a required level of randomness to the initial state +(or contrarily, to have a deterministic sequence, +for instance when debugging a program), +you should call math.randomseed with explicit arguments. + + + + +

    +


    math.sin (x)

    + + +

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

    +


    math.sqrt (x)

    + + +

    +Returns the square root of x. +(You can also use the expression x^0.5 to compute this value.) + + + + +

    +


    math.tan (x)

    + + +

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

    +


    math.tointeger (x)

    + + +

    +If the value x is convertible to an integer, +returns that integer. +Otherwise, returns fail. + + + + +

    +


    math.type (x)

    + + +

    +Returns "integer" if x is an integer, +"float" if it is a float, +or fail if x is not a number. + + + + +

    +


    math.ult (m, n)

    + + +

    +Returns a boolean, +true if and only if integer m is below integer n when +they are compared as unsigned integers. + + + + + + + +

    6.8 – Input and Output Facilities

    + +

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

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

    +The metatable for file handles provides metamethods +for __gc and __close that try +to close the file when called. + + +

    +The table io also provides +three predefined file handles with their usual meanings from C: +io.stdin, io.stdout, and io.stderr. +The I/O library never closes these files. + + +

    +Unless otherwise stated, +all I/O functions return fail on failure, +plus an error message as a second result and +a system-dependent error code as a third result, +and some non-false value on success. +On non-POSIX systems, +the computation of the error message and error code +in case of errors +may be not thread safe, +because they rely on the global C variable errno. + + +

    +


    io.close ([file])

    + + +

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

    +


    io.flush ()

    + + +

    +Equivalent to io.output():flush(). + + + + +

    +


    io.input ([file])

    + + +

    +When called with a file name, it opens the named file (in text mode), +and sets its handle as the default input file. +When called with a file handle, +it simply sets this file handle as the default input file. +When called without arguments, +it returns the current default input file. + + +

    +In case of errors this function raises the error, +instead of returning an error code. + + + + +

    +


    io.lines ([filename, ···])

    + + +

    +Opens the given file name in read mode +and returns an iterator function that +works like file:lines(···) over the opened file. +When the iterator function fails to read any value, +it automatically closes the file. +Besides the iterator function, +io.lines returns three other values: +two nil values as placeholders, +plus the created file handle. +Therefore, when used in a generic for loop, +the file is closed also if the loop is interrupted by an +error or a break. + + +

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

    +In case of errors opening the file, +this function raises the error, +instead of returning an error code. + + + + +

    +


    io.open (filename [, mode])

    + + +

    +This function opens a file, +in the mode specified in the string mode. +In case of success, +it returns a new file handle. + + +

    +The mode string can be any of the following: + +

      +
    • "r": read mode (the default);
    • +
    • "w": write mode;
    • +
    • "a": append mode;
    • +
    • "r+": update mode, all previous data is preserved;
    • +
    • "w+": update mode, all previous data is erased;
    • +
    • "a+": append update mode, previous data is preserved, + writing is only allowed at the end of file.
    • +

    +The mode string can also have a 'b' at the end, +which is needed in some systems to open the file in binary mode. + + + + +

    +


    io.output ([file])

    + + +

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

    +


    io.popen (prog [, mode])

    + + +

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

    +Starts the program prog in a separated process and returns +a file handle that you can use to read data from this program +(if mode is "r", the default) +or to write data to this program +(if mode is "w"). + + + + +

    +


    io.read (···)

    + + +

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

    +


    io.tmpfile ()

    + + +

    +In case of success, +returns a handle for a temporary file. +This file is opened in update mode +and it is automatically removed when the program ends. + + + + +

    +


    io.type (obj)

    + + +

    +Checks whether obj is a valid file handle. +Returns the string "file" if obj is an open file handle, +"closed file" if obj is a closed file handle, +or fail if obj is not a file handle. + + + + +

    +


    io.write (···)

    + + +

    +Equivalent to io.output():write(···). + + + + +

    +


    file:close ()

    + + +

    +Closes file. +Note that files are automatically closed when +their handles are garbage collected, +but that takes an unpredictable amount of time to happen. + + +

    +When closing a file handle created with io.popen, +file:close returns the same values +returned by os.execute. + + + + +

    +


    file:flush ()

    + + +

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

    +


    file:lines (···)

    + + +

    +Returns an iterator function that, +each time it is called, +reads the file according to the given formats. +When no format is given, +uses "l" as a default. +As an example, the construction + +

    +     for c in file:lines(1) do body end
    +

    +will iterate over all characters of the file, +starting at the current position. +Unlike io.lines, this function does not close the file +when the loop ends. + + + + +

    +


    file:read (···)

    + + +

    +Reads the file file, +according to the given formats, which specify what to read. +For each format, +the function returns a string or a number with the characters read, +or fail if it cannot read data with the specified format. +(In this latter case, +the function does not read subsequent formats.) +When called without arguments, +it uses a default format that reads the next line +(see below). + + +

    +The available formats are + +

      + +
    • "n": +reads a numeral and returns it as a float or an integer, +following the lexical conventions of Lua. +(The numeral may have leading whitespaces and a sign.) +This format always reads the longest input sequence that +is a valid prefix for a numeral; +if that prefix does not form a valid numeral +(e.g., an empty string, "0x", or "3.4e-") +or it is too long (more than 200 characters), +it is discarded and the format returns fail. +
    • + +
    • "a": +reads the whole file, starting at the current position. +On end of file, it returns the empty string; +this format never fails. +
    • + +
    • "l": +reads the next line skipping the end of line, +returning fail on end of file. +This is the default format. +
    • + +
    • "L": +reads the next line keeping the end-of-line character (if present), +returning fail on end of file. +
    • + +
    • number: +reads a string with up to this number of bytes, +returning fail on end of file. +If number is zero, +it reads nothing and returns an empty string, +or fail on end of file. +
    • + +

    +The formats "l" and "L" should be used only for text files. + + + + +

    +


    file:seek ([whence [, offset]])

    + + +

    +Sets and gets the file position, +measured from the beginning of the file, +to the position given by offset plus a base +specified by the string whence, as follows: + +

      +
    • "set": base is position 0 (beginning of the file);
    • +
    • "cur": base is current position;
    • +
    • "end": base is end of file;
    • +

    +In case of success, seek returns the final file position, +measured in bytes from the beginning of the file. +If seek fails, it returns fail, +plus a string describing the error. + + +

    +The default value for whence is "cur", +and for offset is 0. +Therefore, the call file:seek() returns the current +file position, without changing it; +the call file:seek("set") sets the position to the +beginning of the file (and returns 0); +and the call file:seek("end") sets the position to the +end of the file, and returns its size. + + + + +

    +


    file:setvbuf (mode [, size])

    + + +

    +Sets the buffering mode for a file. +There are three available modes: + +

      +
    • "no": no buffering.
    • +
    • "full": full buffering.
    • +
    • "line": line buffering.
    • +
    + +

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

    +The specific behavior of each mode is non portable; +check the underlying ISO C function setvbuf in your platform for +more details. + + + + +

    +


    file:write (···)

    + + +

    +Writes the value of each of its arguments to file. +The arguments must be strings or numbers. + + +

    +In case of success, this function returns file. + + + + + + + +

    6.9 – Operating System Facilities

    + +

    +This library is implemented through table os. + + +

    +


    os.clock ()

    + + +

    +Returns an approximation of the amount in seconds of CPU time +used by the program, +as returned by the underlying ISO C function clock. + + + + +

    +


    os.date ([format [, time]])

    + + +

    +Returns a string or a table containing date and time, +formatted according to the given string format. + + +

    +If the time argument is present, +this is the time to be formatted +(see the os.time function for a description of this value). +Otherwise, date formats the current time. + + +

    +If format starts with '!', +then the date is formatted in Coordinated Universal Time. +After this optional character, +if format is the string "*t", +then date returns a table with the following fields: +year, month (1–12), day (1–31), +hour (0–23), min (0–59), +sec (0–61, due to leap seconds), +wday (weekday, 1–7, Sunday is 1), +yday (day of the year, 1–366), +and isdst (daylight saving flag, a boolean). +This last field may be absent +if the information is not available. + + +

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

    +If format is absent, it defaults to "%c", +which gives a human-readable date and time representation +using the current locale. + + +

    +On non-POSIX systems, +this function may be not thread safe +because of its reliance on C function gmtime and C function localtime. + + + + +

    +


    os.difftime (t2, t1)

    + + +

    +Returns the difference, in seconds, +from time t1 to time t2 +(where the times are values returned by os.time). +In POSIX, Windows, and some other systems, +this value is exactly t2-t1. + + + + +

    +


    os.execute ([command])

    + + +

    +This function is equivalent to the ISO C function system. +It passes command to be executed by an operating system shell. +Its first result is true +if the command terminated successfully, +or fail otherwise. +After this first result +the function returns a string plus a number, +as follows: + +

      + +
    • "exit": +the command terminated normally; +the following number is the exit status of the command. +
    • + +
    • "signal": +the command was terminated by a signal; +the following number is the signal that terminated the command. +
    • + +
    + +

    +When called without a command, +os.execute returns a boolean that is true if a shell is available. + + + + +

    +


    os.exit ([code [, close]])

    + + +

    +Calls the ISO C function exit to terminate the host program. +If code is true, +the returned status is EXIT_SUCCESS; +if code is false, +the returned status is EXIT_FAILURE; +if code is a number, +the returned status is this number. +The default value for code is true. + + +

    +If the optional second argument close is true, +closes the Lua state before exiting. + + + + +

    +


    os.getenv (varname)

    + + +

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

    +


    os.remove (filename)

    + + +

    +Deletes the file (or empty directory, on POSIX systems) +with the given name. +If this function fails, it returns fail +plus a string describing the error and the error code. +Otherwise, it returns true. + + + + +

    +


    os.rename (oldname, newname)

    + + +

    +Renames the file or directory named oldname to newname. +If this function fails, it returns fail, +plus a string describing the error and the error code. +Otherwise, it returns true. + + + + +

    +


    os.setlocale (locale [, category])

    + + +

    +Sets the current locale of the program. +locale is a system-dependent string specifying a locale; +category is an optional string describing which category to change: +"all", "collate", "ctype", +"monetary", "numeric", or "time"; +the default category is "all". +The function returns the name of the new locale, +or fail if the request cannot be honored. + + +

    +If locale is the empty string, +the current locale is set to an implementation-defined native locale. +If locale is the string "C", +the current locale is set to the standard C locale. + + +

    +When called with nil as the first argument, +this function only returns the name of the current locale +for the given category. + + +

    +This function may be not thread safe +because of its reliance on C function setlocale. + + + + +

    +


    os.time ([table])

    + + +

    +Returns the current time when called without arguments, +or a time representing the local date and time specified by the given table. +This table must have fields year, month, and day, +and may have fields +hour (default is 12), +min (default is 0), +sec (default is 0), +and isdst (default is nil). +Other fields are ignored. +For a description of these fields, see the os.date function. + + +

    +When the function is called, +the values in these fields do not need to be inside their valid ranges. +For instance, if sec is -10, +it means 10 seconds before the time specified by the other fields; +if hour is 1000, +it means 1000 hours after the time specified by the other fields. + + +

    +The returned value is a number, whose meaning depends on your system. +In POSIX, Windows, and some other systems, +this number counts the number +of seconds since some given start time (the "epoch"). +In other systems, the meaning is not specified, +and the number returned by time can be used only as an argument to +os.date and os.difftime. + + +

    +When called with a table, +os.time also normalizes all the fields +documented in the os.date function, +so that they represent the same time as before the call +but with values inside their valid ranges. + + + + +

    +


    os.tmpname ()

    + + +

    +Returns a string with a file name that can +be used for a temporary file. +The file must be explicitly opened before its use +and explicitly removed when no longer needed. + + +

    +In POSIX systems, +this function also creates a file with that name, +to avoid security risks. +(Someone else might create the file with wrong permissions +in the time between getting the name and creating the file.) +You still have to open the file to use it +and to remove it (even if you do not use it). + + +

    +When possible, +you may prefer to use io.tmpfile, +which automatically removes the file when the program ends. + + + + + + + +

    6.10 – The Debug Library

    + +

    +This library provides +the functionality of the debug interface (§4.7) to Lua programs. +You should exert care when using this library. +Several of its functions +violate basic assumptions about Lua code +(e.g., that variables local to a function +cannot be accessed from outside; +that userdata metatables cannot be changed by Lua code; +that Lua programs do not crash) +and therefore can compromise otherwise secure code. +Moreover, some functions in this library may be slow. + + +

    +All functions in this library are provided +inside the debug table. +All functions that operate over a thread +have an optional first argument which is the +thread to operate over. +The default is always the current thread. + + +

    +


    debug.debug ()

    + + +

    +Enters an interactive mode with the user, +running each string that the user enters. +Using simple commands and other debug facilities, +the user can inspect global and local variables, +change their values, evaluate expressions, and so on. +A line containing only the word cont finishes this function, +so that the caller continues its execution. + + +

    +Note that commands for debug.debug are not lexically nested +within any function and so have no direct access to local variables. + + + + +

    +


    debug.gethook ([thread])

    + + +

    +Returns the current hook settings of the thread, as three values: +the current hook function, the current hook mask, +and the current hook count, +as set by the debug.sethook function. + + +

    +Returns fail if there is no active hook. + + + + +

    +


    debug.getinfo ([thread,] f [, what])

    + + +

    +Returns a table with information about a function. +You can give the function directly +or you can give a number as the value of f, +which means the function running at level f of the call stack +of the given thread: +level 0 is the current function (getinfo itself); +level 1 is the function that called getinfo +(except for tail calls, which do not count on the stack); +and so on. +If f is a number greater than the number of active functions, +then getinfo returns fail. + + +

    +The returned table can contain all the fields returned by lua_getinfo, +with the string what describing which fields to fill in. +The default for what is to get all information available, +except the table of valid lines. +If present, +the option 'f' +adds a field named func with the function itself. +If present, +the option 'L' +adds a field named activelines with the table of +valid lines. + + +

    +For instance, the expression debug.getinfo(1,"n").name returns +a name for the current function, +if a reasonable name can be found, +and the expression debug.getinfo(print) +returns a table with all available information +about the print function. + + + + +

    +


    debug.getlocal ([thread,] f, local)

    + + +

    +This function returns the name and the value of the local variable +with index local of the function at level f of the stack. +This function accesses not only explicit local variables, +but also parameters and temporary values. + + +

    +The first parameter or local variable has index 1, and so on, +following the order that they are declared in the code, +counting only the variables that are active +in the current scope of the function. +Compile-time constants may not appear in this listing, +if they were optimized away by the compiler. +Negative indices refer to vararg arguments; +-1 is the first vararg argument. +The function returns fail +if there is no variable with the given index, +and raises an error when called with a level out of range. +(You can call debug.getinfo to check whether the level is valid.) + + +

    +Variable names starting with '(' (open parenthesis) +represent variables with no known names +(internal variables such as loop control variables, +and variables from chunks saved without debug information). + + +

    +The parameter f may also be a function. +In that case, getlocal returns only the name of function parameters. + + + + +

    +


    debug.getmetatable (value)

    + + +

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

    +


    debug.getregistry ()

    + + +

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

    +


    debug.getupvalue (f, up)

    + + +

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

    +(For Lua functions, +upvalues are the external local variables that the function uses, +and that are consequently included in its closure.) + + +

    +For C functions, this function uses the empty string "" +as a name for all upvalues. + + +

    +Variable name '?' (interrogation mark) +represents variables with no known names +(variables from chunks saved without debug information). + + + + +

    +


    debug.getuservalue (u, n)

    + + +

    +Returns the n-th user value associated +to the userdata u plus a boolean, +false if the userdata does not have that value. + + + + +

    +


    debug.setcstacklimit (limit)

    + + +

    +Sets a new limit for the C stack. +This limit controls how deeply nested calls can go in Lua, +with the intent of avoiding a stack overflow. +A limit too small restricts recursive calls pointlessly; +a limit too large exposes the interpreter to stack-overflow crashes. +Unfortunately, there is no way to know a priori +the maximum safe limit for a platform. + + +

    +Each call made from Lua code counts one unit. +Other operations (e.g., calls made from C to Lua or resuming a coroutine) +may have a higher cost. + + +

    +This function has the following restrictions: + +

      +
    • It can only be called from the main coroutine (thread);
    • +
    • It cannot be called while handling a stack-overflow error;
    • +
    • limit must be less than 40000;
    • +
    • limit cannot be less than the amount of C stack in use.
    • +

    +If a call does not respect some restriction, +it returns a false value. +Otherwise, +the call returns the old limit. + + + + +

    +


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

    + + +

    +Sets the given function as the debug hook. +The string mask and the number count describe +when the hook will be called. +The string mask may have any combination of the following characters, +with the given meaning: + +

      +
    • 'c': the hook is called every time Lua calls a function;
    • +
    • 'r': the hook is called every time Lua returns from a function;
    • +
    • 'l': the hook is called every time Lua enters a new line of code.
    • +

    +Moreover, +with a count different from zero, +the hook is called also after every count instructions. + + +

    +When called without arguments, +debug.sethook turns off the hook. + + +

    +When the hook is called, its first parameter is a string +describing the event that has triggered its call: +"call", "tail call", "return", +"line", and "count". +For line events, +the hook also gets the new line number as its second parameter. +Inside a hook, +you can call getinfo with level 2 to get more information about +the running function. +(Level 0 is the getinfo function, +and level 1 is the hook function.) + + + + +

    +


    debug.setlocal ([thread,] level, local, value)

    + + +

    +This function assigns the value value to the local variable +with index local of the function at level level of the stack. +The function returns fail if there is no local +variable with the given index, +and raises an error when called with a level out of range. +(You can call getinfo to check whether the level is valid.) +Otherwise, it returns the name of the local variable. + + +

    +See debug.getlocal for more information about +variable indices and names. + + + + +

    +


    debug.setmetatable (value, table)

    + + +

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

    +


    debug.setupvalue (f, up, value)

    + + +

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

    +See debug.getupvalue for more information about upvalues. + + + + +

    +


    debug.setuservalue (udata, value, n)

    + + +

    +Sets the given value as +the n-th user value associated to the given udata. +udata must be a full userdata. + + +

    +Returns udata, +or fail if the userdata does not have that value. + + + + +

    +


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

    + + +

    +If message is present but is neither a string nor nil, +this function returns message without further processing. +Otherwise, +it returns a string with a traceback of the call stack. +The optional message string is appended +at the beginning of the traceback. +An optional level number tells at which level +to start the traceback +(default is 1, the function calling traceback). + + + + +

    +


    debug.upvalueid (f, n)

    + + +

    +Returns a unique identifier (as a light userdata) +for the upvalue numbered n +from the given function. + + +

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

    +


    debug.upvaluejoin (f1, n1, f2, n2)

    + + +

    +Make the n1-th upvalue of the Lua closure f1 +refer to the n2-th upvalue of the Lua closure f2. + + + + + + + +

    7 – Lua Standalone

    + +

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

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

    +The options are: + +

      +
    • -e stat: execute string stat;
    • +
    • -i: enter interactive mode after running script;
    • +
    • -l mod: "require" mod and assign the + result to global mod;
    • +
    • -v: print version information;
    • +
    • -E: ignore environment variables;
    • +
    • -W: turn warnings on;
    • +
    • --: stop handling options;
    • +
    • -: execute stdin as a file and stop handling options.
    • +

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

    +When called without the option -E, +the interpreter checks for an environment variable LUA_INIT_5_4 +(or LUA_INIT if the versioned name is not defined) +before running any argument. +If the variable content has the format @filename, +then lua executes the file. +Otherwise, lua executes the string itself. + + +

    +When called with the option -E, +Lua does not consult any environment variables. +In particular, +the values of package.path and package.cpath +are set with the default paths defined in luaconf.h. + + +

    +The options -e, -l, and -W are handled in +the order they appear. +For instance, an invocation like + +

    +     $ lua -e 'a=1' -llib1 script.lua
    +

    +will first set a to 1, then require the library lib1, +and finally run the file script.lua with no arguments. +(Here $ is the shell prompt. Your prompt may be different.) + + +

    +Before running any code, +lua collects all command-line arguments +in a global table called arg. +The script name goes to index 0, +the first argument after the script name goes to index 1, +and so on. +Any arguments before the script name +(that is, the interpreter name plus its options) +go to negative indices. +For instance, in the call + +

    +     $ lua -la b.lua t1 t2
    +

    +the table is like this: + +

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

    +If there is no script in the call, +the interpreter name goes to index 0, +followed by the other arguments. +For instance, the call + +

    +     $ lua -e "print(arg[1])"
    +

    +will print "-e". +If there is a script, +the script is called with arguments +arg[1], ···, arg[#arg]. +Like all chunks in Lua, +the script is compiled as a vararg function. + + +

    +In interactive mode, +Lua repeatedly prompts and waits for a line. +After reading a line, +Lua first try to interpret the line as an expression. +If it succeeds, it prints its value. +Otherwise, it interprets the line as a statement. +If you write an incomplete statement, +the interpreter waits for its completion +by issuing a different prompt. + + +

    +If the global variable _PROMPT contains a string, +then its value is used as the prompt. +Similarly, if the global variable _PROMPT2 contains a string, +its value is used as the secondary prompt +(issued during incomplete statements). + + +

    +In case of unprotected errors in the script, +the interpreter reports the error to the standard error stream. +If the error object is not a string but +has a metamethod __tostring, +the interpreter calls this metamethod to produce the final message. +Otherwise, the interpreter converts the error object to a string +and adds a stack traceback to it. +When warnings are on, +they are simply printed in the standard error output. + + +

    +When finishing normally, +the interpreter closes its main Lua state +(see lua_close). +The script can avoid this step by +calling os.exit to terminate. + + +

    +To allow the use of Lua as a +script interpreter in Unix systems, +Lua skips the first line of a file chunk if it starts with #. +Therefore, Lua scripts can be made into executable programs +by using chmod +x and the #! form, +as in + +

    +     #!/usr/local/bin/lua
    +

    +Of course, +the location of the Lua interpreter may be different in your machine. +If lua is in your PATH, +then + +

    +     #!/usr/bin/env lua
    +

    +is a more portable solution. + + + +

    8 – Incompatibilities with the Previous Version

    + + + +

    +Here we list the incompatibilities that you may find when moving a program +from Lua 5.3 to Lua 5.4. + + +

    +You can avoid some incompatibilities by compiling Lua with +appropriate options (see file luaconf.h). +However, +all these compatibility options will be removed in the future. +More often than not, +compatibility issues arise when these compatibility options +are removed. +So, whenever you have the chance, +you should try to test your code with a version of Lua compiled +with all compatibility options turned off. +That will ease transitions to newer versions of Lua. + + +

    +Lua versions can always change the C API in ways that +do not imply source-code changes in a program, +such as the numeric values for constants +or the implementation of functions as macros. +Therefore, +you should never assume that binaries are compatible between +different Lua versions. +Always recompile clients of the Lua API when +using a new version. + + +

    +Similarly, Lua versions can always change the internal representation +of precompiled chunks; +precompiled chunks are not compatible between different Lua versions. + + +

    +The standard paths in the official distribution may +change between versions. + + + + + +

    8.1 – Incompatibilities in the Language

    +
      + +
    • +The coercion of strings to numbers in +arithmetic and bitwise operations +has been removed from the core language. +The string library does a similar job +for arithmetic (but not for bitwise) operations +using the string metamethods. +However, unlike in previous versions, +the new implementation preserves the implicit type of the numeral +in the string. +For instance, the result of "1" + "2" now is an integer, +not a float. +
    • + +
    • +Literal decimal integer constants that overflow are read as floats, +instead of wrapping around. +You can use hexadecimal notation for such constants if you +want the old behavior +(reading them as integers with wrap around). +
    • + +
    • +The use of the __lt metamethod to emulate __le +has been removed. +When needed, this metamethod must be explicitly defined. +
    • + +
    • +The semantics of the numerical for loop +over integers changed in some details. +In particular, the control variable never wraps around. +
    • + +
    • +A label for a goto cannot be declared where a label with the same +name is visible, even if this other label is declared in an enclosing +block. +
    • + +
    • +When finalizing an object, +Lua does not ignore __gc metamethods that are not functions. +Any value will be called, if present. +(Non-callable values will generate a warning, +like any other error when calling a finalizer.) +
    • + +
    + + + + +

    8.2 – Incompatibilities in the Libraries

    +
      + +
    • +The function print does not call tostring +to format its arguments; +instead, it has this functionality hardwired. +You should use __tostring to modify how values are printed. +
    • + +
    • +The pseudo-random number generator used by the function math.random +now starts with a somewhat random seed. +Moreover, it uses a different algorithm. +
    • + +
    • +By default, the decoding functions in the utf8 library +do not accept surrogates as valid code points. +An extra parameter in these functions makes them more permissive. +
    • + +
    • +The options "setpause" and "setstepmul" +of the function collectgarbage are deprecated. +You should use the new option "incremental" to set them. +
    • + +
    • +The function io.lines now returns four values, +instead of just one. +That can be a problem when it is used as the sole +argument to another function that has optional parameters, +such as in load(io.lines(filename, "L")). +To fix that issue, +you can wrap the call into parentheses, +to adjust its number of results to one. +
    • + +
    + + + + +

    8.3 – Incompatibilities in the API

    + + +
      + +
    • +Full userdata now has an arbitrary number of associated user values. +Therefore, the functions lua_newuserdata, +lua_setuservalue, and lua_getuservalue were +replaced by lua_newuserdatauv, +lua_setiuservalue, and lua_getiuservalue, +which have an extra argument. + + +

      +For compatibility, the old names still work as macros assuming +one single user value. +Note, however, that userdata with zero user values +are more efficient memory-wise. +

    • + +
    • +The function lua_resume has an extra parameter. +This out parameter returns the number of values on +the top of the stack that were yielded or returned by the coroutine. +(In previous versions, +those values were the entire stack.) +
    • + +
    • +The function lua_version returns the version number, +instead of an address of the version number. +The Lua core should work correctly with libraries using their +own static copies of the same core, +so there is no need to check whether they are using the same +address space. +
    • + +
    • +The constant LUA_ERRGCMM was removed. +Errors in finalizers are never propagated; +instead, they generate a warning. +
    • + +
    • +The options LUA_GCSETPAUSE and LUA_GCSETSTEPMUL +of the function lua_gc are deprecated. +You should use the new option LUA_GCINC to set them. +
    • + +
    + + + + +

    9 – The Complete Syntax of Lua

    + +

    +Here is the complete syntax of Lua in extended BNF. +As usual in extended BNF, +{A} means 0 or more As, +and [A] means an optional A. +(For operator precedences, see §3.4.8; +for a description of the terminals +Name, Numeral, +and LiteralString, see §3.1.) + + + + +

    +
    +	chunk ::= block
    +
    +	block ::= {stat} [retstat]
    +
    +	stat ::=  ‘;’ | 
    +		 varlist ‘=’ explist | 
    +		 functioncall | 
    +		 label | 
    +		 break | 
    +		 goto Name | 
    +		 do block end | 
    +		 while exp do block end | 
    +		 repeat block until exp | 
    +		 if exp then block {elseif exp then block} [else block] end | 
    +		 for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end | 
    +		 for namelist in explist do block end | 
    +		 function funcname funcbody | 
    +		 local function Name funcbody | 
    +		 local attnamelist [‘=’ explist] 
    +
    +	attnamelist ::=  Name attrib {‘,’ Name attrib}
    +
    +	attrib ::= [‘<’ Name ‘>’]
    +
    +	retstat ::= return [explist] [‘;’]
    +
    +	label ::= ‘::’ Name ‘::’
    +
    +	funcname ::= Name {‘.’ Name} [‘:’ Name]
    +
    +	varlist ::= var {‘,’ var}
    +
    +	var ::=  Name | prefixexp ‘[’ exp ‘]’ | prefixexp ‘.’ Name 
    +
    +	namelist ::= Name {‘,’ Name}
    +
    +	explist ::= exp {‘,’ exp}
    +
    +	exp ::=  nil | false | true | Numeral | LiteralString | ‘...’ | functiondef | 
    +		 prefixexp | tableconstructor | exp binop exp | unop exp 
    +
    +	prefixexp ::= var | functioncall | ‘(’ exp ‘)’
    +
    +	functioncall ::=  prefixexp args | prefixexp ‘:’ Name args 
    +
    +	args ::=  ‘(’ [explist] ‘)’ | tableconstructor | LiteralString 
    +
    +	functiondef ::= function funcbody
    +
    +	funcbody ::= ‘(’ [parlist] ‘)’ block end
    +
    +	parlist ::= namelist [‘,’ ‘...’] | ‘...’
    +
    +	tableconstructor ::= ‘{’ [fieldlist] ‘}’
    +
    +	fieldlist ::= field {fieldsep field} [fieldsep]
    +
    +	field ::= ‘[’ exp ‘]’ ‘=’ exp | Name ‘=’ exp | exp
    +
    +	fieldsep ::= ‘,’ | ‘;’
    +
    +	binop ::=  ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘//’ | ‘^’ | ‘%’ | 
    +		 ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ | 
    +		 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ | 
    +		 and | or
    +
    +	unop ::= ‘-’ | not | ‘#’ | ‘~’
    +
    +
    + +

    + + + + + + + +

    + + + + diff --git a/lua-5.4.0/doc/osi-certified-72x60.png b/lua-5.4.0/doc/osi-certified-72x60.png new file mode 100644 index 0000000000000000000000000000000000000000..07df5f6ee7a7a8b2108025dcd815f73f145a83af GIT binary patch literal 3774 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 + + +Lua 5.4 readme + + + + + + + +

    +Lua +Welcome to Lua 5.4 +

    + + + +

    About Lua

    +

    +Lua is a powerful, efficient, lightweight, embeddable scripting language +developed by a +team +at +PUC-Rio, +the Pontifical Catholic University of Rio de Janeiro in Brazil. +Lua is +free software +used in +many products and projects +around the world. + +

    +Lua's +official web site +provides complete information +about Lua, +including +an +executive summary +and +updated +documentation, +especially the +reference manual, +which may differ slightly from the +local copy +distributed in this package. + +

    Installing Lua

    +

    +Lua is distributed in +source +form. +You need to build it before using it. +Building Lua should be straightforward +because +Lua is implemented in pure ANSI C and compiles unmodified in all known +platforms that have an ANSI C compiler. +Lua also compiles unmodified as C++. +The instructions given below for building Lua are for Unix-like platforms, +such as Linux and Mac OS X. +See also +instructions for other systems +and +customization options. + +

    +If you don't have the time or the inclination to compile Lua yourself, +get a binary from +LuaBinaries. +Try also +LuaDist, +a multi-platform distribution of Lua that includes batteries. + +

    Building Lua

    +

    +In most common Unix-like platforms, simply do "make". +Here are the details. + +

      +
    1. +Open a terminal window and move to +the top-level directory, which is named lua-5.4.0. +The Makefile there controls both the build process and the installation process. +

      +

    2. + Do "make". The Makefile will guess your platform and build Lua for it. +

      +

    3. + If the guess failed, do "make help" and see if your platform is listed. + The platforms currently supported are: +

      +

      + guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris +

      +

      + If your platform is listed, just do "make xxx", where xxx + is your platform name. +

      + If your platform is not listed, try the closest one or posix, generic, + c89, in this order. +

      +

    4. +The compilation takes only a few moments +and produces three files in the src directory: +lua (the interpreter), +luac (the compiler), +and liblua.a (the library). +

      +

    5. + To check that Lua has been built correctly, do "make test" + after building Lua. This will run the interpreter and print its version. +
    +

    +If you're running Linux, try "make linux-readline" to build the interactive Lua interpreter with handy line-editing and history capabilities. +If you get compilation errors, +make sure you have installed the readline development package +(which is probably named libreadline-dev or readline-devel). +If you get link errors after that, +then try "make linux-readline MYLIBS=-ltermcap". + +

    Installing Lua

    +

    + Once you have built Lua, you may want to install it in an official + place in your system. In this case, do "make install". The official + place and the way to install files are defined in the Makefile. You'll + probably need the right permissions to install files, and so may need to do "sudo make install". + +

    + To build and install Lua in one step, do "make all install", + or "make xxx install", + where xxx is your platform name. + +

    + To install Lua locally after building it, do "make local". + This will create a directory install with subdirectories + bin, include, lib, man, share, + and install Lua as listed below. + + To install Lua locally, but in some other directory, do + "make install INSTALL_TOP=xxx", where xxx is your chosen directory. + The installation starts in the src and doc directories, + so take care if INSTALL_TOP is not an absolute path. + +

    +
    + bin: +
    + lua luac +
    + include: +
    + lua.h luaconf.h lualib.h lauxlib.h lua.hpp +
    + lib: +
    + liblua.a +
    + man/man1: +
    + lua.1 luac.1 +
    + +

    + These are the only directories you need for development. + If you only want to run Lua programs, + you only need the files in bin and man. + The files in include and lib are needed for + embedding Lua in C or C++ programs. + +

    Customization

    +

    + Three kinds of things can be customized by editing a file: +

      +
    • Where and how to install Lua — edit Makefile. +
    • How to build Lua — edit src/Makefile. +
    • Lua features — edit src/luaconf.h. +
    + +

    + You don't actually need to edit the Makefiles because you may set the + relevant variables in the command line when invoking make. + Nevertheless, it's probably best to edit and save the Makefiles to + record the changes you've made. + +

    + On the other hand, if you need to customize some Lua features, you'll need + to edit src/luaconf.h before building and installing Lua. + The edited file will be the one installed, and + it will be used by any Lua clients that you build, to ensure consistency. + Further customization is available to experts by editing the Lua sources. + +

    Building Lua on other systems

    +

    + If you're not using the usual Unix tools, then the instructions for + building Lua depend on the compiler you use. You'll need to create + projects (or whatever your compiler uses) for building the library, + the interpreter, and the compiler, as follows: + +

    +
    +library: +
    +lapi.c lcode.c lctype.c ldebug.c ldo.c ldump.c lfunc.c lgc.c llex.c lmem.c lobject.c lopcodes.c lparser.c lstate.c lstring.c ltable.c ltm.c lundump.c lvm.c lzio.c +lauxlib.c lbaselib.c lcorolib.c ldblib.c liolib.c lmathlib.c loadlib.c loslib.c lstrlib.c ltablib.c lutf8lib.c linit.c +
    +interpreter: +
    + library, lua.c +
    +compiler: +
    + library, luac.c +
    + +

    + To use Lua as a library in your own programs, you'll need to know how to + create and use libraries with your compiler. Moreover, to dynamically load + C libraries for Lua, you'll need to know how to create dynamic libraries + and you'll need to make sure that the Lua API functions are accessible to + those dynamic libraries — but don't link the Lua library + into each dynamic library. For Unix, we recommend that the Lua library + be linked statically into the host program and its symbols exported for + dynamic linking; src/Makefile does this for the Lua interpreter. + For Windows, we recommend that the Lua library be a DLL. + In all cases, the compiler luac should be linked statically. + +

    + As mentioned above, you may edit src/luaconf.h to customize + some features before building Lua. + +

    Changes since Lua 5.3

    +

    +Here are the main changes introduced in Lua 5.4. +The +reference manual +lists the +incompatibilities that had to be introduced. + +

    Main changes

    +
      +
    • new generational mode for garbage collection +
    • to-be-closed variables +
    • const variables +
    • userdata can have multiple user values +
    • new implementation for math.random +
    • warning system +
    • debug information about function arguments and returns +
    • new semantics for the integer 'for' loop +
    • optional 'init' argument to 'string.gmatch' +
    • new functions 'lua_resetthread' and 'coroutine.close' +
    • string-to-number coercions moved to the string library +
    • allocation function allowed to fail when shrinking a memory block +
    • new format '%p' in 'string.format' +
    • utf8 library accepts codepoints up to 2^31 +
    + +

    License

    +

    + +[osi certified] + +Lua is free software distributed under the terms of the +MIT license +reproduced below; +it may be used for any purpose, including commercial purposes, +at absolutely no cost without having to ask us. + +The only requirement is that if you do use Lua, +then you should give us credit by including the appropriate copyright notice somewhere in your product or its documentation. + +For details, see +this. + +

    +Copyright © 1994–2020 Lua.org, PUC-Rio. + +

    +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +

    +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +

    +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +

    +

    + +

    + + + + diff --git a/lua-5.4.0/src/Makefile b/lua-5.4.0/src/Makefile new file mode 100644 index 0000000..514593d --- /dev/null +++ b/lua-5.4.0/src/Makefile @@ -0,0 +1,220 @@ +# Makefile for building Lua +# See ../doc/readme.html for installation and customization instructions. + +# == CHANGE THE SETTINGS BELOW TO SUIT YOUR ENVIRONMENT ======================= + +# Your platform. See PLATS for possible values. +PLAT= guess + +CC= gcc -std=gnu99 +CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_3 $(SYSCFLAGS) $(MYCFLAGS) +LDFLAGS= $(SYSLDFLAGS) $(MYLDFLAGS) +LIBS= -lm $(SYSLIBS) $(MYLIBS) + +AR= ar rcu +RANLIB= ranlib +RM= rm -f +UNAME= uname + +SYSCFLAGS= +SYSLDFLAGS= +SYSLIBS= + +MYCFLAGS= +MYLDFLAGS= +MYLIBS= +MYOBJS= + +# Special flags for compiler modules; -Os reduces code size. +CMCFLAGS= -Os + +# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE ======= + +PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris + +LUA_A= liblua.a +CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o +LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o +BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS) + +LUA_T= lua +LUA_O= lua.o + +LUAC_T= luac +LUAC_O= luac.o + +ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O) +ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T) +ALL_A= $(LUA_A) + +# Targets start here. +default: $(PLAT) + +all: $(ALL_T) + +o: $(ALL_O) + +a: $(ALL_A) + +$(LUA_A): $(BASE_O) + $(AR) $@ $(BASE_O) + $(RANLIB) $@ + +$(LUA_T): $(LUA_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUA_O) $(LUA_A) $(LIBS) + +$(LUAC_T): $(LUAC_O) $(LUA_A) + $(CC) -o $@ $(LDFLAGS) $(LUAC_O) $(LUA_A) $(LIBS) + +test: + ./lua -v + +clean: + $(RM) $(ALL_T) $(ALL_O) + +depend: + @$(CC) $(CFLAGS) -MM l*.c + +echo: + @echo "PLAT= $(PLAT)" + @echo "CC= $(CC)" + @echo "CFLAGS= $(CFLAGS)" + @echo "LDFLAGS= $(SYSLDFLAGS)" + @echo "LIBS= $(LIBS)" + @echo "AR= $(AR)" + @echo "RANLIB= $(RANLIB)" + @echo "RM= $(RM)" + @echo "UNAME= $(UNAME)" + +# Convenience targets for popular platforms. +ALL= all + +help: + @echo "Do 'make PLATFORM' where PLATFORM is one of these:" + @echo " $(PLATS)" + @echo "See doc/readme.html for complete instructions." + +guess: + @echo Guessing `$(UNAME)` + @$(MAKE) `$(UNAME)` + +AIX aix: + $(MAKE) $(ALL) CC="xlc" CFLAGS="-O2 -DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-ldl" SYSLDFLAGS="-brtl -bexpall" + +bsd: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN" SYSLIBS="-Wl,-E" + +c89: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_C89" CC="gcc -std=c89" + @echo '' + @echo '*** C89 does not guarantee 64-bit integers for Lua.' + @echo '' + +FreeBSD NetBSD OpenBSD freebsd: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE -I/usr/include/edit" SYSLIBS="-Wl,-E -ledit" CC="cc" + +generic: $(ALL) + +Linux linux: linux-noreadline + +linux-noreadline: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-Wl,-E -ldl" + +linux-readline: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_LINUX -DLUA_USE_READLINE" SYSLIBS="-Wl,-E -ldl -lreadline" + +Darwin macos macosx: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_MACOSX -DLUA_USE_READLINE" SYSLIBS="-lreadline" + +mingw: + $(MAKE) "LUA_A=lua54.dll" "LUA_T=lua.exe" \ + "AR=$(CC) -shared -o" "RANLIB=strip --strip-unneeded" \ + "SYSCFLAGS=-DLUA_BUILD_AS_DLL" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe + $(MAKE) "LUAC_T=luac.exe" luac.exe + +posix: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX" + +SunOS solaris: + $(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_POSIX -DLUA_USE_DLOPEN -D_REENTRANT" SYSLIBS="-ldl" + +# Targets that do not create files (not all makes understand .PHONY). +.PHONY: all $(PLATS) help test clean default o a depend echo + +# Compiler modules may use special flags. +llex.o: + $(CC) $(CFLAGS) $(CMCFLAGS) -c llex.c + +lparser.o: + $(CC) $(CFLAGS) $(CMCFLAGS) -c lparser.c + +lcode.o: + $(CC) $(CFLAGS) $(CMCFLAGS) -c lcode.c + +# DO NOT DELETE + +lapi.o: lapi.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lstring.h \ + ltable.h lundump.h lvm.h +lauxlib.o: lauxlib.c lprefix.h lua.h luaconf.h lauxlib.h +lbaselib.o: lbaselib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lcode.o: lcode.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lgc.h lstring.h ltable.h lvm.h +lcorolib.o: lcorolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lctype.o: lctype.c lprefix.h lctype.h lua.h luaconf.h llimits.h +ldblib.o: ldblib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ldebug.o: ldebug.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h lcode.h llex.h lopcodes.h lparser.h \ + ldebug.h ldo.h lfunc.h lstring.h lgc.h ltable.h lvm.h +ldo.o: ldo.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h lopcodes.h \ + lparser.h lstring.h ltable.h lundump.h lvm.h +ldump.o: ldump.c lprefix.h lua.h luaconf.h lobject.h llimits.h lstate.h \ + ltm.h lzio.h lmem.h lundump.h +lfunc.o: lfunc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h +lgc.o: lgc.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lstring.h ltable.h +linit.o: linit.c lprefix.h lua.h luaconf.h lualib.h lauxlib.h +liolib.o: liolib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +llex.o: llex.c lprefix.h lua.h luaconf.h lctype.h llimits.h ldebug.h \ + lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lgc.h llex.h lparser.h \ + lstring.h ltable.h +lmathlib.o: lmathlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lmem.o: lmem.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h +loadlib.o: loadlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lobject.o: lobject.c lprefix.h lua.h luaconf.h lctype.h llimits.h \ + ldebug.h lstate.h lobject.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h \ + lvm.h +lopcodes.o: lopcodes.c lprefix.h lopcodes.h llimits.h lua.h luaconf.h +loslib.o: loslib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lparser.o: lparser.c lprefix.h lua.h luaconf.h lcode.h llex.h lobject.h \ + llimits.h lzio.h lmem.h lopcodes.h lparser.h ldebug.h lstate.h ltm.h \ + ldo.h lfunc.h lstring.h lgc.h ltable.h +lstate.o: lstate.c lprefix.h lua.h luaconf.h lapi.h llimits.h lstate.h \ + lobject.h ltm.h lzio.h lmem.h ldebug.h ldo.h lfunc.h lgc.h llex.h \ + lstring.h ltable.h +lstring.o: lstring.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lstring.h lgc.h +lstrlib.o: lstrlib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltable.o: ltable.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +ltablib.o: ltablib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +ltm.o: ltm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lgc.h lstring.h ltable.h lvm.h +lua.o: lua.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +luac.o: luac.c lprefix.h lua.h luaconf.h lauxlib.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h lopcodes.h lopnames.h lundump.h +lundump.o: lundump.c lprefix.h lua.h luaconf.h ldebug.h lstate.h \ + lobject.h llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lstring.h lgc.h \ + lundump.h +lutf8lib.o: lutf8lib.c lprefix.h lua.h luaconf.h lauxlib.h lualib.h +lvm.o: lvm.c lprefix.h lua.h luaconf.h ldebug.h lstate.h lobject.h \ + llimits.h ltm.h lzio.h lmem.h ldo.h lfunc.h lgc.h lopcodes.h lstring.h \ + ltable.h lvm.h ljumptab.h +lzio.o: lzio.c lprefix.h lua.h luaconf.h llimits.h lmem.h lstate.h \ + lobject.h ltm.h lzio.h + +# (end of Makefile) diff --git a/lua-5.4.0/src/lapi.c b/lua-5.4.0/src/lapi.c new file mode 100644 index 0000000..3e24781 --- /dev/null +++ b/lua-5.4.0/src/lapi.c @@ -0,0 +1,1411 @@ +/* +** $Id: lapi.c $ +** Lua API +** See Copyright Notice in lua.h +*/ + +#define lapi_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" + + + +const char lua_ident[] = + "$LuaVersion: " LUA_COPYRIGHT " $" + "$LuaAuthors: " LUA_AUTHORS " $"; + + + +/* +** Test for a valid index. +** '!ttisnil(o)' implies 'o != &G(L)->nilvalue', so it is not needed. +** However, it covers the most common cases in a faster way. +*/ +#define isvalid(L, o) (!ttisnil(o) || o != &G(L)->nilvalue) + + +/* test for pseudo index */ +#define ispseudo(i) ((i) <= LUA_REGISTRYINDEX) + +/* test for upvalue */ +#define isupvalue(i) ((i) < LUA_REGISTRYINDEX) + + +static TValue *index2value (lua_State *L, int idx) { + CallInfo *ci = L->ci; + if (idx > 0) { + StkId o = ci->func + idx; + api_check(L, idx <= L->ci->top - (ci->func + 1), "unacceptable index"); + if (o >= L->top) return &G(L)->nilvalue; + else return s2v(o); + } + else if (!ispseudo(idx)) { /* negative index */ + api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index"); + return s2v(L->top + idx); + } + else if (idx == LUA_REGISTRYINDEX) + return &G(L)->l_registry; + else { /* upvalues */ + idx = LUA_REGISTRYINDEX - idx; + api_check(L, idx <= MAXUPVAL + 1, "upvalue index too large"); + if (ttislcf(s2v(ci->func))) /* light C function? */ + return &G(L)->nilvalue; /* it has no upvalues */ + else { + CClosure *func = clCvalue(s2v(ci->func)); + return (idx <= func->nupvalues) ? &func->upvalue[idx-1] : &G(L)->nilvalue; + } + } +} + + +static StkId index2stack (lua_State *L, int idx) { + CallInfo *ci = L->ci; + if (idx > 0) { + StkId o = ci->func + idx; + api_check(L, o < L->top, "unacceptable index"); + return o; + } + else { /* non-positive index */ + api_check(L, idx != 0 && -idx <= L->top - (ci->func + 1), "invalid index"); + api_check(L, !ispseudo(idx), "invalid index"); + return L->top + idx; + } +} + + +LUA_API int lua_checkstack (lua_State *L, int n) { + int res; + CallInfo *ci = L->ci; + lua_lock(L); + api_check(L, n >= 0, "negative 'n'"); + if (L->stack_last - L->top > n) /* stack large enough? */ + res = 1; /* yes; check is OK */ + else { /* no; need to grow stack */ + int inuse = cast_int(L->top - L->stack) + EXTRA_STACK; + if (inuse > LUAI_MAXSTACK - n) /* can grow without overflow? */ + res = 0; /* no */ + else /* try to grow stack */ + res = luaD_growstack(L, n, 0); + } + if (res && ci->top < L->top + n) + ci->top = L->top + n; /* adjust frame top */ + lua_unlock(L); + return res; +} + + +LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { + int i; + if (from == to) return; + lua_lock(to); + api_checknelems(from, n); + api_check(from, G(from) == G(to), "moving among independent states"); + api_check(from, to->ci->top - to->top >= n, "stack overflow"); + from->top -= n; + for (i = 0; i < n; i++) { + setobjs2s(to, to->top, from->top + i); + to->top++; /* stack already checked by previous 'api_check' */ + } + lua_unlock(to); +} + + +LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { + lua_CFunction old; + lua_lock(L); + old = G(L)->panic; + G(L)->panic = panicf; + lua_unlock(L); + return old; +} + + +LUA_API lua_Number lua_version (lua_State *L) { + UNUSED(L); + return LUA_VERSION_NUM; +} + + + +/* +** basic stack manipulation +*/ + + +/* +** convert an acceptable stack index into an absolute index +*/ +LUA_API int lua_absindex (lua_State *L, int idx) { + return (idx > 0 || ispseudo(idx)) + ? idx + : cast_int(L->top - L->ci->func) + idx; +} + + +LUA_API int lua_gettop (lua_State *L) { + return cast_int(L->top - (L->ci->func + 1)); +} + + +LUA_API void lua_settop (lua_State *L, int idx) { + CallInfo *ci = L->ci; + StkId func = ci->func; + ptrdiff_t diff; /* difference for new top */ + lua_lock(L); + if (idx >= 0) { + api_check(L, idx <= ci->top - (func + 1), "new top too large"); + diff = ((func + 1) + idx) - L->top; + for (; diff > 0; diff--) + setnilvalue(s2v(L->top++)); /* clear new slots */ + } + else { + api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top"); + diff = idx + 1; /* will "subtract" index (as it is negative) */ + } + if (diff < 0 && hastocloseCfunc(ci->nresults)) + luaF_close(L, L->top + diff, LUA_OK); + L->top += diff; /* correct top only after closing any upvalue */ + lua_unlock(L); +} + + +/* +** Reverse the stack segment from 'from' to 'to' +** (auxiliary to 'lua_rotate') +** Note that we move(copy) only the value inside the stack. +** (We do not move additional fields that may exist.) +*/ +static void reverse (lua_State *L, StkId from, StkId to) { + for (; from < to; from++, to--) { + TValue temp; + setobj(L, &temp, s2v(from)); + setobjs2s(L, from, to); + setobj2s(L, to, &temp); + } +} + + +/* +** Let x = AB, where A is a prefix of length 'n'. Then, +** rotate x n == BA. But BA == (A^r . B^r)^r. +*/ +LUA_API void lua_rotate (lua_State *L, int idx, int n) { + StkId p, t, m; + lua_lock(L); + t = L->top - 1; /* end of stack segment being rotated */ + p = index2stack(L, idx); /* start of segment */ + api_check(L, (n >= 0 ? n : -n) <= (t - p + 1), "invalid 'n'"); + m = (n >= 0 ? t - n : p - n - 1); /* end of prefix */ + reverse(L, p, m); /* reverse the prefix with length 'n' */ + reverse(L, m + 1, t); /* reverse the suffix */ + reverse(L, p, t); /* reverse the entire segment */ + lua_unlock(L); +} + + +LUA_API void lua_copy (lua_State *L, int fromidx, int toidx) { + TValue *fr, *to; + lua_lock(L); + fr = index2value(L, fromidx); + to = index2value(L, toidx); + api_check(L, isvalid(L, to), "invalid index"); + setobj(L, to, fr); + if (isupvalue(toidx)) /* function upvalue? */ + luaC_barrier(L, clCvalue(s2v(L->ci->func)), fr); + /* LUA_REGISTRYINDEX does not need gc barrier + (collector revisits it before finishing collection) */ + lua_unlock(L); +} + + +LUA_API void lua_pushvalue (lua_State *L, int idx) { + lua_lock(L); + setobj2s(L, L->top, index2value(L, idx)); + api_incr_top(L); + lua_unlock(L); +} + + + +/* +** access functions (stack -> C) +*/ + + +LUA_API int lua_type (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (isvalid(L, o) ? ttype(o) : LUA_TNONE); +} + + +LUA_API const char *lua_typename (lua_State *L, int t) { + UNUSED(L); + api_check(L, LUA_TNONE <= t && t < LUA_NUMTYPES, "invalid type"); + return ttypename(t); +} + + +LUA_API int lua_iscfunction (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttislcf(o) || (ttisCclosure(o))); +} + + +LUA_API int lua_isinteger (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return ttisinteger(o); +} + + +LUA_API int lua_isnumber (lua_State *L, int idx) { + lua_Number n; + const TValue *o = index2value(L, idx); + return tonumber(o, &n); +} + + +LUA_API int lua_isstring (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttisstring(o) || cvt2str(o)); +} + + +LUA_API int lua_isuserdata (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (ttisfulluserdata(o) || ttislightuserdata(o)); +} + + +LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { + const TValue *o1 = index2value(L, index1); + const TValue *o2 = index2value(L, index2); + return (isvalid(L, o1) && isvalid(L, o2)) ? luaV_rawequalobj(o1, o2) : 0; +} + + +LUA_API void lua_arith (lua_State *L, int op) { + lua_lock(L); + if (op != LUA_OPUNM && op != LUA_OPBNOT) + api_checknelems(L, 2); /* all other operations expect two operands */ + else { /* for unary operations, add fake 2nd operand */ + api_checknelems(L, 1); + setobjs2s(L, L->top, L->top - 1); + api_incr_top(L); + } + /* first operand at top - 2, second at top - 1; result go to top - 2 */ + luaO_arith(L, op, s2v(L->top - 2), s2v(L->top - 1), L->top - 2); + L->top--; /* remove second operand */ + lua_unlock(L); +} + + +LUA_API int lua_compare (lua_State *L, int index1, int index2, int op) { + const TValue *o1; + const TValue *o2; + int i = 0; + lua_lock(L); /* may call tag method */ + o1 = index2value(L, index1); + o2 = index2value(L, index2); + if (isvalid(L, o1) && isvalid(L, o2)) { + switch (op) { + case LUA_OPEQ: i = luaV_equalobj(L, o1, o2); break; + case LUA_OPLT: i = luaV_lessthan(L, o1, o2); break; + case LUA_OPLE: i = luaV_lessequal(L, o1, o2); break; + default: api_check(L, 0, "invalid option"); + } + } + lua_unlock(L); + return i; +} + + +LUA_API size_t lua_stringtonumber (lua_State *L, const char *s) { + size_t sz = luaO_str2num(s, s2v(L->top)); + if (sz != 0) + api_incr_top(L); + return sz; +} + + +LUA_API lua_Number lua_tonumberx (lua_State *L, int idx, int *pisnum) { + lua_Number n = 0; + const TValue *o = index2value(L, idx); + int isnum = tonumber(o, &n); + if (pisnum) + *pisnum = isnum; + return n; +} + + +LUA_API lua_Integer lua_tointegerx (lua_State *L, int idx, int *pisnum) { + lua_Integer res = 0; + const TValue *o = index2value(L, idx); + int isnum = tointeger(o, &res); + if (pisnum) + *pisnum = isnum; + return res; +} + + +LUA_API int lua_toboolean (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return !l_isfalse(o); +} + + +LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) { + TValue *o = index2value(L, idx); + if (!ttisstring(o)) { + if (!cvt2str(o)) { /* not convertible? */ + if (len != NULL) *len = 0; + return NULL; + } + lua_lock(L); /* 'luaO_tostring' may create a new string */ + luaO_tostring(L, o); + luaC_checkGC(L); + o = index2value(L, idx); /* previous call may reallocate the stack */ + lua_unlock(L); + } + if (len != NULL) + *len = vslen(o); + return svalue(o); +} + + +LUA_API lua_Unsigned lua_rawlen (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + switch (ttypetag(o)) { + case LUA_VSHRSTR: return tsvalue(o)->shrlen; + case LUA_VLNGSTR: return tsvalue(o)->u.lnglen; + case LUA_VUSERDATA: return uvalue(o)->len; + case LUA_VTABLE: return luaH_getn(hvalue(o)); + default: return 0; + } +} + + +LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + if (ttislcf(o)) return fvalue(o); + else if (ttisCclosure(o)) + return clCvalue(o)->f; + else return NULL; /* not a C function */ +} + + +static void *touserdata (const TValue *o) { + switch (ttype(o)) { + case LUA_TUSERDATA: return getudatamem(uvalue(o)); + case LUA_TLIGHTUSERDATA: return pvalue(o); + default: return NULL; + } +} + + +LUA_API void *lua_touserdata (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return touserdata(o); +} + + +LUA_API lua_State *lua_tothread (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + return (!ttisthread(o)) ? NULL : thvalue(o); +} + + +/* +** Returns a pointer to the internal representation of an object. +** Note that ANSI C does not allow the conversion of a pointer to +** function to a 'void*', so the conversion here goes through +** a 'size_t'. (As the returned pointer is only informative, this +** conversion should not be a problem.) +*/ +LUA_API const void *lua_topointer (lua_State *L, int idx) { + const TValue *o = index2value(L, idx); + switch (ttypetag(o)) { + case LUA_VLCF: return cast_voidp(cast_sizet(fvalue(o))); + case LUA_VUSERDATA: case LUA_VLIGHTUSERDATA: + return touserdata(o); + default: { + if (iscollectable(o)) + return gcvalue(o); + else + return NULL; + } + } +} + + + +/* +** push functions (C -> stack) +*/ + + +LUA_API void lua_pushnil (lua_State *L) { + lua_lock(L); + setnilvalue(s2v(L->top)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { + lua_lock(L); + setfltvalue(s2v(L->top), n); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { + lua_lock(L); + setivalue(s2v(L->top), n); + api_incr_top(L); + lua_unlock(L); +} + + +/* +** Pushes on the stack a string with given length. Avoid using 's' when +** 'len' == 0 (as 's' can be NULL in that case), due to later use of +** 'memcmp' and 'memcpy'. +*/ +LUA_API const char *lua_pushlstring (lua_State *L, const char *s, size_t len) { + TString *ts; + lua_lock(L); + ts = (len == 0) ? luaS_new(L, "") : luaS_newlstr(L, s, len); + setsvalue2s(L, L->top, ts); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getstr(ts); +} + + +LUA_API const char *lua_pushstring (lua_State *L, const char *s) { + lua_lock(L); + if (s == NULL) + setnilvalue(s2v(L->top)); + else { + TString *ts; + ts = luaS_new(L, s); + setsvalue2s(L, L->top, ts); + s = getstr(ts); /* internal copy's address */ + } + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return s; +} + + +LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, + va_list argp) { + const char *ret; + lua_lock(L); + ret = luaO_pushvfstring(L, fmt, argp); + luaC_checkGC(L); + lua_unlock(L); + return ret; +} + + +LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { + const char *ret; + va_list argp; + lua_lock(L); + va_start(argp, fmt); + ret = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + luaC_checkGC(L); + lua_unlock(L); + return ret; +} + + +LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { + lua_lock(L); + if (n == 0) { + setfvalue(s2v(L->top), fn); + api_incr_top(L); + } + else { + CClosure *cl; + api_checknelems(L, n); + api_check(L, n <= MAXUPVAL, "upvalue index too large"); + cl = luaF_newCclosure(L, n); + cl->f = fn; + L->top -= n; + while (n--) { + setobj2n(L, &cl->upvalue[n], s2v(L->top + n)); + /* does not need barrier because closure is white */ + } + setclCvalue(L, s2v(L->top), cl); + api_incr_top(L); + luaC_checkGC(L); + } + lua_unlock(L); +} + + +LUA_API void lua_pushboolean (lua_State *L, int b) { + lua_lock(L); + if (b) + setbtvalue(s2v(L->top)); + else + setbfvalue(s2v(L->top)); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { + lua_lock(L); + setpvalue(s2v(L->top), p); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API int lua_pushthread (lua_State *L) { + lua_lock(L); + setthvalue(L, s2v(L->top), L); + api_incr_top(L); + lua_unlock(L); + return (G(L)->mainthread == L); +} + + + +/* +** get functions (Lua -> stack) +*/ + + +static int auxgetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + if (luaV_fastget(L, t, str, slot, luaH_getstr)) { + setobj2s(L, L->top, slot); + api_incr_top(L); + } + else { + setsvalue2s(L, L->top, str); + api_incr_top(L); + luaV_finishget(L, t, s2v(L->top - 1), L->top - 1, slot); + } + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +LUA_API int lua_getglobal (lua_State *L, const char *name) { + Table *reg = hvalue(&G(L)->l_registry); + lua_lock(L); + return auxgetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name); +} + + +LUA_API int lua_gettable (lua_State *L, int idx) { + const TValue *slot; + TValue *t; + lua_lock(L); + t = index2value(L, idx); + if (luaV_fastget(L, t, s2v(L->top - 1), slot, luaH_get)) { + setobj2s(L, L->top - 1, slot); + } + else + luaV_finishget(L, t, s2v(L->top - 1), L->top - 1, slot); + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +LUA_API int lua_getfield (lua_State *L, int idx, const char *k) { + lua_lock(L); + return auxgetstr(L, index2value(L, idx), k); +} + + +LUA_API int lua_geti (lua_State *L, int idx, lua_Integer n) { + TValue *t; + const TValue *slot; + lua_lock(L); + t = index2value(L, idx); + if (luaV_fastgeti(L, t, n, slot)) { + setobj2s(L, L->top, slot); + } + else { + TValue aux; + setivalue(&aux, n); + luaV_finishget(L, t, &aux, L->top, slot); + } + api_incr_top(L); + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +static int finishrawget (lua_State *L, const TValue *val) { + if (isempty(val)) /* avoid copying empty items to the stack */ + setnilvalue(s2v(L->top)); + else + setobj2s(L, L->top, val); + api_incr_top(L); + lua_unlock(L); + return ttype(s2v(L->top - 1)); +} + + +static Table *gettable (lua_State *L, int idx) { + TValue *t = index2value(L, idx); + api_check(L, ttistable(t), "table expected"); + return hvalue(t); +} + + +LUA_API int lua_rawget (lua_State *L, int idx) { + Table *t; + const TValue *val; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + val = luaH_get(t, s2v(L->top - 1)); + L->top--; /* remove key */ + return finishrawget(L, val); +} + + +LUA_API int lua_rawgeti (lua_State *L, int idx, lua_Integer n) { + Table *t; + lua_lock(L); + t = gettable(L, idx); + return finishrawget(L, luaH_getint(t, n)); +} + + +LUA_API int lua_rawgetp (lua_State *L, int idx, const void *p) { + Table *t; + TValue k; + lua_lock(L); + t = gettable(L, idx); + setpvalue(&k, cast_voidp(p)); + return finishrawget(L, luaH_get(t, &k)); +} + + +LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { + Table *t; + lua_lock(L); + t = luaH_new(L); + sethvalue2s(L, L->top, t); + api_incr_top(L); + if (narray > 0 || nrec > 0) + luaH_resize(L, t, narray, nrec); + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API int lua_getmetatable (lua_State *L, int objindex) { + const TValue *obj; + Table *mt; + int res = 0; + lua_lock(L); + obj = index2value(L, objindex); + switch (ttype(obj)) { + case LUA_TTABLE: + mt = hvalue(obj)->metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(obj)->metatable; + break; + default: + mt = G(L)->mt[ttype(obj)]; + break; + } + if (mt != NULL) { + sethvalue2s(L, L->top, mt); + api_incr_top(L); + res = 1; + } + lua_unlock(L); + return res; +} + + +LUA_API int lua_getiuservalue (lua_State *L, int idx, int n) { + TValue *o; + int t; + lua_lock(L); + o = index2value(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + if (n <= 0 || n > uvalue(o)->nuvalue) { + setnilvalue(s2v(L->top)); + t = LUA_TNONE; + } + else { + setobj2s(L, L->top, &uvalue(o)->uv[n - 1].uv); + t = ttype(s2v(L->top)); + } + api_incr_top(L); + lua_unlock(L); + return t; +} + + +/* +** set functions (stack -> Lua) +*/ + +/* +** t[k] = value at the top of the stack (where 'k' is a string) +*/ +static void auxsetstr (lua_State *L, const TValue *t, const char *k) { + const TValue *slot; + TString *str = luaS_new(L, k); + api_checknelems(L, 1); + if (luaV_fastget(L, t, str, slot, luaH_getstr)) { + luaV_finishfastset(L, t, slot, s2v(L->top - 1)); + L->top--; /* pop value */ + } + else { + setsvalue2s(L, L->top, str); /* push 'str' (to make it a TValue) */ + api_incr_top(L); + luaV_finishset(L, t, s2v(L->top - 1), s2v(L->top - 2), slot); + L->top -= 2; /* pop value and key */ + } + lua_unlock(L); /* lock done by caller */ +} + + +LUA_API void lua_setglobal (lua_State *L, const char *name) { + Table *reg = hvalue(&G(L)->l_registry); + lua_lock(L); /* unlock done in 'auxsetstr' */ + auxsetstr(L, luaH_getint(reg, LUA_RIDX_GLOBALS), name); +} + + +LUA_API void lua_settable (lua_State *L, int idx) { + TValue *t; + const TValue *slot; + lua_lock(L); + api_checknelems(L, 2); + t = index2value(L, idx); + if (luaV_fastget(L, t, s2v(L->top - 2), slot, luaH_get)) { + luaV_finishfastset(L, t, slot, s2v(L->top - 1)); + } + else + luaV_finishset(L, t, s2v(L->top - 2), s2v(L->top - 1), slot); + L->top -= 2; /* pop index and value */ + lua_unlock(L); +} + + +LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { + lua_lock(L); /* unlock done in 'auxsetstr' */ + auxsetstr(L, index2value(L, idx), k); +} + + +LUA_API void lua_seti (lua_State *L, int idx, lua_Integer n) { + TValue *t; + const TValue *slot; + lua_lock(L); + api_checknelems(L, 1); + t = index2value(L, idx); + if (luaV_fastgeti(L, t, n, slot)) { + luaV_finishfastset(L, t, slot, s2v(L->top - 1)); + } + else { + TValue aux; + setivalue(&aux, n); + luaV_finishset(L, t, &aux, s2v(L->top - 1), slot); + } + L->top--; /* pop value */ + lua_unlock(L); +} + + +static void aux_rawset (lua_State *L, int idx, TValue *key, int n) { + Table *t; + TValue *slot; + lua_lock(L); + api_checknelems(L, n); + t = gettable(L, idx); + slot = luaH_set(L, t, key); + setobj2t(L, slot, s2v(L->top - 1)); + invalidateTMcache(t); + luaC_barrierback(L, obj2gco(t), s2v(L->top - 1)); + L->top -= n; + lua_unlock(L); +} + + +LUA_API void lua_rawset (lua_State *L, int idx) { + aux_rawset(L, idx, s2v(L->top - 2), 2); +} + + +LUA_API void lua_rawsetp (lua_State *L, int idx, const void *p) { + TValue k; + setpvalue(&k, cast_voidp(p)); + aux_rawset(L, idx, &k, 1); +} + + +LUA_API void lua_rawseti (lua_State *L, int idx, lua_Integer n) { + Table *t; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + luaH_setint(L, t, n, s2v(L->top - 1)); + luaC_barrierback(L, obj2gco(t), s2v(L->top - 1)); + L->top--; + lua_unlock(L); +} + + +LUA_API int lua_setmetatable (lua_State *L, int objindex) { + TValue *obj; + Table *mt; + lua_lock(L); + api_checknelems(L, 1); + obj = index2value(L, objindex); + if (ttisnil(s2v(L->top - 1))) + mt = NULL; + else { + api_check(L, ttistable(s2v(L->top - 1)), "table expected"); + mt = hvalue(s2v(L->top - 1)); + } + switch (ttype(obj)) { + case LUA_TTABLE: { + hvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, gcvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + case LUA_TUSERDATA: { + uvalue(obj)->metatable = mt; + if (mt) { + luaC_objbarrier(L, uvalue(obj), mt); + luaC_checkfinalizer(L, gcvalue(obj), mt); + } + break; + } + default: { + G(L)->mt[ttype(obj)] = mt; + break; + } + } + L->top--; + lua_unlock(L); + return 1; +} + + +LUA_API int lua_setiuservalue (lua_State *L, int idx, int n) { + TValue *o; + int res; + lua_lock(L); + api_checknelems(L, 1); + o = index2value(L, idx); + api_check(L, ttisfulluserdata(o), "full userdata expected"); + if (!(cast_uint(n) - 1u < cast_uint(uvalue(o)->nuvalue))) + res = 0; /* 'n' not in [1, uvalue(o)->nuvalue] */ + else { + setobj(L, &uvalue(o)->uv[n - 1].uv, s2v(L->top - 1)); + luaC_barrierback(L, gcvalue(o), s2v(L->top - 1)); + res = 1; + } + L->top--; + lua_unlock(L); + return res; +} + + +/* +** 'load' and 'call' functions (run Lua code) +*/ + + +#define checkresults(L,na,nr) \ + api_check(L, (nr) == LUA_MULTRET || (L->ci->top - L->top >= (nr) - (na)), \ + "results from function overflow current stack size") + + +LUA_API void lua_callk (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k) { + StkId func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + func = L->top - (nargs+1); + if (k != NULL && yieldable(L)) { /* need to prepare continuation? */ + L->ci->u.c.k = k; /* save continuation */ + L->ci->u.c.ctx = ctx; /* save context */ + luaD_call(L, func, nresults); /* do the call */ + } + else /* no continuation or no yieldable */ + luaD_callnoyield(L, func, nresults); /* just do the call */ + adjustresults(L, nresults); + lua_unlock(L); +} + + + +/* +** Execute a protected call. +*/ +struct CallS { /* data to 'f_call' */ + StkId func; + int nresults; +}; + + +static void f_call (lua_State *L, void *ud) { + struct CallS *c = cast(struct CallS *, ud); + luaD_callnoyield(L, c->func, c->nresults); +} + + + +LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k) { + struct CallS c; + int status; + ptrdiff_t func; + lua_lock(L); + api_check(L, k == NULL || !isLua(L->ci), + "cannot use continuations inside hooks"); + api_checknelems(L, nargs+1); + api_check(L, L->status == LUA_OK, "cannot do calls on non-normal thread"); + checkresults(L, nargs, nresults); + if (errfunc == 0) + func = 0; + else { + StkId o = index2stack(L, errfunc); + api_check(L, ttisfunction(s2v(o)), "error handler must be a function"); + func = savestack(L, o); + } + c.func = L->top - (nargs+1); /* function to be called */ + if (k == NULL || !yieldable(L)) { /* no continuation or no yieldable? */ + c.nresults = nresults; /* do a 'conventional' protected call */ + status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); + } + else { /* prepare continuation (call is already protected by 'resume') */ + CallInfo *ci = L->ci; + ci->u.c.k = k; /* save continuation */ + ci->u.c.ctx = ctx; /* save context */ + /* save information for error recovery */ + ci->u2.funcidx = cast_int(savestack(L, c.func)); + ci->u.c.old_errfunc = L->errfunc; + L->errfunc = func; + setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ + ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ + luaD_call(L, c.func, nresults); /* do the call */ + ci->callstatus &= ~CIST_YPCALL; + L->errfunc = ci->u.c.old_errfunc; + status = LUA_OK; /* if it is here, there were no errors */ + } + adjustresults(L, nresults); + lua_unlock(L); + return status; +} + + +LUA_API int lua_load (lua_State *L, lua_Reader reader, void *data, + const char *chunkname, const char *mode) { + ZIO z; + int status; + lua_lock(L); + if (!chunkname) chunkname = "?"; + luaZ_init(L, &z, reader, data); + status = luaD_protectedparser(L, &z, chunkname, mode); + if (status == LUA_OK) { /* no errors? */ + LClosure *f = clLvalue(s2v(L->top - 1)); /* get newly created function */ + if (f->nupvalues >= 1) { /* does it have an upvalue? */ + /* get global table from registry */ + Table *reg = hvalue(&G(L)->l_registry); + const TValue *gt = luaH_getint(reg, LUA_RIDX_GLOBALS); + /* set global table as 1st upvalue of 'f' (may be LUA_ENV) */ + setobj(L, f->upvals[0]->v, gt); + luaC_barrier(L, f->upvals[0], gt); + } + } + lua_unlock(L); + return status; +} + + +LUA_API int lua_dump (lua_State *L, lua_Writer writer, void *data, int strip) { + int status; + TValue *o; + lua_lock(L); + api_checknelems(L, 1); + o = s2v(L->top - 1); + if (isLfunction(o)) + status = luaU_dump(L, getproto(o), writer, data, strip); + else + status = 1; + lua_unlock(L); + return status; +} + + +LUA_API int lua_status (lua_State *L) { + return L->status; +} + + +/* +** Garbage-collection function +*/ +LUA_API int lua_gc (lua_State *L, int what, ...) { + va_list argp; + int res = 0; + global_State *g = G(L); + lua_lock(L); + va_start(argp, what); + switch (what) { + case LUA_GCSTOP: { + g->gcrunning = 0; + break; + } + case LUA_GCRESTART: { + luaE_setdebt(g, 0); + g->gcrunning = 1; + break; + } + case LUA_GCCOLLECT: { + luaC_fullgc(L, 0); + break; + } + case LUA_GCCOUNT: { + /* GC values are expressed in Kbytes: #bytes/2^10 */ + res = cast_int(gettotalbytes(g) >> 10); + break; + } + case LUA_GCCOUNTB: { + res = cast_int(gettotalbytes(g) & 0x3ff); + break; + } + case LUA_GCSTEP: { + int data = va_arg(argp, int); + l_mem debt = 1; /* =1 to signal that it did an actual step */ + lu_byte oldrunning = g->gcrunning; + g->gcrunning = 1; /* allow GC to run */ + if (data == 0) { + luaE_setdebt(g, 0); /* do a basic step */ + luaC_step(L); + } + else { /* add 'data' to total debt */ + debt = cast(l_mem, data) * 1024 + g->GCdebt; + luaE_setdebt(g, debt); + luaC_checkGC(L); + } + g->gcrunning = oldrunning; /* restore previous state */ + if (debt > 0 && g->gcstate == GCSpause) /* end of cycle? */ + res = 1; /* signal it */ + break; + } + case LUA_GCSETPAUSE: { + int data = va_arg(argp, int); + res = getgcparam(g->gcpause); + setgcparam(g->gcpause, data); + break; + } + case LUA_GCSETSTEPMUL: { + int data = va_arg(argp, int); + res = getgcparam(g->gcstepmul); + setgcparam(g->gcstepmul, data); + break; + } + case LUA_GCISRUNNING: { + res = g->gcrunning; + break; + } + case LUA_GCGEN: { + int minormul = va_arg(argp, int); + int majormul = va_arg(argp, int); + res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; + if (minormul != 0) + g->genminormul = minormul; + if (majormul != 0) + setgcparam(g->genmajormul, majormul); + luaC_changemode(L, KGC_GEN); + break; + } + case LUA_GCINC: { + int pause = va_arg(argp, int); + int stepmul = va_arg(argp, int); + int stepsize = va_arg(argp, int); + res = isdecGCmodegen(g) ? LUA_GCGEN : LUA_GCINC; + if (pause != 0) + setgcparam(g->gcpause, pause); + if (stepmul != 0) + setgcparam(g->gcstepmul, stepmul); + if (stepsize != 0) + g->gcstepsize = stepsize; + luaC_changemode(L, KGC_INC); + break; + } + default: res = -1; /* invalid option */ + } + va_end(argp); + lua_unlock(L); + return res; +} + + + +/* +** miscellaneous functions +*/ + + +LUA_API int lua_error (lua_State *L) { + lua_lock(L); + api_checknelems(L, 1); + luaG_errormsg(L); + /* code unreachable; will unlock when control actually leaves the kernel */ + return 0; /* to avoid warnings */ +} + + +LUA_API int lua_next (lua_State *L, int idx) { + Table *t; + int more; + lua_lock(L); + api_checknelems(L, 1); + t = gettable(L, idx); + more = luaH_next(L, t, L->top - 1); + if (more) { + api_incr_top(L); + } + else /* no more elements */ + L->top -= 1; /* remove key */ + lua_unlock(L); + return more; +} + + +LUA_API void lua_toclose (lua_State *L, int idx) { + int nresults; + StkId o; + lua_lock(L); + o = index2stack(L, idx); + nresults = L->ci->nresults; + api_check(L, L->openupval == NULL || uplevel(L->openupval) <= o, + "marked index below or equal new one"); + luaF_newtbcupval(L, o); /* create new to-be-closed upvalue */ + if (!hastocloseCfunc(nresults)) /* function not marked yet? */ + L->ci->nresults = codeNresults(nresults); /* mark it */ + lua_assert(hastocloseCfunc(L->ci->nresults)); + lua_unlock(L); +} + + +LUA_API void lua_concat (lua_State *L, int n) { + lua_lock(L); + api_checknelems(L, n); + if (n >= 2) { + luaV_concat(L, n); + } + else if (n == 0) { /* push empty string */ + setsvalue2s(L, L->top, luaS_newlstr(L, "", 0)); + api_incr_top(L); + } + /* else n == 1; nothing to do */ + luaC_checkGC(L); + lua_unlock(L); +} + + +LUA_API void lua_len (lua_State *L, int idx) { + TValue *t; + lua_lock(L); + t = index2value(L, idx); + luaV_objlen(L, L->top, t); + api_incr_top(L); + lua_unlock(L); +} + + +LUA_API lua_Alloc lua_getallocf (lua_State *L, void **ud) { + lua_Alloc f; + lua_lock(L); + if (ud) *ud = G(L)->ud; + f = G(L)->frealloc; + lua_unlock(L); + return f; +} + + +LUA_API void lua_setallocf (lua_State *L, lua_Alloc f, void *ud) { + lua_lock(L); + G(L)->ud = ud; + G(L)->frealloc = f; + lua_unlock(L); +} + + +void lua_setwarnf (lua_State *L, lua_WarnFunction f, void *ud) { + lua_lock(L); + G(L)->ud_warn = ud; + G(L)->warnf = f; + lua_unlock(L); +} + + +void lua_warning (lua_State *L, const char *msg, int tocont) { + lua_lock(L); + luaE_warning(L, msg, tocont); + lua_unlock(L); +} + + + +LUA_API void *lua_newuserdatauv (lua_State *L, size_t size, int nuvalue) { + Udata *u; + lua_lock(L); + api_check(L, 0 <= nuvalue && nuvalue < USHRT_MAX, "invalid value"); + u = luaS_newudata(L, size, nuvalue); + setuvalue(L, s2v(L->top), u); + api_incr_top(L); + luaC_checkGC(L); + lua_unlock(L); + return getudatamem(u); +} + + + +static const char *aux_upvalue (TValue *fi, int n, TValue **val, + GCObject **owner) { + switch (ttypetag(fi)) { + case LUA_VCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + if (!(cast_uint(n) - 1u < cast_uint(f->nupvalues))) + return NULL; /* 'n' not in [1, f->nupvalues] */ + *val = &f->upvalue[n-1]; + if (owner) *owner = obj2gco(f); + return ""; + } + case LUA_VLCL: { /* Lua closure */ + LClosure *f = clLvalue(fi); + TString *name; + Proto *p = f->p; + if (!(cast_uint(n) - 1u < cast_uint(p->sizeupvalues))) + return NULL; /* 'n' not in [1, p->sizeupvalues] */ + *val = f->upvals[n-1]->v; + if (owner) *owner = obj2gco(f->upvals[n - 1]); + name = p->upvalues[n-1].name; + return (name == NULL) ? "(no name)" : getstr(name); + } + default: return NULL; /* not a closure */ + } +} + + +LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val = NULL; /* to avoid warnings */ + lua_lock(L); + name = aux_upvalue(index2value(L, funcindex), n, &val, NULL); + if (name) { + setobj2s(L, L->top, val); + api_incr_top(L); + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { + const char *name; + TValue *val = NULL; /* to avoid warnings */ + GCObject *owner = NULL; /* to avoid warnings */ + TValue *fi; + lua_lock(L); + fi = index2value(L, funcindex); + api_checknelems(L, 1); + name = aux_upvalue(fi, n, &val, &owner); + if (name) { + L->top--; + setobj(L, val, s2v(L->top)); + luaC_barrier(L, owner, val); + } + lua_unlock(L); + return name; +} + + +static UpVal **getupvalref (lua_State *L, int fidx, int n, LClosure **pf) { + LClosure *f; + TValue *fi = index2value(L, fidx); + api_check(L, ttisLclosure(fi), "Lua function expected"); + f = clLvalue(fi); + api_check(L, (1 <= n && n <= f->p->sizeupvalues), "invalid upvalue index"); + if (pf) *pf = f; + return &f->upvals[n - 1]; /* get its upvalue pointer */ +} + + +LUA_API void *lua_upvalueid (lua_State *L, int fidx, int n) { + TValue *fi = index2value(L, fidx); + switch (ttypetag(fi)) { + case LUA_VLCL: { /* lua closure */ + return *getupvalref(L, fidx, n, NULL); + } + case LUA_VCCL: { /* C closure */ + CClosure *f = clCvalue(fi); + api_check(L, 1 <= n && n <= f->nupvalues, "invalid upvalue index"); + return &f->upvalue[n - 1]; + } + default: { + api_check(L, 0, "closure expected"); + return NULL; + } + } +} + + +LUA_API void lua_upvaluejoin (lua_State *L, int fidx1, int n1, + int fidx2, int n2) { + LClosure *f1; + UpVal **up1 = getupvalref(L, fidx1, n1, &f1); + UpVal **up2 = getupvalref(L, fidx2, n2, NULL); + *up1 = *up2; + luaC_objbarrier(L, f1, *up1); +} + + diff --git a/lua-5.4.0/src/lapi.h b/lua-5.4.0/src/lapi.h new file mode 100644 index 0000000..41216b2 --- /dev/null +++ b/lua-5.4.0/src/lapi.h @@ -0,0 +1,47 @@ +/* +** $Id: lapi.h $ +** Auxiliary functions from Lua API +** See Copyright Notice in lua.h +*/ + +#ifndef lapi_h +#define lapi_h + + +#include "llimits.h" +#include "lstate.h" + + +/* Increments 'L->top', checking for stack overflows */ +#define api_incr_top(L) {L->top++; api_check(L, L->top <= L->ci->top, \ + "stack overflow");} + + +/* +** If a call returns too many multiple returns, the callee may not have +** stack space to accommodate all results. In this case, this macro +** increases its stack space ('L->ci->top'). +*/ +#define adjustresults(L,nres) \ + { if ((nres) <= LUA_MULTRET && L->ci->top < L->top) L->ci->top = L->top; } + + +/* Ensure the stack has at least 'n' elements */ +#define api_checknelems(L,n) api_check(L, (n) < (L->top - L->ci->func), \ + "not enough elements in the stack") + + +/* +** To reduce the overhead of returning from C functions, the presence of +** to-be-closed variables in these functions is coded in the CallInfo's +** field 'nresults', in a way that functions with no to-be-closed variables +** with zero, one, or "all" wanted results have no overhead. Functions +** with other number of wanted results, as well as functions with +** variables to be closed, have an extra check. +*/ + +#define hastocloseCfunc(n) ((n) < LUA_MULTRET) + +#define codeNresults(n) (-(n) - 3) + +#endif diff --git a/lua-5.4.0/src/lauxlib.c b/lua-5.4.0/src/lauxlib.c new file mode 100644 index 0000000..e3d9be3 --- /dev/null +++ b/lua-5.4.0/src/lauxlib.c @@ -0,0 +1,1057 @@ +/* +** $Id: lauxlib.c $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + +#define lauxlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include + + +/* +** This file uses only the official API of Lua. +** Any function declared here could be written as an application function. +*/ + +#include "lua.h" + +#include "lauxlib.h" + + +#if !defined(MAX_SIZET) +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) +#endif + + +/* +** {====================================================== +** Traceback +** ======================================================= +*/ + + +#define LEVELS1 10 /* size of the first part of the stack */ +#define LEVELS2 11 /* size of the second part of the stack */ + + + +/* +** Search for 'objidx' in table at index -1. ('objidx' must be an +** absolute index.) Return 1 + string at top if it found a good name. +*/ +static int findfield (lua_State *L, int objidx, int level) { + if (level == 0 || !lua_istable(L, -1)) + return 0; /* not found */ + lua_pushnil(L); /* start 'next' loop */ + while (lua_next(L, -2)) { /* for each pair in table */ + if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ + if (lua_rawequal(L, objidx, -1)) { /* found object? */ + lua_pop(L, 1); /* remove value (but keep name) */ + return 1; + } + else if (findfield(L, objidx, level - 1)) { /* try recursively */ + /* stack: lib_name, lib_table, field_name (top) */ + lua_pushliteral(L, "."); /* place '.' between the two names */ + lua_replace(L, -3); /* (in the slot occupied by table) */ + lua_concat(L, 3); /* lib_name.field_name */ + return 1; + } + } + lua_pop(L, 1); /* remove value */ + } + return 0; /* not found */ +} + + +/* +** Search for a name for a function in all loaded modules +*/ +static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { + int top = lua_gettop(L); + lua_getinfo(L, "f", ar); /* push function */ + lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + if (findfield(L, top + 1, 2)) { + const char *name = lua_tostring(L, -1); + if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */ + lua_pushstring(L, name + 3); /* push name without prefix */ + lua_remove(L, -2); /* remove original name */ + } + lua_copy(L, -1, top + 1); /* copy name to proper place */ + lua_settop(L, top + 1); /* remove table "loaded" and name copy */ + return 1; + } + else { + lua_settop(L, top); /* remove function and global table */ + return 0; + } +} + + +static void pushfuncname (lua_State *L, lua_Debug *ar) { + if (pushglobalfuncname(L, ar)) { /* try first a global name */ + lua_pushfstring(L, "function '%s'", lua_tostring(L, -1)); + lua_remove(L, -2); /* remove name */ + } + else if (*ar->namewhat != '\0') /* is there a name from code? */ + lua_pushfstring(L, "%s '%s'", ar->namewhat, ar->name); /* use it */ + else if (*ar->what == 'm') /* main? */ + lua_pushliteral(L, "main chunk"); + else if (*ar->what != 'C') /* for Lua functions, use */ + lua_pushfstring(L, "function <%s:%d>", ar->short_src, ar->linedefined); + else /* nothing left... */ + lua_pushliteral(L, "?"); +} + + +static int lastlevel (lua_State *L) { + lua_Debug ar; + int li = 1, le = 1; + /* find an upper bound */ + while (lua_getstack(L, le, &ar)) { li = le; le *= 2; } + /* do a binary search */ + while (li < le) { + int m = (li + le)/2; + if (lua_getstack(L, m, &ar)) li = m + 1; + else le = m; + } + return le - 1; +} + + +LUALIB_API void luaL_traceback (lua_State *L, lua_State *L1, + const char *msg, int level) { + luaL_Buffer b; + lua_Debug ar; + int last = lastlevel(L1); + int limit2show = (last - level > LEVELS1 + LEVELS2) ? LEVELS1 : -1; + luaL_buffinit(L, &b); + if (msg) { + luaL_addstring(&b, msg); + luaL_addchar(&b, '\n'); + } + luaL_addstring(&b, "stack traceback:"); + while (lua_getstack(L1, level++, &ar)) { + if (limit2show-- == 0) { /* too many levels? */ + int n = last - level - LEVELS2 + 1; /* number of levels to skip */ + lua_pushfstring(L, "\n\t...\t(skipping %d levels)", n); + luaL_addvalue(&b); /* add warning about skip */ + level += n; /* and skip to last levels */ + } + else { + lua_getinfo(L1, "Slnt", &ar); + if (ar.currentline <= 0) + lua_pushfstring(L, "\n\t%s: in ", ar.short_src); + else + lua_pushfstring(L, "\n\t%s:%d: in ", ar.short_src, ar.currentline); + luaL_addvalue(&b); + pushfuncname(L, &ar); + luaL_addvalue(&b); + if (ar.istailcall) + luaL_addstring(&b, "\n\t(...tail calls...)"); + } + } + luaL_pushresult(&b); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Error-report functions +** ======================================================= +*/ + +LUALIB_API int luaL_argerror (lua_State *L, int arg, const char *extramsg) { + lua_Debug ar; + if (!lua_getstack(L, 0, &ar)) /* no stack frame? */ + return luaL_error(L, "bad argument #%d (%s)", arg, extramsg); + lua_getinfo(L, "n", &ar); + if (strcmp(ar.namewhat, "method") == 0) { + arg--; /* do not count 'self' */ + if (arg == 0) /* error is in the self argument itself? */ + return luaL_error(L, "calling '%s' on bad self (%s)", + ar.name, extramsg); + } + if (ar.name == NULL) + ar.name = (pushglobalfuncname(L, &ar)) ? lua_tostring(L, -1) : "?"; + return luaL_error(L, "bad argument #%d to '%s' (%s)", + arg, ar.name, extramsg); +} + + +int luaL_typeerror (lua_State *L, int arg, const char *tname) { + const char *msg; + const char *typearg; /* name for the type of the actual argument */ + if (luaL_getmetafield(L, arg, "__name") == LUA_TSTRING) + typearg = lua_tostring(L, -1); /* use the given type name */ + else if (lua_type(L, arg) == LUA_TLIGHTUSERDATA) + typearg = "light userdata"; /* special name for messages */ + else + typearg = luaL_typename(L, arg); /* standard name */ + msg = lua_pushfstring(L, "%s expected, got %s", tname, typearg); + return luaL_argerror(L, arg, msg); +} + + +static void tag_error (lua_State *L, int arg, int tag) { + luaL_typeerror(L, arg, lua_typename(L, tag)); +} + + +/* +** The use of 'lua_pushfstring' ensures this function does not +** need reserved stack space when called. +*/ +LUALIB_API void luaL_where (lua_State *L, int level) { + lua_Debug ar; + if (lua_getstack(L, level, &ar)) { /* check function at level */ + lua_getinfo(L, "Sl", &ar); /* get info about it */ + if (ar.currentline > 0) { /* is there info? */ + lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); + return; + } + } + lua_pushfstring(L, ""); /* else, no information available... */ +} + + +/* +** Again, the use of 'lua_pushvfstring' ensures this function does +** not need reserved stack space when called. (At worst, it generates +** an error with "stack overflow" instead of the given message.) +*/ +LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { + va_list argp; + va_start(argp, fmt); + luaL_where(L, 1); + lua_pushvfstring(L, fmt, argp); + va_end(argp); + lua_concat(L, 2); + return lua_error(L); +} + + +LUALIB_API int luaL_fileresult (lua_State *L, int stat, const char *fname) { + int en = errno; /* calls to Lua API may change this value */ + if (stat) { + lua_pushboolean(L, 1); + return 1; + } + else { + luaL_pushfail(L); + if (fname) + lua_pushfstring(L, "%s: %s", fname, strerror(en)); + else + lua_pushstring(L, strerror(en)); + lua_pushinteger(L, en); + return 3; + } +} + + +#if !defined(l_inspectstat) /* { */ + +#if defined(LUA_USE_POSIX) + +#include + +/* +** use appropriate macros to interpret 'pclose' return status +*/ +#define l_inspectstat(stat,what) \ + if (WIFEXITED(stat)) { stat = WEXITSTATUS(stat); } \ + else if (WIFSIGNALED(stat)) { stat = WTERMSIG(stat); what = "signal"; } + +#else + +#define l_inspectstat(stat,what) /* no op */ + +#endif + +#endif /* } */ + + +LUALIB_API int luaL_execresult (lua_State *L, int stat) { + const char *what = "exit"; /* type of termination */ + if (stat != 0 && errno != 0) /* error with an 'errno'? */ + return luaL_fileresult(L, 0, NULL); + else { + l_inspectstat(stat, what); /* interpret result */ + if (*what == 'e' && stat == 0) /* successful termination? */ + lua_pushboolean(L, 1); + else + luaL_pushfail(L); + lua_pushstring(L, what); + lua_pushinteger(L, stat); + return 3; /* return true/fail,what,code */ + } +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Userdata's metatable manipulation +** ======================================================= +*/ + +LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { + if (luaL_getmetatable(L, tname) != LUA_TNIL) /* name already in use? */ + return 0; /* leave previous value on top, but return 0 */ + lua_pop(L, 1); + lua_createtable(L, 0, 2); /* create metatable */ + lua_pushstring(L, tname); + lua_setfield(L, -2, "__name"); /* metatable.__name = tname */ + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, tname); /* registry.name = metatable */ + return 1; +} + + +LUALIB_API void luaL_setmetatable (lua_State *L, const char *tname) { + luaL_getmetatable(L, tname); + lua_setmetatable(L, -2); +} + + +LUALIB_API void *luaL_testudata (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); + if (p != NULL) { /* value is a userdata? */ + if (lua_getmetatable(L, ud)) { /* does it have a metatable? */ + luaL_getmetatable(L, tname); /* get correct metatable */ + if (!lua_rawequal(L, -1, -2)) /* not the same? */ + p = NULL; /* value is a userdata with wrong metatable */ + lua_pop(L, 2); /* remove both metatables */ + return p; + } + } + return NULL; /* value is not a userdata with a metatable */ +} + + +LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { + void *p = luaL_testudata(L, ud, tname); + luaL_argexpected(L, p != NULL, ud, tname); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Argument check functions +** ======================================================= +*/ + +LUALIB_API int luaL_checkoption (lua_State *L, int arg, const char *def, + const char *const lst[]) { + const char *name = (def) ? luaL_optstring(L, arg, def) : + luaL_checkstring(L, arg); + int i; + for (i=0; lst[i]; i++) + if (strcmp(lst[i], name) == 0) + return i; + return luaL_argerror(L, arg, + lua_pushfstring(L, "invalid option '%s'", name)); +} + + +/* +** Ensures the stack has at least 'space' extra slots, raising an error +** if it cannot fulfill the request. (The error handling needs a few +** extra slots to format the error message. In case of an error without +** this extra space, Lua will generate the same 'stack overflow' error, +** but without 'msg'.) +*/ +LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *msg) { + if (!lua_checkstack(L, space)) { + if (msg) + luaL_error(L, "stack overflow (%s)", msg); + else + luaL_error(L, "stack overflow"); + } +} + + +LUALIB_API void luaL_checktype (lua_State *L, int arg, int t) { + if (lua_type(L, arg) != t) + tag_error(L, arg, t); +} + + +LUALIB_API void luaL_checkany (lua_State *L, int arg) { + if (lua_type(L, arg) == LUA_TNONE) + luaL_argerror(L, arg, "value expected"); +} + + +LUALIB_API const char *luaL_checklstring (lua_State *L, int arg, size_t *len) { + const char *s = lua_tolstring(L, arg, len); + if (!s) tag_error(L, arg, LUA_TSTRING); + return s; +} + + +LUALIB_API const char *luaL_optlstring (lua_State *L, int arg, + const char *def, size_t *len) { + if (lua_isnoneornil(L, arg)) { + if (len) + *len = (def ? strlen(def) : 0); + return def; + } + else return luaL_checklstring(L, arg, len); +} + + +LUALIB_API lua_Number luaL_checknumber (lua_State *L, int arg) { + int isnum; + lua_Number d = lua_tonumberx(L, arg, &isnum); + if (!isnum) + tag_error(L, arg, LUA_TNUMBER); + return d; +} + + +LUALIB_API lua_Number luaL_optnumber (lua_State *L, int arg, lua_Number def) { + return luaL_opt(L, luaL_checknumber, arg, def); +} + + +static void interror (lua_State *L, int arg) { + if (lua_isnumber(L, arg)) + luaL_argerror(L, arg, "number has no integer representation"); + else + tag_error(L, arg, LUA_TNUMBER); +} + + +LUALIB_API lua_Integer luaL_checkinteger (lua_State *L, int arg) { + int isnum; + lua_Integer d = lua_tointegerx(L, arg, &isnum); + if (!isnum) { + interror(L, arg); + } + return d; +} + + +LUALIB_API lua_Integer luaL_optinteger (lua_State *L, int arg, + lua_Integer def) { + return luaL_opt(L, luaL_checkinteger, arg, def); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +/* userdata to box arbitrary data */ +typedef struct UBox { + void *box; + size_t bsize; +} UBox; + + +static void *resizebox (lua_State *L, int idx, size_t newsize) { + void *ud; + lua_Alloc allocf = lua_getallocf(L, &ud); + UBox *box = (UBox *)lua_touserdata(L, idx); + void *temp = allocf(ud, box->box, box->bsize, newsize); + if (temp == NULL && newsize > 0) /* allocation error? */ + luaL_error(L, "not enough memory"); + box->box = temp; + box->bsize = newsize; + return temp; +} + + +static int boxgc (lua_State *L) { + resizebox(L, 1, 0); + return 0; +} + + +static const luaL_Reg boxmt[] = { /* box metamethods */ + {"__gc", boxgc}, + {"__close", boxgc}, + {NULL, NULL} +}; + + +static void newbox (lua_State *L) { + UBox *box = (UBox *)lua_newuserdatauv(L, sizeof(UBox), 0); + box->box = NULL; + box->bsize = 0; + if (luaL_newmetatable(L, "_UBOX*")) /* creating metatable? */ + luaL_setfuncs(L, boxmt, 0); /* set its metamethods */ + lua_setmetatable(L, -2); +} + + +/* +** check whether buffer is using a userdata on the stack as a temporary +** buffer +*/ +#define buffonstack(B) ((B)->b != (B)->init.b) + + +/* +** Compute new size for buffer 'B', enough to accommodate extra 'sz' +** bytes. +*/ +static size_t newbuffsize (luaL_Buffer *B, size_t sz) { + size_t newsize = B->size * 2; /* double buffer size */ + if (MAX_SIZET - sz < B->n) /* overflow in (B->n + sz)? */ + return luaL_error(B->L, "buffer too large"); + if (newsize < B->n + sz) /* double is not big enough? */ + newsize = B->n + sz; + return newsize; +} + + +/* +** Returns a pointer to a free area with at least 'sz' bytes in buffer +** 'B'. 'boxidx' is the relative position in the stack where the +** buffer's box is or should be. +*/ +static char *prepbuffsize (luaL_Buffer *B, size_t sz, int boxidx) { + if (B->size - B->n >= sz) /* enough space? */ + return B->b + B->n; + else { + lua_State *L = B->L; + char *newbuff; + size_t newsize = newbuffsize(B, sz); + /* create larger buffer */ + if (buffonstack(B)) /* buffer already has a box? */ + newbuff = (char *)resizebox(L, boxidx, newsize); /* resize it */ + else { /* no box yet */ + lua_pushnil(L); /* reserve slot for final result */ + newbox(L); /* create a new box */ + /* move box (and slot) to its intended position */ + lua_rotate(L, boxidx - 1, 2); + lua_toclose(L, boxidx); + newbuff = (char *)resizebox(L, boxidx, newsize); + memcpy(newbuff, B->b, B->n * sizeof(char)); /* copy original content */ + } + B->b = newbuff; + B->size = newsize; + return newbuff + B->n; + } +} + +/* +** returns a pointer to a free area with at least 'sz' bytes +*/ +LUALIB_API char *luaL_prepbuffsize (luaL_Buffer *B, size_t sz) { + return prepbuffsize(B, sz, -1); +} + + +LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { + if (l > 0) { /* avoid 'memcpy' when 's' can be NULL */ + char *b = prepbuffsize(B, l, -1); + memcpy(b, s, l * sizeof(char)); + luaL_addsize(B, l); + } +} + + +LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { + luaL_addlstring(B, s, strlen(s)); +} + + +LUALIB_API void luaL_pushresult (luaL_Buffer *B) { + lua_State *L = B->L; + lua_pushlstring(L, B->b, B->n); + if (buffonstack(B)) { + lua_copy(L, -1, -3); /* move string to reserved slot */ + lua_pop(L, 2); /* pop string and box (closing the box) */ + } +} + + +LUALIB_API void luaL_pushresultsize (luaL_Buffer *B, size_t sz) { + luaL_addsize(B, sz); + luaL_pushresult(B); +} + + +/* +** 'luaL_addvalue' is the only function in the Buffer system where the +** box (if existent) is not on the top of the stack. So, instead of +** calling 'luaL_addlstring', it replicates the code using -2 as the +** last argument to 'prepbuffsize', signaling that the box is (or will +** be) bellow the string being added to the buffer. (Box creation can +** trigger an emergency GC, so we should not remove the string from the +** stack before we have the space guaranteed.) +*/ +LUALIB_API void luaL_addvalue (luaL_Buffer *B) { + lua_State *L = B->L; + size_t len; + const char *s = lua_tolstring(L, -1, &len); + char *b = prepbuffsize(B, len, -2); + memcpy(b, s, len * sizeof(char)); + luaL_addsize(B, len); + lua_pop(L, 1); /* pop string */ +} + + +LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { + B->L = L; + B->b = B->init.b; + B->n = 0; + B->size = LUAL_BUFFERSIZE; +} + + +LUALIB_API char *luaL_buffinitsize (lua_State *L, luaL_Buffer *B, size_t sz) { + luaL_buffinit(L, B); + return prepbuffsize(B, sz, -1); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Reference system +** ======================================================= +*/ + +/* index of free-list header */ +#define freelist 0 + + +LUALIB_API int luaL_ref (lua_State *L, int t) { + int ref; + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* remove from stack */ + return LUA_REFNIL; /* 'nil' has a unique fixed reference */ + } + t = lua_absindex(L, t); + lua_rawgeti(L, t, freelist); /* get first free element */ + ref = (int)lua_tointeger(L, -1); /* ref = t[freelist] */ + lua_pop(L, 1); /* remove it from stack */ + if (ref != 0) { /* any free element? */ + lua_rawgeti(L, t, ref); /* remove it from list */ + lua_rawseti(L, t, freelist); /* (t[freelist] = t[ref]) */ + } + else /* no free elements */ + ref = (int)lua_rawlen(L, t) + 1; /* get a new reference */ + lua_rawseti(L, t, ref); + return ref; +} + + +LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { + if (ref >= 0) { + t = lua_absindex(L, t); + lua_rawgeti(L, t, freelist); + lua_rawseti(L, t, ref); /* t[ref] = t[freelist] */ + lua_pushinteger(L, ref); + lua_rawseti(L, t, freelist); /* t[freelist] = ref */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Load functions +** ======================================================= +*/ + +typedef struct LoadF { + int n; /* number of pre-read characters */ + FILE *f; /* file being read */ + char buff[BUFSIZ]; /* area for reading file */ +} LoadF; + + +static const char *getF (lua_State *L, void *ud, size_t *size) { + LoadF *lf = (LoadF *)ud; + (void)L; /* not used */ + if (lf->n > 0) { /* are there pre-read characters to be read? */ + *size = lf->n; /* return them (chars already in buffer) */ + lf->n = 0; /* no more pre-read characters */ + } + else { /* read a block from file */ + /* 'fread' can return > 0 *and* set the EOF flag. If next call to + 'getF' called 'fread', it might still wait for user input. + The next check avoids this problem. */ + if (feof(lf->f)) return NULL; + *size = fread(lf->buff, 1, sizeof(lf->buff), lf->f); /* read block */ + } + return lf->buff; +} + + +static int errfile (lua_State *L, const char *what, int fnameindex) { + const char *serr = strerror(errno); + const char *filename = lua_tostring(L, fnameindex) + 1; + lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr); + lua_remove(L, fnameindex); + return LUA_ERRFILE; +} + + +static int skipBOM (LoadF *lf) { + const char *p = "\xEF\xBB\xBF"; /* UTF-8 BOM mark */ + int c; + lf->n = 0; + do { + c = getc(lf->f); + if (c == EOF || c != *(const unsigned char *)p++) return c; + lf->buff[lf->n++] = c; /* to be read by the parser */ + } while (*p != '\0'); + lf->n = 0; /* prefix matched; discard it */ + return getc(lf->f); /* return next character */ +} + + +/* +** reads the first character of file 'f' and skips an optional BOM mark +** in its beginning plus its first line if it starts with '#'. Returns +** true if it skipped the first line. In any case, '*cp' has the +** first "valid" character of the file (after the optional BOM and +** a first-line comment). +*/ +static int skipcomment (LoadF *lf, int *cp) { + int c = *cp = skipBOM(lf); + if (c == '#') { /* first line is a comment (Unix exec. file)? */ + do { /* skip first line */ + c = getc(lf->f); + } while (c != EOF && c != '\n'); + *cp = getc(lf->f); /* skip end-of-line, if present */ + return 1; /* there was a comment */ + } + else return 0; /* no comment */ +} + + +LUALIB_API int luaL_loadfilex (lua_State *L, const char *filename, + const char *mode) { + LoadF lf; + int status, readstatus; + int c; + int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ + if (filename == NULL) { + lua_pushliteral(L, "=stdin"); + lf.f = stdin; + } + else { + lua_pushfstring(L, "@%s", filename); + lf.f = fopen(filename, "r"); + if (lf.f == NULL) return errfile(L, "open", fnameindex); + } + if (skipcomment(&lf, &c)) /* read initial portion */ + lf.buff[lf.n++] = '\n'; /* add line to correct line numbers */ + if (c == LUA_SIGNATURE[0] && filename) { /* binary file? */ + lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */ + if (lf.f == NULL) return errfile(L, "reopen", fnameindex); + skipcomment(&lf, &c); /* re-read initial portion */ + } + if (c != EOF) + lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */ + status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode); + readstatus = ferror(lf.f); + if (filename) fclose(lf.f); /* close file (even in case of errors) */ + if (readstatus) { + lua_settop(L, fnameindex); /* ignore results from 'lua_load' */ + return errfile(L, "read", fnameindex); + } + lua_remove(L, fnameindex); + return status; +} + + +typedef struct LoadS { + const char *s; + size_t size; +} LoadS; + + +static const char *getS (lua_State *L, void *ud, size_t *size) { + LoadS *ls = (LoadS *)ud; + (void)L; /* not used */ + if (ls->size == 0) return NULL; + *size = ls->size; + ls->size = 0; + return ls->s; +} + + +LUALIB_API int luaL_loadbufferx (lua_State *L, const char *buff, size_t size, + const char *name, const char *mode) { + LoadS ls; + ls.s = buff; + ls.size = size; + return lua_load(L, getS, &ls, name, mode); +} + + +LUALIB_API int luaL_loadstring (lua_State *L, const char *s) { + return luaL_loadbuffer(L, s, strlen(s), s); +} + +/* }====================================================== */ + + + +LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { + if (!lua_getmetatable(L, obj)) /* no metatable? */ + return LUA_TNIL; + else { + int tt; + lua_pushstring(L, event); + tt = lua_rawget(L, -2); + if (tt == LUA_TNIL) /* is metafield nil? */ + lua_pop(L, 2); /* remove metatable and metafield */ + else + lua_remove(L, -2); /* remove only metatable */ + return tt; /* return metafield type */ + } +} + + +LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { + obj = lua_absindex(L, obj); + if (luaL_getmetafield(L, obj, event) == LUA_TNIL) /* no metafield? */ + return 0; + lua_pushvalue(L, obj); + lua_call(L, 1, 1); + return 1; +} + + +LUALIB_API lua_Integer luaL_len (lua_State *L, int idx) { + lua_Integer l; + int isnum; + lua_len(L, idx); + l = lua_tointegerx(L, -1, &isnum); + if (!isnum) + luaL_error(L, "object length is not an integer"); + lua_pop(L, 1); /* remove object */ + return l; +} + + +LUALIB_API const char *luaL_tolstring (lua_State *L, int idx, size_t *len) { + if (luaL_callmeta(L, idx, "__tostring")) { /* metafield? */ + if (!lua_isstring(L, -1)) + luaL_error(L, "'__tostring' must return a string"); + } + else { + switch (lua_type(L, idx)) { + case LUA_TNUMBER: { + if (lua_isinteger(L, idx)) + lua_pushfstring(L, "%I", (LUAI_UACINT)lua_tointeger(L, idx)); + else + lua_pushfstring(L, "%f", (LUAI_UACNUMBER)lua_tonumber(L, idx)); + break; + } + case LUA_TSTRING: + lua_pushvalue(L, idx); + break; + case LUA_TBOOLEAN: + lua_pushstring(L, (lua_toboolean(L, idx) ? "true" : "false")); + break; + case LUA_TNIL: + lua_pushliteral(L, "nil"); + break; + default: { + int tt = luaL_getmetafield(L, idx, "__name"); /* try name */ + const char *kind = (tt == LUA_TSTRING) ? lua_tostring(L, -1) : + luaL_typename(L, idx); + lua_pushfstring(L, "%s: %p", kind, lua_topointer(L, idx)); + if (tt != LUA_TNIL) + lua_remove(L, -2); /* remove '__name' */ + break; + } + } + } + return lua_tolstring(L, -1, len); +} + + +/* +** set functions from list 'l' into table at top - 'nup'; each +** function gets the 'nup' elements at the top as upvalues. +** Returns with only the table at the stack. +*/ +LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) { + luaL_checkstack(L, nup, "too many upvalues"); + for (; l->name != NULL; l++) { /* fill the table with given functions */ + if (l->func == NULL) /* place holder? */ + lua_pushboolean(L, 0); + else { + int i; + for (i = 0; i < nup; i++) /* copy upvalues to the top */ + lua_pushvalue(L, -nup); + lua_pushcclosure(L, l->func, nup); /* closure with those upvalues */ + } + lua_setfield(L, -(nup + 2), l->name); + } + lua_pop(L, nup); /* remove upvalues */ +} + + +/* +** ensure that stack[idx][fname] has a table and push that table +** into the stack +*/ +LUALIB_API int luaL_getsubtable (lua_State *L, int idx, const char *fname) { + if (lua_getfield(L, idx, fname) == LUA_TTABLE) + return 1; /* table already there */ + else { + lua_pop(L, 1); /* remove previous result */ + idx = lua_absindex(L, idx); + lua_newtable(L); + lua_pushvalue(L, -1); /* copy to be left at top */ + lua_setfield(L, idx, fname); /* assign new table to field */ + return 0; /* false, because did not find table there */ + } +} + + +/* +** Stripped-down 'require': After checking "loaded" table, calls 'openf' +** to open a module, registers the result in 'package.loaded' table and, +** if 'glb' is true, also registers the result in the global table. +** Leaves resulting module on the top. +*/ +LUALIB_API void luaL_requiref (lua_State *L, const char *modname, + lua_CFunction openf, int glb) { + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_getfield(L, -1, modname); /* LOADED[modname] */ + if (!lua_toboolean(L, -1)) { /* package not already loaded? */ + lua_pop(L, 1); /* remove field */ + lua_pushcfunction(L, openf); + lua_pushstring(L, modname); /* argument to open function */ + lua_call(L, 1, 1); /* call 'openf' to open module */ + lua_pushvalue(L, -1); /* make copy of module (call result) */ + lua_setfield(L, -3, modname); /* LOADED[modname] = module */ + } + lua_remove(L, -2); /* remove LOADED table */ + if (glb) { + lua_pushvalue(L, -1); /* copy of module */ + lua_setglobal(L, modname); /* _G[modname] = module */ + } +} + + +LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s, + const char *p, const char *r) { + const char *wild; + size_t l = strlen(p); + while ((wild = strstr(s, p)) != NULL) { + luaL_addlstring(b, s, wild - s); /* push prefix */ + luaL_addstring(b, r); /* push replacement in place of pattern */ + s = wild + l; /* continue after 'p' */ + } + luaL_addstring(b, s); /* push last suffix */ +} + + +LUALIB_API const char *luaL_gsub (lua_State *L, const char *s, + const char *p, const char *r) { + luaL_Buffer b; + luaL_buffinit(L, &b); + luaL_addgsub(&b, s, p, r); + luaL_pushresult(&b); + return lua_tostring(L, -1); +} + + +static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { + (void)ud; (void)osize; /* not used */ + if (nsize == 0) { + free(ptr); + return NULL; + } + else + return realloc(ptr, nsize); +} + + +static int panic (lua_State *L) { + const char *msg = lua_tostring(L, -1); + if (msg == NULL) msg = "error object is not a string"; + lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n", + msg); + return 0; /* return to Lua to abort */ +} + + +/* +** Emit a warning. '*warnstate' means: +** 0 - warning system is off; +** 1 - ready to start a new message; +** 2 - previous message is to be continued. +*/ +static void warnf (void *ud, const char *message, int tocont) { + int *warnstate = (int *)ud; + if (*warnstate != 2 && !tocont && *message == '@') { /* control message? */ + if (strcmp(message, "@off") == 0) + *warnstate = 0; + else if (strcmp(message, "@on") == 0) + *warnstate = 1; + return; + } + else if (*warnstate == 0) /* warnings off? */ + return; + if (*warnstate == 1) /* previous message was the last? */ + lua_writestringerror("%s", "Lua warning: "); /* start a new warning */ + lua_writestringerror("%s", message); /* write message */ + if (tocont) /* not the last part? */ + *warnstate = 2; /* to be continued */ + else { /* last part */ + lua_writestringerror("%s", "\n"); /* finish message with end-of-line */ + *warnstate = 1; /* ready to start a new message */ + } +} + + +LUALIB_API lua_State *luaL_newstate (void) { + lua_State *L = lua_newstate(l_alloc, NULL); + if (L) { + int *warnstate; /* space for warning state */ + lua_atpanic(L, &panic); + warnstate = (int *)lua_newuserdatauv(L, sizeof(int), 0); + luaL_ref(L, LUA_REGISTRYINDEX); /* make sure it won't be collected */ + *warnstate = 0; /* default is warnings off */ + lua_setwarnf(L, warnf, warnstate); + } + return L; +} + + +LUALIB_API void luaL_checkversion_ (lua_State *L, lua_Number ver, size_t sz) { + lua_Number v = lua_version(L); + if (sz != LUAL_NUMSIZES) /* check numeric types */ + luaL_error(L, "core and library have incompatible numeric types"); + else if (v != ver) + luaL_error(L, "version mismatch: app. needs %f, Lua core provides %f", + (LUAI_UACNUMBER)ver, (LUAI_UACNUMBER)v); +} + diff --git a/lua-5.4.0/src/lauxlib.h b/lua-5.4.0/src/lauxlib.h new file mode 100644 index 0000000..59fef6a --- /dev/null +++ b/lua-5.4.0/src/lauxlib.h @@ -0,0 +1,276 @@ +/* +** $Id: lauxlib.h $ +** Auxiliary functions for building Lua libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lauxlib_h +#define lauxlib_h + + +#include +#include + +#include "lua.h" + + +/* global table */ +#define LUA_GNAME "_G" + + +typedef struct luaL_Buffer luaL_Buffer; + + +/* extra error code for 'luaL_loadfilex' */ +#define LUA_ERRFILE (LUA_ERRERR+1) + + +/* key, in the registry, for table of loaded modules */ +#define LUA_LOADED_TABLE "_LOADED" + + +/* key, in the registry, for table of preloaded loaders */ +#define LUA_PRELOAD_TABLE "_PRELOAD" + + +typedef struct luaL_Reg { + const char *name; + lua_CFunction func; +} luaL_Reg; + + +#define LUAL_NUMSIZES (sizeof(lua_Integer)*16 + sizeof(lua_Number)) + +LUALIB_API void (luaL_checkversion_) (lua_State *L, lua_Number ver, size_t sz); +#define luaL_checkversion(L) \ + luaL_checkversion_(L, LUA_VERSION_NUM, LUAL_NUMSIZES) + +LUALIB_API int (luaL_getmetafield) (lua_State *L, int obj, const char *e); +LUALIB_API int (luaL_callmeta) (lua_State *L, int obj, const char *e); +LUALIB_API const char *(luaL_tolstring) (lua_State *L, int idx, size_t *len); +LUALIB_API int (luaL_argerror) (lua_State *L, int arg, const char *extramsg); +LUALIB_API int (luaL_typeerror) (lua_State *L, int arg, const char *tname); +LUALIB_API const char *(luaL_checklstring) (lua_State *L, int arg, + size_t *l); +LUALIB_API const char *(luaL_optlstring) (lua_State *L, int arg, + const char *def, size_t *l); +LUALIB_API lua_Number (luaL_checknumber) (lua_State *L, int arg); +LUALIB_API lua_Number (luaL_optnumber) (lua_State *L, int arg, lua_Number def); + +LUALIB_API lua_Integer (luaL_checkinteger) (lua_State *L, int arg); +LUALIB_API lua_Integer (luaL_optinteger) (lua_State *L, int arg, + lua_Integer def); + +LUALIB_API void (luaL_checkstack) (lua_State *L, int sz, const char *msg); +LUALIB_API void (luaL_checktype) (lua_State *L, int arg, int t); +LUALIB_API void (luaL_checkany) (lua_State *L, int arg); + +LUALIB_API int (luaL_newmetatable) (lua_State *L, const char *tname); +LUALIB_API void (luaL_setmetatable) (lua_State *L, const char *tname); +LUALIB_API void *(luaL_testudata) (lua_State *L, int ud, const char *tname); +LUALIB_API void *(luaL_checkudata) (lua_State *L, int ud, const char *tname); + +LUALIB_API void (luaL_where) (lua_State *L, int lvl); +LUALIB_API int (luaL_error) (lua_State *L, const char *fmt, ...); + +LUALIB_API int (luaL_checkoption) (lua_State *L, int arg, const char *def, + const char *const lst[]); + +LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname); +LUALIB_API int (luaL_execresult) (lua_State *L, int stat); + + +/* predefined references */ +#define LUA_NOREF (-2) +#define LUA_REFNIL (-1) + +LUALIB_API int (luaL_ref) (lua_State *L, int t); +LUALIB_API void (luaL_unref) (lua_State *L, int t, int ref); + +LUALIB_API int (luaL_loadfilex) (lua_State *L, const char *filename, + const char *mode); + +#define luaL_loadfile(L,f) luaL_loadfilex(L,f,NULL) + +LUALIB_API int (luaL_loadbufferx) (lua_State *L, const char *buff, size_t sz, + const char *name, const char *mode); +LUALIB_API int (luaL_loadstring) (lua_State *L, const char *s); + +LUALIB_API lua_State *(luaL_newstate) (void); + +LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx); + +LUALIB_API void luaL_addgsub (luaL_Buffer *b, const char *s, + const char *p, const char *r); +LUALIB_API const char *(luaL_gsub) (lua_State *L, const char *s, + const char *p, const char *r); + +LUALIB_API void (luaL_setfuncs) (lua_State *L, const luaL_Reg *l, int nup); + +LUALIB_API int (luaL_getsubtable) (lua_State *L, int idx, const char *fname); + +LUALIB_API void (luaL_traceback) (lua_State *L, lua_State *L1, + const char *msg, int level); + +LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname, + lua_CFunction openf, int glb); + +/* +** =============================================================== +** some useful macros +** =============================================================== +*/ + + +#define luaL_newlibtable(L,l) \ + lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1) + +#define luaL_newlib(L,l) \ + (luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) + +#define luaL_argcheck(L, cond,arg,extramsg) \ + ((void)((cond) || luaL_argerror(L, (arg), (extramsg)))) + +#define luaL_argexpected(L,cond,arg,tname) \ + ((void)((cond) || luaL_typeerror(L, (arg), (tname)))) + +#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) +#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) + +#define luaL_typename(L,i) lua_typename(L, lua_type(L,(i))) + +#define luaL_dofile(L, fn) \ + (luaL_loadfile(L, fn) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_dostring(L, s) \ + (luaL_loadstring(L, s) || lua_pcall(L, 0, LUA_MULTRET, 0)) + +#define luaL_getmetatable(L,n) (lua_getfield(L, LUA_REGISTRYINDEX, (n))) + +#define luaL_opt(L,f,n,d) (lua_isnoneornil(L,(n)) ? (d) : f(L,(n))) + +#define luaL_loadbuffer(L,s,sz,n) luaL_loadbufferx(L,s,sz,n,NULL) + + +/* push the value used to represent failure/error */ +#define luaL_pushfail(L) lua_pushnil(L) + + +/* +** {====================================================== +** Generic Buffer manipulation +** ======================================================= +*/ + +struct luaL_Buffer { + char *b; /* buffer address */ + size_t size; /* buffer size */ + size_t n; /* number of characters in buffer */ + lua_State *L; + union { + LUAI_MAXALIGN; /* ensure maximum alignment for buffer */ + char b[LUAL_BUFFERSIZE]; /* initial buffer */ + } init; +}; + + +#define luaL_bufflen(bf) ((bf)->n) +#define luaL_buffaddr(bf) ((bf)->b) + + +#define luaL_addchar(B,c) \ + ((void)((B)->n < (B)->size || luaL_prepbuffsize((B), 1)), \ + ((B)->b[(B)->n++] = (c))) + +#define luaL_addsize(B,s) ((B)->n += (s)) + +#define luaL_buffsub(B,s) ((B)->n -= (s)) + +LUALIB_API void (luaL_buffinit) (lua_State *L, luaL_Buffer *B); +LUALIB_API char *(luaL_prepbuffsize) (luaL_Buffer *B, size_t sz); +LUALIB_API void (luaL_addlstring) (luaL_Buffer *B, const char *s, size_t l); +LUALIB_API void (luaL_addstring) (luaL_Buffer *B, const char *s); +LUALIB_API void (luaL_addvalue) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresult) (luaL_Buffer *B); +LUALIB_API void (luaL_pushresultsize) (luaL_Buffer *B, size_t sz); +LUALIB_API char *(luaL_buffinitsize) (lua_State *L, luaL_Buffer *B, size_t sz); + +#define luaL_prepbuffer(B) luaL_prepbuffsize(B, LUAL_BUFFERSIZE) + +/* }====================================================== */ + + + +/* +** {====================================================== +** File handles for IO library +** ======================================================= +*/ + +/* +** A file handle is a userdata with metatable 'LUA_FILEHANDLE' and +** initial structure 'luaL_Stream' (it may contain other fields +** after that initial structure). +*/ + +#define LUA_FILEHANDLE "FILE*" + + +typedef struct luaL_Stream { + FILE *f; /* stream (NULL for incompletely created streams) */ + lua_CFunction closef; /* to close stream (NULL for closed streams) */ +} luaL_Stream; + +/* }====================================================== */ + +/* +** {================================================================== +** "Abstraction Layer" for basic report of messages and errors +** =================================================================== +*/ + +/* print a string */ +#if !defined(lua_writestring) +#define lua_writestring(s,l) fwrite((s), sizeof(char), (l), stdout) +#endif + +/* print a newline and flush the output */ +#if !defined(lua_writeline) +#define lua_writeline() (lua_writestring("\n", 1), fflush(stdout)) +#endif + +/* print an error message */ +#if !defined(lua_writestringerror) +#define lua_writestringerror(s,p) \ + (fprintf(stderr, (s), (p)), fflush(stderr)) +#endif + +/* }================================================================== */ + + +/* +** {============================================================ +** Compatibility with deprecated conversions +** ============================================================= +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define luaL_checkunsigned(L,a) ((lua_Unsigned)luaL_checkinteger(L,a)) +#define luaL_optunsigned(L,a,d) \ + ((lua_Unsigned)luaL_optinteger(L,a,(lua_Integer)(d))) + +#define luaL_checkint(L,n) ((int)luaL_checkinteger(L, (n))) +#define luaL_optint(L,n,d) ((int)luaL_optinteger(L, (n), (d))) + +#define luaL_checklong(L,n) ((long)luaL_checkinteger(L, (n))) +#define luaL_optlong(L,n,d) ((long)luaL_optinteger(L, (n), (d))) + +#endif +/* }============================================================ */ + + + +#endif + + diff --git a/lua-5.4.0/src/lbaselib.c b/lua-5.4.0/src/lbaselib.c new file mode 100644 index 0000000..747fd45 --- /dev/null +++ b/lua-5.4.0/src/lbaselib.c @@ -0,0 +1,527 @@ +/* +** $Id: lbaselib.c $ +** Basic library +** See Copyright Notice in lua.h +*/ + +#define lbaselib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static int luaB_print (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + for (i = 1; i <= n; i++) { /* for each argument */ + size_t l; + const char *s = luaL_tolstring(L, i, &l); /* convert it to string */ + if (i > 1) /* not the first element? */ + lua_writestring("\t", 1); /* add a tab before it */ + lua_writestring(s, l); /* print it */ + lua_pop(L, 1); /* pop result */ + } + lua_writeline(); + return 0; +} + + +/* +** Creates a warning with all given arguments. +** Check first for errors; otherwise an error may interrupt +** the composition of a warning, leaving it unfinished. +*/ +static int luaB_warn (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int i; + luaL_checkstring(L, 1); /* at least one argument */ + for (i = 2; i <= n; i++) + luaL_checkstring(L, i); /* make sure all arguments are strings */ + for (i = 1; i < n; i++) /* compose warning */ + lua_warning(L, lua_tostring(L, i), 1); + lua_warning(L, lua_tostring(L, n), 0); /* close warning */ + return 0; +} + + +#define SPACECHARS " \f\n\r\t\v" + +static const char *b_str2int (const char *s, int base, lua_Integer *pn) { + lua_Unsigned n = 0; + int neg = 0; + s += strspn(s, SPACECHARS); /* skip initial spaces */ + if (*s == '-') { s++; neg = 1; } /* handle sign */ + else if (*s == '+') s++; + if (!isalnum((unsigned char)*s)) /* no digit? */ + return NULL; + do { + int digit = (isdigit((unsigned char)*s)) ? *s - '0' + : (toupper((unsigned char)*s) - 'A') + 10; + if (digit >= base) return NULL; /* invalid numeral */ + n = n * base + digit; + s++; + } while (isalnum((unsigned char)*s)); + s += strspn(s, SPACECHARS); /* skip trailing spaces */ + *pn = (lua_Integer)((neg) ? (0u - n) : n); + return s; +} + + +static int luaB_tonumber (lua_State *L) { + if (lua_isnoneornil(L, 2)) { /* standard conversion? */ + if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */ + lua_settop(L, 1); /* yes; return it */ + return 1; + } + else { + size_t l; + const char *s = lua_tolstring(L, 1, &l); + if (s != NULL && lua_stringtonumber(L, s) == l + 1) + return 1; /* successful conversion to number */ + /* else not a number */ + luaL_checkany(L, 1); /* (but there must be some parameter) */ + } + } + else { + size_t l; + const char *s; + lua_Integer n = 0; /* to avoid warnings */ + lua_Integer base = luaL_checkinteger(L, 2); + luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */ + s = lua_tolstring(L, 1, &l); + luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); + if (b_str2int(s, (int)base, &n) == s + l) { + lua_pushinteger(L, n); + return 1; + } /* else not a number */ + } /* else not a number */ + luaL_pushfail(L); /* not a number */ + return 1; +} + + +static int luaB_error (lua_State *L) { + int level = (int)luaL_optinteger(L, 2, 1); + lua_settop(L, 1); + if (lua_type(L, 1) == LUA_TSTRING && level > 0) { + luaL_where(L, level); /* add extra information */ + lua_pushvalue(L, 1); + lua_concat(L, 2); + } + return lua_error(L); +} + + +static int luaB_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); + return 1; /* no metatable */ + } + luaL_getmetafield(L, 1, "__metatable"); + return 1; /* returns either __metatable field (if present) or metatable */ +} + + +static int luaB_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_checktype(L, 1, LUA_TTABLE); + luaL_argexpected(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table"); + if (luaL_getmetafield(L, 1, "__metatable") != LUA_TNIL) + return luaL_error(L, "cannot change a protected metatable"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; +} + + +static int luaB_rawequal (lua_State *L) { + luaL_checkany(L, 1); + luaL_checkany(L, 2); + lua_pushboolean(L, lua_rawequal(L, 1, 2)); + return 1; +} + + +static int luaB_rawlen (lua_State *L) { + int t = lua_type(L, 1); + luaL_argexpected(L, t == LUA_TTABLE || t == LUA_TSTRING, 1, + "table or string"); + lua_pushinteger(L, lua_rawlen(L, 1)); + return 1; +} + + +static int luaB_rawget (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + lua_settop(L, 2); + lua_rawget(L, 1); + return 1; +} + +static int luaB_rawset (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + luaL_checkany(L, 2); + luaL_checkany(L, 3); + lua_settop(L, 3); + lua_rawset(L, 1); + return 1; +} + + +static int pushmode (lua_State *L, int oldmode) { + lua_pushstring(L, (oldmode == LUA_GCINC) ? "incremental" : "generational"); + return 1; +} + + +static int luaB_collectgarbage (lua_State *L) { + static const char *const opts[] = {"stop", "restart", "collect", + "count", "step", "setpause", "setstepmul", + "isrunning", "generational", "incremental", NULL}; + static const int optsnum[] = {LUA_GCSTOP, LUA_GCRESTART, LUA_GCCOLLECT, + LUA_GCCOUNT, LUA_GCSTEP, LUA_GCSETPAUSE, LUA_GCSETSTEPMUL, + LUA_GCISRUNNING, LUA_GCGEN, LUA_GCINC}; + int o = optsnum[luaL_checkoption(L, 1, "collect", opts)]; + switch (o) { + case LUA_GCCOUNT: { + int k = lua_gc(L, o); + int b = lua_gc(L, LUA_GCCOUNTB); + lua_pushnumber(L, (lua_Number)k + ((lua_Number)b/1024)); + return 1; + } + case LUA_GCSTEP: { + int step = (int)luaL_optinteger(L, 2, 0); + int res = lua_gc(L, o, step); + lua_pushboolean(L, res); + return 1; + } + case LUA_GCSETPAUSE: + case LUA_GCSETSTEPMUL: { + int p = (int)luaL_optinteger(L, 2, 0); + int previous = lua_gc(L, o, p); + lua_pushinteger(L, previous); + return 1; + } + case LUA_GCISRUNNING: { + int res = lua_gc(L, o); + lua_pushboolean(L, res); + return 1; + } + case LUA_GCGEN: { + int minormul = (int)luaL_optinteger(L, 2, 0); + int majormul = (int)luaL_optinteger(L, 3, 0); + return pushmode(L, lua_gc(L, o, minormul, majormul)); + } + case LUA_GCINC: { + int pause = (int)luaL_optinteger(L, 2, 0); + int stepmul = (int)luaL_optinteger(L, 3, 0); + int stepsize = (int)luaL_optinteger(L, 4, 0); + return pushmode(L, lua_gc(L, o, pause, stepmul, stepsize)); + } + default: { + int res = lua_gc(L, o); + lua_pushinteger(L, res); + return 1; + } + } +} + + +static int luaB_type (lua_State *L) { + int t = lua_type(L, 1); + luaL_argcheck(L, t != LUA_TNONE, 1, "value expected"); + lua_pushstring(L, lua_typename(L, t)); + return 1; +} + + +static int luaB_next (lua_State *L) { + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 2); /* create a 2nd argument if there isn't one */ + if (lua_next(L, 1)) + return 2; + else { + lua_pushnil(L); + return 1; + } +} + + +static int luaB_pairs (lua_State *L) { + luaL_checkany(L, 1); + if (luaL_getmetafield(L, 1, "__pairs") == LUA_TNIL) { /* no metamethod? */ + lua_pushcfunction(L, luaB_next); /* will return generator, */ + lua_pushvalue(L, 1); /* state, */ + lua_pushnil(L); /* and initial value */ + } + else { + lua_pushvalue(L, 1); /* argument 'self' to metamethod */ + lua_call(L, 1, 3); /* get 3 values from metamethod */ + } + return 3; +} + + +/* +** Traversal function for 'ipairs' +*/ +static int ipairsaux (lua_State *L) { + lua_Integer i = luaL_checkinteger(L, 2) + 1; + lua_pushinteger(L, i); + return (lua_geti(L, 1, i) == LUA_TNIL) ? 1 : 2; +} + + +/* +** 'ipairs' function. Returns 'ipairsaux', given "table", 0. +** (The given "table" may not be a table.) +*/ +static int luaB_ipairs (lua_State *L) { + luaL_checkany(L, 1); + lua_pushcfunction(L, ipairsaux); /* iteration function */ + lua_pushvalue(L, 1); /* state */ + lua_pushinteger(L, 0); /* initial value */ + return 3; +} + + +static int load_aux (lua_State *L, int status, int envidx) { + if (status == LUA_OK) { + if (envidx != 0) { /* 'env' parameter? */ + lua_pushvalue(L, envidx); /* environment for loaded function */ + if (!lua_setupvalue(L, -2, 1)) /* set it as 1st upvalue */ + lua_pop(L, 1); /* remove 'env' if not used by previous call */ + } + return 1; + } + else { /* error (message is on top of the stack) */ + luaL_pushfail(L); + lua_insert(L, -2); /* put before error message */ + return 2; /* return fail plus error message */ + } +} + + +static int luaB_loadfile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + const char *mode = luaL_optstring(L, 2, NULL); + int env = (!lua_isnone(L, 3) ? 3 : 0); /* 'env' index or 0 if no 'env' */ + int status = luaL_loadfilex(L, fname, mode); + return load_aux(L, status, env); +} + + +/* +** {====================================================== +** Generic Read function +** ======================================================= +*/ + + +/* +** reserved slot, above all arguments, to hold a copy of the returned +** string to avoid it being collected while parsed. 'load' has four +** optional arguments (chunk, source name, mode, and environment). +*/ +#define RESERVEDSLOT 5 + + +/* +** Reader for generic 'load' function: 'lua_load' uses the +** stack for internal stuff, so the reader cannot change the +** stack top. Instead, it keeps its resulting string in a +** reserved slot inside the stack. +*/ +static const char *generic_reader (lua_State *L, void *ud, size_t *size) { + (void)(ud); /* not used */ + luaL_checkstack(L, 2, "too many nested functions"); + lua_pushvalue(L, 1); /* get function */ + lua_call(L, 0, 1); /* call it */ + if (lua_isnil(L, -1)) { + lua_pop(L, 1); /* pop result */ + *size = 0; + return NULL; + } + else if (!lua_isstring(L, -1)) + luaL_error(L, "reader function must return a string"); + lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */ + return lua_tolstring(L, RESERVEDSLOT, size); +} + + +static int luaB_load (lua_State *L) { + int status; + size_t l; + const char *s = lua_tolstring(L, 1, &l); + const char *mode = luaL_optstring(L, 3, "bt"); + int env = (!lua_isnone(L, 4) ? 4 : 0); /* 'env' index or 0 if no 'env' */ + if (s != NULL) { /* loading a string? */ + const char *chunkname = luaL_optstring(L, 2, s); + status = luaL_loadbufferx(L, s, l, chunkname, mode); + } + else { /* loading from a reader function */ + const char *chunkname = luaL_optstring(L, 2, "=(load)"); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, RESERVEDSLOT); /* create reserved slot */ + status = lua_load(L, generic_reader, NULL, chunkname, mode); + } + return load_aux(L, status, env); +} + +/* }====================================================== */ + + +static int dofilecont (lua_State *L, int d1, lua_KContext d2) { + (void)d1; (void)d2; /* only to match 'lua_Kfunction' prototype */ + return lua_gettop(L) - 1; +} + + +static int luaB_dofile (lua_State *L) { + const char *fname = luaL_optstring(L, 1, NULL); + lua_settop(L, 1); + if (luaL_loadfile(L, fname) != LUA_OK) + return lua_error(L); + lua_callk(L, 0, LUA_MULTRET, 0, dofilecont); + return dofilecont(L, 0, 0); +} + + +static int luaB_assert (lua_State *L) { + if (lua_toboolean(L, 1)) /* condition is true? */ + return lua_gettop(L); /* return all arguments */ + else { /* error */ + luaL_checkany(L, 1); /* there must be a condition */ + lua_remove(L, 1); /* remove it */ + lua_pushliteral(L, "assertion failed!"); /* default message */ + lua_settop(L, 1); /* leave only message (default if no other one) */ + return luaB_error(L); /* call 'error' */ + } +} + + +static int luaB_select (lua_State *L) { + int n = lua_gettop(L); + if (lua_type(L, 1) == LUA_TSTRING && *lua_tostring(L, 1) == '#') { + lua_pushinteger(L, n-1); + return 1; + } + else { + lua_Integer i = luaL_checkinteger(L, 1); + if (i < 0) i = n + i; + else if (i > n) i = n; + luaL_argcheck(L, 1 <= i, 1, "index out of range"); + return n - (int)i; + } +} + + +/* +** Continuation function for 'pcall' and 'xpcall'. Both functions +** already pushed a 'true' before doing the call, so in case of success +** 'finishpcall' only has to return everything in the stack minus +** 'extra' values (where 'extra' is exactly the number of items to be +** ignored). +*/ +static int finishpcall (lua_State *L, int status, lua_KContext extra) { + if (status != LUA_OK && status != LUA_YIELD) { /* error? */ + lua_pushboolean(L, 0); /* first result (false) */ + lua_pushvalue(L, -2); /* error message */ + return 2; /* return false, msg */ + } + else + return lua_gettop(L) - (int)extra; /* return all results */ +} + + +static int luaB_pcall (lua_State *L) { + int status; + luaL_checkany(L, 1); + lua_pushboolean(L, 1); /* first result if no errors */ + lua_insert(L, 1); /* put it in place */ + status = lua_pcallk(L, lua_gettop(L) - 2, LUA_MULTRET, 0, 0, finishpcall); + return finishpcall(L, status, 0); +} + + +/* +** Do a protected call with error handling. After 'lua_rotate', the +** stack will have ; so, the function passes +** 2 to 'finishpcall' to skip the 2 first values when returning results. +*/ +static int luaB_xpcall (lua_State *L) { + int status; + int n = lua_gettop(L); + luaL_checktype(L, 2, LUA_TFUNCTION); /* check error function */ + lua_pushboolean(L, 1); /* first result */ + lua_pushvalue(L, 1); /* function */ + lua_rotate(L, 3, 2); /* move them below function's arguments */ + status = lua_pcallk(L, n - 2, LUA_MULTRET, 2, 2, finishpcall); + return finishpcall(L, status, 2); +} + + +static int luaB_tostring (lua_State *L) { + luaL_checkany(L, 1); + luaL_tolstring(L, 1, NULL); + return 1; +} + + +static const luaL_Reg base_funcs[] = { + {"assert", luaB_assert}, + {"collectgarbage", luaB_collectgarbage}, + {"dofile", luaB_dofile}, + {"error", luaB_error}, + {"getmetatable", luaB_getmetatable}, + {"ipairs", luaB_ipairs}, + {"loadfile", luaB_loadfile}, + {"load", luaB_load}, + {"next", luaB_next}, + {"pairs", luaB_pairs}, + {"pcall", luaB_pcall}, + {"print", luaB_print}, + {"warn", luaB_warn}, + {"rawequal", luaB_rawequal}, + {"rawlen", luaB_rawlen}, + {"rawget", luaB_rawget}, + {"rawset", luaB_rawset}, + {"select", luaB_select}, + {"setmetatable", luaB_setmetatable}, + {"tonumber", luaB_tonumber}, + {"tostring", luaB_tostring}, + {"type", luaB_type}, + {"xpcall", luaB_xpcall}, + /* placeholders */ + {LUA_GNAME, NULL}, + {"_VERSION", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_base (lua_State *L) { + /* open lib into global table */ + lua_pushglobaltable(L); + luaL_setfuncs(L, base_funcs, 0); + /* set global _G */ + lua_pushvalue(L, -1); + lua_setfield(L, -2, LUA_GNAME); + /* set global _VERSION */ + lua_pushliteral(L, LUA_VERSION); + lua_setfield(L, -2, "_VERSION"); + return 1; +} + diff --git a/lua-5.4.0/src/lcode.c b/lua-5.4.0/src/lcode.c new file mode 100644 index 0000000..6f241c9 --- /dev/null +++ b/lua-5.4.0/src/lcode.c @@ -0,0 +1,1814 @@ +/* +** $Id: lcode.c $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#define lcode_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* Maximum number of registers in a Lua function (must fit in 8 bits) */ +#define MAXREGS 255 + + +#define hasjumps(e) ((e)->t != (e)->f) + + +static int codesJ (FuncState *fs, OpCode o, int sj, int k); + + + +/* semantic error */ +l_noret luaK_semerror (LexState *ls, const char *msg) { + ls->t.token = 0; /* remove "near " from final message */ + luaX_syntaxerror(ls, msg); +} + + +/* +** If expression is a numeric constant, fills 'v' with its value +** and returns 1. Otherwise, returns 0. +*/ +static int tonumeral (const expdesc *e, TValue *v) { + if (hasjumps(e)) + return 0; /* not a numeral */ + switch (e->k) { + case VKINT: + if (v) setivalue(v, e->u.ival); + return 1; + case VKFLT: + if (v) setfltvalue(v, e->u.nval); + return 1; + default: return 0; + } +} + + +/* +** Get the constant value from a constant expression +*/ +static TValue *const2val (FuncState *fs, const expdesc *e) { + lua_assert(e->k == VCONST); + return &fs->ls->dyd->actvar.arr[e->u.info].k; +} + + +/* +** If expression is a constant, fills 'v' with its value +** and returns 1. Otherwise, returns 0. +*/ +int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v) { + if (hasjumps(e)) + return 0; /* not a constant */ + switch (e->k) { + case VFALSE: + setbfvalue(v); + return 1; + case VTRUE: + setbtvalue(v); + return 1; + case VNIL: + setnilvalue(v); + return 1; + case VKSTR: { + setsvalue(fs->ls->L, v, e->u.strval); + return 1; + } + case VCONST: { + setobj(fs->ls->L, v, const2val(fs, e)); + return 1; + } + default: return tonumeral(e, v); + } +} + + +/* +** Return the previous instruction of the current code. If there +** may be a jump target between the current instruction and the +** previous one, return an invalid instruction (to avoid wrong +** optimizations). +*/ +static Instruction *previousinstruction (FuncState *fs) { + static const Instruction invalidinstruction = ~(Instruction)0; + if (fs->pc > fs->lasttarget) + return &fs->f->code[fs->pc - 1]; /* previous instruction */ + else + return cast(Instruction*, &invalidinstruction); +} + + +/* +** Create a OP_LOADNIL instruction, but try to optimize: if the previous +** instruction is also OP_LOADNIL and ranges are compatible, adjust +** range of previous instruction instead of emitting a new one. (For +** instance, 'local a; local b' will generate a single opcode.) +*/ +void luaK_nil (FuncState *fs, int from, int n) { + int l = from + n - 1; /* last register to set nil */ + Instruction *previous = previousinstruction(fs); + if (GET_OPCODE(*previous) == OP_LOADNIL) { /* previous is LOADNIL? */ + int pfrom = GETARG_A(*previous); /* get previous range */ + int pl = pfrom + GETARG_B(*previous); + if ((pfrom <= from && from <= pl + 1) || + (from <= pfrom && pfrom <= l + 1)) { /* can connect both? */ + if (pfrom < from) from = pfrom; /* from = min(from, pfrom) */ + if (pl > l) l = pl; /* l = max(l, pl) */ + SETARG_A(*previous, from); + SETARG_B(*previous, l - from); + return; + } /* else go through */ + } + luaK_codeABC(fs, OP_LOADNIL, from, n - 1, 0); /* else no optimization */ +} + + +/* +** Gets the destination address of a jump instruction. Used to traverse +** a list of jumps. +*/ +static int getjump (FuncState *fs, int pc) { + int offset = GETARG_sJ(fs->f->code[pc]); + if (offset == NO_JUMP) /* point to itself represents end of list */ + return NO_JUMP; /* end of list */ + else + return (pc+1)+offset; /* turn offset into absolute position */ +} + + +/* +** Fix jump instruction at position 'pc' to jump to 'dest'. +** (Jump addresses are relative in Lua) +*/ +static void fixjump (FuncState *fs, int pc, int dest) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest - (pc + 1); + lua_assert(dest != NO_JUMP); + if (!(-OFFSET_sJ <= offset && offset <= MAXARG_sJ - OFFSET_sJ)) + luaX_syntaxerror(fs->ls, "control structure too long"); + lua_assert(GET_OPCODE(*jmp) == OP_JMP); + SETARG_sJ(*jmp, offset); +} + + +/* +** Concatenate jump-list 'l2' into jump-list 'l1' +*/ +void luaK_concat (FuncState *fs, int *l1, int l2) { + if (l2 == NO_JUMP) return; /* nothing to concatenate? */ + else if (*l1 == NO_JUMP) /* no original list? */ + *l1 = l2; /* 'l1' points to 'l2' */ + else { + int list = *l1; + int next; + while ((next = getjump(fs, list)) != NO_JUMP) /* find last element */ + list = next; + fixjump(fs, list, l2); /* last element links to 'l2' */ + } +} + + +/* +** Create a jump instruction and return its position, so its destination +** can be fixed later (with 'fixjump'). +*/ +int luaK_jump (FuncState *fs) { + return codesJ(fs, OP_JMP, NO_JUMP, 0); +} + + +/* +** Code a 'return' instruction +*/ +void luaK_ret (FuncState *fs, int first, int nret) { + OpCode op; + switch (nret) { + case 0: op = OP_RETURN0; break; + case 1: op = OP_RETURN1; break; + default: op = OP_RETURN; break; + } + luaK_codeABC(fs, op, first, nret + 1, 0); +} + + +/* +** Code a "conditional jump", that is, a test or comparison opcode +** followed by a jump. Return jump position. +*/ +static int condjump (FuncState *fs, OpCode op, int A, int B, int C, int k) { + luaK_codeABCk(fs, op, A, B, C, k); + return luaK_jump(fs); +} + + +/* +** returns current 'pc' and marks it as a jump target (to avoid wrong +** optimizations with consecutive instructions not in the same basic block). +*/ +int luaK_getlabel (FuncState *fs) { + fs->lasttarget = fs->pc; + return fs->pc; +} + + +/* +** Returns the position of the instruction "controlling" a given +** jump (that is, its condition), or the jump itself if it is +** unconditional. +*/ +static Instruction *getjumpcontrol (FuncState *fs, int pc) { + Instruction *pi = &fs->f->code[pc]; + if (pc >= 1 && testTMode(GET_OPCODE(*(pi-1)))) + return pi-1; + else + return pi; +} + + +/* +** Patch destination register for a TESTSET instruction. +** If instruction in position 'node' is not a TESTSET, return 0 ("fails"). +** Otherwise, if 'reg' is not 'NO_REG', set it as the destination +** register. Otherwise, change instruction to a simple 'TEST' (produces +** no register value) +*/ +static int patchtestreg (FuncState *fs, int node, int reg) { + Instruction *i = getjumpcontrol(fs, node); + if (GET_OPCODE(*i) != OP_TESTSET) + return 0; /* cannot patch other instructions */ + if (reg != NO_REG && reg != GETARG_B(*i)) + SETARG_A(*i, reg); + else { + /* no register to put value or register already has the value; + change instruction to simple test */ + *i = CREATE_ABCk(OP_TEST, GETARG_B(*i), 0, 0, GETARG_k(*i)); + } + return 1; +} + + +/* +** Traverse a list of tests ensuring no one produces a value +*/ +static void removevalues (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) + patchtestreg(fs, list, NO_REG); +} + + +/* +** Traverse a list of tests, patching their destination address and +** registers: tests producing values jump to 'vtarget' (and put their +** values in 'reg'), other tests jump to 'dtarget'. +*/ +static void patchlistaux (FuncState *fs, int list, int vtarget, int reg, + int dtarget) { + while (list != NO_JUMP) { + int next = getjump(fs, list); + if (patchtestreg(fs, list, reg)) + fixjump(fs, list, vtarget); + else + fixjump(fs, list, dtarget); /* jump to default target */ + list = next; + } +} + + +/* +** Path all jumps in 'list' to jump to 'target'. +** (The assert means that we cannot fix a jump to a forward address +** because we only know addresses once code is generated.) +*/ +void luaK_patchlist (FuncState *fs, int list, int target) { + lua_assert(target <= fs->pc); + patchlistaux(fs, list, target, NO_REG, target); +} + + +void luaK_patchtohere (FuncState *fs, int list) { + int hr = luaK_getlabel(fs); /* mark "here" as a jump target */ + luaK_patchlist(fs, list, hr); +} + + +/* +** MAXimum number of successive Instructions WiTHout ABSolute line +** information. +*/ +#if !defined(MAXIWTHABS) +#define MAXIWTHABS 120 +#endif + + +/* limit for difference between lines in relative line info. */ +#define LIMLINEDIFF 0x80 + + +/* +** Save line info for a new instruction. If difference from last line +** does not fit in a byte, of after that many instructions, save a new +** absolute line info; (in that case, the special value 'ABSLINEINFO' +** in 'lineinfo' signals the existence of this absolute information.) +** Otherwise, store the difference from last line in 'lineinfo'. +*/ +static void savelineinfo (FuncState *fs, Proto *f, int line) { + int linedif = line - fs->previousline; + int pc = fs->pc - 1; /* last instruction coded */ + if (abs(linedif) >= LIMLINEDIFF || fs->iwthabs++ > MAXIWTHABS) { + luaM_growvector(fs->ls->L, f->abslineinfo, fs->nabslineinfo, + f->sizeabslineinfo, AbsLineInfo, MAX_INT, "lines"); + f->abslineinfo[fs->nabslineinfo].pc = pc; + f->abslineinfo[fs->nabslineinfo++].line = line; + linedif = ABSLINEINFO; /* signal that there is absolute information */ + fs->iwthabs = 0; /* restart counter */ + } + luaM_growvector(fs->ls->L, f->lineinfo, pc, f->sizelineinfo, ls_byte, + MAX_INT, "opcodes"); + f->lineinfo[pc] = linedif; + fs->previousline = line; /* last line saved */ +} + + +/* +** Remove line information from the last instruction. +** If line information for that instruction is absolute, set 'iwthabs' +** above its max to force the new (replacing) instruction to have +** absolute line info, too. +*/ +static void removelastlineinfo (FuncState *fs) { + Proto *f = fs->f; + int pc = fs->pc - 1; /* last instruction coded */ + if (f->lineinfo[pc] != ABSLINEINFO) { /* relative line info? */ + fs->previousline -= f->lineinfo[pc]; /* correct last line saved */ + fs->iwthabs--; /* undo previous increment */ + } + else { /* absolute line information */ + lua_assert(f->abslineinfo[fs->nabslineinfo - 1].pc == pc); + fs->nabslineinfo--; /* remove it */ + fs->iwthabs = MAXIWTHABS + 1; /* force next line info to be absolute */ + } +} + + +/* +** Remove the last instruction created, correcting line information +** accordingly. +*/ +static void removelastinstruction (FuncState *fs) { + removelastlineinfo(fs); + fs->pc--; +} + + +/* +** Emit instruction 'i', checking for array sizes and saving also its +** line information. Return 'i' position. +*/ +int luaK_code (FuncState *fs, Instruction i) { + Proto *f = fs->f; + /* put new instruction in code array */ + luaM_growvector(fs->ls->L, f->code, fs->pc, f->sizecode, Instruction, + MAX_INT, "opcodes"); + f->code[fs->pc++] = i; + savelineinfo(fs, f, fs->ls->lastline); + return fs->pc - 1; /* index of new instruction */ +} + + +/* +** Format and emit an 'iABC' instruction. (Assertions check consistency +** of parameters versus opcode.) +*/ +int luaK_codeABCk (FuncState *fs, OpCode o, int a, int b, int c, int k) { + lua_assert(getOpMode(o) == iABC); + lua_assert(a <= MAXARG_A && b <= MAXARG_B && + c <= MAXARG_C && (k & ~1) == 0); + return luaK_code(fs, CREATE_ABCk(o, a, b, c, k)); +} + + +/* +** Format and emit an 'iABx' instruction. +*/ +int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { + lua_assert(getOpMode(o) == iABx); + lua_assert(a <= MAXARG_A && bc <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, bc)); +} + + +/* +** Format and emit an 'iAsBx' instruction. +*/ +int luaK_codeAsBx (FuncState *fs, OpCode o, int a, int bc) { + unsigned int b = bc + OFFSET_sBx; + lua_assert(getOpMode(o) == iAsBx); + lua_assert(a <= MAXARG_A && b <= MAXARG_Bx); + return luaK_code(fs, CREATE_ABx(o, a, b)); +} + + +/* +** Format and emit an 'isJ' instruction. +*/ +static int codesJ (FuncState *fs, OpCode o, int sj, int k) { + unsigned int j = sj + OFFSET_sJ; + lua_assert(getOpMode(o) == isJ); + lua_assert(j <= MAXARG_sJ && (k & ~1) == 0); + return luaK_code(fs, CREATE_sJ(o, j, k)); +} + + +/* +** Emit an "extra argument" instruction (format 'iAx') +*/ +static int codeextraarg (FuncState *fs, int a) { + lua_assert(a <= MAXARG_Ax); + return luaK_code(fs, CREATE_Ax(OP_EXTRAARG, a)); +} + + +/* +** Emit a "load constant" instruction, using either 'OP_LOADK' +** (if constant index 'k' fits in 18 bits) or an 'OP_LOADKX' +** instruction with "extra argument". +*/ +static int luaK_codek (FuncState *fs, int reg, int k) { + if (k <= MAXARG_Bx) + return luaK_codeABx(fs, OP_LOADK, reg, k); + else { + int p = luaK_codeABx(fs, OP_LOADKX, reg, 0); + codeextraarg(fs, k); + return p; + } +} + + +/* +** Check register-stack level, keeping track of its maximum size +** in field 'maxstacksize' +*/ +void luaK_checkstack (FuncState *fs, int n) { + int newstack = fs->freereg + n; + if (newstack > fs->f->maxstacksize) { + if (newstack >= MAXREGS) + luaX_syntaxerror(fs->ls, + "function or expression needs too many registers"); + fs->f->maxstacksize = cast_byte(newstack); + } +} + + +/* +** Reserve 'n' registers in register stack +*/ +void luaK_reserveregs (FuncState *fs, int n) { + luaK_checkstack(fs, n); + fs->freereg += n; +} + + +/* +** Free register 'reg', if it is neither a constant index nor +** a local variable. +) +*/ +static void freereg (FuncState *fs, int reg) { + if (reg >= luaY_nvarstack(fs)) { + fs->freereg--; + lua_assert(reg == fs->freereg); + } +} + + +/* +** Free two registers in proper order +*/ +static void freeregs (FuncState *fs, int r1, int r2) { + if (r1 > r2) { + freereg(fs, r1); + freereg(fs, r2); + } + else { + freereg(fs, r2); + freereg(fs, r1); + } +} + + +/* +** Free register used by expression 'e' (if any) +*/ +static void freeexp (FuncState *fs, expdesc *e) { + if (e->k == VNONRELOC) + freereg(fs, e->u.info); +} + + +/* +** Free registers used by expressions 'e1' and 'e2' (if any) in proper +** order. +*/ +static void freeexps (FuncState *fs, expdesc *e1, expdesc *e2) { + int r1 = (e1->k == VNONRELOC) ? e1->u.info : -1; + int r2 = (e2->k == VNONRELOC) ? e2->u.info : -1; + freeregs(fs, r1, r2); +} + + +/* +** Add constant 'v' to prototype's list of constants (field 'k'). +** Use scanner's table to cache position of constants in constant list +** and try to reuse constants. Because some values should not be used +** as keys (nil cannot be a key, integer keys can collapse with float +** keys), the caller must provide a useful 'key' for indexing the cache. +*/ +static int addk (FuncState *fs, TValue *key, TValue *v) { + lua_State *L = fs->ls->L; + Proto *f = fs->f; + TValue *idx = luaH_set(L, fs->ls->h, key); /* index scanner table */ + int k, oldsize; + if (ttisinteger(idx)) { /* is there an index there? */ + k = cast_int(ivalue(idx)); + /* correct value? (warning: must distinguish floats from integers!) */ + if (k < fs->nk && ttypetag(&f->k[k]) == ttypetag(v) && + luaV_rawequalobj(&f->k[k], v)) + return k; /* reuse index */ + } + /* constant not found; create a new entry */ + oldsize = f->sizek; + k = fs->nk; + /* numerical value does not need GC barrier; + table has no metatable, so it does not need to invalidate cache */ + setivalue(idx, k); + luaM_growvector(L, f->k, k, f->sizek, TValue, MAXARG_Ax, "constants"); + while (oldsize < f->sizek) setnilvalue(&f->k[oldsize++]); + setobj(L, &f->k[k], v); + fs->nk++; + luaC_barrier(L, f, v); + return k; +} + + +/* +** Add a string to list of constants and return its index. +*/ +static int stringK (FuncState *fs, TString *s) { + TValue o; + setsvalue(fs->ls->L, &o, s); + return addk(fs, &o, &o); /* use string itself as key */ +} + + +/* +** Add an integer to list of constants and return its index. +** Integers use userdata as keys to avoid collision with floats with +** same value; conversion to 'void*' is used only for hashing, so there +** are no "precision" problems. +*/ +static int luaK_intK (FuncState *fs, lua_Integer n) { + TValue k, o; + setpvalue(&k, cast_voidp(cast_sizet(n))); + setivalue(&o, n); + return addk(fs, &k, &o); +} + +/* +** Add a float to list of constants and return its index. +*/ +static int luaK_numberK (FuncState *fs, lua_Number r) { + TValue o; + setfltvalue(&o, r); + return addk(fs, &o, &o); /* use number itself as key */ +} + + +/* +** Add a false to list of constants and return its index. +*/ +static int boolF (FuncState *fs) { + TValue o; + setbfvalue(&o); + return addk(fs, &o, &o); /* use boolean itself as key */ +} + + +/* +** Add a true to list of constants and return its index. +*/ +static int boolT (FuncState *fs) { + TValue o; + setbtvalue(&o); + return addk(fs, &o, &o); /* use boolean itself as key */ +} + + +/* +** Add nil to list of constants and return its index. +*/ +static int nilK (FuncState *fs) { + TValue k, v; + setnilvalue(&v); + /* cannot use nil as key; instead use table itself to represent nil */ + sethvalue(fs->ls->L, &k, fs->ls->h); + return addk(fs, &k, &v); +} + + +/* +** Check whether 'i' can be stored in an 'sC' operand. Equivalent to +** (0 <= int2sC(i) && int2sC(i) <= MAXARG_C) but without risk of +** overflows in the hidden addition inside 'int2sC'. +*/ +static int fitsC (lua_Integer i) { + return (l_castS2U(i) + OFFSET_sC <= cast_uint(MAXARG_C)); +} + + +/* +** Check whether 'i' can be stored in an 'sBx' operand. +*/ +static int fitsBx (lua_Integer i) { + return (-OFFSET_sBx <= i && i <= MAXARG_Bx - OFFSET_sBx); +} + + +void luaK_int (FuncState *fs, int reg, lua_Integer i) { + if (fitsBx(i)) + luaK_codeAsBx(fs, OP_LOADI, reg, cast_int(i)); + else + luaK_codek(fs, reg, luaK_intK(fs, i)); +} + + +static void luaK_float (FuncState *fs, int reg, lua_Number f) { + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Ieq) && fitsBx(fi)) + luaK_codeAsBx(fs, OP_LOADF, reg, cast_int(fi)); + else + luaK_codek(fs, reg, luaK_numberK(fs, f)); +} + + +/* +** Convert a constant in 'v' into an expression description 'e' +*/ +static void const2exp (TValue *v, expdesc *e) { + switch (ttypetag(v)) { + case LUA_VNUMINT: + e->k = VKINT; e->u.ival = ivalue(v); + break; + case LUA_VNUMFLT: + e->k = VKFLT; e->u.nval = fltvalue(v); + break; + case LUA_VFALSE: + e->k = VFALSE; + break; + case LUA_VTRUE: + e->k = VTRUE; + break; + case LUA_VNIL: + e->k = VNIL; + break; + case LUA_VSHRSTR: case LUA_VLNGSTR: + e->k = VKSTR; e->u.strval = tsvalue(v); + break; + default: lua_assert(0); + } +} + + +/* +** Fix an expression to return the number of results 'nresults'. +** 'e' must be a multi-ret expression (function call or vararg). +*/ +void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) { + Instruction *pc = &getinstruction(fs, e); + if (e->k == VCALL) /* expression is an open function call? */ + SETARG_C(*pc, nresults + 1); + else { + lua_assert(e->k == VVARARG); + SETARG_C(*pc, nresults + 1); + SETARG_A(*pc, fs->freereg); + luaK_reserveregs(fs, 1); + } +} + + +/* +** Convert a VKSTR to a VK +*/ +static void str2K (FuncState *fs, expdesc *e) { + lua_assert(e->k == VKSTR); + e->u.info = stringK(fs, e->u.strval); + e->k = VK; +} + + +/* +** Fix an expression to return one result. +** If expression is not a multi-ret expression (function call or +** vararg), it already returns one result, so nothing needs to be done. +** Function calls become VNONRELOC expressions (as its result comes +** fixed in the base register of the call), while vararg expressions +** become VRELOC (as OP_VARARG puts its results where it wants). +** (Calls are created returning one result, so that does not need +** to be fixed.) +*/ +void luaK_setoneret (FuncState *fs, expdesc *e) { + if (e->k == VCALL) { /* expression is an open function call? */ + /* already returns 1 value */ + lua_assert(GETARG_C(getinstruction(fs, e)) == 2); + e->k = VNONRELOC; /* result has fixed position */ + e->u.info = GETARG_A(getinstruction(fs, e)); + } + else if (e->k == VVARARG) { + SETARG_C(getinstruction(fs, e), 2); + e->k = VRELOC; /* can relocate its simple result */ + } +} + + +/* +** Ensure that expression 'e' is not a variable (nor a constant). +** (Expression still may have jump lists.) +*/ +void luaK_dischargevars (FuncState *fs, expdesc *e) { + switch (e->k) { + case VCONST: { + const2exp(const2val(fs, e), e); + break; + } + case VLOCAL: { /* already in a register */ + e->u.info = e->u.var.sidx; + e->k = VNONRELOC; /* becomes a non-relocatable value */ + break; + } + case VUPVAL: { /* move value to some (pending) register */ + e->u.info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->u.info, 0); + e->k = VRELOC; + break; + } + case VINDEXUP: { + e->u.info = luaK_codeABC(fs, OP_GETTABUP, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXI: { + freereg(fs, e->u.ind.t); + e->u.info = luaK_codeABC(fs, OP_GETI, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXSTR: { + freereg(fs, e->u.ind.t); + e->u.info = luaK_codeABC(fs, OP_GETFIELD, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VINDEXED: { + freeregs(fs, e->u.ind.t, e->u.ind.idx); + e->u.info = luaK_codeABC(fs, OP_GETTABLE, 0, e->u.ind.t, e->u.ind.idx); + e->k = VRELOC; + break; + } + case VVARARG: case VCALL: { + luaK_setoneret(fs, e); + break; + } + default: break; /* there is one value available (somewhere) */ + } +} + + +/* +** Ensures expression value is in register 'reg' (and therefore +** 'e' will become a non-relocatable expression). +** (Expression still may have jump lists.) +*/ +static void discharge2reg (FuncState *fs, expdesc *e, int reg) { + luaK_dischargevars(fs, e); + switch (e->k) { + case VNIL: { + luaK_nil(fs, reg, 1); + break; + } + case VFALSE: { + luaK_codeABC(fs, OP_LOADFALSE, reg, 0, 0); + break; + } + case VTRUE: { + luaK_codeABC(fs, OP_LOADTRUE, reg, 0, 0); + break; + } + case VKSTR: { + str2K(fs, e); + } /* FALLTHROUGH */ + case VK: { + luaK_codek(fs, reg, e->u.info); + break; + } + case VKFLT: { + luaK_float(fs, reg, e->u.nval); + break; + } + case VKINT: { + luaK_int(fs, reg, e->u.ival); + break; + } + case VRELOC: { + Instruction *pc = &getinstruction(fs, e); + SETARG_A(*pc, reg); /* instruction will put result in 'reg' */ + break; + } + case VNONRELOC: { + if (reg != e->u.info) + luaK_codeABC(fs, OP_MOVE, reg, e->u.info, 0); + break; + } + default: { + lua_assert(e->k == VJMP); + return; /* nothing to do... */ + } + } + e->u.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensures expression value is in any register. +** (Expression still may have jump lists.) +*/ +static void discharge2anyreg (FuncState *fs, expdesc *e) { + if (e->k != VNONRELOC) { /* no fixed register yet? */ + luaK_reserveregs(fs, 1); /* get a register */ + discharge2reg(fs, e, fs->freereg-1); /* put value there */ + } +} + + +static int code_loadbool (FuncState *fs, int A, OpCode op) { + luaK_getlabel(fs); /* those instructions may be jump targets */ + return luaK_codeABC(fs, op, A, 0, 0); +} + + +/* +** check whether list has any jump that do not produce a value +** or produce an inverted value +*/ +static int need_value (FuncState *fs, int list) { + for (; list != NO_JUMP; list = getjump(fs, list)) { + Instruction i = *getjumpcontrol(fs, list); + if (GET_OPCODE(i) != OP_TESTSET) return 1; + } + return 0; /* not found */ +} + + +/* +** Ensures final expression result (which includes results from its +** jump lists) is in register 'reg'. +** If expression has jumps, need to patch these jumps either to +** its final position or to "load" instructions (for those tests +** that do not produce values). +*/ +static void exp2reg (FuncState *fs, expdesc *e, int reg) { + discharge2reg(fs, e, reg); + if (e->k == VJMP) /* expression itself is a test? */ + luaK_concat(fs, &e->t, e->u.info); /* put this jump in 't' list */ + if (hasjumps(e)) { + int final; /* position after whole expression */ + int p_f = NO_JUMP; /* position of an eventual LOAD false */ + int p_t = NO_JUMP; /* position of an eventual LOAD true */ + if (need_value(fs, e->t) || need_value(fs, e->f)) { + int fj = (e->k == VJMP) ? NO_JUMP : luaK_jump(fs); + p_f = code_loadbool(fs, reg, OP_LFALSESKIP); /* skip next inst. */ + p_t = code_loadbool(fs, reg, OP_LOADTRUE); + /* jump around these booleans if 'e' is not a test */ + luaK_patchtohere(fs, fj); + } + final = luaK_getlabel(fs); + patchlistaux(fs, e->f, final, reg, p_f); + patchlistaux(fs, e->t, final, reg, p_t); + } + e->f = e->t = NO_JUMP; + e->u.info = reg; + e->k = VNONRELOC; +} + + +/* +** Ensures final expression result is in next available register. +*/ +void luaK_exp2nextreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + freeexp(fs, e); + luaK_reserveregs(fs, 1); + exp2reg(fs, e, fs->freereg - 1); +} + + +/* +** Ensures final expression result is in some (any) register +** and return that register. +*/ +int luaK_exp2anyreg (FuncState *fs, expdesc *e) { + luaK_dischargevars(fs, e); + if (e->k == VNONRELOC) { /* expression already has a register? */ + if (!hasjumps(e)) /* no jumps? */ + return e->u.info; /* result is already in a register */ + if (e->u.info >= luaY_nvarstack(fs)) { /* reg. is not a local? */ + exp2reg(fs, e, e->u.info); /* put final result in it */ + return e->u.info; + } + } + luaK_exp2nextreg(fs, e); /* otherwise, use next available register */ + return e->u.info; +} + + +/* +** Ensures final expression result is either in a register +** or in an upvalue. +*/ +void luaK_exp2anyregup (FuncState *fs, expdesc *e) { + if (e->k != VUPVAL || hasjumps(e)) + luaK_exp2anyreg(fs, e); +} + + +/* +** Ensures final expression result is either in a register +** or it is a constant. +*/ +void luaK_exp2val (FuncState *fs, expdesc *e) { + if (hasjumps(e)) + luaK_exp2anyreg(fs, e); + else + luaK_dischargevars(fs, e); +} + + +/* +** Try to make 'e' a K expression with an index in the range of R/K +** indices. Return true iff succeeded. +*/ +static int luaK_exp2K (FuncState *fs, expdesc *e) { + if (!hasjumps(e)) { + int info; + switch (e->k) { /* move constants to 'k' */ + case VTRUE: info = boolT(fs); break; + case VFALSE: info = boolF(fs); break; + case VNIL: info = nilK(fs); break; + case VKINT: info = luaK_intK(fs, e->u.ival); break; + case VKFLT: info = luaK_numberK(fs, e->u.nval); break; + case VKSTR: info = stringK(fs, e->u.strval); break; + case VK: info = e->u.info; break; + default: return 0; /* not a constant */ + } + if (info <= MAXINDEXRK) { /* does constant fit in 'argC'? */ + e->k = VK; /* make expression a 'K' expression */ + e->u.info = info; + return 1; + } + } + /* else, expression doesn't fit; leave it unchanged */ + return 0; +} + + +/* +** Ensures final expression result is in a valid R/K index +** (that is, it is either in a register or in 'k' with an index +** in the range of R/K indices). +** Returns 1 iff expression is K. +*/ +int luaK_exp2RK (FuncState *fs, expdesc *e) { + if (luaK_exp2K(fs, e)) + return 1; + else { /* not a constant in the right range: put it in a register */ + luaK_exp2anyreg(fs, e); + return 0; + } +} + + +static void codeABRK (FuncState *fs, OpCode o, int a, int b, + expdesc *ec) { + int k = luaK_exp2RK(fs, ec); + luaK_codeABCk(fs, o, a, b, ec->u.info, k); +} + + +/* +** Generate code to store result of expression 'ex' into variable 'var'. +*/ +void luaK_storevar (FuncState *fs, expdesc *var, expdesc *ex) { + switch (var->k) { + case VLOCAL: { + freeexp(fs, ex); + exp2reg(fs, ex, var->u.var.sidx); /* compute 'ex' into proper place */ + return; + } + case VUPVAL: { + int e = luaK_exp2anyreg(fs, ex); + luaK_codeABC(fs, OP_SETUPVAL, e, var->u.info, 0); + break; + } + case VINDEXUP: { + codeABRK(fs, OP_SETTABUP, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXI: { + codeABRK(fs, OP_SETI, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXSTR: { + codeABRK(fs, OP_SETFIELD, var->u.ind.t, var->u.ind.idx, ex); + break; + } + case VINDEXED: { + codeABRK(fs, OP_SETTABLE, var->u.ind.t, var->u.ind.idx, ex); + break; + } + default: lua_assert(0); /* invalid var kind to store */ + } + freeexp(fs, ex); +} + + +/* +** Emit SELF instruction (convert expression 'e' into 'e:key(e,'). +*/ +void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { + int ereg; + luaK_exp2anyreg(fs, e); + ereg = e->u.info; /* register where 'e' was placed */ + freeexp(fs, e); + e->u.info = fs->freereg; /* base register for op_self */ + e->k = VNONRELOC; /* self expression has a fixed register */ + luaK_reserveregs(fs, 2); /* function and 'self' produced by op_self */ + codeABRK(fs, OP_SELF, e->u.info, ereg, key); + freeexp(fs, key); +} + + +/* +** Negate condition 'e' (where 'e' is a comparison). +*/ +static void negatecondition (FuncState *fs, expdesc *e) { + Instruction *pc = getjumpcontrol(fs, e->u.info); + lua_assert(testTMode(GET_OPCODE(*pc)) && GET_OPCODE(*pc) != OP_TESTSET && + GET_OPCODE(*pc) != OP_TEST); + SETARG_k(*pc, (GETARG_k(*pc) ^ 1)); +} + + +/* +** Emit instruction to jump if 'e' is 'cond' (that is, if 'cond' +** is true, code will jump if 'e' is true.) Return jump position. +** Optimize when 'e' is 'not' something, inverting the condition +** and removing the 'not'. +*/ +static int jumponcond (FuncState *fs, expdesc *e, int cond) { + if (e->k == VRELOC) { + Instruction ie = getinstruction(fs, e); + if (GET_OPCODE(ie) == OP_NOT) { + removelastinstruction(fs); /* remove previous OP_NOT */ + return condjump(fs, OP_TEST, GETARG_B(ie), 0, 0, !cond); + } + /* else go through */ + } + discharge2anyreg(fs, e); + freeexp(fs, e); + return condjump(fs, OP_TESTSET, NO_REG, e->u.info, 0, cond); +} + + +/* +** Emit code to go through if 'e' is true, jump otherwise. +*/ +void luaK_goiftrue (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { /* condition? */ + negatecondition(fs, e); /* jump when it is false */ + pc = e->u.info; /* save jump position */ + break; + } + case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: { + pc = NO_JUMP; /* always true; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 0); /* jump when false */ + break; + } + } + luaK_concat(fs, &e->f, pc); /* insert new jump in false list */ + luaK_patchtohere(fs, e->t); /* true list jumps to here (to go through) */ + e->t = NO_JUMP; +} + + +/* +** Emit code to go through if 'e' is false, jump otherwise. +*/ +void luaK_goiffalse (FuncState *fs, expdesc *e) { + int pc; /* pc of new jump */ + luaK_dischargevars(fs, e); + switch (e->k) { + case VJMP: { + pc = e->u.info; /* already jump if true */ + break; + } + case VNIL: case VFALSE: { + pc = NO_JUMP; /* always false; do nothing */ + break; + } + default: { + pc = jumponcond(fs, e, 1); /* jump if true */ + break; + } + } + luaK_concat(fs, &e->t, pc); /* insert new jump in 't' list */ + luaK_patchtohere(fs, e->f); /* false list jumps to here (to go through) */ + e->f = NO_JUMP; +} + + +/* +** Code 'not e', doing constant folding. +*/ +static void codenot (FuncState *fs, expdesc *e) { + switch (e->k) { + case VNIL: case VFALSE: { + e->k = VTRUE; /* true == not nil == not false */ + break; + } + case VK: case VKFLT: case VKINT: case VKSTR: case VTRUE: { + e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */ + break; + } + case VJMP: { + negatecondition(fs, e); + break; + } + case VRELOC: + case VNONRELOC: { + discharge2anyreg(fs, e); + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0); + e->k = VRELOC; + break; + } + default: lua_assert(0); /* cannot happen */ + } + /* interchange true and false lists */ + { int temp = e->f; e->f = e->t; e->t = temp; } + removevalues(fs, e->f); /* values are useless when negated */ + removevalues(fs, e->t); +} + + +/* +** Check whether expression 'e' is a small literal string +*/ +static int isKstr (FuncState *fs, expdesc *e) { + return (e->k == VK && !hasjumps(e) && e->u.info <= MAXARG_B && + ttisshrstring(&fs->f->k[e->u.info])); +} + +/* +** Check whether expression 'e' is a literal integer. +*/ +int luaK_isKint (expdesc *e) { + return (e->k == VKINT && !hasjumps(e)); +} + + +/* +** Check whether expression 'e' is a literal integer in +** proper range to fit in register C +*/ +static int isCint (expdesc *e) { + return luaK_isKint(e) && (l_castS2U(e->u.ival) <= l_castS2U(MAXARG_C)); +} + + +/* +** Check whether expression 'e' is a literal integer in +** proper range to fit in register sC +*/ +static int isSCint (expdesc *e) { + return luaK_isKint(e) && fitsC(e->u.ival); +} + + +/* +** Check whether expression 'e' is a literal integer or float in +** proper range to fit in a register (sB or sC). +*/ +static int isSCnumber (expdesc *e, int *pi, int *isfloat) { + lua_Integer i; + if (e->k == VKINT) + i = e->u.ival; + else if (e->k == VKFLT && luaV_flttointeger(e->u.nval, &i, F2Ieq)) + *isfloat = 1; + else + return 0; /* not a number */ + if (!hasjumps(e) && fitsC(i)) { + *pi = int2sC(cast_int(i)); + return 1; + } + else + return 0; +} + + +/* +** Create expression 't[k]'. 't' must have its final result already in a +** register or upvalue. Upvalues can only be indexed by literal strings. +** Keys can be literal strings in the constant table or arbitrary +** values in registers. +*/ +void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { + if (k->k == VKSTR) + str2K(fs, k); + lua_assert(!hasjumps(t) && + (t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL)); + if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non 'Kstr'? */ + luaK_exp2anyreg(fs, t); /* put it in a register */ + if (t->k == VUPVAL) { + t->u.ind.t = t->u.info; /* upvalue index */ + t->u.ind.idx = k->u.info; /* literal string */ + t->k = VINDEXUP; + } + else { + /* register index of the table */ + t->u.ind.t = (t->k == VLOCAL) ? t->u.var.sidx: t->u.info; + if (isKstr(fs, k)) { + t->u.ind.idx = k->u.info; /* literal string */ + t->k = VINDEXSTR; + } + else if (isCint(k)) { + t->u.ind.idx = cast_int(k->u.ival); /* int. constant in proper range */ + t->k = VINDEXI; + } + else { + t->u.ind.idx = luaK_exp2anyreg(fs, k); /* register */ + t->k = VINDEXED; + } + } +} + + +/* +** Return false if folding can raise an error. +** Bitwise operations need operands convertible to integers; division +** operations cannot have 0 as divisor. +*/ +static int validop (int op, TValue *v1, TValue *v2) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: case LUA_OPBNOT: { /* conversion errors */ + lua_Integer i; + return (tointegerns(v1, &i) && tointegerns(v2, &i)); + } + case LUA_OPDIV: case LUA_OPIDIV: case LUA_OPMOD: /* division by 0 */ + return (nvalue(v2) != 0); + default: return 1; /* everything else is valid */ + } +} + + +/* +** Try to "constant-fold" an operation; return 1 iff successful. +** (In this case, 'e1' has the final result.) +*/ +static int constfolding (FuncState *fs, int op, expdesc *e1, + const expdesc *e2) { + TValue v1, v2, res; + if (!tonumeral(e1, &v1) || !tonumeral(e2, &v2) || !validop(op, &v1, &v2)) + return 0; /* non-numeric operands or not safe to fold */ + luaO_rawarith(fs->ls->L, op, &v1, &v2, &res); /* does operation */ + if (ttisinteger(&res)) { + e1->k = VKINT; + e1->u.ival = ivalue(&res); + } + else { /* folds neither NaN nor 0.0 (to avoid problems with -0.0) */ + lua_Number n = fltvalue(&res); + if (luai_numisnan(n) || n == 0) + return 0; + e1->k = VKFLT; + e1->u.nval = n; + } + return 1; +} + + +/* +** Emit code for unary expressions that "produce values" +** (everything but 'not'). +** Expression to produce final result will be encoded in 'e'. +*/ +static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) { + int r = luaK_exp2anyreg(fs, e); /* opcodes operate only on registers */ + freeexp(fs, e); + e->u.info = luaK_codeABC(fs, op, 0, r, 0); /* generate opcode */ + e->k = VRELOC; /* all those operations are relocatable */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for binary expressions that "produce values" +** (everything but logical operators 'and'/'or' and comparison +** operators). +** Expression to produce final result will be encoded in 'e1'. +*/ +static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, + OpCode op, int v2, int flip, int line, + OpCode mmop, TMS event) { + int v1 = luaK_exp2anyreg(fs, e1); + int pc = luaK_codeABCk(fs, op, 0, v1, v2, 0); + freeexps(fs, e1, e2); + e1->u.info = pc; + e1->k = VRELOC; /* all those operations are relocatable */ + luaK_fixline(fs, line); + luaK_codeABCk(fs, mmop, v1, v2, event, flip); /* to call metamethod */ + luaK_fixline(fs, line); +} + + +/* +** Emit code for binary expressions that "produce values" over +** two registers. +*/ +static void codebinexpval (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int line) { + int v2 = luaK_exp2anyreg(fs, e2); /* both operands are in registers */ + lua_assert(OP_ADD <= op && op <= OP_SHR); + finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, + cast(TMS, (op - OP_ADD) + TM_ADD)); +} + + +/* +** Code binary operators with immediate operands. +*/ +static void codebini (FuncState *fs, OpCode op, + expdesc *e1, expdesc *e2, int flip, int line, + TMS event) { + int v2 = int2sC(cast_int(e2->u.ival)); /* immediate operand */ + lua_assert(e2->k == VKINT); + finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINI, event); +} + + +/* Try to code a binary operator negating its second operand. +** For the metamethod, 2nd operand must keep its original value. +*/ +static int finishbinexpneg (FuncState *fs, expdesc *e1, expdesc *e2, + OpCode op, int line, TMS event) { + if (!luaK_isKint(e2)) + return 0; /* not an integer constant */ + else { + lua_Integer i2 = e2->u.ival; + if (!(fitsC(i2) && fitsC(-i2))) + return 0; /* not in the proper range */ + else { /* operating a small integer constant */ + int v2 = cast_int(i2); + finishbinexpval(fs, e1, e2, op, int2sC(-v2), 0, line, OP_MMBINI, event); + /* correct metamethod argument */ + SETARG_B(fs->f->code[fs->pc - 1], int2sC(v2)); + return 1; /* successfully coded */ + } + } +} + + +static void swapexps (expdesc *e1, expdesc *e2) { + expdesc temp = *e1; *e1 = *e2; *e2 = temp; /* swap 'e1' and 'e2' */ +} + + +/* +** Code arithmetic operators ('+', '-', ...). If second operand is a +** constant in the proper range, use variant opcodes with K operands. +*/ +static void codearith (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int flip, int line) { + TMS event = cast(TMS, opr + TM_ADD); + if (tonumeral(e2, NULL) && luaK_exp2K(fs, e2)) { /* K operand? */ + int v2 = e2->u.info; /* K index */ + OpCode op = cast(OpCode, opr + OP_ADDK); + finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event); + } + else { /* 'e2' is neither an immediate nor a K operand */ + OpCode op = cast(OpCode, opr + OP_ADD); + if (flip) + swapexps(e1, e2); /* back to original order */ + codebinexpval(fs, op, e1, e2, line); /* use standard operators */ + } +} + + +/* +** Code commutative operators ('+', '*'). If first operand is a +** numeric constant, change order of operands to try to use an +** immediate or K operator. +*/ +static void codecommutative (FuncState *fs, BinOpr op, + expdesc *e1, expdesc *e2, int line) { + int flip = 0; + if (tonumeral(e1, NULL)) { /* is first operand a numeric constant? */ + swapexps(e1, e2); /* change order */ + flip = 1; + } + if (op == OPR_ADD && isSCint(e2)) /* immediate operand? */ + codebini(fs, cast(OpCode, OP_ADDI), e1, e2, flip, line, TM_ADD); + else + codearith(fs, op, e1, e2, flip, line); +} + + +/* +** Code bitwise operations; they are all associative, so the function +** tries to put an integer constant as the 2nd operand (a K operand). +*/ +static void codebitwise (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { + int flip = 0; + int v2; + OpCode op; + if (e1->k == VKINT && luaK_exp2RK(fs, e1)) { + swapexps(e1, e2); /* 'e2' will be the constant operand */ + flip = 1; + } + else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */ + op = cast(OpCode, opr + OP_ADD); + codebinexpval(fs, op, e1, e2, line); /* all-register opcodes */ + return; + } + v2 = e2->u.info; /* index in K array */ + op = cast(OpCode, opr + OP_ADDK); + lua_assert(ttisinteger(&fs->f->k[v2])); + finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, + cast(TMS, opr + TM_ADD)); +} + + +/* +** Emit code for order comparisons. When using an immediate operand, +** 'isfloat' tells whether the original value was a float. +*/ +static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { + int r1, r2; + int im; + int isfloat = 0; + if (isSCnumber(e2, &im, &isfloat)) { + /* use immediate operand */ + r1 = luaK_exp2anyreg(fs, e1); + r2 = im; + op = cast(OpCode, (op - OP_LT) + OP_LTI); + } + else if (isSCnumber(e1, &im, &isfloat)) { + /* transform (A < B) to (B > A) and (A <= B) to (B >= A) */ + r1 = luaK_exp2anyreg(fs, e2); + r2 = im; + op = (op == OP_LT) ? OP_GTI : OP_GEI; + } + else { /* regular case, compare two registers */ + r1 = luaK_exp2anyreg(fs, e1); + r2 = luaK_exp2anyreg(fs, e2); + } + freeexps(fs, e1, e2); + e1->u.info = condjump(fs, op, r1, r2, isfloat, 1); + e1->k = VJMP; +} + + +/* +** Emit code for equality comparisons ('==', '~='). +** 'e1' was already put as RK by 'luaK_infix'. +*/ +static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { + int r1, r2; + int im; + int isfloat = 0; /* not needed here, but kept for symmetry */ + OpCode op; + if (e1->k != VNONRELOC) { + lua_assert(e1->k == VK || e1->k == VKINT || e1->k == VKFLT); + swapexps(e1, e2); + } + r1 = luaK_exp2anyreg(fs, e1); /* 1st expression must be in register */ + if (isSCnumber(e2, &im, &isfloat)) { + op = OP_EQI; + r2 = im; /* immediate operand */ + } + else if (luaK_exp2RK(fs, e2)) { /* 1st expression is constant? */ + op = OP_EQK; + r2 = e2->u.info; /* constant index */ + } + else { + op = OP_EQ; /* will compare two registers */ + r2 = luaK_exp2anyreg(fs, e2); + } + freeexps(fs, e1, e2); + e1->u.info = condjump(fs, op, r1, r2, isfloat, (opr == OPR_EQ)); + e1->k = VJMP; +} + + +/* +** Apply prefix operation 'op' to expression 'e'. +*/ +void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) { + static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP}; + luaK_dischargevars(fs, e); + switch (op) { + case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */ + if (constfolding(fs, op + LUA_OPUNM, e, &ef)) + break; + /* else */ /* FALLTHROUGH */ + case OPR_LEN: + codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line); + break; + case OPR_NOT: codenot(fs, e); break; + default: lua_assert(0); + } +} + + +/* +** Process 1st operand 'v' of binary operation 'op' before reading +** 2nd operand. +*/ +void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { + luaK_dischargevars(fs, v); + switch (op) { + case OPR_AND: { + luaK_goiftrue(fs, v); /* go ahead only if 'v' is true */ + break; + } + case OPR_OR: { + luaK_goiffalse(fs, v); /* go ahead only if 'v' is false */ + break; + } + case OPR_CONCAT: { + luaK_exp2nextreg(fs, v); /* operand must be on the stack */ + break; + } + case OPR_ADD: case OPR_SUB: + case OPR_MUL: case OPR_DIV: case OPR_IDIV: + case OPR_MOD: case OPR_POW: + case OPR_BAND: case OPR_BOR: case OPR_BXOR: + case OPR_SHL: case OPR_SHR: { + if (!tonumeral(v, NULL)) + luaK_exp2anyreg(fs, v); + /* else keep numeral, which may be folded with 2nd operand */ + break; + } + case OPR_EQ: case OPR_NE: { + if (!tonumeral(v, NULL)) + luaK_exp2RK(fs, v); + /* else keep numeral, which may be an immediate operand */ + break; + } + case OPR_LT: case OPR_LE: + case OPR_GT: case OPR_GE: { + int dummy, dummy2; + if (!isSCnumber(v, &dummy, &dummy2)) + luaK_exp2anyreg(fs, v); + /* else keep numeral, which may be an immediate operand */ + break; + } + default: lua_assert(0); + } +} + +/* +** Create code for '(e1 .. e2)'. +** For '(e1 .. e2.1 .. e2.2)' (which is '(e1 .. (e2.1 .. e2.2))', +** because concatenation is right associative), merge both CONCATs. +*/ +static void codeconcat (FuncState *fs, expdesc *e1, expdesc *e2, int line) { + Instruction *ie2 = previousinstruction(fs); + if (GET_OPCODE(*ie2) == OP_CONCAT) { /* is 'e2' a concatenation? */ + int n = GETARG_B(*ie2); /* # of elements concatenated in 'e2' */ + lua_assert(e1->u.info + 1 == GETARG_A(*ie2)); + freeexp(fs, e2); + SETARG_A(*ie2, e1->u.info); /* correct first element ('e1') */ + SETARG_B(*ie2, n + 1); /* will concatenate one more element */ + } + else { /* 'e2' is not a concatenation */ + luaK_codeABC(fs, OP_CONCAT, e1->u.info, 2, 0); /* new concat opcode */ + freeexp(fs, e2); + luaK_fixline(fs, line); + } +} + + +/* +** Finalize code for binary operation, after reading 2nd operand. +*/ +void luaK_posfix (FuncState *fs, BinOpr opr, + expdesc *e1, expdesc *e2, int line) { + luaK_dischargevars(fs, e2); + if (foldbinop(opr) && constfolding(fs, opr + LUA_OPADD, e1, e2)) + return; /* done by folding */ + switch (opr) { + case OPR_AND: { + lua_assert(e1->t == NO_JUMP); /* list closed by 'luaK_infix' */ + luaK_concat(fs, &e2->f, e1->f); + *e1 = *e2; + break; + } + case OPR_OR: { + lua_assert(e1->f == NO_JUMP); /* list closed by 'luaK_infix' */ + luaK_concat(fs, &e2->t, e1->t); + *e1 = *e2; + break; + } + case OPR_CONCAT: { /* e1 .. e2 */ + luaK_exp2nextreg(fs, e2); + codeconcat(fs, e1, e2, line); + break; + } + case OPR_ADD: case OPR_MUL: { + codecommutative(fs, opr, e1, e2, line); + break; + } + case OPR_SUB: { + if (finishbinexpneg(fs, e1, e2, OP_ADDI, line, TM_SUB)) + break; /* coded as (r1 + -I) */ + /* ELSE */ + } /* FALLTHROUGH */ + case OPR_DIV: case OPR_IDIV: case OPR_MOD: case OPR_POW: { + codearith(fs, opr, e1, e2, 0, line); + break; + } + case OPR_BAND: case OPR_BOR: case OPR_BXOR: { + codebitwise(fs, opr, e1, e2, line); + break; + } + case OPR_SHL: { + if (isSCint(e1)) { + swapexps(e1, e2); + codebini(fs, OP_SHLI, e1, e2, 1, line, TM_SHL); /* I << r2 */ + } + else if (finishbinexpneg(fs, e1, e2, OP_SHRI, line, TM_SHL)) { + /* coded as (r1 >> -I) */; + } + else /* regular case (two registers) */ + codebinexpval(fs, OP_SHL, e1, e2, line); + break; + } + case OPR_SHR: { + if (isSCint(e2)) + codebini(fs, OP_SHRI, e1, e2, 0, line, TM_SHR); /* r1 >> I */ + else /* regular case (two registers) */ + codebinexpval(fs, OP_SHR, e1, e2, line); + break; + } + case OPR_EQ: case OPR_NE: { + codeeq(fs, opr, e1, e2); + break; + } + case OPR_LT: case OPR_LE: { + OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ); + codeorder(fs, op, e1, e2); + break; + } + case OPR_GT: case OPR_GE: { + /* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */ + OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ); + swapexps(e1, e2); + codeorder(fs, op, e1, e2); + break; + } + default: lua_assert(0); + } +} + + +/* +** Change line information associated with current position, by removing +** previous info and adding it again with new line. +*/ +void luaK_fixline (FuncState *fs, int line) { + removelastlineinfo(fs); + savelineinfo(fs, fs->f, line); +} + + +void luaK_settablesize (FuncState *fs, int pc, int ra, int asize, int hsize) { + Instruction *inst = &fs->f->code[pc]; + int rb = (hsize != 0) ? luaO_ceillog2(hsize) + 1 : 0; /* hash size */ + int extra = asize / (MAXARG_C + 1); /* higher bits of array size */ + int rc = asize % (MAXARG_C + 1); /* lower bits of array size */ + int k = (extra > 0); /* true iff needs extra argument */ + *inst = CREATE_ABCk(OP_NEWTABLE, ra, rb, rc, k); + *(inst + 1) = CREATE_Ax(OP_EXTRAARG, extra); +} + + +/* +** Emit a SETLIST instruction. +** 'base' is register that keeps table; +** 'nelems' is #table plus those to be stored now; +** 'tostore' is number of values (in registers 'base + 1',...) to add to +** table (or LUA_MULTRET to add up to stack top). +*/ +void luaK_setlist (FuncState *fs, int base, int nelems, int tostore) { + lua_assert(tostore != 0 && tostore <= LFIELDS_PER_FLUSH); + if (tostore == LUA_MULTRET) + tostore = 0; + if (nelems <= MAXARG_C) + luaK_codeABC(fs, OP_SETLIST, base, tostore, nelems); + else { + int extra = nelems / (MAXARG_C + 1); + nelems %= (MAXARG_C + 1); + luaK_codeABCk(fs, OP_SETLIST, base, tostore, nelems, 1); + codeextraarg(fs, extra); + } + fs->freereg = base + 1; /* free registers with list values */ +} + + +/* +** return the final target of a jump (skipping jumps to jumps) +*/ +static int finaltarget (Instruction *code, int i) { + int count; + for (count = 0; count < 100; count++) { /* avoid infinite loops */ + Instruction pc = code[i]; + if (GET_OPCODE(pc) != OP_JMP) + break; + else + i += GETARG_sJ(pc) + 1; + } + return i; +} + + +/* +** Do a final pass over the code of a function, doing small peephole +** optimizations and adjustments. +*/ +void luaK_finish (FuncState *fs) { + int i; + Proto *p = fs->f; + for (i = 0; i < fs->pc; i++) { + Instruction *pc = &p->code[i]; + lua_assert(i == 0 || isOT(*(pc - 1)) == isIT(*pc)); + switch (GET_OPCODE(*pc)) { + case OP_RETURN0: case OP_RETURN1: { + if (!(fs->needclose || p->is_vararg)) + break; /* no extra work */ + /* else use OP_RETURN to do the extra work */ + SET_OPCODE(*pc, OP_RETURN); + } /* FALLTHROUGH */ + case OP_RETURN: case OP_TAILCALL: { + if (fs->needclose) + SETARG_k(*pc, 1); /* signal that it needs to close */ + if (p->is_vararg) + SETARG_C(*pc, p->numparams + 1); /* signal that it is vararg */ + break; + } + case OP_JMP: { + int target = finaltarget(p->code, i); + fixjump(fs, i, target); + break; + } + default: break; + } + } +} diff --git a/lua-5.4.0/src/lcode.h b/lua-5.4.0/src/lcode.h new file mode 100644 index 0000000..3265824 --- /dev/null +++ b/lua-5.4.0/src/lcode.h @@ -0,0 +1,104 @@ +/* +** $Id: lcode.h $ +** Code generator for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lcode_h +#define lcode_h + +#include "llex.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" + + +/* +** Marks the end of a patch list. It is an invalid value both as an absolute +** address, and as a list link (would link an element to itself). +*/ +#define NO_JUMP (-1) + + +/* +** grep "ORDER OPR" if you change these enums (ORDER OP) +*/ +typedef enum BinOpr { + /* arithmetic operators */ + OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW, + OPR_DIV, OPR_IDIV, + /* bitwise operators */ + OPR_BAND, OPR_BOR, OPR_BXOR, + OPR_SHL, OPR_SHR, + /* string operator */ + OPR_CONCAT, + /* comparison operators */ + OPR_EQ, OPR_LT, OPR_LE, + OPR_NE, OPR_GT, OPR_GE, + /* logical operators */ + OPR_AND, OPR_OR, + OPR_NOBINOPR +} BinOpr; + + +/* true if operation is foldable (that is, it is arithmetic or bitwise) */ +#define foldbinop(op) ((op) <= OPR_SHR) + + +#define luaK_codeABC(fs,o,a,b,c) luaK_codeABCk(fs,o,a,b,c,0) + + +typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr; + + +/* get (pointer to) instruction of given 'expdesc' */ +#define getinstruction(fs,e) ((fs)->f->code[(e)->u.info]) + + +#define luaK_setmultret(fs,e) luaK_setreturns(fs, e, LUA_MULTRET) + +#define luaK_jumpto(fs,t) luaK_patchlist(fs, luaK_jump(fs), t) + +LUAI_FUNC int luaK_code (FuncState *fs, Instruction i); +LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); +LUAI_FUNC int luaK_codeAsBx (FuncState *fs, OpCode o, int A, int Bx); +LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A, + int B, int C, int k); +LUAI_FUNC int luaK_isKint (expdesc *e); +LUAI_FUNC int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v); +LUAI_FUNC void luaK_fixline (FuncState *fs, int line); +LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n); +LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n); +LUAI_FUNC void luaK_checkstack (FuncState *fs, int n); +LUAI_FUNC void luaK_int (FuncState *fs, int reg, lua_Integer n); +LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key); +LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); +LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e); +LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); +LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults); +LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e); +LUAI_FUNC int luaK_jump (FuncState *fs); +LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret); +LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target); +LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list); +LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2); +LUAI_FUNC int luaK_getlabel (FuncState *fs); +LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line); +LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); +LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, + expdesc *v2, int line); +LUAI_FUNC void luaK_settablesize (FuncState *fs, int pc, + int ra, int asize, int hsize); +LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore); +LUAI_FUNC void luaK_finish (FuncState *fs); +LUAI_FUNC l_noret luaK_semerror (LexState *ls, const char *msg); + + +#endif diff --git a/lua-5.4.0/src/lcorolib.c b/lua-5.4.0/src/lcorolib.c new file mode 100644 index 0000000..7d6e585 --- /dev/null +++ b/lua-5.4.0/src/lcorolib.c @@ -0,0 +1,206 @@ +/* +** $Id: lcorolib.c $ +** Coroutine Library +** See Copyright Notice in lua.h +*/ + +#define lcorolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +static lua_State *getco (lua_State *L) { + lua_State *co = lua_tothread(L, 1); + luaL_argexpected(L, co, 1, "thread"); + return co; +} + + +/* +** Resumes a coroutine. Returns the number of results for non-error +** cases or -1 for errors. +*/ +static int auxresume (lua_State *L, lua_State *co, int narg) { + int status, nres; + if (!lua_checkstack(co, narg)) { + lua_pushliteral(L, "too many arguments to resume"); + return -1; /* error flag */ + } + lua_xmove(L, co, narg); + status = lua_resume(co, L, narg, &nres); + if (status == LUA_OK || status == LUA_YIELD) { + if (!lua_checkstack(L, nres + 1)) { + lua_pop(co, nres); /* remove results anyway */ + lua_pushliteral(L, "too many results to resume"); + return -1; /* error flag */ + } + lua_xmove(co, L, nres); /* move yielded values */ + return nres; + } + else { + lua_xmove(co, L, 1); /* move error message */ + return -1; /* error flag */ + } +} + + +static int luaB_coresume (lua_State *L) { + lua_State *co = getco(L); + int r; + r = auxresume(L, co, lua_gettop(L) - 1); + if (r < 0) { + lua_pushboolean(L, 0); + lua_insert(L, -2); + return 2; /* return false + error message */ + } + else { + lua_pushboolean(L, 1); + lua_insert(L, -(r + 1)); + return r + 1; /* return true + 'resume' returns */ + } +} + + +static int luaB_auxwrap (lua_State *L) { + lua_State *co = lua_tothread(L, lua_upvalueindex(1)); + int r = auxresume(L, co, lua_gettop(L)); + if (r < 0) { + int stat = lua_status(co); + if (stat != LUA_OK && stat != LUA_YIELD) + lua_resetthread(co); /* close variables in case of errors */ + if (lua_type(L, -1) == LUA_TSTRING) { /* error object is a string? */ + luaL_where(L, 1); /* add extra info, if available */ + lua_insert(L, -2); + lua_concat(L, 2); + } + return lua_error(L); /* propagate error */ + } + return r; +} + + +static int luaB_cocreate (lua_State *L) { + lua_State *NL; + luaL_checktype(L, 1, LUA_TFUNCTION); + NL = lua_newthread(L); + lua_pushvalue(L, 1); /* move function to top */ + lua_xmove(L, NL, 1); /* move function from L to NL */ + return 1; +} + + +static int luaB_cowrap (lua_State *L) { + luaB_cocreate(L); + lua_pushcclosure(L, luaB_auxwrap, 1); + return 1; +} + + +static int luaB_yield (lua_State *L) { + return lua_yield(L, lua_gettop(L)); +} + + +#define COS_RUN 0 +#define COS_DEAD 1 +#define COS_YIELD 2 +#define COS_NORM 3 + + +static const char *const statname[] = + {"running", "dead", "suspended", "normal"}; + + +static int auxstatus (lua_State *L, lua_State *co) { + if (L == co) return COS_RUN; + else { + switch (lua_status(co)) { + case LUA_YIELD: + return COS_YIELD; + case LUA_OK: { + lua_Debug ar; + if (lua_getstack(co, 0, &ar)) /* does it have frames? */ + return COS_NORM; /* it is running */ + else if (lua_gettop(co) == 0) + return COS_DEAD; + else + return COS_YIELD; /* initial state */ + } + default: /* some error occurred */ + return COS_DEAD; + } + } +} + + +static int luaB_costatus (lua_State *L) { + lua_State *co = getco(L); + lua_pushstring(L, statname[auxstatus(L, co)]); + return 1; +} + + +static int luaB_yieldable (lua_State *L) { + lua_State *co = lua_isnone(L, 1) ? L : getco(L); + lua_pushboolean(L, lua_isyieldable(co)); + return 1; +} + + +static int luaB_corunning (lua_State *L) { + int ismain = lua_pushthread(L); + lua_pushboolean(L, ismain); + return 2; +} + + +static int luaB_close (lua_State *L) { + lua_State *co = getco(L); + int status = auxstatus(L, co); + switch (status) { + case COS_DEAD: case COS_YIELD: { + status = lua_resetthread(co); + if (status == LUA_OK) { + lua_pushboolean(L, 1); + return 1; + } + else { + lua_pushboolean(L, 0); + lua_xmove(co, L, 1); /* copy error message */ + return 2; + } + } + default: /* normal or running coroutine */ + return luaL_error(L, "cannot close a %s coroutine", statname[status]); + } +} + + +static const luaL_Reg co_funcs[] = { + {"create", luaB_cocreate}, + {"resume", luaB_coresume}, + {"running", luaB_corunning}, + {"status", luaB_costatus}, + {"wrap", luaB_cowrap}, + {"yield", luaB_yield}, + {"isyieldable", luaB_yieldable}, + {"close", luaB_close}, + {NULL, NULL} +}; + + + +LUAMOD_API int luaopen_coroutine (lua_State *L) { + luaL_newlib(L, co_funcs); + return 1; +} + diff --git a/lua-5.4.0/src/lctype.c b/lua-5.4.0/src/lctype.c new file mode 100644 index 0000000..9542280 --- /dev/null +++ b/lua-5.4.0/src/lctype.c @@ -0,0 +1,64 @@ +/* +** $Id: lctype.c $ +** 'ctype' functions for Lua +** See Copyright Notice in lua.h +*/ + +#define lctype_c +#define LUA_CORE + +#include "lprefix.h" + + +#include "lctype.h" + +#if !LUA_USE_CTYPE /* { */ + +#include + + +#if defined (LUA_UCID) /* accept UniCode IDentifiers? */ +/* consider all non-ascii codepoints to be alphabetic */ +#define NONA 0x01 +#else +#define NONA 0x00 /* default */ +#endif + + +LUAI_DDEF const lu_byte luai_ctype_[UCHAR_MAX + 2] = { + 0x00, /* EOZ */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0. */ + 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, /* 2. */ + 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, /* 3. */ + 0x16, 0x16, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 4. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 5. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x05, + 0x04, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x05, /* 6. */ + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, /* 7. */ + 0x05, 0x05, 0x05, 0x04, 0x04, 0x04, 0x04, 0x00, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* 8. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* 9. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* a. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* b. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + 0x00, 0x00, NONA, NONA, NONA, NONA, NONA, NONA, /* c. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* d. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, /* e. */ + NONA, NONA, NONA, NONA, NONA, NONA, NONA, NONA, + NONA, NONA, NONA, NONA, NONA, 0x00, 0x00, 0x00, /* f. */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + +#endif /* } */ diff --git a/lua-5.4.0/src/lctype.h b/lua-5.4.0/src/lctype.h new file mode 100644 index 0000000..cbff4d7 --- /dev/null +++ b/lua-5.4.0/src/lctype.h @@ -0,0 +1,95 @@ +/* +** $Id: lctype.h $ +** 'ctype' functions for Lua +** See Copyright Notice in lua.h +*/ + +#ifndef lctype_h +#define lctype_h + +#include "lua.h" + + +/* +** WARNING: the functions defined here do not necessarily correspond +** to the similar functions in the standard C ctype.h. They are +** optimized for the specific needs of Lua +*/ + +#if !defined(LUA_USE_CTYPE) + +#if 'A' == 65 && '0' == 48 +/* ASCII case: can use its own tables; faster and fixed */ +#define LUA_USE_CTYPE 0 +#else +/* must use standard C ctype */ +#define LUA_USE_CTYPE 1 +#endif + +#endif + + +#if !LUA_USE_CTYPE /* { */ + +#include + +#include "llimits.h" + + +#define ALPHABIT 0 +#define DIGITBIT 1 +#define PRINTBIT 2 +#define SPACEBIT 3 +#define XDIGITBIT 4 + + +#define MASK(B) (1 << (B)) + + +/* +** add 1 to char to allow index -1 (EOZ) +*/ +#define testprop(c,p) (luai_ctype_[(c)+1] & (p)) + +/* +** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_' +*/ +#define lislalpha(c) testprop(c, MASK(ALPHABIT)) +#define lislalnum(c) testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT))) +#define lisdigit(c) testprop(c, MASK(DIGITBIT)) +#define lisspace(c) testprop(c, MASK(SPACEBIT)) +#define lisprint(c) testprop(c, MASK(PRINTBIT)) +#define lisxdigit(c) testprop(c, MASK(XDIGITBIT)) + +/* +** this 'ltolower' only works for alphabetic characters +*/ +#define ltolower(c) ((c) | ('A' ^ 'a')) + + +/* two more entries for 0 and -1 (EOZ) */ +LUAI_DDEC(const lu_byte luai_ctype_[UCHAR_MAX + 2];) + + +#else /* }{ */ + +/* +** use standard C ctypes +*/ + +#include + + +#define lislalpha(c) (isalpha(c) || (c) == '_') +#define lislalnum(c) (isalnum(c) || (c) == '_') +#define lisdigit(c) (isdigit(c)) +#define lisspace(c) (isspace(c)) +#define lisprint(c) (isprint(c)) +#define lisxdigit(c) (isxdigit(c)) + +#define ltolower(c) (tolower(c)) + +#endif /* } */ + +#endif + diff --git a/lua-5.4.0/src/ldblib.c b/lua-5.4.0/src/ldblib.c new file mode 100644 index 0000000..59eb8f0 --- /dev/null +++ b/lua-5.4.0/src/ldblib.c @@ -0,0 +1,477 @@ +/* +** $Id: ldblib.c $ +** Interface from Lua to its debug API +** See Copyright Notice in lua.h +*/ + +#define ldblib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** The hook table at registry[HOOKKEY] maps threads to their current +** hook function. +*/ +static const char *const HOOKKEY = "_HOOKKEY"; + + +/* +** If L1 != L, L1 can be in any state, and therefore there are no +** guarantees about its stack space; any push in L1 must be +** checked. +*/ +static void checkstack (lua_State *L, lua_State *L1, int n) { + if (L != L1 && !lua_checkstack(L1, n)) + luaL_error(L, "stack overflow"); +} + + +static int db_getregistry (lua_State *L) { + lua_pushvalue(L, LUA_REGISTRYINDEX); + return 1; +} + + +static int db_getmetatable (lua_State *L) { + luaL_checkany(L, 1); + if (!lua_getmetatable(L, 1)) { + lua_pushnil(L); /* no metatable */ + } + return 1; +} + + +static int db_setmetatable (lua_State *L) { + int t = lua_type(L, 2); + luaL_argexpected(L, t == LUA_TNIL || t == LUA_TTABLE, 2, "nil or table"); + lua_settop(L, 2); + lua_setmetatable(L, 1); + return 1; /* return 1st argument */ +} + + +static int db_getuservalue (lua_State *L) { + int n = (int)luaL_optinteger(L, 2, 1); + if (lua_type(L, 1) != LUA_TUSERDATA) + luaL_pushfail(L); + else if (lua_getiuservalue(L, 1, n) != LUA_TNONE) { + lua_pushboolean(L, 1); + return 2; + } + return 1; +} + + +static int db_setuservalue (lua_State *L) { + int n = (int)luaL_optinteger(L, 3, 1); + luaL_checktype(L, 1, LUA_TUSERDATA); + luaL_checkany(L, 2); + lua_settop(L, 2); + if (!lua_setiuservalue(L, 1, n)) + luaL_pushfail(L); + return 1; +} + + +/* +** Auxiliary function used by several library functions: check for +** an optional thread as function's first argument and set 'arg' with +** 1 if this argument is present (so that functions can skip it to +** access their other arguments) +*/ +static lua_State *getthread (lua_State *L, int *arg) { + if (lua_isthread(L, 1)) { + *arg = 1; + return lua_tothread(L, 1); + } + else { + *arg = 0; + return L; /* function will operate over current thread */ + } +} + + +/* +** Variations of 'lua_settable', used by 'db_getinfo' to put results +** from 'lua_getinfo' into result table. Key is always a string; +** value can be a string, an int, or a boolean. +*/ +static void settabss (lua_State *L, const char *k, const char *v) { + lua_pushstring(L, v); + lua_setfield(L, -2, k); +} + +static void settabsi (lua_State *L, const char *k, int v) { + lua_pushinteger(L, v); + lua_setfield(L, -2, k); +} + +static void settabsb (lua_State *L, const char *k, int v) { + lua_pushboolean(L, v); + lua_setfield(L, -2, k); +} + + +/* +** In function 'db_getinfo', the call to 'lua_getinfo' may push +** results on the stack; later it creates the result table to put +** these objects. Function 'treatstackoption' puts the result from +** 'lua_getinfo' on top of the result table so that it can call +** 'lua_setfield'. +*/ +static void treatstackoption (lua_State *L, lua_State *L1, const char *fname) { + if (L == L1) + lua_rotate(L, -2, 1); /* exchange object and table */ + else + lua_xmove(L1, L, 1); /* move object to the "main" stack */ + lua_setfield(L, -2, fname); /* put object into table */ +} + + +/* +** Calls 'lua_getinfo' and collects all results in a new table. +** L1 needs stack space for an optional input (function) plus +** two optional outputs (function and line table) from function +** 'lua_getinfo'. +*/ +static int db_getinfo (lua_State *L) { + lua_Debug ar; + int arg; + lua_State *L1 = getthread(L, &arg); + const char *options = luaL_optstring(L, arg+2, "flnSrtu"); + checkstack(L, L1, 3); + if (lua_isfunction(L, arg + 1)) { /* info about a function? */ + options = lua_pushfstring(L, ">%s", options); /* add '>' to 'options' */ + lua_pushvalue(L, arg + 1); /* move function to 'L1' stack */ + lua_xmove(L, L1, 1); + } + else { /* stack level */ + if (!lua_getstack(L1, (int)luaL_checkinteger(L, arg + 1), &ar)) { + luaL_pushfail(L); /* level out of range */ + return 1; + } + } + if (!lua_getinfo(L1, options, &ar)) + return luaL_argerror(L, arg+2, "invalid option"); + lua_newtable(L); /* table to collect results */ + if (strchr(options, 'S')) { + lua_pushlstring(L, ar.source, ar.srclen); + lua_setfield(L, -2, "source"); + settabss(L, "short_src", ar.short_src); + settabsi(L, "linedefined", ar.linedefined); + settabsi(L, "lastlinedefined", ar.lastlinedefined); + settabss(L, "what", ar.what); + } + if (strchr(options, 'l')) + settabsi(L, "currentline", ar.currentline); + if (strchr(options, 'u')) { + settabsi(L, "nups", ar.nups); + settabsi(L, "nparams", ar.nparams); + settabsb(L, "isvararg", ar.isvararg); + } + if (strchr(options, 'n')) { + settabss(L, "name", ar.name); + settabss(L, "namewhat", ar.namewhat); + } + if (strchr(options, 'r')) { + settabsi(L, "ftransfer", ar.ftransfer); + settabsi(L, "ntransfer", ar.ntransfer); + } + if (strchr(options, 't')) + settabsb(L, "istailcall", ar.istailcall); + if (strchr(options, 'L')) + treatstackoption(L, L1, "activelines"); + if (strchr(options, 'f')) + treatstackoption(L, L1, "func"); + return 1; /* return table */ +} + + +static int db_getlocal (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + int nvar = (int)luaL_checkinteger(L, arg + 2); /* local-variable index */ + if (lua_isfunction(L, arg + 1)) { /* function argument? */ + lua_pushvalue(L, arg + 1); /* push function */ + lua_pushstring(L, lua_getlocal(L, NULL, nvar)); /* push local name */ + return 1; /* return only name (there is no value) */ + } + else { /* stack-level argument */ + lua_Debug ar; + const char *name; + int level = (int)luaL_checkinteger(L, arg + 1); + if (!lua_getstack(L1, level, &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + checkstack(L, L1, 1); + name = lua_getlocal(L1, &ar, nvar); + if (name) { + lua_xmove(L1, L, 1); /* move local value */ + lua_pushstring(L, name); /* push name */ + lua_rotate(L, -2, 1); /* re-order */ + return 2; + } + else { + luaL_pushfail(L); /* no name (nor value) */ + return 1; + } + } +} + + +static int db_setlocal (lua_State *L) { + int arg; + const char *name; + lua_State *L1 = getthread(L, &arg); + lua_Debug ar; + int level = (int)luaL_checkinteger(L, arg + 1); + int nvar = (int)luaL_checkinteger(L, arg + 2); + if (!lua_getstack(L1, level, &ar)) /* out of range? */ + return luaL_argerror(L, arg+1, "level out of range"); + luaL_checkany(L, arg+3); + lua_settop(L, arg+3); + checkstack(L, L1, 1); + lua_xmove(L, L1, 1); + name = lua_setlocal(L1, &ar, nvar); + if (name == NULL) + lua_pop(L1, 1); /* pop value (if not popped by 'lua_setlocal') */ + lua_pushstring(L, name); + return 1; +} + + +/* +** get (if 'get' is true) or set an upvalue from a closure +*/ +static int auxupvalue (lua_State *L, int get) { + const char *name; + int n = (int)luaL_checkinteger(L, 2); /* upvalue index */ + luaL_checktype(L, 1, LUA_TFUNCTION); /* closure */ + name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); + if (name == NULL) return 0; + lua_pushstring(L, name); + lua_insert(L, -(get+1)); /* no-op if get is false */ + return get + 1; +} + + +static int db_getupvalue (lua_State *L) { + return auxupvalue(L, 1); +} + + +static int db_setupvalue (lua_State *L) { + luaL_checkany(L, 3); + return auxupvalue(L, 0); +} + + +/* +** Check whether a given upvalue from a given closure exists and +** returns its index +*/ +static int checkupval (lua_State *L, int argf, int argnup) { + int nup = (int)luaL_checkinteger(L, argnup); /* upvalue index */ + luaL_checktype(L, argf, LUA_TFUNCTION); /* closure */ + luaL_argcheck(L, (lua_getupvalue(L, argf, nup) != NULL), argnup, + "invalid upvalue index"); + return nup; +} + + +static int db_upvalueid (lua_State *L) { + int n = checkupval(L, 1, 2); + lua_pushlightuserdata(L, lua_upvalueid(L, 1, n)); + return 1; +} + + +static int db_upvaluejoin (lua_State *L) { + int n1 = checkupval(L, 1, 2); + int n2 = checkupval(L, 3, 4); + luaL_argcheck(L, !lua_iscfunction(L, 1), 1, "Lua function expected"); + luaL_argcheck(L, !lua_iscfunction(L, 3), 3, "Lua function expected"); + lua_upvaluejoin(L, 1, n1, 3, n2); + return 0; +} + + +/* +** Call hook function registered at hook table for the current +** thread (if there is one) +*/ +static void hookf (lua_State *L, lua_Debug *ar) { + static const char *const hooknames[] = + {"call", "return", "line", "count", "tail call"}; + lua_getfield(L, LUA_REGISTRYINDEX, HOOKKEY); + lua_pushthread(L); + if (lua_rawget(L, -2) == LUA_TFUNCTION) { /* is there a hook function? */ + lua_pushstring(L, hooknames[(int)ar->event]); /* push event name */ + if (ar->currentline >= 0) + lua_pushinteger(L, ar->currentline); /* push current line */ + else lua_pushnil(L); + lua_assert(lua_getinfo(L, "lS", ar)); + lua_call(L, 2, 0); /* call hook function */ + } +} + + +/* +** Convert a string mask (for 'sethook') into a bit mask +*/ +static int makemask (const char *smask, int count) { + int mask = 0; + if (strchr(smask, 'c')) mask |= LUA_MASKCALL; + if (strchr(smask, 'r')) mask |= LUA_MASKRET; + if (strchr(smask, 'l')) mask |= LUA_MASKLINE; + if (count > 0) mask |= LUA_MASKCOUNT; + return mask; +} + + +/* +** Convert a bit mask (for 'gethook') into a string mask +*/ +static char *unmakemask (int mask, char *smask) { + int i = 0; + if (mask & LUA_MASKCALL) smask[i++] = 'c'; + if (mask & LUA_MASKRET) smask[i++] = 'r'; + if (mask & LUA_MASKLINE) smask[i++] = 'l'; + smask[i] = '\0'; + return smask; +} + + +static int db_sethook (lua_State *L) { + int arg, mask, count; + lua_Hook func; + lua_State *L1 = getthread(L, &arg); + if (lua_isnoneornil(L, arg+1)) { /* no hook? */ + lua_settop(L, arg+1); + func = NULL; mask = 0; count = 0; /* turn off hooks */ + } + else { + const char *smask = luaL_checkstring(L, arg+2); + luaL_checktype(L, arg+1, LUA_TFUNCTION); + count = (int)luaL_optinteger(L, arg + 3, 0); + func = hookf; mask = makemask(smask, count); + } + if (!luaL_getsubtable(L, LUA_REGISTRYINDEX, HOOKKEY)) { + /* table just created; initialize it */ + lua_pushstring(L, "k"); + lua_setfield(L, -2, "__mode"); /** hooktable.__mode = "k" */ + lua_pushvalue(L, -1); + lua_setmetatable(L, -2); /* metatable(hooktable) = hooktable */ + } + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); /* key (thread) */ + lua_pushvalue(L, arg + 1); /* value (hook function) */ + lua_rawset(L, -3); /* hooktable[L1] = new Lua hook */ + lua_sethook(L1, func, mask, count); + return 0; +} + + +static int db_gethook (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + char buff[5]; + int mask = lua_gethookmask(L1); + lua_Hook hook = lua_gethook(L1); + if (hook == NULL) { /* no hook? */ + luaL_pushfail(L); + return 1; + } + else if (hook != hookf) /* external hook? */ + lua_pushliteral(L, "external hook"); + else { /* hook table must exist */ + lua_getfield(L, LUA_REGISTRYINDEX, HOOKKEY); + checkstack(L, L1, 1); + lua_pushthread(L1); lua_xmove(L1, L, 1); + lua_rawget(L, -2); /* 1st result = hooktable[L1] */ + lua_remove(L, -2); /* remove hook table */ + } + lua_pushstring(L, unmakemask(mask, buff)); /* 2nd result = mask */ + lua_pushinteger(L, lua_gethookcount(L1)); /* 3rd result = count */ + return 3; +} + + +static int db_debug (lua_State *L) { + for (;;) { + char buffer[250]; + lua_writestringerror("%s", "lua_debug> "); + if (fgets(buffer, sizeof(buffer), stdin) == 0 || + strcmp(buffer, "cont\n") == 0) + return 0; + if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") || + lua_pcall(L, 0, 0, 0)) + lua_writestringerror("%s\n", luaL_tolstring(L, -1, NULL)); + lua_settop(L, 0); /* remove eventual returns */ + } +} + + +static int db_traceback (lua_State *L) { + int arg; + lua_State *L1 = getthread(L, &arg); + const char *msg = lua_tostring(L, arg + 1); + if (msg == NULL && !lua_isnoneornil(L, arg + 1)) /* non-string 'msg'? */ + lua_pushvalue(L, arg + 1); /* return it untouched */ + else { + int level = (int)luaL_optinteger(L, arg + 2, (L == L1) ? 1 : 0); + luaL_traceback(L, L1, msg, level); + } + return 1; +} + + +static int db_setcstacklimit (lua_State *L) { + int limit = (int)luaL_checkinteger(L, 1); + int res = lua_setcstacklimit(L, limit); + if (res == 0) + lua_pushboolean(L, 0); + else + lua_pushinteger(L, res); + return 1; +} + + +static const luaL_Reg dblib[] = { + {"debug", db_debug}, + {"getuservalue", db_getuservalue}, + {"gethook", db_gethook}, + {"getinfo", db_getinfo}, + {"getlocal", db_getlocal}, + {"getregistry", db_getregistry}, + {"getmetatable", db_getmetatable}, + {"getupvalue", db_getupvalue}, + {"upvaluejoin", db_upvaluejoin}, + {"upvalueid", db_upvalueid}, + {"setuservalue", db_setuservalue}, + {"sethook", db_sethook}, + {"setlocal", db_setlocal}, + {"setmetatable", db_setmetatable}, + {"setupvalue", db_setupvalue}, + {"traceback", db_traceback}, + {"setcstacklimit", db_setcstacklimit}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_debug (lua_State *L) { + luaL_newlib(L, dblib); + return 1; +} + diff --git a/lua-5.4.0/src/ldebug.c b/lua-5.4.0/src/ldebug.c new file mode 100644 index 0000000..afdc2b7 --- /dev/null +++ b/lua-5.4.0/src/ldebug.c @@ -0,0 +1,841 @@ +/* +** $Id: ldebug.c $ +** Debug Interface +** See Copyright Notice in lua.h +*/ + +#define ldebug_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + + +#define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_VCCL) + + +/* Active Lua function (given call info) */ +#define ci_func(ci) (clLvalue(s2v((ci)->func))) + + +static const char *funcnamefromcode (lua_State *L, CallInfo *ci, + const char **name); + + +static int currentpc (CallInfo *ci) { + lua_assert(isLua(ci)); + return pcRel(ci->u.l.savedpc, ci_func(ci)->p); +} + + +/* +** Get a "base line" to find the line corresponding to an instruction. +** For that, search the array of absolute line info for the largest saved +** instruction smaller or equal to the wanted instruction. A special +** case is when there is no absolute info or the instruction is before +** the first absolute one. +*/ +static int getbaseline (const Proto *f, int pc, int *basepc) { + if (f->sizeabslineinfo == 0 || pc < f->abslineinfo[0].pc) { + *basepc = -1; /* start from the beginning */ + return f->linedefined; + } + else { + unsigned int i; + if (pc >= f->abslineinfo[f->sizeabslineinfo - 1].pc) + i = f->sizeabslineinfo - 1; /* instruction is after last saved one */ + else { /* binary search */ + unsigned int j = f->sizeabslineinfo - 1; /* pc < anchorlines[j] */ + i = 0; /* abslineinfo[i] <= pc */ + while (i < j - 1) { + unsigned int m = (j + i) / 2; + if (pc >= f->abslineinfo[m].pc) + i = m; + else + j = m; + } + } + *basepc = f->abslineinfo[i].pc; + return f->abslineinfo[i].line; + } +} + + +/* +** Get the line corresponding to instruction 'pc' in function 'f'; +** first gets a base line and from there does the increments until +** the desired instruction. +*/ +int luaG_getfuncline (const Proto *f, int pc) { + if (f->lineinfo == NULL) /* no debug information? */ + return -1; + else { + int basepc; + int baseline = getbaseline(f, pc, &basepc); + while (basepc++ < pc) { /* walk until given instruction */ + lua_assert(f->lineinfo[basepc] != ABSLINEINFO); + baseline += f->lineinfo[basepc]; /* correct line */ + } + return baseline; + } +} + + +static int getcurrentline (CallInfo *ci) { + return luaG_getfuncline(ci_func(ci)->p, currentpc(ci)); +} + + +/* +** Set 'trap' for all active Lua frames. +** This function can be called during a signal, under "reasonable" +** assumptions. A new 'ci' is completely linked in the list before it +** becomes part of the "active" list, and we assume that pointers are +** atomic; see comment in next function. +** (A compiler doing interprocedural optimizations could, theoretically, +** reorder memory writes in such a way that the list could be +** temporarily broken while inserting a new element. We simply assume it +** has no good reasons to do that.) +*/ +static void settraps (CallInfo *ci) { + for (; ci != NULL; ci = ci->previous) + if (isLua(ci)) + ci->u.l.trap = 1; +} + + +/* +** This function can be called during a signal, under "reasonable" +** assumptions. +** Fields 'oldpc', 'basehookcount', and 'hookcount' (set by +** 'resethookcount') are for debug only, and it is no problem if they +** get arbitrary values (causes at most one wrong hook call). 'hookmask' +** is an atomic value. We assume that pointers are atomic too (e.g., gcc +** ensures that for all platforms where it runs). Moreover, 'hook' is +** always checked before being called (see 'luaD_hook'). +*/ +LUA_API void lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { + if (func == NULL || mask == 0) { /* turn off hooks? */ + mask = 0; + func = NULL; + } + if (isLua(L->ci)) + L->oldpc = L->ci->u.l.savedpc; + L->hook = func; + L->basehookcount = count; + resethookcount(L); + L->hookmask = cast_byte(mask); + if (mask) + settraps(L->ci); /* to trace inside 'luaV_execute' */ +} + + +LUA_API lua_Hook lua_gethook (lua_State *L) { + return L->hook; +} + + +LUA_API int lua_gethookmask (lua_State *L) { + return L->hookmask; +} + + +LUA_API int lua_gethookcount (lua_State *L) { + return L->basehookcount; +} + + +LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { + int status; + CallInfo *ci; + if (level < 0) return 0; /* invalid (negative) level */ + lua_lock(L); + for (ci = L->ci; level > 0 && ci != &L->base_ci; ci = ci->previous) + level--; + if (level == 0 && ci != &L->base_ci) { /* level found? */ + status = 1; + ar->i_ci = ci; + } + else status = 0; /* no such level */ + lua_unlock(L); + return status; +} + + +static const char *upvalname (const Proto *p, int uv) { + TString *s = check_exp(uv < p->sizeupvalues, p->upvalues[uv].name); + if (s == NULL) return "?"; + else return getstr(s); +} + + +static const char *findvararg (CallInfo *ci, int n, StkId *pos) { + if (clLvalue(s2v(ci->func))->p->is_vararg) { + int nextra = ci->u.l.nextraargs; + if (n <= nextra) { + *pos = ci->func - nextra + (n - 1); + return "(vararg)"; /* generic name for any vararg */ + } + } + return NULL; /* no such vararg */ +} + + +const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, StkId *pos) { + StkId base = ci->func + 1; + const char *name = NULL; + if (isLua(ci)) { + if (n < 0) /* access to vararg values? */ + return findvararg(ci, -n, pos); + else + name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)); + } + if (name == NULL) { /* no 'standard' name? */ + StkId limit = (ci == L->ci) ? L->top : ci->next->func; + if (limit - base >= n && n > 0) { /* is 'n' inside 'ci' stack? */ + /* generic name for any valid slot */ + name = isLua(ci) ? "(temporary)" : "(C temporary)"; + } + else + return NULL; /* no name */ + } + if (pos) + *pos = base + (n - 1); + return name; +} + + +LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { + const char *name; + lua_lock(L); + if (ar == NULL) { /* information about non-active function? */ + if (!isLfunction(s2v(L->top - 1))) /* not a Lua function? */ + name = NULL; + else /* consider live variables at function start (parameters) */ + name = luaF_getlocalname(clLvalue(s2v(L->top - 1))->p, n, 0); + } + else { /* active function; get information through 'ar' */ + StkId pos = NULL; /* to avoid warnings */ + name = luaG_findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, L->top, pos); + api_incr_top(L); + } + } + lua_unlock(L); + return name; +} + + +LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { + StkId pos = NULL; /* to avoid warnings */ + const char *name; + lua_lock(L); + name = luaG_findlocal(L, ar->i_ci, n, &pos); + if (name) { + setobjs2s(L, pos, L->top - 1); + L->top--; /* pop value */ + } + lua_unlock(L); + return name; +} + + +static void funcinfo (lua_Debug *ar, Closure *cl) { + if (noLuaClosure(cl)) { + ar->source = "=[C]"; + ar->srclen = LL("=[C]"); + ar->linedefined = -1; + ar->lastlinedefined = -1; + ar->what = "C"; + } + else { + const Proto *p = cl->l.p; + if (p->source) { + ar->source = getstr(p->source); + ar->srclen = tsslen(p->source); + } + else { + ar->source = "=?"; + ar->srclen = LL("=?"); + } + ar->linedefined = p->linedefined; + ar->lastlinedefined = p->lastlinedefined; + ar->what = (ar->linedefined == 0) ? "main" : "Lua"; + } + luaO_chunkid(ar->short_src, ar->source, ar->srclen); +} + + +static int nextline (const Proto *p, int currentline, int pc) { + if (p->lineinfo[pc] != ABSLINEINFO) + return currentline + p->lineinfo[pc]; + else + return luaG_getfuncline(p, pc); +} + + +static void collectvalidlines (lua_State *L, Closure *f) { + if (noLuaClosure(f)) { + setnilvalue(s2v(L->top)); + api_incr_top(L); + } + else { + int i; + TValue v; + const Proto *p = f->l.p; + int currentline = p->linedefined; + Table *t = luaH_new(L); /* new table to store active lines */ + sethvalue2s(L, L->top, t); /* push it on stack */ + api_incr_top(L); + setbtvalue(&v); /* boolean 'true' to be the value of all indices */ + for (i = 0; i < p->sizelineinfo; i++) { /* for all lines with code */ + currentline = nextline(p, currentline, i); + luaH_setint(L, t, currentline, &v); /* table[line] = true */ + } + } +} + + +static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name) { + if (ci == NULL) /* no 'ci'? */ + return NULL; /* no info */ + else if (ci->callstatus & CIST_FIN) { /* is this a finalizer? */ + *name = "__gc"; + return "metamethod"; /* report it as such */ + } + /* calling function is a known Lua function? */ + else if (!(ci->callstatus & CIST_TAIL) && isLua(ci->previous)) + return funcnamefromcode(L, ci->previous, name); + else return NULL; /* no way to find a name */ +} + + +static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, + Closure *f, CallInfo *ci) { + int status = 1; + for (; *what; what++) { + switch (*what) { + case 'S': { + funcinfo(ar, f); + break; + } + case 'l': { + ar->currentline = (ci && isLua(ci)) ? getcurrentline(ci) : -1; + break; + } + case 'u': { + ar->nups = (f == NULL) ? 0 : f->c.nupvalues; + if (noLuaClosure(f)) { + ar->isvararg = 1; + ar->nparams = 0; + } + else { + ar->isvararg = f->l.p->is_vararg; + ar->nparams = f->l.p->numparams; + } + break; + } + case 't': { + ar->istailcall = (ci) ? ci->callstatus & CIST_TAIL : 0; + break; + } + case 'n': { + ar->namewhat = getfuncname(L, ci, &ar->name); + if (ar->namewhat == NULL) { + ar->namewhat = ""; /* not found */ + ar->name = NULL; + } + break; + } + case 'r': { + if (ci == NULL || !(ci->callstatus & CIST_TRAN)) + ar->ftransfer = ar->ntransfer = 0; + else { + ar->ftransfer = ci->u2.transferinfo.ftransfer; + ar->ntransfer = ci->u2.transferinfo.ntransfer; + } + break; + } + case 'L': + case 'f': /* handled by lua_getinfo */ + break; + default: status = 0; /* invalid option */ + } + } + return status; +} + + +LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { + int status; + Closure *cl; + CallInfo *ci; + TValue *func; + lua_lock(L); + if (*what == '>') { + ci = NULL; + func = s2v(L->top - 1); + api_check(L, ttisfunction(func), "function expected"); + what++; /* skip the '>' */ + L->top--; /* pop function */ + } + else { + ci = ar->i_ci; + func = s2v(ci->func); + lua_assert(ttisfunction(func)); + } + cl = ttisclosure(func) ? clvalue(func) : NULL; + status = auxgetinfo(L, what, ar, cl, ci); + if (strchr(what, 'f')) { + setobj2s(L, L->top, func); + api_incr_top(L); + } + if (strchr(what, 'L')) + collectvalidlines(L, cl); + lua_unlock(L); + return status; +} + + +/* +** {====================================================== +** Symbolic Execution +** ======================================================= +*/ + +static const char *getobjname (const Proto *p, int lastpc, int reg, + const char **name); + + +/* +** Find a "name" for the constant 'c'. +*/ +static void kname (const Proto *p, int c, const char **name) { + TValue *kvalue = &p->k[c]; + *name = (ttisstring(kvalue)) ? svalue(kvalue) : "?"; +} + + +/* +** Find a "name" for the register 'c'. +*/ +static void rname (const Proto *p, int pc, int c, const char **name) { + const char *what = getobjname(p, pc, c, name); /* search for 'c' */ + if (!(what && *what == 'c')) /* did not find a constant name? */ + *name = "?"; +} + + +/* +** Find a "name" for a 'C' value in an RK instruction. +*/ +static void rkname (const Proto *p, int pc, Instruction i, const char **name) { + int c = GETARG_C(i); /* key index */ + if (GETARG_k(i)) /* is 'c' a constant? */ + kname(p, c, name); + else /* 'c' is a register */ + rname(p, pc, c, name); +} + + +static int filterpc (int pc, int jmptarget) { + if (pc < jmptarget) /* is code conditional (inside a jump)? */ + return -1; /* cannot know who sets that register */ + else return pc; /* current position sets that register */ +} + + +/* +** Try to find last instruction before 'lastpc' that modified register 'reg'. +*/ +static int findsetreg (const Proto *p, int lastpc, int reg) { + int pc; + int setreg = -1; /* keep last instruction that changed 'reg' */ + int jmptarget = 0; /* any code before this address is conditional */ + if (testMMMode(GET_OPCODE(p->code[lastpc]))) + lastpc--; /* previous instruction was not actually executed */ + for (pc = 0; pc < lastpc; pc++) { + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + int a = GETARG_A(i); + int change; /* true if current instruction changed 'reg' */ + switch (op) { + case OP_LOADNIL: { /* set registers from 'a' to 'a+b' */ + int b = GETARG_B(i); + change = (a <= reg && reg <= a + b); + break; + } + case OP_TFORCALL: { /* affect all regs above its base */ + change = (reg >= a + 2); + break; + } + case OP_CALL: + case OP_TAILCALL: { /* affect all registers above base */ + change = (reg >= a); + break; + } + case OP_JMP: { /* doesn't change registers, but changes 'jmptarget' */ + int b = GETARG_sJ(i); + int dest = pc + 1 + b; + /* jump does not skip 'lastpc' and is larger than current one? */ + if (dest <= lastpc && dest > jmptarget) + jmptarget = dest; /* update 'jmptarget' */ + change = 0; + break; + } + default: /* any instruction that sets A */ + change = (testAMode(op) && reg == a); + break; + } + if (change) + setreg = filterpc(pc, jmptarget); + } + return setreg; +} + + +/* +** Check whether table being indexed by instruction 'i' is the +** environment '_ENV' +*/ +static const char *gxf (const Proto *p, int pc, Instruction i, int isup) { + int t = GETARG_B(i); /* table index */ + const char *name; /* name of indexed variable */ + if (isup) /* is an upvalue? */ + name = upvalname(p, t); + else + getobjname(p, pc, t, &name); + return (name && strcmp(name, LUA_ENV) == 0) ? "global" : "field"; +} + + +static const char *getobjname (const Proto *p, int lastpc, int reg, + const char **name) { + int pc; + *name = luaF_getlocalname(p, reg + 1, lastpc); + if (*name) /* is a local? */ + return "local"; + /* else try symbolic execution */ + pc = findsetreg(p, lastpc, reg); + if (pc != -1) { /* could find instruction? */ + Instruction i = p->code[pc]; + OpCode op = GET_OPCODE(i); + switch (op) { + case OP_MOVE: { + int b = GETARG_B(i); /* move from 'b' to 'a' */ + if (b < GETARG_A(i)) + return getobjname(p, pc, b, name); /* get name for 'b' */ + break; + } + case OP_GETTABUP: { + int k = GETARG_C(i); /* key index */ + kname(p, k, name); + return gxf(p, pc, i, 1); + } + case OP_GETTABLE: { + int k = GETARG_C(i); /* key index */ + rname(p, pc, k, name); + return gxf(p, pc, i, 0); + } + case OP_GETI: { + *name = "integer index"; + return "field"; + } + case OP_GETFIELD: { + int k = GETARG_C(i); /* key index */ + kname(p, k, name); + return gxf(p, pc, i, 0); + } + case OP_GETUPVAL: { + *name = upvalname(p, GETARG_B(i)); + return "upvalue"; + } + case OP_LOADK: + case OP_LOADKX: { + int b = (op == OP_LOADK) ? GETARG_Bx(i) + : GETARG_Ax(p->code[pc + 1]); + if (ttisstring(&p->k[b])) { + *name = svalue(&p->k[b]); + return "constant"; + } + break; + } + case OP_SELF: { + rkname(p, pc, i, name); + return "method"; + } + default: break; /* go through to return NULL */ + } + } + return NULL; /* could not find reasonable name */ +} + + +/* +** Try to find a name for a function based on the code that called it. +** (Only works when function was called by a Lua function.) +** Returns what the name is (e.g., "for iterator", "method", +** "metamethod") and sets '*name' to point to the name. +*/ +static const char *funcnamefromcode (lua_State *L, CallInfo *ci, + const char **name) { + TMS tm = (TMS)0; /* (initial value avoids warnings) */ + const Proto *p = ci_func(ci)->p; /* calling function */ + int pc = currentpc(ci); /* calling instruction index */ + Instruction i = p->code[pc]; /* calling instruction */ + if (ci->callstatus & CIST_HOOKED) { /* was it called inside a hook? */ + *name = "?"; + return "hook"; + } + switch (GET_OPCODE(i)) { + case OP_CALL: + case OP_TAILCALL: + return getobjname(p, pc, GETARG_A(i), name); /* get function name */ + case OP_TFORCALL: { /* for iterator */ + *name = "for iterator"; + return "for iterator"; + } + /* other instructions can do calls through metamethods */ + case OP_SELF: case OP_GETTABUP: case OP_GETTABLE: + case OP_GETI: case OP_GETFIELD: + tm = TM_INDEX; + break; + case OP_SETTABUP: case OP_SETTABLE: case OP_SETI: case OP_SETFIELD: + tm = TM_NEWINDEX; + break; + case OP_MMBIN: case OP_MMBINI: case OP_MMBINK: { + tm = cast(TMS, GETARG_C(i)); + break; + } + case OP_UNM: tm = TM_UNM; break; + case OP_BNOT: tm = TM_BNOT; break; + case OP_LEN: tm = TM_LEN; break; + case OP_CONCAT: tm = TM_CONCAT; break; + case OP_EQ: tm = TM_EQ; break; + case OP_LT: case OP_LE: case OP_LTI: case OP_LEI: + *name = "order"; /* '<=' can call '__lt', etc. */ + return "metamethod"; + case OP_CLOSE: case OP_RETURN: + *name = "close"; + return "metamethod"; + default: + return NULL; /* cannot find a reasonable name */ + } + *name = getstr(G(L)->tmname[tm]) + 2; + return "metamethod"; +} + +/* }====================================================== */ + + + +/* +** The subtraction of two potentially unrelated pointers is +** not ISO C, but it should not crash a program; the subsequent +** checks are ISO C and ensure a correct result. +*/ +static int isinstack (CallInfo *ci, const TValue *o) { + StkId base = ci->func + 1; + ptrdiff_t i = cast(StkId, o) - base; + return (0 <= i && i < (ci->top - base) && s2v(base + i) == o); +} + + +/* +** Checks whether value 'o' came from an upvalue. (That can only happen +** with instructions OP_GETTABUP/OP_SETTABUP, which operate directly on +** upvalues.) +*/ +static const char *getupvalname (CallInfo *ci, const TValue *o, + const char **name) { + LClosure *c = ci_func(ci); + int i; + for (i = 0; i < c->nupvalues; i++) { + if (c->upvals[i]->v == o) { + *name = upvalname(c->p, i); + return "upvalue"; + } + } + return NULL; +} + + +static const char *varinfo (lua_State *L, const TValue *o) { + const char *name = NULL; /* to avoid warnings */ + CallInfo *ci = L->ci; + const char *kind = NULL; + if (isLua(ci)) { + kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */ + if (!kind && isinstack(ci, o)) /* no? try a register */ + kind = getobjname(ci_func(ci)->p, currentpc(ci), + cast_int(cast(StkId, o) - (ci->func + 1)), &name); + } + return (kind) ? luaO_pushfstring(L, " (%s '%s')", kind, name) : ""; +} + + +l_noret luaG_typeerror (lua_State *L, const TValue *o, const char *op) { + const char *t = luaT_objtypename(L, o); + luaG_runerror(L, "attempt to %s a %s value%s", op, t, varinfo(L, o)); +} + + +l_noret luaG_forerror (lua_State *L, const TValue *o, const char *what) { + luaG_runerror(L, "bad 'for' %s (number expected, got %s)", + what, luaT_objtypename(L, o)); +} + + +l_noret luaG_concaterror (lua_State *L, const TValue *p1, const TValue *p2) { + if (ttisstring(p1) || cvt2str(p1)) p1 = p2; + luaG_typeerror(L, p1, "concatenate"); +} + + +l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, const char *msg) { + if (!ttisnumber(p1)) /* first operand is wrong? */ + p2 = p1; /* now second is wrong */ + luaG_typeerror(L, p2, msg); +} + + +/* +** Error when both values are convertible to numbers, but not to integers +*/ +l_noret luaG_tointerror (lua_State *L, const TValue *p1, const TValue *p2) { + lua_Integer temp; + if (!tointegerns(p1, &temp)) + p2 = p1; + luaG_runerror(L, "number%s has no integer representation", varinfo(L, p2)); +} + + +l_noret luaG_ordererror (lua_State *L, const TValue *p1, const TValue *p2) { + const char *t1 = luaT_objtypename(L, p1); + const char *t2 = luaT_objtypename(L, p2); + if (strcmp(t1, t2) == 0) + luaG_runerror(L, "attempt to compare two %s values", t1); + else + luaG_runerror(L, "attempt to compare %s with %s", t1, t2); +} + + +/* add src:line information to 'msg' */ +const char *luaG_addinfo (lua_State *L, const char *msg, TString *src, + int line) { + char buff[LUA_IDSIZE]; + if (src) + luaO_chunkid(buff, getstr(src), tsslen(src)); + else { /* no source available; use "?" instead */ + buff[0] = '?'; buff[1] = '\0'; + } + return luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); +} + + +l_noret luaG_errormsg (lua_State *L) { + if (L->errfunc != 0) { /* is there an error handling function? */ + StkId errfunc = restorestack(L, L->errfunc); + lua_assert(ttisfunction(s2v(errfunc))); + setobjs2s(L, L->top, L->top - 1); /* move argument */ + setobjs2s(L, L->top - 1, errfunc); /* push function */ + L->top++; /* assume EXTRA_STACK */ + luaD_callnoyield(L, L->top - 2, 1); /* call it */ + } + luaD_throw(L, LUA_ERRRUN); +} + + +l_noret luaG_runerror (lua_State *L, const char *fmt, ...) { + CallInfo *ci = L->ci; + const char *msg; + va_list argp; + luaC_checkGC(L); /* error message uses memory */ + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); /* format message */ + va_end(argp); + if (isLua(ci)) /* if Lua function, add source:line information */ + luaG_addinfo(L, msg, ci_func(ci)->p->source, getcurrentline(ci)); + luaG_errormsg(L); +} + + +/* +** Check whether new instruction 'newpc' is in a different line from +** previous instruction 'oldpc'. +*/ +static int changedline (const Proto *p, int oldpc, int newpc) { + while (oldpc++ < newpc) { + if (p->lineinfo[oldpc] != 0) + return (luaG_getfuncline(p, oldpc - 1) != luaG_getfuncline(p, newpc)); + } + return 0; /* no line changes in the way */ +} + + +int luaG_traceexec (lua_State *L, const Instruction *pc) { + CallInfo *ci = L->ci; + lu_byte mask = L->hookmask; + int counthook; + if (!(mask & (LUA_MASKLINE | LUA_MASKCOUNT))) { /* no hooks? */ + ci->u.l.trap = 0; /* don't need to stop again */ + return 0; /* turn off 'trap' */ + } + pc++; /* reference is always next instruction */ + ci->u.l.savedpc = pc; /* save 'pc' */ + counthook = (--L->hookcount == 0 && (mask & LUA_MASKCOUNT)); + if (counthook) + resethookcount(L); /* reset count */ + else if (!(mask & LUA_MASKLINE)) + return 1; /* no line hook and count != 0; nothing to be done now */ + if (ci->callstatus & CIST_HOOKYIELD) { /* called hook last time? */ + ci->callstatus &= ~CIST_HOOKYIELD; /* erase mark */ + return 1; /* do not call hook again (VM yielded, so it did not move) */ + } + if (!isIT(*(ci->u.l.savedpc - 1))) + L->top = ci->top; /* prepare top */ + if (counthook) + luaD_hook(L, LUA_HOOKCOUNT, -1, 0, 0); /* call count hook */ + if (mask & LUA_MASKLINE) { + const Proto *p = ci_func(ci)->p; + int npci = pcRel(pc, p); + if (npci == 0 || /* call linehook when enter a new function, */ + pc <= L->oldpc || /* when jump back (loop), or when */ + changedline(p, pcRel(L->oldpc, p), npci)) { /* enter new line */ + int newline = luaG_getfuncline(p, npci); + luaD_hook(L, LUA_HOOKLINE, newline, 0, 0); /* call line hook */ + } + L->oldpc = pc; /* 'pc' of last call to line hook */ + } + if (L->status == LUA_YIELD) { /* did hook yield? */ + if (counthook) + L->hookcount = 1; /* undo decrement to zero */ + ci->u.l.savedpc--; /* undo increment (resume will increment it again) */ + ci->callstatus |= CIST_HOOKYIELD; /* mark that it yielded */ + luaD_throw(L, LUA_YIELD); + } + return 1; /* keep 'trap' on */ +} + diff --git a/lua-5.4.0/src/ldebug.h b/lua-5.4.0/src/ldebug.h new file mode 100644 index 0000000..1fe0efa --- /dev/null +++ b/lua-5.4.0/src/ldebug.h @@ -0,0 +1,47 @@ +/* +** $Id: ldebug.h $ +** Auxiliary functions from Debug Interface module +** See Copyright Notice in lua.h +*/ + +#ifndef ldebug_h +#define ldebug_h + + +#include "lstate.h" + + +#define pcRel(pc, p) (cast_int((pc) - (p)->code) - 1) + +#define resethookcount(L) (L->hookcount = L->basehookcount) + +/* +** mark for entries in 'lineinfo' array that has absolute information in +** 'abslineinfo' array +*/ +#define ABSLINEINFO (-0x80) + +LUAI_FUNC int luaG_getfuncline (const Proto *f, int pc); +LUAI_FUNC const char *luaG_findlocal (lua_State *L, CallInfo *ci, int n, + StkId *pos); +LUAI_FUNC l_noret luaG_typeerror (lua_State *L, const TValue *o, + const char *opname); +LUAI_FUNC l_noret luaG_forerror (lua_State *L, const TValue *o, + const char *what); +LUAI_FUNC l_noret luaG_concaterror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_opinterror (lua_State *L, const TValue *p1, + const TValue *p2, + const char *msg); +LUAI_FUNC l_noret luaG_tointerror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1, + const TValue *p2); +LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...); +LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg, + TString *src, int line); +LUAI_FUNC l_noret luaG_errormsg (lua_State *L); +LUAI_FUNC int luaG_traceexec (lua_State *L, const Instruction *pc); + + +#endif diff --git a/lua-5.4.0/src/ldo.c b/lua-5.4.0/src/ldo.c new file mode 100644 index 0000000..c563b1d --- /dev/null +++ b/lua-5.4.0/src/ldo.c @@ -0,0 +1,822 @@ +/* +** $Id: ldo.c $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#define ldo_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lundump.h" +#include "lvm.h" +#include "lzio.h" + + + +#define errorstatus(s) ((s) > LUA_YIELD) + + +/* +** {====================================================== +** Error-recovery functions +** ======================================================= +*/ + +/* +** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By +** default, Lua handles errors with exceptions when compiling as +** C++ code, with _longjmp/_setjmp when asked to use them, and with +** longjmp/setjmp otherwise. +*/ +#if !defined(LUAI_THROW) /* { */ + +#if defined(__cplusplus) && !defined(LUA_USE_LONGJMP) /* { */ + +/* C++ exceptions */ +#define LUAI_THROW(L,c) throw(c) +#define LUAI_TRY(L,c,a) \ + try { a } catch(...) { if ((c)->status == 0) (c)->status = -1; } +#define luai_jmpbuf int /* dummy variable */ + +#elif defined(LUA_USE_POSIX) /* }{ */ + +/* in POSIX, try _longjmp/_setjmp (more efficient) */ +#define LUAI_THROW(L,c) _longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (_setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#else /* }{ */ + +/* ISO C handling with long jumps */ +#define LUAI_THROW(L,c) longjmp((c)->b, 1) +#define LUAI_TRY(L,c,a) if (setjmp((c)->b) == 0) { a } +#define luai_jmpbuf jmp_buf + +#endif /* } */ + +#endif /* } */ + + + +/* chain list of long jump buffers */ +struct lua_longjmp { + struct lua_longjmp *previous; + luai_jmpbuf b; + volatile int status; /* error code */ +}; + + +void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop) { + switch (errcode) { + case LUA_ERRMEM: { /* memory error? */ + setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */ + break; + } + case LUA_ERRERR: { + setsvalue2s(L, oldtop, luaS_newliteral(L, "error in error handling")); + break; + } + case CLOSEPROTECT: { + setnilvalue(s2v(oldtop)); /* no error message */ + break; + } + default: { + setobjs2s(L, oldtop, L->top - 1); /* error message on current top */ + break; + } + } + L->top = oldtop + 1; +} + + +l_noret luaD_throw (lua_State *L, int errcode) { + if (L->errorJmp) { /* thread has an error handler? */ + L->errorJmp->status = errcode; /* set status */ + LUAI_THROW(L, L->errorJmp); /* jump to it */ + } + else { /* thread has no error handler */ + global_State *g = G(L); + errcode = luaF_close(L, L->stack, errcode); /* close all upvalues */ + L->status = cast_byte(errcode); /* mark it as dead */ + if (g->mainthread->errorJmp) { /* main thread has a handler? */ + setobjs2s(L, g->mainthread->top++, L->top - 1); /* copy error obj. */ + luaD_throw(g->mainthread, errcode); /* re-throw in main thread */ + } + else { /* no handler at all; abort */ + if (g->panic) { /* panic function? */ + luaD_seterrorobj(L, errcode, L->top); /* assume EXTRA_STACK */ + if (L->ci->top < L->top) + L->ci->top = L->top; /* pushing msg. can break this invariant */ + lua_unlock(L); + g->panic(L); /* call panic function (last chance to jump out) */ + } + abort(); + } + } +} + + +int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { + global_State *g = G(L); + l_uint32 oldnCcalls = g->Cstacklimit - (L->nCcalls + L->nci); + struct lua_longjmp lj; + lj.status = LUA_OK; + lj.previous = L->errorJmp; /* chain new error handler */ + L->errorJmp = &lj; + LUAI_TRY(L, &lj, + (*f)(L, ud); + ); + L->errorJmp = lj.previous; /* restore old error handler */ + L->nCcalls = g->Cstacklimit - oldnCcalls - L->nci; + return lj.status; +} + +/* }====================================================== */ + + +/* +** {================================================================== +** Stack reallocation +** =================================================================== +*/ +static void correctstack (lua_State *L, StkId oldstack, StkId newstack) { + CallInfo *ci; + UpVal *up; + if (oldstack == newstack) + return; /* stack address did not change */ + L->top = (L->top - oldstack) + newstack; + for (up = L->openupval; up != NULL; up = up->u.open.next) + up->v = s2v((uplevel(up) - oldstack) + newstack); + for (ci = L->ci; ci != NULL; ci = ci->previous) { + ci->top = (ci->top - oldstack) + newstack; + ci->func = (ci->func - oldstack) + newstack; + if (isLua(ci)) + ci->u.l.trap = 1; /* signal to update 'trap' in 'luaV_execute' */ + } +} + + +/* some space for error handling */ +#define ERRORSTACKSIZE (LUAI_MAXSTACK + 200) + + +int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) { + int lim = L->stacksize; + StkId newstack = luaM_reallocvector(L, L->stack, lim, newsize, StackValue); + lua_assert(newsize <= LUAI_MAXSTACK || newsize == ERRORSTACKSIZE); + lua_assert(L->stack_last - L->stack == L->stacksize - EXTRA_STACK); + if (unlikely(newstack == NULL)) { /* reallocation failed? */ + if (raiseerror) + luaM_error(L); + else return 0; /* do not raise an error */ + } + for (; lim < newsize; lim++) + setnilvalue(s2v(newstack + lim)); /* erase new segment */ + correctstack(L, L->stack, newstack); + L->stack = newstack; + L->stacksize = newsize; + L->stack_last = L->stack + newsize - EXTRA_STACK; + return 1; +} + + +/* +** Try to grow the stack by at least 'n' elements. when 'raiseerror' +** is true, raises any error; otherwise, return 0 in case of errors. +*/ +int luaD_growstack (lua_State *L, int n, int raiseerror) { + int size = L->stacksize; + int newsize = 2 * size; /* tentative new size */ + if (unlikely(size > LUAI_MAXSTACK)) { /* need more space after extra size? */ + if (raiseerror) + luaD_throw(L, LUA_ERRERR); /* error inside message handler */ + else return 0; + } + else { + int needed = cast_int(L->top - L->stack) + n + EXTRA_STACK; + if (newsize > LUAI_MAXSTACK) /* cannot cross the limit */ + newsize = LUAI_MAXSTACK; + if (newsize < needed) /* but must respect what was asked for */ + newsize = needed; + if (unlikely(newsize > LUAI_MAXSTACK)) { /* stack overflow? */ + /* add extra size to be able to handle the error message */ + luaD_reallocstack(L, ERRORSTACKSIZE, raiseerror); + if (raiseerror) + luaG_runerror(L, "stack overflow"); + else return 0; + } + } /* else no errors */ + return luaD_reallocstack(L, newsize, raiseerror); +} + + +static int stackinuse (lua_State *L) { + CallInfo *ci; + StkId lim = L->top; + for (ci = L->ci; ci != NULL; ci = ci->previous) { + if (lim < ci->top) lim = ci->top; + } + lua_assert(lim <= L->stack_last); + return cast_int(lim - L->stack) + 1; /* part of stack in use */ +} + + +void luaD_shrinkstack (lua_State *L) { + int inuse = stackinuse(L); + int goodsize = inuse + (inuse / 8) + 2*EXTRA_STACK; + if (goodsize > LUAI_MAXSTACK) + goodsize = LUAI_MAXSTACK; /* respect stack limit */ + /* if thread is currently not handling a stack overflow and its + good size is smaller than current size, shrink its stack */ + if (inuse <= (LUAI_MAXSTACK - EXTRA_STACK) && + goodsize < L->stacksize) + luaD_reallocstack(L, goodsize, 0); /* ok if that fails */ + else /* don't change stack */ + condmovestack(L,{},{}); /* (change only for debugging) */ + luaE_shrinkCI(L); /* shrink CI list */ +} + + +void luaD_inctop (lua_State *L) { + luaD_checkstack(L, 1); + L->top++; +} + +/* }================================================================== */ + + +/* +** Call a hook for the given event. Make sure there is a hook to be +** called. (Both 'L->hook' and 'L->hookmask', which trigger this +** function, can be changed asynchronously by signals.) +*/ +void luaD_hook (lua_State *L, int event, int line, + int ftransfer, int ntransfer) { + lua_Hook hook = L->hook; + if (hook && L->allowhook) { /* make sure there is a hook */ + int mask = CIST_HOOKED; + CallInfo *ci = L->ci; + ptrdiff_t top = savestack(L, L->top); + ptrdiff_t ci_top = savestack(L, ci->top); + lua_Debug ar; + ar.event = event; + ar.currentline = line; + ar.i_ci = ci; + if (ntransfer != 0) { + mask |= CIST_TRAN; /* 'ci' has transfer information */ + ci->u2.transferinfo.ftransfer = ftransfer; + ci->u2.transferinfo.ntransfer = ntransfer; + } + luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ + if (L->top + LUA_MINSTACK > ci->top) + ci->top = L->top + LUA_MINSTACK; + L->allowhook = 0; /* cannot call hooks inside a hook */ + ci->callstatus |= mask; + lua_unlock(L); + (*hook)(L, &ar); + lua_lock(L); + lua_assert(!L->allowhook); + L->allowhook = 1; + ci->top = restorestack(L, ci_top); + L->top = restorestack(L, top); + ci->callstatus &= ~mask; + } +} + + +/* +** Executes a call hook for Lua functions. This function is called +** whenever 'hookmask' is not zero, so it checks whether call hooks are +** active. +*/ +void luaD_hookcall (lua_State *L, CallInfo *ci) { + int hook = (ci->callstatus & CIST_TAIL) ? LUA_HOOKTAILCALL : LUA_HOOKCALL; + Proto *p; + if (!(L->hookmask & LUA_MASKCALL)) /* some other hook? */ + return; /* don't call hook */ + p = clLvalue(s2v(ci->func))->p; + L->top = ci->top; /* prepare top */ + ci->u.l.savedpc++; /* hooks assume 'pc' is already incremented */ + luaD_hook(L, hook, -1, 1, p->numparams); + ci->u.l.savedpc--; /* correct 'pc' */ +} + + +static StkId rethook (lua_State *L, CallInfo *ci, StkId firstres, int nres) { + ptrdiff_t oldtop = savestack(L, L->top); /* hook may change top */ + int delta = 0; + if (isLuacode(ci)) { + Proto *p = clLvalue(s2v(ci->func))->p; + if (p->is_vararg) + delta = ci->u.l.nextraargs + p->numparams + 1; + if (L->top < ci->top) + L->top = ci->top; /* correct top to run hook */ + } + if (L->hookmask & LUA_MASKRET) { /* is return hook on? */ + int ftransfer; + ci->func += delta; /* if vararg, back to virtual 'func' */ + ftransfer = cast(unsigned short, firstres - ci->func); + luaD_hook(L, LUA_HOOKRET, -1, ftransfer, nres); /* call it */ + ci->func -= delta; + } + if (isLua(ci->previous)) + L->oldpc = ci->previous->u.l.savedpc; /* update 'oldpc' */ + return restorestack(L, oldtop); +} + + +/* +** Check whether 'func' has a '__call' metafield. If so, put it in the +** stack, below original 'func', so that 'luaD_call' can call it. Raise +** an error if there is no '__call' metafield. +*/ +void luaD_tryfuncTM (lua_State *L, StkId func) { + const TValue *tm = luaT_gettmbyobj(L, s2v(func), TM_CALL); + StkId p; + if (unlikely(ttisnil(tm))) + luaG_typeerror(L, s2v(func), "call"); /* nothing to call */ + for (p = L->top; p > func; p--) /* open space for metamethod */ + setobjs2s(L, p, p-1); + L->top++; /* stack space pre-allocated by the caller */ + setobj2s(L, func, tm); /* metamethod is the new function to be called */ +} + + +/* +** Given 'nres' results at 'firstResult', move 'wanted' of them to 'res'. +** Handle most typical cases (zero results for commands, one result for +** expressions, multiple results for tail calls/single parameters) +** separated. +*/ +static void moveresults (lua_State *L, StkId res, int nres, int wanted) { + StkId firstresult; + int i; + switch (wanted) { /* handle typical cases separately */ + case 0: /* no values needed */ + L->top = res; + return; + case 1: /* one value needed */ + if (nres == 0) /* no results? */ + setnilvalue(s2v(res)); /* adjust with nil */ + else + setobjs2s(L, res, L->top - nres); /* move it to proper place */ + L->top = res + 1; + return; + case LUA_MULTRET: + wanted = nres; /* we want all results */ + break; + default: /* multiple results (or to-be-closed variables) */ + if (hastocloseCfunc(wanted)) { /* to-be-closed variables? */ + ptrdiff_t savedres = savestack(L, res); + luaF_close(L, res, LUA_OK); /* may change the stack */ + res = restorestack(L, savedres); + wanted = codeNresults(wanted); /* correct value */ + if (wanted == LUA_MULTRET) + wanted = nres; + } + break; + } + firstresult = L->top - nres; /* index of first result */ + /* move all results to correct place */ + for (i = 0; i < nres && i < wanted; i++) + setobjs2s(L, res + i, firstresult + i); + for (; i < wanted; i++) /* complete wanted number of results */ + setnilvalue(s2v(res + i)); + L->top = res + wanted; /* top points after the last result */ +} + + +/* +** Finishes a function call: calls hook if necessary, removes CallInfo, +** moves current number of results to proper place. +*/ +void luaD_poscall (lua_State *L, CallInfo *ci, int nres) { + if (L->hookmask) + L->top = rethook(L, ci, L->top - nres, nres); + L->ci = ci->previous; /* back to caller */ + /* move results to proper place */ + moveresults(L, ci->func, nres, ci->nresults); +} + + + +#define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L)) + + +/* +** Prepare a function for a tail call, building its call info on top +** of the current call info. 'narg1' is the number of arguments plus 1 +** (so that it includes the function itself). +*/ +void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int narg1) { + Proto *p = clLvalue(s2v(func))->p; + int fsize = p->maxstacksize; /* frame size */ + int nfixparams = p->numparams; + int i; + for (i = 0; i < narg1; i++) /* move down function and arguments */ + setobjs2s(L, ci->func + i, func + i); + checkstackGC(L, fsize); + func = ci->func; /* moved-down function */ + for (; narg1 <= nfixparams; narg1++) + setnilvalue(s2v(func + narg1)); /* complete missing arguments */ + ci->top = func + 1 + fsize; /* top for new function */ + lua_assert(ci->top <= L->stack_last); + ci->u.l.savedpc = p->code; /* starting point */ + ci->callstatus |= CIST_TAIL; + L->top = func + narg1; /* set top */ +} + + +/* +** Call a function (C or Lua). The function to be called is at *func. +** The arguments are on the stack, right after the function. +** When returns, all the results are on the stack, starting at the original +** function position. +*/ +void luaD_call (lua_State *L, StkId func, int nresults) { + lua_CFunction f; + retry: + switch (ttypetag(s2v(func))) { + case LUA_VCCL: /* C closure */ + f = clCvalue(s2v(func))->f; + goto Cfunc; + case LUA_VLCF: /* light C function */ + f = fvalue(s2v(func)); + Cfunc: { + int n; /* number of returns */ + CallInfo *ci = next_ci(L); + checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ + ci->nresults = nresults; + ci->callstatus = CIST_C; + ci->top = L->top + LUA_MINSTACK; + ci->func = func; + L->ci = ci; + lua_assert(ci->top <= L->stack_last); + if (L->hookmask & LUA_MASKCALL) { + int narg = cast_int(L->top - func) - 1; + luaD_hook(L, LUA_HOOKCALL, -1, 1, narg); + } + lua_unlock(L); + n = (*f)(L); /* do the actual call */ + lua_lock(L); + api_checknelems(L, n); + luaD_poscall(L, ci, n); + break; + } + case LUA_VLCL: { /* Lua function */ + CallInfo *ci = next_ci(L); + Proto *p = clLvalue(s2v(func))->p; + int narg = cast_int(L->top - func) - 1; /* number of real arguments */ + int nfixparams = p->numparams; + int fsize = p->maxstacksize; /* frame size */ + checkstackp(L, fsize, func); + ci->nresults = nresults; + ci->u.l.savedpc = p->code; /* starting point */ + ci->callstatus = 0; + ci->top = func + 1 + fsize; + ci->func = func; + L->ci = ci; + for (; narg < nfixparams; narg++) + setnilvalue(s2v(L->top++)); /* complete missing arguments */ + lua_assert(ci->top <= L->stack_last); + luaV_execute(L, ci); /* run the function */ + break; + } + default: { /* not a function */ + checkstackp(L, 1, func); /* space for metamethod */ + luaD_tryfuncTM(L, func); /* try to get '__call' metamethod */ + goto retry; /* try again with metamethod */ + } + } +} + + +/* +** Similar to 'luaD_call', but does not allow yields during the call. +** If there is a stack overflow, freeing all CI structures will +** force the subsequent call to invoke 'luaE_extendCI', which then +** will raise any errors. +*/ +void luaD_callnoyield (lua_State *L, StkId func, int nResults) { + incXCcalls(L); + if (getCcalls(L) <= CSTACKERR) /* possible stack overflow? */ + luaE_freeCI(L); + luaD_call(L, func, nResults); + decXCcalls(L); +} + + +/* +** Completes the execution of an interrupted C function, calling its +** continuation function. +*/ +static void finishCcall (lua_State *L, int status) { + CallInfo *ci = L->ci; + int n; + /* must have a continuation and must be able to call it */ + lua_assert(ci->u.c.k != NULL && yieldable(L)); + /* error status can only happen in a protected call */ + lua_assert((ci->callstatus & CIST_YPCALL) || status == LUA_YIELD); + if (ci->callstatus & CIST_YPCALL) { /* was inside a pcall? */ + ci->callstatus &= ~CIST_YPCALL; /* continuation is also inside it */ + L->errfunc = ci->u.c.old_errfunc; /* with the same error function */ + } + /* finish 'lua_callk'/'lua_pcall'; CIST_YPCALL and 'errfunc' already + handled */ + adjustresults(L, ci->nresults); + lua_unlock(L); + n = (*ci->u.c.k)(L, status, ci->u.c.ctx); /* call continuation function */ + lua_lock(L); + api_checknelems(L, n); + luaD_poscall(L, ci, n); /* finish 'luaD_call' */ +} + + +/* +** Executes "full continuation" (everything in the stack) of a +** previously interrupted coroutine until the stack is empty (or another +** interruption long-jumps out of the loop). If the coroutine is +** recovering from an error, 'ud' points to the error status, which must +** be passed to the first continuation function (otherwise the default +** status is LUA_YIELD). +*/ +static void unroll (lua_State *L, void *ud) { + CallInfo *ci; + if (ud != NULL) /* error status? */ + finishCcall(L, *(int *)ud); /* finish 'lua_pcallk' callee */ + while ((ci = L->ci) != &L->base_ci) { /* something in the stack */ + if (!isLua(ci)) /* C function? */ + finishCcall(L, LUA_YIELD); /* complete its execution */ + else { /* Lua function */ + luaV_finishOp(L); /* finish interrupted instruction */ + luaV_execute(L, ci); /* execute down to higher C 'boundary' */ + } + } +} + + +/* +** Try to find a suspended protected call (a "recover point") for the +** given thread. +*/ +static CallInfo *findpcall (lua_State *L) { + CallInfo *ci; + for (ci = L->ci; ci != NULL; ci = ci->previous) { /* search for a pcall */ + if (ci->callstatus & CIST_YPCALL) + return ci; + } + return NULL; /* no pending pcall */ +} + + +/* +** Recovers from an error in a coroutine. Finds a recover point (if +** there is one) and completes the execution of the interrupted +** 'luaD_pcall'. If there is no recover point, returns zero. +*/ +static int recover (lua_State *L, int status) { + StkId oldtop; + CallInfo *ci = findpcall(L); + if (ci == NULL) return 0; /* no recovery point */ + /* "finish" luaD_pcall */ + oldtop = restorestack(L, ci->u2.funcidx); + luaF_close(L, oldtop, status); /* may change the stack */ + oldtop = restorestack(L, ci->u2.funcidx); + luaD_seterrorobj(L, status, oldtop); + L->ci = ci; + L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */ + luaD_shrinkstack(L); + L->errfunc = ci->u.c.old_errfunc; + return 1; /* continue running the coroutine */ +} + + +/* +** Signal an error in the call to 'lua_resume', not in the execution +** of the coroutine itself. (Such errors should not be handled by any +** coroutine error handler and should not kill the coroutine.) +*/ +static int resume_error (lua_State *L, const char *msg, int narg) { + L->top -= narg; /* remove args from the stack */ + setsvalue2s(L, L->top, luaS_new(L, msg)); /* push error message */ + api_incr_top(L); + lua_unlock(L); + return LUA_ERRRUN; +} + + +/* +** Do the work for 'lua_resume' in protected mode. Most of the work +** depends on the status of the coroutine: initial state, suspended +** inside a hook, or regularly suspended (optionally with a continuation +** function), plus erroneous cases: non-suspended coroutine or dead +** coroutine. +*/ +static void resume (lua_State *L, void *ud) { + int n = *(cast(int*, ud)); /* number of arguments */ + StkId firstArg = L->top - n; /* first argument */ + CallInfo *ci = L->ci; + if (L->status == LUA_OK) { /* starting a coroutine? */ + luaD_call(L, firstArg - 1, LUA_MULTRET); + } + else { /* resuming from previous yield */ + lua_assert(L->status == LUA_YIELD); + L->status = LUA_OK; /* mark that it is running (again) */ + if (isLua(ci)) /* yielded inside a hook? */ + luaV_execute(L, ci); /* just continue running Lua code */ + else { /* 'common' yield */ + if (ci->u.c.k != NULL) { /* does it have a continuation function? */ + lua_unlock(L); + n = (*ci->u.c.k)(L, LUA_YIELD, ci->u.c.ctx); /* call continuation */ + lua_lock(L); + api_checknelems(L, n); + } + luaD_poscall(L, ci, n); /* finish 'luaD_call' */ + } + unroll(L, NULL); /* run continuation */ + } +} + +LUA_API int lua_resume (lua_State *L, lua_State *from, int nargs, + int *nresults) { + int status; + lua_lock(L); + if (L->status == LUA_OK) { /* may be starting a coroutine */ + if (L->ci != &L->base_ci) /* not in base level? */ + return resume_error(L, "cannot resume non-suspended coroutine", nargs); + else if (L->top - (L->ci->func + 1) == nargs) /* no function? */ + return resume_error(L, "cannot resume dead coroutine", nargs); + } + else if (L->status != LUA_YIELD) /* ended with errors? */ + return resume_error(L, "cannot resume dead coroutine", nargs); + if (from == NULL) + L->nCcalls = CSTACKTHREAD; + else /* correct 'nCcalls' for this thread */ + L->nCcalls = getCcalls(from) + from->nci - L->nci - CSTACKCF; + if (L->nCcalls <= CSTACKERR) + return resume_error(L, "C stack overflow", nargs); + luai_userstateresume(L, nargs); + api_checknelems(L, (L->status == LUA_OK) ? nargs + 1 : nargs); + status = luaD_rawrunprotected(L, resume, &nargs); + /* continue running after recoverable errors */ + while (errorstatus(status) && recover(L, status)) { + /* unroll continuation */ + status = luaD_rawrunprotected(L, unroll, &status); + } + if (likely(!errorstatus(status))) + lua_assert(status == L->status); /* normal end or yield */ + else { /* unrecoverable error */ + L->status = cast_byte(status); /* mark thread as 'dead' */ + luaD_seterrorobj(L, status, L->top); /* push error message */ + L->ci->top = L->top; + } + *nresults = (status == LUA_YIELD) ? L->ci->u2.nyield + : cast_int(L->top - (L->ci->func + 1)); + lua_unlock(L); + return status; +} + + +LUA_API int lua_isyieldable (lua_State *L) { + return yieldable(L); +} + + +LUA_API int lua_yieldk (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k) { + CallInfo *ci = L->ci; + luai_userstateyield(L, nresults); + lua_lock(L); + api_checknelems(L, nresults); + if (unlikely(!yieldable(L))) { + if (L != G(L)->mainthread) + luaG_runerror(L, "attempt to yield across a C-call boundary"); + else + luaG_runerror(L, "attempt to yield from outside a coroutine"); + } + L->status = LUA_YIELD; + if (isLua(ci)) { /* inside a hook? */ + lua_assert(!isLuacode(ci)); + api_check(L, k == NULL, "hooks cannot continue after yielding"); + ci->u2.nyield = 0; /* no results */ + } + else { + if ((ci->u.c.k = k) != NULL) /* is there a continuation? */ + ci->u.c.ctx = ctx; /* save context */ + ci->u2.nyield = nresults; /* save number of results */ + luaD_throw(L, LUA_YIELD); + } + lua_assert(ci->callstatus & CIST_HOOKED); /* must be inside a hook */ + lua_unlock(L); + return 0; /* return to 'luaD_hook' */ +} + + +/* +** Call the C function 'func' in protected mode, restoring basic +** thread information ('allowhook', etc.) and in particular +** its stack level in case of errors. +*/ +int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t old_top, ptrdiff_t ef) { + int status; + CallInfo *old_ci = L->ci; + lu_byte old_allowhooks = L->allowhook; + ptrdiff_t old_errfunc = L->errfunc; + L->errfunc = ef; + status = luaD_rawrunprotected(L, func, u); + if (unlikely(status != LUA_OK)) { /* an error occurred? */ + StkId oldtop = restorestack(L, old_top); + L->ci = old_ci; + L->allowhook = old_allowhooks; + status = luaF_close(L, oldtop, status); + oldtop = restorestack(L, old_top); /* previous call may change stack */ + luaD_seterrorobj(L, status, oldtop); + luaD_shrinkstack(L); + } + L->errfunc = old_errfunc; + return status; +} + + + +/* +** Execute a protected parser. +*/ +struct SParser { /* data to 'f_parser' */ + ZIO *z; + Mbuffer buff; /* dynamic structure used by the scanner */ + Dyndata dyd; /* dynamic structures used by the parser */ + const char *mode; + const char *name; +}; + + +static void checkmode (lua_State *L, const char *mode, const char *x) { + if (mode && strchr(mode, x[0]) == NULL) { + luaO_pushfstring(L, + "attempt to load a %s chunk (mode is '%s')", x, mode); + luaD_throw(L, LUA_ERRSYNTAX); + } +} + + +static void f_parser (lua_State *L, void *ud) { + LClosure *cl; + struct SParser *p = cast(struct SParser *, ud); + int c = zgetc(p->z); /* read first character */ + if (c == LUA_SIGNATURE[0]) { + checkmode(L, p->mode, "binary"); + cl = luaU_undump(L, p->z, p->name); + } + else { + checkmode(L, p->mode, "text"); + cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c); + } + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luaF_initupvals(L, cl); +} + + +int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode) { + struct SParser p; + int status; + incnny(L); /* cannot yield during parsing */ + p.z = z; p.name = name; p.mode = mode; + p.dyd.actvar.arr = NULL; p.dyd.actvar.size = 0; + p.dyd.gt.arr = NULL; p.dyd.gt.size = 0; + p.dyd.label.arr = NULL; p.dyd.label.size = 0; + luaZ_initbuffer(L, &p.buff); + status = luaD_pcall(L, f_parser, &p, savestack(L, L->top), L->errfunc); + luaZ_freebuffer(L, &p.buff); + luaM_freearray(L, p.dyd.actvar.arr, p.dyd.actvar.size); + luaM_freearray(L, p.dyd.gt.arr, p.dyd.gt.size); + luaM_freearray(L, p.dyd.label.arr, p.dyd.label.size); + decnny(L); + return status; +} + + diff --git a/lua-5.4.0/src/ldo.h b/lua-5.4.0/src/ldo.h new file mode 100644 index 0000000..7760f85 --- /dev/null +++ b/lua-5.4.0/src/ldo.h @@ -0,0 +1,75 @@ +/* +** $Id: ldo.h $ +** Stack and Call structure of Lua +** See Copyright Notice in lua.h +*/ + +#ifndef ldo_h +#define ldo_h + + +#include "lobject.h" +#include "lstate.h" +#include "lzio.h" + + +/* +** Macro to check stack size and grow stack if needed. Parameters +** 'pre'/'pos' allow the macro to preserve a pointer into the +** stack across reallocations, doing the work only when needed. +** 'condmovestack' is used in heavy tests to force a stack reallocation +** at every check. +*/ +#define luaD_checkstackaux(L,n,pre,pos) \ + if (L->stack_last - L->top <= (n)) \ + { pre; luaD_growstack(L, n, 1); pos; } \ + else { condmovestack(L,pre,pos); } + +/* In general, 'pre'/'pos' are empty (nothing to save) */ +#define luaD_checkstack(L,n) luaD_checkstackaux(L,n,(void)0,(void)0) + + + +#define savestack(L,p) ((char *)(p) - (char *)L->stack) +#define restorestack(L,n) ((StkId)((char *)L->stack + (n))) + + +/* macro to check stack size, preserving 'p' */ +#define checkstackp(L,n,p) \ + luaD_checkstackaux(L, n, \ + ptrdiff_t t__ = savestack(L, p); /* save 'p' */ \ + luaC_checkGC(L), /* stack grow uses memory */ \ + p = restorestack(L, t__)) /* 'pos' part: restore 'p' */ + + +/* macro to check stack size and GC */ +#define checkstackGC(L,fsize) \ + luaD_checkstackaux(L, (fsize), (void)0, luaC_checkGC(L)) + + +/* type of protected functions, to be ran by 'runprotected' */ +typedef void (*Pfunc) (lua_State *L, void *ud); + +LUAI_FUNC void luaD_seterrorobj (lua_State *L, int errcode, StkId oldtop); +LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, + const char *mode); +LUAI_FUNC void luaD_hook (lua_State *L, int event, int line, + int fTransfer, int nTransfer); +LUAI_FUNC void luaD_hookcall (lua_State *L, CallInfo *ci); +LUAI_FUNC void luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func, int n); +LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); +LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); +LUAI_FUNC void luaD_tryfuncTM (lua_State *L, StkId func); +LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, + ptrdiff_t oldtop, ptrdiff_t ef); +LUAI_FUNC void luaD_poscall (lua_State *L, CallInfo *ci, int nres); +LUAI_FUNC int luaD_reallocstack (lua_State *L, int newsize, int raiseerror); +LUAI_FUNC int luaD_growstack (lua_State *L, int n, int raiseerror); +LUAI_FUNC void luaD_shrinkstack (lua_State *L); +LUAI_FUNC void luaD_inctop (lua_State *L); + +LUAI_FUNC l_noret luaD_throw (lua_State *L, int errcode); +LUAI_FUNC int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); + +#endif + diff --git a/lua-5.4.0/src/ldump.c b/lua-5.4.0/src/ldump.c new file mode 100644 index 0000000..f848b66 --- /dev/null +++ b/lua-5.4.0/src/ldump.c @@ -0,0 +1,226 @@ +/* +** $Id: ldump.c $ +** save precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define ldump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lobject.h" +#include "lstate.h" +#include "lundump.h" + + +typedef struct { + lua_State *L; + lua_Writer writer; + void *data; + int strip; + int status; +} DumpState; + + +/* +** All high-level dumps go through dumpVector; you can change it to +** change the endianness of the result +*/ +#define dumpVector(D,v,n) dumpBlock(D,v,(n)*sizeof((v)[0])) + +#define dumpLiteral(D, s) dumpBlock(D,s,sizeof(s) - sizeof(char)) + + +static void dumpBlock (DumpState *D, const void *b, size_t size) { + if (D->status == 0 && size > 0) { + lua_unlock(D->L); + D->status = (*D->writer)(D->L, b, size, D->data); + lua_lock(D->L); + } +} + + +#define dumpVar(D,x) dumpVector(D,&x,1) + + +static void dumpByte (DumpState *D, int y) { + lu_byte x = (lu_byte)y; + dumpVar(D, x); +} + + +/* dumpInt Buff Size */ +#define DIBS ((sizeof(size_t) * 8 / 7) + 1) + +static void dumpSize (DumpState *D, size_t x) { + lu_byte buff[DIBS]; + int n = 0; + do { + buff[DIBS - (++n)] = x & 0x7f; /* fill buffer in reverse order */ + x >>= 7; + } while (x != 0); + buff[DIBS - 1] |= 0x80; /* mark last byte */ + dumpVector(D, buff + DIBS - n, n); +} + + +static void dumpInt (DumpState *D, int x) { + dumpSize(D, x); +} + + +static void dumpNumber (DumpState *D, lua_Number x) { + dumpVar(D, x); +} + + +static void dumpInteger (DumpState *D, lua_Integer x) { + dumpVar(D, x); +} + + +static void dumpString (DumpState *D, const TString *s) { + if (s == NULL) + dumpSize(D, 0); + else { + size_t size = tsslen(s); + const char *str = getstr(s); + dumpSize(D, size + 1); + dumpVector(D, str, size); + } +} + + +static void dumpCode (DumpState *D, const Proto *f) { + dumpInt(D, f->sizecode); + dumpVector(D, f->code, f->sizecode); +} + + +static void dumpFunction(DumpState *D, const Proto *f, TString *psource); + +static void dumpConstants (DumpState *D, const Proto *f) { + int i; + int n = f->sizek; + dumpInt(D, n); + for (i = 0; i < n; i++) { + const TValue *o = &f->k[i]; + int tt = ttypetag(o); + dumpByte(D, tt); + switch (tt) { + case LUA_VNUMFLT: + dumpNumber(D, fltvalue(o)); + break; + case LUA_VNUMINT: + dumpInteger(D, ivalue(o)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + dumpString(D, tsvalue(o)); + break; + default: + lua_assert(tt == LUA_VNIL || tt == LUA_VFALSE || tt == LUA_VTRUE); + } + } +} + + +static void dumpProtos (DumpState *D, const Proto *f) { + int i; + int n = f->sizep; + dumpInt(D, n); + for (i = 0; i < n; i++) + dumpFunction(D, f->p[i], f->source); +} + + +static void dumpUpvalues (DumpState *D, const Proto *f) { + int i, n = f->sizeupvalues; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpByte(D, f->upvalues[i].instack); + dumpByte(D, f->upvalues[i].idx); + dumpByte(D, f->upvalues[i].kind); + } +} + + +static void dumpDebug (DumpState *D, const Proto *f) { + int i, n; + n = (D->strip) ? 0 : f->sizelineinfo; + dumpInt(D, n); + dumpVector(D, f->lineinfo, n); + n = (D->strip) ? 0 : f->sizeabslineinfo; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpInt(D, f->abslineinfo[i].pc); + dumpInt(D, f->abslineinfo[i].line); + } + n = (D->strip) ? 0 : f->sizelocvars; + dumpInt(D, n); + for (i = 0; i < n; i++) { + dumpString(D, f->locvars[i].varname); + dumpInt(D, f->locvars[i].startpc); + dumpInt(D, f->locvars[i].endpc); + } + n = (D->strip) ? 0 : f->sizeupvalues; + dumpInt(D, n); + for (i = 0; i < n; i++) + dumpString(D, f->upvalues[i].name); +} + + +static void dumpFunction (DumpState *D, const Proto *f, TString *psource) { + if (D->strip || f->source == psource) + dumpString(D, NULL); /* no debug info or same source as its parent */ + else + dumpString(D, f->source); + dumpInt(D, f->linedefined); + dumpInt(D, f->lastlinedefined); + dumpByte(D, f->numparams); + dumpByte(D, f->is_vararg); + dumpByte(D, f->maxstacksize); + dumpCode(D, f); + dumpConstants(D, f); + dumpUpvalues(D, f); + dumpProtos(D, f); + dumpDebug(D, f); +} + + +static void dumpHeader (DumpState *D) { + dumpLiteral(D, LUA_SIGNATURE); + dumpByte(D, LUAC_VERSION); + dumpByte(D, LUAC_FORMAT); + dumpLiteral(D, LUAC_DATA); + dumpByte(D, sizeof(Instruction)); + dumpByte(D, sizeof(lua_Integer)); + dumpByte(D, sizeof(lua_Number)); + dumpInteger(D, LUAC_INT); + dumpNumber(D, LUAC_NUM); +} + + +/* +** dump Lua function as precompiled chunk +*/ +int luaU_dump(lua_State *L, const Proto *f, lua_Writer w, void *data, + int strip) { + DumpState D; + D.L = L; + D.writer = w; + D.data = data; + D.strip = strip; + D.status = 0; + dumpHeader(&D); + dumpByte(&D, f->sizeupvalues); + dumpFunction(&D, f, NULL); + return D.status; +} + diff --git a/lua-5.4.0/src/lfunc.c b/lua-5.4.0/src/lfunc.c new file mode 100644 index 0000000..10100e5 --- /dev/null +++ b/lua-5.4.0/src/lfunc.c @@ -0,0 +1,299 @@ +/* +** $Id: lfunc.c $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#define lfunc_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + + +CClosure *luaF_newCclosure (lua_State *L, int nupvals) { + GCObject *o = luaC_newobj(L, LUA_VCCL, sizeCclosure(nupvals)); + CClosure *c = gco2ccl(o); + c->nupvalues = cast_byte(nupvals); + return c; +} + + +LClosure *luaF_newLclosure (lua_State *L, int nupvals) { + GCObject *o = luaC_newobj(L, LUA_VLCL, sizeLclosure(nupvals)); + LClosure *c = gco2lcl(o); + c->p = NULL; + c->nupvalues = cast_byte(nupvals); + while (nupvals--) c->upvals[nupvals] = NULL; + return c; +} + + +/* +** fill a closure with new closed upvalues +*/ +void luaF_initupvals (lua_State *L, LClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) { + GCObject *o = luaC_newobj(L, LUA_VUPVAL, sizeof(UpVal)); + UpVal *uv = gco2upv(o); + uv->v = &uv->u.value; /* make it closed */ + setnilvalue(uv->v); + cl->upvals[i] = uv; + luaC_objbarrier(L, cl, o); + } +} + + +/* +** Create a new upvalue at the given level, and link it to the list of +** open upvalues of 'L' after entry 'prev'. +**/ +static UpVal *newupval (lua_State *L, int tbc, StkId level, UpVal **prev) { + GCObject *o = luaC_newobj(L, LUA_VUPVAL, sizeof(UpVal)); + UpVal *uv = gco2upv(o); + UpVal *next = *prev; + uv->v = s2v(level); /* current value lives in the stack */ + uv->tbc = tbc; + uv->u.open.next = next; /* link it to list of open upvalues */ + uv->u.open.previous = prev; + if (next) + next->u.open.previous = &uv->u.open.next; + *prev = uv; + if (!isintwups(L)) { /* thread not in list of threads with upvalues? */ + L->twups = G(L)->twups; /* link it to the list */ + G(L)->twups = L; + } + return uv; +} + + +/* +** Find and reuse, or create if it does not exist, an upvalue +** at the given level. +*/ +UpVal *luaF_findupval (lua_State *L, StkId level) { + UpVal **pp = &L->openupval; + UpVal *p; + lua_assert(isintwups(L) || L->openupval == NULL); + while ((p = *pp) != NULL && uplevel(p) >= level) { /* search for it */ + lua_assert(!isdead(G(L), p)); + if (uplevel(p) == level) /* corresponding upvalue? */ + return p; /* return it */ + pp = &p->u.open.next; + } + /* not found: create a new upvalue after 'pp' */ + return newupval(L, 0, level, pp); +} + + +static void callclose (lua_State *L, void *ud) { + UNUSED(ud); + luaD_callnoyield(L, L->top - 3, 0); +} + + +/* +** Prepare closing method plus its arguments for object 'obj' with +** error message 'err'. (This function assumes EXTRA_STACK.) +*/ +static int prepclosingmethod (lua_State *L, TValue *obj, TValue *err) { + StkId top = L->top; + const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE); + if (ttisnil(tm)) /* no metamethod? */ + return 0; /* nothing to call */ + setobj2s(L, top, tm); /* will call metamethod... */ + setobj2s(L, top + 1, obj); /* with 'self' as the 1st argument */ + setobj2s(L, top + 2, err); /* and error msg. as 2nd argument */ + L->top = top + 3; /* add function and arguments */ + return 1; +} + + +/* +** Raise an error with message 'msg', inserting the name of the +** local variable at position 'level' in the stack. +*/ +static void varerror (lua_State *L, StkId level, const char *msg) { + int idx = cast_int(level - L->ci->func); + const char *vname = luaG_findlocal(L, L->ci, idx, NULL); + if (vname == NULL) vname = "?"; + luaG_runerror(L, msg, vname); +} + + +/* +** Prepare and call a closing method. If status is OK, code is still +** inside the original protected call, and so any error will be handled +** there. Otherwise, a previous error already activated the original +** protected call, and so the call to the closing method must be +** protected here. (A status == CLOSEPROTECT behaves like a previous +** error, to also run the closing method in protected mode). +** If status is OK, the call to the closing method will be pushed +** at the top of the stack. Otherwise, values are pushed after +** the 'level' of the upvalue being closed, as everything after +** that won't be used again. +*/ +static int callclosemth (lua_State *L, StkId level, int status) { + TValue *uv = s2v(level); /* value being closed */ + if (likely(status == LUA_OK)) { + if (prepclosingmethod(L, uv, &G(L)->nilvalue)) /* something to call? */ + callclose(L, NULL); /* call closing method */ + else if (!l_isfalse(uv)) /* non-closable non-false value? */ + varerror(L, level, "attempt to close non-closable variable '%s'"); + } + else { /* must close the object in protected mode */ + ptrdiff_t oldtop; + level++; /* space for error message */ + oldtop = savestack(L, level + 1); /* top will be after that */ + luaD_seterrorobj(L, status, level); /* set error message */ + if (prepclosingmethod(L, uv, s2v(level))) { /* something to call? */ + int newstatus = luaD_pcall(L, callclose, NULL, oldtop, 0); + if (newstatus != LUA_OK && status == CLOSEPROTECT) /* first error? */ + status = newstatus; /* this will be the new error */ + else { + if (newstatus != LUA_OK) /* suppressed error? */ + luaE_warnerror(L, "__close metamethod"); + /* leave original error (or nil) on top */ + L->top = restorestack(L, oldtop); + } + } + /* else no metamethod; ignore this case and keep original error */ + } + return status; +} + + +/* +** Try to create a to-be-closed upvalue +** (can raise a memory-allocation error) +*/ +static void trynewtbcupval (lua_State *L, void *ud) { + newupval(L, 1, cast(StkId, ud), &L->openupval); +} + + +/* +** Create a to-be-closed upvalue. If there is a memory error +** when creating the upvalue, the closing method must be called here, +** as there is no upvalue to call it later. +*/ +void luaF_newtbcupval (lua_State *L, StkId level) { + TValue *obj = s2v(level); + lua_assert(L->openupval == NULL || uplevel(L->openupval) < level); + if (!l_isfalse(obj)) { /* false doesn't need to be closed */ + int status; + const TValue *tm = luaT_gettmbyobj(L, obj, TM_CLOSE); + if (ttisnil(tm)) /* no metamethod? */ + varerror(L, level, "variable '%s' got a non-closable value"); + status = luaD_rawrunprotected(L, trynewtbcupval, level); + if (unlikely(status != LUA_OK)) { /* memory error creating upvalue? */ + lua_assert(status == LUA_ERRMEM); + luaD_seterrorobj(L, LUA_ERRMEM, level + 1); /* save error message */ + /* next call must succeed, as object is closable */ + prepclosingmethod(L, s2v(level), s2v(level + 1)); + callclose(L, NULL); /* call closing method */ + luaD_throw(L, LUA_ERRMEM); /* throw memory error */ + } + } +} + + +void luaF_unlinkupval (UpVal *uv) { + lua_assert(upisopen(uv)); + *uv->u.open.previous = uv->u.open.next; + if (uv->u.open.next) + uv->u.open.next->u.open.previous = uv->u.open.previous; +} + + +int luaF_close (lua_State *L, StkId level, int status) { + UpVal *uv; + while ((uv = L->openupval) != NULL && uplevel(uv) >= level) { + TValue *slot = &uv->u.value; /* new position for value */ + lua_assert(uplevel(uv) < L->top); + if (uv->tbc && status != NOCLOSINGMETH) { + /* must run closing method, which may change the stack */ + ptrdiff_t levelrel = savestack(L, level); + status = callclosemth(L, uplevel(uv), status); + level = restorestack(L, levelrel); + } + luaF_unlinkupval(uv); + setobj(L, slot, uv->v); /* move value to upvalue slot */ + uv->v = slot; /* now current value lives here */ + if (!iswhite(uv)) + gray2black(uv); /* closed upvalues cannot be gray */ + luaC_barrier(L, uv, slot); + } + return status; +} + + +Proto *luaF_newproto (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_VPROTO, sizeof(Proto)); + Proto *f = gco2p(o); + f->k = NULL; + f->sizek = 0; + f->p = NULL; + f->sizep = 0; + f->code = NULL; + f->sizecode = 0; + f->lineinfo = NULL; + f->sizelineinfo = 0; + f->abslineinfo = NULL; + f->sizeabslineinfo = 0; + f->upvalues = NULL; + f->sizeupvalues = 0; + f->numparams = 0; + f->is_vararg = 0; + f->maxstacksize = 0; + f->locvars = NULL; + f->sizelocvars = 0; + f->linedefined = 0; + f->lastlinedefined = 0; + f->source = NULL; + return f; +} + + +void luaF_freeproto (lua_State *L, Proto *f) { + luaM_freearray(L, f->code, f->sizecode); + luaM_freearray(L, f->p, f->sizep); + luaM_freearray(L, f->k, f->sizek); + luaM_freearray(L, f->lineinfo, f->sizelineinfo); + luaM_freearray(L, f->abslineinfo, f->sizeabslineinfo); + luaM_freearray(L, f->locvars, f->sizelocvars); + luaM_freearray(L, f->upvalues, f->sizeupvalues); + luaM_free(L, f); +} + + +/* +** Look for n-th local variable at line 'line' in function 'func'. +** Returns NULL if not found. +*/ +const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { + int i; + for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { + if (pc < f->locvars[i].endpc) { /* is variable active? */ + local_number--; + if (local_number == 0) + return getstr(f->locvars[i].varname); + } + } + return NULL; /* not found */ +} + diff --git a/lua-5.4.0/src/lfunc.h b/lua-5.4.0/src/lfunc.h new file mode 100644 index 0000000..8d6f965 --- /dev/null +++ b/lua-5.4.0/src/lfunc.h @@ -0,0 +1,69 @@ +/* +** $Id: lfunc.h $ +** Auxiliary functions to manipulate prototypes and closures +** See Copyright Notice in lua.h +*/ + +#ifndef lfunc_h +#define lfunc_h + + +#include "lobject.h" + + +#define sizeCclosure(n) (cast_int(offsetof(CClosure, upvalue)) + \ + cast_int(sizeof(TValue)) * (n)) + +#define sizeLclosure(n) (cast_int(offsetof(LClosure, upvals)) + \ + cast_int(sizeof(TValue *)) * (n)) + + +/* test whether thread is in 'twups' list */ +#define isintwups(L) (L->twups != L) + + +/* +** maximum number of upvalues in a closure (both C and Lua). (Value +** must fit in a VM register.) +*/ +#define MAXUPVAL 255 + + +#define upisopen(up) ((up)->v != &(up)->u.value) + + +#define uplevel(up) check_exp(upisopen(up), cast(StkId, (up)->v)) + + +/* +** maximum number of misses before giving up the cache of closures +** in prototypes +*/ +#define MAXMISS 10 + + +/* +** Special "status" for 'luaF_close' +*/ + +/* close upvalues without running their closing methods */ +#define NOCLOSINGMETH (-1) + +/* close upvalues running all closing methods in protected mode */ +#define CLOSEPROTECT (-2) + + +LUAI_FUNC Proto *luaF_newproto (lua_State *L); +LUAI_FUNC CClosure *luaF_newCclosure (lua_State *L, int nupvals); +LUAI_FUNC LClosure *luaF_newLclosure (lua_State *L, int nupvals); +LUAI_FUNC void luaF_initupvals (lua_State *L, LClosure *cl); +LUAI_FUNC UpVal *luaF_findupval (lua_State *L, StkId level); +LUAI_FUNC void luaF_newtbcupval (lua_State *L, StkId level); +LUAI_FUNC int luaF_close (lua_State *L, StkId level, int status); +LUAI_FUNC void luaF_unlinkupval (UpVal *uv); +LUAI_FUNC void luaF_freeproto (lua_State *L, Proto *f); +LUAI_FUNC const char *luaF_getlocalname (const Proto *func, int local_number, + int pc); + + +#endif diff --git a/lua-5.4.0/src/lgc.c b/lua-5.4.0/src/lgc.c new file mode 100644 index 0000000..f26c921 --- /dev/null +++ b/lua-5.4.0/src/lgc.c @@ -0,0 +1,1616 @@ +/* +** $Id: lgc.c $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#define lgc_c +#define LUA_CORE + +#include "lprefix.h" + +#include +#include + + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +/* +** Maximum number of elements to sweep in each single step. +** (Large enough to dissipate fixed overheads but small enough +** to allow small steps for the collector.) +*/ +#define GCSWEEPMAX 100 + +/* +** Maximum number of finalizers to call in each single step. +*/ +#define GCFINMAX 10 + + +/* +** Cost of calling one finalizer. +*/ +#define GCFINALIZECOST 50 + + +/* +** The equivalent, in bytes, of one unit of "work" (visiting a slot, +** sweeping an object, etc.) +*/ +#define WORK2MEM sizeof(TValue) + + +/* +** macro to adjust 'pause': 'pause' is actually used like +** 'pause / PAUSEADJ' (value chosen by tests) +*/ +#define PAUSEADJ 100 + + +/* mask to erase all color bits (plus gen. related stuff) */ +#define maskcolors (~(bitmask(BLACKBIT) | WHITEBITS | AGEBITS)) + + +/* macro to erase all color bits then sets only the current white bit */ +#define makewhite(g,x) \ + (x->marked = cast_byte((x->marked & maskcolors) | luaC_white(g))) + +#define white2gray(x) resetbits(x->marked, WHITEBITS) +#define black2gray(x) resetbit(x->marked, BLACKBIT) + + +#define valiswhite(x) (iscollectable(x) && iswhite(gcvalue(x))) + +#define keyiswhite(n) (keyiscollectable(n) && iswhite(gckey(n))) + + +#define checkconsistency(obj) \ + lua_longassert(!iscollectable(obj) || righttt(obj)) + +/* +** Protected access to objects in values +*/ +#define gcvalueN(o) (iscollectable(o) ? gcvalue(o) : NULL) + + +#define markvalue(g,o) { checkconsistency(o); \ + if (valiswhite(o)) reallymarkobject(g,gcvalue(o)); } + +#define markkey(g, n) { if keyiswhite(n) reallymarkobject(g,gckey(n)); } + +#define markobject(g,t) { if (iswhite(t)) reallymarkobject(g, obj2gco(t)); } + +/* +** mark an object that can be NULL (either because it is really optional, +** or it was stripped as debug info, or inside an uncompleted structure) +*/ +#define markobjectN(g,t) { if (t) markobject(g,t); } + +static void reallymarkobject (global_State *g, GCObject *o); +static lu_mem atomic (lua_State *L); +static void entersweep (lua_State *L); + + +/* +** {====================================================== +** Generic functions +** ======================================================= +*/ + + +/* +** one after last element in a hash array +*/ +#define gnodelast(h) gnode(h, cast_sizet(sizenode(h))) + + +static GCObject **getgclist (GCObject *o) { + switch (o->tt) { + case LUA_VTABLE: return &gco2t(o)->gclist; + case LUA_VLCL: return &gco2lcl(o)->gclist; + case LUA_VCCL: return &gco2ccl(o)->gclist; + case LUA_VTHREAD: return &gco2th(o)->gclist; + case LUA_VPROTO: return &gco2p(o)->gclist; + case LUA_VUSERDATA: { + Udata *u = gco2u(o); + lua_assert(u->nuvalue > 0); + return &u->gclist; + } + default: lua_assert(0); return 0; + } +} + + +/* +** Link a collectable object 'o' with a known type into list pointed by 'p'. +*/ +#define linkgclist(o,p) ((o)->gclist = (p), (p) = obj2gco(o)) + + +/* +** Link a generic collectable object 'o' into list pointed by 'p'. +*/ +#define linkobjgclist(o,p) (*getgclist(o) = (p), (p) = obj2gco(o)) + + + +/* +** Clear keys for empty entries in tables. If entry is empty +** and its key is not marked, mark its entry as dead. This allows the +** collection of the key, but keeps its entry in the table (its removal +** could break a chain). The main feature of a dead key is that it must +** be different from any other value, to do not disturb searches. +** Other places never manipulate dead keys, because its associated empty +** value is enough to signal that the entry is logically empty. +*/ +static void clearkey (Node *n) { + lua_assert(isempty(gval(n))); + if (keyiswhite(n)) + setdeadkey(n); /* unused and unmarked key; remove it */ +} + + +/* +** tells whether a key or value can be cleared from a weak +** table. Non-collectable objects are never removed from weak +** tables. Strings behave as 'values', so are never removed too. for +** other objects: if really collected, cannot keep them; for objects +** being finalized, keep them in keys, but not in values +*/ +static int iscleared (global_State *g, const GCObject *o) { + if (o == NULL) return 0; /* non-collectable value */ + else if (novariant(o->tt) == LUA_TSTRING) { + markobject(g, o); /* strings are 'values', so are never weak */ + return 0; + } + else return iswhite(o); +} + + +/* +** barrier that moves collector forward, that is, mark the white object +** 'v' being pointed by the black object 'o'. (If in sweep phase, clear +** the black object to white [sweep it] to avoid other barrier calls for +** this same object.) In the generational mode, 'v' must also become +** old, if 'o' is old; however, it cannot be changed directly to OLD, +** because it may still point to non-old objects. So, it is marked as +** OLD0. In the next cycle it will become OLD1, and in the next it +** will finally become OLD (regular old). +*/ +void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v) { + global_State *g = G(L); + lua_assert(isblack(o) && iswhite(v) && !isdead(g, v) && !isdead(g, o)); + if (keepinvariant(g)) { /* must keep invariant? */ + reallymarkobject(g, v); /* restore invariant */ + if (isold(o)) { + lua_assert(!isold(v)); /* white object could not be old */ + setage(v, G_OLD0); /* restore generational invariant */ + } + } + else { /* sweep phase */ + lua_assert(issweepphase(g)); + makewhite(g, o); /* mark main obj. as white to avoid other barriers */ + } +} + + +/* +** barrier that moves collector backward, that is, mark the black object +** pointing to a white object as gray again. +*/ +void luaC_barrierback_ (lua_State *L, GCObject *o) { + global_State *g = G(L); + lua_assert(isblack(o) && !isdead(g, o)); + lua_assert(g->gckind != KGC_GEN || (isold(o) && getage(o) != G_TOUCHED1)); + if (getage(o) != G_TOUCHED2) /* not already in gray list? */ + linkobjgclist(o, g->grayagain); /* link it in 'grayagain' */ + black2gray(o); /* make object gray (again) */ + setage(o, G_TOUCHED1); /* touched in current cycle */ +} + + +void luaC_fix (lua_State *L, GCObject *o) { + global_State *g = G(L); + lua_assert(g->allgc == o); /* object must be 1st in 'allgc' list! */ + white2gray(o); /* they will be gray forever */ + setage(o, G_OLD); /* and old forever */ + g->allgc = o->next; /* remove object from 'allgc' list */ + o->next = g->fixedgc; /* link it to 'fixedgc' list */ + g->fixedgc = o; +} + + +/* +** create a new collectable object (with given type and size) and link +** it to 'allgc' list. +*/ +GCObject *luaC_newobj (lua_State *L, int tt, size_t sz) { + global_State *g = G(L); + GCObject *o = cast(GCObject *, luaM_newobject(L, novariant(tt), sz)); + o->marked = luaC_white(g); + o->tt = tt; + o->next = g->allgc; + g->allgc = o; + return o; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Mark functions +** ======================================================= +*/ + + +/* +** Mark an object. Userdata, strings, and closed upvalues are visited +** and turned black here. Other objects are marked gray and added +** to appropriate list to be visited (and turned black) later. (Open +** upvalues are already linked in 'headuv' list. They are kept gray +** to avoid barriers, as their values will be revisited by the thread.) +*/ +static void reallymarkobject (global_State *g, GCObject *o) { + white2gray(o); + switch (o->tt) { + case LUA_VSHRSTR: + case LUA_VLNGSTR: { + gray2black(o); + break; + } + case LUA_VUPVAL: { + UpVal *uv = gco2upv(o); + if (!upisopen(uv)) /* open upvalues are kept gray */ + gray2black(o); + markvalue(g, uv->v); /* mark its content */ + break; + } + case LUA_VUSERDATA: { + Udata *u = gco2u(o); + if (u->nuvalue == 0) { /* no user values? */ + markobjectN(g, u->metatable); /* mark its metatable */ + gray2black(o); /* nothing else to mark */ + break; + } + /* else... */ + } /* FALLTHROUGH */ + case LUA_VLCL: case LUA_VCCL: case LUA_VTABLE: + case LUA_VTHREAD: case LUA_VPROTO: { + linkobjgclist(o, g->gray); + break; + } + default: lua_assert(0); break; + } +} + + +/* +** mark metamethods for basic types +*/ +static void markmt (global_State *g) { + int i; + for (i=0; i < LUA_NUMTAGS; i++) + markobjectN(g, g->mt[i]); +} + + +/* +** mark all objects in list of being-finalized +*/ +static lu_mem markbeingfnz (global_State *g) { + GCObject *o; + lu_mem count = 0; + for (o = g->tobefnz; o != NULL; o = o->next) { + count++; + markobject(g, o); + } + return count; +} + + +/* +** Mark all values stored in marked open upvalues from non-marked threads. +** (Values from marked threads were already marked when traversing the +** thread.) Remove from the list threads that no longer have upvalues and +** not-marked threads. +*/ +static int remarkupvals (global_State *g) { + lua_State *thread; + lua_State **p = &g->twups; + int work = 0; + while ((thread = *p) != NULL) { + work++; + lua_assert(!isblack(thread)); /* threads are never black */ + if (isgray(thread) && thread->openupval != NULL) + p = &thread->twups; /* keep marked thread with upvalues in the list */ + else { /* thread is not marked or without upvalues */ + UpVal *uv; + *p = thread->twups; /* remove thread from the list */ + thread->twups = thread; /* mark that it is out of list */ + for (uv = thread->openupval; uv != NULL; uv = uv->u.open.next) { + work++; + if (!iswhite(uv)) /* upvalue already visited? */ + markvalue(g, uv->v); /* mark its value */ + } + } + } + return work; +} + + +/* +** mark root set and reset all gray lists, to start a new collection +*/ +static void restartcollection (global_State *g) { + g->gray = g->grayagain = NULL; + g->weak = g->allweak = g->ephemeron = NULL; + markobject(g, g->mainthread); + markvalue(g, &g->l_registry); + markmt(g); + markbeingfnz(g); /* mark any finalizing object left from previous cycle */ +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Traverse functions +** ======================================================= +*/ + +/* +** Traverse a table with weak values and link it to proper list. During +** propagate phase, keep it in 'grayagain' list, to be revisited in the +** atomic phase. In the atomic phase, if table has any white value, +** put it in 'weak' list, to be cleared. +*/ +static void traverseweakvalue (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + /* if there is array part, assume it may have white values (it is not + worth traversing it now just to check) */ + int hasclears = (h->alimit > 0); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else { + lua_assert(!keyisnil(n)); + markkey(g, n); + if (!hasclears && iscleared(g, gcvalueN(gval(n)))) /* a white value? */ + hasclears = 1; /* table will have to be cleared */ + } + } + if (g->gcstate == GCSatomic && hasclears) + linkgclist(h, g->weak); /* has to be cleared later */ + else + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ +} + + +/* +** Traverse an ephemeron table and link it to proper list. Returns true +** iff any object was marked during this traversal (which implies that +** convergence has to continue). During propagation phase, keep table +** in 'grayagain' list, to be visited again in the atomic phase. In +** the atomic phase, if table has any white->white entry, it has to +** be revisited during ephemeron convergence (as that key may turn +** black). Otherwise, if it has any white key, table has to be cleared +** (in the atomic phase). In generational mode, it (like all visited +** tables) must be kept in some gray list for post-processing. +*/ +static int traverseephemeron (global_State *g, Table *h, int inv) { + int marked = 0; /* true if an object is marked in this traversal */ + int hasclears = 0; /* true if table has white keys */ + int hasww = 0; /* true if table has entry "white-key -> white-value" */ + unsigned int i; + unsigned int asize = luaH_realasize(h); + unsigned int nsize = sizenode(h); + /* traverse array part */ + for (i = 0; i < asize; i++) { + if (valiswhite(&h->array[i])) { + marked = 1; + reallymarkobject(g, gcvalue(&h->array[i])); + } + } + /* traverse hash part; if 'inv', traverse descending + (see 'convergeephemerons') */ + for (i = 0; i < nsize; i++) { + Node *n = inv ? gnode(h, nsize - 1 - i) : gnode(h, i); + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else if (iscleared(g, gckeyN(n))) { /* key is not marked (yet)? */ + hasclears = 1; /* table must be cleared */ + if (valiswhite(gval(n))) /* value not marked yet? */ + hasww = 1; /* white-white entry */ + } + else if (valiswhite(gval(n))) { /* value not marked yet? */ + marked = 1; + reallymarkobject(g, gcvalue(gval(n))); /* mark it now */ + } + } + /* link table into proper list */ + if (g->gcstate == GCSpropagate) + linkgclist(h, g->grayagain); /* must retraverse it in atomic phase */ + else if (hasww) /* table has white->white entries? */ + linkgclist(h, g->ephemeron); /* have to propagate again */ + else if (hasclears) /* table has white keys? */ + linkgclist(h, g->allweak); /* may have to clean white keys */ + else if (g->gckind == KGC_GEN) + linkgclist(h, g->grayagain); /* keep it in some list */ + else + gray2black(h); + return marked; +} + + +static void traversestrongtable (global_State *g, Table *h) { + Node *n, *limit = gnodelast(h); + unsigned int i; + unsigned int asize = luaH_realasize(h); + for (i = 0; i < asize; i++) /* traverse array part */ + markvalue(g, &h->array[i]); + for (n = gnode(h, 0); n < limit; n++) { /* traverse hash part */ + if (isempty(gval(n))) /* entry is empty? */ + clearkey(n); /* clear its key */ + else { + lua_assert(!keyisnil(n)); + markkey(g, n); + markvalue(g, gval(n)); + } + } + if (g->gckind == KGC_GEN) { + linkgclist(h, g->grayagain); /* keep it in some gray list */ + black2gray(h); + } +} + + +static lu_mem traversetable (global_State *g, Table *h) { + const char *weakkey, *weakvalue; + const TValue *mode = gfasttm(g, h->metatable, TM_MODE); + markobjectN(g, h->metatable); + if (mode && ttisstring(mode) && /* is there a weak mode? */ + (cast_void(weakkey = strchr(svalue(mode), 'k')), + cast_void(weakvalue = strchr(svalue(mode), 'v')), + (weakkey || weakvalue))) { /* is really weak? */ + black2gray(h); /* keep table gray */ + if (!weakkey) /* strong keys? */ + traverseweakvalue(g, h); + else if (!weakvalue) /* strong values? */ + traverseephemeron(g, h, 0); + else /* all weak */ + linkgclist(h, g->allweak); /* nothing to traverse now */ + } + else /* not weak */ + traversestrongtable(g, h); + return 1 + h->alimit + 2 * allocsizenode(h); +} + + +static int traverseudata (global_State *g, Udata *u) { + int i; + markobjectN(g, u->metatable); /* mark its metatable */ + for (i = 0; i < u->nuvalue; i++) + markvalue(g, &u->uv[i].uv); + if (g->gckind == KGC_GEN) { + linkgclist(u, g->grayagain); /* keep it in some gray list */ + black2gray(u); + } + return 1 + u->nuvalue; +} + + +/* +** Traverse a prototype. (While a prototype is being build, its +** arrays can be larger than needed; the extra slots are filled with +** NULL, so the use of 'markobjectN') +*/ +static int traverseproto (global_State *g, Proto *f) { + int i; + markobjectN(g, f->source); + for (i = 0; i < f->sizek; i++) /* mark literals */ + markvalue(g, &f->k[i]); + for (i = 0; i < f->sizeupvalues; i++) /* mark upvalue names */ + markobjectN(g, f->upvalues[i].name); + for (i = 0; i < f->sizep; i++) /* mark nested protos */ + markobjectN(g, f->p[i]); + for (i = 0; i < f->sizelocvars; i++) /* mark local-variable names */ + markobjectN(g, f->locvars[i].varname); + return 1 + f->sizek + f->sizeupvalues + f->sizep + f->sizelocvars; +} + + +static int traverseCclosure (global_State *g, CClosure *cl) { + int i; + for (i = 0; i < cl->nupvalues; i++) /* mark its upvalues */ + markvalue(g, &cl->upvalue[i]); + return 1 + cl->nupvalues; +} + +/* +** Traverse a Lua closure, marking its prototype and its upvalues. +** (Both can be NULL while closure is being created.) +*/ +static int traverseLclosure (global_State *g, LClosure *cl) { + int i; + markobjectN(g, cl->p); /* mark its prototype */ + for (i = 0; i < cl->nupvalues; i++) { /* visit its upvalues */ + UpVal *uv = cl->upvals[i]; + markobjectN(g, uv); /* mark upvalue */ + } + return 1 + cl->nupvalues; +} + + +/* +** Traverse a thread, marking the elements in the stack up to its top +** and cleaning the rest of the stack in the final traversal. +** That ensures that the entire stack have valid (non-dead) objects. +*/ +static int traversethread (global_State *g, lua_State *th) { + UpVal *uv; + StkId o = th->stack; + if (o == NULL) + return 1; /* stack not completely built yet */ + lua_assert(g->gcstate == GCSatomic || + th->openupval == NULL || isintwups(th)); + for (; o < th->top; o++) /* mark live elements in the stack */ + markvalue(g, s2v(o)); + for (uv = th->openupval; uv != NULL; uv = uv->u.open.next) + markobject(g, uv); /* open upvalues cannot be collected */ + if (g->gcstate == GCSatomic) { /* final traversal? */ + StkId lim = th->stack + th->stacksize; /* real end of stack */ + for (; o < lim; o++) /* clear not-marked stack slice */ + setnilvalue(s2v(o)); + /* 'remarkupvals' may have removed thread from 'twups' list */ + if (!isintwups(th) && th->openupval != NULL) { + th->twups = g->twups; /* link it back to the list */ + g->twups = th; + } + } + else if (!g->gcemergency) + luaD_shrinkstack(th); /* do not change stack in emergency cycle */ + return 1 + th->stacksize; +} + + +/* +** traverse one gray object, turning it to black (except for threads, +** which are always gray). +*/ +static lu_mem propagatemark (global_State *g) { + GCObject *o = g->gray; + gray2black(o); + g->gray = *getgclist(o); /* remove from 'gray' list */ + switch (o->tt) { + case LUA_VTABLE: return traversetable(g, gco2t(o)); + case LUA_VUSERDATA: return traverseudata(g, gco2u(o)); + case LUA_VLCL: return traverseLclosure(g, gco2lcl(o)); + case LUA_VCCL: return traverseCclosure(g, gco2ccl(o)); + case LUA_VPROTO: return traverseproto(g, gco2p(o)); + case LUA_VTHREAD: { + lua_State *th = gco2th(o); + linkgclist(th, g->grayagain); /* insert into 'grayagain' list */ + black2gray(o); + return traversethread(g, th); + } + default: lua_assert(0); return 0; + } +} + + +static lu_mem propagateall (global_State *g) { + lu_mem tot = 0; + while (g->gray) + tot += propagatemark(g); + return tot; +} + + +/* +** Traverse all ephemeron tables propagating marks from keys to values. +** Repeat until it converges, that is, nothing new is marked. 'dir' +** inverts the direction of the traversals, trying to speed up +** convergence on chains in the same table. +** +*/ +static void convergeephemerons (global_State *g) { + int changed; + int dir = 0; + do { + GCObject *w; + GCObject *next = g->ephemeron; /* get ephemeron list */ + g->ephemeron = NULL; /* tables may return to this list when traversed */ + changed = 0; + while ((w = next) != NULL) { /* for each ephemeron table */ + next = gco2t(w)->gclist; /* list is rebuilt during loop */ + if (traverseephemeron(g, gco2t(w), dir)) { /* marked some value? */ + propagateall(g); /* propagate changes */ + changed = 1; /* will have to revisit all ephemeron tables */ + } + } + dir = !dir; /* invert direction next time */ + } while (changed); /* repeat until no more changes */ +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Sweep Functions +** ======================================================= +*/ + + +/* +** clear entries with unmarked keys from all weaktables in list 'l' +*/ +static void clearbykeys (global_State *g, GCObject *l) { + for (; l; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *limit = gnodelast(h); + Node *n; + for (n = gnode(h, 0); n < limit; n++) { + if (iscleared(g, gckeyN(n))) /* unmarked key? */ + setempty(gval(n)); /* remove entry */ + if (isempty(gval(n))) /* is entry empty? */ + clearkey(n); /* clear its key */ + } + } +} + + +/* +** clear entries with unmarked values from all weaktables in list 'l' up +** to element 'f' +*/ +static void clearbyvalues (global_State *g, GCObject *l, GCObject *f) { + for (; l != f; l = gco2t(l)->gclist) { + Table *h = gco2t(l); + Node *n, *limit = gnodelast(h); + unsigned int i; + unsigned int asize = luaH_realasize(h); + for (i = 0; i < asize; i++) { + TValue *o = &h->array[i]; + if (iscleared(g, gcvalueN(o))) /* value was collected? */ + setempty(o); /* remove entry */ + } + for (n = gnode(h, 0); n < limit; n++) { + if (iscleared(g, gcvalueN(gval(n)))) /* unmarked value? */ + setempty(gval(n)); /* remove entry */ + if (isempty(gval(n))) /* is entry empty? */ + clearkey(n); /* clear its key */ + } + } +} + + +static void freeupval (lua_State *L, UpVal *uv) { + if (upisopen(uv)) + luaF_unlinkupval(uv); + luaM_free(L, uv); +} + + +static void freeobj (lua_State *L, GCObject *o) { + switch (o->tt) { + case LUA_VPROTO: + luaF_freeproto(L, gco2p(o)); + break; + case LUA_VUPVAL: + freeupval(L, gco2upv(o)); + break; + case LUA_VLCL: + luaM_freemem(L, o, sizeLclosure(gco2lcl(o)->nupvalues)); + break; + case LUA_VCCL: + luaM_freemem(L, o, sizeCclosure(gco2ccl(o)->nupvalues)); + break; + case LUA_VTABLE: + luaH_free(L, gco2t(o)); + break; + case LUA_VTHREAD: + luaE_freethread(L, gco2th(o)); + break; + case LUA_VUSERDATA: { + Udata *u = gco2u(o); + luaM_freemem(L, o, sizeudata(u->nuvalue, u->len)); + break; + } + case LUA_VSHRSTR: + luaS_remove(L, gco2ts(o)); /* remove it from hash table */ + luaM_freemem(L, o, sizelstring(gco2ts(o)->shrlen)); + break; + case LUA_VLNGSTR: + luaM_freemem(L, o, sizelstring(gco2ts(o)->u.lnglen)); + break; + default: lua_assert(0); + } +} + + +/* +** sweep at most 'countin' elements from a list of GCObjects erasing dead +** objects, where a dead object is one marked with the old (non current) +** white; change all non-dead objects back to white, preparing for next +** collection cycle. Return where to continue the traversal or NULL if +** list is finished. ('*countout' gets the number of elements traversed.) +*/ +static GCObject **sweeplist (lua_State *L, GCObject **p, int countin, + int *countout) { + global_State *g = G(L); + int ow = otherwhite(g); + int i; + int white = luaC_white(g); /* current white */ + for (i = 0; *p != NULL && i < countin; i++) { + GCObject *curr = *p; + int marked = curr->marked; + if (isdeadm(ow, marked)) { /* is 'curr' dead? */ + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* change mark to 'white' */ + curr->marked = cast_byte((marked & maskcolors) | white); + p = &curr->next; /* go to next element */ + } + } + if (countout) + *countout = i; /* number of elements traversed */ + return (*p == NULL) ? NULL : p; +} + + +/* +** sweep a list until a live object (or end of list) +*/ +static GCObject **sweeptolive (lua_State *L, GCObject **p) { + GCObject **old = p; + do { + p = sweeplist(L, p, 1, NULL); + } while (p == old); + return p; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Finalization +** ======================================================= +*/ + +/* +** If possible, shrink string table. +*/ +static void checkSizes (lua_State *L, global_State *g) { + if (!g->gcemergency) { + if (g->strt.nuse < g->strt.size / 4) { /* string table too big? */ + l_mem olddebt = g->GCdebt; + luaS_resize(L, g->strt.size / 2); + g->GCestimate += g->GCdebt - olddebt; /* correct estimate */ + } + } +} + + +/* +** Get the next udata to be finalized from the 'tobefnz' list, and +** link it back into the 'allgc' list. +*/ +static GCObject *udata2finalize (global_State *g) { + GCObject *o = g->tobefnz; /* get first element */ + lua_assert(tofinalize(o)); + g->tobefnz = o->next; /* remove it from 'tobefnz' list */ + o->next = g->allgc; /* return it to 'allgc' list */ + g->allgc = o; + resetbit(o->marked, FINALIZEDBIT); /* object is "normal" again */ + if (issweepphase(g)) + makewhite(g, o); /* "sweep" object */ + return o; +} + + +static void dothecall (lua_State *L, void *ud) { + UNUSED(ud); + luaD_callnoyield(L, L->top - 2, 0); +} + + +static void GCTM (lua_State *L) { + global_State *g = G(L); + const TValue *tm; + TValue v; + lua_assert(!g->gcemergency); + setgcovalue(L, &v, udata2finalize(g)); + tm = luaT_gettmbyobj(L, &v, TM_GC); + if (!notm(tm)) { /* is there a finalizer? */ + int status; + lu_byte oldah = L->allowhook; + int running = g->gcrunning; + L->allowhook = 0; /* stop debug hooks during GC metamethod */ + g->gcrunning = 0; /* avoid GC steps */ + setobj2s(L, L->top++, tm); /* push finalizer... */ + setobj2s(L, L->top++, &v); /* ... and its argument */ + L->ci->callstatus |= CIST_FIN; /* will run a finalizer */ + status = luaD_pcall(L, dothecall, NULL, savestack(L, L->top - 2), 0); + L->ci->callstatus &= ~CIST_FIN; /* not running a finalizer anymore */ + L->allowhook = oldah; /* restore hooks */ + g->gcrunning = running; /* restore state */ + if (unlikely(status != LUA_OK)) { /* error while running __gc? */ + luaE_warnerror(L, "__gc metamethod"); + L->top--; /* pops error object */ + } + } +} + + +/* +** Call a few finalizers +*/ +static int runafewfinalizers (lua_State *L, int n) { + global_State *g = G(L); + int i; + for (i = 0; i < n && g->tobefnz; i++) + GCTM(L); /* call one finalizer */ + return i; +} + + +/* +** call all pending finalizers +*/ +static void callallpendingfinalizers (lua_State *L) { + global_State *g = G(L); + while (g->tobefnz) + GCTM(L); +} + + +/* +** find last 'next' field in list 'p' list (to add elements in its end) +*/ +static GCObject **findlast (GCObject **p) { + while (*p != NULL) + p = &(*p)->next; + return p; +} + + +/* +** Move all unreachable objects (or 'all' objects) that need +** finalization from list 'finobj' to list 'tobefnz' (to be finalized). +** (Note that objects after 'finobjold' cannot be white, so they +** don't need to be traversed. In incremental mode, 'finobjold' is NULL, +** so the whole list is traversed.) +*/ +static void separatetobefnz (global_State *g, int all) { + GCObject *curr; + GCObject **p = &g->finobj; + GCObject **lastnext = findlast(&g->tobefnz); + while ((curr = *p) != g->finobjold) { /* traverse all finalizable objects */ + lua_assert(tofinalize(curr)); + if (!(iswhite(curr) || all)) /* not being collected? */ + p = &curr->next; /* don't bother with it */ + else { + if (curr == g->finobjsur) /* removing 'finobjsur'? */ + g->finobjsur = curr->next; /* correct it */ + *p = curr->next; /* remove 'curr' from 'finobj' list */ + curr->next = *lastnext; /* link at the end of 'tobefnz' list */ + *lastnext = curr; + lastnext = &curr->next; + } + } +} + + +/* +** if object 'o' has a finalizer, remove it from 'allgc' list (must +** search the list to find it) and link it in 'finobj' list. +*/ +void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt) { + global_State *g = G(L); + if (tofinalize(o) || /* obj. is already marked... */ + gfasttm(g, mt, TM_GC) == NULL) /* or has no finalizer? */ + return; /* nothing to be done */ + else { /* move 'o' to 'finobj' list */ + GCObject **p; + if (issweepphase(g)) { + makewhite(g, o); /* "sweep" object 'o' */ + if (g->sweepgc == &o->next) /* should not remove 'sweepgc' object */ + g->sweepgc = sweeptolive(L, g->sweepgc); /* change 'sweepgc' */ + } + else { /* correct pointers into 'allgc' list, if needed */ + if (o == g->survival) + g->survival = o->next; + if (o == g->old) + g->old = o->next; + if (o == g->reallyold) + g->reallyold = o->next; + } + /* search for pointer pointing to 'o' */ + for (p = &g->allgc; *p != o; p = &(*p)->next) { /* empty */ } + *p = o->next; /* remove 'o' from 'allgc' list */ + o->next = g->finobj; /* link it in 'finobj' list */ + g->finobj = o; + l_setbit(o->marked, FINALIZEDBIT); /* mark it as such */ + } +} + +/* }====================================================== */ + + +/* +** {====================================================== +** Generational Collector +** ======================================================= +*/ + +static void setpause (global_State *g); + + +/* mask to erase all color bits, not changing gen-related stuff */ +#define maskgencolors (~(bitmask(BLACKBIT) | WHITEBITS)) + + +/* +** Sweep a list of objects, deleting dead ones and turning +** the non dead to old (without changing their colors). +*/ +static void sweep2old (lua_State *L, GCObject **p) { + GCObject *curr; + while ((curr = *p) != NULL) { + if (iswhite(curr)) { /* is 'curr' dead? */ + lua_assert(isdead(G(L), curr)); + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* all surviving objects become old */ + setage(curr, G_OLD); + p = &curr->next; /* go to next element */ + } + } +} + + +/* +** Sweep for generational mode. Delete dead objects. (Because the +** collection is not incremental, there are no "new white" objects +** during the sweep. So, any white object must be dead.) For +** non-dead objects, advance their ages and clear the color of +** new objects. (Old objects keep their colors.) +*/ +static GCObject **sweepgen (lua_State *L, global_State *g, GCObject **p, + GCObject *limit) { + static const lu_byte nextage[] = { + G_SURVIVAL, /* from G_NEW */ + G_OLD1, /* from G_SURVIVAL */ + G_OLD1, /* from G_OLD0 */ + G_OLD, /* from G_OLD1 */ + G_OLD, /* from G_OLD (do not change) */ + G_TOUCHED1, /* from G_TOUCHED1 (do not change) */ + G_TOUCHED2 /* from G_TOUCHED2 (do not change) */ + }; + int white = luaC_white(g); + GCObject *curr; + while ((curr = *p) != limit) { + if (iswhite(curr)) { /* is 'curr' dead? */ + lua_assert(!isold(curr) && isdead(g, curr)); + *p = curr->next; /* remove 'curr' from list */ + freeobj(L, curr); /* erase 'curr' */ + } + else { /* correct mark and age */ + if (getage(curr) == G_NEW) + curr->marked = cast_byte((curr->marked & maskgencolors) | white); + setage(curr, nextage[getage(curr)]); + p = &curr->next; /* go to next element */ + } + } + return p; +} + + +/* +** Traverse a list making all its elements white and clearing their +** age. +*/ +static void whitelist (global_State *g, GCObject *p) { + int white = luaC_white(g); + for (; p != NULL; p = p->next) + p->marked = cast_byte((p->marked & maskcolors) | white); +} + + +/* +** Correct a list of gray objects. +** Because this correction is done after sweeping, young objects might +** be turned white and still be in the list. They are only removed. +** For tables and userdata, advance 'touched1' to 'touched2'; 'touched2' +** objects become regular old and are removed from the list. +** For threads, just remove white ones from the list. +*/ +static GCObject **correctgraylist (GCObject **p) { + GCObject *curr; + while ((curr = *p) != NULL) { + switch (curr->tt) { + case LUA_VTABLE: case LUA_VUSERDATA: { + GCObject **next = getgclist(curr); + if (getage(curr) == G_TOUCHED1) { /* touched in this cycle? */ + lua_assert(isgray(curr)); + gray2black(curr); /* make it black, for next barrier */ + changeage(curr, G_TOUCHED1, G_TOUCHED2); + p = next; /* go to next element */ + } + else { /* not touched in this cycle */ + if (!iswhite(curr)) { /* not white? */ + lua_assert(isold(curr)); + if (getage(curr) == G_TOUCHED2) /* advance from G_TOUCHED2... */ + changeage(curr, G_TOUCHED2, G_OLD); /* ... to G_OLD */ + gray2black(curr); /* make it black */ + } + /* else, object is white: just remove it from this list */ + *p = *next; /* remove 'curr' from gray list */ + } + break; + } + case LUA_VTHREAD: { + lua_State *th = gco2th(curr); + lua_assert(!isblack(th)); + if (iswhite(th)) /* new object? */ + *p = th->gclist; /* remove from gray list */ + else /* old threads remain gray */ + p = &th->gclist; /* go to next element */ + break; + } + default: lua_assert(0); /* nothing more could be gray here */ + } + } + return p; +} + + +/* +** Correct all gray lists, coalescing them into 'grayagain'. +*/ +static void correctgraylists (global_State *g) { + GCObject **list = correctgraylist(&g->grayagain); + *list = g->weak; g->weak = NULL; + list = correctgraylist(list); + *list = g->allweak; g->allweak = NULL; + list = correctgraylist(list); + *list = g->ephemeron; g->ephemeron = NULL; + correctgraylist(list); +} + + +/* +** Mark 'OLD1' objects when starting a new young collection. +** Gray objects are already in some gray list, and so will be visited +** in the atomic step. +*/ +static void markold (global_State *g, GCObject *from, GCObject *to) { + GCObject *p; + for (p = from; p != to; p = p->next) { + if (getage(p) == G_OLD1) { + lua_assert(!iswhite(p)); + if (isblack(p)) { + black2gray(p); /* should be '2white', but gray works too */ + reallymarkobject(g, p); + } + } + } +} + + +/* +** Finish a young-generation collection. +*/ +static void finishgencycle (lua_State *L, global_State *g) { + correctgraylists(g); + checkSizes(L, g); + g->gcstate = GCSpropagate; /* skip restart */ + if (!g->gcemergency) + callallpendingfinalizers(L); +} + + +/* +** Does a young collection. First, mark 'OLD1' objects. (Only survival +** and "recent old" lists can contain 'OLD1' objects. New lists cannot +** contain 'OLD1' objects, at most 'OLD0' objects that were already +** visited when marked old.) Then does the atomic step. Then, +** sweep all lists and advance pointers. Finally, finish the collection. +*/ +static void youngcollection (lua_State *L, global_State *g) { + GCObject **psurvival; /* to point to first non-dead survival object */ + lua_assert(g->gcstate == GCSpropagate); + markold(g, g->survival, g->reallyold); + markold(g, g->finobj, g->finobjrold); + atomic(L); + + /* sweep nursery and get a pointer to its last live element */ + psurvival = sweepgen(L, g, &g->allgc, g->survival); + /* sweep 'survival' and 'old' */ + sweepgen(L, g, psurvival, g->reallyold); + g->reallyold = g->old; + g->old = *psurvival; /* 'survival' survivals are old now */ + g->survival = g->allgc; /* all news are survivals */ + + /* repeat for 'finobj' lists */ + psurvival = sweepgen(L, g, &g->finobj, g->finobjsur); + /* sweep 'survival' and 'old' */ + sweepgen(L, g, psurvival, g->finobjrold); + g->finobjrold = g->finobjold; + g->finobjold = *psurvival; /* 'survival' survivals are old now */ + g->finobjsur = g->finobj; /* all news are survivals */ + + sweepgen(L, g, &g->tobefnz, NULL); + + finishgencycle(L, g); +} + + +static void atomic2gen (lua_State *L, global_State *g) { + /* sweep all elements making them old */ + sweep2old(L, &g->allgc); + /* everything alive now is old */ + g->reallyold = g->old = g->survival = g->allgc; + + /* repeat for 'finobj' lists */ + sweep2old(L, &g->finobj); + g->finobjrold = g->finobjold = g->finobjsur = g->finobj; + + sweep2old(L, &g->tobefnz); + + g->gckind = KGC_GEN; + g->lastatomic = 0; + g->GCestimate = gettotalbytes(g); /* base for memory control */ + finishgencycle(L, g); +} + + +/* +** Enter generational mode. Must go until the end of an atomic cycle +** to ensure that all threads and weak tables are in the gray lists. +** Then, turn all objects into old and finishes the collection. +*/ +static lu_mem entergen (lua_State *L, global_State *g) { + lu_mem numobjs; + luaC_runtilstate(L, bitmask(GCSpause)); /* prepare to start a new cycle */ + luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ + numobjs = atomic(L); /* propagates all and then do the atomic stuff */ + atomic2gen(L, g); + return numobjs; +} + + +/* +** Enter incremental mode. Turn all objects white, make all +** intermediate lists point to NULL (to avoid invalid pointers), +** and go to the pause state. +*/ +static void enterinc (global_State *g) { + whitelist(g, g->allgc); + g->reallyold = g->old = g->survival = NULL; + whitelist(g, g->finobj); + whitelist(g, g->tobefnz); + g->finobjrold = g->finobjold = g->finobjsur = NULL; + g->gcstate = GCSpause; + g->gckind = KGC_INC; + g->lastatomic = 0; +} + + +/* +** Change collector mode to 'newmode'. +*/ +void luaC_changemode (lua_State *L, int newmode) { + global_State *g = G(L); + if (newmode != g->gckind) { + if (newmode == KGC_GEN) /* entering generational mode? */ + entergen(L, g); + else + enterinc(g); /* entering incremental mode */ + } + g->lastatomic = 0; +} + + +/* +** Does a full collection in generational mode. +*/ +static lu_mem fullgen (lua_State *L, global_State *g) { + enterinc(g); + return entergen(L, g); +} + + +/* +** Set debt for the next minor collection, which will happen when +** memory grows 'genminormul'%. +*/ +static void setminordebt (global_State *g) { + luaE_setdebt(g, -(cast(l_mem, (gettotalbytes(g) / 100)) * g->genminormul)); +} + + +/* +** Does a major collection after last collection was a "bad collection". +** +** When the program is building a big structure, it allocates lots of +** memory but generates very little garbage. In those scenarios, +** the generational mode just wastes time doing small collections, and +** major collections are frequently what we call a "bad collection", a +** collection that frees too few objects. To avoid the cost of switching +** between generational mode and the incremental mode needed for full +** (major) collections, the collector tries to stay in incremental mode +** after a bad collection, and to switch back to generational mode only +** after a "good" collection (one that traverses less than 9/8 objects +** of the previous one). +** The collector must choose whether to stay in incremental mode or to +** switch back to generational mode before sweeping. At this point, it +** does not know the real memory in use, so it cannot use memory to +** decide whether to return to generational mode. Instead, it uses the +** number of objects traversed (returned by 'atomic') as a proxy. The +** field 'g->lastatomic' keeps this count from the last collection. +** ('g->lastatomic != 0' also means that the last collection was bad.) +*/ +static void stepgenfull (lua_State *L, global_State *g) { + lu_mem newatomic; /* count of traversed objects */ + lu_mem lastatomic = g->lastatomic; /* count from last collection */ + if (g->gckind == KGC_GEN) /* still in generational mode? */ + enterinc(g); /* enter incremental mode */ + luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */ + newatomic = atomic(L); /* mark everybody */ + if (newatomic < lastatomic + (lastatomic >> 3)) { /* good collection? */ + atomic2gen(L, g); /* return to generational mode */ + setminordebt(g); + } + else { /* another bad collection; stay in incremental mode */ + g->GCestimate = gettotalbytes(g); /* first estimate */; + entersweep(L); + luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + setpause(g); + g->lastatomic = newatomic; + } +} + + +/* +** Does a generational "step". +** Usually, this means doing a minor collection and setting the debt to +** make another collection when memory grows 'genminormul'% larger. +** +** However, there are exceptions. If memory grows 'genmajormul'% +** larger than it was at the end of the last major collection (kept +** in 'g->GCestimate'), the function does a major collection. At the +** end, it checks whether the major collection was able to free a +** decent amount of memory (at least half the growth in memory since +** previous major collection). If so, the collector keeps its state, +** and the next collection will probably be minor again. Otherwise, +** we have what we call a "bad collection". In that case, set the field +** 'g->lastatomic' to signal that fact, so that the next collection will +** go to 'stepgenfull'. +** +** 'GCdebt <= 0' means an explicit call to GC step with "size" zero; +** in that case, do a minor collection. +*/ +static void genstep (lua_State *L, global_State *g) { + if (g->lastatomic != 0) /* last collection was a bad one? */ + stepgenfull(L, g); /* do a full step */ + else { + lu_mem majorbase = g->GCestimate; /* memory after last major collection */ + lu_mem majorinc = (majorbase / 100) * getgcparam(g->genmajormul); + if (g->GCdebt > 0 && gettotalbytes(g) > majorbase + majorinc) { + lu_mem numobjs = fullgen(L, g); /* do a major collection */ + if (gettotalbytes(g) < majorbase + (majorinc / 2)) { + /* collected at least half of memory growth since last major + collection; keep doing minor collections */ + setminordebt(g); + } + else { /* bad collection */ + g->lastatomic = numobjs; /* signal that last collection was bad */ + setpause(g); /* do a long wait for next (major) collection */ + } + } + else { /* regular case; do a minor collection */ + youngcollection(L, g); + setminordebt(g); + g->GCestimate = majorbase; /* preserve base value */ + } + } + lua_assert(isdecGCmodegen(g)); +} + +/* }====================================================== */ + + +/* +** {====================================================== +** GC control +** ======================================================= +*/ + + +/* +** Set the "time" to wait before starting a new GC cycle; cycle will +** start when memory use hits the threshold of ('estimate' * pause / +** PAUSEADJ). (Division by 'estimate' should be OK: it cannot be zero, +** because Lua cannot even start with less than PAUSEADJ bytes). +*/ +static void setpause (global_State *g) { + l_mem threshold, debt; + int pause = getgcparam(g->gcpause); + l_mem estimate = g->GCestimate / PAUSEADJ; /* adjust 'estimate' */ + lua_assert(estimate > 0); + threshold = (pause < MAX_LMEM / estimate) /* overflow? */ + ? estimate * pause /* no overflow */ + : MAX_LMEM; /* overflow; truncate to maximum */ + debt = gettotalbytes(g) - threshold; + if (debt > 0) debt = 0; + luaE_setdebt(g, debt); +} + + +/* +** Enter first sweep phase. +** The call to 'sweeptolive' makes the pointer point to an object +** inside the list (instead of to the header), so that the real sweep do +** not need to skip objects created between "now" and the start of the +** real sweep. +*/ +static void entersweep (lua_State *L) { + global_State *g = G(L); + g->gcstate = GCSswpallgc; + lua_assert(g->sweepgc == NULL); + g->sweepgc = sweeptolive(L, &g->allgc); +} + + +/* +** Delete all objects in list 'p' until (but not including) object +** 'limit'. +*/ +static void deletelist (lua_State *L, GCObject *p, GCObject *limit) { + while (p != limit) { + GCObject *next = p->next; + freeobj(L, p); + p = next; + } +} + + +/* +** Call all finalizers of the objects in the given Lua state, and +** then free all objects, except for the main thread. +*/ +void luaC_freeallobjects (lua_State *L) { + global_State *g = G(L); + luaC_changemode(L, KGC_INC); + separatetobefnz(g, 1); /* separate all objects with finalizers */ + lua_assert(g->finobj == NULL); + callallpendingfinalizers(L); + deletelist(L, g->allgc, obj2gco(g->mainthread)); + deletelist(L, g->finobj, NULL); + deletelist(L, g->fixedgc, NULL); /* collect fixed objects */ + lua_assert(g->strt.nuse == 0); +} + + +static lu_mem atomic (lua_State *L) { + global_State *g = G(L); + lu_mem work = 0; + GCObject *origweak, *origall; + GCObject *grayagain = g->grayagain; /* save original list */ + g->grayagain = NULL; + lua_assert(g->ephemeron == NULL && g->weak == NULL); + lua_assert(!iswhite(g->mainthread)); + g->gcstate = GCSatomic; + markobject(g, L); /* mark running thread */ + /* registry and global metatables may be changed by API */ + markvalue(g, &g->l_registry); + markmt(g); /* mark global metatables */ + work += propagateall(g); /* empties 'gray' list */ + /* remark occasional upvalues of (maybe) dead threads */ + work += remarkupvals(g); + work += propagateall(g); /* propagate changes */ + g->gray = grayagain; + work += propagateall(g); /* traverse 'grayagain' list */ + convergeephemerons(g); + /* at this point, all strongly accessible objects are marked. */ + /* Clear values from weak tables, before checking finalizers */ + clearbyvalues(g, g->weak, NULL); + clearbyvalues(g, g->allweak, NULL); + origweak = g->weak; origall = g->allweak; + separatetobefnz(g, 0); /* separate objects to be finalized */ + work += markbeingfnz(g); /* mark objects that will be finalized */ + work += propagateall(g); /* remark, to propagate 'resurrection' */ + convergeephemerons(g); + /* at this point, all resurrected objects are marked. */ + /* remove dead objects from weak tables */ + clearbykeys(g, g->ephemeron); /* clear keys from all ephemeron tables */ + clearbykeys(g, g->allweak); /* clear keys from all 'allweak' tables */ + /* clear values from resurrected weak tables */ + clearbyvalues(g, g->weak, origweak); + clearbyvalues(g, g->allweak, origall); + luaS_clearcache(g); + g->currentwhite = cast_byte(otherwhite(g)); /* flip current white */ + lua_assert(g->gray == NULL); + return work; /* estimate of slots marked by 'atomic' */ +} + + +static int sweepstep (lua_State *L, global_State *g, + int nextstate, GCObject **nextlist) { + if (g->sweepgc) { + l_mem olddebt = g->GCdebt; + int count; + g->sweepgc = sweeplist(L, g->sweepgc, GCSWEEPMAX, &count); + g->GCestimate += g->GCdebt - olddebt; /* update estimate */ + return count; + } + else { /* enter next state */ + g->gcstate = nextstate; + g->sweepgc = nextlist; + return 0; /* no work done */ + } +} + + +static lu_mem singlestep (lua_State *L) { + global_State *g = G(L); + switch (g->gcstate) { + case GCSpause: { + restartcollection(g); + g->gcstate = GCSpropagate; + return 1; + } + case GCSpropagate: { + if (g->gray == NULL) { /* no more gray objects? */ + g->gcstate = GCSenteratomic; /* finish propagate phase */ + return 0; + } + else + return propagatemark(g); /* traverse one gray object */ + } + case GCSenteratomic: { + lu_mem work = atomic(L); /* work is what was traversed by 'atomic' */ + entersweep(L); + g->GCestimate = gettotalbytes(g); /* first estimate */; + return work; + } + case GCSswpallgc: { /* sweep "regular" objects */ + return sweepstep(L, g, GCSswpfinobj, &g->finobj); + } + case GCSswpfinobj: { /* sweep objects with finalizers */ + return sweepstep(L, g, GCSswptobefnz, &g->tobefnz); + } + case GCSswptobefnz: { /* sweep objects to be finalized */ + return sweepstep(L, g, GCSswpend, NULL); + } + case GCSswpend: { /* finish sweeps */ + checkSizes(L, g); + g->gcstate = GCScallfin; + return 0; + } + case GCScallfin: { /* call remaining finalizers */ + if (g->tobefnz && !g->gcemergency) { + int n = runafewfinalizers(L, GCFINMAX); + return n * GCFINALIZECOST; + } + else { /* emergency mode or no more finalizers */ + g->gcstate = GCSpause; /* finish collection */ + return 0; + } + } + default: lua_assert(0); return 0; + } +} + + +/* +** advances the garbage collector until it reaches a state allowed +** by 'statemask' +*/ +void luaC_runtilstate (lua_State *L, int statesmask) { + global_State *g = G(L); + while (!testbit(statesmask, g->gcstate)) + singlestep(L); +} + + +/* +** Performs a basic incremental step. The debt and step size are +** converted from bytes to "units of work"; then the function loops +** running single steps until adding that many units of work or +** finishing a cycle (pause state). Finally, it sets the debt that +** controls when next step will be performed. +*/ +static void incstep (lua_State *L, global_State *g) { + int stepmul = (getgcparam(g->gcstepmul) | 1); /* avoid division by 0 */ + l_mem debt = (g->GCdebt / WORK2MEM) * stepmul; + l_mem stepsize = (g->gcstepsize <= log2maxs(l_mem)) + ? ((cast(l_mem, 1) << g->gcstepsize) / WORK2MEM) * stepmul + : MAX_LMEM; /* overflow; keep maximum value */ + do { /* repeat until pause or enough "credit" (negative debt) */ + lu_mem work = singlestep(L); /* perform one single step */ + debt -= work; + } while (debt > -stepsize && g->gcstate != GCSpause); + if (g->gcstate == GCSpause) + setpause(g); /* pause until next cycle */ + else { + debt = (debt / stepmul) * WORK2MEM; /* convert 'work units' to bytes */ + luaE_setdebt(g, debt); + } +} + +/* +** performs a basic GC step if collector is running +*/ +void luaC_step (lua_State *L) { + global_State *g = G(L); + lua_assert(!g->gcemergency); + if (g->gcrunning) { /* running? */ + if(isdecGCmodegen(g)) + genstep(L, g); + else + incstep(L, g); + } +} + + +/* +** Perform a full collection in incremental mode. +** Before running the collection, check 'keepinvariant'; if it is true, +** there may be some objects marked as black, so the collector has +** to sweep all objects to turn them back to white (as white has not +** changed, nothing will be collected). +*/ +static void fullinc (lua_State *L, global_State *g) { + if (keepinvariant(g)) /* black objects? */ + entersweep(L); /* sweep everything to turn them back to white */ + /* finish any pending sweep phase to start a new cycle */ + luaC_runtilstate(L, bitmask(GCSpause)); + luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */ + /* estimate must be correct after a full GC cycle */ + lua_assert(g->GCestimate == gettotalbytes(g)); + luaC_runtilstate(L, bitmask(GCSpause)); /* finish collection */ + setpause(g); +} + + +/* +** Performs a full GC cycle; if 'isemergency', set a flag to avoid +** some operations which could change the interpreter state in some +** unexpected ways (running finalizers and shrinking some structures). +*/ +void luaC_fullgc (lua_State *L, int isemergency) { + global_State *g = G(L); + lua_assert(!g->gcemergency); + g->gcemergency = isemergency; /* set flag */ + if (g->gckind == KGC_INC) + fullinc(L, g); + else + fullgen(L, g); + g->gcemergency = 0; +} + +/* }====================================================== */ + + diff --git a/lua-5.4.0/src/lgc.h b/lua-5.4.0/src/lgc.h new file mode 100644 index 0000000..b972472 --- /dev/null +++ b/lua-5.4.0/src/lgc.h @@ -0,0 +1,186 @@ +/* +** $Id: lgc.h $ +** Garbage Collector +** See Copyright Notice in lua.h +*/ + +#ifndef lgc_h +#define lgc_h + + +#include "lobject.h" +#include "lstate.h" + +/* +** Collectable objects may have one of three colors: white, which +** means the object is not marked; gray, which means the +** object is marked, but its references may be not marked; and +** black, which means that the object and all its references are marked. +** The main invariant of the garbage collector, while marking objects, +** is that a black object can never point to a white one. Moreover, +** any gray object must be in a "gray list" (gray, grayagain, weak, +** allweak, ephemeron) so that it can be visited again before finishing +** the collection cycle. These lists have no meaning when the invariant +** is not being enforced (e.g., sweep phase). +*/ + + +/* +** Possible states of the Garbage Collector +*/ +#define GCSpropagate 0 +#define GCSenteratomic 1 +#define GCSatomic 2 +#define GCSswpallgc 3 +#define GCSswpfinobj 4 +#define GCSswptobefnz 5 +#define GCSswpend 6 +#define GCScallfin 7 +#define GCSpause 8 + + +#define issweepphase(g) \ + (GCSswpallgc <= (g)->gcstate && (g)->gcstate <= GCSswpend) + + +/* +** macro to tell when main invariant (white objects cannot point to black +** ones) must be kept. During a collection, the sweep +** phase may break the invariant, as objects turned white may point to +** still-black objects. The invariant is restored when sweep ends and +** all objects are white again. +*/ + +#define keepinvariant(g) ((g)->gcstate <= GCSatomic) + + +/* +** some useful bit tricks +*/ +#define resetbits(x,m) ((x) &= cast_byte(~(m))) +#define setbits(x,m) ((x) |= (m)) +#define testbits(x,m) ((x) & (m)) +#define bitmask(b) (1<<(b)) +#define bit2mask(b1,b2) (bitmask(b1) | bitmask(b2)) +#define l_setbit(x,b) setbits(x, bitmask(b)) +#define resetbit(x,b) resetbits(x, bitmask(b)) +#define testbit(x,b) testbits(x, bitmask(b)) + + +/* +** Layout for bit use in 'marked' field. First three bits are +** used for object "age" in generational mode. Last bit is free +** to be used by respective objects. +*/ +#define WHITE0BIT 3 /* object is white (type 0) */ +#define WHITE1BIT 4 /* object is white (type 1) */ +#define BLACKBIT 5 /* object is black */ +#define FINALIZEDBIT 6 /* object has been marked for finalization */ + + + +#define WHITEBITS bit2mask(WHITE0BIT, WHITE1BIT) + + +#define iswhite(x) testbits((x)->marked, WHITEBITS) +#define isblack(x) testbit((x)->marked, BLACKBIT) +#define isgray(x) /* neither white nor black */ \ + (!testbits((x)->marked, WHITEBITS | bitmask(BLACKBIT))) + +#define tofinalize(x) testbit((x)->marked, FINALIZEDBIT) + +#define otherwhite(g) ((g)->currentwhite ^ WHITEBITS) +#define isdeadm(ow,m) ((m) & (ow)) +#define isdead(g,v) isdeadm(otherwhite(g), (v)->marked) + +#define changewhite(x) ((x)->marked ^= WHITEBITS) +#define gray2black(x) l_setbit((x)->marked, BLACKBIT) + +#define luaC_white(g) cast_byte((g)->currentwhite & WHITEBITS) + + +/* object age in generational mode */ +#define G_NEW 0 /* created in current cycle */ +#define G_SURVIVAL 1 /* created in previous cycle */ +#define G_OLD0 2 /* marked old by frw. barrier in this cycle */ +#define G_OLD1 3 /* first full cycle as old */ +#define G_OLD 4 /* really old object (not to be visited) */ +#define G_TOUCHED1 5 /* old object touched this cycle */ +#define G_TOUCHED2 6 /* old object touched in previous cycle */ + +#define AGEBITS 7 /* all age bits (111) */ + +#define getage(o) ((o)->marked & AGEBITS) +#define setage(o,a) ((o)->marked = cast_byte(((o)->marked & (~AGEBITS)) | a)) +#define isold(o) (getage(o) > G_SURVIVAL) + +#define changeage(o,f,t) \ + check_exp(getage(o) == (f), (o)->marked ^= ((f)^(t))) + + +/* Default Values for GC parameters */ +#define LUAI_GENMAJORMUL 100 +#define LUAI_GENMINORMUL 20 + +/* wait memory to double before starting new cycle */ +#define LUAI_GCPAUSE 200 + +/* +** some gc parameters are stored divided by 4 to allow a maximum value +** up to 1023 in a 'lu_byte'. +*/ +#define getgcparam(p) ((p) * 4) +#define setgcparam(p,v) ((p) = (v) / 4) + +#define LUAI_GCMUL 100 + +/* how much to allocate before next GC step (log2) */ +#define LUAI_GCSTEPSIZE 13 /* 8 KB */ + + +/* +** Check whether the declared GC mode is generational. While in +** generational mode, the collector can go temporarily to incremental +** mode to improve performance. This is signaled by 'g->lastatomic != 0'. +*/ +#define isdecGCmodegen(g) (g->gckind == KGC_GEN || g->lastatomic != 0) + +/* +** Does one step of collection when debt becomes positive. 'pre'/'pos' +** allows some adjustments to be done only when needed. macro +** 'condchangemem' is used only for heavy tests (forcing a full +** GC cycle on every opportunity) +*/ +#define luaC_condGC(L,pre,pos) \ + { if (G(L)->GCdebt > 0) { pre; luaC_step(L); pos;}; \ + condchangemem(L,pre,pos); } + +/* more often than not, 'pre'/'pos' are empty */ +#define luaC_checkGC(L) luaC_condGC(L,(void)0,(void)0) + + +#define luaC_barrier(L,p,v) ( \ + (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \ + luaC_barrier_(L,obj2gco(p),gcvalue(v)) : cast_void(0)) + +#define luaC_barrierback(L,p,v) ( \ + (iscollectable(v) && isblack(p) && iswhite(gcvalue(v))) ? \ + luaC_barrierback_(L,p) : cast_void(0)) + +#define luaC_objbarrier(L,p,o) ( \ + (isblack(p) && iswhite(o)) ? \ + luaC_barrier_(L,obj2gco(p),obj2gco(o)) : cast_void(0)) + +LUAI_FUNC void luaC_fix (lua_State *L, GCObject *o); +LUAI_FUNC void luaC_freeallobjects (lua_State *L); +LUAI_FUNC void luaC_step (lua_State *L); +LUAI_FUNC void luaC_runtilstate (lua_State *L, int statesmask); +LUAI_FUNC void luaC_fullgc (lua_State *L, int isemergency); +LUAI_FUNC GCObject *luaC_newobj (lua_State *L, int tt, size_t sz); +LUAI_FUNC void luaC_barrier_ (lua_State *L, GCObject *o, GCObject *v); +LUAI_FUNC void luaC_barrierback_ (lua_State *L, GCObject *o); +LUAI_FUNC void luaC_checkfinalizer (lua_State *L, GCObject *o, Table *mt); +LUAI_FUNC void luaC_changemode (lua_State *L, int newmode); + + +#endif diff --git a/lua-5.4.0/src/linit.c b/lua-5.4.0/src/linit.c new file mode 100644 index 0000000..69808f8 --- /dev/null +++ b/lua-5.4.0/src/linit.c @@ -0,0 +1,65 @@ +/* +** $Id: linit.c $ +** Initialization of libraries for lua.c and other clients +** See Copyright Notice in lua.h +*/ + + +#define linit_c +#define LUA_LIB + +/* +** If you embed Lua in your program and need to open the standard +** libraries, call luaL_openlibs in your program. If you need a +** different set of libraries, copy this file to your project and edit +** it to suit your needs. +** +** You can also *preload* libraries, so that a later 'require' can +** open the library, which is already linked to the application. +** For that, do the following code: +** +** luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); +** lua_pushcfunction(L, luaopen_modname); +** lua_setfield(L, -2, modname); +** lua_pop(L, 1); // remove PRELOAD table +*/ + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "lualib.h" +#include "lauxlib.h" + + +/* +** these libs are loaded by lua.c and are readily available to any Lua +** program +*/ +static const luaL_Reg loadedlibs[] = { + {LUA_GNAME, luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_COLIBNAME, luaopen_coroutine}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_UTF8LIBNAME, luaopen_utf8}, + {LUA_DBLIBNAME, luaopen_debug}, + {NULL, NULL} +}; + + +LUALIB_API void luaL_openlibs (lua_State *L) { + const luaL_Reg *lib; + /* "require" functions from 'loadedlibs' and set results to global table */ + for (lib = loadedlibs; lib->func; lib++) { + luaL_requiref(L, lib->name, lib->func, 1); + lua_pop(L, 1); /* remove lib */ + } +} + diff --git a/lua-5.4.0/src/liolib.c b/lua-5.4.0/src/liolib.c new file mode 100644 index 0000000..7ac3444 --- /dev/null +++ b/lua-5.4.0/src/liolib.c @@ -0,0 +1,814 @@ +/* +** $Id: liolib.c $ +** Standard I/O (and system) library +** See Copyright Notice in lua.h +*/ + +#define liolib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + + + +/* +** Change this macro to accept other modes for 'fopen' besides +** the standard ones. +*/ +#if !defined(l_checkmode) + +/* accepted extensions to 'mode' in 'fopen' */ +#if !defined(L_MODEEXT) +#define L_MODEEXT "b" +#endif + +/* Check whether 'mode' matches '[rwa]%+?[L_MODEEXT]*' */ +static int l_checkmode (const char *mode) { + return (*mode != '\0' && strchr("rwa", *(mode++)) != NULL && + (*mode != '+' || ((void)(++mode), 1)) && /* skip if char is '+' */ + (strspn(mode, L_MODEEXT) == strlen(mode))); /* check extensions */ +} + +#endif + +/* +** {====================================================== +** l_popen spawns a new process connected to the current +** one through the file streams. +** ======================================================= +*/ + +#if !defined(l_popen) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_popen(L,c,m) (fflush(NULL), popen(c,m)) +#define l_pclose(L,file) (pclose(file)) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#define l_popen(L,c,m) (_popen(c,m)) +#define l_pclose(L,file) (_pclose(file)) + +#else /* }{ */ + +/* ISO C definitions */ +#define l_popen(L,c,m) \ + ((void)c, (void)m, \ + luaL_error(L, "'popen' not supported"), \ + (FILE*)0) +#define l_pclose(L,file) ((void)L, (void)file, -1) + +#endif /* } */ + +#endif /* } */ + +/* }====================================================== */ + + +#if !defined(l_getc) /* { */ + +#if defined(LUA_USE_POSIX) +#define l_getc(f) getc_unlocked(f) +#define l_lockfile(f) flockfile(f) +#define l_unlockfile(f) funlockfile(f) +#else +#define l_getc(f) getc(f) +#define l_lockfile(f) ((void)0) +#define l_unlockfile(f) ((void)0) +#endif + +#endif /* } */ + + +/* +** {====================================================== +** l_fseek: configuration for longer offsets +** ======================================================= +*/ + +#if !defined(l_fseek) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include + +#define l_fseek(f,o,w) fseeko(f,o,w) +#define l_ftell(f) ftello(f) +#define l_seeknum off_t + +#elif defined(LUA_USE_WINDOWS) && !defined(_CRTIMP_TYPEINFO) \ + && defined(_MSC_VER) && (_MSC_VER >= 1400) /* }{ */ + +/* Windows (but not DDK) and Visual C++ 2005 or higher */ +#define l_fseek(f,o,w) _fseeki64(f,o,w) +#define l_ftell(f) _ftelli64(f) +#define l_seeknum __int64 + +#else /* }{ */ + +/* ISO C definitions */ +#define l_fseek(f,o,w) fseek(f,o,w) +#define l_ftell(f) ftell(f) +#define l_seeknum long + +#endif /* } */ + +#endif /* } */ + +/* }====================================================== */ + + + +#define IO_PREFIX "_IO_" +#define IOPREF_LEN (sizeof(IO_PREFIX)/sizeof(char) - 1) +#define IO_INPUT (IO_PREFIX "input") +#define IO_OUTPUT (IO_PREFIX "output") + + +typedef luaL_Stream LStream; + + +#define tolstream(L) ((LStream *)luaL_checkudata(L, 1, LUA_FILEHANDLE)) + +#define isclosed(p) ((p)->closef == NULL) + + +static int io_type (lua_State *L) { + LStream *p; + luaL_checkany(L, 1); + p = (LStream *)luaL_testudata(L, 1, LUA_FILEHANDLE); + if (p == NULL) + luaL_pushfail(L); /* not a file */ + else if (isclosed(p)) + lua_pushliteral(L, "closed file"); + else + lua_pushliteral(L, "file"); + return 1; +} + + +static int f_tostring (lua_State *L) { + LStream *p = tolstream(L); + if (isclosed(p)) + lua_pushliteral(L, "file (closed)"); + else + lua_pushfstring(L, "file (%p)", p->f); + return 1; +} + + +static FILE *tofile (lua_State *L) { + LStream *p = tolstream(L); + if (isclosed(p)) + luaL_error(L, "attempt to use a closed file"); + lua_assert(p->f); + return p->f; +} + + +/* +** When creating file handles, always creates a 'closed' file handle +** before opening the actual file; so, if there is a memory error, the +** handle is in a consistent state. +*/ +static LStream *newprefile (lua_State *L) { + LStream *p = (LStream *)lua_newuserdatauv(L, sizeof(LStream), 0); + p->closef = NULL; /* mark file handle as 'closed' */ + luaL_setmetatable(L, LUA_FILEHANDLE); + return p; +} + + +/* +** Calls the 'close' function from a file handle. The 'volatile' avoids +** a bug in some versions of the Clang compiler (e.g., clang 3.0 for +** 32 bits). +*/ +static int aux_close (lua_State *L) { + LStream *p = tolstream(L); + volatile lua_CFunction cf = p->closef; + p->closef = NULL; /* mark stream as closed */ + return (*cf)(L); /* close it */ +} + + +static int f_close (lua_State *L) { + tofile(L); /* make sure argument is an open stream */ + return aux_close(L); +} + + +static int io_close (lua_State *L) { + if (lua_isnone(L, 1)) /* no argument? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_OUTPUT); /* use default output */ + return f_close(L); +} + + +static int f_gc (lua_State *L) { + LStream *p = tolstream(L); + if (!isclosed(p) && p->f != NULL) + aux_close(L); /* ignore closed and incompletely open files */ + return 0; +} + + +/* +** function to close regular files +*/ +static int io_fclose (lua_State *L) { + LStream *p = tolstream(L); + int res = fclose(p->f); + return luaL_fileresult(L, (res == 0), NULL); +} + + +static LStream *newfile (lua_State *L) { + LStream *p = newprefile(L); + p->f = NULL; + p->closef = &io_fclose; + return p; +} + + +static void opencheck (lua_State *L, const char *fname, const char *mode) { + LStream *p = newfile(L); + p->f = fopen(fname, mode); + if (p->f == NULL) + luaL_error(L, "cannot open file '%s' (%s)", fname, strerror(errno)); +} + + +static int io_open (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newfile(L); + const char *md = mode; /* to traverse/check mode */ + luaL_argcheck(L, l_checkmode(md), 2, "invalid mode"); + p->f = fopen(filename, mode); + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +/* +** function to close 'popen' files +*/ +static int io_pclose (lua_State *L) { + LStream *p = tolstream(L); + errno = 0; + return luaL_execresult(L, l_pclose(L, p->f)); +} + + +static int io_popen (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + const char *mode = luaL_optstring(L, 2, "r"); + LStream *p = newprefile(L); + p->f = l_popen(L, filename, mode); + p->closef = &io_pclose; + return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1; +} + + +static int io_tmpfile (lua_State *L) { + LStream *p = newfile(L); + p->f = tmpfile(); + return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1; +} + + +static FILE *getiofile (lua_State *L, const char *findex) { + LStream *p; + lua_getfield(L, LUA_REGISTRYINDEX, findex); + p = (LStream *)lua_touserdata(L, -1); + if (isclosed(p)) + luaL_error(L, "default %s file is closed", findex + IOPREF_LEN); + return p->f; +} + + +static int g_iofile (lua_State *L, const char *f, const char *mode) { + if (!lua_isnoneornil(L, 1)) { + const char *filename = lua_tostring(L, 1); + if (filename) + opencheck(L, filename, mode); + else { + tofile(L); /* check that it's a valid file handle */ + lua_pushvalue(L, 1); + } + lua_setfield(L, LUA_REGISTRYINDEX, f); + } + /* return current value */ + lua_getfield(L, LUA_REGISTRYINDEX, f); + return 1; +} + + +static int io_input (lua_State *L) { + return g_iofile(L, IO_INPUT, "r"); +} + + +static int io_output (lua_State *L) { + return g_iofile(L, IO_OUTPUT, "w"); +} + + +static int io_readline (lua_State *L); + + +/* +** maximum number of arguments to 'f:lines'/'io.lines' (it + 3 must fit +** in the limit for upvalues of a closure) +*/ +#define MAXARGLINE 250 + +/* +** Auxiliary function to create the iteration function for 'lines'. +** The iteration function is a closure over 'io_readline', with +** the following upvalues: +** 1) The file being read (first value in the stack) +** 2) the number of arguments to read +** 3) a boolean, true iff file has to be closed when finished ('toclose') +** *) a variable number of format arguments (rest of the stack) +*/ +static void aux_lines (lua_State *L, int toclose) { + int n = lua_gettop(L) - 1; /* number of arguments to read */ + luaL_argcheck(L, n <= MAXARGLINE, MAXARGLINE + 2, "too many arguments"); + lua_pushvalue(L, 1); /* file */ + lua_pushinteger(L, n); /* number of arguments to read */ + lua_pushboolean(L, toclose); /* close/not close file when finished */ + lua_rotate(L, 2, 3); /* move the three values to their positions */ + lua_pushcclosure(L, io_readline, 3 + n); +} + + +static int f_lines (lua_State *L) { + tofile(L); /* check that it's a valid file handle */ + aux_lines(L, 0); + return 1; +} + + +/* +** Return an iteration function for 'io.lines'. If file has to be +** closed, also returns the file itself as a second result (to be +** closed as the state at the exit of a generic for). +*/ +static int io_lines (lua_State *L) { + int toclose; + if (lua_isnone(L, 1)) lua_pushnil(L); /* at least one argument */ + if (lua_isnil(L, 1)) { /* no file name? */ + lua_getfield(L, LUA_REGISTRYINDEX, IO_INPUT); /* get default input */ + lua_replace(L, 1); /* put it at index 1 */ + tofile(L); /* check that it's a valid file handle */ + toclose = 0; /* do not close it after iteration */ + } + else { /* open a new file */ + const char *filename = luaL_checkstring(L, 1); + opencheck(L, filename, "r"); + lua_replace(L, 1); /* put file at index 1 */ + toclose = 1; /* close it after iteration */ + } + aux_lines(L, toclose); /* push iteration function */ + if (toclose) { + lua_pushnil(L); /* state */ + lua_pushnil(L); /* control */ + lua_pushvalue(L, 1); /* file is the to-be-closed variable (4th result) */ + return 4; + } + else + return 1; +} + + +/* +** {====================================================== +** READ +** ======================================================= +*/ + + +/* maximum length of a numeral */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + + +/* auxiliary structure used by 'read_number' */ +typedef struct { + FILE *f; /* file being read */ + int c; /* current character (look ahead) */ + int n; /* number of elements in buffer 'buff' */ + char buff[L_MAXLENNUM + 1]; /* +1 for ending '\0' */ +} RN; + + +/* +** Add current char to buffer (if not out of space) and read next one +*/ +static int nextc (RN *rn) { + if (rn->n >= L_MAXLENNUM) { /* buffer overflow? */ + rn->buff[0] = '\0'; /* invalidate result */ + return 0; /* fail */ + } + else { + rn->buff[rn->n++] = rn->c; /* save current char */ + rn->c = l_getc(rn->f); /* read next one */ + return 1; + } +} + + +/* +** Accept current char if it is in 'set' (of size 2) +*/ +static int test2 (RN *rn, const char *set) { + if (rn->c == set[0] || rn->c == set[1]) + return nextc(rn); + else return 0; +} + + +/* +** Read a sequence of (hex)digits +*/ +static int readdigits (RN *rn, int hex) { + int count = 0; + while ((hex ? isxdigit(rn->c) : isdigit(rn->c)) && nextc(rn)) + count++; + return count; +} + + +/* +** Read a number: first reads a valid prefix of a numeral into a buffer. +** Then it calls 'lua_stringtonumber' to check whether the format is +** correct and to convert it to a Lua number. +*/ +static int read_number (lua_State *L, FILE *f) { + RN rn; + int count = 0; + int hex = 0; + char decp[2]; + rn.f = f; rn.n = 0; + decp[0] = lua_getlocaledecpoint(); /* get decimal point from locale */ + decp[1] = '.'; /* always accept a dot */ + l_lockfile(rn.f); + do { rn.c = l_getc(rn.f); } while (isspace(rn.c)); /* skip spaces */ + test2(&rn, "-+"); /* optional sign */ + if (test2(&rn, "00")) { + if (test2(&rn, "xX")) hex = 1; /* numeral is hexadecimal */ + else count = 1; /* count initial '0' as a valid digit */ + } + count += readdigits(&rn, hex); /* integral part */ + if (test2(&rn, decp)) /* decimal point? */ + count += readdigits(&rn, hex); /* fractional part */ + if (count > 0 && test2(&rn, (hex ? "pP" : "eE"))) { /* exponent mark? */ + test2(&rn, "-+"); /* exponent sign */ + readdigits(&rn, 0); /* exponent digits */ + } + ungetc(rn.c, rn.f); /* unread look-ahead char */ + l_unlockfile(rn.f); + rn.buff[rn.n] = '\0'; /* finish string */ + if (lua_stringtonumber(L, rn.buff)) /* is this a valid number? */ + return 1; /* ok */ + else { /* invalid format */ + lua_pushnil(L); /* "result" to be removed */ + return 0; /* read fails */ + } +} + + +static int test_eof (lua_State *L, FILE *f) { + int c = getc(f); + ungetc(c, f); /* no-op when c == EOF */ + lua_pushliteral(L, ""); + return (c != EOF); +} + + +static int read_line (lua_State *L, FILE *f, int chop) { + luaL_Buffer b; + int c; + luaL_buffinit(L, &b); + do { /* may need to read several chunks to get whole line */ + char *buff = luaL_prepbuffer(&b); /* preallocate buffer space */ + int i = 0; + l_lockfile(f); /* no memory errors can happen inside the lock */ + while (i < LUAL_BUFFERSIZE && (c = l_getc(f)) != EOF && c != '\n') + buff[i++] = c; /* read up to end of line or buffer limit */ + l_unlockfile(f); + luaL_addsize(&b, i); + } while (c != EOF && c != '\n'); /* repeat until end of line */ + if (!chop && c == '\n') /* want a newline and have one? */ + luaL_addchar(&b, c); /* add ending newline to result */ + luaL_pushresult(&b); /* close buffer */ + /* return ok if read something (either a newline or something else) */ + return (c == '\n' || lua_rawlen(L, -1) > 0); +} + + +static void read_all (lua_State *L, FILE *f) { + size_t nr; + luaL_Buffer b; + luaL_buffinit(L, &b); + do { /* read file in chunks of LUAL_BUFFERSIZE bytes */ + char *p = luaL_prepbuffer(&b); + nr = fread(p, sizeof(char), LUAL_BUFFERSIZE, f); + luaL_addsize(&b, nr); + } while (nr == LUAL_BUFFERSIZE); + luaL_pushresult(&b); /* close buffer */ +} + + +static int read_chars (lua_State *L, FILE *f, size_t n) { + size_t nr; /* number of chars actually read */ + char *p; + luaL_Buffer b; + luaL_buffinit(L, &b); + p = luaL_prepbuffsize(&b, n); /* prepare buffer to read whole block */ + nr = fread(p, sizeof(char), n, f); /* try to read 'n' chars */ + luaL_addsize(&b, nr); + luaL_pushresult(&b); /* close buffer */ + return (nr > 0); /* true iff read something */ +} + + +static int g_read (lua_State *L, FILE *f, int first) { + int nargs = lua_gettop(L) - 1; + int n, success; + clearerr(f); + if (nargs == 0) { /* no arguments? */ + success = read_line(L, f, 1); + n = first + 1; /* to return 1 result */ + } + else { + /* ensure stack space for all results and for auxlib's buffer */ + luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); + success = 1; + for (n = first; nargs-- && success; n++) { + if (lua_type(L, n) == LUA_TNUMBER) { + size_t l = (size_t)luaL_checkinteger(L, n); + success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); + } + else { + const char *p = luaL_checkstring(L, n); + if (*p == '*') p++; /* skip optional '*' (for compatibility) */ + switch (*p) { + case 'n': /* number */ + success = read_number(L, f); + break; + case 'l': /* line */ + success = read_line(L, f, 1); + break; + case 'L': /* line with end-of-line */ + success = read_line(L, f, 0); + break; + case 'a': /* file */ + read_all(L, f); /* read entire file */ + success = 1; /* always success */ + break; + default: + return luaL_argerror(L, n, "invalid format"); + } + } + } + } + if (ferror(f)) + return luaL_fileresult(L, 0, NULL); + if (!success) { + lua_pop(L, 1); /* remove last result */ + luaL_pushfail(L); /* push nil instead */ + } + return n - first; +} + + +static int io_read (lua_State *L) { + return g_read(L, getiofile(L, IO_INPUT), 1); +} + + +static int f_read (lua_State *L) { + return g_read(L, tofile(L), 2); +} + + +/* +** Iteration function for 'lines'. +*/ +static int io_readline (lua_State *L) { + LStream *p = (LStream *)lua_touserdata(L, lua_upvalueindex(1)); + int i; + int n = (int)lua_tointeger(L, lua_upvalueindex(2)); + if (isclosed(p)) /* file is already closed? */ + return luaL_error(L, "file is already closed"); + lua_settop(L , 1); + luaL_checkstack(L, n, "too many arguments"); + for (i = 1; i <= n; i++) /* push arguments to 'g_read' */ + lua_pushvalue(L, lua_upvalueindex(3 + i)); + n = g_read(L, p->f, 2); /* 'n' is number of results */ + lua_assert(n > 0); /* should return at least a nil */ + if (lua_toboolean(L, -n)) /* read at least one value? */ + return n; /* return them */ + else { /* first result is false: EOF or error */ + if (n > 1) { /* is there error information? */ + /* 2nd result is error message */ + return luaL_error(L, "%s", lua_tostring(L, -n + 1)); + } + if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */ + lua_settop(L, 0); /* clear stack */ + lua_pushvalue(L, lua_upvalueindex(1)); /* push file at index 1 */ + aux_close(L); /* close it */ + } + return 0; + } +} + +/* }====================================================== */ + + +static int g_write (lua_State *L, FILE *f, int arg) { + int nargs = lua_gettop(L) - arg; + int status = 1; + for (; nargs--; arg++) { + if (lua_type(L, arg) == LUA_TNUMBER) { + /* optimization: could be done exactly as for strings */ + int len = lua_isinteger(L, arg) + ? fprintf(f, LUA_INTEGER_FMT, + (LUAI_UACINT)lua_tointeger(L, arg)) + : fprintf(f, LUA_NUMBER_FMT, + (LUAI_UACNUMBER)lua_tonumber(L, arg)); + status = status && (len > 0); + } + else { + size_t l; + const char *s = luaL_checklstring(L, arg, &l); + status = status && (fwrite(s, sizeof(char), l, f) == l); + } + } + if (status) return 1; /* file handle already on stack top */ + else return luaL_fileresult(L, status, NULL); +} + + +static int io_write (lua_State *L) { + return g_write(L, getiofile(L, IO_OUTPUT), 1); +} + + +static int f_write (lua_State *L) { + FILE *f = tofile(L); + lua_pushvalue(L, 1); /* push file at the stack top (to be returned) */ + return g_write(L, f, 2); +} + + +static int f_seek (lua_State *L) { + static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; + static const char *const modenames[] = {"set", "cur", "end", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, "cur", modenames); + lua_Integer p3 = luaL_optinteger(L, 3, 0); + l_seeknum offset = (l_seeknum)p3; + luaL_argcheck(L, (lua_Integer)offset == p3, 3, + "not an integer in proper range"); + op = l_fseek(f, offset, mode[op]); + if (op) + return luaL_fileresult(L, 0, NULL); /* error */ + else { + lua_pushinteger(L, (lua_Integer)l_ftell(f)); + return 1; + } +} + + +static int f_setvbuf (lua_State *L) { + static const int mode[] = {_IONBF, _IOFBF, _IOLBF}; + static const char *const modenames[] = {"no", "full", "line", NULL}; + FILE *f = tofile(L); + int op = luaL_checkoption(L, 2, NULL, modenames); + lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE); + int res = setvbuf(f, NULL, mode[op], (size_t)sz); + return luaL_fileresult(L, res == 0, NULL); +} + + + +static int io_flush (lua_State *L) { + return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); +} + + +static int f_flush (lua_State *L) { + return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL); +} + + +/* +** functions for 'io' library +*/ +static const luaL_Reg iolib[] = { + {"close", io_close}, + {"flush", io_flush}, + {"input", io_input}, + {"lines", io_lines}, + {"open", io_open}, + {"output", io_output}, + {"popen", io_popen}, + {"read", io_read}, + {"tmpfile", io_tmpfile}, + {"type", io_type}, + {"write", io_write}, + {NULL, NULL} +}; + + +/* +** methods for file handles +*/ +static const luaL_Reg meth[] = { + {"read", f_read}, + {"write", f_write}, + {"lines", f_lines}, + {"flush", f_flush}, + {"seek", f_seek}, + {"close", f_close}, + {"setvbuf", f_setvbuf}, + {NULL, NULL} +}; + + +/* +** metamethods for file handles +*/ +static const luaL_Reg metameth[] = { + {"__index", NULL}, /* place holder */ + {"__gc", f_gc}, + {"__close", f_gc}, + {"__tostring", f_tostring}, + {NULL, NULL} +}; + + +static void createmeta (lua_State *L) { + luaL_newmetatable(L, LUA_FILEHANDLE); /* metatable for file handles */ + luaL_setfuncs(L, metameth, 0); /* add metamethods to new metatable */ + luaL_newlibtable(L, meth); /* create method table */ + luaL_setfuncs(L, meth, 0); /* add file methods to method table */ + lua_setfield(L, -2, "__index"); /* metatable.__index = method table */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** function to (not) close the standard files stdin, stdout, and stderr +*/ +static int io_noclose (lua_State *L) { + LStream *p = tolstream(L); + p->closef = &io_noclose; /* keep file opened */ + luaL_pushfail(L); + lua_pushliteral(L, "cannot close standard file"); + return 2; +} + + +static void createstdfile (lua_State *L, FILE *f, const char *k, + const char *fname) { + LStream *p = newprefile(L); + p->f = f; + p->closef = &io_noclose; + if (k != NULL) { + lua_pushvalue(L, -1); + lua_setfield(L, LUA_REGISTRYINDEX, k); /* add file to registry */ + } + lua_setfield(L, -2, fname); /* add file to module */ +} + + +LUAMOD_API int luaopen_io (lua_State *L) { + luaL_newlib(L, iolib); /* new module */ + createmeta(L); + /* create (and set) default files */ + createstdfile(L, stdin, IO_INPUT, "stdin"); + createstdfile(L, stdout, IO_OUTPUT, "stdout"); + createstdfile(L, stderr, NULL, "stderr"); + return 1; +} + diff --git a/lua-5.4.0/src/ljumptab.h b/lua-5.4.0/src/ljumptab.h new file mode 100644 index 0000000..8306f25 --- /dev/null +++ b/lua-5.4.0/src/ljumptab.h @@ -0,0 +1,112 @@ +/* +** $Id: ljumptab.h $ +** Jump Table for the Lua interpreter +** See Copyright Notice in lua.h +*/ + + +#undef vmdispatch +#undef vmcase +#undef vmbreak + +#define vmdispatch(x) goto *disptab[x]; + +#define vmcase(l) L_##l: + +#define vmbreak vmfetch(); vmdispatch(GET_OPCODE(i)); + + +static const void *const disptab[NUM_OPCODES] = { + +#if 0 +** you can update the following list with this command: +** +** sed -n '/^OP_/\!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h +** +#endif + +&&L_OP_MOVE, +&&L_OP_LOADI, +&&L_OP_LOADF, +&&L_OP_LOADK, +&&L_OP_LOADKX, +&&L_OP_LOADFALSE, +&&L_OP_LFALSESKIP, +&&L_OP_LOADTRUE, +&&L_OP_LOADNIL, +&&L_OP_GETUPVAL, +&&L_OP_SETUPVAL, +&&L_OP_GETTABUP, +&&L_OP_GETTABLE, +&&L_OP_GETI, +&&L_OP_GETFIELD, +&&L_OP_SETTABUP, +&&L_OP_SETTABLE, +&&L_OP_SETI, +&&L_OP_SETFIELD, +&&L_OP_NEWTABLE, +&&L_OP_SELF, +&&L_OP_ADDI, +&&L_OP_ADDK, +&&L_OP_SUBK, +&&L_OP_MULK, +&&L_OP_MODK, +&&L_OP_POWK, +&&L_OP_DIVK, +&&L_OP_IDIVK, +&&L_OP_BANDK, +&&L_OP_BORK, +&&L_OP_BXORK, +&&L_OP_SHRI, +&&L_OP_SHLI, +&&L_OP_ADD, +&&L_OP_SUB, +&&L_OP_MUL, +&&L_OP_MOD, +&&L_OP_POW, +&&L_OP_DIV, +&&L_OP_IDIV, +&&L_OP_BAND, +&&L_OP_BOR, +&&L_OP_BXOR, +&&L_OP_SHL, +&&L_OP_SHR, +&&L_OP_MMBIN, +&&L_OP_MMBINI, +&&L_OP_MMBINK, +&&L_OP_UNM, +&&L_OP_BNOT, +&&L_OP_NOT, +&&L_OP_LEN, +&&L_OP_CONCAT, +&&L_OP_CLOSE, +&&L_OP_TBC, +&&L_OP_JMP, +&&L_OP_EQ, +&&L_OP_LT, +&&L_OP_LE, +&&L_OP_EQK, +&&L_OP_EQI, +&&L_OP_LTI, +&&L_OP_LEI, +&&L_OP_GTI, +&&L_OP_GEI, +&&L_OP_TEST, +&&L_OP_TESTSET, +&&L_OP_CALL, +&&L_OP_TAILCALL, +&&L_OP_RETURN, +&&L_OP_RETURN0, +&&L_OP_RETURN1, +&&L_OP_FORLOOP, +&&L_OP_FORPREP, +&&L_OP_TFORPREP, +&&L_OP_TFORCALL, +&&L_OP_TFORLOOP, +&&L_OP_SETLIST, +&&L_OP_CLOSURE, +&&L_OP_VARARG, +&&L_OP_VARARGPREP, +&&L_OP_EXTRAARG + +}; diff --git a/lua-5.4.0/src/llex.c b/lua-5.4.0/src/llex.c new file mode 100644 index 0000000..90a7951 --- /dev/null +++ b/lua-5.4.0/src/llex.c @@ -0,0 +1,578 @@ +/* +** $Id: llex.c $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#define llex_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "llex.h" +#include "lobject.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lzio.h" + + + +#define next(ls) (ls->current = zgetc(ls->z)) + + + +#define currIsNewline(ls) (ls->current == '\n' || ls->current == '\r') + + +/* ORDER RESERVED */ +static const char *const luaX_tokens [] = { + "and", "break", "do", "else", "elseif", + "end", "false", "for", "function", "goto", "if", + "in", "local", "nil", "not", "or", "repeat", + "return", "then", "true", "until", "while", + "//", "..", "...", "==", ">=", "<=", "~=", + "<<", ">>", "::", "", + "", "", "", "" +}; + + +#define save_and_next(ls) (save(ls, ls->current), next(ls)) + + +static l_noret lexerror (LexState *ls, const char *msg, int token); + + +static void save (LexState *ls, int c) { + Mbuffer *b = ls->buff; + if (luaZ_bufflen(b) + 1 > luaZ_sizebuffer(b)) { + size_t newsize; + if (luaZ_sizebuffer(b) >= MAX_SIZE/2) + lexerror(ls, "lexical element too long", 0); + newsize = luaZ_sizebuffer(b) * 2; + luaZ_resizebuffer(ls->L, b, newsize); + } + b->buffer[luaZ_bufflen(b)++] = cast_char(c); +} + + +void luaX_init (lua_State *L) { + int i; + TString *e = luaS_newliteral(L, LUA_ENV); /* create env name */ + luaC_fix(L, obj2gco(e)); /* never collect this name */ + for (i=0; iextra = cast_byte(i+1); /* reserved word */ + } +} + + +const char *luaX_token2str (LexState *ls, int token) { + if (token < FIRST_RESERVED) { /* single-byte symbols? */ + lua_assert(token == cast_uchar(token)); + if (lisprint(token)) + return luaO_pushfstring(ls->L, "'%c'", token); + else /* control character */ + return luaO_pushfstring(ls->L, "'<\\%d>'", token); + } + else { + const char *s = luaX_tokens[token - FIRST_RESERVED]; + if (token < TK_EOS) /* fixed format (symbols and reserved words)? */ + return luaO_pushfstring(ls->L, "'%s'", s); + else /* names, strings, and numerals */ + return s; + } +} + + +static const char *txtToken (LexState *ls, int token) { + switch (token) { + case TK_NAME: case TK_STRING: + case TK_FLT: case TK_INT: + save(ls, '\0'); + return luaO_pushfstring(ls->L, "'%s'", luaZ_buffer(ls->buff)); + default: + return luaX_token2str(ls, token); + } +} + + +static l_noret lexerror (LexState *ls, const char *msg, int token) { + msg = luaG_addinfo(ls->L, msg, ls->source, ls->linenumber); + if (token) + luaO_pushfstring(ls->L, "%s near %s", msg, txtToken(ls, token)); + luaD_throw(ls->L, LUA_ERRSYNTAX); +} + + +l_noret luaX_syntaxerror (LexState *ls, const char *msg) { + lexerror(ls, msg, ls->t.token); +} + + +/* +** creates a new string and anchors it in scanner's table so that +** it will not be collected until the end of the compilation +** (by that time it should be anchored somewhere) +*/ +TString *luaX_newstring (LexState *ls, const char *str, size_t l) { + lua_State *L = ls->L; + TValue *o; /* entry for 'str' */ + TString *ts = luaS_newlstr(L, str, l); /* create new string */ + setsvalue2s(L, L->top++, ts); /* temporarily anchor it in stack */ + o = luaH_set(L, ls->h, s2v(L->top - 1)); + if (isempty(o)) { /* not in use yet? */ + /* boolean value does not need GC barrier; + table is not a metatable, so it does not need to invalidate cache */ + setbtvalue(o); /* t[string] = true */ + luaC_checkGC(L); + } + else { /* string already present */ + ts = keystrval(nodefromval(o)); /* re-use value previously stored */ + } + L->top--; /* remove string from stack */ + return ts; +} + + +/* +** increment line number and skips newline sequence (any of +** \n, \r, \n\r, or \r\n) +*/ +static void inclinenumber (LexState *ls) { + int old = ls->current; + lua_assert(currIsNewline(ls)); + next(ls); /* skip '\n' or '\r' */ + if (currIsNewline(ls) && ls->current != old) + next(ls); /* skip '\n\r' or '\r\n' */ + if (++ls->linenumber >= MAX_INT) + lexerror(ls, "chunk has too many lines", 0); +} + + +void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, TString *source, + int firstchar) { + ls->t.token = 0; + ls->L = L; + ls->current = firstchar; + ls->lookahead.token = TK_EOS; /* no look-ahead token */ + ls->z = z; + ls->fs = NULL; + ls->linenumber = 1; + ls->lastline = 1; + ls->source = source; + ls->envn = luaS_newliteral(L, LUA_ENV); /* get env name */ + luaZ_resizebuffer(ls->L, ls->buff, LUA_MINBUFFER); /* initialize buffer */ +} + + + +/* +** ======================================================= +** LEXICAL ANALYZER +** ======================================================= +*/ + + +static int check_next1 (LexState *ls, int c) { + if (ls->current == c) { + next(ls); + return 1; + } + else return 0; +} + + +/* +** Check whether current char is in set 'set' (with two chars) and +** saves it +*/ +static int check_next2 (LexState *ls, const char *set) { + lua_assert(set[2] == '\0'); + if (ls->current == set[0] || ls->current == set[1]) { + save_and_next(ls); + return 1; + } + else return 0; +} + + +/* LUA_NUMBER */ +/* +** This function is quite liberal in what it accepts, as 'luaO_str2num' +** will reject ill-formed numerals. Roughly, it accepts the following +** pattern: +** +** %d(%x|%.|([Ee][+-]?))* | 0[Xx](%x|%.|([Pp][+-]?))* +** +** The only tricky part is to accept [+-] only after a valid exponent +** mark, to avoid reading '3-4' or '0xe+1' as a single number. +** +** The caller might have already read an initial dot. +*/ +static int read_numeral (LexState *ls, SemInfo *seminfo) { + TValue obj; + const char *expo = "Ee"; + int first = ls->current; + lua_assert(lisdigit(ls->current)); + save_and_next(ls); + if (first == '0' && check_next2(ls, "xX")) /* hexadecimal? */ + expo = "Pp"; + for (;;) { + if (check_next2(ls, expo)) /* exponent mark? */ + check_next2(ls, "-+"); /* optional exponent sign */ + else if (lisxdigit(ls->current) || ls->current == '.') /* '%x|%.' */ + save_and_next(ls); + else break; + } + if (lislalpha(ls->current)) /* is numeral touching a letter? */ + save_and_next(ls); /* force an error */ + save(ls, '\0'); + if (luaO_str2num(luaZ_buffer(ls->buff), &obj) == 0) /* format error? */ + lexerror(ls, "malformed number", TK_FLT); + if (ttisinteger(&obj)) { + seminfo->i = ivalue(&obj); + return TK_INT; + } + else { + lua_assert(ttisfloat(&obj)); + seminfo->r = fltvalue(&obj); + return TK_FLT; + } +} + + +/* +** reads a sequence '[=*[' or ']=*]', leaving the last bracket. +** If sequence is well formed, return its number of '='s + 2; otherwise, +** return 1 if there is no '='s or 0 otherwise (an unfinished '[==...'). +*/ +static size_t skip_sep (LexState *ls) { + size_t count = 0; + int s = ls->current; + lua_assert(s == '[' || s == ']'); + save_and_next(ls); + while (ls->current == '=') { + save_and_next(ls); + count++; + } + return (ls->current == s) ? count + 2 + : (count == 0) ? 1 + : 0; +} + + +static void read_long_string (LexState *ls, SemInfo *seminfo, size_t sep) { + int line = ls->linenumber; /* initial line (for error message) */ + save_and_next(ls); /* skip 2nd '[' */ + if (currIsNewline(ls)) /* string starts with a newline? */ + inclinenumber(ls); /* skip it */ + for (;;) { + switch (ls->current) { + case EOZ: { /* error */ + const char *what = (seminfo ? "string" : "comment"); + const char *msg = luaO_pushfstring(ls->L, + "unfinished long %s (starting at line %d)", what, line); + lexerror(ls, msg, TK_EOS); + break; /* to avoid warnings */ + } + case ']': { + if (skip_sep(ls) == sep) { + save_and_next(ls); /* skip 2nd ']' */ + goto endloop; + } + break; + } + case '\n': case '\r': { + save(ls, '\n'); + inclinenumber(ls); + if (!seminfo) luaZ_resetbuffer(ls->buff); /* avoid wasting space */ + break; + } + default: { + if (seminfo) save_and_next(ls); + else next(ls); + } + } + } endloop: + if (seminfo) + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + sep, + luaZ_bufflen(ls->buff) - 2 * sep); +} + + +static void esccheck (LexState *ls, int c, const char *msg) { + if (!c) { + if (ls->current != EOZ) + save_and_next(ls); /* add current to buffer for error message */ + lexerror(ls, msg, TK_STRING); + } +} + + +static int gethexa (LexState *ls) { + save_and_next(ls); + esccheck (ls, lisxdigit(ls->current), "hexadecimal digit expected"); + return luaO_hexavalue(ls->current); +} + + +static int readhexaesc (LexState *ls) { + int r = gethexa(ls); + r = (r << 4) + gethexa(ls); + luaZ_buffremove(ls->buff, 2); /* remove saved chars from buffer */ + return r; +} + + +static unsigned long readutf8esc (LexState *ls) { + unsigned long r; + int i = 4; /* chars to be removed: '\', 'u', '{', and first digit */ + save_and_next(ls); /* skip 'u' */ + esccheck(ls, ls->current == '{', "missing '{'"); + r = gethexa(ls); /* must have at least one digit */ + while (cast_void(save_and_next(ls)), lisxdigit(ls->current)) { + i++; + esccheck(ls, r <= (0x7FFFFFFFu >> 4), "UTF-8 value too large"); + r = (r << 4) + luaO_hexavalue(ls->current); + } + esccheck(ls, ls->current == '}', "missing '}'"); + next(ls); /* skip '}' */ + luaZ_buffremove(ls->buff, i); /* remove saved chars from buffer */ + return r; +} + + +static void utf8esc (LexState *ls) { + char buff[UTF8BUFFSZ]; + int n = luaO_utf8esc(buff, readutf8esc(ls)); + for (; n > 0; n--) /* add 'buff' to string */ + save(ls, buff[UTF8BUFFSZ - n]); +} + + +static int readdecesc (LexState *ls) { + int i; + int r = 0; /* result accumulator */ + for (i = 0; i < 3 && lisdigit(ls->current); i++) { /* read up to 3 digits */ + r = 10*r + ls->current - '0'; + save_and_next(ls); + } + esccheck(ls, r <= UCHAR_MAX, "decimal escape too large"); + luaZ_buffremove(ls->buff, i); /* remove read digits from buffer */ + return r; +} + + +static void read_string (LexState *ls, int del, SemInfo *seminfo) { + save_and_next(ls); /* keep delimiter (for error messages) */ + while (ls->current != del) { + switch (ls->current) { + case EOZ: + lexerror(ls, "unfinished string", TK_EOS); + break; /* to avoid warnings */ + case '\n': + case '\r': + lexerror(ls, "unfinished string", TK_STRING); + break; /* to avoid warnings */ + case '\\': { /* escape sequences */ + int c; /* final character to be saved */ + save_and_next(ls); /* keep '\\' for error messages */ + switch (ls->current) { + case 'a': c = '\a'; goto read_save; + case 'b': c = '\b'; goto read_save; + case 'f': c = '\f'; goto read_save; + case 'n': c = '\n'; goto read_save; + case 'r': c = '\r'; goto read_save; + case 't': c = '\t'; goto read_save; + case 'v': c = '\v'; goto read_save; + case 'x': c = readhexaesc(ls); goto read_save; + case 'u': utf8esc(ls); goto no_save; + case '\n': case '\r': + inclinenumber(ls); c = '\n'; goto only_save; + case '\\': case '\"': case '\'': + c = ls->current; goto read_save; + case EOZ: goto no_save; /* will raise an error next loop */ + case 'z': { /* zap following span of spaces */ + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + next(ls); /* skip the 'z' */ + while (lisspace(ls->current)) { + if (currIsNewline(ls)) inclinenumber(ls); + else next(ls); + } + goto no_save; + } + default: { + esccheck(ls, lisdigit(ls->current), "invalid escape sequence"); + c = readdecesc(ls); /* digital escape '\ddd' */ + goto only_save; + } + } + read_save: + next(ls); + /* go through */ + only_save: + luaZ_buffremove(ls->buff, 1); /* remove '\\' */ + save(ls, c); + /* go through */ + no_save: break; + } + default: + save_and_next(ls); + } + } + save_and_next(ls); /* skip delimiter */ + seminfo->ts = luaX_newstring(ls, luaZ_buffer(ls->buff) + 1, + luaZ_bufflen(ls->buff) - 2); +} + + +static int llex (LexState *ls, SemInfo *seminfo) { + luaZ_resetbuffer(ls->buff); + for (;;) { + switch (ls->current) { + case '\n': case '\r': { /* line breaks */ + inclinenumber(ls); + break; + } + case ' ': case '\f': case '\t': case '\v': { /* spaces */ + next(ls); + break; + } + case '-': { /* '-' or '--' (comment) */ + next(ls); + if (ls->current != '-') return '-'; + /* else is a comment */ + next(ls); + if (ls->current == '[') { /* long comment? */ + size_t sep = skip_sep(ls); + luaZ_resetbuffer(ls->buff); /* 'skip_sep' may dirty the buffer */ + if (sep >= 2) { + read_long_string(ls, NULL, sep); /* skip long comment */ + luaZ_resetbuffer(ls->buff); /* previous call may dirty the buff. */ + break; + } + } + /* else short comment */ + while (!currIsNewline(ls) && ls->current != EOZ) + next(ls); /* skip until end of line (or end of file) */ + break; + } + case '[': { /* long string or simply '[' */ + size_t sep = skip_sep(ls); + if (sep >= 2) { + read_long_string(ls, seminfo, sep); + return TK_STRING; + } + else if (sep == 0) /* '[=...' missing second bracket? */ + lexerror(ls, "invalid long string delimiter", TK_STRING); + return '['; + } + case '=': { + next(ls); + if (check_next1(ls, '=')) return TK_EQ; + else return '='; + } + case '<': { + next(ls); + if (check_next1(ls, '=')) return TK_LE; + else if (check_next1(ls, '<')) return TK_SHL; + else return '<'; + } + case '>': { + next(ls); + if (check_next1(ls, '=')) return TK_GE; + else if (check_next1(ls, '>')) return TK_SHR; + else return '>'; + } + case '/': { + next(ls); + if (check_next1(ls, '/')) return TK_IDIV; + else return '/'; + } + case '~': { + next(ls); + if (check_next1(ls, '=')) return TK_NE; + else return '~'; + } + case ':': { + next(ls); + if (check_next1(ls, ':')) return TK_DBCOLON; + else return ':'; + } + case '"': case '\'': { /* short literal strings */ + read_string(ls, ls->current, seminfo); + return TK_STRING; + } + case '.': { /* '.', '..', '...', or number */ + save_and_next(ls); + if (check_next1(ls, '.')) { + if (check_next1(ls, '.')) + return TK_DOTS; /* '...' */ + else return TK_CONCAT; /* '..' */ + } + else if (!lisdigit(ls->current)) return '.'; + else return read_numeral(ls, seminfo); + } + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': { + return read_numeral(ls, seminfo); + } + case EOZ: { + return TK_EOS; + } + default: { + if (lislalpha(ls->current)) { /* identifier or reserved word? */ + TString *ts; + do { + save_and_next(ls); + } while (lislalnum(ls->current)); + ts = luaX_newstring(ls, luaZ_buffer(ls->buff), + luaZ_bufflen(ls->buff)); + seminfo->ts = ts; + if (isreserved(ts)) /* reserved word? */ + return ts->extra - 1 + FIRST_RESERVED; + else { + return TK_NAME; + } + } + else { /* single-char tokens (+ - / ...) */ + int c = ls->current; + next(ls); + return c; + } + } + } + } +} + + +void luaX_next (LexState *ls) { + ls->lastline = ls->linenumber; + if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ + ls->t = ls->lookahead; /* use this one */ + ls->lookahead.token = TK_EOS; /* and discharge it */ + } + else + ls->t.token = llex(ls, &ls->t.seminfo); /* read next token */ +} + + +int luaX_lookahead (LexState *ls) { + lua_assert(ls->lookahead.token == TK_EOS); + ls->lookahead.token = llex(ls, &ls->lookahead.seminfo); + return ls->lookahead.token; +} + diff --git a/lua-5.4.0/src/llex.h b/lua-5.4.0/src/llex.h new file mode 100644 index 0000000..d1a4cba --- /dev/null +++ b/lua-5.4.0/src/llex.h @@ -0,0 +1,85 @@ +/* +** $Id: llex.h $ +** Lexical Analyzer +** See Copyright Notice in lua.h +*/ + +#ifndef llex_h +#define llex_h + +#include "lobject.h" +#include "lzio.h" + + +#define FIRST_RESERVED 257 + + +#if !defined(LUA_ENV) +#define LUA_ENV "_ENV" +#endif + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER RESERVED" +*/ +enum RESERVED { + /* terminal symbols denoted by reserved words */ + TK_AND = FIRST_RESERVED, TK_BREAK, + TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, + TK_GOTO, TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, + TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, + /* other terminal symbols */ + TK_IDIV, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, + TK_SHL, TK_SHR, + TK_DBCOLON, TK_EOS, + TK_FLT, TK_INT, TK_NAME, TK_STRING +}; + +/* number of reserved words */ +#define NUM_RESERVED (cast_int(TK_WHILE-FIRST_RESERVED + 1)) + + +typedef union { + lua_Number r; + lua_Integer i; + TString *ts; +} SemInfo; /* semantics information */ + + +typedef struct Token { + int token; + SemInfo seminfo; +} Token; + + +/* state of the lexer plus state of the parser when shared by all + functions */ +typedef struct LexState { + int current; /* current character (charint) */ + int linenumber; /* input line counter */ + int lastline; /* line of last token 'consumed' */ + Token t; /* current token */ + Token lookahead; /* look ahead token */ + struct FuncState *fs; /* current function (parser) */ + struct lua_State *L; + ZIO *z; /* input stream */ + Mbuffer *buff; /* buffer for tokens */ + Table *h; /* to avoid collection/reuse strings */ + struct Dyndata *dyd; /* dynamic structures used by the parser */ + TString *source; /* current source name */ + TString *envn; /* environment variable name */ +} LexState; + + +LUAI_FUNC void luaX_init (lua_State *L); +LUAI_FUNC void luaX_setinput (lua_State *L, LexState *ls, ZIO *z, + TString *source, int firstchar); +LUAI_FUNC TString *luaX_newstring (LexState *ls, const char *str, size_t l); +LUAI_FUNC void luaX_next (LexState *ls); +LUAI_FUNC int luaX_lookahead (LexState *ls); +LUAI_FUNC l_noret luaX_syntaxerror (LexState *ls, const char *s); +LUAI_FUNC const char *luaX_token2str (LexState *ls, int token); + + +#endif diff --git a/lua-5.4.0/src/llimits.h b/lua-5.4.0/src/llimits.h new file mode 100644 index 0000000..b86d345 --- /dev/null +++ b/lua-5.4.0/src/llimits.h @@ -0,0 +1,349 @@ +/* +** $Id: llimits.h $ +** Limits, basic types, and some other 'installation-dependent' definitions +** See Copyright Notice in lua.h +*/ + +#ifndef llimits_h +#define llimits_h + + +#include +#include + + +#include "lua.h" + + +/* +** 'lu_mem' and 'l_mem' are unsigned/signed integers big enough to count +** the total memory used by Lua (in bytes). Usually, 'size_t' and +** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines. +*/ +#if defined(LUAI_MEM) /* { external definitions? */ +typedef LUAI_UMEM lu_mem; +typedef LUAI_MEM l_mem; +#elif LUAI_IS32INT /* }{ */ +typedef size_t lu_mem; +typedef ptrdiff_t l_mem; +#else /* 16-bit ints */ /* }{ */ +typedef unsigned long lu_mem; +typedef long l_mem; +#endif /* } */ + + +/* chars used as small naturals (so that 'char' is reserved for characters) */ +typedef unsigned char lu_byte; +typedef signed char ls_byte; + + +/* maximum value for size_t */ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +/* maximum size visible for Lua (must be representable in a lua_Integer) */ +#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \ + : (size_t)(LUA_MAXINTEGER)) + + +#define MAX_LUMEM ((lu_mem)(~(lu_mem)0)) + +#define MAX_LMEM ((l_mem)(MAX_LUMEM >> 1)) + + +#define MAX_INT INT_MAX /* maximum value of an int */ + + +/* +** floor of the log2 of the maximum signed value for integral type 't'. +** (That is, maximum 'n' such that '2^n' fits in the given signed type.) +*/ +#define log2maxs(t) (sizeof(t) * 8 - 2) + + +/* +** test whether an unsigned value is a power of 2 (or zero) +*/ +#define ispow2(x) (((x) & ((x) - 1)) == 0) + + +/* number of chars of a literal string without the ending \0 */ +#define LL(x) (sizeof(x)/sizeof(char) - 1) + + +/* +** conversion of pointer to unsigned integer: +** this is for hashing only; there is no problem if the integer +** cannot hold the whole pointer value +*/ +#define point2uint(p) ((unsigned int)((size_t)(p) & UINT_MAX)) + + + +/* types of 'usual argument conversions' for lua_Number and lua_Integer */ +typedef LUAI_UACNUMBER l_uacNumber; +typedef LUAI_UACINT l_uacInt; + + +/* internal assertions for in-house debugging */ +#if defined(lua_assert) +#define check_exp(c,e) (lua_assert(c), (e)) +/* to avoid problems with conditions too long */ +#define lua_longassert(c) ((c) ? (void)0 : lua_assert(0)) +#else +#define lua_assert(c) ((void)0) +#define check_exp(c,e) (e) +#define lua_longassert(c) ((void)0) +#endif + +/* +** assertion for checking API calls +*/ +#if !defined(luai_apicheck) +#define luai_apicheck(l,e) ((void)l, lua_assert(e)) +#endif + +#define api_check(l,e,msg) luai_apicheck(l,(e) && msg) + + +/* macro to avoid warnings about unused variables */ +#if !defined(UNUSED) +#define UNUSED(x) ((void)(x)) +#endif + + +/* type casts (a macro highlights casts in the code) */ +#define cast(t, exp) ((t)(exp)) + +#define cast_void(i) cast(void, (i)) +#define cast_voidp(i) cast(void *, (i)) +#define cast_num(i) cast(lua_Number, (i)) +#define cast_int(i) cast(int, (i)) +#define cast_uint(i) cast(unsigned int, (i)) +#define cast_byte(i) cast(lu_byte, (i)) +#define cast_uchar(i) cast(unsigned char, (i)) +#define cast_char(i) cast(char, (i)) +#define cast_charp(i) cast(char *, (i)) +#define cast_sizet(i) cast(size_t, (i)) + + +/* cast a signed lua_Integer to lua_Unsigned */ +#if !defined(l_castS2U) +#define l_castS2U(i) ((lua_Unsigned)(i)) +#endif + +/* +** cast a lua_Unsigned to a signed lua_Integer; this cast is +** not strict ISO C, but two-complement architectures should +** work fine. +*/ +#if !defined(l_castU2S) +#define l_castU2S(i) ((lua_Integer)(i)) +#endif + + +/* +** macros to improve jump prediction (used mainly for error handling) +*/ +#if !defined(likely) + +#if defined(__GNUC__) +#define likely(x) (__builtin_expect(((x) != 0), 1)) +#define unlikely(x) (__builtin_expect(((x) != 0), 0)) +#else +#define likely(x) (x) +#define unlikely(x) (x) +#endif + +#endif + + +/* +** non-return type +*/ +#if !defined(l_noret) + +#if defined(__GNUC__) +#define l_noret void __attribute__((noreturn)) +#elif defined(_MSC_VER) && _MSC_VER >= 1200 +#define l_noret void __declspec(noreturn) +#else +#define l_noret void +#endif + +#endif + + +/* +** type for virtual-machine instructions; +** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) +*/ +#if LUAI_IS32INT +typedef unsigned int l_uint32; +#else +typedef unsigned long l_uint32; +#endif + +typedef l_uint32 Instruction; + + + +/* +** Maximum length for short strings, that is, strings that are +** internalized. (Cannot be smaller than reserved words or tags for +** metamethods, as these strings must be internalized; +** #("function") = 8, #("__newindex") = 10.) +*/ +#if !defined(LUAI_MAXSHORTLEN) +#define LUAI_MAXSHORTLEN 40 +#endif + + +/* +** Initial size for the string table (must be power of 2). +** The Lua core alone registers ~50 strings (reserved words + +** metaevent keys + a few others). Libraries would typically add +** a few dozens more. +*/ +#if !defined(MINSTRTABSIZE) +#define MINSTRTABSIZE 128 +#endif + + +/* +** Size of cache for strings in the API. 'N' is the number of +** sets (better be a prime) and "M" is the size of each set (M == 1 +** makes a direct cache.) +*/ +#if !defined(STRCACHE_N) +#define STRCACHE_N 53 +#define STRCACHE_M 2 +#endif + + +/* minimum size for string buffer */ +#if !defined(LUA_MINBUFFER) +#define LUA_MINBUFFER 32 +#endif + + +/* +** macros that are executed whenever program enters the Lua core +** ('lua_lock') and leaves the core ('lua_unlock') +*/ +#if !defined(lua_lock) +#define lua_lock(L) ((void) 0) +#define lua_unlock(L) ((void) 0) +#endif + +/* +** macro executed during Lua functions at points where the +** function can yield. +*/ +#if !defined(luai_threadyield) +#define luai_threadyield(L) {lua_unlock(L); lua_lock(L);} +#endif + + +/* +** these macros allow user-specific actions when a thread is +** created/deleted/resumed/yielded. +*/ +#if !defined(luai_userstateopen) +#define luai_userstateopen(L) ((void)L) +#endif + +#if !defined(luai_userstateclose) +#define luai_userstateclose(L) ((void)L) +#endif + +#if !defined(luai_userstatethread) +#define luai_userstatethread(L,L1) ((void)L) +#endif + +#if !defined(luai_userstatefree) +#define luai_userstatefree(L,L1) ((void)L) +#endif + +#if !defined(luai_userstateresume) +#define luai_userstateresume(L,n) ((void)L) +#endif + +#if !defined(luai_userstateyield) +#define luai_userstateyield(L,n) ((void)L) +#endif + + + +/* +** The luai_num* macros define the primitive operations over numbers. +*/ + +/* floor division (defined as 'floor(a/b)') */ +#if !defined(luai_numidiv) +#define luai_numidiv(L,a,b) ((void)L, l_floor(luai_numdiv(L,a,b))) +#endif + +/* float division */ +#if !defined(luai_numdiv) +#define luai_numdiv(L,a,b) ((a)/(b)) +#endif + +/* +** modulo: defined as 'a - floor(a/b)*b'; the direct computation +** using this definition has several problems with rounding errors, +** so it is better to use 'fmod'. 'fmod' gives the result of +** 'a - trunc(a/b)*b', and therefore must be corrected when +** 'trunc(a/b) ~= floor(a/b)'. That happens when the division has a +** non-integer negative result: non-integer result is equivalent to +** a non-zero remainder 'm'; negative result is equivalent to 'a' and +** 'b' with different signs, or 'm' and 'b' with different signs +** (as the result 'm' of 'fmod' has the same sign of 'a'). +*/ +#if !defined(luai_nummod) +#define luai_nummod(L,a,b,m) \ + { (void)L; (m) = l_mathop(fmod)(a,b); \ + if (((m) > 0) ? (b) < 0 : ((m) < 0 && (b) > 0)) (m) += (b); } +#endif + +/* exponentiation */ +#if !defined(luai_numpow) +#define luai_numpow(L,a,b) ((void)L, l_mathop(pow)(a,b)) +#endif + +/* the others are quite standard operations */ +#if !defined(luai_numadd) +#define luai_numadd(L,a,b) ((a)+(b)) +#define luai_numsub(L,a,b) ((a)-(b)) +#define luai_nummul(L,a,b) ((a)*(b)) +#define luai_numunm(L,a) (-(a)) +#define luai_numeq(a,b) ((a)==(b)) +#define luai_numlt(a,b) ((a)<(b)) +#define luai_numle(a,b) ((a)<=(b)) +#define luai_numgt(a,b) ((a)>(b)) +#define luai_numge(a,b) ((a)>=(b)) +#define luai_numisnan(a) (!luai_numeq((a), (a))) +#endif + + + + + +/* +** macro to control inclusion of some hard tests on stack reallocation +*/ +#if !defined(HARDSTACKTESTS) +#define condmovestack(L,pre,pos) ((void)0) +#else +/* realloc stack keeping its size */ +#define condmovestack(L,pre,pos) \ + { int sz_ = (L)->stacksize; pre; luaD_reallocstack((L), sz_, 0); pos; } +#endif + +#if !defined(HARDMEMTESTS) +#define condchangemem(L,pre,pos) ((void)0) +#else +#define condchangemem(L,pre,pos) \ + { if (G(L)->gcrunning) { pre; luaC_fullgc(L, 0); pos; } } +#endif + +#endif diff --git a/lua-5.4.0/src/lmathlib.c b/lua-5.4.0/src/lmathlib.c new file mode 100644 index 0000000..86def47 --- /dev/null +++ b/lua-5.4.0/src/lmathlib.c @@ -0,0 +1,763 @@ +/* +** $Id: lmathlib.c $ +** Standard mathematical library +** See Copyright Notice in lua.h +*/ + +#define lmathlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#undef PI +#define PI (l_mathop(3.141592653589793238462643383279502884)) + + +static int math_abs (lua_State *L) { + if (lua_isinteger(L, 1)) { + lua_Integer n = lua_tointeger(L, 1); + if (n < 0) n = (lua_Integer)(0u - (lua_Unsigned)n); + lua_pushinteger(L, n); + } + else + lua_pushnumber(L, l_mathop(fabs)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sin (lua_State *L) { + lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_cos (lua_State *L) { + lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tan (lua_State *L) { + lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_asin (lua_State *L) { + lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_acos (lua_State *L) { + lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_atan (lua_State *L) { + lua_Number y = luaL_checknumber(L, 1); + lua_Number x = luaL_optnumber(L, 2, 1); + lua_pushnumber(L, l_mathop(atan2)(y, x)); + return 1; +} + + +static int math_toint (lua_State *L) { + int valid; + lua_Integer n = lua_tointegerx(L, 1, &valid); + if (valid) + lua_pushinteger(L, n); + else { + luaL_checkany(L, 1); + luaL_pushfail(L); /* value is not convertible to integer */ + } + return 1; +} + + +static void pushnumint (lua_State *L, lua_Number d) { + lua_Integer n; + if (lua_numbertointeger(d, &n)) /* does 'd' fit in an integer? */ + lua_pushinteger(L, n); /* result is integer */ + else + lua_pushnumber(L, d); /* result is float */ +} + + +static int math_floor (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own floor */ + else { + lua_Number d = l_mathop(floor)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_ceil (lua_State *L) { + if (lua_isinteger(L, 1)) + lua_settop(L, 1); /* integer is its own ceil */ + else { + lua_Number d = l_mathop(ceil)(luaL_checknumber(L, 1)); + pushnumint(L, d); + } + return 1; +} + + +static int math_fmod (lua_State *L) { + if (lua_isinteger(L, 1) && lua_isinteger(L, 2)) { + lua_Integer d = lua_tointeger(L, 2); + if ((lua_Unsigned)d + 1u <= 1u) { /* special cases: -1 or 0 */ + luaL_argcheck(L, d != 0, 2, "zero"); + lua_pushinteger(L, 0); /* avoid overflow with 0x80000... / -1 */ + } + else + lua_pushinteger(L, lua_tointeger(L, 1) % d); + } + else + lua_pushnumber(L, l_mathop(fmod)(luaL_checknumber(L, 1), + luaL_checknumber(L, 2))); + return 1; +} + + +/* +** next function does not use 'modf', avoiding problems with 'double*' +** (which is not compatible with 'float*') when lua_Number is not +** 'double'. +*/ +static int math_modf (lua_State *L) { + if (lua_isinteger(L ,1)) { + lua_settop(L, 1); /* number is its own integer part */ + lua_pushnumber(L, 0); /* no fractional part */ + } + else { + lua_Number n = luaL_checknumber(L, 1); + /* integer part (rounds toward zero) */ + lua_Number ip = (n < 0) ? l_mathop(ceil)(n) : l_mathop(floor)(n); + pushnumint(L, ip); + /* fractional part (test needed for inf/-inf) */ + lua_pushnumber(L, (n == ip) ? l_mathop(0.0) : (n - ip)); + } + return 2; +} + + +static int math_sqrt (lua_State *L) { + lua_pushnumber(L, l_mathop(sqrt)(luaL_checknumber(L, 1))); + return 1; +} + + +static int math_ult (lua_State *L) { + lua_Integer a = luaL_checkinteger(L, 1); + lua_Integer b = luaL_checkinteger(L, 2); + lua_pushboolean(L, (lua_Unsigned)a < (lua_Unsigned)b); + return 1; +} + +static int math_log (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number res; + if (lua_isnoneornil(L, 2)) + res = l_mathop(log)(x); + else { + lua_Number base = luaL_checknumber(L, 2); +#if !defined(LUA_USE_C89) + if (base == l_mathop(2.0)) + res = l_mathop(log2)(x); else +#endif + if (base == l_mathop(10.0)) + res = l_mathop(log10)(x); + else + res = l_mathop(log)(x)/l_mathop(log)(base); + } + lua_pushnumber(L, res); + return 1; +} + +static int math_exp (lua_State *L) { + lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_deg (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI)); + return 1; +} + +static int math_rad (lua_State *L) { + lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0))); + return 1; +} + + +static int math_min (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imin = 1; /* index of current minimum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, i, imin, LUA_OPLT)) + imin = i; + } + lua_pushvalue(L, imin); + return 1; +} + + +static int math_max (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + int imax = 1; /* index of current maximum value */ + int i; + luaL_argcheck(L, n >= 1, 1, "value expected"); + for (i = 2; i <= n; i++) { + if (lua_compare(L, imax, i, LUA_OPLT)) + imax = i; + } + lua_pushvalue(L, imax); + return 1; +} + + +static int math_type (lua_State *L) { + if (lua_type(L, 1) == LUA_TNUMBER) + lua_pushstring(L, (lua_isinteger(L, 1)) ? "integer" : "float"); + else { + luaL_checkany(L, 1); + luaL_pushfail(L); + } + return 1; +} + + + +/* +** {================================================================== +** Pseudo-Random Number Generator based on 'xoshiro256**'. +** =================================================================== +*/ + +/* number of binary digits in the mantissa of a float */ +#define FIGS l_floatatt(MANT_DIG) + +#if FIGS > 64 +/* there are only 64 random bits; use them all */ +#undef FIGS +#define FIGS 64 +#endif + + +/* +** LUA_RAND32 forces the use of 32-bit integers in the implementation +** of the PRN generator (mainly for testing). +*/ +#if !defined(LUA_RAND32) && !defined(Rand64) + +/* try to find an integer type with at least 64 bits */ + +#if (ULONG_MAX >> 31 >> 31) >= 3 + +/* 'long' has at least 64 bits */ +#define Rand64 unsigned long + +#elif !defined(LUA_USE_C89) && defined(LLONG_MAX) + +/* there is a 'long long' type (which must have at least 64 bits) */ +#define Rand64 unsigned long long + +#elif (LUA_MAXUNSIGNED >> 31 >> 31) >= 3 + +/* 'lua_Integer' has at least 64 bits */ +#define Rand64 lua_Unsigned + +#endif + +#endif + + +#if defined(Rand64) /* { */ + +/* +** Standard implementation, using 64-bit integers. +** If 'Rand64' has more than 64 bits, the extra bits do not interfere +** with the 64 initial bits, except in a right shift. Moreover, the +** final result has to discard the extra bits. +*/ + +/* avoid using extra bits when needed */ +#define trim64(x) ((x) & 0xffffffffffffffffu) + + +/* rotate left 'x' by 'n' bits */ +static Rand64 rotl (Rand64 x, int n) { + return (x << n) | (trim64(x) >> (64 - n)); +} + +static Rand64 nextrand (Rand64 *state) { + Rand64 state0 = state[0]; + Rand64 state1 = state[1]; + Rand64 state2 = state[2] ^ state0; + Rand64 state3 = state[3] ^ state1; + Rand64 res = rotl(state1 * 5, 7) * 9; + state[0] = state0 ^ state3; + state[1] = state1 ^ state2; + state[2] = state2 ^ (state1 << 17); + state[3] = rotl(state3, 45); + return res; +} + + +/* must take care to not shift stuff by more than 63 slots */ + + +/* +** Convert bits from a random integer into a float in the +** interval [0,1), getting the higher FIG bits from the +** random unsigned integer and converting that to a float. +*/ + +/* must throw out the extra (64 - FIGS) bits */ +#define shift64_FIG (64 - FIGS) + +/* to scale to [0, 1), multiply by scaleFIG = 2^(-FIGS) */ +#define scaleFIG (l_mathop(0.5) / ((Rand64)1 << (FIGS - 1))) + +static lua_Number I2d (Rand64 x) { + return (lua_Number)(trim64(x) >> shift64_FIG) * scaleFIG; +} + +/* convert a 'Rand64' to a 'lua_Unsigned' */ +#define I2UInt(x) ((lua_Unsigned)trim64(x)) + +/* convert a 'lua_Unsigned' to a 'Rand64' */ +#define Int2I(x) ((Rand64)(x)) + + +#else /* no 'Rand64' }{ */ + +/* get an integer with at least 32 bits */ +#if LUAI_IS32INT +typedef unsigned int lu_int32; +#else +typedef unsigned long lu_int32; +#endif + + +/* +** Use two 32-bit integers to represent a 64-bit quantity. +*/ +typedef struct Rand64 { + lu_int32 h; /* higher half */ + lu_int32 l; /* lower half */ +} Rand64; + + +/* +** If 'lu_int32' has more than 32 bits, the extra bits do not interfere +** with the 32 initial bits, except in a right shift and comparisons. +** Moreover, the final result has to discard the extra bits. +*/ + +/* avoid using extra bits when needed */ +#define trim32(x) ((x) & 0xffffffffu) + + +/* +** basic operations on 'Rand64' values +*/ + +/* build a new Rand64 value */ +static Rand64 packI (lu_int32 h, lu_int32 l) { + Rand64 result; + result.h = h; + result.l = l; + return result; +} + +/* return i << n */ +static Rand64 Ishl (Rand64 i, int n) { + lua_assert(n > 0 && n < 32); + return packI((i.h << n) | (trim32(i.l) >> (32 - n)), i.l << n); +} + +/* i1 ^= i2 */ +static void Ixor (Rand64 *i1, Rand64 i2) { + i1->h ^= i2.h; + i1->l ^= i2.l; +} + +/* return i1 + i2 */ +static Rand64 Iadd (Rand64 i1, Rand64 i2) { + Rand64 result = packI(i1.h + i2.h, i1.l + i2.l); + if (trim32(result.l) < trim32(i1.l)) /* carry? */ + result.h++; + return result; +} + +/* return i * 5 */ +static Rand64 times5 (Rand64 i) { + return Iadd(Ishl(i, 2), i); /* i * 5 == (i << 2) + i */ +} + +/* return i * 9 */ +static Rand64 times9 (Rand64 i) { + return Iadd(Ishl(i, 3), i); /* i * 9 == (i << 3) + i */ +} + +/* return 'i' rotated left 'n' bits */ +static Rand64 rotl (Rand64 i, int n) { + lua_assert(n > 0 && n < 32); + return packI((i.h << n) | (trim32(i.l) >> (32 - n)), + (trim32(i.h) >> (32 - n)) | (i.l << n)); +} + +/* for offsets larger than 32, rotate right by 64 - offset */ +static Rand64 rotl1 (Rand64 i, int n) { + lua_assert(n > 32 && n < 64); + n = 64 - n; + return packI((trim32(i.h) >> n) | (i.l << (32 - n)), + (i.h << (32 - n)) | (trim32(i.l) >> n)); +} + +/* +** implementation of 'xoshiro256**' algorithm on 'Rand64' values +*/ +static Rand64 nextrand (Rand64 *state) { + Rand64 res = times9(rotl(times5(state[1]), 7)); + Rand64 t = Ishl(state[1], 17); + Ixor(&state[2], state[0]); + Ixor(&state[3], state[1]); + Ixor(&state[1], state[2]); + Ixor(&state[0], state[3]); + Ixor(&state[2], t); + state[3] = rotl1(state[3], 45); + return res; +} + + +/* +** Converts a 'Rand64' into a float. +*/ + +/* an unsigned 1 with proper type */ +#define UONE ((lu_int32)1) + + +#if FIGS <= 32 + +/* 2^(-FIGS) */ +#define scaleFIG (l_mathop(0.5) / (UONE << (FIGS - 1))) + +/* +** get up to 32 bits from higher half, shifting right to +** throw out the extra bits. +*/ +static lua_Number I2d (Rand64 x) { + lua_Number h = (lua_Number)(trim32(x.h) >> (32 - FIGS)); + return h * scaleFIG; +} + +#else /* 32 < FIGS <= 64 */ + +/* must take care to not shift stuff by more than 31 slots */ + +/* 2^(-FIGS) = 1.0 / 2^30 / 2^3 / 2^(FIGS-33) */ +#define scaleFIG \ + ((lua_Number)1.0 / (UONE << 30) / 8.0 / (UONE << (FIGS - 33))) + +/* +** use FIGS - 32 bits from lower half, throwing out the other +** (32 - (FIGS - 32)) = (64 - FIGS) bits +*/ +#define shiftLOW (64 - FIGS) + +/* +** higher 32 bits go after those (FIGS - 32) bits: shiftHI = 2^(FIGS - 32) +*/ +#define shiftHI ((lua_Number)(UONE << (FIGS - 33)) * 2.0) + + +static lua_Number I2d (Rand64 x) { + lua_Number h = (lua_Number)trim32(x.h) * shiftHI; + lua_Number l = (lua_Number)(trim32(x.l) >> shiftLOW); + return (h + l) * scaleFIG; +} + +#endif + + +/* convert a 'Rand64' to a 'lua_Unsigned' */ +static lua_Unsigned I2UInt (Rand64 x) { + return ((lua_Unsigned)trim32(x.h) << 31 << 1) | (lua_Unsigned)trim32(x.l); +} + +/* convert a 'lua_Unsigned' to a 'Rand64' */ +static Rand64 Int2I (lua_Unsigned n) { + return packI((lu_int32)(n >> 31 >> 1), (lu_int32)n); +} + +#endif /* } */ + + +/* +** A state uses four 'Rand64' values. +*/ +typedef struct { + Rand64 s[4]; +} RanState; + + +/* +** Project the random integer 'ran' into the interval [0, n]. +** Because 'ran' has 2^B possible values, the projection can only be +** uniform when the size of the interval is a power of 2 (exact +** division). Otherwise, to get a uniform projection into [0, n], we +** first compute 'lim', the smallest Mersenne number not smaller than +** 'n'. We then project 'ran' into the interval [0, lim]. If the result +** is inside [0, n], we are done. Otherwise, we try with another 'ran', +** until we have a result inside the interval. +*/ +static lua_Unsigned project (lua_Unsigned ran, lua_Unsigned n, + RanState *state) { + if ((n & (n + 1)) == 0) /* is 'n + 1' a power of 2? */ + return ran & n; /* no bias */ + else { + lua_Unsigned lim = n; + /* compute the smallest (2^b - 1) not smaller than 'n' */ + lim |= (lim >> 1); + lim |= (lim >> 2); + lim |= (lim >> 4); + lim |= (lim >> 8); + lim |= (lim >> 16); +#if (LUA_MAXUNSIGNED >> 31) >= 3 + lim |= (lim >> 32); /* integer type has more than 32 bits */ +#endif + lua_assert((lim & (lim + 1)) == 0 /* 'lim + 1' is a power of 2, */ + && lim >= n /* not smaller than 'n', */ + && (lim >> 1) < n); /* and it is the smallest one */ + while ((ran &= lim) > n) /* project 'ran' into [0..lim] */ + ran = I2UInt(nextrand(state->s)); /* not inside [0..n]? try again */ + return ran; + } +} + + +static int math_random (lua_State *L) { + lua_Integer low, up; + lua_Unsigned p; + RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); + Rand64 rv = nextrand(state->s); /* next pseudo-random value */ + switch (lua_gettop(L)) { /* check number of arguments */ + case 0: { /* no arguments */ + lua_pushnumber(L, I2d(rv)); /* float between 0 and 1 */ + return 1; + } + case 1: { /* only upper limit */ + low = 1; + up = luaL_checkinteger(L, 1); + if (up == 0) { /* single 0 as argument? */ + lua_pushinteger(L, I2UInt(rv)); /* full random integer */ + return 1; + } + break; + } + case 2: { /* lower and upper limits */ + low = luaL_checkinteger(L, 1); + up = luaL_checkinteger(L, 2); + break; + } + default: return luaL_error(L, "wrong number of arguments"); + } + /* random integer in the interval [low, up] */ + luaL_argcheck(L, low <= up, 1, "interval is empty"); + /* project random integer into the interval [0, up - low] */ + p = project(I2UInt(rv), (lua_Unsigned)up - (lua_Unsigned)low, state); + lua_pushinteger(L, p + (lua_Unsigned)low); + return 1; +} + + +static void setseed (lua_State *L, Rand64 *state, + lua_Unsigned n1, lua_Unsigned n2) { + int i; + state[0] = Int2I(n1); + state[1] = Int2I(0xff); /* avoid a zero state */ + state[2] = Int2I(n2); + state[3] = Int2I(0); + for (i = 0; i < 16; i++) + nextrand(state); /* discard initial values to "spread" seed */ + lua_pushinteger(L, n1); + lua_pushinteger(L, n2); +} + + +/* +** Set a "random" seed. To get some randomness, use the current time +** and the address of 'L' (in case the machine does address space layout +** randomization). +*/ +static void randseed (lua_State *L, RanState *state) { + lua_Unsigned seed1 = (lua_Unsigned)time(NULL); + lua_Unsigned seed2 = (lua_Unsigned)(size_t)L; + setseed(L, state->s, seed1, seed2); +} + + +static int math_randomseed (lua_State *L) { + RanState *state = (RanState *)lua_touserdata(L, lua_upvalueindex(1)); + if (lua_isnone(L, 1)) { + randseed(L, state); + } + else { + lua_Integer n1 = luaL_checkinteger(L, 1); + lua_Integer n2 = luaL_optinteger(L, 2, 0); + setseed(L, state->s, n1, n2); + } + return 2; /* return seeds */ +} + + +static const luaL_Reg randfuncs[] = { + {"random", math_random}, + {"randomseed", math_randomseed}, + {NULL, NULL} +}; + + +/* +** Register the random functions and initialize their state. +*/ +static void setrandfunc (lua_State *L) { + RanState *state = (RanState *)lua_newuserdatauv(L, sizeof(RanState), 0); + randseed(L, state); /* initialize with a "random" seed */ + lua_pop(L, 2); /* remove pushed seeds */ + luaL_setfuncs(L, randfuncs, 1); +} + +/* }================================================================== */ + + +/* +** {================================================================== +** Deprecated functions (for compatibility only) +** =================================================================== +*/ +#if defined(LUA_COMPAT_MATHLIB) + +static int math_cosh (lua_State *L) { + lua_pushnumber(L, l_mathop(cosh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_sinh (lua_State *L) { + lua_pushnumber(L, l_mathop(sinh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_tanh (lua_State *L) { + lua_pushnumber(L, l_mathop(tanh)(luaL_checknumber(L, 1))); + return 1; +} + +static int math_pow (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + lua_Number y = luaL_checknumber(L, 2); + lua_pushnumber(L, l_mathop(pow)(x, y)); + return 1; +} + +static int math_frexp (lua_State *L) { + int e; + lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e)); + lua_pushinteger(L, e); + return 2; +} + +static int math_ldexp (lua_State *L) { + lua_Number x = luaL_checknumber(L, 1); + int ep = (int)luaL_checkinteger(L, 2); + lua_pushnumber(L, l_mathop(ldexp)(x, ep)); + return 1; +} + +static int math_log10 (lua_State *L) { + lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1))); + return 1; +} + +#endif +/* }================================================================== */ + + + +static const luaL_Reg mathlib[] = { + {"abs", math_abs}, + {"acos", math_acos}, + {"asin", math_asin}, + {"atan", math_atan}, + {"ceil", math_ceil}, + {"cos", math_cos}, + {"deg", math_deg}, + {"exp", math_exp}, + {"tointeger", math_toint}, + {"floor", math_floor}, + {"fmod", math_fmod}, + {"ult", math_ult}, + {"log", math_log}, + {"max", math_max}, + {"min", math_min}, + {"modf", math_modf}, + {"rad", math_rad}, + {"sin", math_sin}, + {"sqrt", math_sqrt}, + {"tan", math_tan}, + {"type", math_type}, +#if defined(LUA_COMPAT_MATHLIB) + {"atan2", math_atan}, + {"cosh", math_cosh}, + {"sinh", math_sinh}, + {"tanh", math_tanh}, + {"pow", math_pow}, + {"frexp", math_frexp}, + {"ldexp", math_ldexp}, + {"log10", math_log10}, +#endif + /* placeholders */ + {"random", NULL}, + {"randomseed", NULL}, + {"pi", NULL}, + {"huge", NULL}, + {"maxinteger", NULL}, + {"mininteger", NULL}, + {NULL, NULL} +}; + + +/* +** Open math library +*/ +LUAMOD_API int luaopen_math (lua_State *L) { + luaL_newlib(L, mathlib); + lua_pushnumber(L, PI); + lua_setfield(L, -2, "pi"); + lua_pushnumber(L, (lua_Number)HUGE_VAL); + lua_setfield(L, -2, "huge"); + lua_pushinteger(L, LUA_MAXINTEGER); + lua_setfield(L, -2, "maxinteger"); + lua_pushinteger(L, LUA_MININTEGER); + lua_setfield(L, -2, "mininteger"); + setrandfunc(L); + return 1; +} + diff --git a/lua-5.4.0/src/lmem.c b/lua-5.4.0/src/lmem.c new file mode 100644 index 0000000..65bfa52 --- /dev/null +++ b/lua-5.4.0/src/lmem.c @@ -0,0 +1,202 @@ +/* +** $Id: lmem.c $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#define lmem_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" + + +#if defined(HARDMEMTESTS) +/* +** First allocation will fail whenever not building initial state +** and not shrinking a block. (This fail will trigger 'tryagain' and +** a full GC cycle at every allocation.) +*/ +static void *firsttry (global_State *g, void *block, size_t os, size_t ns) { + if (ttisnil(&g->nilvalue) && ns > os) + return NULL; /* fail */ + else /* normal allocation */ + return (*g->frealloc)(g->ud, block, os, ns); +} +#else +#define firsttry(g,block,os,ns) ((*g->frealloc)(g->ud, block, os, ns)) +#endif + + + + + +/* +** About the realloc function: +** void *frealloc (void *ud, void *ptr, size_t osize, size_t nsize); +** ('osize' is the old size, 'nsize' is the new size) +** +** - frealloc(ud, p, x, 0) frees the block 'p' and returns NULL. +** Particularly, frealloc(ud, NULL, 0, 0) does nothing, +** which is equivalent to free(NULL) in ISO C. +** +** - frealloc(ud, NULL, x, s) creates a new block of size 's' +** (no matter 'x'). Returns NULL if it cannot create the new block. +** +** - otherwise, frealloc(ud, b, x, y) reallocates the block 'b' from +** size 'x' to size 'y'. Returns NULL if it cannot reallocate the +** block to the new size. +*/ + + + + +/* +** {================================================================== +** Functions to allocate/deallocate arrays for the Parser +** =================================================================== +*/ + +/* +** Minimum size for arrays during parsing, to avoid overhead of +** reallocating to size 1, then 2, and then 4. All these arrays +** will be reallocated to exact sizes or erased when parsing ends. +*/ +#define MINSIZEARRAY 4 + + +void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize, + int size_elems, int limit, const char *what) { + void *newblock; + int size = *psize; + if (nelems + 1 <= size) /* does one extra element still fit? */ + return block; /* nothing to be done */ + if (size >= limit / 2) { /* cannot double it? */ + if (unlikely(size >= limit)) /* cannot grow even a little? */ + luaG_runerror(L, "too many %s (limit is %d)", what, limit); + size = limit; /* still have at least one free place */ + } + else { + size *= 2; + if (size < MINSIZEARRAY) + size = MINSIZEARRAY; /* minimum size */ + } + lua_assert(nelems + 1 <= size && size <= limit); + /* 'limit' ensures that multiplication will not overflow */ + newblock = luaM_saferealloc_(L, block, cast_sizet(*psize) * size_elems, + cast_sizet(size) * size_elems); + *psize = size; /* update only when everything else is OK */ + return newblock; +} + + +/* +** In prototypes, the size of the array is also its number of +** elements (to save memory). So, if it cannot shrink an array +** to its number of elements, the only option is to raise an +** error. +*/ +void *luaM_shrinkvector_ (lua_State *L, void *block, int *size, + int final_n, int size_elem) { + void *newblock; + size_t oldsize = cast_sizet((*size) * size_elem); + size_t newsize = cast_sizet(final_n * size_elem); + lua_assert(newsize <= oldsize); + newblock = luaM_saferealloc_(L, block, oldsize, newsize); + *size = final_n; + return newblock; +} + +/* }================================================================== */ + + +l_noret luaM_toobig (lua_State *L) { + luaG_runerror(L, "memory allocation error: block too big"); +} + + +/* +** Free memory +*/ +void luaM_free_ (lua_State *L, void *block, size_t osize) { + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + (*g->frealloc)(g->ud, block, osize, 0); + g->GCdebt -= osize; +} + + +/* +** In case of allocation fail, this function will call the GC to try +** to free some memory and then try the allocation again. +** (It should not be called when shrinking a block, because then the +** interpreter may be in the middle of a collection step.) +*/ +static void *tryagain (lua_State *L, void *block, + size_t osize, size_t nsize) { + global_State *g = G(L); + if (ttisnil(&g->nilvalue)) { /* is state fully build? */ + luaC_fullgc(L, 1); /* try to free some memory... */ + return (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ + } + else return NULL; /* cannot free any memory without a full state */ +} + + +/* +** Generic allocation routine. +** If allocation fails while shrinking a block, do not try again; the +** GC shrinks some blocks and it is not reentrant. +*/ +void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { + void *newblock; + global_State *g = G(L); + lua_assert((osize == 0) == (block == NULL)); + newblock = firsttry(g, block, osize, nsize); + if (unlikely(newblock == NULL && nsize > 0)) { + if (nsize > osize) /* not shrinking a block? */ + newblock = tryagain(L, block, osize, nsize); + if (newblock == NULL) /* still no memory? */ + return NULL; /* do not update 'GCdebt' */ + } + lua_assert((nsize == 0) == (newblock == NULL)); + g->GCdebt = (g->GCdebt + nsize) - osize; + return newblock; +} + + +void *luaM_saferealloc_ (lua_State *L, void *block, size_t osize, + size_t nsize) { + void *newblock = luaM_realloc_(L, block, osize, nsize); + if (unlikely(newblock == NULL && nsize > 0)) /* allocation failed? */ + luaM_error(L); + return newblock; +} + + +void *luaM_malloc_ (lua_State *L, size_t size, int tag) { + if (size == 0) + return NULL; /* that's all */ + else { + global_State *g = G(L); + void *newblock = firsttry(g, NULL, tag, size); + if (unlikely(newblock == NULL)) { + newblock = tryagain(L, NULL, tag, size); + if (newblock == NULL) + luaM_error(L); + } + g->GCdebt += size; + return newblock; + } +} diff --git a/lua-5.4.0/src/lmem.h b/lua-5.4.0/src/lmem.h new file mode 100644 index 0000000..8c75a44 --- /dev/null +++ b/lua-5.4.0/src/lmem.h @@ -0,0 +1,93 @@ +/* +** $Id: lmem.h $ +** Interface to Memory Manager +** See Copyright Notice in lua.h +*/ + +#ifndef lmem_h +#define lmem_h + + +#include + +#include "llimits.h" +#include "lua.h" + + +#define luaM_error(L) luaD_throw(L, LUA_ERRMEM) + + +/* +** This macro tests whether it is safe to multiply 'n' by the size of +** type 't' without overflows. Because 'e' is always constant, it avoids +** the runtime division MAX_SIZET/(e). +** (The macro is somewhat complex to avoid warnings: The 'sizeof' +** comparison avoids a runtime comparison when overflow cannot occur. +** The compiler should be able to optimize the real test by itself, but +** when it does it, it may give a warning about "comparison is always +** false due to limited range of data type"; the +1 tricks the compiler, +** avoiding this warning but also this optimization.) +*/ +#define luaM_testsize(n,e) \ + (sizeof(n) >= sizeof(size_t) && cast_sizet((n)) + 1 > MAX_SIZET/(e)) + +#define luaM_checksize(L,n,e) \ + (luaM_testsize(n,e) ? luaM_toobig(L) : cast_void(0)) + + +/* +** Computes the minimum between 'n' and 'MAX_SIZET/sizeof(t)', so that +** the result is not larger than 'n' and cannot overflow a 'size_t' +** when multiplied by the size of type 't'. (Assumes that 'n' is an +** 'int' or 'unsigned int' and that 'int' is not larger than 'size_t'.) +*/ +#define luaM_limitN(n,t) \ + ((cast_sizet(n) <= MAX_SIZET/sizeof(t)) ? (n) : \ + cast_uint((MAX_SIZET/sizeof(t)))) + + +/* +** Arrays of chars do not need any test +*/ +#define luaM_reallocvchar(L,b,on,n) \ + cast_charp(luaM_saferealloc_(L, (b), (on)*sizeof(char), (n)*sizeof(char))) + +#define luaM_freemem(L, b, s) luaM_free_(L, (b), (s)) +#define luaM_free(L, b) luaM_free_(L, (b), sizeof(*(b))) +#define luaM_freearray(L, b, n) luaM_free_(L, (b), (n)*sizeof(*(b))) + +#define luaM_new(L,t) cast(t*, luaM_malloc_(L, sizeof(t), 0)) +#define luaM_newvector(L,n,t) cast(t*, luaM_malloc_(L, (n)*sizeof(t), 0)) +#define luaM_newvectorchecked(L,n,t) \ + (luaM_checksize(L,n,sizeof(t)), luaM_newvector(L,n,t)) + +#define luaM_newobject(L,tag,s) luaM_malloc_(L, (s), tag) + +#define luaM_growvector(L,v,nelems,size,t,limit,e) \ + ((v)=cast(t *, luaM_growaux_(L,v,nelems,&(size),sizeof(t), \ + luaM_limitN(limit,t),e))) + +#define luaM_reallocvector(L, v,oldn,n,t) \ + (cast(t *, luaM_realloc_(L, v, cast_sizet(oldn) * sizeof(t), \ + cast_sizet(n) * sizeof(t)))) + +#define luaM_shrinkvector(L,v,size,fs,t) \ + ((v)=cast(t *, luaM_shrinkvector_(L, v, &(size), fs, sizeof(t)))) + +LUAI_FUNC l_noret luaM_toobig (lua_State *L); + +/* not to be called directly */ +LUAI_FUNC void *luaM_realloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void *luaM_saferealloc_ (lua_State *L, void *block, size_t oldsize, + size_t size); +LUAI_FUNC void luaM_free_ (lua_State *L, void *block, size_t osize); +LUAI_FUNC void *luaM_growaux_ (lua_State *L, void *block, int nelems, + int *size, int size_elem, int limit, + const char *what); +LUAI_FUNC void *luaM_shrinkvector_ (lua_State *L, void *block, int *nelem, + int final_n, int size_elem); +LUAI_FUNC void *luaM_malloc_ (lua_State *L, size_t size, int tag); + +#endif + diff --git a/lua-5.4.0/src/loadlib.c b/lua-5.4.0/src/loadlib.c new file mode 100644 index 0000000..c0ec9a1 --- /dev/null +++ b/lua-5.4.0/src/loadlib.c @@ -0,0 +1,759 @@ +/* +** $Id: loadlib.c $ +** Dynamic library loader for Lua +** See Copyright Notice in lua.h +** +** This module contains an implementation of loadlib for Unix systems +** that have dlfcn, an implementation for Windows, and a stub for other +** systems. +*/ + +#define loadlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** LUA_IGMARK is a mark to ignore all before it when building the +** luaopen_ function name. +*/ +#if !defined (LUA_IGMARK) +#define LUA_IGMARK "-" +#endif + + +/* +** LUA_CSUBSEP is the character that replaces dots in submodule names +** when searching for a C loader. +** LUA_LSUBSEP is the character that replaces dots in submodule names +** when searching for a Lua loader. +*/ +#if !defined(LUA_CSUBSEP) +#define LUA_CSUBSEP LUA_DIRSEP +#endif + +#if !defined(LUA_LSUBSEP) +#define LUA_LSUBSEP LUA_DIRSEP +#endif + + +/* prefix for open functions in C libraries */ +#define LUA_POF "luaopen_" + +/* separator for open functions in C libraries */ +#define LUA_OFSEP "_" + + +/* +** key for table in the registry that keeps handles +** for all loaded C libraries +*/ +static const char *const CLIBS = "_CLIBS"; + +#define LIB_FAIL "open" + + +#define setprogdir(L) ((void)0) + + +/* +** Special type equivalent to '(void*)' for functions in gcc +** (to suppress warnings when converting function pointers) +*/ +typedef void (*voidf)(void); + + +/* +** system-dependent functions +*/ + +/* +** unload library 'lib' +*/ +static void lsys_unloadlib (void *lib); + +/* +** load C library in file 'path'. If 'seeglb', load with all names in +** the library global. +** Returns the library; in case of error, returns NULL plus an +** error string in the stack. +*/ +static void *lsys_load (lua_State *L, const char *path, int seeglb); + +/* +** Try to find a function named 'sym' in library 'lib'. +** Returns the function; in case of error, returns NULL plus an +** error string in the stack. +*/ +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym); + + + + +#if defined(LUA_USE_DLOPEN) /* { */ +/* +** {======================================================================== +** This is an implementation of loadlib based on the dlfcn interface. +** The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, +** NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least +** as an emulation layer on top of native functions. +** ========================================================================= +*/ + +#include + +/* +** Macro to convert pointer-to-void* to pointer-to-function. This cast +** is undefined according to ISO C, but POSIX assumes that it works. +** (The '__extension__' in gnu compilers is only to avoid warnings.) +*/ +#if defined(__GNUC__) +#define cast_func(p) (__extension__ (lua_CFunction)(p)) +#else +#define cast_func(p) ((lua_CFunction)(p)) +#endif + + +static void lsys_unloadlib (void *lib) { + dlclose(lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + void *lib = dlopen(path, RTLD_NOW | (seeglb ? RTLD_GLOBAL : RTLD_LOCAL)); + if (lib == NULL) lua_pushstring(L, dlerror()); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = cast_func(dlsym(lib, sym)); + if (f == NULL) lua_pushstring(L, dlerror()); + return f; +} + +/* }====================================================== */ + + + +#elif defined(LUA_DL_DLL) /* }{ */ +/* +** {====================================================================== +** This is an implementation of loadlib for Windows using native functions. +** ======================================================================= +*/ + +#include + + +/* +** optional flags for LoadLibraryEx +*/ +#if !defined(LUA_LLE_FLAGS) +#define LUA_LLE_FLAGS 0 +#endif + + +#undef setprogdir + + +/* +** Replace in the path (on the top of the stack) any occurrence +** of LUA_EXEC_DIR with the executable's path. +*/ +static void setprogdir (lua_State *L) { + char buff[MAX_PATH + 1]; + char *lb; + DWORD nsize = sizeof(buff)/sizeof(char); + DWORD n = GetModuleFileNameA(NULL, buff, nsize); /* get exec. name */ + if (n == 0 || n == nsize || (lb = strrchr(buff, '\\')) == NULL) + luaL_error(L, "unable to get ModuleFileName"); + else { + *lb = '\0'; /* cut name on the last '\\' to get the path */ + luaL_gsub(L, lua_tostring(L, -1), LUA_EXEC_DIR, buff); + lua_remove(L, -2); /* remove original string */ + } +} + + + + +static void pusherror (lua_State *L) { + int error = GetLastError(); + char buffer[128]; + if (FormatMessageA(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, error, 0, buffer, sizeof(buffer)/sizeof(char), NULL)) + lua_pushstring(L, buffer); + else + lua_pushfstring(L, "system error %d\n", error); +} + +static void lsys_unloadlib (void *lib) { + FreeLibrary((HMODULE)lib); +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + HMODULE lib = LoadLibraryExA(path, NULL, LUA_LLE_FLAGS); + (void)(seeglb); /* not used: symbols are 'global' by default */ + if (lib == NULL) pusherror(L); + return lib; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + lua_CFunction f = (lua_CFunction)(voidf)GetProcAddress((HMODULE)lib, sym); + if (f == NULL) pusherror(L); + return f; +} + +/* }====================================================== */ + + +#else /* }{ */ +/* +** {====================================================== +** Fallback for other systems +** ======================================================= +*/ + +#undef LIB_FAIL +#define LIB_FAIL "absent" + + +#define DLMSG "dynamic libraries not enabled; check your Lua installation" + + +static void lsys_unloadlib (void *lib) { + (void)(lib); /* not used */ +} + + +static void *lsys_load (lua_State *L, const char *path, int seeglb) { + (void)(path); (void)(seeglb); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + + +static lua_CFunction lsys_sym (lua_State *L, void *lib, const char *sym) { + (void)(lib); (void)(sym); /* not used */ + lua_pushliteral(L, DLMSG); + return NULL; +} + +/* }====================================================== */ +#endif /* } */ + + +/* +** {================================================================== +** Set Paths +** =================================================================== +*/ + +/* +** LUA_PATH_VAR and LUA_CPATH_VAR are the names of the environment +** variables that Lua check to set its paths. +*/ +#if !defined(LUA_PATH_VAR) +#define LUA_PATH_VAR "LUA_PATH" +#endif + +#if !defined(LUA_CPATH_VAR) +#define LUA_CPATH_VAR "LUA_CPATH" +#endif + + + +/* +** return registry.LUA_NOENV as a boolean +*/ +static int noenv (lua_State *L) { + int b; + lua_getfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + b = lua_toboolean(L, -1); + lua_pop(L, 1); /* remove value */ + return b; +} + + +/* +** Set a path +*/ +static void setpath (lua_State *L, const char *fieldname, + const char *envname, + const char *dft) { + const char *dftmark; + const char *nver = lua_pushfstring(L, "%s%s", envname, LUA_VERSUFFIX); + const char *path = getenv(nver); /* try versioned name */ + if (path == NULL) /* no versioned environment variable? */ + path = getenv(envname); /* try unversioned name */ + if (path == NULL || noenv(L)) /* no environment variable? */ + lua_pushstring(L, dft); /* use default */ + else if ((dftmark = strstr(path, LUA_PATH_SEP LUA_PATH_SEP)) == NULL) + lua_pushstring(L, path); /* nothing to change */ + else { /* path contains a ";;": insert default path in its place */ + size_t len = strlen(path); + luaL_Buffer b; + luaL_buffinit(L, &b); + if (path < dftmark) { /* is there a prefix before ';;'? */ + luaL_addlstring(&b, path, dftmark - path); /* add it */ + luaL_addchar(&b, *LUA_PATH_SEP); + } + luaL_addstring(&b, dft); /* add default */ + if (dftmark < path + len - 2) { /* is there a suffix after ';;'? */ + luaL_addchar(&b, *LUA_PATH_SEP); + luaL_addlstring(&b, dftmark + 2, (path + len - 2) - dftmark); + } + luaL_pushresult(&b); + } + setprogdir(L); + lua_setfield(L, -3, fieldname); /* package[fieldname] = path value */ + lua_pop(L, 1); /* pop versioned variable name ('nver') */ +} + +/* }================================================================== */ + + +/* +** return registry.CLIBS[path] +*/ +static void *checkclib (lua_State *L, const char *path) { + void *plib; + lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); + lua_getfield(L, -1, path); + plib = lua_touserdata(L, -1); /* plib = CLIBS[path] */ + lua_pop(L, 2); /* pop CLIBS table and 'plib' */ + return plib; +} + + +/* +** registry.CLIBS[path] = plib -- for queries +** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries +*/ +static void addtoclib (lua_State *L, const char *path, void *plib) { + lua_getfield(L, LUA_REGISTRYINDEX, CLIBS); + lua_pushlightuserdata(L, plib); + lua_pushvalue(L, -1); + lua_setfield(L, -3, path); /* CLIBS[path] = plib */ + lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */ + lua_pop(L, 1); /* pop CLIBS table */ +} + + +/* +** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib +** handles in list CLIBS +*/ +static int gctm (lua_State *L) { + lua_Integer n = luaL_len(L, 1); + for (; n >= 1; n--) { /* for each handle, in reverse order */ + lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */ + lsys_unloadlib(lua_touserdata(L, -1)); + lua_pop(L, 1); /* pop handle */ + } + return 0; +} + + + +/* error codes for 'lookforfunc' */ +#define ERRLIB 1 +#define ERRFUNC 2 + +/* +** Look for a C function named 'sym' in a dynamically loaded library +** 'path'. +** First, check whether the library is already loaded; if not, try +** to load it. +** Then, if 'sym' is '*', return true (as library has been loaded). +** Otherwise, look for symbol 'sym' in the library and push a +** C function with that symbol. +** Return 0 and 'true' or a function in the stack; in case of +** errors, return an error code and an error message in the stack. +*/ +static int lookforfunc (lua_State *L, const char *path, const char *sym) { + void *reg = checkclib(L, path); /* check loaded C libraries */ + if (reg == NULL) { /* must load library? */ + reg = lsys_load(L, path, *sym == '*'); /* global symbols if 'sym'=='*' */ + if (reg == NULL) return ERRLIB; /* unable to load library */ + addtoclib(L, path, reg); + } + if (*sym == '*') { /* loading only library (no function)? */ + lua_pushboolean(L, 1); /* return 'true' */ + return 0; /* no errors */ + } + else { + lua_CFunction f = lsys_sym(L, reg, sym); + if (f == NULL) + return ERRFUNC; /* unable to find function */ + lua_pushcfunction(L, f); /* else create new function */ + return 0; /* no errors */ + } +} + + +static int ll_loadlib (lua_State *L) { + const char *path = luaL_checkstring(L, 1); + const char *init = luaL_checkstring(L, 2); + int stat = lookforfunc(L, path, init); + if (stat == 0) /* no errors? */ + return 1; /* return the loaded function */ + else { /* error; error message is on stack top */ + luaL_pushfail(L); + lua_insert(L, -2); + lua_pushstring(L, (stat == ERRLIB) ? LIB_FAIL : "init"); + return 3; /* return fail, error message, and where */ + } +} + + + +/* +** {====================================================== +** 'require' function +** ======================================================= +*/ + + +static int readable (const char *filename) { + FILE *f = fopen(filename, "r"); /* try to open file */ + if (f == NULL) return 0; /* open failed */ + fclose(f); + return 1; +} + + +/* +** Get the next name in '*path' = 'name1;name2;name3;...', changing +** the ending ';' to '\0' to create a zero-terminated string. Return +** NULL when list ends. +*/ +static const char *getnextfilename (char **path, char *end) { + char *sep; + char *name = *path; + if (name == end) + return NULL; /* no more names */ + else if (*name == '\0') { /* from previous iteration? */ + *name = *LUA_PATH_SEP; /* restore separator */ + name++; /* skip it */ + } + sep = strchr(name, *LUA_PATH_SEP); /* find next separator */ + if (sep == NULL) /* separator not found? */ + sep = end; /* name goes until the end */ + *sep = '\0'; /* finish file name */ + *path = sep; /* will start next search from here */ + return name; +} + + +/* +** Given a path such as ";blabla.so;blublu.so", pushes the string +** +** no file 'blabla.so' +** no file 'blublu.so' +*/ +static void pusherrornotfound (lua_State *L, const char *path) { + luaL_Buffer b; + luaL_buffinit(L, &b); + luaL_addstring(&b, "no file '"); + luaL_addgsub(&b, path, LUA_PATH_SEP, "'\n\tno file '"); + luaL_addstring(&b, "'"); + luaL_pushresult(&b); +} + + +static const char *searchpath (lua_State *L, const char *name, + const char *path, + const char *sep, + const char *dirsep) { + luaL_Buffer buff; + char *pathname; /* path with name inserted */ + char *endpathname; /* its end */ + const char *filename; + /* separator is non-empty and appears in 'name'? */ + if (*sep != '\0' && strchr(name, *sep) != NULL) + name = luaL_gsub(L, name, sep, dirsep); /* replace it by 'dirsep' */ + luaL_buffinit(L, &buff); + /* add path to the buffer, replacing marks ('?') with the file name */ + luaL_addgsub(&buff, path, LUA_PATH_MARK, name); + luaL_addchar(&buff, '\0'); + pathname = luaL_buffaddr(&buff); /* writable list of file names */ + endpathname = pathname + luaL_bufflen(&buff) - 1; + while ((filename = getnextfilename(&pathname, endpathname)) != NULL) { + if (readable(filename)) /* does file exist and is readable? */ + return lua_pushstring(L, filename); /* save and return name */ + } + luaL_pushresult(&buff); /* push path to create error message */ + pusherrornotfound(L, lua_tostring(L, -1)); /* create error message */ + return NULL; /* not found */ +} + + +static int ll_searchpath (lua_State *L) { + const char *f = searchpath(L, luaL_checkstring(L, 1), + luaL_checkstring(L, 2), + luaL_optstring(L, 3, "."), + luaL_optstring(L, 4, LUA_DIRSEP)); + if (f != NULL) return 1; + else { /* error message is on top of the stack */ + luaL_pushfail(L); + lua_insert(L, -2); + return 2; /* return fail + error message */ + } +} + + +static const char *findfile (lua_State *L, const char *name, + const char *pname, + const char *dirsep) { + const char *path; + lua_getfield(L, lua_upvalueindex(1), pname); + path = lua_tostring(L, -1); + if (path == NULL) + luaL_error(L, "'package.%s' must be a string", pname); + return searchpath(L, name, path, ".", dirsep); +} + + +static int checkload (lua_State *L, int stat, const char *filename) { + if (stat) { /* module loaded successfully? */ + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; /* return open function and file name */ + } + else + return luaL_error(L, "error loading module '%s' from file '%s':\n\t%s", + lua_tostring(L, 1), filename, lua_tostring(L, -1)); +} + + +static int searcher_Lua (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + filename = findfile(L, name, "path", LUA_LSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename); +} + + +/* +** Try to find a load function for module 'modname' at file 'filename'. +** First, change '.' to '_' in 'modname'; then, if 'modname' has +** the form X-Y (that is, it has an "ignore mark"), build a function +** name "luaopen_X" and look for it. (For compatibility, if that +** fails, it also tries "luaopen_Y".) If there is no ignore mark, +** look for a function named "luaopen_modname". +*/ +static int loadfunc (lua_State *L, const char *filename, const char *modname) { + const char *openfunc; + const char *mark; + modname = luaL_gsub(L, modname, ".", LUA_OFSEP); + mark = strchr(modname, *LUA_IGMARK); + if (mark) { + int stat; + openfunc = lua_pushlstring(L, modname, mark - modname); + openfunc = lua_pushfstring(L, LUA_POF"%s", openfunc); + stat = lookforfunc(L, filename, openfunc); + if (stat != ERRFUNC) return stat; + modname = mark + 1; /* else go ahead and try old-style name */ + } + openfunc = lua_pushfstring(L, LUA_POF"%s", modname); + return lookforfunc(L, filename, openfunc); +} + + +static int searcher_C (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + const char *filename = findfile(L, name, "cpath", LUA_CSUBSEP); + if (filename == NULL) return 1; /* module not found in this path */ + return checkload(L, (loadfunc(L, filename, name) == 0), filename); +} + + +static int searcher_Croot (lua_State *L) { + const char *filename; + const char *name = luaL_checkstring(L, 1); + const char *p = strchr(name, '.'); + int stat; + if (p == NULL) return 0; /* is root */ + lua_pushlstring(L, name, p - name); + filename = findfile(L, lua_tostring(L, -1), "cpath", LUA_CSUBSEP); + if (filename == NULL) return 1; /* root not found */ + if ((stat = loadfunc(L, filename, name)) != 0) { + if (stat != ERRFUNC) + return checkload(L, 0, filename); /* real error */ + else { /* open function not found */ + lua_pushfstring(L, "no module '%s' in file '%s'", name, filename); + return 1; + } + } + lua_pushstring(L, filename); /* will be 2nd argument to module */ + return 2; +} + + +static int searcher_preload (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_getfield(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + if (lua_getfield(L, -1, name) == LUA_TNIL) { /* not found? */ + lua_pushfstring(L, "no field package.preload['%s']", name); + return 1; + } + else { + lua_pushliteral(L, ":preload:"); + return 2; + } +} + + +static void findloader (lua_State *L, const char *name) { + int i; + luaL_Buffer msg; /* to build error message */ + /* push 'package.searchers' to index 3 in the stack */ + if (lua_getfield(L, lua_upvalueindex(1), "searchers") != LUA_TTABLE) + luaL_error(L, "'package.searchers' must be a table"); + luaL_buffinit(L, &msg); + /* iterate over available searchers to find a loader */ + for (i = 1; ; i++) { + luaL_addstring(&msg, "\n\t"); /* error-message prefix */ + if (lua_rawgeti(L, 3, i) == LUA_TNIL) { /* no more searchers? */ + lua_pop(L, 1); /* remove nil */ + luaL_buffsub(&msg, 2); /* remove prefix */ + luaL_pushresult(&msg); /* create error message */ + luaL_error(L, "module '%s' not found:%s", name, lua_tostring(L, -1)); + } + lua_pushstring(L, name); + lua_call(L, 1, 2); /* call it */ + if (lua_isfunction(L, -2)) /* did it find a loader? */ + return; /* module loader found */ + else if (lua_isstring(L, -2)) { /* searcher returned error message? */ + lua_pop(L, 1); /* remove extra return */ + luaL_addvalue(&msg); /* concatenate error message */ + } + else { /* no error message */ + lua_pop(L, 2); /* remove both returns */ + luaL_buffsub(&msg, 2); /* remove prefix */ + } + } +} + + +static int ll_require (lua_State *L) { + const char *name = luaL_checkstring(L, 1); + lua_settop(L, 1); /* LOADED table will be at index 2 */ + lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_getfield(L, 2, name); /* LOADED[name] */ + if (lua_toboolean(L, -1)) /* is it there? */ + return 1; /* package is already loaded */ + /* else must load package */ + lua_pop(L, 1); /* remove 'getfield' result */ + findloader(L, name); + lua_rotate(L, -2, 1); /* function <-> loader data */ + lua_pushvalue(L, 1); /* name is 1st argument to module loader */ + lua_pushvalue(L, -3); /* loader data is 2nd argument */ + /* stack: ...; loader data; loader function; mod. name; loader data */ + lua_call(L, 2, 1); /* run loader to load module */ + /* stack: ...; loader data; result from loader */ + if (!lua_isnil(L, -1)) /* non-nil return? */ + lua_setfield(L, 2, name); /* LOADED[name] = returned value */ + else + lua_pop(L, 1); /* pop nil */ + if (lua_getfield(L, 2, name) == LUA_TNIL) { /* module set no value? */ + lua_pushboolean(L, 1); /* use true as result */ + lua_copy(L, -1, -2); /* replace loader result */ + lua_setfield(L, 2, name); /* LOADED[name] = true */ + } + lua_rotate(L, -2, 1); /* loader data <-> module result */ + return 2; /* return module result and loader data */ +} + +/* }====================================================== */ + + + + +static const luaL_Reg pk_funcs[] = { + {"loadlib", ll_loadlib}, + {"searchpath", ll_searchpath}, + /* placeholders */ + {"preload", NULL}, + {"cpath", NULL}, + {"path", NULL}, + {"searchers", NULL}, + {"loaded", NULL}, + {NULL, NULL} +}; + + +static const luaL_Reg ll_funcs[] = { + {"require", ll_require}, + {NULL, NULL} +}; + + +static void createsearcherstable (lua_State *L) { + static const lua_CFunction searchers[] = + {searcher_preload, searcher_Lua, searcher_C, searcher_Croot, NULL}; + int i; + /* create 'searchers' table */ + lua_createtable(L, sizeof(searchers)/sizeof(searchers[0]) - 1, 0); + /* fill it with predefined searchers */ + for (i=0; searchers[i] != NULL; i++) { + lua_pushvalue(L, -2); /* set 'package' as upvalue for all searchers */ + lua_pushcclosure(L, searchers[i], 1); + lua_rawseti(L, -2, i+1); + } + lua_setfield(L, -2, "searchers"); /* put it in field 'searchers' */ +} + + +/* +** create table CLIBS to keep track of loaded C libraries, +** setting a finalizer to close all libraries when closing state. +*/ +static void createclibstable (lua_State *L) { + luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); /* create CLIBS table */ + lua_createtable(L, 0, 1); /* create metatable for CLIBS */ + lua_pushcfunction(L, gctm); + lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */ + lua_setmetatable(L, -2); +} + + +LUAMOD_API int luaopen_package (lua_State *L) { + createclibstable(L); + luaL_newlib(L, pk_funcs); /* create 'package' table */ + createsearcherstable(L); + /* set paths */ + setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT); + setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT); + /* store config information */ + lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" + LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); + lua_setfield(L, -2, "config"); + /* set field 'loaded' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_setfield(L, -2, "loaded"); + /* set field 'preload' */ + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + lua_setfield(L, -2, "preload"); + lua_pushglobaltable(L); + lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib */ + luaL_setfuncs(L, ll_funcs, 1); /* open lib into global table */ + lua_pop(L, 1); /* pop global table */ + return 1; /* return 'package' table */ +} + diff --git a/lua-5.4.0/src/lobject.c b/lua-5.4.0/src/lobject.c new file mode 100644 index 0000000..b4efae4 --- /dev/null +++ b/lua-5.4.0/src/lobject.c @@ -0,0 +1,583 @@ +/* +** $Id: lobject.c $ +** Some generic functions over Lua objects +** See Copyright Notice in lua.h +*/ + +#define lobject_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lctype.h" +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "lvm.h" + + +/* +** Computes ceil(log2(x)) +*/ +int luaO_ceillog2 (unsigned int x) { + static const lu_byte log_2[256] = { /* log_2[i] = ceil(log2(i - 1)) */ + 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 + }; + int l = 0; + x--; + while (x >= 256) { l += 8; x >>= 8; } + return l + log_2[x]; +} + + +static lua_Integer intarith (lua_State *L, int op, lua_Integer v1, + lua_Integer v2) { + switch (op) { + case LUA_OPADD: return intop(+, v1, v2); + case LUA_OPSUB:return intop(-, v1, v2); + case LUA_OPMUL:return intop(*, v1, v2); + case LUA_OPMOD: return luaV_mod(L, v1, v2); + case LUA_OPIDIV: return luaV_idiv(L, v1, v2); + case LUA_OPBAND: return intop(&, v1, v2); + case LUA_OPBOR: return intop(|, v1, v2); + case LUA_OPBXOR: return intop(^, v1, v2); + case LUA_OPSHL: return luaV_shiftl(v1, v2); + case LUA_OPSHR: return luaV_shiftl(v1, -v2); + case LUA_OPUNM: return intop(-, 0, v1); + case LUA_OPBNOT: return intop(^, ~l_castS2U(0), v1); + default: lua_assert(0); return 0; + } +} + + +static lua_Number numarith (lua_State *L, int op, lua_Number v1, + lua_Number v2) { + switch (op) { + case LUA_OPADD: return luai_numadd(L, v1, v2); + case LUA_OPSUB: return luai_numsub(L, v1, v2); + case LUA_OPMUL: return luai_nummul(L, v1, v2); + case LUA_OPDIV: return luai_numdiv(L, v1, v2); + case LUA_OPPOW: return luai_numpow(L, v1, v2); + case LUA_OPIDIV: return luai_numidiv(L, v1, v2); + case LUA_OPUNM: return luai_numunm(L, v1); + case LUA_OPMOD: return luaV_modf(L, v1, v2); + default: lua_assert(0); return 0; + } +} + + +int luaO_rawarith (lua_State *L, int op, const TValue *p1, const TValue *p2, + TValue *res) { + switch (op) { + case LUA_OPBAND: case LUA_OPBOR: case LUA_OPBXOR: + case LUA_OPSHL: case LUA_OPSHR: + case LUA_OPBNOT: { /* operate only on integers */ + lua_Integer i1; lua_Integer i2; + if (tointegerns(p1, &i1) && tointegerns(p2, &i2)) { + setivalue(res, intarith(L, op, i1, i2)); + return 1; + } + else return 0; /* fail */ + } + case LUA_OPDIV: case LUA_OPPOW: { /* operate only on floats */ + lua_Number n1; lua_Number n2; + if (tonumberns(p1, n1) && tonumberns(p2, n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return 1; + } + else return 0; /* fail */ + } + default: { /* other operations */ + lua_Number n1; lua_Number n2; + if (ttisinteger(p1) && ttisinteger(p2)) { + setivalue(res, intarith(L, op, ivalue(p1), ivalue(p2))); + return 1; + } + else if (tonumberns(p1, n1) && tonumberns(p2, n2)) { + setfltvalue(res, numarith(L, op, n1, n2)); + return 1; + } + else return 0; /* fail */ + } + } +} + + +void luaO_arith (lua_State *L, int op, const TValue *p1, const TValue *p2, + StkId res) { + if (!luaO_rawarith(L, op, p1, p2, s2v(res))) { + /* could not perform raw operation; try metamethod */ + luaT_trybinTM(L, p1, p2, res, cast(TMS, (op - LUA_OPADD) + TM_ADD)); + } +} + + +int luaO_hexavalue (int c) { + if (lisdigit(c)) return c - '0'; + else return (ltolower(c) - 'a') + 10; +} + + +static int isneg (const char **s) { + if (**s == '-') { (*s)++; return 1; } + else if (**s == '+') (*s)++; + return 0; +} + + + +/* +** {================================================================== +** Lua's implementation for 'lua_strx2number' +** =================================================================== +*/ + +#if !defined(lua_strx2number) + +/* maximum number of significant digits to read (to avoid overflows + even with single floats) */ +#define MAXSIGDIG 30 + +/* +** convert a hexadecimal numeric string to a number, following +** C99 specification for 'strtod' +*/ +static lua_Number lua_strx2number (const char *s, char **endptr) { + int dot = lua_getlocaledecpoint(); + lua_Number r = 0.0; /* result (accumulator) */ + int sigdig = 0; /* number of significant digits */ + int nosigdig = 0; /* number of non-significant digits */ + int e = 0; /* exponent correction */ + int neg; /* 1 if number is negative */ + int hasdot = 0; /* true after seen a dot */ + *endptr = cast_charp(s); /* nothing is valid yet */ + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); /* check sign */ + if (!(*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X'))) /* check '0x' */ + return 0.0; /* invalid format (no '0x') */ + for (s += 2; ; s++) { /* skip '0x' and read numeral */ + if (*s == dot) { + if (hasdot) break; /* second dot? stop loop */ + else hasdot = 1; + } + else if (lisxdigit(cast_uchar(*s))) { + if (sigdig == 0 && *s == '0') /* non-significant digit (zero)? */ + nosigdig++; + else if (++sigdig <= MAXSIGDIG) /* can read it without overflow? */ + r = (r * cast_num(16.0)) + luaO_hexavalue(*s); + else e++; /* too many digits; ignore, but still count for exponent */ + if (hasdot) e--; /* decimal digit? correct exponent */ + } + else break; /* neither a dot nor a digit */ + } + if (nosigdig + sigdig == 0) /* no digits? */ + return 0.0; /* invalid format */ + *endptr = cast_charp(s); /* valid up to here */ + e *= 4; /* each digit multiplies/divides value by 2^4 */ + if (*s == 'p' || *s == 'P') { /* exponent part? */ + int exp1 = 0; /* exponent value */ + int neg1; /* exponent sign */ + s++; /* skip 'p' */ + neg1 = isneg(&s); /* sign */ + if (!lisdigit(cast_uchar(*s))) + return 0.0; /* invalid; must have at least one digit */ + while (lisdigit(cast_uchar(*s))) /* read exponent */ + exp1 = exp1 * 10 + *(s++) - '0'; + if (neg1) exp1 = -exp1; + e += exp1; + *endptr = cast_charp(s); /* valid up to here */ + } + if (neg) r = -r; + return l_mathop(ldexp)(r, e); +} + +#endif +/* }====================================================== */ + + +/* maximum length of a numeral */ +#if !defined (L_MAXLENNUM) +#define L_MAXLENNUM 200 +#endif + +static const char *l_str2dloc (const char *s, lua_Number *result, int mode) { + char *endptr; + *result = (mode == 'x') ? lua_strx2number(s, &endptr) /* try to convert */ + : lua_str2number(s, &endptr); + if (endptr == s) return NULL; /* nothing recognized? */ + while (lisspace(cast_uchar(*endptr))) endptr++; /* skip trailing spaces */ + return (*endptr == '\0') ? endptr : NULL; /* OK if no trailing characters */ +} + + +/* +** Convert string 's' to a Lua number (put in 'result'). Return NULL +** on fail or the address of the ending '\0' on success. +** 'pmode' points to (and 'mode' contains) special things in the string: +** - 'x'/'X' means a hexadecimal numeral +** - 'n'/'N' means 'inf' or 'nan' (which should be rejected) +** - '.' just optimizes the search for the common case (nothing special) +** This function accepts both the current locale or a dot as the radix +** mark. If the conversion fails, it may mean number has a dot but +** locale accepts something else. In that case, the code copies 's' +** to a buffer (because 's' is read-only), changes the dot to the +** current locale radix mark, and tries to convert again. +*/ +static const char *l_str2d (const char *s, lua_Number *result) { + const char *endptr; + const char *pmode = strpbrk(s, ".xXnN"); + int mode = pmode ? ltolower(cast_uchar(*pmode)) : 0; + if (mode == 'n') /* reject 'inf' and 'nan' */ + return NULL; + endptr = l_str2dloc(s, result, mode); /* try to convert */ + if (endptr == NULL) { /* failed? may be a different locale */ + char buff[L_MAXLENNUM + 1]; + const char *pdot = strchr(s, '.'); + if (strlen(s) > L_MAXLENNUM || pdot == NULL) + return NULL; /* string too long or no dot; fail */ + strcpy(buff, s); /* copy string to buffer */ + buff[pdot - s] = lua_getlocaledecpoint(); /* correct decimal point */ + endptr = l_str2dloc(buff, result, mode); /* try again */ + if (endptr != NULL) + endptr = s + (endptr - buff); /* make relative to 's' */ + } + return endptr; +} + + +#define MAXBY10 cast(lua_Unsigned, LUA_MAXINTEGER / 10) +#define MAXLASTD cast_int(LUA_MAXINTEGER % 10) + +static const char *l_str2int (const char *s, lua_Integer *result) { + lua_Unsigned a = 0; + int empty = 1; + int neg; + while (lisspace(cast_uchar(*s))) s++; /* skip initial spaces */ + neg = isneg(&s); + if (s[0] == '0' && + (s[1] == 'x' || s[1] == 'X')) { /* hex? */ + s += 2; /* skip '0x' */ + for (; lisxdigit(cast_uchar(*s)); s++) { + a = a * 16 + luaO_hexavalue(*s); + empty = 0; + } + } + else { /* decimal */ + for (; lisdigit(cast_uchar(*s)); s++) { + int d = *s - '0'; + if (a >= MAXBY10 && (a > MAXBY10 || d > MAXLASTD + neg)) /* overflow? */ + return NULL; /* do not accept it (as integer) */ + a = a * 10 + d; + empty = 0; + } + } + while (lisspace(cast_uchar(*s))) s++; /* skip trailing spaces */ + if (empty || *s != '\0') return NULL; /* something wrong in the numeral */ + else { + *result = l_castU2S((neg) ? 0u - a : a); + return s; + } +} + + +size_t luaO_str2num (const char *s, TValue *o) { + lua_Integer i; lua_Number n; + const char *e; + if ((e = l_str2int(s, &i)) != NULL) { /* try as an integer */ + setivalue(o, i); + } + else if ((e = l_str2d(s, &n)) != NULL) { /* else try as a float */ + setfltvalue(o, n); + } + else + return 0; /* conversion failed */ + return (e - s) + 1; /* success; return string size */ +} + + +int luaO_utf8esc (char *buff, unsigned long x) { + int n = 1; /* number of bytes put in buffer (backwards) */ + lua_assert(x <= 0x7FFFFFFFu); + if (x < 0x80) /* ascii? */ + buff[UTF8BUFFSZ - 1] = cast_char(x); + else { /* need continuation bytes */ + unsigned int mfb = 0x3f; /* maximum that fits in first byte */ + do { /* add continuation bytes */ + buff[UTF8BUFFSZ - (n++)] = cast_char(0x80 | (x & 0x3f)); + x >>= 6; /* remove added bits */ + mfb >>= 1; /* now there is one less bit available in first byte */ + } while (x > mfb); /* still needs continuation byte? */ + buff[UTF8BUFFSZ - n] = cast_char((~mfb << 1) | x); /* add first byte */ + } + return n; +} + + +/* maximum length of the conversion of a number to a string */ +#define MAXNUMBER2STR 50 + + +/* +** Convert a number object to a string, adding it to a buffer +*/ +static int tostringbuff (TValue *obj, char *buff) { + int len; + lua_assert(ttisnumber(obj)); + if (ttisinteger(obj)) + len = lua_integer2str(buff, MAXNUMBER2STR, ivalue(obj)); + else { + len = lua_number2str(buff, MAXNUMBER2STR, fltvalue(obj)); + if (buff[strspn(buff, "-0123456789")] == '\0') { /* looks like an int? */ + buff[len++] = lua_getlocaledecpoint(); + buff[len++] = '0'; /* adds '.0' to result */ + } + } + return len; +} + + +/* +** Convert a number object to a Lua string, replacing the value at 'obj' +*/ +void luaO_tostring (lua_State *L, TValue *obj) { + char buff[MAXNUMBER2STR]; + int len = tostringbuff(obj, buff); + setsvalue(L, obj, luaS_newlstr(L, buff, len)); +} + + + + +/* +** {================================================================== +** 'luaO_pushvfstring' +** =================================================================== +*/ + +/* size for buffer space used by 'luaO_pushvfstring' */ +#define BUFVFS 400 + +/* buffer used by 'luaO_pushvfstring' */ +typedef struct BuffFS { + lua_State *L; + int pushed; /* number of string pieces already on the stack */ + int blen; /* length of partial string in 'space' */ + char space[BUFVFS]; /* holds last part of the result */ +} BuffFS; + + +/* +** Push given string to the stack, as part of the buffer. If the stack +** is almost full, join all partial strings in the stack into one. +*/ +static void pushstr (BuffFS *buff, const char *str, size_t l) { + lua_State *L = buff->L; + setsvalue2s(L, L->top, luaS_newlstr(L, str, l)); + L->top++; /* may use one extra slot */ + buff->pushed++; + if (buff->pushed > 1 && L->top + 1 >= L->stack_last) { + luaV_concat(L, buff->pushed); /* join all partial results into one */ + buff->pushed = 1; + } +} + + +/* +** empty the buffer space into the stack +*/ +static void clearbuff (BuffFS *buff) { + pushstr(buff, buff->space, buff->blen); /* push buffer contents */ + buff->blen = 0; /* space now is empty */ +} + + +/* +** Get a space of size 'sz' in the buffer. If buffer has not enough +** space, empty it. 'sz' must fit in an empty buffer. +*/ +static char *getbuff (BuffFS *buff, int sz) { + lua_assert(buff->blen <= BUFVFS); lua_assert(sz <= BUFVFS); + if (sz > BUFVFS - buff->blen) /* not enough space? */ + clearbuff(buff); + return buff->space + buff->blen; +} + + +#define addsize(b,sz) ((b)->blen += (sz)) + + +/* +** Add 'str' to the buffer. If string is larger than the buffer space, +** push the string directly to the stack. +*/ +static void addstr2buff (BuffFS *buff, const char *str, size_t slen) { + if (slen <= BUFVFS) { /* does string fit into buffer? */ + char *bf = getbuff(buff, cast_int(slen)); + memcpy(bf, str, slen); /* add string to buffer */ + addsize(buff, cast_int(slen)); + } + else { /* string larger than buffer */ + clearbuff(buff); /* string comes after buffer's content */ + pushstr(buff, str, slen); /* push string */ + } +} + + +/* +** Add a number to the buffer. +*/ +static void addnum2buff (BuffFS *buff, TValue *num) { + char *numbuff = getbuff(buff, MAXNUMBER2STR); + int len = tostringbuff(num, numbuff); /* format number into 'numbuff' */ + addsize(buff, len); +} + + +/* +** this function handles only '%d', '%c', '%f', '%p', '%s', and '%%' + conventional formats, plus Lua-specific '%I' and '%U' +*/ +const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { + BuffFS buff; /* holds last part of the result */ + const char *e; /* points to next '%' */ + buff.pushed = buff.blen = 0; + buff.L = L; + while ((e = strchr(fmt, '%')) != NULL) { + addstr2buff(&buff, fmt, e - fmt); /* add 'fmt' up to '%' */ + switch (*(e + 1)) { /* conversion specifier */ + case 's': { /* zero-terminated string */ + const char *s = va_arg(argp, char *); + if (s == NULL) s = "(null)"; + addstr2buff(&buff, s, strlen(s)); + break; + } + case 'c': { /* an 'int' as a character */ + char c = cast_uchar(va_arg(argp, int)); + addstr2buff(&buff, &c, sizeof(char)); + break; + } + case 'd': { /* an 'int' */ + TValue num; + setivalue(&num, va_arg(argp, int)); + addnum2buff(&buff, &num); + break; + } + case 'I': { /* a 'lua_Integer' */ + TValue num; + setivalue(&num, cast(lua_Integer, va_arg(argp, l_uacInt))); + addnum2buff(&buff, &num); + break; + } + case 'f': { /* a 'lua_Number' */ + TValue num; + setfltvalue(&num, cast_num(va_arg(argp, l_uacNumber))); + addnum2buff(&buff, &num); + break; + } + case 'p': { /* a pointer */ + const int sz = 3 * sizeof(void*) + 8; /* enough space for '%p' */ + char *bf = getbuff(&buff, sz); + void *p = va_arg(argp, void *); + int len = lua_pointer2str(bf, sz, p); + addsize(&buff, len); + break; + } + case 'U': { /* a 'long' as a UTF-8 sequence */ + char bf[UTF8BUFFSZ]; + int len = luaO_utf8esc(bf, va_arg(argp, long)); + addstr2buff(&buff, bf + UTF8BUFFSZ - len, len); + break; + } + case '%': { + addstr2buff(&buff, "%", 1); + break; + } + default: { + luaG_runerror(L, "invalid option '%%%c' to 'lua_pushfstring'", + *(e + 1)); + } + } + fmt = e + 2; /* skip '%' and the specifier */ + } + addstr2buff(&buff, fmt, strlen(fmt)); /* rest of 'fmt' */ + clearbuff(&buff); /* empty buffer into the stack */ + if (buff.pushed > 1) + luaV_concat(L, buff.pushed); /* join all partial results */ + return svalue(s2v(L->top - 1)); +} + + +const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { + const char *msg; + va_list argp; + va_start(argp, fmt); + msg = luaO_pushvfstring(L, fmt, argp); + va_end(argp); + return msg; +} + +/* }================================================================== */ + + +#define RETS "..." +#define PRE "[string \"" +#define POS "\"]" + +#define addstr(a,b,l) ( memcpy(a,b,(l) * sizeof(char)), a += (l) ) + +void luaO_chunkid (char *out, const char *source, size_t srclen) { + size_t bufflen = LUA_IDSIZE; /* free space in buffer */ + if (*source == '=') { /* 'literal' source */ + if (srclen <= bufflen) /* small enough? */ + memcpy(out, source + 1, srclen * sizeof(char)); + else { /* truncate it */ + addstr(out, source + 1, bufflen - 1); + *out = '\0'; + } + } + else if (*source == '@') { /* file name */ + if (srclen <= bufflen) /* small enough? */ + memcpy(out, source + 1, srclen * sizeof(char)); + else { /* add '...' before rest of name */ + addstr(out, RETS, LL(RETS)); + bufflen -= LL(RETS); + memcpy(out, source + 1 + srclen - bufflen, bufflen * sizeof(char)); + } + } + else { /* string; format as [string "source"] */ + const char *nl = strchr(source, '\n'); /* find first new line (if any) */ + addstr(out, PRE, LL(PRE)); /* add prefix */ + bufflen -= LL(PRE RETS POS) + 1; /* save space for prefix+suffix+'\0' */ + if (srclen < bufflen && nl == NULL) { /* small one-line source? */ + addstr(out, source, srclen); /* keep it */ + } + else { + if (nl != NULL) srclen = nl - source; /* stop at first newline */ + if (srclen > bufflen) srclen = bufflen; + addstr(out, source, srclen); + addstr(out, RETS, LL(RETS)); + } + memcpy(out, POS, (LL(POS) + 1) * sizeof(char)); + } +} + diff --git a/lua-5.4.0/src/lobject.h b/lua-5.4.0/src/lobject.h new file mode 100644 index 0000000..04a81d3 --- /dev/null +++ b/lua-5.4.0/src/lobject.h @@ -0,0 +1,787 @@ +/* +** $Id: lobject.h $ +** Type definitions for Lua objects +** See Copyright Notice in lua.h +*/ + + +#ifndef lobject_h +#define lobject_h + + +#include + + +#include "llimits.h" +#include "lua.h" + + +/* +** Extra types for collectable non-values +*/ +#define LUA_TUPVAL LUA_NUMTYPES /* upvalues */ +#define LUA_TPROTO (LUA_NUMTYPES+1) /* function prototypes */ + + +/* +** number of all possible types (including LUA_TNONE) +*/ +#define LUA_TOTALTYPES (LUA_TPROTO + 2) + + +/* +** tags for Tagged Values have the following use of bits: +** bits 0-3: actual tag (a LUA_T* constant) +** bits 4-5: variant bits +** bit 6: whether value is collectable +*/ + +/* add variant bits to a type */ +#define makevariant(t,v) ((t) | ((v) << 4)) + + + +/* +** Union of all Lua values +*/ +typedef union Value { + struct GCObject *gc; /* collectable objects */ + void *p; /* light userdata */ + lua_CFunction f; /* light C functions */ + lua_Integer i; /* integer numbers */ + lua_Number n; /* float numbers */ +} Value; + + +/* +** Tagged Values. This is the basic representation of values in Lua: +** an actual value plus a tag with its type. +*/ + +#define TValuefields Value value_; lu_byte tt_ + +typedef struct TValue { + TValuefields; +} TValue; + + +#define val_(o) ((o)->value_) +#define valraw(o) (&val_(o)) + + +/* raw type tag of a TValue */ +#define rawtt(o) ((o)->tt_) + +/* tag with no variants (bits 0-3) */ +#define novariant(t) ((t) & 0x0F) + +/* type tag of a TValue (bits 0-3 for tags + variant bits 4-5) */ +#define withvariant(t) ((t) & 0x3F) +#define ttypetag(o) withvariant(rawtt(o)) + +/* type of a TValue */ +#define ttype(o) (novariant(rawtt(o))) + + +/* Macros to test type */ +#define checktag(o,t) (rawtt(o) == (t)) +#define checktype(o,t) (ttype(o) == (t)) + + +/* Macros for internal tests */ + +/* collectable object has the same tag as the original value */ +#define righttt(obj) (ttypetag(obj) == gcvalue(obj)->tt) + +/* +** Any value being manipulated by the program either is non +** collectable, or the collectable object has the right tag +** and it is not dead. +*/ +#define checkliveness(L,obj) \ + ((void)L, lua_longassert(!iscollectable(obj) || \ + (righttt(obj) && (L == NULL || !isdead(G(L),gcvalue(obj)))))) + + +/* Macros to set values */ + +/* set a value's tag */ +#define settt_(o,t) ((o)->tt_=(t)) + + +/* main macro to copy values (from 'obj1' to 'obj2') */ +#define setobj(L,obj1,obj2) \ + { TValue *io1=(obj1); const TValue *io2=(obj2); \ + io1->value_ = io2->value_; settt_(io1, io2->tt_); \ + checkliveness(L,io1); lua_assert(!isnonstrictnil(io1)); } + +/* +** Different types of assignments, according to source and destination. +** (They are mostly equal now, but may be different in the future.) +*/ + +/* from stack to stack */ +#define setobjs2s(L,o1,o2) setobj(L,s2v(o1),s2v(o2)) +/* to stack (not from same stack) */ +#define setobj2s(L,o1,o2) setobj(L,s2v(o1),o2) +/* from table to same table */ +#define setobjt2t setobj +/* to new object */ +#define setobj2n setobj +/* to table */ +#define setobj2t setobj + + +/* +** Entries in the Lua stack +*/ +typedef union StackValue { + TValue val; +} StackValue; + + +/* index to stack elements */ +typedef StackValue *StkId; + +/* convert a 'StackValue' to a 'TValue' */ +#define s2v(o) (&(o)->val) + + + +/* +** {================================================================== +** Nil +** =================================================================== +*/ + +/* Standard nil */ +#define LUA_VNIL makevariant(LUA_TNIL, 0) + +/* Empty slot (which might be different from a slot containing nil) */ +#define LUA_VEMPTY makevariant(LUA_TNIL, 1) + +/* Value returned for a key not found in a table (absent key) */ +#define LUA_VABSTKEY makevariant(LUA_TNIL, 2) + + +/* macro to test for (any kind of) nil */ +#define ttisnil(v) checktype((v), LUA_TNIL) + + +/* macro to test for a standard nil */ +#define ttisstrictnil(o) checktag((o), LUA_VNIL) + + +#define setnilvalue(obj) settt_(obj, LUA_VNIL) + + +#define isabstkey(v) checktag((v), LUA_VABSTKEY) + + +/* +** macro to detect non-standard nils (used only in assertions) +*/ +#define isnonstrictnil(v) (ttisnil(v) && !ttisstrictnil(v)) + + +/* +** By default, entries with any kind of nil are considered empty. +** (In any definition, values associated with absent keys must also +** be accepted as empty.) +*/ +#define isempty(v) ttisnil(v) + + +/* macro defining a value corresponding to an absent key */ +#define ABSTKEYCONSTANT {NULL}, LUA_VABSTKEY + + +/* mark an entry as empty */ +#define setempty(v) settt_(v, LUA_VEMPTY) + + + +/* }================================================================== */ + + +/* +** {================================================================== +** Booleans +** =================================================================== +*/ + + +#define LUA_VFALSE makevariant(LUA_TBOOLEAN, 0) +#define LUA_VTRUE makevariant(LUA_TBOOLEAN, 1) + +#define ttisboolean(o) checktype((o), LUA_TBOOLEAN) +#define ttisfalse(o) checktag((o), LUA_VFALSE) +#define ttistrue(o) checktag((o), LUA_VTRUE) + + +#define l_isfalse(o) (ttisfalse(o) || ttisnil(o)) + + +#define setbfvalue(obj) settt_(obj, LUA_VFALSE) +#define setbtvalue(obj) settt_(obj, LUA_VTRUE) + +/* }================================================================== */ + + +/* +** {================================================================== +** Threads +** =================================================================== +*/ + +#define LUA_VTHREAD makevariant(LUA_TTHREAD, 0) + +#define ttisthread(o) checktag((o), ctb(LUA_VTHREAD)) + +#define thvalue(o) check_exp(ttisthread(o), gco2th(val_(o).gc)) + +#define setthvalue(L,obj,x) \ + { TValue *io = (obj); lua_State *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VTHREAD)); \ + checkliveness(L,io); } + +#define setthvalue2s(L,o,t) setthvalue(L,s2v(o),t) + +/* }================================================================== */ + + +/* +** {================================================================== +** Collectable Objects +** =================================================================== +*/ + +/* +** Common Header for all collectable objects (in macro form, to be +** included in other objects) +*/ +#define CommonHeader struct GCObject *next; lu_byte tt; lu_byte marked + + +/* Common type for all collectable objects */ +typedef struct GCObject { + CommonHeader; +} GCObject; + + +/* Bit mark for collectable types */ +#define BIT_ISCOLLECTABLE (1 << 6) + +#define iscollectable(o) (rawtt(o) & BIT_ISCOLLECTABLE) + +/* mark a tag as collectable */ +#define ctb(t) ((t) | BIT_ISCOLLECTABLE) + +#define gcvalue(o) check_exp(iscollectable(o), val_(o).gc) + +#define gcvalueraw(v) ((v).gc) + +#define setgcovalue(L,obj,x) \ + { TValue *io = (obj); GCObject *i_g=(x); \ + val_(io).gc = i_g; settt_(io, ctb(i_g->tt)); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Numbers +** =================================================================== +*/ + +/* Variant tags for numbers */ +#define LUA_VNUMINT makevariant(LUA_TNUMBER, 0) /* integer numbers */ +#define LUA_VNUMFLT makevariant(LUA_TNUMBER, 1) /* float numbers */ + +#define ttisnumber(o) checktype((o), LUA_TNUMBER) +#define ttisfloat(o) checktag((o), LUA_VNUMFLT) +#define ttisinteger(o) checktag((o), LUA_VNUMINT) + +#define nvalue(o) check_exp(ttisnumber(o), \ + (ttisinteger(o) ? cast_num(ivalue(o)) : fltvalue(o))) +#define fltvalue(o) check_exp(ttisfloat(o), val_(o).n) +#define ivalue(o) check_exp(ttisinteger(o), val_(o).i) + +#define fltvalueraw(v) ((v).n) +#define ivalueraw(v) ((v).i) + +#define setfltvalue(obj,x) \ + { TValue *io=(obj); val_(io).n=(x); settt_(io, LUA_VNUMFLT); } + +#define chgfltvalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisfloat(io)); val_(io).n=(x); } + +#define setivalue(obj,x) \ + { TValue *io=(obj); val_(io).i=(x); settt_(io, LUA_VNUMINT); } + +#define chgivalue(obj,x) \ + { TValue *io=(obj); lua_assert(ttisinteger(io)); val_(io).i=(x); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Strings +** =================================================================== +*/ + +/* Variant tags for strings */ +#define LUA_VSHRSTR makevariant(LUA_TSTRING, 0) /* short strings */ +#define LUA_VLNGSTR makevariant(LUA_TSTRING, 1) /* long strings */ + +#define ttisstring(o) checktype((o), LUA_TSTRING) +#define ttisshrstring(o) checktag((o), ctb(LUA_VSHRSTR)) +#define ttislngstring(o) checktag((o), ctb(LUA_VLNGSTR)) + +#define tsvalueraw(v) (gco2ts((v).gc)) + +#define tsvalue(o) check_exp(ttisstring(o), gco2ts(val_(o).gc)) + +#define setsvalue(L,obj,x) \ + { TValue *io = (obj); TString *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(x_->tt)); \ + checkliveness(L,io); } + +/* set a string to the stack */ +#define setsvalue2s(L,o,s) setsvalue(L,s2v(o),s) + +/* set a string to a new object */ +#define setsvalue2n setsvalue + + +/* +** Header for a string value. +*/ +typedef struct TString { + CommonHeader; + lu_byte extra; /* reserved words for short strings; "has hash" for longs */ + lu_byte shrlen; /* length for short strings */ + unsigned int hash; + union { + size_t lnglen; /* length for long strings */ + struct TString *hnext; /* linked list for hash table */ + } u; + char contents[1]; +} TString; + + + +/* +** Get the actual string (array of bytes) from a 'TString'. +*/ +#define getstr(ts) ((ts)->contents) + + +/* get the actual string (array of bytes) from a Lua value */ +#define svalue(o) getstr(tsvalue(o)) + +/* get string length from 'TString *s' */ +#define tsslen(s) ((s)->tt == LUA_VSHRSTR ? (s)->shrlen : (s)->u.lnglen) + +/* get string length from 'TValue *o' */ +#define vslen(o) tsslen(tsvalue(o)) + +/* }================================================================== */ + + +/* +** {================================================================== +** Userdata +** =================================================================== +*/ + + +/* +** Light userdata should be a variant of userdata, but for compatibility +** reasons they are also different types. +*/ +#define LUA_VLIGHTUSERDATA makevariant(LUA_TLIGHTUSERDATA, 0) + +#define LUA_VUSERDATA makevariant(LUA_TUSERDATA, 0) + +#define ttislightuserdata(o) checktag((o), LUA_VLIGHTUSERDATA) +#define ttisfulluserdata(o) checktag((o), ctb(LUA_VUSERDATA)) + +#define pvalue(o) check_exp(ttislightuserdata(o), val_(o).p) +#define uvalue(o) check_exp(ttisfulluserdata(o), gco2u(val_(o).gc)) + +#define pvalueraw(v) ((v).p) + +#define setpvalue(obj,x) \ + { TValue *io=(obj); val_(io).p=(x); settt_(io, LUA_VLIGHTUSERDATA); } + +#define setuvalue(L,obj,x) \ + { TValue *io = (obj); Udata *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VUSERDATA)); \ + checkliveness(L,io); } + + +/* Ensures that addresses after this type are always fully aligned. */ +typedef union UValue { + TValue uv; + LUAI_MAXALIGN; /* ensures maximum alignment for udata bytes */ +} UValue; + + +/* +** Header for userdata with user values; +** memory area follows the end of this structure. +*/ +typedef struct Udata { + CommonHeader; + unsigned short nuvalue; /* number of user values */ + size_t len; /* number of bytes */ + struct Table *metatable; + GCObject *gclist; + UValue uv[1]; /* user values */ +} Udata; + + +/* +** Header for userdata with no user values. These userdata do not need +** to be gray during GC, and therefore do not need a 'gclist' field. +** To simplify, the code always use 'Udata' for both kinds of userdata, +** making sure it never accesses 'gclist' on userdata with no user values. +** This structure here is used only to compute the correct size for +** this representation. (The 'bindata' field in its end ensures correct +** alignment for binary data following this header.) +*/ +typedef struct Udata0 { + CommonHeader; + unsigned short nuvalue; /* number of user values */ + size_t len; /* number of bytes */ + struct Table *metatable; + union {LUAI_MAXALIGN;} bindata; +} Udata0; + + +/* compute the offset of the memory area of a userdata */ +#define udatamemoffset(nuv) \ + ((nuv) == 0 ? offsetof(Udata0, bindata) \ + : offsetof(Udata, uv) + (sizeof(UValue) * (nuv))) + +/* get the address of the memory block inside 'Udata' */ +#define getudatamem(u) (cast_charp(u) + udatamemoffset((u)->nuvalue)) + +/* compute the size of a userdata */ +#define sizeudata(nuv,nb) (udatamemoffset(nuv) + (nb)) + +/* }================================================================== */ + + +/* +** {================================================================== +** Prototypes +** =================================================================== +*/ + +#define LUA_VPROTO makevariant(LUA_TPROTO, 0) + + +/* +** Description of an upvalue for function prototypes +*/ +typedef struct Upvaldesc { + TString *name; /* upvalue name (for debug information) */ + lu_byte instack; /* whether it is in stack (register) */ + lu_byte idx; /* index of upvalue (in stack or in outer function's list) */ + lu_byte kind; /* kind of corresponding variable */ +} Upvaldesc; + + +/* +** Description of a local variable for function prototypes +** (used for debug information) +*/ +typedef struct LocVar { + TString *varname; + int startpc; /* first point where variable is active */ + int endpc; /* first point where variable is dead */ +} LocVar; + + +/* +** Associates the absolute line source for a given instruction ('pc'). +** The array 'lineinfo' gives, for each instruction, the difference in +** lines from the previous instruction. When that difference does not +** fit into a byte, Lua saves the absolute line for that instruction. +** (Lua also saves the absolute line periodically, to speed up the +** computation of a line number: we can use binary search in the +** absolute-line array, but we must traverse the 'lineinfo' array +** linearly to compute a line.) +*/ +typedef struct AbsLineInfo { + int pc; + int line; +} AbsLineInfo; + +/* +** Function Prototypes +*/ +typedef struct Proto { + CommonHeader; + lu_byte numparams; /* number of fixed (named) parameters */ + lu_byte is_vararg; + lu_byte maxstacksize; /* number of registers needed by this function */ + int sizeupvalues; /* size of 'upvalues' */ + int sizek; /* size of 'k' */ + int sizecode; + int sizelineinfo; + int sizep; /* size of 'p' */ + int sizelocvars; + int sizeabslineinfo; /* size of 'abslineinfo' */ + int linedefined; /* debug information */ + int lastlinedefined; /* debug information */ + TValue *k; /* constants used by the function */ + Instruction *code; /* opcodes */ + struct Proto **p; /* functions defined inside the function */ + Upvaldesc *upvalues; /* upvalue information */ + ls_byte *lineinfo; /* information about source lines (debug information) */ + AbsLineInfo *abslineinfo; /* idem */ + LocVar *locvars; /* information about local variables (debug information) */ + TString *source; /* used for debug information */ + GCObject *gclist; +} Proto; + +/* }================================================================== */ + + +/* +** {================================================================== +** Closures +** =================================================================== +*/ + +#define LUA_VUPVAL makevariant(LUA_TUPVAL, 0) + + +/* Variant tags for functions */ +#define LUA_VLCL makevariant(LUA_TFUNCTION, 0) /* Lua closure */ +#define LUA_VLCF makevariant(LUA_TFUNCTION, 1) /* light C function */ +#define LUA_VCCL makevariant(LUA_TFUNCTION, 2) /* C closure */ + +#define ttisfunction(o) checktype(o, LUA_TFUNCTION) +#define ttisclosure(o) ((rawtt(o) & 0x1F) == LUA_VLCL) +#define ttisLclosure(o) checktag((o), ctb(LUA_VLCL)) +#define ttislcf(o) checktag((o), LUA_VLCF) +#define ttisCclosure(o) checktag((o), ctb(LUA_VCCL)) + +#define isLfunction(o) ttisLclosure(o) + +#define clvalue(o) check_exp(ttisclosure(o), gco2cl(val_(o).gc)) +#define clLvalue(o) check_exp(ttisLclosure(o), gco2lcl(val_(o).gc)) +#define fvalue(o) check_exp(ttislcf(o), val_(o).f) +#define clCvalue(o) check_exp(ttisCclosure(o), gco2ccl(val_(o).gc)) + +#define fvalueraw(v) ((v).f) + +#define setclLvalue(L,obj,x) \ + { TValue *io = (obj); LClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VLCL)); \ + checkliveness(L,io); } + +#define setclLvalue2s(L,o,cl) setclLvalue(L,s2v(o),cl) + +#define setfvalue(obj,x) \ + { TValue *io=(obj); val_(io).f=(x); settt_(io, LUA_VLCF); } + +#define setclCvalue(L,obj,x) \ + { TValue *io = (obj); CClosure *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VCCL)); \ + checkliveness(L,io); } + + +/* +** Upvalues for Lua closures +*/ +typedef struct UpVal { + CommonHeader; + lu_byte tbc; /* true if it represents a to-be-closed variable */ + TValue *v; /* points to stack or to its own value */ + union { + struct { /* (when open) */ + struct UpVal *next; /* linked list */ + struct UpVal **previous; + } open; + TValue value; /* the value (when closed) */ + } u; +} UpVal; + + + +#define ClosureHeader \ + CommonHeader; lu_byte nupvalues; GCObject *gclist + +typedef struct CClosure { + ClosureHeader; + lua_CFunction f; + TValue upvalue[1]; /* list of upvalues */ +} CClosure; + + +typedef struct LClosure { + ClosureHeader; + struct Proto *p; + UpVal *upvals[1]; /* list of upvalues */ +} LClosure; + + +typedef union Closure { + CClosure c; + LClosure l; +} Closure; + + +#define getproto(o) (clLvalue(o)->p) + +/* }================================================================== */ + + +/* +** {================================================================== +** Tables +** =================================================================== +*/ + +#define LUA_VTABLE makevariant(LUA_TTABLE, 0) + +#define ttistable(o) checktag((o), ctb(LUA_VTABLE)) + +#define hvalue(o) check_exp(ttistable(o), gco2t(val_(o).gc)) + +#define sethvalue(L,obj,x) \ + { TValue *io = (obj); Table *x_ = (x); \ + val_(io).gc = obj2gco(x_); settt_(io, ctb(LUA_VTABLE)); \ + checkliveness(L,io); } + +#define sethvalue2s(L,o,h) sethvalue(L,s2v(o),h) + + +/* +** Nodes for Hash tables: A pack of two TValue's (key-value pairs) +** plus a 'next' field to link colliding entries. The distribution +** of the key's fields ('key_tt' and 'key_val') not forming a proper +** 'TValue' allows for a smaller size for 'Node' both in 4-byte +** and 8-byte alignments. +*/ +typedef union Node { + struct NodeKey { + TValuefields; /* fields for value */ + lu_byte key_tt; /* key type */ + int next; /* for chaining */ + Value key_val; /* key value */ + } u; + TValue i_val; /* direct access to node's value as a proper 'TValue' */ +} Node; + + +/* copy a value into a key */ +#define setnodekey(L,node,obj) \ + { Node *n_=(node); const TValue *io_=(obj); \ + n_->u.key_val = io_->value_; n_->u.key_tt = io_->tt_; \ + checkliveness(L,io_); } + + +/* copy a value from a key */ +#define getnodekey(L,obj,node) \ + { TValue *io_=(obj); const Node *n_=(node); \ + io_->value_ = n_->u.key_val; io_->tt_ = n_->u.key_tt; \ + checkliveness(L,io_); } + + +/* +** About 'alimit': if 'isrealasize(t)' is true, then 'alimit' is the +** real size of 'array'. Otherwise, the real size of 'array' is the +** smallest power of two not smaller than 'alimit' (or zero iff 'alimit' +** is zero); 'alimit' is then used as a hint for #t. +*/ + +#define BITRAS (1 << 7) +#define isrealasize(t) (!((t)->marked & BITRAS)) +#define setrealasize(t) ((t)->marked &= cast_byte(~BITRAS)) +#define setnorealasize(t) ((t)->marked |= BITRAS) + + +typedef struct Table { + CommonHeader; + lu_byte flags; /* 1<

    u.key_tt) +#define keyval(node) ((node)->u.key_val) + +#define keyisnil(node) (keytt(node) == LUA_TNIL) +#define keyisinteger(node) (keytt(node) == LUA_VNUMINT) +#define keyival(node) (keyval(node).i) +#define keyisshrstr(node) (keytt(node) == ctb(LUA_VSHRSTR)) +#define keystrval(node) (gco2ts(keyval(node).gc)) + +#define setnilkey(node) (keytt(node) = LUA_TNIL) + +#define keyiscollectable(n) (keytt(n) & BIT_ISCOLLECTABLE) + +#define gckey(n) (keyval(n).gc) +#define gckeyN(n) (keyiscollectable(n) ? gckey(n) : NULL) + + +/* +** Use a "nil table" to mark dead keys in a table. Those keys serve +** to keep space for removed entries, which may still be part of +** chains. Note that the 'keytt' does not have the BIT_ISCOLLECTABLE +** set, so these values are considered not collectable and are different +** from any valid value. +*/ +#define setdeadkey(n) (keytt(n) = LUA_TTABLE, gckey(n) = NULL) + +/* }================================================================== */ + + + +/* +** 'module' operation for hashing (size is always a power of 2) +*/ +#define lmod(s,size) \ + (check_exp((size&(size-1))==0, (cast_int((s) & ((size)-1))))) + + +#define twoto(x) (1<<(x)) +#define sizenode(t) (twoto((t)->lsizenode)) + + +/* size of buffer for 'luaO_utf8esc' function */ +#define UTF8BUFFSZ 8 + +LUAI_FUNC int luaO_utf8esc (char *buff, unsigned long x); +LUAI_FUNC int luaO_ceillog2 (unsigned int x); +LUAI_FUNC int luaO_rawarith (lua_State *L, int op, const TValue *p1, + const TValue *p2, TValue *res); +LUAI_FUNC void luaO_arith (lua_State *L, int op, const TValue *p1, + const TValue *p2, StkId res); +LUAI_FUNC size_t luaO_str2num (const char *s, TValue *o); +LUAI_FUNC int luaO_hexavalue (int c); +LUAI_FUNC void luaO_tostring (lua_State *L, TValue *obj); +LUAI_FUNC const char *luaO_pushvfstring (lua_State *L, const char *fmt, + va_list argp); +LUAI_FUNC const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); +LUAI_FUNC void luaO_chunkid (char *out, const char *source, size_t srclen); + + +#endif + diff --git a/lua-5.4.0/src/lopcodes.c b/lua-5.4.0/src/lopcodes.c new file mode 100644 index 0000000..c67aa22 --- /dev/null +++ b/lua-5.4.0/src/lopcodes.c @@ -0,0 +1,104 @@ +/* +** $Id: lopcodes.c $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#define lopcodes_c +#define LUA_CORE + +#include "lprefix.h" + + +#include "lopcodes.h" + + +/* ORDER OP */ + +LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = { +/* MM OT IT T A mode opcode */ + opmode(0, 0, 0, 0, 1, iABC) /* OP_MOVE */ + ,opmode(0, 0, 0, 0, 1, iAsBx) /* OP_LOADI */ + ,opmode(0, 0, 0, 0, 1, iAsBx) /* OP_LOADF */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_LOADK */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_LOADKX */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LOADFALSE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LFALSESKIP */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LOADTRUE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LOADNIL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETUPVAL */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETUPVAL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETTABUP */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETTABLE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETFIELD */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETTABUP */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETTABLE */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETI */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_SETFIELD */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_NEWTABLE */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SELF */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADDK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUBK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MULK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MODK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_POWK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_DIVK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_IDIVK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BANDK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BORK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BXORK */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHRI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHLI */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADD */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUB */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MUL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_MOD */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_POW */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_DIV */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_IDIV */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BAND */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BOR */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BXOR */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHL */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHR */ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBIN */ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINI*/ + ,opmode(1, 0, 0, 0, 0, iABC) /* OP_MMBINK*/ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_UNM */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_BNOT */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_NOT */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_LEN */ + ,opmode(0, 0, 0, 0, 1, iABC) /* OP_CONCAT */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_CLOSE */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_TBC */ + ,opmode(0, 0, 0, 0, 0, isJ) /* OP_JMP */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_EQ */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LT */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LE */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_EQK */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_EQI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LTI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_LEI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_GTI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_GEI */ + ,opmode(0, 0, 0, 1, 0, iABC) /* OP_TEST */ + ,opmode(0, 0, 0, 1, 1, iABC) /* OP_TESTSET */ + ,opmode(0, 1, 1, 0, 1, iABC) /* OP_CALL */ + ,opmode(0, 1, 1, 0, 1, iABC) /* OP_TAILCALL */ + ,opmode(0, 0, 1, 0, 0, iABC) /* OP_RETURN */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_RETURN0 */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_RETURN1 */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_FORLOOP */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_FORPREP */ + ,opmode(0, 0, 0, 0, 0, iABx) /* OP_TFORPREP */ + ,opmode(0, 0, 0, 0, 0, iABC) /* OP_TFORCALL */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_TFORLOOP */ + ,opmode(0, 0, 1, 0, 0, iABC) /* OP_SETLIST */ + ,opmode(0, 0, 0, 0, 1, iABx) /* OP_CLOSURE */ + ,opmode(0, 1, 0, 0, 1, iABC) /* OP_VARARG */ + ,opmode(0, 0, 1, 0, 1, iABC) /* OP_VARARGPREP */ + ,opmode(0, 0, 0, 0, 0, iAx) /* OP_EXTRAARG */ +}; + diff --git a/lua-5.4.0/src/lopcodes.h b/lua-5.4.0/src/lopcodes.h new file mode 100644 index 0000000..122e5d2 --- /dev/null +++ b/lua-5.4.0/src/lopcodes.h @@ -0,0 +1,392 @@ +/* +** $Id: lopcodes.h $ +** Opcodes for Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lopcodes_h +#define lopcodes_h + +#include "llimits.h" + + +/*=========================================================================== + We assume that instructions are unsigned 32-bit integers. + All instructions have an opcode in the first 7 bits. + Instructions can have the following formats: + + 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 + 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +iABC C(8) | B(8) |k| A(8) | Op(7) | +iABx Bx(17) | A(8) | Op(7) | +iAsBx sBx (signed)(17) | A(8) | Op(7) | +iAx Ax(25) | Op(7) | +isJ sJ(25) | Op(7) | + + A signed argument is represented in excess K: the represented value is + the written unsigned value minus K, where K is half the maximum for the + corresponding unsigned argument. +===========================================================================*/ + + +enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ + + +/* +** size and position of opcode arguments. +*/ +#define SIZE_C 8 +#define SIZE_B 8 +#define SIZE_Bx (SIZE_C + SIZE_B + 1) +#define SIZE_A 8 +#define SIZE_Ax (SIZE_Bx + SIZE_A) +#define SIZE_sJ (SIZE_Bx + SIZE_A) + +#define SIZE_OP 7 + +#define POS_OP 0 + +#define POS_A (POS_OP + SIZE_OP) +#define POS_k (POS_A + SIZE_A) +#define POS_B (POS_k + 1) +#define POS_C (POS_B + SIZE_B) + +#define POS_Bx POS_k + +#define POS_Ax POS_A + +#define POS_sJ POS_A + + +/* +** limits for opcode arguments. +** we use (signed) 'int' to manipulate most arguments, +** so they must fit in ints. +*/ + +/* Check whether type 'int' has at least 'b' bits ('b' < 32) */ +#define L_INTHASBITS(b) ((UINT_MAX >> ((b) - 1)) >= 1) + + +#if L_INTHASBITS(SIZE_Bx) +#define MAXARG_Bx ((1<>1) /* 'sBx' is signed */ + + +#if L_INTHASBITS(SIZE_Ax) +#define MAXARG_Ax ((1<> 1) + + +#define MAXARG_A ((1<> 1) + +#define int2sC(i) ((i) + OFFSET_sC) +#define sC2int(i) ((i) - OFFSET_sC) + + +/* creates a mask with 'n' 1 bits at position 'p' */ +#define MASK1(n,p) ((~((~(Instruction)0)<<(n)))<<(p)) + +/* creates a mask with 'n' 0 bits at position 'p' */ +#define MASK0(n,p) (~MASK1(n,p)) + +/* +** the following macros help to manipulate instructions +*/ + +#define GET_OPCODE(i) (cast(OpCode, ((i)>>POS_OP) & MASK1(SIZE_OP,0))) +#define SET_OPCODE(i,o) ((i) = (((i)&MASK0(SIZE_OP,POS_OP)) | \ + ((cast(Instruction, o)<>(pos)) & MASK1(size,0))) +#define setarg(i,v,pos,size) ((i) = (((i)&MASK0(size,pos)) | \ + ((cast(Instruction, v)<> sC */ +OP_SHLI,/* A B sC R[A] := sC << R[B] */ + +OP_ADD,/* A B C R[A] := R[B] + R[C] */ +OP_SUB,/* A B C R[A] := R[B] - R[C] */ +OP_MUL,/* A B C R[A] := R[B] * R[C] */ +OP_MOD,/* A B C R[A] := R[B] % R[C] */ +OP_POW,/* A B C R[A] := R[B] ^ R[C] */ +OP_DIV,/* A B C R[A] := R[B] / R[C] */ +OP_IDIV,/* A B C R[A] := R[B] // R[C] */ + +OP_BAND,/* A B C R[A] := R[B] & R[C] */ +OP_BOR,/* A B C R[A] := R[B] | R[C] */ +OP_BXOR,/* A B C R[A] := R[B] ~ R[C] */ +OP_SHL,/* A B C R[A] := R[B] << R[C] */ +OP_SHR,/* A B C R[A] := R[B] >> R[C] */ + +OP_MMBIN,/* A B C call C metamethod over R[A] and R[B] */ +OP_MMBINI,/* A sB C k call C metamethod over R[A] and sB */ +OP_MMBINK,/* A B C k call C metamethod over R[A] and K[B] */ + +OP_UNM,/* A B R[A] := -R[B] */ +OP_BNOT,/* A B R[A] := ~R[B] */ +OP_NOT,/* A B R[A] := not R[B] */ +OP_LEN,/* A B R[A] := length of R[B] */ + +OP_CONCAT,/* A B R[A] := R[A].. ... ..R[A + B - 1] */ + +OP_CLOSE,/* A close all upvalues >= R[A] */ +OP_TBC,/* A mark variable A "to be closed" */ +OP_JMP,/* sJ pc += sJ */ +OP_EQ,/* A B k if ((R[A] == R[B]) ~= k) then pc++ */ +OP_LT,/* A B k if ((R[A] < R[B]) ~= k) then pc++ */ +OP_LE,/* A B k if ((R[A] <= R[B]) ~= k) then pc++ */ + +OP_EQK,/* A B k if ((R[A] == K[B]) ~= k) then pc++ */ +OP_EQI,/* A sB k if ((R[A] == sB) ~= k) then pc++ */ +OP_LTI,/* A sB k if ((R[A] < sB) ~= k) then pc++ */ +OP_LEI,/* A sB k if ((R[A] <= sB) ~= k) then pc++ */ +OP_GTI,/* A sB k if ((R[A] > sB) ~= k) then pc++ */ +OP_GEI,/* A sB k if ((R[A] >= sB) ~= k) then pc++ */ + +OP_TEST,/* A k if (not R[A] == k) then pc++ */ +OP_TESTSET,/* A B k if (not R[B] == k) then pc++ else R[A] := R[B] */ + +OP_CALL,/* A B C R[A], ... ,R[A+C-2] := R[A](R[A+1], ... ,R[A+B-1]) */ +OP_TAILCALL,/* A B C k return R[A](R[A+1], ... ,R[A+B-1]) */ + +OP_RETURN,/* A B C k return R[A], ... ,R[A+B-2] (see note) */ +OP_RETURN0,/* return */ +OP_RETURN1,/* A return R[A] */ + +OP_FORLOOP,/* A Bx update counters; if loop continues then pc-=Bx; */ +OP_FORPREP,/* A Bx ; + if not to run then pc+=Bx+1; */ + +OP_TFORPREP,/* A Bx create upvalue for R[A + 3]; pc+=Bx */ +OP_TFORCALL,/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); */ +OP_TFORLOOP,/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } */ + +OP_SETLIST,/* A B C k R[A][(C-1)*FPF+i] := R[A+i], 1 <= i <= B */ + +OP_CLOSURE,/* A Bx R[A] := closure(KPROTO[Bx]) */ + +OP_VARARG,/* A C R[A], R[A+1], ..., R[A+C-2] = vararg */ + +OP_VARARGPREP,/*A (adjust vararg parameters) */ + +OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */ +} OpCode; + + +#define NUM_OPCODES ((int)(OP_EXTRAARG) + 1) + + + +/*=========================================================================== + Notes: + (*) In OP_CALL, if (B == 0) then B = top - A. If (C == 0), then + 'top' is set to last_result+1, so next open instruction (OP_CALL, + OP_RETURN*, OP_SETLIST) may use 'top'. + + (*) In OP_VARARG, if (C == 0) then use actual number of varargs and + set top (like in OP_CALL with C == 0). + + (*) In OP_RETURN, if (B == 0) then return up to 'top'. + + (*) In OP_LOADKX and OP_NEWTABLE, the next instruction is always + OP_EXTRAARG. + + (*) In OP_SETLIST, if (B == 0) then real B = 'top'; if k, then + real C = EXTRAARG _ C (the bits of EXTRAARG concatenated with the + bits of C). + + (*) In OP_NEWTABLE, B is log2 of the hash size (which is always a + power of 2) plus 1, or zero for size zero. If not k, the array size + is C. Otherwise, the array size is EXTRAARG _ C. + + (*) For comparisons, k specifies what condition the test should accept + (true or false). + + (*) In OP_MMBINI/OP_MMBINK, k means the arguments were flipped + (the constant is the first operand). + + (*) All 'skips' (pc++) assume that next instruction is a jump. + + (*) In instructions OP_RETURN/OP_TAILCALL, 'k' specifies that the + function builds upvalues, which may need to be closed. C > 0 means + the function is vararg, so that its 'func' must be corrected before + returning; in this case, (C - 1) is its number of fixed parameters. + + (*) In comparisons with an immediate operand, C signals whether the + original operand was a float. (It must be corrected in case of + metamethods.) + +===========================================================================*/ + + +/* +** masks for instruction properties. The format is: +** bits 0-2: op mode +** bit 3: instruction set register A +** bit 4: operator is a test (next instruction must be a jump) +** bit 5: instruction uses 'L->top' set by previous instruction (when B == 0) +** bit 6: instruction sets 'L->top' for next instruction (when C == 0) +** bit 7: instruction is an MM instruction (call a metamethod) +*/ + +LUAI_DDEC(const lu_byte luaP_opmodes[NUM_OPCODES];) + +#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 7)) +#define testAMode(m) (luaP_opmodes[m] & (1 << 3)) +#define testTMode(m) (luaP_opmodes[m] & (1 << 4)) +#define testITMode(m) (luaP_opmodes[m] & (1 << 5)) +#define testOTMode(m) (luaP_opmodes[m] & (1 << 6)) +#define testMMMode(m) (luaP_opmodes[m] & (1 << 7)) + +/* "out top" (set top for next instruction) */ +#define isOT(i) \ + ((testOTMode(GET_OPCODE(i)) && GETARG_C(i) == 0) || \ + GET_OPCODE(i) == OP_TAILCALL) + +/* "in top" (uses top from previous instruction) */ +#define isIT(i) (testITMode(GET_OPCODE(i)) && GETARG_B(i) == 0) + +#define opmode(mm,ot,it,t,a,m) \ + (((mm) << 7) | ((ot) << 6) | ((it) << 5) | ((t) << 4) | ((a) << 3) | (m)) + + +/* number of list items to accumulate before a SETLIST instruction */ +#define LFIELDS_PER_FLUSH 50 + +#endif diff --git a/lua-5.4.0/src/lopnames.h b/lua-5.4.0/src/lopnames.h new file mode 100644 index 0000000..965cec9 --- /dev/null +++ b/lua-5.4.0/src/lopnames.h @@ -0,0 +1,103 @@ +/* +** $Id: lopnames.h $ +** Opcode names +** See Copyright Notice in lua.h +*/ + +#if !defined(lopnames_h) +#define lopnames_h + +#include + + +/* ORDER OP */ + +static const char *const opnames[] = { + "MOVE", + "LOADI", + "LOADF", + "LOADK", + "LOADKX", + "LOADFALSE", + "LFALSESKIP", + "LOADTRUE", + "LOADNIL", + "GETUPVAL", + "SETUPVAL", + "GETTABUP", + "GETTABLE", + "GETI", + "GETFIELD", + "SETTABUP", + "SETTABLE", + "SETI", + "SETFIELD", + "NEWTABLE", + "SELF", + "ADDI", + "ADDK", + "SUBK", + "MULK", + "MODK", + "POWK", + "DIVK", + "IDIVK", + "BANDK", + "BORK", + "BXORK", + "SHRI", + "SHLI", + "ADD", + "SUB", + "MUL", + "MOD", + "POW", + "DIV", + "IDIV", + "BAND", + "BOR", + "BXOR", + "SHL", + "SHR", + "MMBIN", + "MMBINI", + "MMBINK", + "UNM", + "BNOT", + "NOT", + "LEN", + "CONCAT", + "CLOSE", + "TBC", + "JMP", + "EQ", + "LT", + "LE", + "EQK", + "EQI", + "LTI", + "LEI", + "GTI", + "GEI", + "TEST", + "TESTSET", + "CALL", + "TAILCALL", + "RETURN", + "RETURN0", + "RETURN1", + "FORLOOP", + "FORPREP", + "TFORPREP", + "TFORCALL", + "TFORLOOP", + "SETLIST", + "CLOSURE", + "VARARG", + "VARARGPREP", + "EXTRAARG", + NULL +}; + +#endif + diff --git a/lua-5.4.0/src/loslib.c b/lua-5.4.0/src/loslib.c new file mode 100644 index 0000000..e65e188 --- /dev/null +++ b/lua-5.4.0/src/loslib.c @@ -0,0 +1,430 @@ +/* +** $Id: loslib.c $ +** Standard Operating System library +** See Copyright Notice in lua.h +*/ + +#define loslib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** {================================================================== +** List of valid conversion specifiers for the 'strftime' function; +** options are grouped by length; group of length 2 start with '||'. +** =================================================================== +*/ +#if !defined(LUA_STRFTIMEOPTIONS) /* { */ + +/* options for ANSI C 89 (only 1-char options) */ +#define L_STRFTIMEC89 "aAbBcdHIjmMpSUwWxXyYZ%" + +/* options for ISO C 99 and POSIX */ +#define L_STRFTIMEC99 "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \ + "||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */ + +/* options for Windows */ +#define L_STRFTIMEWIN "aAbBcdHIjmMpSUwWxXyYzZ%" \ + "||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */ + +#if defined(LUA_USE_WINDOWS) +#define LUA_STRFTIMEOPTIONS L_STRFTIMEWIN +#elif defined(LUA_USE_C89) +#define LUA_STRFTIMEOPTIONS L_STRFTIMEC89 +#else /* C99 specification */ +#define LUA_STRFTIMEOPTIONS L_STRFTIMEC99 +#endif + +#endif /* } */ +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for time-related stuff +** =================================================================== +*/ + +/* +** type to represent time_t in Lua +*/ +#if !defined(LUA_NUMTIME) /* { */ + +#define l_timet lua_Integer +#define l_pushtime(L,t) lua_pushinteger(L,(lua_Integer)(t)) +#define l_gettime(L,arg) luaL_checkinteger(L, arg) + +#else /* }{ */ + +#define l_timet lua_Number +#define l_pushtime(L,t) lua_pushnumber(L,(lua_Number)(t)) +#define l_gettime(L,arg) luaL_checknumber(L, arg) + +#endif /* } */ + + +#if !defined(l_gmtime) /* { */ +/* +** By default, Lua uses gmtime/localtime, except when POSIX is available, +** where it uses gmtime_r/localtime_r +*/ + +#if defined(LUA_USE_POSIX) /* { */ + +#define l_gmtime(t,r) gmtime_r(t,r) +#define l_localtime(t,r) localtime_r(t,r) + +#else /* }{ */ + +/* ISO C definitions */ +#define l_gmtime(t,r) ((void)(r)->tm_sec, gmtime(t)) +#define l_localtime(t,r) ((void)(r)->tm_sec, localtime(t)) + +#endif /* } */ + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Configuration for 'tmpnam': +** By default, Lua uses tmpnam except when POSIX is available, where +** it uses mkstemp. +** =================================================================== +*/ +#if !defined(lua_tmpnam) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include + +#define LUA_TMPNAMBUFSIZE 32 + +#if !defined(LUA_TMPNAMTEMPLATE) +#define LUA_TMPNAMTEMPLATE "/tmp/lua_XXXXXX" +#endif + +#define lua_tmpnam(b,e) { \ + strcpy(b, LUA_TMPNAMTEMPLATE); \ + e = mkstemp(b); \ + if (e != -1) close(e); \ + e = (e == -1); } + +#else /* }{ */ + +/* ISO C definitions */ +#define LUA_TMPNAMBUFSIZE L_tmpnam +#define lua_tmpnam(b,e) { e = (tmpnam(b) == NULL); } + +#endif /* } */ + +#endif /* } */ +/* }================================================================== */ + + + +static int os_execute (lua_State *L) { + const char *cmd = luaL_optstring(L, 1, NULL); + int stat; + errno = 0; + stat = system(cmd); + if (cmd != NULL) + return luaL_execresult(L, stat); + else { + lua_pushboolean(L, stat); /* true if there is a shell */ + return 1; + } +} + + +static int os_remove (lua_State *L) { + const char *filename = luaL_checkstring(L, 1); + return luaL_fileresult(L, remove(filename) == 0, filename); +} + + +static int os_rename (lua_State *L) { + const char *fromname = luaL_checkstring(L, 1); + const char *toname = luaL_checkstring(L, 2); + return luaL_fileresult(L, rename(fromname, toname) == 0, NULL); +} + + +static int os_tmpname (lua_State *L) { + char buff[LUA_TMPNAMBUFSIZE]; + int err; + lua_tmpnam(buff, err); + if (err) + return luaL_error(L, "unable to generate a unique filename"); + lua_pushstring(L, buff); + return 1; +} + + +static int os_getenv (lua_State *L) { + lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ + return 1; +} + + +static int os_clock (lua_State *L) { + lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); + return 1; +} + + +/* +** {====================================================== +** Time/Date operations +** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, +** wday=%w+1, yday=%j, isdst=? } +** ======================================================= +*/ + +/* +** About the overflow check: an overflow cannot occur when time +** is represented by a lua_Integer, because either lua_Integer is +** large enough to represent all int fields or it is not large enough +** to represent a time that cause a field to overflow. However, if +** times are represented as doubles and lua_Integer is int, then the +** time 0x1.e1853b0d184f6p+55 would cause an overflow when adding 1900 +** to compute the year. +*/ +static void setfield (lua_State *L, const char *key, int value, int delta) { + #if (defined(LUA_NUMTIME) && LUA_MAXINTEGER <= INT_MAX) + if (value > LUA_MAXINTEGER - delta) + luaL_error(L, "field '%s' is out-of-bound", key); + #endif + lua_pushinteger(L, (lua_Integer)value + delta); + lua_setfield(L, -2, key); +} + + +static void setboolfield (lua_State *L, const char *key, int value) { + if (value < 0) /* undefined? */ + return; /* does not set field */ + lua_pushboolean(L, value); + lua_setfield(L, -2, key); +} + + +/* +** Set all fields from structure 'tm' in the table on top of the stack +*/ +static void setallfields (lua_State *L, struct tm *stm) { + setfield(L, "year", stm->tm_year, 1900); + setfield(L, "month", stm->tm_mon, 1); + setfield(L, "day", stm->tm_mday, 0); + setfield(L, "hour", stm->tm_hour, 0); + setfield(L, "min", stm->tm_min, 0); + setfield(L, "sec", stm->tm_sec, 0); + setfield(L, "yday", stm->tm_yday, 1); + setfield(L, "wday", stm->tm_wday, 1); + setboolfield(L, "isdst", stm->tm_isdst); +} + + +static int getboolfield (lua_State *L, const char *key) { + int res; + res = (lua_getfield(L, -1, key) == LUA_TNIL) ? -1 : lua_toboolean(L, -1); + lua_pop(L, 1); + return res; +} + + +static int getfield (lua_State *L, const char *key, int d, int delta) { + int isnum; + int t = lua_getfield(L, -1, key); /* get field and its type */ + lua_Integer res = lua_tointegerx(L, -1, &isnum); + if (!isnum) { /* field is not an integer? */ + if (t != LUA_TNIL) /* some other value? */ + return luaL_error(L, "field '%s' is not an integer", key); + else if (d < 0) /* absent field; no default? */ + return luaL_error(L, "field '%s' missing in date table", key); + res = d; + } + else { + /* unsigned avoids overflow when lua_Integer has 32 bits */ + if (!(res >= 0 ? (lua_Unsigned)res <= (lua_Unsigned)INT_MAX + delta + : (lua_Integer)INT_MIN + delta <= res)) + return luaL_error(L, "field '%s' is out-of-bound", key); + res -= delta; + } + lua_pop(L, 1); + return (int)res; +} + + +static const char *checkoption (lua_State *L, const char *conv, + ptrdiff_t convlen, char *buff) { + const char *option = LUA_STRFTIMEOPTIONS; + int oplen = 1; /* length of options being checked */ + for (; *option != '\0' && oplen <= convlen; option += oplen) { + if (*option == '|') /* next block? */ + oplen++; /* will check options with next length (+1) */ + else if (memcmp(conv, option, oplen) == 0) { /* match? */ + memcpy(buff, conv, oplen); /* copy valid option to buffer */ + buff[oplen] = '\0'; + return conv + oplen; /* return next item */ + } + } + luaL_argerror(L, 1, + lua_pushfstring(L, "invalid conversion specifier '%%%s'", conv)); + return conv; /* to avoid warnings */ +} + + +static time_t l_checktime (lua_State *L, int arg) { + l_timet t = l_gettime(L, arg); + luaL_argcheck(L, (time_t)t == t, arg, "time out-of-bounds"); + return (time_t)t; +} + + +/* maximum size for an individual 'strftime' item */ +#define SIZETIMEFMT 250 + + +static int os_date (lua_State *L) { + size_t slen; + const char *s = luaL_optlstring(L, 1, "%c", &slen); + time_t t = luaL_opt(L, l_checktime, 2, time(NULL)); + const char *se = s + slen; /* 's' end */ + struct tm tmr, *stm; + if (*s == '!') { /* UTC? */ + stm = l_gmtime(&t, &tmr); + s++; /* skip '!' */ + } + else + stm = l_localtime(&t, &tmr); + if (stm == NULL) /* invalid date? */ + return luaL_error(L, + "date result cannot be represented in this installation"); + if (strcmp(s, "*t") == 0) { + lua_createtable(L, 0, 9); /* 9 = number of fields */ + setallfields(L, stm); + } + else { + char cc[4]; /* buffer for individual conversion specifiers */ + luaL_Buffer b; + cc[0] = '%'; + luaL_buffinit(L, &b); + while (s < se) { + if (*s != '%') /* not a conversion specifier? */ + luaL_addchar(&b, *s++); + else { + size_t reslen; + char *buff = luaL_prepbuffsize(&b, SIZETIMEFMT); + s++; /* skip '%' */ + s = checkoption(L, s, se - s, cc + 1); /* copy specifier to 'cc' */ + reslen = strftime(buff, SIZETIMEFMT, cc, stm); + luaL_addsize(&b, reslen); + } + } + luaL_pushresult(&b); + } + return 1; +} + + +static int os_time (lua_State *L) { + time_t t; + if (lua_isnoneornil(L, 1)) /* called without args? */ + t = time(NULL); /* get current time */ + else { + struct tm ts; + luaL_checktype(L, 1, LUA_TTABLE); + lua_settop(L, 1); /* make sure table is at the top */ + ts.tm_year = getfield(L, "year", -1, 1900); + ts.tm_mon = getfield(L, "month", -1, 1); + ts.tm_mday = getfield(L, "day", -1, 0); + ts.tm_hour = getfield(L, "hour", 12, 0); + ts.tm_min = getfield(L, "min", 0, 0); + ts.tm_sec = getfield(L, "sec", 0, 0); + ts.tm_isdst = getboolfield(L, "isdst"); + t = mktime(&ts); + setallfields(L, &ts); /* update fields with normalized values */ + } + if (t != (time_t)(l_timet)t || t == (time_t)(-1)) + return luaL_error(L, + "time result cannot be represented in this installation"); + l_pushtime(L, t); + return 1; +} + + +static int os_difftime (lua_State *L) { + time_t t1 = l_checktime(L, 1); + time_t t2 = l_checktime(L, 2); + lua_pushnumber(L, (lua_Number)difftime(t1, t2)); + return 1; +} + +/* }====================================================== */ + + +static int os_setlocale (lua_State *L) { + static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, + LC_NUMERIC, LC_TIME}; + static const char *const catnames[] = {"all", "collate", "ctype", "monetary", + "numeric", "time", NULL}; + const char *l = luaL_optstring(L, 1, NULL); + int op = luaL_checkoption(L, 2, "all", catnames); + lua_pushstring(L, setlocale(cat[op], l)); + return 1; +} + + +static int os_exit (lua_State *L) { + int status; + if (lua_isboolean(L, 1)) + status = (lua_toboolean(L, 1) ? EXIT_SUCCESS : EXIT_FAILURE); + else + status = (int)luaL_optinteger(L, 1, EXIT_SUCCESS); + if (lua_toboolean(L, 2)) + lua_close(L); + if (L) exit(status); /* 'if' to avoid warnings for unreachable 'return' */ + return 0; +} + + +static const luaL_Reg syslib[] = { + {"clock", os_clock}, + {"date", os_date}, + {"difftime", os_difftime}, + {"execute", os_execute}, + {"exit", os_exit}, + {"getenv", os_getenv}, + {"remove", os_remove}, + {"rename", os_rename}, + {"setlocale", os_setlocale}, + {"time", os_time}, + {"tmpname", os_tmpname}, + {NULL, NULL} +}; + +/* }====================================================== */ + + + +LUAMOD_API int luaopen_os (lua_State *L) { + luaL_newlib(L, syslib); + return 1; +} + diff --git a/lua-5.4.0/src/lparser.c b/lua-5.4.0/src/lparser.c new file mode 100644 index 0000000..bc7d9a4 --- /dev/null +++ b/lua-5.4.0/src/lparser.c @@ -0,0 +1,1996 @@ +/* +** $Id: lparser.c $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#define lparser_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lcode.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "llex.h" +#include "lmem.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lparser.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" + + + +/* maximum number of local variables per function (must be smaller + than 250, due to the bytecode format) */ +#define MAXVARS 200 + + +#define hasmultret(k) ((k) == VCALL || (k) == VVARARG) + + +/* because all strings are unified by the scanner, the parser + can use pointer equality for string equality */ +#define eqstr(a,b) ((a) == (b)) + + +/* +** nodes for block list (list of active blocks) +*/ +typedef struct BlockCnt { + struct BlockCnt *previous; /* chain */ + int firstlabel; /* index of first label in this block */ + int firstgoto; /* index of first pending goto in this block */ + lu_byte nactvar; /* # active locals outside the block */ + lu_byte upval; /* true if some variable in the block is an upvalue */ + lu_byte isloop; /* true if 'block' is a loop */ + lu_byte insidetbc; /* true if inside the scope of a to-be-closed var. */ +} BlockCnt; + + + +/* +** prototypes for recursive non-terminal functions +*/ +static void statement (LexState *ls); +static void expr (LexState *ls, expdesc *v); + + +static l_noret error_expected (LexState *ls, int token) { + luaX_syntaxerror(ls, + luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); +} + + +static l_noret errorlimit (FuncState *fs, int limit, const char *what) { + lua_State *L = fs->ls->L; + const char *msg; + int line = fs->f->linedefined; + const char *where = (line == 0) + ? "main function" + : luaO_pushfstring(L, "function at line %d", line); + msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s", + what, limit, where); + luaX_syntaxerror(fs->ls, msg); +} + + +static void checklimit (FuncState *fs, int v, int l, const char *what) { + if (v > l) errorlimit(fs, l, what); +} + + +/* +** Test whether next token is 'c'; if so, skip it. +*/ +static int testnext (LexState *ls, int c) { + if (ls->t.token == c) { + luaX_next(ls); + return 1; + } + else return 0; +} + + +/* +** Check that next token is 'c'. +*/ +static void check (LexState *ls, int c) { + if (ls->t.token != c) + error_expected(ls, c); +} + + +/* +** Check that next token is 'c' and skip it. +*/ +static void checknext (LexState *ls, int c) { + check(ls, c); + luaX_next(ls); +} + + +#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } + + +/* +** Check that next token is 'what' and skip it. In case of error, +** raise an error that the expected 'what' should match a 'who' +** in line 'where' (if that is not the current line). +*/ +static void check_match (LexState *ls, int what, int who, int where) { + if (unlikely(!testnext(ls, what))) { + if (where == ls->linenumber) /* all in the same line? */ + error_expected(ls, what); /* do not need a complex message */ + else { + luaX_syntaxerror(ls, luaO_pushfstring(ls->L, + "%s expected (to close %s at line %d)", + luaX_token2str(ls, what), luaX_token2str(ls, who), where)); + } + } +} + + +static TString *str_checkname (LexState *ls) { + TString *ts; + check(ls, TK_NAME); + ts = ls->t.seminfo.ts; + luaX_next(ls); + return ts; +} + + +static void init_exp (expdesc *e, expkind k, int i) { + e->f = e->t = NO_JUMP; + e->k = k; + e->u.info = i; +} + + +static void codestring (expdesc *e, TString *s) { + e->f = e->t = NO_JUMP; + e->k = VKSTR; + e->u.strval = s; +} + + +static void codename (LexState *ls, expdesc *e) { + codestring(e, str_checkname(ls)); +} + + +/* +** Register a new local variable in the active 'Proto' (for debug +** information). +*/ +static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) { + Proto *f = fs->f; + int oldsize = f->sizelocvars; + luaM_growvector(ls->L, f->locvars, fs->ndebugvars, f->sizelocvars, + LocVar, SHRT_MAX, "local variables"); + while (oldsize < f->sizelocvars) + f->locvars[oldsize++].varname = NULL; + f->locvars[fs->ndebugvars].varname = varname; + f->locvars[fs->ndebugvars].startpc = fs->pc; + luaC_objbarrier(ls->L, f, varname); + return fs->ndebugvars++; +} + + +/* +** Create a new local variable with the given 'name'. Return its index +** in the function. +*/ +static int new_localvar (LexState *ls, TString *name) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Dyndata *dyd = ls->dyd; + Vardesc *var; + checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal, + MAXVARS, "local variables"); + luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1, + dyd->actvar.size, Vardesc, USHRT_MAX, "local variables"); + var = &dyd->actvar.arr[dyd->actvar.n++]; + var->vd.kind = VDKREG; /* default */ + var->vd.name = name; + return dyd->actvar.n - 1 - fs->firstlocal; +} + +#define new_localvarliteral(ls,v) \ + new_localvar(ls, \ + luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1)); + + + +/* +** Return the "variable description" (Vardesc) of a given variable. +** (Unless noted otherwise, all variables are referred to by their +** compiler indices.) +*/ +static Vardesc *getlocalvardesc (FuncState *fs, int vidx) { + return &fs->ls->dyd->actvar.arr[fs->firstlocal + vidx]; +} + + +/* +** Convert 'nvar', a compiler index level, to it corresponding +** stack index level. For that, search for the highest variable +** below that level that is in the stack and uses its stack +** index ('sidx'). +*/ +static int stacklevel (FuncState *fs, int nvar) { + while (nvar-- > 0) { + Vardesc *vd = getlocalvardesc(fs, nvar); /* get variable */ + if (vd->vd.kind != RDKCTC) /* is in the stack? */ + return vd->vd.sidx + 1; + } + return 0; /* no variables in the stack */ +} + + +/* +** Return the number of variables in the stack for function 'fs' +*/ +int luaY_nvarstack (FuncState *fs) { + return stacklevel(fs, fs->nactvar); +} + + +/* +** Get the debug-information entry for current variable 'vidx'. +*/ +static LocVar *localdebuginfo (FuncState *fs, int vidx) { + Vardesc *vd = getlocalvardesc(fs, vidx); + if (vd->vd.kind == RDKCTC) + return NULL; /* no debug info. for constants */ + else { + int idx = vd->vd.pidx; + lua_assert(idx < fs->ndebugvars); + return &fs->f->locvars[idx]; + } +} + + +/* +** Create an expression representing variable 'vidx' +*/ +static void init_var (FuncState *fs, expdesc *e, int vidx) { + e->f = e->t = NO_JUMP; + e->k = VLOCAL; + e->u.var.vidx = vidx; + e->u.var.sidx = getlocalvardesc(fs, vidx)->vd.sidx; +} + + +/* +** Raises an error if variable described by 'e' is read only +*/ +static void check_readonly (LexState *ls, expdesc *e) { + FuncState *fs = ls->fs; + TString *varname = NULL; /* to be set if variable is const */ + switch (e->k) { + case VCONST: { + varname = ls->dyd->actvar.arr[e->u.info].vd.name; + break; + } + case VLOCAL: { + Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx); + if (vardesc->vd.kind != VDKREG) /* not a regular variable? */ + varname = vardesc->vd.name; + break; + } + case VUPVAL: { + Upvaldesc *up = &fs->f->upvalues[e->u.info]; + if (up->kind != VDKREG) + varname = up->name; + break; + } + default: + return; /* other cases cannot be read-only */ + } + if (varname) { + const char *msg = luaO_pushfstring(ls->L, + "attempt to assign to const variable '%s'", getstr(varname)); + luaK_semerror(ls, msg); /* error */ + } +} + + +/* +** Start the scope for the last 'nvars' created variables. +*/ +static void adjustlocalvars (LexState *ls, int nvars) { + FuncState *fs = ls->fs; + int stklevel = luaY_nvarstack(fs); + int i; + for (i = 0; i < nvars; i++) { + int vidx = fs->nactvar++; + Vardesc *var = getlocalvardesc(fs, vidx); + var->vd.sidx = stklevel++; + var->vd.pidx = registerlocalvar(ls, fs, var->vd.name); + } +} + + +/* +** Close the scope for all variables up to level 'tolevel'. +** (debug info.) +*/ +static void removevars (FuncState *fs, int tolevel) { + fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); + while (fs->nactvar > tolevel) { + LocVar *var = localdebuginfo(fs, --fs->nactvar); + if (var) /* does it have debug information? */ + var->endpc = fs->pc; + } +} + + +/* +** Search the upvalues of the function 'fs' for one +** with the given 'name'. +*/ +static int searchupvalue (FuncState *fs, TString *name) { + int i; + Upvaldesc *up = fs->f->upvalues; + for (i = 0; i < fs->nups; i++) { + if (eqstr(up[i].name, name)) return i; + } + return -1; /* not found */ +} + + +static Upvaldesc *allocupvalue (FuncState *fs) { + Proto *f = fs->f; + int oldsize = f->sizeupvalues; + checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues"); + luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, + Upvaldesc, MAXUPVAL, "upvalues"); + while (oldsize < f->sizeupvalues) + f->upvalues[oldsize++].name = NULL; + return &f->upvalues[fs->nups++]; +} + + +static int newupvalue (FuncState *fs, TString *name, expdesc *v) { + Upvaldesc *up = allocupvalue(fs); + FuncState *prev = fs->prev; + if (v->k == VLOCAL) { + up->instack = 1; + up->idx = v->u.var.sidx; + up->kind = getlocalvardesc(prev, v->u.var.vidx)->vd.kind; + lua_assert(eqstr(name, getlocalvardesc(prev, v->u.var.vidx)->vd.name)); + } + else { + up->instack = 0; + up->idx = cast_byte(v->u.info); + up->kind = prev->f->upvalues[v->u.info].kind; + lua_assert(eqstr(name, prev->f->upvalues[v->u.info].name)); + } + up->name = name; + luaC_objbarrier(fs->ls->L, fs->f, name); + return fs->nups - 1; +} + + +/* +** Look for an active local variable with the name 'n' in the +** function 'fs'. If found, initialize 'var' with it and return +** its expression kind; otherwise return -1. +*/ +static int searchvar (FuncState *fs, TString *n, expdesc *var) { + int i; + for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) { + Vardesc *vd = getlocalvardesc(fs, i); + if (eqstr(n, vd->vd.name)) { /* found? */ + if (vd->vd.kind == RDKCTC) /* compile-time constant? */ + init_exp(var, VCONST, fs->firstlocal + i); + else /* real variable */ + init_var(fs, var, i); + return var->k; + } + } + return -1; /* not found */ +} + + +/* +** Mark block where variable at given level was defined +** (to emit close instructions later). +*/ +static void markupval (FuncState *fs, int level) { + BlockCnt *bl = fs->bl; + while (bl->nactvar > level) + bl = bl->previous; + bl->upval = 1; + fs->needclose = 1; +} + + +/* +** Find a variable with the given name 'n'. If it is an upvalue, add +** this upvalue into all intermediate functions. If it is a global, set +** 'var' as 'void' as a flag. +*/ +static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { + if (fs == NULL) /* no more levels? */ + init_exp(var, VVOID, 0); /* default is global */ + else { + int v = searchvar(fs, n, var); /* look up locals at current level */ + if (v >= 0) { /* found? */ + if (v == VLOCAL && !base) + markupval(fs, var->u.var.vidx); /* local will be used as an upval */ + } + else { /* not found as local at current level; try upvalues */ + int idx = searchupvalue(fs, n); /* try existing upvalues */ + if (idx < 0) { /* not found? */ + singlevaraux(fs->prev, n, var, 0); /* try upper levels */ + if (var->k == VLOCAL || var->k == VUPVAL) /* local or upvalue? */ + idx = newupvalue(fs, n, var); /* will be a new upvalue */ + else /* it is a global or a constant */ + return; /* don't need to do anything at this level */ + } + init_exp(var, VUPVAL, idx); /* new or old upvalue */ + } + } +} + + +/* +** Find a variable with the given name 'n', handling global variables +** too. +*/ +static void singlevar (LexState *ls, expdesc *var) { + TString *varname = str_checkname(ls); + FuncState *fs = ls->fs; + singlevaraux(fs, varname, var, 1); + if (var->k == VVOID) { /* global name? */ + expdesc key; + singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ + lua_assert(var->k != VVOID); /* this one must exist */ + codestring(&key, varname); /* key is variable name */ + luaK_indexed(fs, var, &key); /* env[varname] */ + } +} + + +/* +** Adjust the number of results from an expression list 'e' with 'nexps' +** expressions to 'nvars' values. +*/ +static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { + FuncState *fs = ls->fs; + int needed = nvars - nexps; /* extra values needed */ + if (hasmultret(e->k)) { /* last expression has multiple returns? */ + int extra = needed + 1; /* discount last expression itself */ + if (extra < 0) + extra = 0; + luaK_setreturns(fs, e, extra); /* last exp. provides the difference */ + } + else { + if (e->k != VVOID) /* at least one expression? */ + luaK_exp2nextreg(fs, e); /* close last expression */ + if (needed > 0) /* missing values? */ + luaK_nil(fs, fs->freereg, needed); /* complete with nils */ + } + if (needed > 0) + luaK_reserveregs(fs, needed); /* registers for extra values */ + else /* adding 'needed' is actually a subtraction */ + fs->freereg += needed; /* remove extra values */ +} + + +/* +** Macros to limit the maximum recursion depth while parsing +*/ +#define enterlevel(ls) luaE_enterCcall((ls)->L) + +#define leavelevel(ls) luaE_exitCcall((ls)->L) + + +/* +** Generates an error that a goto jumps into the scope of some +** local variable. +*/ +static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) { + const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name); + const char *msg = " at line %d jumps into the scope of local '%s'"; + msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname); + luaK_semerror(ls, msg); /* raise the error */ +} + + +/* +** Solves the goto at index 'g' to given 'label' and removes it +** from the list of pending goto's. +** If it jumps into the scope of some variable, raises an error. +*/ +static void solvegoto (LexState *ls, int g, Labeldesc *label) { + int i; + Labellist *gl = &ls->dyd->gt; /* list of goto's */ + Labeldesc *gt = &gl->arr[g]; /* goto to be resolved */ + lua_assert(eqstr(gt->name, label->name)); + if (unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */ + jumpscopeerror(ls, gt); + luaK_patchlist(ls->fs, gt->pc, label->pc); + for (i = g; i < gl->n - 1; i++) /* remove goto from pending list */ + gl->arr[i] = gl->arr[i + 1]; + gl->n--; +} + + +/* +** Search for an active label with the given name. +*/ +static Labeldesc *findlabel (LexState *ls, TString *name) { + int i; + Dyndata *dyd = ls->dyd; + /* check labels in current function for a match */ + for (i = ls->fs->firstlabel; i < dyd->label.n; i++) { + Labeldesc *lb = &dyd->label.arr[i]; + if (eqstr(lb->name, name)) /* correct label? */ + return lb; + } + return NULL; /* label not found */ +} + + +/* +** Adds a new label/goto in the corresponding list. +*/ +static int newlabelentry (LexState *ls, Labellist *l, TString *name, + int line, int pc) { + int n = l->n; + luaM_growvector(ls->L, l->arr, n, l->size, + Labeldesc, SHRT_MAX, "labels/gotos"); + l->arr[n].name = name; + l->arr[n].line = line; + l->arr[n].nactvar = ls->fs->nactvar; + l->arr[n].close = 0; + l->arr[n].pc = pc; + l->n = n + 1; + return n; +} + + +static int newgotoentry (LexState *ls, TString *name, int line, int pc) { + return newlabelentry(ls, &ls->dyd->gt, name, line, pc); +} + + +/* +** Solves forward jumps. Check whether new label 'lb' matches any +** pending gotos in current block and solves them. Return true +** if any of the goto's need to close upvalues. +*/ +static int solvegotos (LexState *ls, Labeldesc *lb) { + Labellist *gl = &ls->dyd->gt; + int i = ls->fs->bl->firstgoto; + int needsclose = 0; + while (i < gl->n) { + if (eqstr(gl->arr[i].name, lb->name)) { + needsclose |= gl->arr[i].close; + solvegoto(ls, i, lb); /* will remove 'i' from the list */ + } + else + i++; + } + return needsclose; +} + + +/* +** Create a new label with the given 'name' at the given 'line'. +** 'last' tells whether label is the last non-op statement in its +** block. Solves all pending goto's to this new label and adds +** a close instruction if necessary. +** Returns true iff it added a close instruction. +*/ +static int createlabel (LexState *ls, TString *name, int line, + int last) { + FuncState *fs = ls->fs; + Labellist *ll = &ls->dyd->label; + int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs)); + if (last) { /* label is last no-op statement in the block? */ + /* assume that locals are already out of scope */ + ll->arr[l].nactvar = fs->bl->nactvar; + } + if (solvegotos(ls, &ll->arr[l])) { /* need close? */ + luaK_codeABC(fs, OP_CLOSE, luaY_nvarstack(fs), 0, 0); + return 1; + } + return 0; +} + + +/* +** Adjust pending gotos to outer level of a block. +*/ +static void movegotosout (FuncState *fs, BlockCnt *bl) { + int i; + Labellist *gl = &fs->ls->dyd->gt; + /* correct pending gotos to current block */ + for (i = bl->firstgoto; i < gl->n; i++) { /* for each pending goto */ + Labeldesc *gt = &gl->arr[i]; + /* leaving a variable scope? */ + if (stacklevel(fs, gt->nactvar) > stacklevel(fs, bl->nactvar)) + gt->close |= bl->upval; /* jump may need a close */ + gt->nactvar = bl->nactvar; /* update goto level */ + } +} + + +static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) { + bl->isloop = isloop; + bl->nactvar = fs->nactvar; + bl->firstlabel = fs->ls->dyd->label.n; + bl->firstgoto = fs->ls->dyd->gt.n; + bl->upval = 0; + bl->insidetbc = (fs->bl != NULL && fs->bl->insidetbc); + bl->previous = fs->bl; + fs->bl = bl; + lua_assert(fs->freereg == luaY_nvarstack(fs)); +} + + +/* +** generates an error for an undefined 'goto'. +*/ +static l_noret undefgoto (LexState *ls, Labeldesc *gt) { + const char *msg; + if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) { + msg = "break outside loop at line %d"; + msg = luaO_pushfstring(ls->L, msg, gt->line); + } + else { + msg = "no visible label '%s' for at line %d"; + msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); + } + luaK_semerror(ls, msg); +} + + +static void leaveblock (FuncState *fs) { + BlockCnt *bl = fs->bl; + LexState *ls = fs->ls; + int hasclose = 0; + int stklevel = stacklevel(fs, bl->nactvar); /* level outside the block */ + if (bl->isloop) /* fix pending breaks? */ + hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); + if (!hasclose && bl->previous && bl->upval) + luaK_codeABC(fs, OP_CLOSE, stklevel, 0, 0); + fs->bl = bl->previous; + removevars(fs, bl->nactvar); + lua_assert(bl->nactvar == fs->nactvar); + fs->freereg = stklevel; /* free registers */ + ls->dyd->label.n = bl->firstlabel; /* remove local labels */ + if (bl->previous) /* inner block? */ + movegotosout(fs, bl); /* update pending gotos to outer block */ + else { + if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ + undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ + } +} + + +/* +** adds a new prototype into list of prototypes +*/ +static Proto *addprototype (LexState *ls) { + Proto *clp; + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; /* prototype of current function */ + if (fs->np >= f->sizep) { + int oldsize = f->sizep; + luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions"); + while (oldsize < f->sizep) + f->p[oldsize++] = NULL; + } + f->p[fs->np++] = clp = luaF_newproto(L); + luaC_objbarrier(L, f, clp); + return clp; +} + + +/* +** codes instruction to create new closure in parent function. +** The OP_CLOSURE instruction uses the last available register, +** so that, if it invokes the GC, the GC knows which registers +** are in use at that time. + +*/ +static void codeclosure (LexState *ls, expdesc *v) { + FuncState *fs = ls->fs->prev; + init_exp(v, VRELOC, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1)); + luaK_exp2nextreg(fs, v); /* fix it at the last register */ +} + + +static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { + Proto *f = fs->f; + fs->prev = ls->fs; /* linked list of funcstates */ + fs->ls = ls; + ls->fs = fs; + fs->pc = 0; + fs->previousline = f->linedefined; + fs->iwthabs = 0; + fs->lasttarget = 0; + fs->freereg = 0; + fs->nk = 0; + fs->nabslineinfo = 0; + fs->np = 0; + fs->nups = 0; + fs->ndebugvars = 0; + fs->nactvar = 0; + fs->needclose = 0; + fs->firstlocal = ls->dyd->actvar.n; + fs->firstlabel = ls->dyd->label.n; + fs->bl = NULL; + f->source = ls->source; + luaC_objbarrier(ls->L, f, f->source); + f->maxstacksize = 2; /* registers 0/1 are always valid */ + enterblock(fs, bl, 0); +} + + +static void close_func (LexState *ls) { + lua_State *L = ls->L; + FuncState *fs = ls->fs; + Proto *f = fs->f; + luaK_ret(fs, luaY_nvarstack(fs), 0); /* final return */ + leaveblock(fs); + lua_assert(fs->bl == NULL); + luaK_finish(fs); + luaM_shrinkvector(L, f->code, f->sizecode, fs->pc, Instruction); + luaM_shrinkvector(L, f->lineinfo, f->sizelineinfo, fs->pc, ls_byte); + luaM_shrinkvector(L, f->abslineinfo, f->sizeabslineinfo, + fs->nabslineinfo, AbsLineInfo); + luaM_shrinkvector(L, f->k, f->sizek, fs->nk, TValue); + luaM_shrinkvector(L, f->p, f->sizep, fs->np, Proto *); + luaM_shrinkvector(L, f->locvars, f->sizelocvars, fs->ndebugvars, LocVar); + luaM_shrinkvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc); + ls->fs = fs->prev; + luaC_checkGC(L); +} + + + +/*============================================================*/ +/* GRAMMAR RULES */ +/*============================================================*/ + + +/* +** check whether current token is in the follow set of a block. +** 'until' closes syntactical blocks, but do not close scope, +** so it is handled in separate. +*/ +static int block_follow (LexState *ls, int withuntil) { + switch (ls->t.token) { + case TK_ELSE: case TK_ELSEIF: + case TK_END: case TK_EOS: + return 1; + case TK_UNTIL: return withuntil; + default: return 0; + } +} + + +static void statlist (LexState *ls) { + /* statlist -> { stat [';'] } */ + while (!block_follow(ls, 1)) { + if (ls->t.token == TK_RETURN) { + statement(ls); + return; /* 'return' must be last statement */ + } + statement(ls); + } +} + + +static void fieldsel (LexState *ls, expdesc *v) { + /* fieldsel -> ['.' | ':'] NAME */ + FuncState *fs = ls->fs; + expdesc key; + luaK_exp2anyregup(fs, v); + luaX_next(ls); /* skip the dot or colon */ + codename(ls, &key); + luaK_indexed(fs, v, &key); +} + + +static void yindex (LexState *ls, expdesc *v) { + /* index -> '[' expr ']' */ + luaX_next(ls); /* skip the '[' */ + expr(ls, v); + luaK_exp2val(ls->fs, v); + checknext(ls, ']'); +} + + +/* +** {====================================================================== +** Rules for Constructors +** ======================================================================= +*/ + + +typedef struct ConsControl { + expdesc v; /* last list item read */ + expdesc *t; /* table descriptor */ + int nh; /* total number of 'record' elements */ + int na; /* number of array elements already stored */ + int tostore; /* number of array elements pending to be stored */ +} ConsControl; + + +static void recfield (LexState *ls, ConsControl *cc) { + /* recfield -> (NAME | '['exp']') = exp */ + FuncState *fs = ls->fs; + int reg = ls->fs->freereg; + expdesc tab, key, val; + if (ls->t.token == TK_NAME) { + checklimit(fs, cc->nh, MAX_INT, "items in a constructor"); + codename(ls, &key); + } + else /* ls->t.token == '[' */ + yindex(ls, &key); + cc->nh++; + checknext(ls, '='); + tab = *cc->t; + luaK_indexed(fs, &tab, &key); + expr(ls, &val); + luaK_storevar(fs, &tab, &val); + fs->freereg = reg; /* free registers */ +} + + +static void closelistfield (FuncState *fs, ConsControl *cc) { + if (cc->v.k == VVOID) return; /* there is no list item */ + luaK_exp2nextreg(fs, &cc->v); + cc->v.k = VVOID; + if (cc->tostore == LFIELDS_PER_FLUSH) { + luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */ + cc->na += cc->tostore; + cc->tostore = 0; /* no more items pending */ + } +} + + +static void lastlistfield (FuncState *fs, ConsControl *cc) { + if (cc->tostore == 0) return; + if (hasmultret(cc->v.k)) { + luaK_setmultret(fs, &cc->v); + luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET); + cc->na--; /* do not count last expression (unknown number of elements) */ + } + else { + if (cc->v.k != VVOID) + luaK_exp2nextreg(fs, &cc->v); + luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); + } + cc->na += cc->tostore; +} + + +static void listfield (LexState *ls, ConsControl *cc) { + /* listfield -> exp */ + expr(ls, &cc->v); + cc->tostore++; +} + + +static void field (LexState *ls, ConsControl *cc) { + /* field -> listfield | recfield */ + switch(ls->t.token) { + case TK_NAME: { /* may be 'listfield' or 'recfield' */ + if (luaX_lookahead(ls) != '=') /* expression? */ + listfield(ls, cc); + else + recfield(ls, cc); + break; + } + case '[': { + recfield(ls, cc); + break; + } + default: { + listfield(ls, cc); + break; + } + } +} + + +static void constructor (LexState *ls, expdesc *t) { + /* constructor -> '{' [ field { sep field } [sep] ] '}' + sep -> ',' | ';' */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); + ConsControl cc; + luaK_code(fs, 0); /* space for extra arg. */ + cc.na = cc.nh = cc.tostore = 0; + cc.t = t; + init_exp(t, VNONRELOC, fs->freereg); /* table will be at stack top */ + luaK_reserveregs(fs, 1); + init_exp(&cc.v, VVOID, 0); /* no value (yet) */ + checknext(ls, '{'); + do { + lua_assert(cc.v.k == VVOID || cc.tostore > 0); + if (ls->t.token == '}') break; + closelistfield(fs, &cc); + field(ls, &cc); + } while (testnext(ls, ',') || testnext(ls, ';')); + check_match(ls, '}', '{', line); + lastlistfield(fs, &cc); + luaK_settablesize(fs, pc, t->u.info, cc.na, cc.nh); +} + +/* }====================================================================== */ + + +static void setvararg (FuncState *fs, int nparams) { + fs->f->is_vararg = 1; + luaK_codeABC(fs, OP_VARARGPREP, nparams, 0, 0); +} + + +static void parlist (LexState *ls) { + /* parlist -> [ param { ',' param } ] */ + FuncState *fs = ls->fs; + Proto *f = fs->f; + int nparams = 0; + int isvararg = 0; + if (ls->t.token != ')') { /* is 'parlist' not empty? */ + do { + switch (ls->t.token) { + case TK_NAME: { /* param -> NAME */ + new_localvar(ls, str_checkname(ls)); + nparams++; + break; + } + case TK_DOTS: { /* param -> '...' */ + luaX_next(ls); + isvararg = 1; + break; + } + default: luaX_syntaxerror(ls, " or '...' expected"); + } + } while (!isvararg && testnext(ls, ',')); + } + adjustlocalvars(ls, nparams); + f->numparams = cast_byte(fs->nactvar); + if (isvararg) + setvararg(fs, f->numparams); /* declared vararg */ + luaK_reserveregs(fs, fs->nactvar); /* reserve registers for parameters */ +} + + +static void body (LexState *ls, expdesc *e, int ismethod, int line) { + /* body -> '(' parlist ')' block END */ + FuncState new_fs; + BlockCnt bl; + new_fs.f = addprototype(ls); + new_fs.f->linedefined = line; + open_func(ls, &new_fs, &bl); + checknext(ls, '('); + if (ismethod) { + new_localvarliteral(ls, "self"); /* create 'self' parameter */ + adjustlocalvars(ls, 1); + } + parlist(ls); + checknext(ls, ')'); + statlist(ls); + new_fs.f->lastlinedefined = ls->linenumber; + check_match(ls, TK_END, TK_FUNCTION, line); + codeclosure(ls, e); + close_func(ls); +} + + +static int explist (LexState *ls, expdesc *v) { + /* explist -> expr { ',' expr } */ + int n = 1; /* at least one expression */ + expr(ls, v); + while (testnext(ls, ',')) { + luaK_exp2nextreg(ls->fs, v); + expr(ls, v); + n++; + } + return n; +} + + +static void funcargs (LexState *ls, expdesc *f, int line) { + FuncState *fs = ls->fs; + expdesc args; + int base, nparams; + switch (ls->t.token) { + case '(': { /* funcargs -> '(' [ explist ] ')' */ + luaX_next(ls); + if (ls->t.token == ')') /* arg list is empty? */ + args.k = VVOID; + else { + explist(ls, &args); + if (hasmultret(args.k)) + luaK_setmultret(fs, &args); + } + check_match(ls, ')', '(', line); + break; + } + case '{': { /* funcargs -> constructor */ + constructor(ls, &args); + break; + } + case TK_STRING: { /* funcargs -> STRING */ + codestring(&args, ls->t.seminfo.ts); + luaX_next(ls); /* must use 'seminfo' before 'next' */ + break; + } + default: { + luaX_syntaxerror(ls, "function arguments expected"); + } + } + lua_assert(f->k == VNONRELOC); + base = f->u.info; /* base register for call */ + if (hasmultret(args.k)) + nparams = LUA_MULTRET; /* open call */ + else { + if (args.k != VVOID) + luaK_exp2nextreg(fs, &args); /* close last argument */ + nparams = fs->freereg - (base+1); + } + init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); + luaK_fixline(fs, line); + fs->freereg = base+1; /* call remove function and arguments and leaves + (unless changed) one result */ +} + + + + +/* +** {====================================================================== +** Expression parsing +** ======================================================================= +*/ + + +static void primaryexp (LexState *ls, expdesc *v) { + /* primaryexp -> NAME | '(' expr ')' */ + switch (ls->t.token) { + case '(': { + int line = ls->linenumber; + luaX_next(ls); + expr(ls, v); + check_match(ls, ')', '(', line); + luaK_dischargevars(ls->fs, v); + return; + } + case TK_NAME: { + singlevar(ls, v); + return; + } + default: { + luaX_syntaxerror(ls, "unexpected symbol"); + } + } +} + + +static void suffixedexp (LexState *ls, expdesc *v) { + /* suffixedexp -> + primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */ + FuncState *fs = ls->fs; + int line = ls->linenumber; + primaryexp(ls, v); + for (;;) { + switch (ls->t.token) { + case '.': { /* fieldsel */ + fieldsel(ls, v); + break; + } + case '[': { /* '[' exp ']' */ + expdesc key; + luaK_exp2anyregup(fs, v); + yindex(ls, &key); + luaK_indexed(fs, v, &key); + break; + } + case ':': { /* ':' NAME funcargs */ + expdesc key; + luaX_next(ls); + codename(ls, &key); + luaK_self(fs, v, &key); + funcargs(ls, v, line); + break; + } + case '(': case TK_STRING: case '{': { /* funcargs */ + luaK_exp2nextreg(fs, v); + funcargs(ls, v, line); + break; + } + default: return; + } + } +} + + +static void simpleexp (LexState *ls, expdesc *v) { + /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... | + constructor | FUNCTION body | suffixedexp */ + switch (ls->t.token) { + case TK_FLT: { + init_exp(v, VKFLT, 0); + v->u.nval = ls->t.seminfo.r; + break; + } + case TK_INT: { + init_exp(v, VKINT, 0); + v->u.ival = ls->t.seminfo.i; + break; + } + case TK_STRING: { + codestring(v, ls->t.seminfo.ts); + break; + } + case TK_NIL: { + init_exp(v, VNIL, 0); + break; + } + case TK_TRUE: { + init_exp(v, VTRUE, 0); + break; + } + case TK_FALSE: { + init_exp(v, VFALSE, 0); + break; + } + case TK_DOTS: { /* vararg */ + FuncState *fs = ls->fs; + check_condition(ls, fs->f->is_vararg, + "cannot use '...' outside a vararg function"); + init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1)); + break; + } + case '{': { /* constructor */ + constructor(ls, v); + return; + } + case TK_FUNCTION: { + luaX_next(ls); + body(ls, v, 0, ls->linenumber); + return; + } + default: { + suffixedexp(ls, v); + return; + } + } + luaX_next(ls); +} + + +static UnOpr getunopr (int op) { + switch (op) { + case TK_NOT: return OPR_NOT; + case '-': return OPR_MINUS; + case '~': return OPR_BNOT; + case '#': return OPR_LEN; + default: return OPR_NOUNOPR; + } +} + + +static BinOpr getbinopr (int op) { + switch (op) { + case '+': return OPR_ADD; + case '-': return OPR_SUB; + case '*': return OPR_MUL; + case '%': return OPR_MOD; + case '^': return OPR_POW; + case '/': return OPR_DIV; + case TK_IDIV: return OPR_IDIV; + case '&': return OPR_BAND; + case '|': return OPR_BOR; + case '~': return OPR_BXOR; + case TK_SHL: return OPR_SHL; + case TK_SHR: return OPR_SHR; + case TK_CONCAT: return OPR_CONCAT; + case TK_NE: return OPR_NE; + case TK_EQ: return OPR_EQ; + case '<': return OPR_LT; + case TK_LE: return OPR_LE; + case '>': return OPR_GT; + case TK_GE: return OPR_GE; + case TK_AND: return OPR_AND; + case TK_OR: return OPR_OR; + default: return OPR_NOBINOPR; + } +} + + +/* +** Priority table for binary operators. +*/ +static const struct { + lu_byte left; /* left priority for each binary operator */ + lu_byte right; /* right priority */ +} priority[] = { /* ORDER OPR */ + {10, 10}, {10, 10}, /* '+' '-' */ + {11, 11}, {11, 11}, /* '*' '%' */ + {14, 13}, /* '^' (right associative) */ + {11, 11}, {11, 11}, /* '/' '//' */ + {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */ + {7, 7}, {7, 7}, /* '<<' '>>' */ + {9, 8}, /* '..' (right associative) */ + {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */ + {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */ + {2, 2}, {1, 1} /* and, or */ +}; + +#define UNARY_PRIORITY 12 /* priority for unary operators */ + + +/* +** subexpr -> (simpleexp | unop subexpr) { binop subexpr } +** where 'binop' is any binary operator with a priority higher than 'limit' +*/ +static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { + BinOpr op; + UnOpr uop; + enterlevel(ls); + uop = getunopr(ls->t.token); + if (uop != OPR_NOUNOPR) { /* prefix (unary) operator? */ + int line = ls->linenumber; + luaX_next(ls); /* skip operator */ + subexpr(ls, v, UNARY_PRIORITY); + luaK_prefix(ls->fs, uop, v, line); + } + else simpleexp(ls, v); + /* expand while operators have priorities higher than 'limit' */ + op = getbinopr(ls->t.token); + while (op != OPR_NOBINOPR && priority[op].left > limit) { + expdesc v2; + BinOpr nextop; + int line = ls->linenumber; + luaX_next(ls); /* skip operator */ + luaK_infix(ls->fs, op, v); + /* read sub-expression with higher priority */ + nextop = subexpr(ls, &v2, priority[op].right); + luaK_posfix(ls->fs, op, v, &v2, line); + op = nextop; + } + leavelevel(ls); + return op; /* return first untreated operator */ +} + + +static void expr (LexState *ls, expdesc *v) { + subexpr(ls, v, 0); +} + +/* }==================================================================== */ + + + +/* +** {====================================================================== +** Rules for Statements +** ======================================================================= +*/ + + +static void block (LexState *ls) { + /* block -> statlist */ + FuncState *fs = ls->fs; + BlockCnt bl; + enterblock(fs, &bl, 0); + statlist(ls); + leaveblock(fs); +} + + +/* +** structure to chain all variables in the left-hand side of an +** assignment +*/ +struct LHS_assign { + struct LHS_assign *prev; + expdesc v; /* variable (global, local, upvalue, or indexed) */ +}; + + +/* +** check whether, in an assignment to an upvalue/local variable, the +** upvalue/local variable is begin used in a previous assignment to a +** table. If so, save original upvalue/local value in a safe place and +** use this safe copy in the previous assignment. +*/ +static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { + FuncState *fs = ls->fs; + int extra = fs->freereg; /* eventual position to save local variable */ + int conflict = 0; + for (; lh; lh = lh->prev) { /* check all previous assignments */ + if (vkisindexed(lh->v.k)) { /* assignment to table field? */ + if (lh->v.k == VINDEXUP) { /* is table an upvalue? */ + if (v->k == VUPVAL && lh->v.u.ind.t == v->u.info) { + conflict = 1; /* table is the upvalue being assigned now */ + lh->v.k = VINDEXSTR; + lh->v.u.ind.t = extra; /* assignment will use safe copy */ + } + } + else { /* table is a register */ + if (v->k == VLOCAL && lh->v.u.ind.t == v->u.var.sidx) { + conflict = 1; /* table is the local being assigned now */ + lh->v.u.ind.t = extra; /* assignment will use safe copy */ + } + /* is index the local being assigned? */ + if (lh->v.k == VINDEXED && v->k == VLOCAL && + lh->v.u.ind.idx == v->u.var.sidx) { + conflict = 1; + lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */ + } + } + } + } + if (conflict) { + /* copy upvalue/local value to a temporary (in position 'extra') */ + if (v->k == VLOCAL) + luaK_codeABC(fs, OP_MOVE, extra, v->u.var.sidx, 0); + else + luaK_codeABC(fs, OP_GETUPVAL, extra, v->u.info, 0); + luaK_reserveregs(fs, 1); + } +} + +/* +** Parse and compile a multiple assignment. The first "variable" +** (a 'suffixedexp') was already read by the caller. +** +** assignment -> suffixedexp restassign +** restassign -> ',' suffixedexp restassign | '=' explist +*/ +static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) { + expdesc e; + check_condition(ls, vkisvar(lh->v.k), "syntax error"); + check_readonly(ls, &lh->v); + if (testnext(ls, ',')) { /* restassign -> ',' suffixedexp restassign */ + struct LHS_assign nv; + nv.prev = lh; + suffixedexp(ls, &nv.v); + if (!vkisindexed(nv.v.k)) + check_conflict(ls, lh, &nv.v); + enterlevel(ls); /* control recursion depth */ + restassign(ls, &nv, nvars+1); + leavelevel(ls); + } + else { /* restassign -> '=' explist */ + int nexps; + checknext(ls, '='); + nexps = explist(ls, &e); + if (nexps != nvars) + adjust_assign(ls, nvars, nexps, &e); + else { + luaK_setoneret(ls->fs, &e); /* close last expression */ + luaK_storevar(ls->fs, &lh->v, &e); + return; /* avoid default */ + } + } + init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ + luaK_storevar(ls->fs, &lh->v, &e); +} + + +static int cond (LexState *ls) { + /* cond -> exp */ + expdesc v; + expr(ls, &v); /* read condition */ + if (v.k == VNIL) v.k = VFALSE; /* 'falses' are all equal here */ + luaK_goiftrue(ls->fs, &v); + return v.f; +} + + +static void gotostat (LexState *ls) { + FuncState *fs = ls->fs; + int line = ls->linenumber; + TString *name = str_checkname(ls); /* label's name */ + Labeldesc *lb = findlabel(ls, name); + if (lb == NULL) /* no label? */ + /* forward jump; will be resolved when the label is declared */ + newgotoentry(ls, name, line, luaK_jump(fs)); + else { /* found a label */ + /* backward jump; will be resolved here */ + int lblevel = stacklevel(fs, lb->nactvar); /* label level */ + if (luaY_nvarstack(fs) > lblevel) /* leaving the scope of a variable? */ + luaK_codeABC(fs, OP_CLOSE, lblevel, 0, 0); + /* create jump and link it to the label */ + luaK_patchlist(fs, luaK_jump(fs), lb->pc); + } +} + + +/* +** Break statement. Semantically equivalent to "goto break". +*/ +static void breakstat (LexState *ls) { + int line = ls->linenumber; + luaX_next(ls); /* skip break */ + newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs)); +} + + +/* +** Check whether there is already a label with the given 'name'. +*/ +static void checkrepeated (LexState *ls, TString *name) { + Labeldesc *lb = findlabel(ls, name); + if (unlikely(lb != NULL)) { /* already defined? */ + const char *msg = "label '%s' already defined on line %d"; + msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line); + luaK_semerror(ls, msg); /* error */ + } +} + + +static void labelstat (LexState *ls, TString *name, int line) { + /* label -> '::' NAME '::' */ + checknext(ls, TK_DBCOLON); /* skip double colon */ + while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) + statement(ls); /* skip other no-op statements */ + checkrepeated(ls, name); /* check for repeated labels */ + createlabel(ls, name, line, block_follow(ls, 0)); +} + + +static void whilestat (LexState *ls, int line) { + /* whilestat -> WHILE cond DO block END */ + FuncState *fs = ls->fs; + int whileinit; + int condexit; + BlockCnt bl; + luaX_next(ls); /* skip WHILE */ + whileinit = luaK_getlabel(fs); + condexit = cond(ls); + enterblock(fs, &bl, 1); + checknext(ls, TK_DO); + block(ls); + luaK_jumpto(fs, whileinit); + check_match(ls, TK_END, TK_WHILE, line); + leaveblock(fs); + luaK_patchtohere(fs, condexit); /* false conditions finish the loop */ +} + + +static void repeatstat (LexState *ls, int line) { + /* repeatstat -> REPEAT block UNTIL cond */ + int condexit; + FuncState *fs = ls->fs; + int repeat_init = luaK_getlabel(fs); + BlockCnt bl1, bl2; + enterblock(fs, &bl1, 1); /* loop block */ + enterblock(fs, &bl2, 0); /* scope block */ + luaX_next(ls); /* skip REPEAT */ + statlist(ls); + check_match(ls, TK_UNTIL, TK_REPEAT, line); + condexit = cond(ls); /* read condition (inside scope block) */ + leaveblock(fs); /* finish scope */ + if (bl2.upval) { /* upvalues? */ + int exit = luaK_jump(fs); /* normal exit must jump over fix */ + luaK_patchtohere(fs, condexit); /* repetition must close upvalues */ + luaK_codeABC(fs, OP_CLOSE, stacklevel(fs, bl2.nactvar), 0, 0); + condexit = luaK_jump(fs); /* repeat after closing upvalues */ + luaK_patchtohere(fs, exit); /* normal exit comes to here */ + } + luaK_patchlist(fs, condexit, repeat_init); /* close the loop */ + leaveblock(fs); /* finish loop */ +} + + +/* +** Read an expression and generate code to put its results in next +** stack slot. +** +*/ +static void exp1 (LexState *ls) { + expdesc e; + expr(ls, &e); + luaK_exp2nextreg(ls->fs, &e); + lua_assert(e.k == VNONRELOC); +} + + +/* +** Fix for instruction at position 'pc' to jump to 'dest'. +** (Jump addresses are relative in Lua). 'back' true means +** a back jump. +*/ +static void fixforjump (FuncState *fs, int pc, int dest, int back) { + Instruction *jmp = &fs->f->code[pc]; + int offset = dest - (pc + 1); + if (back) + offset = -offset; + if (unlikely(offset > MAXARG_Bx)) + luaX_syntaxerror(fs->ls, "control structure too long"); + SETARG_Bx(*jmp, offset); +} + + +/* +** Generate code for a 'for' loop. +*/ +static void forbody (LexState *ls, int base, int line, int nvars, int isgen) { + /* forbody -> DO block */ + static const OpCode forprep[2] = {OP_FORPREP, OP_TFORPREP}; + static const OpCode forloop[2] = {OP_FORLOOP, OP_TFORLOOP}; + BlockCnt bl; + FuncState *fs = ls->fs; + int prep, endfor; + checknext(ls, TK_DO); + prep = luaK_codeABx(fs, forprep[isgen], base, 0); + enterblock(fs, &bl, 0); /* scope for declared variables */ + adjustlocalvars(ls, nvars); + luaK_reserveregs(fs, nvars); + block(ls); + leaveblock(fs); /* end of scope for declared variables */ + fixforjump(fs, prep, luaK_getlabel(fs), 0); + if (isgen) { /* generic for? */ + luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars); + luaK_fixline(fs, line); + } + endfor = luaK_codeABx(fs, forloop[isgen], base, 0); + fixforjump(fs, endfor, prep + 1, 1); + luaK_fixline(fs, line); +} + + +static void fornum (LexState *ls, TString *varname, int line) { + /* fornum -> NAME = exp,exp[,exp] forbody */ + FuncState *fs = ls->fs; + int base = fs->freereg; + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvar(ls, varname); + checknext(ls, '='); + exp1(ls); /* initial value */ + checknext(ls, ','); + exp1(ls); /* limit */ + if (testnext(ls, ',')) + exp1(ls); /* optional step */ + else { /* default step = 1 */ + luaK_int(fs, fs->freereg, 1); + luaK_reserveregs(fs, 1); + } + adjustlocalvars(ls, 3); /* control variables */ + forbody(ls, base, line, 1, 0); +} + + +static void forlist (LexState *ls, TString *indexname) { + /* forlist -> NAME {,NAME} IN explist forbody */ + FuncState *fs = ls->fs; + expdesc e; + int nvars = 5; /* gen, state, control, toclose, 'indexname' */ + int line; + int base = fs->freereg; + /* create control variables */ + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + new_localvarliteral(ls, "(for state)"); + /* create declared variables */ + new_localvar(ls, indexname); + while (testnext(ls, ',')) { + new_localvar(ls, str_checkname(ls)); + nvars++; + } + checknext(ls, TK_IN); + line = ls->linenumber; + adjust_assign(ls, 4, explist(ls, &e), &e); + adjustlocalvars(ls, 4); /* control variables */ + markupval(fs, fs->nactvar); /* last control var. must be closed */ + luaK_checkstack(fs, 3); /* extra space to call generator */ + forbody(ls, base, line, nvars - 4, 1); +} + + +static void forstat (LexState *ls, int line) { + /* forstat -> FOR (fornum | forlist) END */ + FuncState *fs = ls->fs; + TString *varname; + BlockCnt bl; + enterblock(fs, &bl, 1); /* scope for loop and control variables */ + luaX_next(ls); /* skip 'for' */ + varname = str_checkname(ls); /* first variable name */ + switch (ls->t.token) { + case '=': fornum(ls, varname, line); break; + case ',': case TK_IN: forlist(ls, varname); break; + default: luaX_syntaxerror(ls, "'=' or 'in' expected"); + } + check_match(ls, TK_END, TK_FOR, line); + leaveblock(fs); /* loop scope ('break' jumps to this point) */ +} + + +/* +** Check whether next instruction is a single jump (a 'break', a 'goto' +** to a forward label, or a 'goto' to a backward label with no variable +** to close). If so, set the name of the 'label' it is jumping to +** ("break" for a 'break') or to where it is jumping to ('target') and +** return true. If not a single jump, leave input unchanged, to be +** handled as a regular statement. +*/ +static int issinglejump (LexState *ls, TString **label, int *target) { + if (testnext(ls, TK_BREAK)) { /* a break? */ + *label = luaS_newliteral(ls->L, "break"); + return 1; + } + else if (ls->t.token != TK_GOTO || luaX_lookahead(ls) != TK_NAME) + return 0; /* not a valid goto */ + else { + TString *lname = ls->lookahead.seminfo.ts; /* label's id */ + Labeldesc *lb = findlabel(ls, lname); + if (lb) { /* a backward jump? */ + /* does it need to close variables? */ + if (luaY_nvarstack(ls->fs) > stacklevel(ls->fs, lb->nactvar)) + return 0; /* not a single jump; cannot optimize */ + *target = lb->pc; + } + else /* jump forward */ + *label = lname; + luaX_next(ls); /* skip goto */ + luaX_next(ls); /* skip name */ + return 1; + } +} + + +static void test_then_block (LexState *ls, int *escapelist) { + /* test_then_block -> [IF | ELSEIF] cond THEN block */ + BlockCnt bl; + int line; + FuncState *fs = ls->fs; + TString *jlb = NULL; + int target = NO_JUMP; + expdesc v; + int jf; /* instruction to skip 'then' code (if condition is false) */ + luaX_next(ls); /* skip IF or ELSEIF */ + expr(ls, &v); /* read condition */ + checknext(ls, TK_THEN); + line = ls->linenumber; + if (issinglejump(ls, &jlb, &target)) { /* 'if x then goto' ? */ + luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ + enterblock(fs, &bl, 0); /* must enter block before 'goto' */ + if (jlb != NULL) /* forward jump? */ + newgotoentry(ls, jlb, line, v.t); /* will be resolved later */ + else /* backward jump */ + luaK_patchlist(fs, v.t, target); /* jump directly to 'target' */ + while (testnext(ls, ';')) {} /* skip semicolons */ + if (block_follow(ls, 0)) { /* jump is the entire block? */ + leaveblock(fs); + return; /* and that is it */ + } + else /* must skip over 'then' part if condition is false */ + jf = luaK_jump(fs); + } + else { /* regular case (not a jump) */ + luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ + enterblock(fs, &bl, 0); + jf = v.f; + } + statlist(ls); /* 'then' part */ + leaveblock(fs); + if (ls->t.token == TK_ELSE || + ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ + luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */ + luaK_patchtohere(fs, jf); +} + + +static void ifstat (LexState *ls, int line) { + /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ + FuncState *fs = ls->fs; + int escapelist = NO_JUMP; /* exit list for finished parts */ + test_then_block(ls, &escapelist); /* IF cond THEN block */ + while (ls->t.token == TK_ELSEIF) + test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ + if (testnext(ls, TK_ELSE)) + block(ls); /* 'else' part */ + check_match(ls, TK_END, TK_IF, line); + luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */ +} + + +static void localfunc (LexState *ls) { + expdesc b; + FuncState *fs = ls->fs; + int fvar = fs->nactvar; /* function's variable index */ + new_localvar(ls, str_checkname(ls)); /* new local variable */ + adjustlocalvars(ls, 1); /* enter its scope */ + body(ls, &b, 0, ls->linenumber); /* function created in next register */ + /* debug information will only see the variable after this point! */ + localdebuginfo(fs, fvar)->startpc = fs->pc; +} + + +static int getlocalattribute (LexState *ls) { + /* ATTRIB -> ['<' Name '>'] */ + if (testnext(ls, '<')) { + const char *attr = getstr(str_checkname(ls)); + checknext(ls, '>'); + if (strcmp(attr, "const") == 0) + return RDKCONST; /* read-only variable */ + else if (strcmp(attr, "close") == 0) + return RDKTOCLOSE; /* to-be-closed variable */ + else + luaK_semerror(ls, + luaO_pushfstring(ls->L, "unknown attribute '%s'", attr)); + } + return VDKREG; /* regular variable */ +} + + +static void checktoclose (LexState *ls, int level) { + if (level != -1) { /* is there a to-be-closed variable? */ + FuncState *fs = ls->fs; + markupval(fs, level + 1); + fs->bl->insidetbc = 1; /* in the scope of a to-be-closed variable */ + luaK_codeABC(fs, OP_TBC, stacklevel(fs, level), 0, 0); + } +} + + +static void localstat (LexState *ls) { + /* stat -> LOCAL ATTRIB NAME {',' ATTRIB NAME} ['=' explist] */ + FuncState *fs = ls->fs; + int toclose = -1; /* index of to-be-closed variable (if any) */ + Vardesc *var; /* last variable */ + int vidx, kind; /* index and kind of last variable */ + int nvars = 0; + int nexps; + expdesc e; + do { + vidx = new_localvar(ls, str_checkname(ls)); + kind = getlocalattribute(ls); + getlocalvardesc(fs, vidx)->vd.kind = kind; + if (kind == RDKTOCLOSE) { /* to-be-closed? */ + if (toclose != -1) /* one already present? */ + luaK_semerror(ls, "multiple to-be-closed variables in local list"); + toclose = fs->nactvar + nvars; + } + nvars++; + } while (testnext(ls, ',')); + if (testnext(ls, '=')) + nexps = explist(ls, &e); + else { + e.k = VVOID; + nexps = 0; + } + var = getlocalvardesc(fs, vidx); /* get last variable */ + if (nvars == nexps && /* no adjustments? */ + var->vd.kind == RDKCONST && /* last variable is const? */ + luaK_exp2const(fs, &e, &var->k)) { /* compile-time constant? */ + var->vd.kind = RDKCTC; /* variable is a compile-time constant */ + adjustlocalvars(ls, nvars - 1); /* exclude last variable */ + fs->nactvar++; /* but count it */ + } + else { + adjust_assign(ls, nvars, nexps, &e); + adjustlocalvars(ls, nvars); + } + checktoclose(ls, toclose); +} + + +static int funcname (LexState *ls, expdesc *v) { + /* funcname -> NAME {fieldsel} [':' NAME] */ + int ismethod = 0; + singlevar(ls, v); + while (ls->t.token == '.') + fieldsel(ls, v); + if (ls->t.token == ':') { + ismethod = 1; + fieldsel(ls, v); + } + return ismethod; +} + + +static void funcstat (LexState *ls, int line) { + /* funcstat -> FUNCTION funcname body */ + int ismethod; + expdesc v, b; + luaX_next(ls); /* skip FUNCTION */ + ismethod = funcname(ls, &v); + body(ls, &b, ismethod, line); + luaK_storevar(ls->fs, &v, &b); + luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ +} + + +static void exprstat (LexState *ls) { + /* stat -> func | assignment */ + FuncState *fs = ls->fs; + struct LHS_assign v; + suffixedexp(ls, &v.v); + if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ + v.prev = NULL; + restassign(ls, &v, 1); + } + else { /* stat -> func */ + Instruction *inst; + check_condition(ls, v.v.k == VCALL, "syntax error"); + inst = &getinstruction(fs, &v.v); + SETARG_C(*inst, 1); /* call statement uses no results */ + } +} + + +static void retstat (LexState *ls) { + /* stat -> RETURN [explist] [';'] */ + FuncState *fs = ls->fs; + expdesc e; + int nret; /* number of values being returned */ + int first = luaY_nvarstack(fs); /* first slot to be returned */ + if (block_follow(ls, 1) || ls->t.token == ';') + nret = 0; /* return no values */ + else { + nret = explist(ls, &e); /* optional return values */ + if (hasmultret(e.k)) { + luaK_setmultret(fs, &e); + if (e.k == VCALL && nret == 1 && !fs->bl->insidetbc) { /* tail call? */ + SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL); + lua_assert(GETARG_A(getinstruction(fs,&e)) == luaY_nvarstack(fs)); + } + nret = LUA_MULTRET; /* return all values */ + } + else { + if (nret == 1) /* only one single value? */ + first = luaK_exp2anyreg(fs, &e); /* can use original slot */ + else { /* values must go to the top of the stack */ + luaK_exp2nextreg(fs, &e); + lua_assert(nret == fs->freereg - first); + } + } + } + luaK_ret(fs, first, nret); + testnext(ls, ';'); /* skip optional semicolon */ +} + + +static void statement (LexState *ls) { + int line = ls->linenumber; /* may be needed for error messages */ + enterlevel(ls); + switch (ls->t.token) { + case ';': { /* stat -> ';' (empty statement) */ + luaX_next(ls); /* skip ';' */ + break; + } + case TK_IF: { /* stat -> ifstat */ + ifstat(ls, line); + break; + } + case TK_WHILE: { /* stat -> whilestat */ + whilestat(ls, line); + break; + } + case TK_DO: { /* stat -> DO block END */ + luaX_next(ls); /* skip DO */ + block(ls); + check_match(ls, TK_END, TK_DO, line); + break; + } + case TK_FOR: { /* stat -> forstat */ + forstat(ls, line); + break; + } + case TK_REPEAT: { /* stat -> repeatstat */ + repeatstat(ls, line); + break; + } + case TK_FUNCTION: { /* stat -> funcstat */ + funcstat(ls, line); + break; + } + case TK_LOCAL: { /* stat -> localstat */ + luaX_next(ls); /* skip LOCAL */ + if (testnext(ls, TK_FUNCTION)) /* local function? */ + localfunc(ls); + else + localstat(ls); + break; + } + case TK_DBCOLON: { /* stat -> label */ + luaX_next(ls); /* skip double colon */ + labelstat(ls, str_checkname(ls), line); + break; + } + case TK_RETURN: { /* stat -> retstat */ + luaX_next(ls); /* skip RETURN */ + retstat(ls); + break; + } + case TK_BREAK: { /* stat -> breakstat */ + breakstat(ls); + break; + } + case TK_GOTO: { /* stat -> 'goto' NAME */ + luaX_next(ls); /* skip 'goto' */ + gotostat(ls); + break; + } + default: { /* stat -> func | assignment */ + exprstat(ls); + break; + } + } + lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && + ls->fs->freereg >= luaY_nvarstack(ls->fs)); + ls->fs->freereg = luaY_nvarstack(ls->fs); /* free registers */ + leavelevel(ls); +} + +/* }====================================================================== */ + + +/* +** compiles the main function, which is a regular vararg function with an +** upvalue named LUA_ENV +*/ +static void mainfunc (LexState *ls, FuncState *fs) { + BlockCnt bl; + Upvaldesc *env; + open_func(ls, fs, &bl); + setvararg(fs, 0); /* main function is always declared vararg */ + env = allocupvalue(fs); /* ...set environment upvalue */ + env->instack = 1; + env->idx = 0; + env->kind = VDKREG; + env->name = ls->envn; + luaC_objbarrier(ls->L, fs->f, env->name); + luaX_next(ls); /* read first token */ + statlist(ls); /* parse main body */ + check(ls, TK_EOS); + close_func(ls); +} + + +LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar) { + LexState lexstate; + FuncState funcstate; + LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */ + setclLvalue2s(L, L->top, cl); /* anchor it (to avoid being collected) */ + luaD_inctop(L); + lexstate.h = luaH_new(L); /* create table for scanner */ + sethvalue2s(L, L->top, lexstate.h); /* anchor it */ + luaD_inctop(L); + funcstate.f = cl->p = luaF_newproto(L); + luaC_objbarrier(L, cl, cl->p); + funcstate.f->source = luaS_new(L, name); /* create and anchor TString */ + luaC_objbarrier(L, funcstate.f, funcstate.f->source); + lexstate.buff = buff; + lexstate.dyd = dyd; + dyd->actvar.n = dyd->gt.n = dyd->label.n = 0; + luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar); + mainfunc(&lexstate, &funcstate); + lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs); + /* all scopes should be correctly finished */ + lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0); + L->top--; /* remove scanner's table */ + return cl; /* closure is on the stack, too */ +} + diff --git a/lua-5.4.0/src/lparser.h b/lua-5.4.0/src/lparser.h new file mode 100644 index 0000000..618cb01 --- /dev/null +++ b/lua-5.4.0/src/lparser.h @@ -0,0 +1,170 @@ +/* +** $Id: lparser.h $ +** Lua Parser +** See Copyright Notice in lua.h +*/ + +#ifndef lparser_h +#define lparser_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* +** Expression and variable descriptor. +** Code generation for variables and expressions can be delayed to allow +** optimizations; An 'expdesc' structure describes a potentially-delayed +** variable/expression. It has a description of its "main" value plus a +** list of conditional jumps that can also produce its value (generated +** by short-circuit operators 'and'/'or'). +*/ + +/* kinds of variables/expressions */ +typedef enum { + VVOID, /* when 'expdesc' describes the last expression a list, + this kind means an empty list (so, no expression) */ + VNIL, /* constant nil */ + VTRUE, /* constant true */ + VFALSE, /* constant false */ + VK, /* constant in 'k'; info = index of constant in 'k' */ + VKFLT, /* floating constant; nval = numerical float value */ + VKINT, /* integer constant; ival = numerical integer value */ + VKSTR, /* string constant; strval = TString address; + (string is fixed by the lexer) */ + VNONRELOC, /* expression has its value in a fixed register; + info = result register */ + VLOCAL, /* local variable; var.sidx = stack index (local register); + var.vidx = relative index in 'actvar.arr' */ + VUPVAL, /* upvalue variable; info = index of upvalue in 'upvalues' */ + VCONST, /* compile-time constant; info = absolute index in 'actvar.arr' */ + VINDEXED, /* indexed variable; + ind.t = table register; + ind.idx = key's R index */ + VINDEXUP, /* indexed upvalue; + ind.t = table upvalue; + ind.idx = key's K index */ + VINDEXI, /* indexed variable with constant integer; + ind.t = table register; + ind.idx = key's value */ + VINDEXSTR, /* indexed variable with literal string; + ind.t = table register; + ind.idx = key's K index */ + VJMP, /* expression is a test/comparison; + info = pc of corresponding jump instruction */ + VRELOC, /* expression can put result in any register; + info = instruction pc */ + VCALL, /* expression is a function call; info = instruction pc */ + VVARARG /* vararg expression; info = instruction pc */ +} expkind; + + +#define vkisvar(k) (VLOCAL <= (k) && (k) <= VINDEXSTR) +#define vkisindexed(k) (VINDEXED <= (k) && (k) <= VINDEXSTR) + + +typedef struct expdesc { + expkind k; + union { + lua_Integer ival; /* for VKINT */ + lua_Number nval; /* for VKFLT */ + TString *strval; /* for VKSTR */ + int info; /* for generic use */ + struct { /* for indexed variables */ + short idx; /* index (R or "long" K) */ + lu_byte t; /* table (register or upvalue) */ + } ind; + struct { /* for local variables */ + lu_byte sidx; /* index in the stack */ + unsigned short vidx; /* compiler index (in 'actvar.arr') */ + } var; + } u; + int t; /* patch list of 'exit when true' */ + int f; /* patch list of 'exit when false' */ +} expdesc; + + +/* kinds of variables */ +#define VDKREG 0 /* regular */ +#define RDKCONST 1 /* constant */ +#define RDKTOCLOSE 2 /* to-be-closed */ +#define RDKCTC 3 /* compile-time constant */ + +/* description of an active local variable */ +typedef union Vardesc { + struct { + TValuefields; /* constant value (if it is a compile-time constant) */ + lu_byte kind; + lu_byte sidx; /* index of the variable in the stack */ + short pidx; /* index of the variable in the Proto's 'locvars' array */ + TString *name; /* variable name */ + } vd; + TValue k; /* constant value (if any) */ +} Vardesc; + + + +/* description of pending goto statements and label statements */ +typedef struct Labeldesc { + TString *name; /* label identifier */ + int pc; /* position in code */ + int line; /* line where it appeared */ + lu_byte nactvar; /* number of active variables in that position */ + lu_byte close; /* goto that escapes upvalues */ +} Labeldesc; + + +/* list of labels or gotos */ +typedef struct Labellist { + Labeldesc *arr; /* array */ + int n; /* number of entries in use */ + int size; /* array size */ +} Labellist; + + +/* dynamic structures used by the parser */ +typedef struct Dyndata { + struct { /* list of all active local variables */ + Vardesc *arr; + int n; + int size; + } actvar; + Labellist gt; /* list of pending gotos */ + Labellist label; /* list of active labels */ +} Dyndata; + + +/* control of blocks */ +struct BlockCnt; /* defined in lparser.c */ + + +/* state needed to generate code for a given function */ +typedef struct FuncState { + Proto *f; /* current function header */ + struct FuncState *prev; /* enclosing function */ + struct LexState *ls; /* lexical state */ + struct BlockCnt *bl; /* chain of current blocks */ + int pc; /* next position to code (equivalent to 'ncode') */ + int lasttarget; /* 'label' of last 'jump label' */ + int previousline; /* last line that was saved in 'lineinfo' */ + int nk; /* number of elements in 'k' */ + int np; /* number of elements in 'p' */ + int nabslineinfo; /* number of elements in 'abslineinfo' */ + int firstlocal; /* index of first local var (in Dyndata array) */ + int firstlabel; /* index of first label (in 'dyd->label->arr') */ + short ndebugvars; /* number of elements in 'f->locvars' */ + lu_byte nactvar; /* number of active local variables */ + lu_byte nups; /* number of upvalues */ + lu_byte freereg; /* first free register */ + lu_byte iwthabs; /* instructions issued since last absolute line info */ + lu_byte needclose; /* function needs to close upvalues when returning */ +} FuncState; + + +LUAI_FUNC int luaY_nvarstack (FuncState *fs); +LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, + Dyndata *dyd, const char *name, int firstchar); + + +#endif diff --git a/lua-5.4.0/src/lprefix.h b/lua-5.4.0/src/lprefix.h new file mode 100644 index 0000000..484f2ad --- /dev/null +++ b/lua-5.4.0/src/lprefix.h @@ -0,0 +1,45 @@ +/* +** $Id: lprefix.h $ +** Definitions for Lua code that must come before any other header file +** See Copyright Notice in lua.h +*/ + +#ifndef lprefix_h +#define lprefix_h + + +/* +** Allows POSIX/XSI stuff +*/ +#if !defined(LUA_USE_C89) /* { */ + +#if !defined(_XOPEN_SOURCE) +#define _XOPEN_SOURCE 600 +#elif _XOPEN_SOURCE == 0 +#undef _XOPEN_SOURCE /* use -D_XOPEN_SOURCE=0 to undefine it */ +#endif + +/* +** Allows manipulation of large files in gcc and some other compilers +*/ +#if !defined(LUA_32BITS) && !defined(_FILE_OFFSET_BITS) +#define _LARGEFILE_SOURCE 1 +#define _FILE_OFFSET_BITS 64 +#endif + +#endif /* } */ + + +/* +** Windows stuff +*/ +#if defined(_WIN32) /* { */ + +#if !defined(_CRT_SECURE_NO_WARNINGS) +#define _CRT_SECURE_NO_WARNINGS /* avoid warnings about ISO C functions */ +#endif + +#endif /* } */ + +#endif + diff --git a/lua-5.4.0/src/lstate.c b/lua-5.4.0/src/lstate.c new file mode 100644 index 0000000..4434211 --- /dev/null +++ b/lua-5.4.0/src/lstate.c @@ -0,0 +1,467 @@ +/* +** $Id: lstate.c $ +** Global State +** See Copyright Notice in lua.h +*/ + +#define lstate_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "lapi.h" +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "llex.h" +#include "lmem.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + + +/* +** thread state + extra space +*/ +typedef struct LX { + lu_byte extra_[LUA_EXTRASPACE]; + lua_State l; +} LX; + + +/* +** Main thread combines a thread state and the global state +*/ +typedef struct LG { + LX l; + global_State g; +} LG; + + + +#define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l))) + + +/* +** A macro to create a "random" seed when a state is created; +** the seed is used to randomize string hashes. +*/ +#if !defined(luai_makeseed) + +#include + +/* +** Compute an initial seed with some level of randomness. +** Rely on Address Space Layout Randomization (if present) and +** current time. +*/ +#define addbuff(b,p,e) \ + { size_t t = cast_sizet(e); \ + memcpy(b + p, &t, sizeof(t)); p += sizeof(t); } + +static unsigned int luai_makeseed (lua_State *L) { + char buff[3 * sizeof(size_t)]; + unsigned int h = cast_uint(time(NULL)); + int p = 0; + addbuff(buff, p, L); /* heap variable */ + addbuff(buff, p, &h); /* local variable */ + addbuff(buff, p, &lua_newstate); /* public function */ + lua_assert(p == sizeof(buff)); + return luaS_hash(buff, p, h, 1); +} + +#endif + + +/* +** set GCdebt to a new value keeping the value (totalbytes + GCdebt) +** invariant (and avoiding underflows in 'totalbytes') +*/ +void luaE_setdebt (global_State *g, l_mem debt) { + l_mem tb = gettotalbytes(g); + lua_assert(tb > 0); + if (debt < tb - MAX_LMEM) + debt = tb - MAX_LMEM; /* will make 'totalbytes == MAX_LMEM' */ + g->totalbytes = tb - debt; + g->GCdebt = debt; +} + + +LUA_API int lua_setcstacklimit (lua_State *L, unsigned int limit) { + global_State *g = G(L); + int ccalls; + luaE_freeCI(L); /* release unused CIs */ + ccalls = getCcalls(L); + if (limit >= 40000) + return 0; /* out of bounds */ + limit += CSTACKERR; + if (L != g-> mainthread) + return 0; /* only main thread can change the C stack */ + else if (ccalls <= CSTACKERR) + return 0; /* handling overflow */ + else { + int diff = limit - g->Cstacklimit; + if (ccalls + diff <= CSTACKERR) + return 0; /* new limit would cause an overflow */ + g->Cstacklimit = limit; /* set new limit */ + L->nCcalls += diff; /* correct 'nCcalls' */ + return limit - diff - CSTACKERR; /* success; return previous limit */ + } +} + + +/* +** Decrement count of "C calls" and check for overflows. In case of +** a stack overflow, check appropriate error ("regular" overflow or +** overflow while handling stack overflow). If 'nCcalls' is smaller +** than CSTACKERR but larger than CSTACKMARK, it means it has just +** entered the "overflow zone", so the function raises an overflow +** error. If 'nCcalls' is smaller than CSTACKMARK (which means it is +** already handling an overflow) but larger than CSTACKERRMARK, does +** not report an error (to allow message handling to work). Otherwise, +** report a stack overflow while handling a stack overflow (probably +** caused by a repeating error in the message handling function). +*/ + +void luaE_enterCcall (lua_State *L) { + int ncalls = getCcalls(L); + L->nCcalls--; + if (ncalls <= CSTACKERR) { /* possible overflow? */ + luaE_freeCI(L); /* release unused CIs */ + ncalls = getCcalls(L); /* update call count */ + if (ncalls <= CSTACKERR) { /* still overflow? */ + if (ncalls <= CSTACKERRMARK) /* below error-handling zone? */ + luaD_throw(L, LUA_ERRERR); /* error while handling stack error */ + else if (ncalls >= CSTACKMARK) { + /* not in error-handling zone; raise the error now */ + L->nCcalls = (CSTACKMARK - 1); /* enter error-handling zone */ + luaG_runerror(L, "C stack overflow"); + } + /* else stack is in the error-handling zone; + allow message handler to work */ + } + } +} + + +CallInfo *luaE_extendCI (lua_State *L) { + CallInfo *ci; + lua_assert(L->ci->next == NULL); + luaE_enterCcall(L); + ci = luaM_new(L, CallInfo); + lua_assert(L->ci->next == NULL); + L->ci->next = ci; + ci->previous = L->ci; + ci->next = NULL; + ci->u.l.trap = 0; + L->nci++; + return ci; +} + + +/* +** free all CallInfo structures not in use by a thread +*/ +void luaE_freeCI (lua_State *L) { + CallInfo *ci = L->ci; + CallInfo *next = ci->next; + ci->next = NULL; + L->nCcalls += L->nci; /* add removed elements back to 'nCcalls' */ + while ((ci = next) != NULL) { + next = ci->next; + luaM_free(L, ci); + L->nci--; + } + L->nCcalls -= L->nci; /* adjust result */ +} + + +/* +** free half of the CallInfo structures not in use by a thread, +** keeping the first one. +*/ +void luaE_shrinkCI (lua_State *L) { + CallInfo *ci = L->ci->next; /* first free CallInfo */ + CallInfo *next; + if (ci == NULL) + return; /* no extra elements */ + L->nCcalls += L->nci; /* add removed elements back to 'nCcalls' */ + while ((next = ci->next) != NULL) { /* two extra elements? */ + CallInfo *next2 = next->next; /* next's next */ + ci->next = next2; /* remove next from the list */ + L->nci--; + luaM_free(L, next); /* free next */ + if (next2 == NULL) + break; /* no more elements */ + else { + next2->previous = ci; + ci = next2; /* continue */ + } + } + L->nCcalls -= L->nci; /* adjust result */ +} + + +static void stack_init (lua_State *L1, lua_State *L) { + int i; CallInfo *ci; + /* initialize stack array */ + L1->stack = luaM_newvector(L, BASIC_STACK_SIZE, StackValue); + L1->stacksize = BASIC_STACK_SIZE; + for (i = 0; i < BASIC_STACK_SIZE; i++) + setnilvalue(s2v(L1->stack + i)); /* erase new stack */ + L1->top = L1->stack; + L1->stack_last = L1->stack + L1->stacksize - EXTRA_STACK; + /* initialize first ci */ + ci = &L1->base_ci; + ci->next = ci->previous = NULL; + ci->callstatus = CIST_C; + ci->func = L1->top; + ci->u.c.k = NULL; + ci->nresults = 0; + setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */ + L1->top++; + ci->top = L1->top + LUA_MINSTACK; + L1->ci = ci; +} + + +static void freestack (lua_State *L) { + if (L->stack == NULL) + return; /* stack not completely built yet */ + L->ci = &L->base_ci; /* free the entire 'ci' list */ + luaE_freeCI(L); + lua_assert(L->nci == 0); + luaM_freearray(L, L->stack, L->stacksize); /* free stack array */ +} + + +/* +** Create registry table and its predefined values +*/ +static void init_registry (lua_State *L, global_State *g) { + TValue temp; + /* create registry */ + Table *registry = luaH_new(L); + sethvalue(L, &g->l_registry, registry); + luaH_resize(L, registry, LUA_RIDX_LAST, 0); + /* registry[LUA_RIDX_MAINTHREAD] = L */ + setthvalue(L, &temp, L); /* temp = L */ + luaH_setint(L, registry, LUA_RIDX_MAINTHREAD, &temp); + /* registry[LUA_RIDX_GLOBALS] = table of globals */ + sethvalue(L, &temp, luaH_new(L)); /* temp = new table (global table) */ + luaH_setint(L, registry, LUA_RIDX_GLOBALS, &temp); +} + + +/* +** open parts of the state that may cause memory-allocation errors. +** ('g->nilvalue' being a nil value flags that the state was completely +** build.) +*/ +static void f_luaopen (lua_State *L, void *ud) { + global_State *g = G(L); + UNUSED(ud); + stack_init(L, L); /* init stack */ + init_registry(L, g); + luaS_init(L); + luaT_init(L); + luaX_init(L); + g->gcrunning = 1; /* allow gc */ + setnilvalue(&g->nilvalue); + luai_userstateopen(L); +} + + +/* +** preinitialize a thread with consistent values without allocating +** any memory (to avoid errors) +*/ +static void preinit_thread (lua_State *L, global_State *g) { + G(L) = g; + L->stack = NULL; + L->ci = NULL; + L->nci = 0; + L->stacksize = 0; + L->twups = L; /* thread has no upvalues */ + L->errorJmp = NULL; + L->hook = NULL; + L->hookmask = 0; + L->basehookcount = 0; + L->allowhook = 1; + resethookcount(L); + L->openupval = NULL; + L->status = LUA_OK; + L->errfunc = 0; +} + + +static void close_state (lua_State *L) { + global_State *g = G(L); + luaF_close(L, L->stack, CLOSEPROTECT); /* close all upvalues */ + luaC_freeallobjects(L); /* collect all objects */ + if (ttisnil(&g->nilvalue)) /* closing a fully built state? */ + luai_userstateclose(L); + luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size); + freestack(L); + lua_assert(gettotalbytes(g) == sizeof(LG)); + (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); /* free main block */ +} + + +LUA_API lua_State *lua_newthread (lua_State *L) { + global_State *g = G(L); + lua_State *L1; + lua_lock(L); + luaC_checkGC(L); + /* create new thread */ + L1 = &cast(LX *, luaM_newobject(L, LUA_TTHREAD, sizeof(LX)))->l; + L1->marked = luaC_white(g); + L1->tt = LUA_VTHREAD; + /* link it on list 'allgc' */ + L1->next = g->allgc; + g->allgc = obj2gco(L1); + /* anchor it on L stack */ + setthvalue2s(L, L->top, L1); + api_incr_top(L); + preinit_thread(L1, g); + L1->nCcalls = getCcalls(L); + L1->hookmask = L->hookmask; + L1->basehookcount = L->basehookcount; + L1->hook = L->hook; + resethookcount(L1); + /* initialize L1 extra space */ + memcpy(lua_getextraspace(L1), lua_getextraspace(g->mainthread), + LUA_EXTRASPACE); + luai_userstatethread(L, L1); + stack_init(L1, L); /* init stack */ + lua_unlock(L); + return L1; +} + + +void luaE_freethread (lua_State *L, lua_State *L1) { + LX *l = fromstate(L1); + luaF_close(L1, L1->stack, NOCLOSINGMETH); /* close all upvalues */ + lua_assert(L1->openupval == NULL); + luai_userstatefree(L, L1); + freestack(L1); + luaM_free(L, l); +} + + +int lua_resetthread (lua_State *L) { + CallInfo *ci; + int status; + lua_lock(L); + L->ci = ci = &L->base_ci; /* unwind CallInfo list */ + setnilvalue(s2v(L->stack)); /* 'function' entry for basic 'ci' */ + ci->func = L->stack; + ci->callstatus = CIST_C; + status = luaF_close(L, L->stack, CLOSEPROTECT); + if (status != CLOSEPROTECT) /* real errors? */ + luaD_seterrorobj(L, status, L->stack + 1); + else { + status = LUA_OK; + L->top = L->stack + 1; + } + ci->top = L->top + LUA_MINSTACK; + L->status = status; + lua_unlock(L); + return status; +} + + +LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { + int i; + lua_State *L; + global_State *g; + LG *l = cast(LG *, (*f)(ud, NULL, LUA_TTHREAD, sizeof(LG))); + if (l == NULL) return NULL; + L = &l->l.l; + g = &l->g; + L->tt = LUA_VTHREAD; + g->currentwhite = bitmask(WHITE0BIT); + L->marked = luaC_white(g); + preinit_thread(L, g); + g->allgc = obj2gco(L); /* by now, only object is the main thread */ + L->next = NULL; + g->Cstacklimit = L->nCcalls = LUAI_MAXCSTACK + CSTACKERR; + g->frealloc = f; + g->ud = ud; + g->warnf = NULL; + g->ud_warn = NULL; + g->mainthread = L; + g->seed = luai_makeseed(L); + g->gcrunning = 0; /* no GC while building state */ + g->strt.size = g->strt.nuse = 0; + g->strt.hash = NULL; + setnilvalue(&g->l_registry); + g->panic = NULL; + g->gcstate = GCSpause; + g->gckind = KGC_INC; + g->gcemergency = 0; + g->finobj = g->tobefnz = g->fixedgc = NULL; + g->survival = g->old = g->reallyold = NULL; + g->finobjsur = g->finobjold = g->finobjrold = NULL; + g->sweepgc = NULL; + g->gray = g->grayagain = NULL; + g->weak = g->ephemeron = g->allweak = NULL; + g->twups = NULL; + g->totalbytes = sizeof(LG); + g->GCdebt = 0; + g->lastatomic = 0; + setivalue(&g->nilvalue, 0); /* to signal that state is not yet built */ + setgcparam(g->gcpause, LUAI_GCPAUSE); + setgcparam(g->gcstepmul, LUAI_GCMUL); + g->gcstepsize = LUAI_GCSTEPSIZE; + setgcparam(g->genmajormul, LUAI_GENMAJORMUL); + g->genminormul = LUAI_GENMINORMUL; + for (i=0; i < LUA_NUMTAGS; i++) g->mt[i] = NULL; + if (luaD_rawrunprotected(L, f_luaopen, NULL) != LUA_OK) { + /* memory allocation error: free partial state */ + close_state(L); + L = NULL; + } + return L; +} + + +LUA_API void lua_close (lua_State *L) { + L = G(L)->mainthread; /* only the main thread can be closed */ + lua_lock(L); + close_state(L); +} + + +void luaE_warning (lua_State *L, const char *msg, int tocont) { + lua_WarnFunction wf = G(L)->warnf; + if (wf != NULL) + wf(G(L)->ud_warn, msg, tocont); +} + + +/* +** Generate a warning from an error message +*/ +void luaE_warnerror (lua_State *L, const char *where) { + TValue *errobj = s2v(L->top - 1); /* error object */ + const char *msg = (ttisstring(errobj)) + ? svalue(errobj) + : "error object is not a string"; + /* produce warning "error in %s (%s)" (where, msg) */ + luaE_warning(L, "error in ", 1); + luaE_warning(L, where, 1); + luaE_warning(L, " (", 1); + luaE_warning(L, msg, 1); + luaE_warning(L, ")", 0); +} + diff --git a/lua-5.4.0/src/lstate.h b/lua-5.4.0/src/lstate.h new file mode 100644 index 0000000..2e8bd6c --- /dev/null +++ b/lua-5.4.0/src/lstate.h @@ -0,0 +1,364 @@ +/* +** $Id: lstate.h $ +** Global State +** See Copyright Notice in lua.h +*/ + +#ifndef lstate_h +#define lstate_h + +#include "lua.h" + +#include "lobject.h" +#include "ltm.h" +#include "lzio.h" + + +/* +** Some notes about garbage-collected objects: All objects in Lua must +** be kept somehow accessible until being freed, so all objects always +** belong to one (and only one) of these lists, using field 'next' of +** the 'CommonHeader' for the link: +** +** 'allgc': all objects not marked for finalization; +** 'finobj': all objects marked for finalization; +** 'tobefnz': all objects ready to be finalized; +** 'fixedgc': all objects that are not to be collected (currently +** only small strings, such as reserved words). +** +** For the generational collector, some of these lists have marks for +** generations. Each mark points to the first element in the list for +** that particular generation; that generation goes until the next mark. +** +** 'allgc' -> 'survival': new objects; +** 'survival' -> 'old': objects that survived one collection; +** 'old' -> 'reallyold': objects that became old in last collection; +** 'reallyold' -> NULL: objects old for more than one cycle. +** +** 'finobj' -> 'finobjsur': new objects marked for finalization; +** 'finobjsur' -> 'finobjold': survived """"; +** 'finobjold' -> 'finobjrold': just old """"; +** 'finobjrold' -> NULL: really old """". +*/ + +/* +** Moreover, there is another set of lists that control gray objects. +** These lists are linked by fields 'gclist'. (All objects that +** can become gray have such a field. The field is not the same +** in all objects, but it always has this name.) Any gray object +** must belong to one of these lists, and all objects in these lists +** must be gray: +** +** 'gray': regular gray objects, still waiting to be visited. +** 'grayagain': objects that must be revisited at the atomic phase. +** That includes +** - black objects got in a write barrier; +** - all kinds of weak tables during propagation phase; +** - all threads. +** 'weak': tables with weak values to be cleared; +** 'ephemeron': ephemeron tables with white->white entries; +** 'allweak': tables with weak keys and/or weak values to be cleared. +*/ + + + +/* +** About 'nCcalls': each thread in Lua (a lua_State) keeps a count of +** how many "C calls" it still can do in the C stack, to avoid C-stack +** overflow. This count is very rough approximation; it considers only +** recursive functions inside the interpreter, as non-recursive calls +** can be considered using a fixed (although unknown) amount of stack +** space. +** +** The count has two parts: the lower part is the count itself; the +** higher part counts the number of non-yieldable calls in the stack. +** (They are together so that we can change both with one instruction.) +** +** Because calls to external C functions can use an unknown amount +** of space (e.g., functions using an auxiliary buffer), calls +** to these functions add more than one to the count (see CSTACKCF). +** +** The proper count excludes the number of CallInfo structures allocated +** by Lua, as a kind of "potential" calls. So, when Lua calls a function +** (and "consumes" one CallInfo), it needs neither to decrement nor to +** check 'nCcalls', as its use of C stack is already accounted for. +*/ + +/* number of "C stack slots" used by an external C function */ +#define CSTACKCF 10 + + +/* +** The C-stack size is sliced in the following zones: +** - larger than CSTACKERR: normal stack; +** - [CSTACKMARK, CSTACKERR]: buffer zone to signal a stack overflow; +** - [CSTACKCF, CSTACKERRMARK]: error-handling zone; +** - below CSTACKERRMARK: buffer zone to signal overflow during overflow; +** (Because the counter can be decremented CSTACKCF at once, we need +** the so called "buffer zones", with at least that size, to properly +** detect a change from one zone to the next.) +*/ +#define CSTACKERR (8 * CSTACKCF) +#define CSTACKMARK (CSTACKERR - (CSTACKCF + 2)) +#define CSTACKERRMARK (CSTACKCF + 2) + + +/* initial limit for the C-stack of threads */ +#define CSTACKTHREAD (2 * CSTACKERR) + + +/* true if this thread does not have non-yieldable calls in the stack */ +#define yieldable(L) (((L)->nCcalls & 0xffff0000) == 0) + +/* real number of C calls */ +#define getCcalls(L) ((L)->nCcalls & 0xffff) + + +/* Increment the number of non-yieldable calls */ +#define incnny(L) ((L)->nCcalls += 0x10000) + +/* Decrement the number of non-yieldable calls */ +#define decnny(L) ((L)->nCcalls -= 0x10000) + +/* Increment the number of non-yieldable calls and decrement nCcalls */ +#define incXCcalls(L) ((L)->nCcalls += 0x10000 - CSTACKCF) + +/* Decrement the number of non-yieldable calls and increment nCcalls */ +#define decXCcalls(L) ((L)->nCcalls -= 0x10000 - CSTACKCF) + + + + + + +struct lua_longjmp; /* defined in ldo.c */ + + +/* +** Atomic type (relative to signals) to better ensure that 'lua_sethook' +** is thread safe +*/ +#if !defined(l_signalT) +#include +#define l_signalT sig_atomic_t +#endif + + +/* extra stack space to handle TM calls and some other extras */ +#define EXTRA_STACK 5 + + +#define BASIC_STACK_SIZE (2*LUA_MINSTACK) + + +/* kinds of Garbage Collection */ +#define KGC_INC 0 /* incremental gc */ +#define KGC_GEN 1 /* generational gc */ + + +typedef struct stringtable { + TString **hash; + int nuse; /* number of elements */ + int size; +} stringtable; + + +/* +** Information about a call. +*/ +typedef struct CallInfo { + StkId func; /* function index in the stack */ + StkId top; /* top for this function */ + struct CallInfo *previous, *next; /* dynamic call link */ + union { + struct { /* only for Lua functions */ + const Instruction *savedpc; + volatile l_signalT trap; + int nextraargs; /* # of extra arguments in vararg functions */ + } l; + struct { /* only for C functions */ + lua_KFunction k; /* continuation in case of yields */ + ptrdiff_t old_errfunc; + lua_KContext ctx; /* context info. in case of yields */ + } c; + } u; + union { + int funcidx; /* called-function index */ + int nyield; /* number of values yielded */ + struct { /* info about transferred values (for call/return hooks) */ + unsigned short ftransfer; /* offset of first value transferred */ + unsigned short ntransfer; /* number of values transferred */ + } transferinfo; + } u2; + short nresults; /* expected number of results from this function */ + unsigned short callstatus; +} CallInfo; + + +/* +** Bits in CallInfo status +*/ +#define CIST_OAH (1<<0) /* original value of 'allowhook' */ +#define CIST_C (1<<1) /* call is running a C function */ +#define CIST_HOOKED (1<<2) /* call is running a debug hook */ +#define CIST_YPCALL (1<<3) /* call is a yieldable protected call */ +#define CIST_TAIL (1<<4) /* call was tail called */ +#define CIST_HOOKYIELD (1<<5) /* last hook called yielded */ +#define CIST_FIN (1<<6) /* call is running a finalizer */ +#define CIST_TRAN (1<<7) /* 'ci' has transfer information */ +#if defined(LUA_COMPAT_LT_LE) +#define CIST_LEQ (1<<8) /* using __lt for __le */ +#endif + +/* active function is a Lua function */ +#define isLua(ci) (!((ci)->callstatus & CIST_C)) + +/* call is running Lua code (not a hook) */ +#define isLuacode(ci) (!((ci)->callstatus & (CIST_C | CIST_HOOKED))) + +/* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */ +#define setoah(st,v) ((st) = ((st) & ~CIST_OAH) | (v)) +#define getoah(st) ((st) & CIST_OAH) + + +/* +** 'global state', shared by all threads of this state +*/ +typedef struct global_State { + lua_Alloc frealloc; /* function to reallocate memory */ + void *ud; /* auxiliary data to 'frealloc' */ + l_mem totalbytes; /* number of bytes currently allocated - GCdebt */ + l_mem GCdebt; /* bytes allocated not yet compensated by the collector */ + lu_mem GCestimate; /* an estimate of the non-garbage memory in use */ + lu_mem lastatomic; /* see function 'genstep' in file 'lgc.c' */ + stringtable strt; /* hash table for strings */ + TValue l_registry; + TValue nilvalue; /* a nil value */ + unsigned int seed; /* randomized seed for hashes */ + lu_byte currentwhite; + lu_byte gcstate; /* state of garbage collector */ + lu_byte gckind; /* kind of GC running */ + lu_byte genminormul; /* control for minor generational collections */ + lu_byte genmajormul; /* control for major generational collections */ + lu_byte gcrunning; /* true if GC is running */ + lu_byte gcemergency; /* true if this is an emergency collection */ + lu_byte gcpause; /* size of pause between successive GCs */ + lu_byte gcstepmul; /* GC "speed" */ + lu_byte gcstepsize; /* (log2 of) GC granularity */ + GCObject *allgc; /* list of all collectable objects */ + GCObject **sweepgc; /* current position of sweep in list */ + GCObject *finobj; /* list of collectable objects with finalizers */ + GCObject *gray; /* list of gray objects */ + GCObject *grayagain; /* list of objects to be traversed atomically */ + GCObject *weak; /* list of tables with weak values */ + GCObject *ephemeron; /* list of ephemeron tables (weak keys) */ + GCObject *allweak; /* list of all-weak tables */ + GCObject *tobefnz; /* list of userdata to be GC */ + GCObject *fixedgc; /* list of objects not to be collected */ + /* fields for generational collector */ + GCObject *survival; /* start of objects that survived one GC cycle */ + GCObject *old; /* start of old objects */ + GCObject *reallyold; /* old objects with more than one cycle */ + GCObject *finobjsur; /* list of survival objects with finalizers */ + GCObject *finobjold; /* list of old objects with finalizers */ + GCObject *finobjrold; /* list of really old objects with finalizers */ + struct lua_State *twups; /* list of threads with open upvalues */ + lua_CFunction panic; /* to be called in unprotected errors */ + struct lua_State *mainthread; + TString *memerrmsg; /* message for memory-allocation errors */ + TString *tmname[TM_N]; /* array with tag-method names */ + struct Table *mt[LUA_NUMTAGS]; /* metatables for basic types */ + TString *strcache[STRCACHE_N][STRCACHE_M]; /* cache for strings in API */ + lua_WarnFunction warnf; /* warning function */ + void *ud_warn; /* auxiliary data to 'warnf' */ + unsigned int Cstacklimit; /* current limit for the C stack */ +} global_State; + + +/* +** 'per thread' state +*/ +struct lua_State { + CommonHeader; + lu_byte status; + lu_byte allowhook; + unsigned short nci; /* number of items in 'ci' list */ + StkId top; /* first free slot in the stack */ + global_State *l_G; + CallInfo *ci; /* call info for current function */ + const Instruction *oldpc; /* last pc traced */ + StkId stack_last; /* last free slot in the stack */ + StkId stack; /* stack base */ + UpVal *openupval; /* list of open upvalues in this stack */ + GCObject *gclist; + struct lua_State *twups; /* list of threads with open upvalues */ + struct lua_longjmp *errorJmp; /* current error recover point */ + CallInfo base_ci; /* CallInfo for first level (C calling Lua) */ + volatile lua_Hook hook; + ptrdiff_t errfunc; /* current error handling function (stack index) */ + l_uint32 nCcalls; /* number of allowed nested C calls - 'nci' */ + int stacksize; + int basehookcount; + int hookcount; + volatile l_signalT hookmask; +}; + + +#define G(L) (L->l_G) + + +/* +** Union of all collectable objects (only for conversions) +*/ +union GCUnion { + GCObject gc; /* common header */ + struct TString ts; + struct Udata u; + union Closure cl; + struct Table h; + struct Proto p; + struct lua_State th; /* thread */ + struct UpVal upv; +}; + + +#define cast_u(o) cast(union GCUnion *, (o)) + +/* macros to convert a GCObject into a specific value */ +#define gco2ts(o) \ + check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts)) +#define gco2u(o) check_exp((o)->tt == LUA_VUSERDATA, &((cast_u(o))->u)) +#define gco2lcl(o) check_exp((o)->tt == LUA_VLCL, &((cast_u(o))->cl.l)) +#define gco2ccl(o) check_exp((o)->tt == LUA_VCCL, &((cast_u(o))->cl.c)) +#define gco2cl(o) \ + check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl)) +#define gco2t(o) check_exp((o)->tt == LUA_VTABLE, &((cast_u(o))->h)) +#define gco2p(o) check_exp((o)->tt == LUA_VPROTO, &((cast_u(o))->p)) +#define gco2th(o) check_exp((o)->tt == LUA_VTHREAD, &((cast_u(o))->th)) +#define gco2upv(o) check_exp((o)->tt == LUA_VUPVAL, &((cast_u(o))->upv)) + + +/* +** macro to convert a Lua object into a GCObject +** (The access to 'tt' tries to ensure that 'v' is actually a Lua object.) +*/ +#define obj2gco(v) check_exp((v)->tt >= LUA_TSTRING, &(cast_u(v)->gc)) + + +/* actual number of total bytes allocated */ +#define gettotalbytes(g) cast(lu_mem, (g)->totalbytes + (g)->GCdebt) + +LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt); +LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1); +LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L); +LUAI_FUNC void luaE_freeCI (lua_State *L); +LUAI_FUNC void luaE_shrinkCI (lua_State *L); +LUAI_FUNC void luaE_enterCcall (lua_State *L); +LUAI_FUNC void luaE_warning (lua_State *L, const char *msg, int tocont); +LUAI_FUNC void luaE_warnerror (lua_State *L, const char *where); + + +#define luaE_exitCcall(L) ((L)->nCcalls++) + +#endif + diff --git a/lua-5.4.0/src/lstring.c b/lua-5.4.0/src/lstring.c new file mode 100644 index 0000000..6f15747 --- /dev/null +++ b/lua-5.4.0/src/lstring.c @@ -0,0 +1,285 @@ +/* +** $Id: lstring.c $ +** String table (keeps all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#define lstring_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" + + +/* +** Lua will use at most ~(2^LUAI_HASHLIMIT) bytes from a long string to +** compute its hash +*/ +#if !defined(LUAI_HASHLIMIT) +#define LUAI_HASHLIMIT 5 +#endif + + + +/* +** Maximum size for string table. +*/ +#define MAXSTRTB cast_int(luaM_limitN(MAX_INT, TString*)) + + +/* +** equality for long strings +*/ +int luaS_eqlngstr (TString *a, TString *b) { + size_t len = a->u.lnglen; + lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR); + return (a == b) || /* same instance or... */ + ((len == b->u.lnglen) && /* equal length and ... */ + (memcmp(getstr(a), getstr(b), len) == 0)); /* equal contents */ +} + + +unsigned int luaS_hash (const char *str, size_t l, unsigned int seed, + size_t step) { + unsigned int h = seed ^ cast_uint(l); + for (; l >= step; l -= step) + h ^= ((h<<5) + (h>>2) + cast_byte(str[l - 1])); + return h; +} + + +unsigned int luaS_hashlongstr (TString *ts) { + lua_assert(ts->tt == LUA_VLNGSTR); + if (ts->extra == 0) { /* no hash? */ + size_t len = ts->u.lnglen; + size_t step = (len >> LUAI_HASHLIMIT) + 1; + ts->hash = luaS_hash(getstr(ts), len, ts->hash, step); + ts->extra = 1; /* now it has its hash */ + } + return ts->hash; +} + + +static void tablerehash (TString **vect, int osize, int nsize) { + int i; + for (i = osize; i < nsize; i++) /* clear new elements */ + vect[i] = NULL; + for (i = 0; i < osize; i++) { /* rehash old part of the array */ + TString *p = vect[i]; + vect[i] = NULL; + while (p) { /* for each string in the list */ + TString *hnext = p->u.hnext; /* save next */ + unsigned int h = lmod(p->hash, nsize); /* new position */ + p->u.hnext = vect[h]; /* chain it into array */ + vect[h] = p; + p = hnext; + } + } +} + + +/* +** Resize the string table. If allocation fails, keep the current size. +** (This can degrade performance, but any non-zero size should work +** correctly.) +*/ +void luaS_resize (lua_State *L, int nsize) { + stringtable *tb = &G(L)->strt; + int osize = tb->size; + TString **newvect; + if (nsize < osize) /* shrinking table? */ + tablerehash(tb->hash, osize, nsize); /* depopulate shrinking part */ + newvect = luaM_reallocvector(L, tb->hash, osize, nsize, TString*); + if (unlikely(newvect == NULL)) { /* reallocation failed? */ + if (nsize < osize) /* was it shrinking table? */ + tablerehash(tb->hash, nsize, osize); /* restore to original size */ + /* leave table as it was */ + } + else { /* allocation succeeded */ + tb->hash = newvect; + tb->size = nsize; + if (nsize > osize) + tablerehash(newvect, osize, nsize); /* rehash for new size */ + } +} + + +/* +** Clear API string cache. (Entries cannot be empty, so fill them with +** a non-collectable string.) +*/ +void luaS_clearcache (global_State *g) { + int i, j; + for (i = 0; i < STRCACHE_N; i++) + for (j = 0; j < STRCACHE_M; j++) { + if (iswhite(g->strcache[i][j])) /* will entry be collected? */ + g->strcache[i][j] = g->memerrmsg; /* replace it with something fixed */ + } +} + + +/* +** Initialize the string table and the string cache +*/ +void luaS_init (lua_State *L) { + global_State *g = G(L); + int i, j; + stringtable *tb = &G(L)->strt; + tb->hash = luaM_newvector(L, MINSTRTABSIZE, TString*); + tablerehash(tb->hash, 0, MINSTRTABSIZE); /* clear array */ + tb->size = MINSTRTABSIZE; + /* pre-create memory-error message */ + g->memerrmsg = luaS_newliteral(L, MEMERRMSG); + luaC_fix(L, obj2gco(g->memerrmsg)); /* it should never be collected */ + for (i = 0; i < STRCACHE_N; i++) /* fill cache with valid strings */ + for (j = 0; j < STRCACHE_M; j++) + g->strcache[i][j] = g->memerrmsg; +} + + + +/* +** creates a new string object +*/ +static TString *createstrobj (lua_State *L, size_t l, int tag, unsigned int h) { + TString *ts; + GCObject *o; + size_t totalsize; /* total size of TString object */ + totalsize = sizelstring(l); + o = luaC_newobj(L, tag, totalsize); + ts = gco2ts(o); + ts->hash = h; + ts->extra = 0; + getstr(ts)[l] = '\0'; /* ending 0 */ + return ts; +} + + +TString *luaS_createlngstrobj (lua_State *L, size_t l) { + TString *ts = createstrobj(L, l, LUA_VLNGSTR, G(L)->seed); + ts->u.lnglen = l; + return ts; +} + + +void luaS_remove (lua_State *L, TString *ts) { + stringtable *tb = &G(L)->strt; + TString **p = &tb->hash[lmod(ts->hash, tb->size)]; + while (*p != ts) /* find previous element */ + p = &(*p)->u.hnext; + *p = (*p)->u.hnext; /* remove element from its list */ + tb->nuse--; +} + + +static void growstrtab (lua_State *L, stringtable *tb) { + if (unlikely(tb->nuse == MAX_INT)) { /* too many strings? */ + luaC_fullgc(L, 1); /* try to free some... */ + if (tb->nuse == MAX_INT) /* still too many? */ + luaM_error(L); /* cannot even create a message... */ + } + if (tb->size <= MAXSTRTB / 2) /* can grow string table? */ + luaS_resize(L, tb->size * 2); +} + + +/* +** Checks whether short string exists and reuses it or creates a new one. +*/ +static TString *internshrstr (lua_State *L, const char *str, size_t l) { + TString *ts; + global_State *g = G(L); + stringtable *tb = &g->strt; + unsigned int h = luaS_hash(str, l, g->seed, 1); + TString **list = &tb->hash[lmod(h, tb->size)]; + lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */ + for (ts = *list; ts != NULL; ts = ts->u.hnext) { + if (l == ts->shrlen && (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) { + /* found! */ + if (isdead(g, ts)) /* dead (but not collected yet)? */ + changewhite(ts); /* resurrect it */ + return ts; + } + } + /* else must create a new string */ + if (tb->nuse >= tb->size) { /* need to grow string table? */ + growstrtab(L, tb); + list = &tb->hash[lmod(h, tb->size)]; /* rehash with new size */ + } + ts = createstrobj(L, l, LUA_VSHRSTR, h); + memcpy(getstr(ts), str, l * sizeof(char)); + ts->shrlen = cast_byte(l); + ts->u.hnext = *list; + *list = ts; + tb->nuse++; + return ts; +} + + +/* +** new string (with explicit length) +*/ +TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { + if (l <= LUAI_MAXSHORTLEN) /* short string? */ + return internshrstr(L, str, l); + else { + TString *ts; + if (unlikely(l >= (MAX_SIZE - sizeof(TString))/sizeof(char))) + luaM_toobig(L); + ts = luaS_createlngstrobj(L, l); + memcpy(getstr(ts), str, l * sizeof(char)); + return ts; + } +} + + +/* +** Create or reuse a zero-terminated string, first checking in the +** cache (using the string address as a key). The cache can contain +** only zero-terminated strings, so it is safe to use 'strcmp' to +** check hits. +*/ +TString *luaS_new (lua_State *L, const char *str) { + unsigned int i = point2uint(str) % STRCACHE_N; /* hash */ + int j; + TString **p = G(L)->strcache[i]; + for (j = 0; j < STRCACHE_M; j++) { + if (strcmp(str, getstr(p[j])) == 0) /* hit? */ + return p[j]; /* that is it */ + } + /* normal route */ + for (j = STRCACHE_M - 1; j > 0; j--) + p[j] = p[j - 1]; /* move out last element */ + /* new element is first in the list */ + p[0] = luaS_newlstr(L, str, strlen(str)); + return p[0]; +} + + +Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue) { + Udata *u; + int i; + GCObject *o; + if (unlikely(s > MAX_SIZE - udatamemoffset(nuvalue))) + luaM_toobig(L); + o = luaC_newobj(L, LUA_VUSERDATA, sizeudata(nuvalue, s)); + u = gco2u(o); + u->len = s; + u->nuvalue = nuvalue; + u->metatable = NULL; + for (i = 0; i < nuvalue; i++) + setnilvalue(&u->uv[i].uv); + return u; +} + diff --git a/lua-5.4.0/src/lstring.h b/lua-5.4.0/src/lstring.h new file mode 100644 index 0000000..a413a9d --- /dev/null +++ b/lua-5.4.0/src/lstring.h @@ -0,0 +1,58 @@ +/* +** $Id: lstring.h $ +** String table (keep all strings handled by Lua) +** See Copyright Notice in lua.h +*/ + +#ifndef lstring_h +#define lstring_h + +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" + + +/* +** Memory-allocation error message must be preallocated (it cannot +** be created after memory is exhausted) +*/ +#define MEMERRMSG "not enough memory" + + +/* +** Size of a TString: Size of the header plus space for the string +** itself (including final '\0'). +*/ +#define sizelstring(l) (offsetof(TString, contents) + ((l) + 1) * sizeof(char)) + +#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ + (sizeof(s)/sizeof(char))-1)) + + +/* +** test whether a string is a reserved word +*/ +#define isreserved(s) ((s)->tt == LUA_VSHRSTR && (s)->extra > 0) + + +/* +** equality for short strings, which are always internalized +*/ +#define eqshrstr(a,b) check_exp((a)->tt == LUA_VSHRSTR, (a) == (b)) + + +LUAI_FUNC unsigned int luaS_hash (const char *str, size_t l, + unsigned int seed, size_t step); +LUAI_FUNC unsigned int luaS_hashlongstr (TString *ts); +LUAI_FUNC int luaS_eqlngstr (TString *a, TString *b); +LUAI_FUNC void luaS_resize (lua_State *L, int newsize); +LUAI_FUNC void luaS_clearcache (global_State *g); +LUAI_FUNC void luaS_init (lua_State *L); +LUAI_FUNC void luaS_remove (lua_State *L, TString *ts); +LUAI_FUNC Udata *luaS_newudata (lua_State *L, size_t s, int nuvalue); +LUAI_FUNC TString *luaS_newlstr (lua_State *L, const char *str, size_t l); +LUAI_FUNC TString *luaS_new (lua_State *L, const char *str); +LUAI_FUNC TString *luaS_createlngstrobj (lua_State *L, size_t l); + + +#endif diff --git a/lua-5.4.0/src/lstrlib.c b/lua-5.4.0/src/lstrlib.c new file mode 100644 index 0000000..2ba8bde --- /dev/null +++ b/lua-5.4.0/src/lstrlib.c @@ -0,0 +1,1805 @@ +/* +** $Id: lstrlib.c $ +** Standard library for string operations and pattern-matching +** See Copyright Notice in lua.h +*/ + +#define lstrlib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** maximum number of captures that a pattern can do during +** pattern-matching. This limit is arbitrary, but must fit in +** an unsigned char. +*/ +#if !defined(LUA_MAXCAPTURES) +#define LUA_MAXCAPTURES 32 +#endif + + +/* macro to 'unsign' a character */ +#define uchar(c) ((unsigned char)(c)) + + +/* +** Some sizes are better limited to fit in 'int', but must also fit in +** 'size_t'. (We assume that 'lua_Integer' cannot be smaller than 'int'.) +*/ +#define MAX_SIZET ((size_t)(~(size_t)0)) + +#define MAXSIZE \ + (sizeof(size_t) < sizeof(int) ? MAX_SIZET : (size_t)(INT_MAX)) + + + + +static int str_len (lua_State *L) { + size_t l; + luaL_checklstring(L, 1, &l); + lua_pushinteger(L, (lua_Integer)l); + return 1; +} + + +/* +** translate a relative initial string position +** (negative means back from end): clip result to [1, inf). +** The length of any string in Lua must fit in a lua_Integer, +** so there are no overflows in the casts. +** The inverted comparison avoids a possible overflow +** computing '-pos'. +*/ +static size_t posrelatI (lua_Integer pos, size_t len) { + if (pos > 0) + return (size_t)pos; + else if (pos == 0) + return 1; + else if (pos < -(lua_Integer)len) /* inverted comparison */ + return 1; /* clip to 1 */ + else return len + (size_t)pos + 1; +} + + +/* +** Gets an optional ending string position from argument 'arg', +** with default value 'def'. +** Negative means back from end: clip result to [0, len] +*/ +static size_t getendpos (lua_State *L, int arg, lua_Integer def, + size_t len) { + lua_Integer pos = luaL_optinteger(L, arg, def); + if (pos > (lua_Integer)len) + return len; + else if (pos >= 0) + return (size_t)pos; + else if (pos < -(lua_Integer)len) + return 0; + else return len + (size_t)pos + 1; +} + + +static int str_sub (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + size_t start = posrelatI(luaL_checkinteger(L, 2), l); + size_t end = getendpos(L, 3, -1, l); + if (start <= end) + lua_pushlstring(L, s + start - 1, (end - start) + 1); + else lua_pushliteral(L, ""); + return 1; +} + + +static int str_reverse (lua_State *L) { + size_t l, i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i = 0; i < l; i++) + p[i] = s[l - i - 1]; + luaL_pushresultsize(&b, l); + return 1; +} + + +static int str_lower (lua_State *L) { + size_t l; + size_t i; + luaL_Buffer b; + const char *s = luaL_checklstring(L, 1, &l); + char *p = luaL_buffinitsize(L, &b, l); + for (i=0; i MAXSIZE / n) /* may overflow? */ + return luaL_error(L, "resulting string too large"); + else { + size_t totallen = (size_t)n * l + (size_t)(n - 1) * lsep; + luaL_Buffer b; + char *p = luaL_buffinitsize(L, &b, totallen); + while (n-- > 1) { /* first n-1 copies (followed by separator) */ + memcpy(p, s, l * sizeof(char)); p += l; + if (lsep > 0) { /* empty 'memcpy' is not that cheap */ + memcpy(p, sep, lsep * sizeof(char)); + p += lsep; + } + } + memcpy(p, s, l * sizeof(char)); /* last copy (not followed by separator) */ + luaL_pushresultsize(&b, totallen); + } + return 1; +} + + +static int str_byte (lua_State *L) { + size_t l; + const char *s = luaL_checklstring(L, 1, &l); + lua_Integer pi = luaL_optinteger(L, 2, 1); + size_t posi = posrelatI(pi, l); + size_t pose = getendpos(L, 3, pi, l); + int n, i; + if (posi > pose) return 0; /* empty interval; return no values */ + if (pose - posi >= (size_t)INT_MAX) /* arithmetic overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; + luaL_checkstack(L, n, "string slice too long"); + for (i=0; iinit) { + state->init = 1; + luaL_buffinit(L, &state->B); + } + luaL_addlstring(&state->B, (const char *)b, size); + return 0; +} + + +static int str_dump (lua_State *L) { + struct str_Writer state; + int strip = lua_toboolean(L, 2); + luaL_checktype(L, 1, LUA_TFUNCTION); + lua_settop(L, 1); /* ensure function is on the top of the stack */ + state.init = 0; + if (lua_dump(L, writer, &state, strip) != 0) + return luaL_error(L, "unable to dump given function"); + luaL_pushresult(&state.B); + return 1; +} + + + +/* +** {====================================================== +** METAMETHODS +** ======================================================= +*/ + +#if defined(LUA_NOCVTS2N) /* { */ + +/* no coercion from strings to numbers */ + +static const luaL_Reg stringmetamethods[] = { + {"__index", NULL}, /* placeholder */ + {NULL, NULL} +}; + +#else /* }{ */ + +static int tonum (lua_State *L, int arg) { + if (lua_type(L, arg) == LUA_TNUMBER) { /* already a number? */ + lua_pushvalue(L, arg); + return 1; + } + else { /* check whether it is a numerical string */ + size_t len; + const char *s = lua_tolstring(L, arg, &len); + return (s != NULL && lua_stringtonumber(L, s) == len + 1); + } +} + + +static void trymt (lua_State *L, const char *mtname) { + lua_settop(L, 2); /* back to the original arguments */ + if (lua_type(L, 2) == LUA_TSTRING || !luaL_getmetafield(L, 2, mtname)) + luaL_error(L, "attempt to %s a '%s' with a '%s'", mtname + 2, + luaL_typename(L, -2), luaL_typename(L, -1)); + lua_insert(L, -3); /* put metamethod before arguments */ + lua_call(L, 2, 1); /* call metamethod */ +} + + +static int arith (lua_State *L, int op, const char *mtname) { + if (tonum(L, 1) && tonum(L, 2)) + lua_arith(L, op); /* result will be on the top */ + else + trymt(L, mtname); + return 1; +} + + +static int arith_add (lua_State *L) { + return arith(L, LUA_OPADD, "__add"); +} + +static int arith_sub (lua_State *L) { + return arith(L, LUA_OPSUB, "__sub"); +} + +static int arith_mul (lua_State *L) { + return arith(L, LUA_OPMUL, "__mul"); +} + +static int arith_mod (lua_State *L) { + return arith(L, LUA_OPMOD, "__mod"); +} + +static int arith_pow (lua_State *L) { + return arith(L, LUA_OPPOW, "__pow"); +} + +static int arith_div (lua_State *L) { + return arith(L, LUA_OPDIV, "__div"); +} + +static int arith_idiv (lua_State *L) { + return arith(L, LUA_OPIDIV, "__idiv"); +} + +static int arith_unm (lua_State *L) { + return arith(L, LUA_OPUNM, "__unm"); +} + + +static const luaL_Reg stringmetamethods[] = { + {"__add", arith_add}, + {"__sub", arith_sub}, + {"__mul", arith_mul}, + {"__mod", arith_mod}, + {"__pow", arith_pow}, + {"__div", arith_div}, + {"__idiv", arith_idiv}, + {"__unm", arith_unm}, + {"__index", NULL}, /* placeholder */ + {NULL, NULL} +}; + +#endif /* } */ + +/* }====================================================== */ + +/* +** {====================================================== +** PATTERN MATCHING +** ======================================================= +*/ + + +#define CAP_UNFINISHED (-1) +#define CAP_POSITION (-2) + + +typedef struct MatchState { + const char *src_init; /* init of source string */ + const char *src_end; /* end ('\0') of source string */ + const char *p_end; /* end ('\0') of pattern */ + lua_State *L; + int matchdepth; /* control for recursive depth (to avoid C stack overflow) */ + unsigned char level; /* total number of captures (finished or unfinished) */ + struct { + const char *init; + ptrdiff_t len; + } capture[LUA_MAXCAPTURES]; +} MatchState; + + +/* recursive function */ +static const char *match (MatchState *ms, const char *s, const char *p); + + +/* maximum recursion depth for 'match' */ +#if !defined(MAXCCALLS) +#define MAXCCALLS 200 +#endif + + +#define L_ESC '%' +#define SPECIALS "^$*+?.([%-" + + +static int check_capture (MatchState *ms, int l) { + l -= '1'; + if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED) + return luaL_error(ms->L, "invalid capture index %%%d", l + 1); + return l; +} + + +static int capture_to_close (MatchState *ms) { + int level = ms->level; + for (level--; level>=0; level--) + if (ms->capture[level].len == CAP_UNFINISHED) return level; + return luaL_error(ms->L, "invalid pattern capture"); +} + + +static const char *classend (MatchState *ms, const char *p) { + switch (*p++) { + case L_ESC: { + if (p == ms->p_end) + luaL_error(ms->L, "malformed pattern (ends with '%%')"); + return p+1; + } + case '[': { + if (*p == '^') p++; + do { /* look for a ']' */ + if (p == ms->p_end) + luaL_error(ms->L, "malformed pattern (missing ']')"); + if (*(p++) == L_ESC && p < ms->p_end) + p++; /* skip escapes (e.g. '%]') */ + } while (*p != ']'); + return p+1; + } + default: { + return p; + } + } +} + + +static int match_class (int c, int cl) { + int res; + switch (tolower(cl)) { + case 'a' : res = isalpha(c); break; + case 'c' : res = iscntrl(c); break; + case 'd' : res = isdigit(c); break; + case 'g' : res = isgraph(c); break; + case 'l' : res = islower(c); break; + case 'p' : res = ispunct(c); break; + case 's' : res = isspace(c); break; + case 'u' : res = isupper(c); break; + case 'w' : res = isalnum(c); break; + case 'x' : res = isxdigit(c); break; + case 'z' : res = (c == 0); break; /* deprecated option */ + default: return (cl == c); + } + return (islower(cl) ? res : !res); +} + + +static int matchbracketclass (int c, const char *p, const char *ec) { + int sig = 1; + if (*(p+1) == '^') { + sig = 0; + p++; /* skip the '^' */ + } + while (++p < ec) { + if (*p == L_ESC) { + p++; + if (match_class(c, uchar(*p))) + return sig; + } + else if ((*(p+1) == '-') && (p+2 < ec)) { + p+=2; + if (uchar(*(p-2)) <= c && c <= uchar(*p)) + return sig; + } + else if (uchar(*p) == c) return sig; + } + return !sig; +} + + +static int singlematch (MatchState *ms, const char *s, const char *p, + const char *ep) { + if (s >= ms->src_end) + return 0; + else { + int c = uchar(*s); + switch (*p) { + case '.': return 1; /* matches any char */ + case L_ESC: return match_class(c, uchar(*(p+1))); + case '[': return matchbracketclass(c, p, ep-1); + default: return (uchar(*p) == c); + } + } +} + + +static const char *matchbalance (MatchState *ms, const char *s, + const char *p) { + if (p >= ms->p_end - 1) + luaL_error(ms->L, "malformed pattern (missing arguments to '%%b')"); + if (*s != *p) return NULL; + else { + int b = *p; + int e = *(p+1); + int cont = 1; + while (++s < ms->src_end) { + if (*s == e) { + if (--cont == 0) return s+1; + } + else if (*s == b) cont++; + } + } + return NULL; /* string ends out of balance */ +} + + +static const char *max_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + ptrdiff_t i = 0; /* counts maximum expand for item */ + while (singlematch(ms, s + i, p, ep)) + i++; + /* keeps trying to match with the maximum repetitions */ + while (i>=0) { + const char *res = match(ms, (s+i), ep+1); + if (res) return res; + i--; /* else didn't match; reduce 1 repetition to try again */ + } + return NULL; +} + + +static const char *min_expand (MatchState *ms, const char *s, + const char *p, const char *ep) { + for (;;) { + const char *res = match(ms, s, ep+1); + if (res != NULL) + return res; + else if (singlematch(ms, s, p, ep)) + s++; /* try with one more repetition */ + else return NULL; + } +} + + +static const char *start_capture (MatchState *ms, const char *s, + const char *p, int what) { + const char *res; + int level = ms->level; + if (level >= LUA_MAXCAPTURES) luaL_error(ms->L, "too many captures"); + ms->capture[level].init = s; + ms->capture[level].len = what; + ms->level = level+1; + if ((res=match(ms, s, p)) == NULL) /* match failed? */ + ms->level--; /* undo capture */ + return res; +} + + +static const char *end_capture (MatchState *ms, const char *s, + const char *p) { + int l = capture_to_close(ms); + const char *res; + ms->capture[l].len = s - ms->capture[l].init; /* close capture */ + if ((res = match(ms, s, p)) == NULL) /* match failed? */ + ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ + return res; +} + + +static const char *match_capture (MatchState *ms, const char *s, int l) { + size_t len; + l = check_capture(ms, l); + len = ms->capture[l].len; + if ((size_t)(ms->src_end-s) >= len && + memcmp(ms->capture[l].init, s, len) == 0) + return s+len; + else return NULL; +} + + +static const char *match (MatchState *ms, const char *s, const char *p) { + if (ms->matchdepth-- == 0) + luaL_error(ms->L, "pattern too complex"); + init: /* using goto's to optimize tail recursion */ + if (p != ms->p_end) { /* end of pattern? */ + switch (*p) { + case '(': { /* start capture */ + if (*(p + 1) == ')') /* position capture? */ + s = start_capture(ms, s, p + 2, CAP_POSITION); + else + s = start_capture(ms, s, p + 1, CAP_UNFINISHED); + break; + } + case ')': { /* end capture */ + s = end_capture(ms, s, p + 1); + break; + } + case '$': { + if ((p + 1) != ms->p_end) /* is the '$' the last char in pattern? */ + goto dflt; /* no; go to default */ + s = (s == ms->src_end) ? s : NULL; /* check end of string */ + break; + } + case L_ESC: { /* escaped sequences not in the format class[*+?-]? */ + switch (*(p + 1)) { + case 'b': { /* balanced string? */ + s = matchbalance(ms, s, p + 2); + if (s != NULL) { + p += 4; goto init; /* return match(ms, s, p + 4); */ + } /* else fail (s == NULL) */ + break; + } + case 'f': { /* frontier? */ + const char *ep; char previous; + p += 2; + if (*p != '[') + luaL_error(ms->L, "missing '[' after '%%f' in pattern"); + ep = classend(ms, p); /* points to what is next */ + previous = (s == ms->src_init) ? '\0' : *(s - 1); + if (!matchbracketclass(uchar(previous), p, ep - 1) && + matchbracketclass(uchar(*s), p, ep - 1)) { + p = ep; goto init; /* return match(ms, s, ep); */ + } + s = NULL; /* match failed */ + break; + } + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + case '8': case '9': { /* capture results (%0-%9)? */ + s = match_capture(ms, s, uchar(*(p + 1))); + if (s != NULL) { + p += 2; goto init; /* return match(ms, s, p + 2) */ + } + break; + } + default: goto dflt; + } + break; + } + default: dflt: { /* pattern class plus optional suffix */ + const char *ep = classend(ms, p); /* points to optional suffix */ + /* does not match at least once? */ + if (!singlematch(ms, s, p, ep)) { + if (*ep == '*' || *ep == '?' || *ep == '-') { /* accept empty? */ + p = ep + 1; goto init; /* return match(ms, s, ep + 1); */ + } + else /* '+' or no suffix */ + s = NULL; /* fail */ + } + else { /* matched once */ + switch (*ep) { /* handle optional suffix */ + case '?': { /* optional */ + const char *res; + if ((res = match(ms, s + 1, ep + 1)) != NULL) + s = res; + else { + p = ep + 1; goto init; /* else return match(ms, s, ep + 1); */ + } + break; + } + case '+': /* 1 or more repetitions */ + s++; /* 1 match already done */ + /* FALLTHROUGH */ + case '*': /* 0 or more repetitions */ + s = max_expand(ms, s, p, ep); + break; + case '-': /* 0 or more repetitions (minimum) */ + s = min_expand(ms, s, p, ep); + break; + default: /* no suffix */ + s++; p = ep; goto init; /* return match(ms, s + 1, ep); */ + } + } + break; + } + } + } + ms->matchdepth++; + return s; +} + + + +static const char *lmemfind (const char *s1, size_t l1, + const char *s2, size_t l2) { + if (l2 == 0) return s1; /* empty strings are everywhere */ + else if (l2 > l1) return NULL; /* avoids a negative 'l1' */ + else { + const char *init; /* to search for a '*s2' inside 's1' */ + l2--; /* 1st char will be checked by 'memchr' */ + l1 = l1-l2; /* 's2' cannot be found after that */ + while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { + init++; /* 1st char is already checked */ + if (memcmp(init, s2+1, l2) == 0) + return init-1; + else { /* correct 'l1' and 's1' to try again */ + l1 -= init-s1; + s1 = init; + } + } + return NULL; /* not found */ + } +} + + +/* +** get information about the i-th capture. If there are no captures +** and 'i==0', return information about the whole match, which +** is the range 's'..'e'. If the capture is a string, return +** its length and put its address in '*cap'. If it is an integer +** (a position), push it on the stack and return CAP_POSITION. +*/ +static size_t get_onecapture (MatchState *ms, int i, const char *s, + const char *e, const char **cap) { + if (i >= ms->level) { + if (i != 0) + luaL_error(ms->L, "invalid capture index %%%d", i + 1); + *cap = s; + return e - s; + } + else { + ptrdiff_t capl = ms->capture[i].len; + *cap = ms->capture[i].init; + if (capl == CAP_UNFINISHED) + luaL_error(ms->L, "unfinished capture"); + else if (capl == CAP_POSITION) + lua_pushinteger(ms->L, (ms->capture[i].init - ms->src_init) + 1); + return capl; + } +} + + +/* +** Push the i-th capture on the stack. +*/ +static void push_onecapture (MatchState *ms, int i, const char *s, + const char *e) { + const char *cap; + ptrdiff_t l = get_onecapture(ms, i, s, e, &cap); + if (l != CAP_POSITION) + lua_pushlstring(ms->L, cap, l); + /* else position was already pushed */ +} + + +static int push_captures (MatchState *ms, const char *s, const char *e) { + int i; + int nlevels = (ms->level == 0 && s) ? 1 : ms->level; + luaL_checkstack(ms->L, nlevels, "too many captures"); + for (i = 0; i < nlevels; i++) + push_onecapture(ms, i, s, e); + return nlevels; /* number of strings pushed */ +} + + +/* check whether pattern has no special characters */ +static int nospecials (const char *p, size_t l) { + size_t upto = 0; + do { + if (strpbrk(p + upto, SPECIALS)) + return 0; /* pattern has a special character */ + upto += strlen(p + upto) + 1; /* may have more after \0 */ + } while (upto <= l); + return 1; /* no special chars found */ +} + + +static void prepstate (MatchState *ms, lua_State *L, + const char *s, size_t ls, const char *p, size_t lp) { + ms->L = L; + ms->matchdepth = MAXCCALLS; + ms->src_init = s; + ms->src_end = s + ls; + ms->p_end = p + lp; +} + + +static void reprepstate (MatchState *ms) { + ms->level = 0; + lua_assert(ms->matchdepth == MAXCCALLS); +} + + +static int str_find_aux (lua_State *L, int find) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + size_t init = posrelatI(luaL_optinteger(L, 3, 1), ls) - 1; + if (init > ls) { /* start after string's end? */ + luaL_pushfail(L); /* cannot find anything */ + return 1; + } + /* explicit request or no special characters? */ + if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) { + /* do a plain search */ + const char *s2 = lmemfind(s + init, ls - init, p, lp); + if (s2) { + lua_pushinteger(L, (s2 - s) + 1); + lua_pushinteger(L, (s2 - s) + lp); + return 2; + } + } + else { + MatchState ms; + const char *s1 = s + init; + int anchor = (*p == '^'); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, s, ls, p, lp); + do { + const char *res; + reprepstate(&ms); + if ((res=match(&ms, s1, p)) != NULL) { + if (find) { + lua_pushinteger(L, (s1 - s) + 1); /* start */ + lua_pushinteger(L, res - s); /* end */ + return push_captures(&ms, NULL, 0) + 2; + } + else + return push_captures(&ms, s1, res); + } + } while (s1++ < ms.src_end && !anchor); + } + luaL_pushfail(L); /* not found */ + return 1; +} + + +static int str_find (lua_State *L) { + return str_find_aux(L, 1); +} + + +static int str_match (lua_State *L) { + return str_find_aux(L, 0); +} + + +/* state for 'gmatch' */ +typedef struct GMatchState { + const char *src; /* current position */ + const char *p; /* pattern */ + const char *lastmatch; /* end of last match */ + MatchState ms; /* match state */ +} GMatchState; + + +static int gmatch_aux (lua_State *L) { + GMatchState *gm = (GMatchState *)lua_touserdata(L, lua_upvalueindex(3)); + const char *src; + gm->ms.L = L; + for (src = gm->src; src <= gm->ms.src_end; src++) { + const char *e; + reprepstate(&gm->ms); + if ((e = match(&gm->ms, src, gm->p)) != NULL && e != gm->lastmatch) { + gm->src = gm->lastmatch = e; + return push_captures(&gm->ms, src, e); + } + } + return 0; /* not found */ +} + + +static int gmatch (lua_State *L) { + size_t ls, lp; + const char *s = luaL_checklstring(L, 1, &ls); + const char *p = luaL_checklstring(L, 2, &lp); + size_t init = posrelatI(luaL_optinteger(L, 3, 1), ls) - 1; + GMatchState *gm; + lua_settop(L, 2); /* keep strings on closure to avoid being collected */ + gm = (GMatchState *)lua_newuserdatauv(L, sizeof(GMatchState), 0); + if (init > ls) /* start after string's end? */ + init = ls + 1; /* avoid overflows in 's + init' */ + prepstate(&gm->ms, L, s, ls, p, lp); + gm->src = s + init; gm->p = p; gm->lastmatch = NULL; + lua_pushcclosure(L, gmatch_aux, 3); + return 1; +} + + +static void add_s (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e) { + size_t l; + lua_State *L = ms->L; + const char *news = lua_tolstring(L, 3, &l); + const char *p; + while ((p = (char *)memchr(news, L_ESC, l)) != NULL) { + luaL_addlstring(b, news, p - news); + p++; /* skip ESC */ + if (*p == L_ESC) /* '%%' */ + luaL_addchar(b, *p); + else if (*p == '0') /* '%0' */ + luaL_addlstring(b, s, e - s); + else if (isdigit(uchar(*p))) { /* '%n' */ + const char *cap; + ptrdiff_t resl = get_onecapture(ms, *p - '1', s, e, &cap); + if (resl == CAP_POSITION) + luaL_addvalue(b); /* add position to accumulated result */ + else + luaL_addlstring(b, cap, resl); + } + else + luaL_error(L, "invalid use of '%c' in replacement string", L_ESC); + l -= p + 1 - news; + news = p + 1; + } + luaL_addlstring(b, news, l); +} + + +/* +** Add the replacement value to the string buffer 'b'. +** Return true if the original string was changed. (Function calls and +** table indexing resulting in nil or false do not change the subject.) +*/ +static int add_value (MatchState *ms, luaL_Buffer *b, const char *s, + const char *e, int tr) { + lua_State *L = ms->L; + switch (tr) { + case LUA_TFUNCTION: { /* call the function */ + int n; + lua_pushvalue(L, 3); /* push the function */ + n = push_captures(ms, s, e); /* all captures as arguments */ + lua_call(L, n, 1); /* call it */ + break; + } + case LUA_TTABLE: { /* index the table */ + push_onecapture(ms, 0, s, e); /* first capture is the index */ + lua_gettable(L, 3); + break; + } + default: { /* LUA_TNUMBER or LUA_TSTRING */ + add_s(ms, b, s, e); /* add value to the buffer */ + return 1; /* something changed */ + } + } + if (!lua_toboolean(L, -1)) { /* nil or false? */ + lua_pop(L, 1); /* remove value */ + luaL_addlstring(b, s, e - s); /* keep original text */ + return 0; /* no changes */ + } + else if (!lua_isstring(L, -1)) + return luaL_error(L, "invalid replacement value (a %s)", + luaL_typename(L, -1)); + else { + luaL_addvalue(b); /* add result to accumulator */ + return 1; /* something changed */ + } +} + + +static int str_gsub (lua_State *L) { + size_t srcl, lp; + const char *src = luaL_checklstring(L, 1, &srcl); /* subject */ + const char *p = luaL_checklstring(L, 2, &lp); /* pattern */ + const char *lastmatch = NULL; /* end of last match */ + int tr = lua_type(L, 3); /* replacement type */ + lua_Integer max_s = luaL_optinteger(L, 4, srcl + 1); /* max replacements */ + int anchor = (*p == '^'); + lua_Integer n = 0; /* replacement count */ + int changed = 0; /* change flag */ + MatchState ms; + luaL_Buffer b; + luaL_argexpected(L, tr == LUA_TNUMBER || tr == LUA_TSTRING || + tr == LUA_TFUNCTION || tr == LUA_TTABLE, 3, + "string/function/table"); + luaL_buffinit(L, &b); + if (anchor) { + p++; lp--; /* skip anchor character */ + } + prepstate(&ms, L, src, srcl, p, lp); + while (n < max_s) { + const char *e; + reprepstate(&ms); /* (re)prepare state for new match */ + if ((e = match(&ms, src, p)) != NULL && e != lastmatch) { /* match? */ + n++; + changed = add_value(&ms, &b, src, e, tr) | changed; + src = lastmatch = e; + } + else if (src < ms.src_end) /* otherwise, skip one character */ + luaL_addchar(&b, *src++); + else break; /* end of subject */ + if (anchor) break; + } + if (!changed) /* no changes? */ + lua_pushvalue(L, 1); /* return original string */ + else { /* something changed */ + luaL_addlstring(&b, src, ms.src_end-src); + luaL_pushresult(&b); /* create and return new string */ + } + lua_pushinteger(L, n); /* number of substitutions */ + return 2; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** STRING FORMAT +** ======================================================= +*/ + +#if !defined(lua_number2strx) /* { */ + +/* +** Hexadecimal floating-point formatter +*/ + +#define SIZELENMOD (sizeof(LUA_NUMBER_FRMLEN)/sizeof(char)) + + +/* +** Number of bits that goes into the first digit. It can be any value +** between 1 and 4; the following definition tries to align the number +** to nibble boundaries by making what is left after that first digit a +** multiple of 4. +*/ +#define L_NBFD ((l_floatatt(MANT_DIG) - 1)%4 + 1) + + +/* +** Add integer part of 'x' to buffer and return new 'x' +*/ +static lua_Number adddigit (char *buff, int n, lua_Number x) { + lua_Number dd = l_mathop(floor)(x); /* get integer part from 'x' */ + int d = (int)dd; + buff[n] = (d < 10 ? d + '0' : d - 10 + 'a'); /* add to buffer */ + return x - dd; /* return what is left */ +} + + +static int num2straux (char *buff, int sz, lua_Number x) { + /* if 'inf' or 'NaN', format it like '%g' */ + if (x != x || x == (lua_Number)HUGE_VAL || x == -(lua_Number)HUGE_VAL) + return l_sprintf(buff, sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)x); + else if (x == 0) { /* can be -0... */ + /* create "0" or "-0" followed by exponent */ + return l_sprintf(buff, sz, LUA_NUMBER_FMT "x0p+0", (LUAI_UACNUMBER)x); + } + else { + int e; + lua_Number m = l_mathop(frexp)(x, &e); /* 'x' fraction and exponent */ + int n = 0; /* character count */ + if (m < 0) { /* is number negative? */ + buff[n++] = '-'; /* add sign */ + m = -m; /* make it positive */ + } + buff[n++] = '0'; buff[n++] = 'x'; /* add "0x" */ + m = adddigit(buff, n++, m * (1 << L_NBFD)); /* add first digit */ + e -= L_NBFD; /* this digit goes before the radix point */ + if (m > 0) { /* more digits? */ + buff[n++] = lua_getlocaledecpoint(); /* add radix point */ + do { /* add as many digits as needed */ + m = adddigit(buff, n++, m * 16); + } while (m > 0); + } + n += l_sprintf(buff + n, sz - n, "p%+d", e); /* add exponent */ + lua_assert(n < sz); + return n; + } +} + + +static int lua_number2strx (lua_State *L, char *buff, int sz, + const char *fmt, lua_Number x) { + int n = num2straux(buff, sz, x); + if (fmt[SIZELENMOD] == 'A') { + int i; + for (i = 0; i < n; i++) + buff[i] = toupper(uchar(buff[i])); + } + else if (fmt[SIZELENMOD] != 'a') + return luaL_error(L, "modifiers for format '%%a'/'%%A' not implemented"); + return n; +} + +#endif /* } */ + + +/* +** Maximum size for items formatted with '%f'. This size is produced +** by format('%.99f', -maxfloat), and is equal to 99 + 3 ('-', '.', +** and '\0') + number of decimal digits to represent maxfloat (which +** is maximum exponent + 1). (99+3+1, adding some extra, 110) +*/ +#define MAX_ITEMF (110 + l_floatatt(MAX_10_EXP)) + + +/* +** All formats except '%f' do not need that large limit. The other +** float formats use exponents, so that they fit in the 99 limit for +** significant digits; 's' for large strings and 'q' add items directly +** to the buffer; all integer formats also fit in the 99 limit. The +** worst case are floats: they may need 99 significant digits, plus +** '0x', '-', '.', 'e+XXXX', and '\0'. Adding some extra, 120. +*/ +#define MAX_ITEM 120 + + +/* valid flags in a format specification */ +#if !defined(L_FMTFLAGS) +#define L_FMTFLAGS "-+ #0" +#endif + + +/* +** maximum size of each format specification (such as "%-099.99d") +*/ +#define MAX_FORMAT 32 + + +static void addquoted (luaL_Buffer *b, const char *s, size_t len) { + luaL_addchar(b, '"'); + while (len--) { + if (*s == '"' || *s == '\\' || *s == '\n') { + luaL_addchar(b, '\\'); + luaL_addchar(b, *s); + } + else if (iscntrl(uchar(*s))) { + char buff[10]; + if (!isdigit(uchar(*(s+1)))) + l_sprintf(buff, sizeof(buff), "\\%d", (int)uchar(*s)); + else + l_sprintf(buff, sizeof(buff), "\\%03d", (int)uchar(*s)); + luaL_addstring(b, buff); + } + else + luaL_addchar(b, *s); + s++; + } + luaL_addchar(b, '"'); +} + + +/* +** Serialize a floating-point number in such a way that it can be +** scanned back by Lua. Use hexadecimal format for "common" numbers +** (to preserve precision); inf, -inf, and NaN are handled separately. +** (NaN cannot be expressed as a numeral, so we write '(0/0)' for it.) +*/ +static int quotefloat (lua_State *L, char *buff, lua_Number n) { + const char *s; /* for the fixed representations */ + if (n == (lua_Number)HUGE_VAL) /* inf? */ + s = "1e9999"; + else if (n == -(lua_Number)HUGE_VAL) /* -inf? */ + s = "-1e9999"; + else if (n != n) /* NaN? */ + s = "(0/0)"; + else { /* format number as hexadecimal */ + int nb = lua_number2strx(L, buff, MAX_ITEM, + "%" LUA_NUMBER_FRMLEN "a", n); + /* ensures that 'buff' string uses a dot as the radix character */ + if (memchr(buff, '.', nb) == NULL) { /* no dot? */ + char point = lua_getlocaledecpoint(); /* try locale point */ + char *ppoint = (char *)memchr(buff, point, nb); + if (ppoint) *ppoint = '.'; /* change it to a dot */ + } + return nb; + } + /* for the fixed representations */ + return l_sprintf(buff, MAX_ITEM, "%s", s); +} + + +static void addliteral (lua_State *L, luaL_Buffer *b, int arg) { + switch (lua_type(L, arg)) { + case LUA_TSTRING: { + size_t len; + const char *s = lua_tolstring(L, arg, &len); + addquoted(b, s, len); + break; + } + case LUA_TNUMBER: { + char *buff = luaL_prepbuffsize(b, MAX_ITEM); + int nb; + if (!lua_isinteger(L, arg)) /* float? */ + nb = quotefloat(L, buff, lua_tonumber(L, arg)); + else { /* integers */ + lua_Integer n = lua_tointeger(L, arg); + const char *format = (n == LUA_MININTEGER) /* corner case? */ + ? "0x%" LUA_INTEGER_FRMLEN "x" /* use hex */ + : LUA_INTEGER_FMT; /* else use default format */ + nb = l_sprintf(buff, MAX_ITEM, format, (LUAI_UACINT)n); + } + luaL_addsize(b, nb); + break; + } + case LUA_TNIL: case LUA_TBOOLEAN: { + luaL_tolstring(L, arg, NULL); + luaL_addvalue(b); + break; + } + default: { + luaL_argerror(L, arg, "value has no literal form"); + } + } +} + + +static const char *scanformat (lua_State *L, const char *strfrmt, char *form) { + const char *p = strfrmt; + while (*p != '\0' && strchr(L_FMTFLAGS, *p) != NULL) p++; /* skip flags */ + if ((size_t)(p - strfrmt) >= sizeof(L_FMTFLAGS)/sizeof(char)) + luaL_error(L, "invalid format (repeated flags)"); + if (isdigit(uchar(*p))) p++; /* skip width */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + if (*p == '.') { + p++; + if (isdigit(uchar(*p))) p++; /* skip precision */ + if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ + } + if (isdigit(uchar(*p))) + luaL_error(L, "invalid format (width or precision too long)"); + *(form++) = '%'; + memcpy(form, strfrmt, ((p - strfrmt) + 1) * sizeof(char)); + form += (p - strfrmt) + 1; + *form = '\0'; + return p; +} + + +/* +** add length modifier into formats +*/ +static void addlenmod (char *form, const char *lenmod) { + size_t l = strlen(form); + size_t lm = strlen(lenmod); + char spec = form[l - 1]; + strcpy(form + l - 1, lenmod); + form[l + lm - 1] = spec; + form[l + lm] = '\0'; +} + + +static int str_format (lua_State *L) { + int top = lua_gettop(L); + int arg = 1; + size_t sfl; + const char *strfrmt = luaL_checklstring(L, arg, &sfl); + const char *strfrmt_end = strfrmt+sfl; + luaL_Buffer b; + luaL_buffinit(L, &b); + while (strfrmt < strfrmt_end) { + if (*strfrmt != L_ESC) + luaL_addchar(&b, *strfrmt++); + else if (*++strfrmt == L_ESC) + luaL_addchar(&b, *strfrmt++); /* %% */ + else { /* format item */ + char form[MAX_FORMAT]; /* to store the format ('%...') */ + int maxitem = MAX_ITEM; + char *buff = luaL_prepbuffsize(&b, maxitem); /* to put formatted item */ + int nb = 0; /* number of bytes in added item */ + if (++arg > top) + return luaL_argerror(L, arg, "no value"); + strfrmt = scanformat(L, strfrmt, form); + switch (*strfrmt++) { + case 'c': { + nb = l_sprintf(buff, maxitem, form, (int)luaL_checkinteger(L, arg)); + break; + } + case 'd': case 'i': + case 'o': case 'u': case 'x': case 'X': { + lua_Integer n = luaL_checkinteger(L, arg); + addlenmod(form, LUA_INTEGER_FRMLEN); + nb = l_sprintf(buff, maxitem, form, (LUAI_UACINT)n); + break; + } + case 'a': case 'A': + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = lua_number2strx(L, buff, maxitem, form, + luaL_checknumber(L, arg)); + break; + case 'f': + maxitem = MAX_ITEMF; /* extra space for '%f' */ + buff = luaL_prepbuffsize(&b, maxitem); + /* FALLTHROUGH */ + case 'e': case 'E': case 'g': case 'G': { + lua_Number n = luaL_checknumber(L, arg); + addlenmod(form, LUA_NUMBER_FRMLEN); + nb = l_sprintf(buff, maxitem, form, (LUAI_UACNUMBER)n); + break; + } + case 'p': { + const void *p = lua_topointer(L, arg); + if (p == NULL) { /* avoid calling 'printf' with argument NULL */ + p = "(null)"; /* result */ + form[strlen(form) - 1] = 's'; /* format it as a string */ + } + nb = l_sprintf(buff, maxitem, form, p); + break; + } + case 'q': { + if (form[2] != '\0') /* modifiers? */ + return luaL_error(L, "specifier '%%q' cannot have modifiers"); + addliteral(L, &b, arg); + break; + } + case 's': { + size_t l; + const char *s = luaL_tolstring(L, arg, &l); + if (form[2] == '\0') /* no modifiers? */ + luaL_addvalue(&b); /* keep entire string */ + else { + luaL_argcheck(L, l == strlen(s), arg, "string contains zeros"); + if (!strchr(form, '.') && l >= 100) { + /* no precision and string is too long to be formatted */ + luaL_addvalue(&b); /* keep entire string */ + } + else { /* format the string into 'buff' */ + nb = l_sprintf(buff, maxitem, form, s); + lua_pop(L, 1); /* remove result from 'luaL_tolstring' */ + } + } + break; + } + default: { /* also treat cases 'pnLlh' */ + return luaL_error(L, "invalid conversion '%s' to 'format'", form); + } + } + lua_assert(nb < maxitem); + luaL_addsize(&b, nb); + } + } + luaL_pushresult(&b); + return 1; +} + +/* }====================================================== */ + + +/* +** {====================================================== +** PACK/UNPACK +** ======================================================= +*/ + + +/* value used for padding */ +#if !defined(LUAL_PACKPADBYTE) +#define LUAL_PACKPADBYTE 0x00 +#endif + +/* maximum size for the binary representation of an integer */ +#define MAXINTSIZE 16 + +/* number of bits in a character */ +#define NB CHAR_BIT + +/* mask for one character (NB 1's) */ +#define MC ((1 << NB) - 1) + +/* size of a lua_Integer */ +#define SZINT ((int)sizeof(lua_Integer)) + + +/* dummy union to get native endianness */ +static const union { + int dummy; + char little; /* true iff machine is little endian */ +} nativeendian = {1}; + + +/* dummy structure to get native alignment requirements */ +struct cD { + char c; + union { double d; void *p; lua_Integer i; lua_Number n; } u; +}; + +#define MAXALIGN (offsetof(struct cD, u)) + + +/* +** Union for serializing floats +*/ +typedef union Ftypes { + float f; + double d; + lua_Number n; + char buff[5 * sizeof(lua_Number)]; /* enough for any float type */ +} Ftypes; + + +/* +** information to pack/unpack stuff +*/ +typedef struct Header { + lua_State *L; + int islittle; + int maxalign; +} Header; + + +/* +** options for pack/unpack +*/ +typedef enum KOption { + Kint, /* signed integers */ + Kuint, /* unsigned integers */ + Kfloat, /* floating-point numbers */ + Kchar, /* fixed-length strings */ + Kstring, /* strings with prefixed length */ + Kzstr, /* zero-terminated strings */ + Kpadding, /* padding */ + Kpaddalign, /* padding for alignment */ + Knop /* no-op (configuration or spaces) */ +} KOption; + + +/* +** Read an integer numeral from string 'fmt' or return 'df' if +** there is no numeral +*/ +static int digit (int c) { return '0' <= c && c <= '9'; } + +static int getnum (const char **fmt, int df) { + if (!digit(**fmt)) /* no number? */ + return df; /* return default value */ + else { + int a = 0; + do { + a = a*10 + (*((*fmt)++) - '0'); + } while (digit(**fmt) && a <= ((int)MAXSIZE - 9)/10); + return a; + } +} + + +/* +** Read an integer numeral and raises an error if it is larger +** than the maximum size for integers. +*/ +static int getnumlimit (Header *h, const char **fmt, int df) { + int sz = getnum(fmt, df); + if (sz > MAXINTSIZE || sz <= 0) + return luaL_error(h->L, "integral size (%d) out of limits [1,%d]", + sz, MAXINTSIZE); + return sz; +} + + +/* +** Initialize Header +*/ +static void initheader (lua_State *L, Header *h) { + h->L = L; + h->islittle = nativeendian.little; + h->maxalign = 1; +} + + +/* +** Read and classify next option. 'size' is filled with option's size. +*/ +static KOption getoption (Header *h, const char **fmt, int *size) { + int opt = *((*fmt)++); + *size = 0; /* default */ + switch (opt) { + case 'b': *size = sizeof(char); return Kint; + case 'B': *size = sizeof(char); return Kuint; + case 'h': *size = sizeof(short); return Kint; + case 'H': *size = sizeof(short); return Kuint; + case 'l': *size = sizeof(long); return Kint; + case 'L': *size = sizeof(long); return Kuint; + case 'j': *size = sizeof(lua_Integer); return Kint; + case 'J': *size = sizeof(lua_Integer); return Kuint; + case 'T': *size = sizeof(size_t); return Kuint; + case 'f': *size = sizeof(float); return Kfloat; + case 'd': *size = sizeof(double); return Kfloat; + case 'n': *size = sizeof(lua_Number); return Kfloat; + case 'i': *size = getnumlimit(h, fmt, sizeof(int)); return Kint; + case 'I': *size = getnumlimit(h, fmt, sizeof(int)); return Kuint; + case 's': *size = getnumlimit(h, fmt, sizeof(size_t)); return Kstring; + case 'c': + *size = getnum(fmt, -1); + if (*size == -1) + luaL_error(h->L, "missing size for format option 'c'"); + return Kchar; + case 'z': return Kzstr; + case 'x': *size = 1; return Kpadding; + case 'X': return Kpaddalign; + case ' ': break; + case '<': h->islittle = 1; break; + case '>': h->islittle = 0; break; + case '=': h->islittle = nativeendian.little; break; + case '!': h->maxalign = getnumlimit(h, fmt, MAXALIGN); break; + default: luaL_error(h->L, "invalid format option '%c'", opt); + } + return Knop; +} + + +/* +** Read, classify, and fill other details about the next option. +** 'psize' is filled with option's size, 'notoalign' with its +** alignment requirements. +** Local variable 'size' gets the size to be aligned. (Kpadal option +** always gets its full alignment, other options are limited by +** the maximum alignment ('maxalign'). Kchar option needs no alignment +** despite its size. +*/ +static KOption getdetails (Header *h, size_t totalsize, + const char **fmt, int *psize, int *ntoalign) { + KOption opt = getoption(h, fmt, psize); + int align = *psize; /* usually, alignment follows size */ + if (opt == Kpaddalign) { /* 'X' gets alignment from following option */ + if (**fmt == '\0' || getoption(h, fmt, &align) == Kchar || align == 0) + luaL_argerror(h->L, 1, "invalid next option for option 'X'"); + } + if (align <= 1 || opt == Kchar) /* need no alignment? */ + *ntoalign = 0; + else { + if (align > h->maxalign) /* enforce maximum alignment */ + align = h->maxalign; + if ((align & (align - 1)) != 0) /* is 'align' not a power of 2? */ + luaL_argerror(h->L, 1, "format asks for alignment not power of 2"); + *ntoalign = (align - (int)(totalsize & (align - 1))) & (align - 1); + } + return opt; +} + + +/* +** Pack integer 'n' with 'size' bytes and 'islittle' endianness. +** The final 'if' handles the case when 'size' is larger than +** the size of a Lua integer, correcting the extra sign-extension +** bytes if necessary (by default they would be zeros). +*/ +static void packint (luaL_Buffer *b, lua_Unsigned n, + int islittle, int size, int neg) { + char *buff = luaL_prepbuffsize(b, size); + int i; + buff[islittle ? 0 : size - 1] = (char)(n & MC); /* first byte */ + for (i = 1; i < size; i++) { + n >>= NB; + buff[islittle ? i : size - 1 - i] = (char)(n & MC); + } + if (neg && size > SZINT) { /* negative number need sign extension? */ + for (i = SZINT; i < size; i++) /* correct extra bytes */ + buff[islittle ? i : size - 1 - i] = (char)MC; + } + luaL_addsize(b, size); /* add result to buffer */ +} + + +/* +** Copy 'size' bytes from 'src' to 'dest', correcting endianness if +** given 'islittle' is different from native endianness. +*/ +static void copywithendian (volatile char *dest, volatile const char *src, + int size, int islittle) { + if (islittle == nativeendian.little) { + while (size-- != 0) + *(dest++) = *(src++); + } + else { + dest += size - 1; + while (size-- != 0) + *(dest--) = *(src++); + } +} + + +static int str_pack (lua_State *L) { + luaL_Buffer b; + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + int arg = 1; /* current argument to pack */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + lua_pushnil(L); /* mark to separate arguments from string buffer */ + luaL_buffinit(L, &b); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + totalsize += ntoalign + size; + while (ntoalign-- > 0) + luaL_addchar(&b, LUAL_PACKPADBYTE); /* fill alignment */ + arg++; + switch (opt) { + case Kint: { /* signed integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) { /* need overflow check? */ + lua_Integer lim = (lua_Integer)1 << ((size * NB) - 1); + luaL_argcheck(L, -lim <= n && n < lim, arg, "integer overflow"); + } + packint(&b, (lua_Unsigned)n, h.islittle, size, (n < 0)); + break; + } + case Kuint: { /* unsigned integers */ + lua_Integer n = luaL_checkinteger(L, arg); + if (size < SZINT) /* need overflow check? */ + luaL_argcheck(L, (lua_Unsigned)n < ((lua_Unsigned)1 << (size * NB)), + arg, "unsigned overflow"); + packint(&b, (lua_Unsigned)n, h.islittle, size, 0); + break; + } + case Kfloat: { /* floating-point options */ + volatile Ftypes u; + char *buff = luaL_prepbuffsize(&b, size); + lua_Number n = luaL_checknumber(L, arg); /* get argument */ + if (size == sizeof(u.f)) u.f = (float)n; /* copy it into 'u' */ + else if (size == sizeof(u.d)) u.d = (double)n; + else u.n = n; + /* move 'u' to final result, correcting endianness if needed */ + copywithendian(buff, u.buff, size, h.islittle); + luaL_addsize(&b, size); + break; + } + case Kchar: { /* fixed-size string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, len <= (size_t)size, arg, + "string longer than given size"); + luaL_addlstring(&b, s, len); /* add string */ + while (len++ < (size_t)size) /* pad extra space */ + luaL_addchar(&b, LUAL_PACKPADBYTE); + break; + } + case Kstring: { /* strings with length count */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, size >= (int)sizeof(size_t) || + len < ((size_t)1 << (size * NB)), + arg, "string length does not fit in given size"); + packint(&b, (lua_Unsigned)len, h.islittle, size, 0); /* pack length */ + luaL_addlstring(&b, s, len); + totalsize += len; + break; + } + case Kzstr: { /* zero-terminated string */ + size_t len; + const char *s = luaL_checklstring(L, arg, &len); + luaL_argcheck(L, strlen(s) == len, arg, "string contains zeros"); + luaL_addlstring(&b, s, len); + luaL_addchar(&b, '\0'); /* add zero at the end */ + totalsize += len + 1; + break; + } + case Kpadding: luaL_addchar(&b, LUAL_PACKPADBYTE); /* FALLTHROUGH */ + case Kpaddalign: case Knop: + arg--; /* undo increment */ + break; + } + } + luaL_pushresult(&b); + return 1; +} + + +static int str_packsize (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); /* format string */ + size_t totalsize = 0; /* accumulate total size of result */ + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, totalsize, &fmt, &size, &ntoalign); + luaL_argcheck(L, opt != Kstring && opt != Kzstr, 1, + "variable-length format"); + size += ntoalign; /* total space used by option */ + luaL_argcheck(L, totalsize <= MAXSIZE - size, 1, + "format result too large"); + totalsize += size; + } + lua_pushinteger(L, (lua_Integer)totalsize); + return 1; +} + + +/* +** Unpack an integer with 'size' bytes and 'islittle' endianness. +** If size is smaller than the size of a Lua integer and integer +** is signed, must do sign extension (propagating the sign to the +** higher bits); if size is larger than the size of a Lua integer, +** it must check the unread bytes to see whether they do not cause an +** overflow. +*/ +static lua_Integer unpackint (lua_State *L, const char *str, + int islittle, int size, int issigned) { + lua_Unsigned res = 0; + int i; + int limit = (size <= SZINT) ? size : SZINT; + for (i = limit - 1; i >= 0; i--) { + res <<= NB; + res |= (lua_Unsigned)(unsigned char)str[islittle ? i : size - 1 - i]; + } + if (size < SZINT) { /* real size smaller than lua_Integer? */ + if (issigned) { /* needs sign extension? */ + lua_Unsigned mask = (lua_Unsigned)1 << (size*NB - 1); + res = ((res ^ mask) - mask); /* do sign extension */ + } + } + else if (size > SZINT) { /* must check unread bytes */ + int mask = (!issigned || (lua_Integer)res >= 0) ? 0 : MC; + for (i = limit; i < size; i++) { + if ((unsigned char)str[islittle ? i : size - 1 - i] != mask) + luaL_error(L, "%d-byte integer does not fit into Lua Integer", size); + } + } + return (lua_Integer)res; +} + + +static int str_unpack (lua_State *L) { + Header h; + const char *fmt = luaL_checkstring(L, 1); + size_t ld; + const char *data = luaL_checklstring(L, 2, &ld); + size_t pos = posrelatI(luaL_optinteger(L, 3, 1), ld) - 1; + int n = 0; /* number of results */ + luaL_argcheck(L, pos <= ld, 3, "initial position out of string"); + initheader(L, &h); + while (*fmt != '\0') { + int size, ntoalign; + KOption opt = getdetails(&h, pos, &fmt, &size, &ntoalign); + luaL_argcheck(L, (size_t)ntoalign + size <= ld - pos, 2, + "data string too short"); + pos += ntoalign; /* skip alignment */ + /* stack space for item + next position */ + luaL_checkstack(L, 2, "too many results"); + n++; + switch (opt) { + case Kint: + case Kuint: { + lua_Integer res = unpackint(L, data + pos, h.islittle, size, + (opt == Kint)); + lua_pushinteger(L, res); + break; + } + case Kfloat: { + volatile Ftypes u; + lua_Number num; + copywithendian(u.buff, data + pos, size, h.islittle); + if (size == sizeof(u.f)) num = (lua_Number)u.f; + else if (size == sizeof(u.d)) num = (lua_Number)u.d; + else num = u.n; + lua_pushnumber(L, num); + break; + } + case Kchar: { + lua_pushlstring(L, data + pos, size); + break; + } + case Kstring: { + size_t len = (size_t)unpackint(L, data + pos, h.islittle, size, 0); + luaL_argcheck(L, len <= ld - pos - size, 2, "data string too short"); + lua_pushlstring(L, data + pos + size, len); + pos += len; /* skip string */ + break; + } + case Kzstr: { + size_t len = (int)strlen(data + pos); + luaL_argcheck(L, pos + len < ld, 2, + "unfinished string for format 'z'"); + lua_pushlstring(L, data + pos, len); + pos += len + 1; /* skip string plus final '\0' */ + break; + } + case Kpaddalign: case Kpadding: case Knop: + n--; /* undo increment */ + break; + } + pos += size; + } + lua_pushinteger(L, pos + 1); /* next position */ + return n + 1; +} + +/* }====================================================== */ + + +static const luaL_Reg strlib[] = { + {"byte", str_byte}, + {"char", str_char}, + {"dump", str_dump}, + {"find", str_find}, + {"format", str_format}, + {"gmatch", gmatch}, + {"gsub", str_gsub}, + {"len", str_len}, + {"lower", str_lower}, + {"match", str_match}, + {"rep", str_rep}, + {"reverse", str_reverse}, + {"sub", str_sub}, + {"upper", str_upper}, + {"pack", str_pack}, + {"packsize", str_packsize}, + {"unpack", str_unpack}, + {NULL, NULL} +}; + + +static void createmetatable (lua_State *L) { + /* table to be metatable for strings */ + luaL_newlibtable(L, stringmetamethods); + luaL_setfuncs(L, stringmetamethods, 0); + lua_pushliteral(L, ""); /* dummy string */ + lua_pushvalue(L, -2); /* copy table */ + lua_setmetatable(L, -2); /* set table as metatable for strings */ + lua_pop(L, 1); /* pop dummy string */ + lua_pushvalue(L, -2); /* get string library */ + lua_setfield(L, -2, "__index"); /* metatable.__index = string */ + lua_pop(L, 1); /* pop metatable */ +} + + +/* +** Open string library +*/ +LUAMOD_API int luaopen_string (lua_State *L) { + luaL_newlib(L, strlib); + createmetatable(L); + return 1; +} + diff --git a/lua-5.4.0/src/ltable.c b/lua-5.4.0/src/ltable.c new file mode 100644 index 0000000..d7eb69a --- /dev/null +++ b/lua-5.4.0/src/ltable.c @@ -0,0 +1,924 @@ +/* +** $Id: ltable.c $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#define ltable_c +#define LUA_CORE + +#include "lprefix.h" + + +/* +** Implementation of tables (aka arrays, objects, or hash tables). +** Tables keep its elements in two parts: an array part and a hash part. +** Non-negative integer keys are all candidates to be kept in the array +** part. The actual size of the array is the largest 'n' such that +** more than half the slots between 1 and n are in use. +** Hash uses a mix of chained scatter table with Brent's variation. +** A main invariant of these tables is that, if an element is not +** in its main position (i.e. the 'original' position that its hash gives +** to it), then the colliding element is in its own main position. +** Hence even when the load factor reaches 100%, performance remains good. +*/ + +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "lvm.h" + + +/* +** MAXABITS is the largest integer such that MAXASIZE fits in an +** unsigned int. +*/ +#define MAXABITS cast_int(sizeof(int) * CHAR_BIT - 1) + + +/* +** MAXASIZE is the maximum size of the array part. It is the minimum +** between 2^MAXABITS and the maximum size that, measured in bytes, +** fits in a 'size_t'. +*/ +#define MAXASIZE luaM_limitN(1u << MAXABITS, TValue) + +/* +** MAXHBITS is the largest integer such that 2^MAXHBITS fits in a +** signed int. +*/ +#define MAXHBITS (MAXABITS - 1) + + +/* +** MAXHSIZE is the maximum size of the hash part. It is the minimum +** between 2^MAXHBITS and the maximum size such that, measured in bytes, +** it fits in a 'size_t'. +*/ +#define MAXHSIZE luaM_limitN(1u << MAXHBITS, Node) + + +#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) + +#define hashstr(t,str) hashpow2(t, (str)->hash) +#define hashboolean(t,p) hashpow2(t, p) +#define hashint(t,i) hashpow2(t, i) + + +/* +** for some types, it is better to avoid modulus by power of 2, as +** they tend to have many 2 factors. +*/ +#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) + + +#define hashpointer(t,p) hashmod(t, point2uint(p)) + + +#define dummynode (&dummynode_) + +static const Node dummynode_ = { + {{NULL}, LUA_VEMPTY, /* value's value and type */ + LUA_VNIL, 0, {NULL}} /* key type, next, and key value */ +}; + + +static const TValue absentkey = {ABSTKEYCONSTANT}; + + + +/* +** Hash for floating-point numbers. +** The main computation should be just +** n = frexp(n, &i); return (n * INT_MAX) + i +** but there are some numerical subtleties. +** In a two-complement representation, INT_MAX does not has an exact +** representation as a float, but INT_MIN does; because the absolute +** value of 'frexp' is smaller than 1 (unless 'n' is inf/NaN), the +** absolute value of the product 'frexp * -INT_MIN' is smaller or equal +** to INT_MAX. Next, the use of 'unsigned int' avoids overflows when +** adding 'i'; the use of '~u' (instead of '-u') avoids problems with +** INT_MIN. +*/ +#if !defined(l_hashfloat) +static int l_hashfloat (lua_Number n) { + int i; + lua_Integer ni; + n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); + if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */ + lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == cast_num(HUGE_VAL)); + return 0; + } + else { /* normal case */ + unsigned int u = cast_uint(i) + cast_uint(ni); + return cast_int(u <= cast_uint(INT_MAX) ? u : ~u); + } +} +#endif + + +/* +** returns the 'main' position of an element in a table (that is, +** the index of its hash value). The key comes broken (tag in 'ktt' +** and value in 'vkl') so that we can call it on keys inserted into +** nodes. +*/ +static Node *mainposition (const Table *t, int ktt, const Value *kvl) { + switch (withvariant(ktt)) { + case LUA_VNUMINT: + return hashint(t, ivalueraw(*kvl)); + case LUA_VNUMFLT: + return hashmod(t, l_hashfloat(fltvalueraw(*kvl))); + case LUA_VSHRSTR: + return hashstr(t, tsvalueraw(*kvl)); + case LUA_VLNGSTR: + return hashpow2(t, luaS_hashlongstr(tsvalueraw(*kvl))); + case LUA_VFALSE: + return hashboolean(t, 0); + case LUA_VTRUE: + return hashboolean(t, 1); + case LUA_VLIGHTUSERDATA: + return hashpointer(t, pvalueraw(*kvl)); + case LUA_VLCF: + return hashpointer(t, fvalueraw(*kvl)); + default: + return hashpointer(t, gcvalueraw(*kvl)); + } +} + + +/* +** Returns the main position of an element given as a 'TValue' +*/ +static Node *mainpositionTV (const Table *t, const TValue *key) { + return mainposition(t, rawtt(key), valraw(key)); +} + + +/* +** Check whether key 'k1' is equal to the key in node 'n2'. +** This equality is raw, so there are no metamethods. Floats +** with integer values have been normalized, so integers cannot +** be equal to floats. It is assumed that 'eqshrstr' is simply +** pointer equality, so that short strings are handled in the +** default case. +*/ +static int equalkey (const TValue *k1, const Node *n2) { + if (rawtt(k1) != keytt(n2)) /* not the same variants? */ + return 0; /* cannot be same key */ + switch (ttypetag(k1)) { + case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: + return 1; + case LUA_VNUMINT: + return (ivalue(k1) == keyival(n2)); + case LUA_VNUMFLT: + return luai_numeq(fltvalue(k1), fltvalueraw(keyval(n2))); + case LUA_VLIGHTUSERDATA: + return pvalue(k1) == pvalueraw(keyval(n2)); + case LUA_VLCF: + return fvalue(k1) == fvalueraw(keyval(n2)); + case LUA_VLNGSTR: + return luaS_eqlngstr(tsvalue(k1), keystrval(n2)); + default: + return gcvalue(k1) == gcvalueraw(keyval(n2)); + } +} + + +/* +** True if value of 'alimit' is equal to the real size of the array +** part of table 't'. (Otherwise, the array part must be larger than +** 'alimit'.) +*/ +#define limitequalsasize(t) (isrealasize(t) || ispow2((t)->alimit)) + + +/* +** Returns the real size of the 'array' array +*/ +LUAI_FUNC unsigned int luaH_realasize (const Table *t) { + if (limitequalsasize(t)) + return t->alimit; /* this is the size */ + else { + unsigned int size = t->alimit; + /* compute the smallest power of 2 not smaller than 'n' */ + size |= (size >> 1); + size |= (size >> 2); + size |= (size >> 4); + size |= (size >> 8); + size |= (size >> 16); +#if (UINT_MAX >> 30) > 3 + size |= (size >> 32); /* unsigned int has more than 32 bits */ +#endif + size++; + lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size); + return size; + } +} + + +/* +** Check whether real size of the array is a power of 2. +** (If it is not, 'alimit' cannot be changed to any other value +** without changing the real size.) +*/ +static int ispow2realasize (const Table *t) { + return (!isrealasize(t) || ispow2(t->alimit)); +} + + +static unsigned int setlimittosize (Table *t) { + t->alimit = luaH_realasize(t); + setrealasize(t); + return t->alimit; +} + + +#define limitasasize(t) check_exp(isrealasize(t), t->alimit) + + + +/* +** "Generic" get version. (Not that generic: not valid for integers, +** which may be in array part, nor for floats with integral values.) +*/ +static const TValue *getgeneric (Table *t, const TValue *key) { + Node *n = mainpositionTV(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (equalkey(key, n)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +/* +** returns the index for 'k' if 'k' is an appropriate key to live in +** the array part of a table, 0 otherwise. +*/ +static unsigned int arrayindex (lua_Integer k) { + if (l_castS2U(k) - 1u < MAXASIZE) /* 'k' in [1, MAXASIZE]? */ + return cast_uint(k); /* 'key' is an appropriate array index */ + else + return 0; +} + + +/* +** returns the index of a 'key' for table traversals. First goes all +** elements in the array part, then elements in the hash part. The +** beginning of a traversal is signaled by 0. +*/ +static unsigned int findindex (lua_State *L, Table *t, TValue *key, + unsigned int asize) { + unsigned int i; + if (ttisnil(key)) return 0; /* first iteration */ + i = ttisinteger(key) ? arrayindex(ivalue(key)) : 0; + if (i - 1u < asize) /* is 'key' inside array part? */ + return i; /* yes; that's the index */ + else { + const TValue *n = getgeneric(t, key); + if (unlikely(isabstkey(n))) + luaG_runerror(L, "invalid key to 'next'"); /* key not found */ + i = cast_int(nodefromval(n) - gnode(t, 0)); /* key index in hash table */ + /* hash elements are numbered after array ones */ + return (i + 1) + asize; + } +} + + +int luaH_next (lua_State *L, Table *t, StkId key) { + unsigned int asize = luaH_realasize(t); + unsigned int i = findindex(L, t, s2v(key), asize); /* find original key */ + for (; i < asize; i++) { /* try first array part */ + if (!isempty(&t->array[i])) { /* a non-empty entry? */ + setivalue(s2v(key), i + 1); + setobj2s(L, key + 1, &t->array[i]); + return 1; + } + } + for (i -= asize; cast_int(i) < sizenode(t); i++) { /* hash part */ + if (!isempty(gval(gnode(t, i)))) { /* a non-empty entry? */ + Node *n = gnode(t, i); + getnodekey(L, s2v(key), n); + setobj2s(L, key + 1, gval(n)); + return 1; + } + } + return 0; /* no more elements */ +} + + +static void freehash (lua_State *L, Table *t) { + if (!isdummy(t)) + luaM_freearray(L, t->node, cast_sizet(sizenode(t))); +} + + +/* +** {============================================================= +** Rehash +** ============================================================== +*/ + +/* +** Compute the optimal size for the array part of table 't'. 'nums' is a +** "count array" where 'nums[i]' is the number of integers in the table +** between 2^(i - 1) + 1 and 2^i. 'pna' enters with the total number of +** integer keys in the table and leaves with the number of keys that +** will go to the array part; return the optimal size. (The condition +** 'twotoi > 0' in the for loop stops the loop if 'twotoi' overflows.) +*/ +static unsigned int computesizes (unsigned int nums[], unsigned int *pna) { + int i; + unsigned int twotoi; /* 2^i (candidate for optimal size) */ + unsigned int a = 0; /* number of elements smaller than 2^i */ + unsigned int na = 0; /* number of elements to go to array part */ + unsigned int optimal = 0; /* optimal size for array part */ + /* loop while keys can fill more than half of total size */ + for (i = 0, twotoi = 1; + twotoi > 0 && *pna > twotoi / 2; + i++, twotoi *= 2) { + a += nums[i]; + if (a > twotoi/2) { /* more than half elements present? */ + optimal = twotoi; /* optimal size (till now) */ + na = a; /* all elements up to 'optimal' will go to array part */ + } + } + lua_assert((optimal == 0 || optimal / 2 < na) && na <= optimal); + *pna = na; + return optimal; +} + + +static int countint (lua_Integer key, unsigned int *nums) { + unsigned int k = arrayindex(key); + if (k != 0) { /* is 'key' an appropriate array index? */ + nums[luaO_ceillog2(k)]++; /* count as such */ + return 1; + } + else + return 0; +} + + +/* +** Count keys in array part of table 't': Fill 'nums[i]' with +** number of keys that will go into corresponding slice and return +** total number of non-nil keys. +*/ +static unsigned int numusearray (const Table *t, unsigned int *nums) { + int lg; + unsigned int ttlg; /* 2^lg */ + unsigned int ause = 0; /* summation of 'nums' */ + unsigned int i = 1; /* count to traverse all array keys */ + unsigned int asize = limitasasize(t); /* real array size */ + /* traverse each slice */ + for (lg = 0, ttlg = 1; lg <= MAXABITS; lg++, ttlg *= 2) { + unsigned int lc = 0; /* counter */ + unsigned int lim = ttlg; + if (lim > asize) { + lim = asize; /* adjust upper limit */ + if (i > lim) + break; /* no more elements to count */ + } + /* count elements in range (2^(lg - 1), 2^lg] */ + for (; i <= lim; i++) { + if (!isempty(&t->array[i-1])) + lc++; + } + nums[lg] += lc; + ause += lc; + } + return ause; +} + + +static int numusehash (const Table *t, unsigned int *nums, unsigned int *pna) { + int totaluse = 0; /* total number of elements */ + int ause = 0; /* elements added to 'nums' (can go to array part) */ + int i = sizenode(t); + while (i--) { + Node *n = &t->node[i]; + if (!isempty(gval(n))) { + if (keyisinteger(n)) + ause += countint(keyival(n), nums); + totaluse++; + } + } + *pna += ause; + return totaluse; +} + + +/* +** Creates an array for the hash part of a table with the given +** size, or reuses the dummy node if size is zero. +** The computation for size overflow is in two steps: the first +** comparison ensures that the shift in the second one does not +** overflow. +*/ +static void setnodevector (lua_State *L, Table *t, unsigned int size) { + if (size == 0) { /* no elements to hash part? */ + t->node = cast(Node *, dummynode); /* use common 'dummynode' */ + t->lsizenode = 0; + t->lastfree = NULL; /* signal that it is using dummy node */ + } + else { + int i; + int lsize = luaO_ceillog2(size); + if (lsize > MAXHBITS || (1u << lsize) > MAXHSIZE) + luaG_runerror(L, "table overflow"); + size = twoto(lsize); + t->node = luaM_newvector(L, size, Node); + for (i = 0; i < (int)size; i++) { + Node *n = gnode(t, i); + gnext(n) = 0; + setnilkey(n); + setempty(gval(n)); + } + t->lsizenode = cast_byte(lsize); + t->lastfree = gnode(t, size); /* all positions are free */ + } +} + + +/* +** (Re)insert all elements from the hash part of 'ot' into table 't'. +*/ +static void reinsert (lua_State *L, Table *ot, Table *t) { + int j; + int size = sizenode(ot); + for (j = 0; j < size; j++) { + Node *old = gnode(ot, j); + if (!isempty(gval(old))) { + /* doesn't need barrier/invalidate cache, as entry was + already present in the table */ + TValue k; + getnodekey(L, &k, old); + setobjt2t(L, luaH_set(L, t, &k), gval(old)); + } + } +} + + +/* +** Exchange the hash part of 't1' and 't2'. +*/ +static void exchangehashpart (Table *t1, Table *t2) { + lu_byte lsizenode = t1->lsizenode; + Node *node = t1->node; + Node *lastfree = t1->lastfree; + t1->lsizenode = t2->lsizenode; + t1->node = t2->node; + t1->lastfree = t2->lastfree; + t2->lsizenode = lsizenode; + t2->node = node; + t2->lastfree = lastfree; +} + + +/* +** Resize table 't' for the new given sizes. Both allocations (for +** the hash part and for the array part) can fail, which creates some +** subtleties. If the first allocation, for the hash part, fails, an +** error is raised and that is it. Otherwise, it copies the elements from +** the shrinking part of the array (if it is shrinking) into the new +** hash. Then it reallocates the array part. If that fails, the table +** is in its original state; the function frees the new hash part and then +** raises the allocation error. Otherwise, it sets the new hash part +** into the table, initializes the new part of the array (if any) with +** nils and reinserts the elements of the old hash back into the new +** parts of the table. +*/ +void luaH_resize (lua_State *L, Table *t, unsigned int newasize, + unsigned int nhsize) { + unsigned int i; + Table newt; /* to keep the new hash part */ + unsigned int oldasize = setlimittosize(t); + TValue *newarray; + /* create new hash part with appropriate size into 'newt' */ + setnodevector(L, &newt, nhsize); + if (newasize < oldasize) { /* will array shrink? */ + t->alimit = newasize; /* pretend array has new size... */ + exchangehashpart(t, &newt); /* and new hash */ + /* re-insert into the new hash the elements from vanishing slice */ + for (i = newasize; i < oldasize; i++) { + if (!isempty(&t->array[i])) + luaH_setint(L, t, i + 1, &t->array[i]); + } + t->alimit = oldasize; /* restore current size... */ + exchangehashpart(t, &newt); /* and hash (in case of errors) */ + } + /* allocate new array */ + newarray = luaM_reallocvector(L, t->array, oldasize, newasize, TValue); + if (unlikely(newarray == NULL && newasize > 0)) { /* allocation failed? */ + freehash(L, &newt); /* release new hash part */ + luaM_error(L); /* raise error (with array unchanged) */ + } + /* allocation ok; initialize new part of the array */ + exchangehashpart(t, &newt); /* 't' has the new hash ('newt' has the old) */ + t->array = newarray; /* set new array part */ + t->alimit = newasize; + for (i = oldasize; i < newasize; i++) /* clear new slice of the array */ + setempty(&t->array[i]); + /* re-insert elements from old hash part into new parts */ + reinsert(L, &newt, t); /* 'newt' now has the old hash */ + freehash(L, &newt); /* free old hash part */ +} + + +void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize) { + int nsize = allocsizenode(t); + luaH_resize(L, t, nasize, nsize); +} + +/* +** nums[i] = number of keys 'k' where 2^(i - 1) < k <= 2^i +*/ +static void rehash (lua_State *L, Table *t, const TValue *ek) { + unsigned int asize; /* optimal size for array part */ + unsigned int na; /* number of keys in the array part */ + unsigned int nums[MAXABITS + 1]; + int i; + int totaluse; + for (i = 0; i <= MAXABITS; i++) nums[i] = 0; /* reset counts */ + setlimittosize(t); + na = numusearray(t, nums); /* count keys in array part */ + totaluse = na; /* all those keys are integer keys */ + totaluse += numusehash(t, nums, &na); /* count keys in hash part */ + /* count extra key */ + if (ttisinteger(ek)) + na += countint(ivalue(ek), nums); + totaluse++; + /* compute new size for array part */ + asize = computesizes(nums, &na); + /* resize the table to new computed sizes */ + luaH_resize(L, t, asize, totaluse - na); +} + + + +/* +** }============================================================= +*/ + + +Table *luaH_new (lua_State *L) { + GCObject *o = luaC_newobj(L, LUA_VTABLE, sizeof(Table)); + Table *t = gco2t(o); + t->metatable = NULL; + t->flags = cast_byte(~0); + t->array = NULL; + t->alimit = 0; + setnodevector(L, t, 0); + return t; +} + + +void luaH_free (lua_State *L, Table *t) { + freehash(L, t); + luaM_freearray(L, t->array, luaH_realasize(t)); + luaM_free(L, t); +} + + +static Node *getfreepos (Table *t) { + if (!isdummy(t)) { + while (t->lastfree > t->node) { + t->lastfree--; + if (keyisnil(t->lastfree)) + return t->lastfree; + } + } + return NULL; /* could not find a free place */ +} + + + +/* +** inserts a new key into a hash table; first, check whether key's main +** position is free. If not, check whether colliding node is in its main +** position or not: if it is not, move colliding node to an empty place and +** put new key in its main position; otherwise (colliding node is in its main +** position), new key goes to an empty position. +*/ +TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key) { + Node *mp; + TValue aux; + if (unlikely(ttisnil(key))) + luaG_runerror(L, "table index is nil"); + else if (ttisfloat(key)) { + lua_Number f = fltvalue(key); + lua_Integer k; + if (luaV_flttointeger(f, &k, F2Ieq)) { /* does key fit in an integer? */ + setivalue(&aux, k); + key = &aux; /* insert it as an integer */ + } + else if (unlikely(luai_numisnan(f))) + luaG_runerror(L, "table index is NaN"); + } + mp = mainpositionTV(t, key); + if (!isempty(gval(mp)) || isdummy(t)) { /* main position is taken? */ + Node *othern; + Node *f = getfreepos(t); /* get a free place */ + if (f == NULL) { /* cannot find a free place? */ + rehash(L, t, key); /* grow table */ + /* whatever called 'newkey' takes care of TM cache */ + return luaH_set(L, t, key); /* insert key into grown table */ + } + lua_assert(!isdummy(t)); + othern = mainposition(t, keytt(mp), &keyval(mp)); + if (othern != mp) { /* is colliding node out of its main position? */ + /* yes; move colliding node into free position */ + while (othern + gnext(othern) != mp) /* find previous */ + othern += gnext(othern); + gnext(othern) = cast_int(f - othern); /* rechain to point to 'f' */ + *f = *mp; /* copy colliding node into free pos. (mp->next also goes) */ + if (gnext(mp) != 0) { + gnext(f) += cast_int(mp - f); /* correct 'next' */ + gnext(mp) = 0; /* now 'mp' is free */ + } + setempty(gval(mp)); + } + else { /* colliding node is in its own main position */ + /* new node will go into free position */ + if (gnext(mp) != 0) + gnext(f) = cast_int((mp + gnext(mp)) - f); /* chain new position */ + else lua_assert(gnext(f) == 0); + gnext(mp) = cast_int(f - mp); + mp = f; + } + } + setnodekey(L, mp, key); + luaC_barrierback(L, obj2gco(t), key); + lua_assert(isempty(gval(mp))); + return gval(mp); +} + + +/* +** Search function for integers. If integer is inside 'alimit', get it +** directly from the array part. Otherwise, if 'alimit' is not equal to +** the real size of the array, key still can be in the array part. In +** this case, try to avoid a call to 'luaH_realasize' when key is just +** one more than the limit (so that it can be incremented without +** changing the real size of the array). +*/ +const TValue *luaH_getint (Table *t, lua_Integer key) { + if (l_castS2U(key) - 1u < t->alimit) /* 'key' in [1, t->alimit]? */ + return &t->array[key - 1]; + else if (!limitequalsasize(t) && /* key still may be in the array part? */ + (l_castS2U(key) == t->alimit + 1 || + l_castS2U(key) - 1u < luaH_realasize(t))) { + t->alimit = cast_uint(key); /* probably '#t' is here now */ + return &t->array[key - 1]; + } + else { + Node *n = hashint(t, key); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisinteger(n) && keyival(n) == key) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) break; + n += nx; + } + } + return &absentkey; + } +} + + +/* +** search function for short strings +*/ +const TValue *luaH_getshortstr (Table *t, TString *key) { + Node *n = hashstr(t, key); + lua_assert(key->tt == LUA_VSHRSTR); + for (;;) { /* check whether 'key' is somewhere in the chain */ + if (keyisshrstr(n) && eqshrstr(keystrval(n), key)) + return gval(n); /* that's it */ + else { + int nx = gnext(n); + if (nx == 0) + return &absentkey; /* not found */ + n += nx; + } + } +} + + +const TValue *luaH_getstr (Table *t, TString *key) { + if (key->tt == LUA_VSHRSTR) + return luaH_getshortstr(t, key); + else { /* for long strings, use generic case */ + TValue ko; + setsvalue(cast(lua_State *, NULL), &ko, key); + return getgeneric(t, &ko); + } +} + + +/* +** main search function +*/ +const TValue *luaH_get (Table *t, const TValue *key) { + switch (ttypetag(key)) { + case LUA_VSHRSTR: return luaH_getshortstr(t, tsvalue(key)); + case LUA_VNUMINT: return luaH_getint(t, ivalue(key)); + case LUA_VNIL: return &absentkey; + case LUA_VNUMFLT: { + lua_Integer k; + if (luaV_flttointeger(fltvalue(key), &k, F2Ieq)) /* integral index? */ + return luaH_getint(t, k); /* use specialized version */ + /* else... */ + } /* FALLTHROUGH */ + default: + return getgeneric(t, key); + } +} + + +/* +** beware: when using this function you probably need to check a GC +** barrier and invalidate the TM cache. +*/ +TValue *luaH_set (lua_State *L, Table *t, const TValue *key) { + const TValue *p = luaH_get(t, key); + if (!isabstkey(p)) + return cast(TValue *, p); + else return luaH_newkey(L, t, key); +} + + +void luaH_setint (lua_State *L, Table *t, lua_Integer key, TValue *value) { + const TValue *p = luaH_getint(t, key); + TValue *cell; + if (!isabstkey(p)) + cell = cast(TValue *, p); + else { + TValue k; + setivalue(&k, key); + cell = luaH_newkey(L, t, &k); + } + setobj2t(L, cell, value); +} + + +/* +** Try to find a boundary in the hash part of table 't'. From the +** caller, we know that 'j' is zero or present and that 'j + 1' is +** present. We want to find a larger key that is absent from the +** table, so that we can do a binary search between the two keys to +** find a boundary. We keep doubling 'j' until we get an absent index. +** If the doubling would overflow, we try LUA_MAXINTEGER. If it is +** absent, we are ready for the binary search. ('j', being max integer, +** is larger or equal to 'i', but it cannot be equal because it is +** absent while 'i' is present; so 'j > i'.) Otherwise, 'j' is a +** boundary. ('j + 1' cannot be a present integer key because it is +** not a valid integer in Lua.) +*/ +static lua_Unsigned hash_search (Table *t, lua_Unsigned j) { + lua_Unsigned i; + if (j == 0) j++; /* the caller ensures 'j + 1' is present */ + do { + i = j; /* 'i' is a present index */ + if (j <= l_castS2U(LUA_MAXINTEGER) / 2) + j *= 2; + else { + j = LUA_MAXINTEGER; + if (isempty(luaH_getint(t, j))) /* t[j] not present? */ + break; /* 'j' now is an absent index */ + else /* weird case */ + return j; /* well, max integer is a boundary... */ + } + } while (!isempty(luaH_getint(t, j))); /* repeat until an absent t[j] */ + /* i < j && t[i] present && t[j] absent */ + while (j - i > 1u) { /* do a binary search between them */ + lua_Unsigned m = (i + j) / 2; + if (isempty(luaH_getint(t, m))) j = m; + else i = m; + } + return i; +} + + +static unsigned int binsearch (const TValue *array, unsigned int i, + unsigned int j) { + while (j - i > 1u) { /* binary search */ + unsigned int m = (i + j) / 2; + if (isempty(&array[m - 1])) j = m; + else i = m; + } + return i; +} + + +/* +** Try to find a boundary in table 't'. (A 'boundary' is an integer index +** such that t[i] is present and t[i+1] is absent, or 0 if t[1] is absent +** and 'maxinteger' if t[maxinteger] is present.) +** (In the next explanation, we use Lua indices, that is, with base 1. +** The code itself uses base 0 when indexing the array part of the table.) +** The code starts with 'limit = t->alimit', a position in the array +** part that may be a boundary. +** +** (1) If 't[limit]' is empty, there must be a boundary before it. +** As a common case (e.g., after 't[#t]=nil'), check whether 'limit-1' +** is present. If so, it is a boundary. Otherwise, do a binary search +** between 0 and limit to find a boundary. In both cases, try to +** use this boundary as the new 'alimit', as a hint for the next call. +** +** (2) If 't[limit]' is not empty and the array has more elements +** after 'limit', try to find a boundary there. Again, try first +** the special case (which should be quite frequent) where 'limit+1' +** is empty, so that 'limit' is a boundary. Otherwise, check the +** last element of the array part. If it is empty, there must be a +** boundary between the old limit (present) and the last element +** (absent), which is found with a binary search. (This boundary always +** can be a new limit.) +** +** (3) The last case is when there are no elements in the array part +** (limit == 0) or its last element (the new limit) is present. +** In this case, must check the hash part. If there is no hash part +** or 'limit+1' is absent, 'limit' is a boundary. Otherwise, call +** 'hash_search' to find a boundary in the hash part of the table. +** (In those cases, the boundary is not inside the array part, and +** therefore cannot be used as a new limit.) +*/ +lua_Unsigned luaH_getn (Table *t) { + unsigned int limit = t->alimit; + if (limit > 0 && isempty(&t->array[limit - 1])) { /* (1)? */ + /* there must be a boundary before 'limit' */ + if (limit >= 2 && !isempty(&t->array[limit - 2])) { + /* 'limit - 1' is a boundary; can it be a new limit? */ + if (ispow2realasize(t) && !ispow2(limit - 1)) { + t->alimit = limit - 1; + setnorealasize(t); /* now 'alimit' is not the real size */ + } + return limit - 1; + } + else { /* must search for a boundary in [0, limit] */ + unsigned int boundary = binsearch(t->array, 0, limit); + /* can this boundary represent the real size of the array? */ + if (ispow2realasize(t) && boundary > luaH_realasize(t) / 2) { + t->alimit = boundary; /* use it as the new limit */ + setnorealasize(t); + } + return boundary; + } + } + /* 'limit' is zero or present in table */ + if (!limitequalsasize(t)) { /* (2)? */ + /* 'limit' > 0 and array has more elements after 'limit' */ + if (isempty(&t->array[limit])) /* 'limit + 1' is empty? */ + return limit; /* this is the boundary */ + /* else, try last element in the array */ + limit = luaH_realasize(t); + if (isempty(&t->array[limit - 1])) { /* empty? */ + /* there must be a boundary in the array after old limit, + and it must be a valid new limit */ + unsigned int boundary = binsearch(t->array, t->alimit, limit); + t->alimit = boundary; + return boundary; + } + /* else, new limit is present in the table; check the hash part */ + } + /* (3) 'limit' is the last element and either is zero or present in table */ + lua_assert(limit == luaH_realasize(t) && + (limit == 0 || !isempty(&t->array[limit - 1]))); + if (isdummy(t) || isempty(luaH_getint(t, cast(lua_Integer, limit + 1)))) + return limit; /* 'limit + 1' is absent */ + else /* 'limit + 1' is also present */ + return hash_search(t, limit); +} + + + +#if defined(LUA_DEBUG) + +/* export these functions for the test library */ + +Node *luaH_mainposition (const Table *t, const TValue *key) { + return mainpositionTV(t, key); +} + +int luaH_isdummy (const Table *t) { return isdummy(t); } + +#endif diff --git a/lua-5.4.0/src/ltable.h b/lua-5.4.0/src/ltable.h new file mode 100644 index 0000000..ebd7f8e --- /dev/null +++ b/lua-5.4.0/src/ltable.h @@ -0,0 +1,57 @@ +/* +** $Id: ltable.h $ +** Lua tables (hash) +** See Copyright Notice in lua.h +*/ + +#ifndef ltable_h +#define ltable_h + +#include "lobject.h" + + +#define gnode(t,i) (&(t)->node[i]) +#define gval(n) (&(n)->i_val) +#define gnext(n) ((n)->u.next) + + +#define invalidateTMcache(t) ((t)->flags = 0) + + +/* true when 't' is using 'dummynode' as its hash part */ +#define isdummy(t) ((t)->lastfree == NULL) + + +/* allocated size for hash nodes */ +#define allocsizenode(t) (isdummy(t) ? 0 : sizenode(t)) + + +/* returns the Node, given the value of a table entry */ +#define nodefromval(v) cast(Node *, (v)) + + +LUAI_FUNC const TValue *luaH_getint (Table *t, lua_Integer key); +LUAI_FUNC void luaH_setint (lua_State *L, Table *t, lua_Integer key, + TValue *value); +LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key); +LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key); +LUAI_FUNC TValue *luaH_newkey (lua_State *L, Table *t, const TValue *key); +LUAI_FUNC TValue *luaH_set (lua_State *L, Table *t, const TValue *key); +LUAI_FUNC Table *luaH_new (lua_State *L); +LUAI_FUNC void luaH_resize (lua_State *L, Table *t, unsigned int nasize, + unsigned int nhsize); +LUAI_FUNC void luaH_resizearray (lua_State *L, Table *t, unsigned int nasize); +LUAI_FUNC void luaH_free (lua_State *L, Table *t); +LUAI_FUNC int luaH_next (lua_State *L, Table *t, StkId key); +LUAI_FUNC lua_Unsigned luaH_getn (Table *t); +LUAI_FUNC unsigned int luaH_realasize (const Table *t); + + +#if defined(LUA_DEBUG) +LUAI_FUNC Node *luaH_mainposition (const Table *t, const TValue *key); +LUAI_FUNC int luaH_isdummy (const Table *t); +#endif + + +#endif diff --git a/lua-5.4.0/src/ltablib.c b/lua-5.4.0/src/ltablib.c new file mode 100644 index 0000000..d344a47 --- /dev/null +++ b/lua-5.4.0/src/ltablib.c @@ -0,0 +1,428 @@ +/* +** $Id: ltablib.c $ +** Library for Table Manipulation +** See Copyright Notice in lua.h +*/ + +#define ltablib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +/* +** Operations that an object must define to mimic a table +** (some functions only need some of them) +*/ +#define TAB_R 1 /* read */ +#define TAB_W 2 /* write */ +#define TAB_L 4 /* length */ +#define TAB_RW (TAB_R | TAB_W) /* read/write */ + + +#define aux_getn(L,n,w) (checktab(L, n, (w) | TAB_L), luaL_len(L, n)) + + +static int checkfield (lua_State *L, const char *key, int n) { + lua_pushstring(L, key); + return (lua_rawget(L, -n) != LUA_TNIL); +} + + +/* +** Check that 'arg' either is a table or can behave like one (that is, +** has a metatable with the required metamethods) +*/ +static void checktab (lua_State *L, int arg, int what) { + if (lua_type(L, arg) != LUA_TTABLE) { /* is it not a table? */ + int n = 1; /* number of elements to pop */ + if (lua_getmetatable(L, arg) && /* must have metatable */ + (!(what & TAB_R) || checkfield(L, "__index", ++n)) && + (!(what & TAB_W) || checkfield(L, "__newindex", ++n)) && + (!(what & TAB_L) || checkfield(L, "__len", ++n))) { + lua_pop(L, n); /* pop metatable and tested metamethods */ + } + else + luaL_checktype(L, arg, LUA_TTABLE); /* force an error */ + } +} + + +static int tinsert (lua_State *L) { + lua_Integer e = aux_getn(L, 1, TAB_RW) + 1; /* first empty element */ + lua_Integer pos; /* where to insert new element */ + switch (lua_gettop(L)) { + case 2: { /* called with only 2 arguments */ + pos = e; /* insert new element at the end */ + break; + } + case 3: { + lua_Integer i; + pos = luaL_checkinteger(L, 2); /* 2nd argument is the position */ + /* check whether 'pos' is in [1, e] */ + luaL_argcheck(L, (lua_Unsigned)pos - 1u < (lua_Unsigned)e, 2, + "position out of bounds"); + for (i = e; i > pos; i--) { /* move up elements */ + lua_geti(L, 1, i - 1); + lua_seti(L, 1, i); /* t[i] = t[i - 1] */ + } + break; + } + default: { + return luaL_error(L, "wrong number of arguments to 'insert'"); + } + } + lua_seti(L, 1, pos); /* t[pos] = v */ + return 0; +} + + +static int tremove (lua_State *L) { + lua_Integer size = aux_getn(L, 1, TAB_RW); + lua_Integer pos = luaL_optinteger(L, 2, size); + if (pos != size) /* validate 'pos' if given */ + /* check whether 'pos' is in [1, size + 1] */ + luaL_argcheck(L, (lua_Unsigned)pos - 1u <= (lua_Unsigned)size, 1, + "position out of bounds"); + lua_geti(L, 1, pos); /* result = t[pos] */ + for ( ; pos < size; pos++) { + lua_geti(L, 1, pos + 1); + lua_seti(L, 1, pos); /* t[pos] = t[pos + 1] */ + } + lua_pushnil(L); + lua_seti(L, 1, pos); /* remove entry t[pos] */ + return 1; +} + + +/* +** Copy elements (1[f], ..., 1[e]) into (tt[t], tt[t+1], ...). Whenever +** possible, copy in increasing order, which is better for rehashing. +** "possible" means destination after original range, or smaller +** than origin, or copying to another table. +*/ +static int tmove (lua_State *L) { + lua_Integer f = luaL_checkinteger(L, 2); + lua_Integer e = luaL_checkinteger(L, 3); + lua_Integer t = luaL_checkinteger(L, 4); + int tt = !lua_isnoneornil(L, 5) ? 5 : 1; /* destination table */ + checktab(L, 1, TAB_R); + checktab(L, tt, TAB_W); + if (e >= f) { /* otherwise, nothing to move */ + lua_Integer n, i; + luaL_argcheck(L, f > 0 || e < LUA_MAXINTEGER + f, 3, + "too many elements to move"); + n = e - f + 1; /* number of elements to move */ + luaL_argcheck(L, t <= LUA_MAXINTEGER - n + 1, 4, + "destination wrap around"); + if (t > e || t <= f || (tt != 1 && !lua_compare(L, 1, tt, LUA_OPEQ))) { + for (i = 0; i < n; i++) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + else { + for (i = n - 1; i >= 0; i--) { + lua_geti(L, 1, f + i); + lua_seti(L, tt, t + i); + } + } + } + lua_pushvalue(L, tt); /* return destination table */ + return 1; +} + + +static void addfield (lua_State *L, luaL_Buffer *b, lua_Integer i) { + lua_geti(L, 1, i); + if (!lua_isstring(L, -1)) + luaL_error(L, "invalid value (%s) at index %d in table for 'concat'", + luaL_typename(L, -1), i); + luaL_addvalue(b); +} + + +static int tconcat (lua_State *L) { + luaL_Buffer b; + lua_Integer last = aux_getn(L, 1, TAB_R); + size_t lsep; + const char *sep = luaL_optlstring(L, 2, "", &lsep); + lua_Integer i = luaL_optinteger(L, 3, 1); + last = luaL_optinteger(L, 4, last); + luaL_buffinit(L, &b); + for (; i < last; i++) { + addfield(L, &b, i); + luaL_addlstring(&b, sep, lsep); + } + if (i == last) /* add last value (if interval was not empty) */ + addfield(L, &b, i); + luaL_pushresult(&b); + return 1; +} + + +/* +** {====================================================== +** Pack/unpack +** ======================================================= +*/ + +static int tpack (lua_State *L) { + int i; + int n = lua_gettop(L); /* number of elements to pack */ + lua_createtable(L, n, 1); /* create result table */ + lua_insert(L, 1); /* put it at index 1 */ + for (i = n; i >= 1; i--) /* assign elements */ + lua_seti(L, 1, i); + lua_pushinteger(L, n); + lua_setfield(L, 1, "n"); /* t.n = number of elements */ + return 1; /* return table */ +} + + +static int tunpack (lua_State *L) { + lua_Unsigned n; + lua_Integer i = luaL_optinteger(L, 2, 1); + lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1)); + if (i > e) return 0; /* empty range */ + n = (lua_Unsigned)e - i; /* number of elements minus 1 (avoid overflows) */ + if (n >= (unsigned int)INT_MAX || !lua_checkstack(L, (int)(++n))) + return luaL_error(L, "too many results to unpack"); + for (; i < e; i++) { /* push arg[i..e - 1] (to avoid overflows) */ + lua_geti(L, 1, i); + } + lua_geti(L, 1, e); /* push last element */ + return (int)n; +} + +/* }====================================================== */ + + + +/* +** {====================================================== +** Quicksort +** (based on 'Algorithms in MODULA-3', Robert Sedgewick; +** Addison-Wesley, 1993.) +** ======================================================= +*/ + + +/* type for array indices */ +typedef unsigned int IdxT; + + +/* +** Produce a "random" 'unsigned int' to randomize pivot choice. This +** macro is used only when 'sort' detects a big imbalance in the result +** of a partition. (If you don't want/need this "randomness", ~0 is a +** good choice.) +*/ +#if !defined(l_randomizePivot) /* { */ + +#include + +/* size of 'e' measured in number of 'unsigned int's */ +#define sof(e) (sizeof(e) / sizeof(unsigned int)) + +/* +** Use 'time' and 'clock' as sources of "randomness". Because we don't +** know the types 'clock_t' and 'time_t', we cannot cast them to +** anything without risking overflows. A safe way to use their values +** is to copy them to an array of a known type and use the array values. +*/ +static unsigned int l_randomizePivot (void) { + clock_t c = clock(); + time_t t = time(NULL); + unsigned int buff[sof(c) + sof(t)]; + unsigned int i, rnd = 0; + memcpy(buff, &c, sof(c) * sizeof(unsigned int)); + memcpy(buff + sof(c), &t, sof(t) * sizeof(unsigned int)); + for (i = 0; i < sof(buff); i++) + rnd += buff[i]; + return rnd; +} + +#endif /* } */ + + +/* arrays larger than 'RANLIMIT' may use randomized pivots */ +#define RANLIMIT 100u + + +static void set2 (lua_State *L, IdxT i, IdxT j) { + lua_seti(L, 1, i); + lua_seti(L, 1, j); +} + + +/* +** Return true iff value at stack index 'a' is less than the value at +** index 'b' (according to the order of the sort). +*/ +static int sort_comp (lua_State *L, int a, int b) { + if (lua_isnil(L, 2)) /* no function? */ + return lua_compare(L, a, b, LUA_OPLT); /* a < b */ + else { /* function */ + int res; + lua_pushvalue(L, 2); /* push function */ + lua_pushvalue(L, a-1); /* -1 to compensate function */ + lua_pushvalue(L, b-2); /* -2 to compensate function and 'a' */ + lua_call(L, 2, 1); /* call function */ + res = lua_toboolean(L, -1); /* get result */ + lua_pop(L, 1); /* pop result */ + return res; + } +} + + +/* +** Does the partition: Pivot P is at the top of the stack. +** precondition: a[lo] <= P == a[up-1] <= a[up], +** so it only needs to do the partition from lo + 1 to up - 2. +** Pos-condition: a[lo .. i - 1] <= a[i] == P <= a[i + 1 .. up] +** returns 'i'. +*/ +static IdxT partition (lua_State *L, IdxT lo, IdxT up) { + IdxT i = lo; /* will be incremented before first use */ + IdxT j = up - 1; /* will be decremented before first use */ + /* loop invariant: a[lo .. i] <= P <= a[j .. up] */ + for (;;) { + /* next loop: repeat ++i while a[i] < P */ + while ((void)lua_geti(L, 1, ++i), sort_comp(L, -1, -2)) { + if (i == up - 1) /* a[i] < P but a[up - 1] == P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[i] */ + } + /* after the loop, a[i] >= P and a[lo .. i - 1] < P */ + /* next loop: repeat --j while P < a[j] */ + while ((void)lua_geti(L, 1, --j), sort_comp(L, -3, -1)) { + if (j < i) /* j < i but a[j] > P ?? */ + luaL_error(L, "invalid order function for sorting"); + lua_pop(L, 1); /* remove a[j] */ + } + /* after the loop, a[j] <= P and a[j + 1 .. up] >= P */ + if (j < i) { /* no elements out of place? */ + /* a[lo .. i - 1] <= P <= a[j + 1 .. i .. up] */ + lua_pop(L, 1); /* pop a[j] */ + /* swap pivot (a[up - 1]) with a[i] to satisfy pos-condition */ + set2(L, up - 1, i); + return i; + } + /* otherwise, swap a[i] - a[j] to restore invariant and repeat */ + set2(L, i, j); + } +} + + +/* +** Choose an element in the middle (2nd-3th quarters) of [lo,up] +** "randomized" by 'rnd' +*/ +static IdxT choosePivot (IdxT lo, IdxT up, unsigned int rnd) { + IdxT r4 = (up - lo) / 4; /* range/4 */ + IdxT p = rnd % (r4 * 2) + (lo + r4); + lua_assert(lo + r4 <= p && p <= up - r4); + return p; +} + + +/* +** Quicksort algorithm (recursive function) +*/ +static void auxsort (lua_State *L, IdxT lo, IdxT up, + unsigned int rnd) { + while (lo < up) { /* loop for tail recursion */ + IdxT p; /* Pivot index */ + IdxT n; /* to be used later */ + /* sort elements 'lo', 'p', and 'up' */ + lua_geti(L, 1, lo); + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[lo]? */ + set2(L, lo, up); /* swap a[lo] - a[up] */ + else + lua_pop(L, 2); /* remove both values */ + if (up - lo == 1) /* only 2 elements? */ + return; /* already sorted */ + if (up - lo < RANLIMIT || rnd == 0) /* small interval or no randomize? */ + p = (lo + up)/2; /* middle element is a good pivot */ + else /* for larger intervals, it is worth a random pivot */ + p = choosePivot(lo, up, rnd); + lua_geti(L, 1, p); + lua_geti(L, 1, lo); + if (sort_comp(L, -2, -1)) /* a[p] < a[lo]? */ + set2(L, p, lo); /* swap a[p] - a[lo] */ + else { + lua_pop(L, 1); /* remove a[lo] */ + lua_geti(L, 1, up); + if (sort_comp(L, -1, -2)) /* a[up] < a[p]? */ + set2(L, p, up); /* swap a[up] - a[p] */ + else + lua_pop(L, 2); + } + if (up - lo == 2) /* only 3 elements? */ + return; /* already sorted */ + lua_geti(L, 1, p); /* get middle element (Pivot) */ + lua_pushvalue(L, -1); /* push Pivot */ + lua_geti(L, 1, up - 1); /* push a[up - 1] */ + set2(L, p, up - 1); /* swap Pivot (a[p]) with a[up - 1] */ + p = partition(L, lo, up); + /* a[lo .. p - 1] <= a[p] == P <= a[p + 1 .. up] */ + if (p - lo < up - p) { /* lower interval is smaller? */ + auxsort(L, lo, p - 1, rnd); /* call recursively for lower interval */ + n = p - lo; /* size of smaller interval */ + lo = p + 1; /* tail call for [p + 1 .. up] (upper interval) */ + } + else { + auxsort(L, p + 1, up, rnd); /* call recursively for upper interval */ + n = up - p; /* size of smaller interval */ + up = p - 1; /* tail call for [lo .. p - 1] (lower interval) */ + } + if ((up - lo) / 128 > n) /* partition too imbalanced? */ + rnd = l_randomizePivot(); /* try a new randomization */ + } /* tail call auxsort(L, lo, up, rnd) */ +} + + +static int sort (lua_State *L) { + lua_Integer n = aux_getn(L, 1, TAB_RW); + if (n > 1) { /* non-trivial interval? */ + luaL_argcheck(L, n < INT_MAX, 1, "array too big"); + if (!lua_isnoneornil(L, 2)) /* is there a 2nd argument? */ + luaL_checktype(L, 2, LUA_TFUNCTION); /* must be a function */ + lua_settop(L, 2); /* make sure there are two arguments */ + auxsort(L, 1, (IdxT)n, 0); + } + return 0; +} + +/* }====================================================== */ + + +static const luaL_Reg tab_funcs[] = { + {"concat", tconcat}, + {"insert", tinsert}, + {"pack", tpack}, + {"unpack", tunpack}, + {"remove", tremove}, + {"move", tmove}, + {"sort", sort}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_table (lua_State *L) { + luaL_newlib(L, tab_funcs); + return 1; +} + diff --git a/lua-5.4.0/src/ltm.c b/lua-5.4.0/src/ltm.c new file mode 100644 index 0000000..ae60983 --- /dev/null +++ b/lua-5.4.0/src/ltm.c @@ -0,0 +1,270 @@ +/* +** $Id: ltm.c $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#define ltm_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lgc.h" +#include "lobject.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +static const char udatatypename[] = "userdata"; + +LUAI_DDEF const char *const luaT_typenames_[LUA_TOTALTYPES] = { + "no value", + "nil", "boolean", udatatypename, "number", + "string", "table", "function", udatatypename, "thread", + "upvalue", "proto" /* these last cases are used for tests only */ +}; + + +void luaT_init (lua_State *L) { + static const char *const luaT_eventname[] = { /* ORDER TM */ + "__index", "__newindex", + "__gc", "__mode", "__len", "__eq", + "__add", "__sub", "__mul", "__mod", "__pow", + "__div", "__idiv", + "__band", "__bor", "__bxor", "__shl", "__shr", + "__unm", "__bnot", "__lt", "__le", + "__concat", "__call", "__close" + }; + int i; + for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); + luaC_fix(L, obj2gco(G(L)->tmname[i])); /* never collect these names */ + } +} + + +/* +** function to be used with macro "fasttm": optimized for absence of +** tag methods +*/ +const TValue *luaT_gettm (Table *events, TMS event, TString *ename) { + const TValue *tm = luaH_getshortstr(events, ename); + lua_assert(event <= TM_EQ); + if (notm(tm)) { /* no tag method? */ + events->flags |= cast_byte(1u<metatable; + break; + case LUA_TUSERDATA: + mt = uvalue(o)->metatable; + break; + default: + mt = G(L)->mt[ttype(o)]; + } + return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : &G(L)->nilvalue); +} + + +/* +** Return the name of the type of an object. For tables and userdata +** with metatable, use their '__name' metafield, if present. +*/ +const char *luaT_objtypename (lua_State *L, const TValue *o) { + Table *mt; + if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) || + (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) { + const TValue *name = luaH_getshortstr(mt, luaS_new(L, "__name")); + if (ttisstring(name)) /* is '__name' a string? */ + return getstr(tsvalue(name)); /* use it as type name */ + } + return ttypename(ttype(o)); /* else use standard type name */ +} + + +void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3) { + StkId func = L->top; + setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ + setobj2s(L, func + 1, p1); /* 1st argument */ + setobj2s(L, func + 2, p2); /* 2nd argument */ + setobj2s(L, func + 3, p3); /* 3rd argument */ + L->top = func + 4; + /* metamethod may yield only when called from Lua code */ + if (isLuacode(L->ci)) + luaD_call(L, func, 0); + else + luaD_callnoyield(L, func, 0); +} + + +void luaT_callTMres (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, StkId res) { + ptrdiff_t result = savestack(L, res); + StkId func = L->top; + setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ + setobj2s(L, func + 1, p1); /* 1st argument */ + setobj2s(L, func + 2, p2); /* 2nd argument */ + L->top += 3; + /* metamethod may yield only when called from Lua code */ + if (isLuacode(L->ci)) + luaD_call(L, func, 1); + else + luaD_callnoyield(L, func, 1); + res = restorestack(L, result); + setobjs2s(L, res, --L->top); /* move result to its place */ +} + + +static int callbinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ + if (notm(tm)) + tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ + if (notm(tm)) return 0; + luaT_callTMres(L, tm, p1, p2, res); + return 1; +} + + +void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event) { + if (!callbinTM(L, p1, p2, res, event)) { + switch (event) { + case TM_BAND: case TM_BOR: case TM_BXOR: + case TM_SHL: case TM_SHR: case TM_BNOT: { + if (ttisnumber(p1) && ttisnumber(p2)) + luaG_tointerror(L, p1, p2); + else + luaG_opinterror(L, p1, p2, "perform bitwise operation on"); + } + /* calls never return, but to avoid warnings: *//* FALLTHROUGH */ + default: + luaG_opinterror(L, p1, p2, "perform arithmetic on"); + } + } +} + + +void luaT_tryconcatTM (lua_State *L) { + StkId top = L->top; + if (!callbinTM(L, s2v(top - 2), s2v(top - 1), top - 2, TM_CONCAT)) + luaG_concaterror(L, s2v(top - 2), s2v(top - 1)); +} + + +void luaT_trybinassocTM (lua_State *L, const TValue *p1, const TValue *p2, + int flip, StkId res, TMS event) { + if (flip) + luaT_trybinTM(L, p2, p1, res, event); + else + luaT_trybinTM(L, p1, p2, res, event); +} + + +void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2, + int flip, StkId res, TMS event) { + TValue aux; + setivalue(&aux, i2); + luaT_trybinassocTM(L, p1, &aux, flip, res, event); +} + + +/* +** Calls an order tag method. +** For lessequal, LUA_COMPAT_LT_LE keeps compatibility with old +** behavior: if there is no '__le', try '__lt', based on l <= r iff +** !(r < l) (assuming a total order). If the metamethod yields during +** this substitution, the continuation has to know about it (to negate +** the result of rtop, event)) /* try original event */ + return !l_isfalse(s2v(L->top)); +#if defined(LUA_COMPAT_LT_LE) + else if (event == TM_LE) { + /* try '!(p2 < p1)' for '(p1 <= p2)' */ + L->ci->callstatus |= CIST_LEQ; /* mark it is doing 'lt' for 'le' */ + if (callbinTM(L, p2, p1, L->top, TM_LT)) { + L->ci->callstatus ^= CIST_LEQ; /* clear mark */ + return l_isfalse(s2v(L->top)); + } + /* else error will remove this 'ci'; no need to clear mark */ + } +#endif + luaG_ordererror(L, p1, p2); /* no metamethod found */ + return 0; /* to avoid warnings */ +} + + +int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, + int flip, int isfloat, TMS event) { + TValue aux; const TValue *p2; + if (isfloat) { + setfltvalue(&aux, cast_num(v2)); + } + else + setivalue(&aux, v2); + if (flip) { /* arguments were exchanged? */ + p2 = p1; p1 = &aux; /* correct them */ + } + else + p2 = &aux; + return luaT_callorderTM(L, p1, p2, event); +} + + +void luaT_adjustvarargs (lua_State *L, int nfixparams, CallInfo *ci, + const Proto *p) { + int i; + int actual = cast_int(L->top - ci->func) - 1; /* number of arguments */ + int nextra = actual - nfixparams; /* number of extra arguments */ + ci->u.l.nextraargs = nextra; + checkstackGC(L, p->maxstacksize + 1); + /* copy function to the top of the stack */ + setobjs2s(L, L->top++, ci->func); + /* move fixed parameters to the top of the stack */ + for (i = 1; i <= nfixparams; i++) { + setobjs2s(L, L->top++, ci->func + i); + setnilvalue(s2v(ci->func + i)); /* erase original parameter (for GC) */ + } + ci->func += actual + 1; + ci->top += actual + 1; + lua_assert(L->top <= ci->top && ci->top <= L->stack_last); +} + + +void luaT_getvarargs (lua_State *L, CallInfo *ci, StkId where, int wanted) { + int i; + int nextra = ci->u.l.nextraargs; + if (wanted < 0) { + wanted = nextra; /* get all extra arguments available */ + checkstackp(L, nextra, where); /* ensure stack space */ + L->top = where + nextra; /* next instruction will need top */ + } + for (i = 0; i < wanted && i < nextra; i++) + setobjs2s(L, where + i, ci->func - nextra + i); + for (; i < wanted; i++) /* complete required results with nil */ + setnilvalue(s2v(where + i)); +} + diff --git a/lua-5.4.0/src/ltm.h b/lua-5.4.0/src/ltm.h new file mode 100644 index 0000000..99b545e --- /dev/null +++ b/lua-5.4.0/src/ltm.h @@ -0,0 +1,94 @@ +/* +** $Id: ltm.h $ +** Tag methods +** See Copyright Notice in lua.h +*/ + +#ifndef ltm_h +#define ltm_h + + +#include "lobject.h" + + +/* +* WARNING: if you change the order of this enumeration, +* grep "ORDER TM" and "ORDER OP" +*/ +typedef enum { + TM_INDEX, + TM_NEWINDEX, + TM_GC, + TM_MODE, + TM_LEN, + TM_EQ, /* last tag method with fast access */ + TM_ADD, + TM_SUB, + TM_MUL, + TM_MOD, + TM_POW, + TM_DIV, + TM_IDIV, + TM_BAND, + TM_BOR, + TM_BXOR, + TM_SHL, + TM_SHR, + TM_UNM, + TM_BNOT, + TM_LT, + TM_LE, + TM_CONCAT, + TM_CALL, + TM_CLOSE, + TM_N /* number of elements in the enum */ +} TMS; + + +/* +** Test whether there is no tagmethod. +** (Because tagmethods use raw accesses, the result may be an "empty" nil.) +*/ +#define notm(tm) ttisnil(tm) + + +#define gfasttm(g,et,e) ((et) == NULL ? NULL : \ + ((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) + +#define fasttm(l,et,e) gfasttm(G(l), et, e) + +#define ttypename(x) luaT_typenames_[(x) + 1] + +LUAI_DDEC(const char *const luaT_typenames_[LUA_TOTALTYPES];) + + +LUAI_FUNC const char *luaT_objtypename (lua_State *L, const TValue *o); + +LUAI_FUNC const TValue *luaT_gettm (Table *events, TMS event, TString *ename); +LUAI_FUNC const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, + TMS event); +LUAI_FUNC void luaT_init (lua_State *L); + +LUAI_FUNC void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, + const TValue *p2, const TValue *p3); +LUAI_FUNC void luaT_callTMres (lua_State *L, const TValue *f, + const TValue *p1, const TValue *p2, StkId p3); +LUAI_FUNC void luaT_trybinTM (lua_State *L, const TValue *p1, const TValue *p2, + StkId res, TMS event); +LUAI_FUNC void luaT_tryconcatTM (lua_State *L); +LUAI_FUNC void luaT_trybinassocTM (lua_State *L, const TValue *p1, + const TValue *p2, int inv, StkId res, TMS event); +LUAI_FUNC void luaT_trybiniTM (lua_State *L, const TValue *p1, lua_Integer i2, + int inv, StkId res, TMS event); +LUAI_FUNC int luaT_callorderTM (lua_State *L, const TValue *p1, + const TValue *p2, TMS event); +LUAI_FUNC int luaT_callorderiTM (lua_State *L, const TValue *p1, int v2, + int inv, int isfloat, TMS event); + +LUAI_FUNC void luaT_adjustvarargs (lua_State *L, int nfixparams, + struct CallInfo *ci, const Proto *p); +LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci, + StkId where, int wanted); + + +#endif diff --git a/lua-5.4.0/src/lua b/lua-5.4.0/src/lua new file mode 100644 index 0000000..ebea2e1 --- /dev/null +++ b/lua-5.4.0/src/lua @@ -0,0 +1,6030 @@ +/** + * @license + * Copyright 2010 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module !== 'undefined' ? Module : {}; + + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = {}; +var key; +for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } +} + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = function(status, toThrow) { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +var ENVIRONMENT_IS_WEB = false; +var ENVIRONMENT_IS_WORKER = false; +var ENVIRONMENT_IS_NODE = false; +var ENVIRONMENT_IS_SHELL = false; +ENVIRONMENT_IS_WEB = typeof window === 'object'; +ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; +ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); +} + + + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +var nodeFS; +var nodePath; + +if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + read_ = function shell_read(filename, binary) { + if (!nodeFS) nodeFS = require('fs'); + if (!nodePath) nodePath = require('path'); + filename = nodePath['normalize'](filename); + return nodeFS['readFileSync'](filename, binary ? null : 'utf8'); + }; + + readBinary = function readBinary(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + + + + + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + if (typeof module !== 'undefined') { + module['exports'] = Module; + } + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + process['on']('unhandledRejection', abort); + + quit_ = function(status) { + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + + + +} else +if (ENVIRONMENT_IS_SHELL) { + + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + var data; + if (typeof readbuffer === 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data === 'object'); + return data; + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit === 'function') { + quit_ = function(status) { + quit(status); + }; + } + + if (typeof print !== 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console === 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print); + } + + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + read_ = function shell_read(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + }; + + if (ENVIRONMENT_IS_WORKER) { + readBinary = function readBinary(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = function readAsync(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = function xhr_onload() { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + + + + + } + + setWindowTitle = function(title) { document.title = title }; +} else +{ + throw new Error('environment detection error'); +} + + +// Set up the out() and err() hooks, which are how we can print to stdout or +// stderr, respectively. +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } +} +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. +if (Module['arguments']) arguments_ = Module['arguments'];if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) Object.defineProperty(Module, 'arguments', { configurable: true, get: function() { abort('Module.arguments has been replaced with plain arguments_') } }); +if (Module['thisProgram']) thisProgram = Module['thisProgram'];if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) Object.defineProperty(Module, 'thisProgram', { configurable: true, get: function() { abort('Module.thisProgram has been replaced with plain thisProgram') } }); +if (Module['quit']) quit_ = Module['quit'];if (!Object.getOwnPropertyDescriptor(Module, 'quit')) Object.defineProperty(Module, 'quit', { configurable: true, get: function() { abort('Module.quit has been replaced with plain quit_') } }); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +if (!Object.getOwnPropertyDescriptor(Module, 'read')) Object.defineProperty(Module, 'read', { configurable: true, get: function() { abort('Module.read has been replaced with plain read_') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) Object.defineProperty(Module, 'readAsync', { configurable: true, get: function() { abort('Module.readAsync has been replaced with plain readAsync') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) Object.defineProperty(Module, 'readBinary', { configurable: true, get: function() { abort('Module.readBinary has been replaced with plain readBinary') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) Object.defineProperty(Module, 'setWindowTitle', { configurable: true, get: function() { abort('Module.setWindowTitle has been replaced with plain setWindowTitle') } }); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + + + + +/** + * @license + * Copyright 2017 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// {{PREAMBLE_ADDITIONS}} + +var STACK_ALIGN = 16; + +// stack management, and other functionality that is provided by the compiled code, +// should not be used before it is ready + +/** @suppress{duplicate} */ +var stackSave; +/** @suppress{duplicate} */ +var stackRestore; +/** @suppress{duplicate} */ +var stackAlloc; + +stackSave = stackRestore = stackAlloc = function() { + abort('cannot use the stack before compiled code is ready to run, and has provided stack access'); +}; + +function staticAlloc(size) { + abort('staticAlloc is no longer available at runtime; instead, perform static allocations at compile time (using makeStaticAlloc)'); +} + +function dynamicAlloc(size) { + assert(DYNAMICTOP_PTR); + var ret = HEAP32[DYNAMICTOP_PTR>>2]; + var end = (ret + size + 15) & -16; + assert(end <= HEAP8.length, 'failure to dynamicAlloc - memory growth etc. is not supported there, call malloc/sbrk directly'); + HEAP32[DYNAMICTOP_PTR>>2] = end; + return ret; +} + +function alignMemory(size, factor) { + if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default + return Math.ceil(size / factor) * factor; +} + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length-1] === '*') { + return 4; // A pointer + } else if (type[0] === 'i') { + var bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + + + + + +/** + * @license + * Copyright 2020 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function === "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +// Add a wasm function to the table. +function addFunctionWasm(func, sig) { + var table = wasmTable; + + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + for (var i = 0; i < table.length; i++) { + var item = table.get(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + + var ret; + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + ret = freeTableIndexes.pop(); + } else { + ret = table.length; + // Grow the table + try { + table.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + } + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + table.set(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction'); + var wrapped = convertJsFunctionToWasm(func, sig); + table.set(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunctionWasm(index) { + functionsInTableMap.delete(wasmTable.get(index)); + freeTableIndexes.push(index); +} + +// 'sig' parameter is required for the llvm backend but only when func is not +// already a WebAssembly function. +function addFunction(func, sig) { + assert(typeof func !== 'undefined'); + + return addFunctionWasm(func, sig); +} + +function removeFunction(index) { + removeFunctionWasm(index); +} + + + +var funcWrappers = {}; + +function getFuncWrapper(func, sig) { + if (!func) return; // on null pointer, return undefined + assert(sig); + if (!funcWrappers[sig]) { + funcWrappers[sig] = {}; + } + var sigCache = funcWrappers[sig]; + if (!sigCache[func]) { + // optimize away arguments usage in common cases + if (sig.length === 1) { + sigCache[func] = function dynCall_wrapper() { + return dynCall(sig, func); + }; + } else if (sig.length === 2) { + sigCache[func] = function dynCall_wrapper(arg) { + return dynCall(sig, func, [arg]); + }; + } else { + // general case + sigCache[func] = function dynCall_wrapper() { + return dynCall(sig, func, Array.prototype.slice.call(arguments)); + }; + } + } + return sigCache[func]; +} + + +/** + * @license + * Copyright 2020 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + + + +function makeBigInt(low, high, unsigned) { + return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); +} + +/** @param {Array=} args */ +function dynCall(sig, ptr, args) { + if (args && args.length) { + // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. + assert(args.length === sig.substring(1).replace(/j/g, '--').length); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); + } else { + assert(sig.length == 1); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].call(null, ptr); + } +} + +var tempRet0 = 0; + +var setTempRet0 = function(value) { + tempRet0 = value; +}; + +var getTempRet0 = function() { + return tempRet0; +}; + +function getCompilerSetting(name) { + throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for getCompilerSetting or emscripten_get_compiler_setting to work'; +} + +// The address globals begin at. Very low in memory, for code size and optimization opportunities. +// Above 0 is static memory, starting with globals. +// Then the stack. +// Then 'dynamic' memory for sbrk. +var GLOBAL_BASE = 1024; + + + +/** + * @license + * Copyright 2010 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + + +var wasmBinary;if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) Object.defineProperty(Module, 'wasmBinary', { configurable: true, get: function() { abort('Module.wasmBinary has been replaced with plain wasmBinary') } }); +var noExitRuntime;if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime'];if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) Object.defineProperty(Module, 'noExitRuntime', { configurable: true, get: function() { abort('Module.noExitRuntime has been replaced with plain noExitRuntime') } }); + + +if (typeof WebAssembly !== 'object') { + abort('No WebAssembly support found. Build with -s WASM=0 to target JavaScript instead.'); +} + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': HEAP8[((ptr)>>0)]=value; break; + case 'i8': HEAP8[((ptr)>>0)]=value; break; + case 'i16': HEAP16[((ptr)>>1)]=value; break; + case 'i32': HEAP32[((ptr)>>2)]=value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)]=value; break; + case 'double': HEAPF64[((ptr)>>3)]=value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + default: abort('invalid type for getValue: ' + type); + } + return null; +} + + + + + + +// Wasm globals + +var wasmMemory; + +// In fastcomp asm.js, we don't need a wasm Table at all. +// In the wasm backend, we polyfill the WebAssembly object, +// so this creates a (non-native-wasm) table for us. +var wasmTable = new WebAssembly.Table({ + 'initial': 207, + 'maximum': 207 + 0, + 'element': 'anyfunc' +}); + + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS = 0; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed: ' + text); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + + ret = convertReturnValue(ret); + if (stack !== 0) stackRestore(stack); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call +var ALLOC_DYNAMIC = 2; // Cannot be freed except through sbrk +var ALLOC_NONE = 3; // Do not allocate + +// allocate(): This is for internal use. You can use it yourself as well, but the interface +// is a little tricky (see docs right below). The reason is that it is optimized +// for multiple syntaxes to save space in generated code. So you should +// normally not use allocate(), and instead allocate memory using _malloc(), +// initialize it with setValue(), and so forth. +// @slab: An array of data, or a number. If a number, then the size of the block to allocate, +// in *bytes* (note that this is sometimes confusing: the next parameter does not +// affect this!) +// @types: Either an array of types, one for each byte (or 0 if no type at that position), +// or a single type which is used for the entire block. This only matters if there +// is initial data - if @slab is a number, then this does not matter at all and is +// ignored. +// @allocator: How to allocate memory, see ALLOC_* +/** @type {function((TypedArray|Array|number), string, number, number=)} */ +function allocate(slab, types, allocator, ptr) { + var zeroinit, size; + if (typeof slab === 'number') { + zeroinit = true; + size = slab; + } else { + zeroinit = false; + size = slab.length; + } + + var singleType = typeof types === 'string' ? types : null; + + var ret; + if (allocator == ALLOC_NONE) { + ret = ptr; + } else { + ret = [_malloc, + stackAlloc, + dynamicAlloc][allocator](Math.max(size, singleType ? 1 : types.length)); + } + + if (zeroinit) { + var stop; + ptr = ret; + assert((ret & 3) == 0); + stop = ret + (size & ~3); + for (; ptr < stop; ptr += 4) { + HEAP32[((ptr)>>2)]=0; + } + stop = ret + size; + while (ptr < stop) { + HEAP8[((ptr++)>>0)]=0; + } + return ret; + } + + if (singleType === 'i8') { + if (slab.subarray || slab.slice) { + HEAPU8.set(/** @type {!Uint8Array} */ (slab), ret); + } else { + HEAPU8.set(new Uint8Array(slab), ret); + } + return ret; + } + + var i = 0, type, typeSize, previousType; + while (i < size) { + var curr = slab[i]; + + type = singleType || types[i]; + if (type === 0) { + i++; + continue; + } + assert(type, 'Must know what type to store in allocate!'); + + if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later + + setValue(ret+i, curr, type); + + // no need to look up size unless type changes, so cache it + if (previousType !== type) { + typeSize = getNativeTypeSize(type); + previousType = type; + } + i += typeSize; + } + + return ret; +} + +// Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready +function getMemory(size) { + if (!runtimeInitialized) return dynamicAlloc(size); + return _malloc(size); +} + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u >= 0x200000) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + + + +/** + * @license + * Copyright 2020 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var i = 0; + + var str = ''; + while (1) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0 || i == maxBytesToRead / 2) return str; + ++i; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)]=codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)]=codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff); + HEAP8[((buffer++)>>0)]=str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)]=0; +} + + + +// Memory management + +var PAGE_SIZE = 16384; +var WASM_PAGE_SIZE = 65536; +var ASMJS_PAGE_SIZE = 16777216; + +function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - (x % multiple); + } + return x; +} + +var HEAP, +/** @type {ArrayBuffer} */ + buffer, +/** @type {Int8Array} */ + HEAP8, +/** @type {Uint8Array} */ + HEAPU8, +/** @type {Int16Array} */ + HEAP16, +/** @type {Uint16Array} */ + HEAPU16, +/** @type {Int32Array} */ + HEAP32, +/** @type {Uint32Array} */ + HEAPU32, +/** @type {Float32Array} */ + HEAPF32, +/** @type {Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var STATIC_BASE = 1024, + STACK_BASE = 5267200, + STACKTOP = STACK_BASE, + STACK_MAX = 24320, + DYNAMIC_BASE = 5267200, + DYNAMICTOP_PTR = 24160; + +assert(STACK_BASE % 16 === 0, 'stack must start aligned'); +assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned'); + + + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) Object.defineProperty(Module, 'INITIAL_MEMORY', { configurable: true, get: function() { abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_INITIAL_MEMORY') } }); + +assert(INITIAL_INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined, + 'JS engine does not provide full typed array support'); + + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + + + +// In standalone mode, the wasm creates the memory, and the user can't provide it. +// In non-standalone/normal mode, we create the memory here. + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// Create the main memory. (Note: this isn't used in STANDALONE_WASM mode since the wasm +// memory is created in the wasm, not in JS.) + + if (Module['wasmMemory']) { + wasmMemory = Module['wasmMemory']; + } else + { + wasmMemory = new WebAssembly.Memory({ + 'initial': INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE + , + 'maximum': INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE + }); + } + + +if (wasmMemory) { + buffer = wasmMemory.buffer; +} + +// If the user provides an incorrect length, just use that length instead rather than providing the user to +// specifically provide the memory length with Module['INITIAL_MEMORY']. +INITIAL_INITIAL_MEMORY = buffer.byteLength; +assert(INITIAL_INITIAL_MEMORY % WASM_PAGE_SIZE === 0); +updateGlobalBufferAndViews(buffer); + +HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; + + + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + assert((STACK_MAX & 3) == 0); + // The stack grows downwards + HEAPU32[(STACK_MAX >> 2)+1] = 0x2135467; + HEAPU32[(STACK_MAX >> 2)+2] = 0x89BACDFE; + // Also test the global address 0 for integrity. + // We don't do this with ASan because ASan does its own checks for this. + HEAP32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + var cookie1 = HEAPU32[(STACK_MAX >> 2)+1]; + var cookie2 = HEAPU32[(STACK_MAX >> 2)+2]; + if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' ' + cookie1.toString(16)); + } + // Also test the global address 0 for integrity. + // We don't do this with ASan because ASan does its own checks for this. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); +} + +function abortStackOverflow(allocSize) { + abort('Stack overflow! Attempted to allocate ' + allocSize + ' bytes on the stack, but stack has only ' + (STACK_MAX - stackSave() + allocSize) + ' bytes available!'); +} + + + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// Endianness check (note: assumes compiler arch was little-endian) +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian!'; +})(); + +function abortFnPtrError(ptr, sig) { + abort("Invalid function pointer " + ptr + " called with signature '" + sig + "'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this). Build with ASSERTIONS=2 for more info."); +} + + + +function callRuntimeCallbacks(callbacks) { + while(callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func === 'number') { + if (callback.arg === undefined) { + Module['dynCall_v'](func); + } else { + Module['dynCall_vi'](func, callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } +} + +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; + + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + checkStackCookie(); + assert(!runtimeInitialized); + runtimeInitialized = true; + if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + FS.ignorePermissions = false; + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +/** @param {number|boolean=} ignore */ +function unSign(value, bits, ignore) { + if (value >= 0) { + return value; + } + return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts + : Math.pow(2, bits) + value; +} +/** @param {number|boolean=} ignore */ +function reSign(value, bits, ignore) { + if (value <= 0) { + return value; + } + var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 + : Math.pow(2, bits-1); + if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that + // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors + // TODO: In i64 mode 1, resign the two parts separately and safely + value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts + } + return value; +} + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +var Math_abs = Math.abs; +var Math_cos = Math.cos; +var Math_sin = Math.sin; +var Math_tan = Math.tan; +var Math_acos = Math.acos; +var Math_asin = Math.asin; +var Math_atan = Math.atan; +var Math_atan2 = Math.atan2; +var Math_exp = Math.exp; +var Math_log = Math.log; +var Math_sqrt = Math.sqrt; +var Math_ceil = Math.ceil; +var Math_floor = Math.floor; +var Math_pow = Math.pow; +var Math_imul = Math.imul; +var Math_fround = Math.fround; +var Math_round = Math.round; +var Math_min = Math.min; +var Math_max = Math.max; +var Math_clz32 = Math.clz32; +var Math_trunc = Math.trunc; + + + +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + + +/** @param {string|number=} what */ +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + what += ''; + out(what); + err(what); + + ABORT = true; + EXITSTATUS = 1; + + var output = 'abort(' + what + ') at ' + stackTrace(); + what = output; + + // Throw a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + throw new WebAssembly.RuntimeError(what); +} + + +var memoryInitializer = null; + + +/** + * @license + * Copyright 2015 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + + + + + + +/** + * @license + * Copyright 2017 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +function hasPrefix(str, prefix) { + return String.prototype.startsWith ? + str.startsWith(prefix) : + str.indexOf(prefix) === 0; +} + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); +} + +var fileURIPrefix = "file://"; + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); +} + + + +var wasmBinaryFile = 'lua.wasm'; +if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); +} + +function getBinary() { + try { + if (wasmBinary) { + return new Uint8Array(wasmBinary); + } + + if (readBinary) { + return readBinary(wasmBinaryFile); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, and have the Fetch api, use that; + // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function' + // Let's not use fetch to get objects over file:// as it's most likely Cordova which doesn't support fetch for file:// + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(); + }); + } + // Otherwise, getBinary should be able to get it synchronously + return new Promise(function(resolve, reject) { + resolve(getBinary()); + }); +} + + + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + Module['asm'] = exports; + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiatedSource(output) { + // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(output['instance']); + } + + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + abort(reason); + }); + } + + // Prefer streaming instantiation if available. + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming === 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch === 'function') { + fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { + var result = WebAssembly.instantiateStreaming(response, info); + return result.then(receiveInstantiatedSource, function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + instantiateAsync(); + return {}; // no exports yet; we'll fill them in later +} + + +// Globals used by JS i64 conversions +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + +// STATICTOP = STATIC_BASE + 23296; +/* global initializers */ __ATINIT__.push({ func: function() { ___wasm_call_ctors() } }); + + + + +/* no memory initializer */ +// {{PRE_LIBRARY}} + + + function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; + } + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + + function jsStackTrace() { + var err = new Error(); + if (!err.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + err = e; + } + if (!err.stack) { + return '(no stack trace available)'; + } + } + return err.stack.toString(); + } + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + + + + var _emscripten_get_now;if (ENVIRONMENT_IS_NODE) { + _emscripten_get_now = function() { + var t = process['hrtime'](); + return t[0] * 1e3 + t[1] / 1e6; + }; + } else if (typeof dateNow !== 'undefined') { + _emscripten_get_now = dateNow; + } else _emscripten_get_now = function() { return performance.now(); } + ; + + var _emscripten_get_now_is_monotonic=true;; + + function setErrNo(value) { + HEAP32[((___errno_location())>>2)]=value; + return value; + }function _clock_gettime(clk_id, tp) { + // int clock_gettime(clockid_t clk_id, struct timespec *tp); + var now; + if (clk_id === 0) { + now = Date.now(); + } else if ((clk_id === 1 || clk_id === 4) && _emscripten_get_now_is_monotonic) { + now = _emscripten_get_now(); + } else { + setErrNo(28); + return -1; + } + HEAP32[((tp)>>2)]=(now/1000)|0; // seconds + HEAP32[(((tp)+(4))>>2)]=((now % 1000)*1000*1000)|0; // nanoseconds + return 0; + }function ___clock_gettime(a0,a1 + ) { + return _clock_gettime(a0,a1); + } + + function ___handle_stack_overflow() { + abort('stack overflow') + } + + function ___map_file(pathname, size) { + setErrNo(63); + return -1; + } + + + + var PATH={splitPath:function(filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:function(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + },normalize:function(path) { + var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:function(path) { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:function(path) { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },extname:function(path) { + return PATH.splitPath(path)[3]; + },join:function() { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join('/')); + },join2:function(l, r) { + return PATH.normalize(l + '/' + r); + }}; + + + var PATH_FS={resolve:function() { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:function(from, to) { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + var TTY={ttys:[],init:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process['stdin']['setEncoding']('utf8'); + // } + },shutdown:function() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process['stdin']['pause'](); + // } + },register:function(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + },close:function(stream) { + // flush any pending line data + stream.tty.ops.flush(stream.tty); + },flush:function(stream) { + stream.tty.ops.flush(stream.tty); + },read:function(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function(tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE); + var bytesRead = 0; + + try { + bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().indexOf('EOF') != -1) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + var MEMFS={ops_table:null,mount:function(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + } + return node; + },getFileDataAsRegularArray:function(node) { + if (node.contents && node.contents.subarray) { + var arr = []; + for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); + return arr; // Returns a copy of the original data. + } + return node.contents; // No-op, the file contents are already in a JS array. Return as-is. + },getFileDataAsTypedArray:function(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + return; + },resizeFileStorage:function(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + return; + } + if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + return; + } + // Backing with a JS array. + if (!node.contents) node.contents = []; + if (node.contents.length > newSize) node.contents.length = newSize; + else while (node.contents.length < newSize) node.contents.push(0); + node.usedBytes = newSize; + },node_ops:{getattr:function(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function(parent, name) { + throw FS.genericErrors[44]; + },mknod:function(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + old_node.parent = new_dir; + },unlink:function(parent, name) { + delete parent.contents[name]; + },rmdir:function(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + },readdir:function(node) { + var entries = ['.', '..']; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }},stream_ops:{read:function(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available. + else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + },llseek:function(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + },allocate:function(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function(stream, buffer, offset, length, position, prot, flags) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if ( !(flags & 2) && + contents.buffer === buffer.buffer ) { + // We can't emulate MAP_SHARED when the file is not backed by the buffer + // we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + // malloc() can lead to growing the heap. If targeting the heap, we need to + // re-acquire the heap buffer object in case growth had occurred. + var fromHeap = (buffer.buffer == HEAP8.buffer); + ptr = _malloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + (fromHeap ? HEAP8 : buffer).set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (mmapFlags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + + var ERRNO_MESSAGES={0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"}; + + var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(e) { + if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); + return setErrNo(e.errno); + },lookupPath:function(path, opts) { + path = PATH_FS.resolve(FS.cwd(), path); + opts = opts || {}; + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the path + var parts = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), false); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:function(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; + } + path = path ? node.name + '/' + path : node.name; + node = node.parent; + } + },hashName:function(parentid, name) { + var hash = 0; + + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:function(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:function(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:function(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:function(parent, name, mode, rdev) { + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:function(node) { + FS.hashRemoveNode(node); + },isRoot:function(node) { + return node === node.parent; + },isMountpoint:function(node) { + return !!node.mounted; + },isFile:function(mode) { + return (mode & 61440) === 32768; + },isDir:function(mode) { + return (mode & 61440) === 16384; + },isLink:function(mode) { + return (mode & 61440) === 40960; + },isChrdev:function(mode) { + return (mode & 61440) === 8192; + },isBlkdev:function(mode) { + return (mode & 61440) === 24576; + },isFIFO:function(mode) { + return (mode & 61440) === 4096; + },isSocket:function(mode) { + return (mode & 49152) === 49152; + },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str) { + var flags = FS.flagModes[str]; + if (typeof flags === 'undefined') { + throw new Error('Unknown file open mode: ' + str); + } + return flags; + },flagsToPermissionString:function(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:function(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { + return 2; + } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { + return 2; + } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { + return 2; + } + return 0; + },mayLookup:function(dir) { + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + },mayCreate:function(dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:function(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + },mayOpen:function(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:function(fd_start, fd_end) { + fd_start = fd_start || 0; + fd_end = fd_end || FS.MAX_OPEN_FDS; + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + },getStream:function(fd) { + return FS.streams[fd]; + },createStream:function(stream, fd_start, fd_end) { + if (!FS.FSStream) { + FS.FSStream = /** @constructor */ function(){}; + FS.FSStream.prototype = { + object: { + get: function() { return this.node; }, + set: function(val) { this.node = val; } + }, + isRead: { + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + get: function() { return (this.flags & 1024); } + } + }; + } + // clone it, so we can return an instance of FSStream + var newStream = new FS.FSStream(); + for (var p in stream) { + newStream[p] = stream[p]; + } + stream = newStream; + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:function(fd) { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:function(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:function() { + throw new FS.ErrnoError(70); + }},major:function(dev) { + return ((dev) >> 8); + },minor:function(dev) { + return ((dev) & 0xff); + },makedev:function(ma, mi) { + return ((ma) << 8 | (mi)); + },registerDevice:function(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:function(dev) { + return FS.devices[dev]; + },getMounts:function(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:function(populate, callback) { + if (typeof(populate) === 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach(function (mount) { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:function(type, opts, mountpoint) { + if (typeof type === 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:function (mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach(function (hash) { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.indexOf(current.mount) !== -1) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + },lookup:function(parent, name) { + return parent.node_ops.lookup(parent, name); + },mknod:function(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:function(path, mode) { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:function(path, mode) { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdirTree:function(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + },mkdev:function(path, mode, dev) { + if (typeof(dev) === 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:function(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:function(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + try { + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + } catch (e) { + throw new FS.ErrnoError(10); + } + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + try { + if (FS.trackingDelegate['willMovePath']) { + FS.trackingDelegate['willMovePath'](old_path, new_path); + } + } catch(e) { + err("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + try { + if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); + } catch(e) { + err("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + },rmdir:function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readdir:function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + },unlink:function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readlink:function(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:function(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + },lstat:function(path) { + return FS.stat(path, true); + },chmod:function(path, mode, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:function(path, mode) { + FS.chmod(path, mode, true); + },fchmod:function(fd, mode) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + },chown:function(path, uid, gid, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:function(path, uid, gid) { + FS.chown(path, uid, gid, true); + },fchown:function(fd, uid, gid) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + },truncate:function(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:function(fd, len) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + },utime:function(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:function(path, flags, mode, fd_start, fd_end) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path === 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512)) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }, fd_start, fd_end); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + err("FS.trackingDelegate error on read file: " + path); + } + } + try { + if (FS.trackingDelegate['onOpenFile']) { + var trackingFlags = 0; + if ((flags & 2097155) !== 1) { + trackingFlags |= FS.tracking.openFlags.READ; + } + if ((flags & 2097155) !== 0) { + trackingFlags |= FS.tracking.openFlags.WRITE; + } + FS.trackingDelegate['onOpenFile'](path, trackingFlags); + } + } catch(e) { + err("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); + } + return stream; + },close:function(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + },isClosed:function(stream) { + return stream.fd === null; + },llseek:function(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:function(stream, buffer, offset, length, position) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:function(stream, buffer, offset, length, position, canOwn) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + try { + if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); + } catch(e) { + err("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: " + e.message); + } + return bytesWritten; + },allocate:function(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:function(stream, buffer, offset, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:function(stream) { + return 0; + },ioctl:function(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:function(path, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'r'; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:function(path, data, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'w'; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data === 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + },cwd:function() { + return FS.currentPath; + },chdir:function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:function() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:function() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: function() { return 0; }, + write: function(stream, buffer, offset, length, pos) { return length; } + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using Module['printErr'] + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + var random_device; + if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { + // for modern web browsers + var randomBuffer = new Uint8Array(1); + random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + // nodejs has crypto support + random_device = function() { return crypto_module['randomBytes'](1)[0]; }; + } catch (e) { + // nodejs doesn't have crypto support + } + } else + {} + if (!random_device) { + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + random_device = function() { abort("no cryptographic support found for random_device. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; + } + FS.createDevice('/dev', 'random', random_device); + FS.createDevice('/dev', 'urandom', random_device); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:function() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: function() { + var node = FS.createNode('/proc/self', 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup: function(parent, name) { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: function() { return stream.path } } + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:function() { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 'r'); + var stdout = FS.open('/dev/stdout', 'w'); + var stderr = FS.open('/dev/stderr', 'w'); + assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); + assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); + assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); + },ensureErrnoError:function() { + if (FS.ErrnoError) return; + FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { + this.node = node; + this.setErrno = /** @this{Object} */ function(errno) { + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + }; + this.setErrno(errno); + this.message = ERRNO_MESSAGES[errno]; + + // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack + // now ensures it shows what we want. + if (this.stack) { + // Define the stack property for Node.js 4, which otherwise errors on the next line. + Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); + this.stack = demangleAll(this.stack); + } + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach(function(code) { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + },staticInit:function() { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + },init:function(input, output, error) { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:function() { + FS.init.initialized = false; + // force-flush all streams, so we get musl std streams printed out + var fflush = Module['_fflush']; + if (fflush) fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },getMode:function(canRead, canWrite) { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + },joinPath:function(parts, forceRelative) { + var path = PATH.join.apply(null, parts); + if (forceRelative && path[0] == '/') path = path.substr(1); + return path; + },absolutePath:function(relative, base) { + return PATH_FS.resolve(base, relative); + },standardizePath:function(path) { + return PATH.normalize(path); + },findObject:function(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + setErrNo(ret.error); + return null; + } + },analyzePath:function(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createFolder:function(parent, name, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.mkdir(path, mode); + },createPath:function(parent, path, canRead, canWrite) { + parent = typeof parent === 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:function(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:function(parent, name, data, canRead, canWrite, canOwn) { + var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data === 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 'w'); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:function(parent, name, input, output) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: function(stream) { + stream.seekable = false; + }, + close: function(stream) { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: function(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: function(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },createLink:function(parent, name, target, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + return FS.symlink(target, path); + },forceLoadFile:function(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + var success = true; + if (typeof XMLHttpRequest !== 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (read_) { + // Command-line. + try { + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as + // read() will try to parse UTF8. + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + success = false; + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + if (!success) setErrNo(29); + return success; + },createLazyFile:function(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + /** @constructor */ + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (function(from, to) { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }); + var lazyArray = this; + lazyArray.setDataGetter(function(chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest !== 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: /** @this{Object} */ function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }, + chunkSize: { + get: /** @this{Object} */ function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: /** @this {FSNode} */ function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(function(key) { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(29); + } + return fn.apply(null, arguments); + }; + }); + // use a custom read function + stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(29); + } + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + },createPreloadedFile:function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + Browser.init(); // XXX perhaps this method should move onto Browser? + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + var handled = false; + Module['preloadPlugins'].forEach(function(plugin) { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, function() { + if (onerror) onerror(); + removeRunDependency(dep); + }); + handled = true; + } + }); + if (!handled) finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + Browser.asyncLoad(url, function(byteArray) { + processData(byteArray); + }, onerror); + } else { + processData(url); + } + },indexedDB:function() { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + },DB_NAME:function() { + return 'EM_FS_' + window.location.pathname; + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { + out('creating db'); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; + putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },loadFilesFromDB:function(paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; // no database to load from + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); + } catch(e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var getRequest = files.get(path); + getRequest.onsuccess = function getRequest_onsuccess() { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) finish(); + }; + getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }};var SYSCALLS={mappings:{},DEFAULT_POLLMASK:5,umask:511,calculateAt:function(dirfd, path) { + if (path[0] !== '/') { + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) throw new FS.ErrnoError(8); + dir = dirstream.path; + } + path = PATH.join2(dir, path); + } + return path; + },doStat:function(func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -54; + } + throw e; + } + HEAP32[((buf)>>2)]=stat.dev; + HEAP32[(((buf)+(4))>>2)]=0; + HEAP32[(((buf)+(8))>>2)]=stat.ino; + HEAP32[(((buf)+(12))>>2)]=stat.mode; + HEAP32[(((buf)+(16))>>2)]=stat.nlink; + HEAP32[(((buf)+(20))>>2)]=stat.uid; + HEAP32[(((buf)+(24))>>2)]=stat.gid; + HEAP32[(((buf)+(28))>>2)]=stat.rdev; + HEAP32[(((buf)+(32))>>2)]=0; + (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)]=tempI64[0],HEAP32[(((buf)+(44))>>2)]=tempI64[1]); + HEAP32[(((buf)+(48))>>2)]=4096; + HEAP32[(((buf)+(52))>>2)]=stat.blocks; + HEAP32[(((buf)+(56))>>2)]=(stat.atime.getTime() / 1000)|0; + HEAP32[(((buf)+(60))>>2)]=0; + HEAP32[(((buf)+(64))>>2)]=(stat.mtime.getTime() / 1000)|0; + HEAP32[(((buf)+(68))>>2)]=0; + HEAP32[(((buf)+(72))>>2)]=(stat.ctime.getTime() / 1000)|0; + HEAP32[(((buf)+(76))>>2)]=0; + (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)]=tempI64[0],HEAP32[(((buf)+(84))>>2)]=tempI64[1]); + return 0; + },doMsync:function(addr, stream, len, flags, offset) { + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + },doMkdir:function(path, mode) { + // remove a trailing slash, if one - /a/b/ has basename of '', but + // we want to create b in the context of this function + path = PATH.normalize(path); + if (path[path.length-1] === '/') path = path.substr(0, path.length-1); + FS.mkdir(path, mode, 0); + return 0; + },doMknod:function(path, mode, dev) { + // we don't want this in the JS API as it uses mknod to create all nodes. + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: return -28; + } + FS.mknod(path, mode, dev); + return 0; + },doReadlink:function(path, buf, bufsize) { + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf+len]; + stringToUTF8(ret, buf, bufsize+1); + // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) + // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. + HEAP8[buf+len] = endChar; + + return len; + },doAccess:function(path, amode) { + if (amode & ~7) { + // need a valid mode + return -28; + } + var node; + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + if (!node) { + return -44; + } + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + },doDup:function(path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + },doReadv:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + return ret; + },doWritev:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + } + return ret; + },varargs:undefined,get:function() { + assert(SYSCALLS.varargs != undefined); + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + },getStreamFromFD:function(fd) { + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + return stream; + },get64:function(low, high) { + if (low >= 0) assert(high === 0); + else assert(high === -1); + return low; + }};function ___sys_dup2(oldfd, suggestFD) {try { + + var old = SYSCALLS.getStreamFromFD(oldfd); + if (old.fd === suggestFD) return suggestFD; + return SYSCALLS.doDup(old.path, old.flags, suggestFD); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_dup3(fd, suggestFD, flags) {try { + + var old = SYSCALLS.getStreamFromFD(fd); + assert(!flags); + if (old.fd === suggestFD) return -28; + return SYSCALLS.doDup(old.path, old.flags, suggestFD); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_fcntl64(fd, cmd, varargs) {SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: + /* case 12: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { + + var arg = SYSCALLS.get(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)]=2; + return 0; + } + case 13: + case 14: + /* case 13: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + /* case 14: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + + + return 0; // Pretend that the locking is successful. + case 16: + case 8: + return -28; // These are for sockets. We don't have them fully implemented yet. + case 9: + // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. + setErrNo(28); + return -1; + default: { + return -28; + } + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_ioctl(fd, op, varargs) {SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) return -59; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = SYSCALLS.get(); + HEAP32[((argp)>>2)]=0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + default: abort('bad ioctl syscall ' + op); + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_lstat64(path, buf) {try { + + path = SYSCALLS.getStr(path); + return SYSCALLS.doStat(FS.lstat, path, buf); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + + function syscallMunmap(addr, len) { + if ((addr | 0) === -1 || len === 0) { + return -28; + } + // TODO: support unmmap'ing parts of allocations + var info = SYSCALLS.mappings[addr]; + if (!info) return 0; + if (len === info.len) { + var stream = FS.getStream(info.fd); + if (info.prot & 2) { + SYSCALLS.doMsync(addr, stream, len, info.flags, info.offset); + } + FS.munmap(stream); + SYSCALLS.mappings[addr] = null; + if (info.allocated) { + _free(info.malloc); + } + } + return 0; + }function ___sys_munmap(addr, len) {try { + + return syscallMunmap(addr, len); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_open(path, flags, varargs) {SYSCALLS.varargs = varargs; + try { + + var pathname = SYSCALLS.getStr(path); + var mode = SYSCALLS.get(); + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_rename(old_path, new_path) {try { + + old_path = SYSCALLS.getStr(old_path); + new_path = SYSCALLS.getStr(new_path); + FS.rename(old_path, new_path); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_rmdir(path) {try { + + path = SYSCALLS.getStr(path); + FS.rmdir(path); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_unlink(path) {try { + + path = SYSCALLS.getStr(path); + FS.unlink(path); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function _abort() { + abort(); + } + + function _clock() { + if (_clock.start === undefined) _clock.start = Date.now(); + return ((Date.now() - _clock.start) * (1000000 / 1000))|0; + } + + function _difftime(time1, time0) { + return time1 - time0; + } + + function _emscripten_get_sbrk_ptr() { + return 24160; + } + + + + + var setjmpId=0;function _saveSetjmp(env, label, table, size) { + // Not particularly fast: slow table lookup of setjmpId to label. But setjmp + // prevents relooping anyhow, so slowness is to be expected. And typical case + // is 1 setjmp per invocation, or less. + env = env|0; + label = label|0; + table = table|0; + size = size|0; + var i = 0; + setjmpId = (setjmpId+1)|0; + HEAP32[((env)>>2)]=setjmpId; + while ((i|0) < (size|0)) { + if (((HEAP32[(((table)+((i<<3)))>>2)])|0) == 0) { + HEAP32[(((table)+((i<<3)))>>2)]=setjmpId; + HEAP32[(((table)+((i<<3)+4))>>2)]=label; + // prepare next slot + HEAP32[(((table)+((i<<3)+8))>>2)]=0; + setTempRet0((size) | 0); + return table | 0; + } + i = i+1|0; + } + // grow the table + size = (size*2)|0; + table = _realloc(table|0, 8*(size+1|0)|0) | 0; + table = _saveSetjmp(env|0, label|0, table|0, size|0) | 0; + setTempRet0((size) | 0); + return table | 0; + } + + function _testSetjmp(id, table, size) { + id = id|0; + table = table|0; + size = size|0; + var i = 0, curr = 0; + while ((i|0) < (size|0)) { + curr = ((HEAP32[(((table)+((i<<3)))>>2)])|0); + if ((curr|0) == 0) break; + if ((curr|0) == (id|0)) { + return ((HEAP32[(((table)+((i<<3)+4))>>2)])|0); + } + i = i+1|0; + } + return 0; + }function _longjmp(env, value) { + _setThrew(env, value || 1); + throw 'longjmp'; + }function _emscripten_longjmp(env, value) { + _longjmp(env, value); + } + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + + + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + + function abortOnCannotGrowMemory(requestedSize) { + abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s INITIAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); + }function _emscripten_resize_heap(requestedSize) { + requestedSize = requestedSize >>> 0; + abortOnCannotGrowMemory(requestedSize); + } + + + + var ENV={}; + + function __getExecutableName() { + return thisProgram || './this.program'; + }function getEnvStrings() { + if (!getEnvStrings.strings) { + // Default values. + var env = { + 'USER': 'web_user', + 'LOGNAME': 'web_user', + 'PATH': '/', + 'PWD': '/', + 'HOME': '/home/web_user', + // Browser language detection #8751 + 'LANG': ((typeof navigator === 'object' && navigator.languages && navigator.languages[0]) || 'C').replace('-', '_') + '.UTF-8', + '_': __getExecutableName() + }; + // Apply the user-provided values, if any. + for (var x in ENV) { + env[x] = ENV[x]; + } + var strings = []; + for (var x in env) { + strings.push(x + '=' + env[x]); + } + getEnvStrings.strings = strings; + } + return getEnvStrings.strings; + }function _environ_get(__environ, environ_buf) { + var bufSize = 0; + getEnvStrings().forEach(function(string, i) { + var ptr = environ_buf + bufSize; + HEAP32[(((__environ)+(i * 4))>>2)]=ptr; + writeAsciiToMemory(string, ptr); + bufSize += string.length + 1; + }); + return 0; + } + + function _environ_sizes_get(penviron_count, penviron_buf_size) { + var strings = getEnvStrings(); + HEAP32[((penviron_count)>>2)]=strings.length; + var bufSize = 0; + strings.forEach(function(string) { + bufSize += string.length + 1; + }); + HEAP32[((penviron_buf_size)>>2)]=bufSize; + return 0; + } + + function _exit(status) { + // void _exit(int status); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html + exit(status); + } + + function _fd_close(fd) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_read(fd, iov, iovcnt, pnum) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doReadv(stream, iov, iovcnt); + HEAP32[((pnum)>>2)]=num + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {try { + + + var stream = SYSCALLS.getStreamFromFD(fd); + var HIGH_OFFSET = 0x100000000; // 2^32 + // use an unsigned operator on low and shift high by 32-bits + var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); + + var DOUBLE_LIMIT = 0x20000000000000; // 2^53 + // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT + if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { + return -61; + } + + FS.llseek(stream, offset, whence); + (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)]=tempI64[0],HEAP32[(((newOffset)+(4))>>2)]=tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_write(fd, iov, iovcnt, pnum) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doWritev(stream, iov, iovcnt); + HEAP32[((pnum)>>2)]=num + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _getTempRet0() { + return (getTempRet0() | 0); + } + + + var ___tm_current=24176; + + + var ___tm_timezone=(stringToUTF8("GMT", 24224, 4), 24224);function _gmtime_r(time, tmPtr) { + var date = new Date(HEAP32[((time)>>2)]*1000); + HEAP32[((tmPtr)>>2)]=date.getUTCSeconds(); + HEAP32[(((tmPtr)+(4))>>2)]=date.getUTCMinutes(); + HEAP32[(((tmPtr)+(8))>>2)]=date.getUTCHours(); + HEAP32[(((tmPtr)+(12))>>2)]=date.getUTCDate(); + HEAP32[(((tmPtr)+(16))>>2)]=date.getUTCMonth(); + HEAP32[(((tmPtr)+(20))>>2)]=date.getUTCFullYear()-1900; + HEAP32[(((tmPtr)+(24))>>2)]=date.getUTCDay(); + HEAP32[(((tmPtr)+(36))>>2)]=0; + HEAP32[(((tmPtr)+(32))>>2)]=0; + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = ((date.getTime() - start) / (1000 * 60 * 60 * 24))|0; + HEAP32[(((tmPtr)+(28))>>2)]=yday; + HEAP32[(((tmPtr)+(40))>>2)]=___tm_timezone; + + return tmPtr; + }function _gmtime(time) { + return _gmtime_r(time, ___tm_current); + } + + + + function _tzset() { + // TODO: Use (malleable) environment variables instead of system settings. + if (_tzset.called) return; + _tzset.called = true; + + // timezone is specified as seconds west of UTC ("The external variable + // `timezone` shall be set to the difference, in seconds, between + // Coordinated Universal Time (UTC) and local standard time."), the same + // as returned by getTimezoneOffset(). + // See http://pubs.opengroup.org/onlinepubs/009695399/functions/tzset.html + HEAP32[((__get_timezone())>>2)]=(new Date()).getTimezoneOffset() * 60; + + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + HEAP32[((__get_daylight())>>2)]=Number(winter.getTimezoneOffset() != summer.getTimezoneOffset()); + + function extractZone(date) { + var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/); + return match ? match[1] : "GMT"; + }; + var winterName = extractZone(winter); + var summerName = extractZone(summer); + var winterNamePtr = allocateUTF8(winterName); + var summerNamePtr = allocateUTF8(summerName); + if (summer.getTimezoneOffset() < winter.getTimezoneOffset()) { + // Northern hemisphere + HEAP32[((__get_tzname())>>2)]=winterNamePtr; + HEAP32[(((__get_tzname())+(4))>>2)]=summerNamePtr; + } else { + HEAP32[((__get_tzname())>>2)]=summerNamePtr; + HEAP32[(((__get_tzname())+(4))>>2)]=winterNamePtr; + } + }function _localtime_r(time, tmPtr) { + _tzset(); + var date = new Date(HEAP32[((time)>>2)]*1000); + HEAP32[((tmPtr)>>2)]=date.getSeconds(); + HEAP32[(((tmPtr)+(4))>>2)]=date.getMinutes(); + HEAP32[(((tmPtr)+(8))>>2)]=date.getHours(); + HEAP32[(((tmPtr)+(12))>>2)]=date.getDate(); + HEAP32[(((tmPtr)+(16))>>2)]=date.getMonth(); + HEAP32[(((tmPtr)+(20))>>2)]=date.getFullYear()-1900; + HEAP32[(((tmPtr)+(24))>>2)]=date.getDay(); + + var start = new Date(date.getFullYear(), 0, 1); + var yday = ((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24))|0; + HEAP32[(((tmPtr)+(28))>>2)]=yday; + HEAP32[(((tmPtr)+(36))>>2)]=-(date.getTimezoneOffset() * 60); + + // Attention: DST is in December in South, and some regions don't have DST at all. + var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dst = (summerOffset != winterOffset && date.getTimezoneOffset() == Math.min(winterOffset, summerOffset))|0; + HEAP32[(((tmPtr)+(32))>>2)]=dst; + + var zonePtr = HEAP32[(((__get_tzname())+(dst ? 4 : 0))>>2)]; + HEAP32[(((tmPtr)+(40))>>2)]=zonePtr; + + return tmPtr; + }function _localtime(time) { + return _localtime_r(time, ___tm_current); + } + + function _mktime(tmPtr) { + _tzset(); + var date = new Date(HEAP32[(((tmPtr)+(20))>>2)] + 1900, + HEAP32[(((tmPtr)+(16))>>2)], + HEAP32[(((tmPtr)+(12))>>2)], + HEAP32[(((tmPtr)+(8))>>2)], + HEAP32[(((tmPtr)+(4))>>2)], + HEAP32[((tmPtr)>>2)], + 0); + + // There's an ambiguous hour when the time goes back; the tm_isdst field is + // used to disambiguate it. Date() basically guesses, so we fix it up if it + // guessed wrong, or fill in tm_isdst with the guess if it's -1. + var dst = HEAP32[(((tmPtr)+(32))>>2)]; + var guessedOffset = date.getTimezoneOffset(); + var start = new Date(date.getFullYear(), 0, 1); + var summerOffset = new Date(date.getFullYear(), 6, 1).getTimezoneOffset(); + var winterOffset = start.getTimezoneOffset(); + var dstOffset = Math.min(winterOffset, summerOffset); // DST is in December in South + if (dst < 0) { + // Attention: some regions don't have DST at all. + HEAP32[(((tmPtr)+(32))>>2)]=Number(summerOffset != winterOffset && dstOffset == guessedOffset); + } else if ((dst > 0) != (dstOffset == guessedOffset)) { + var nonDstOffset = Math.max(winterOffset, summerOffset); + var trueOffset = dst > 0 ? dstOffset : nonDstOffset; + // Don't try setMinutes(date.getMinutes() + ...) -- it's messed up. + date.setTime(date.getTime() + (trueOffset - guessedOffset)*60000); + } + + HEAP32[(((tmPtr)+(24))>>2)]=date.getDay(); + var yday = ((date.getTime() - start.getTime()) / (1000 * 60 * 60 * 24))|0; + HEAP32[(((tmPtr)+(28))>>2)]=yday; + + return (date.getTime() / 1000)|0; + } + + + function _setTempRet0($i) { + setTempRet0(($i) | 0); + } + + + var __sigalrm_handler=0;function _signal(sig, func) { + if (sig == 14 /*SIGALRM*/) { + __sigalrm_handler = func; + } else { + err('Calling stub instead of signal()'); + } + return 0; + } + + + function __isLeapYear(year) { + return year%4 === 0 && (year%100 !== 0 || year%400 === 0); + } + + function __arraySum(array, index) { + var sum = 0; + for (var i = 0; i <= index; sum += array[i++]) { + // no-op + } + return sum; + } + + + var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31]; + + var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date, days) { + var newDate = new Date(date.getTime()); + while(days > 0) { + var leap = __isLeapYear(newDate.getFullYear()); + var currentMonth = newDate.getMonth(); + var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; + + if (days > daysInCurrentMonth-newDate.getDate()) { + // we spill over to next month + days -= (daysInCurrentMonth-newDate.getDate()+1); + newDate.setDate(1); + if (currentMonth < 11) { + newDate.setMonth(currentMonth+1) + } else { + newDate.setMonth(0); + newDate.setFullYear(newDate.getFullYear()+1); + } + } else { + // we stay in current month + newDate.setDate(newDate.getDate()+days); + return newDate; + } + } + + return newDate; + }function _strftime(s, maxsize, format, tm) { + // size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr); + // http://pubs.opengroup.org/onlinepubs/009695399/functions/strftime.html + + var tm_zone = HEAP32[(((tm)+(40))>>2)]; + + var date = { + tm_sec: HEAP32[((tm)>>2)], + tm_min: HEAP32[(((tm)+(4))>>2)], + tm_hour: HEAP32[(((tm)+(8))>>2)], + tm_mday: HEAP32[(((tm)+(12))>>2)], + tm_mon: HEAP32[(((tm)+(16))>>2)], + tm_year: HEAP32[(((tm)+(20))>>2)], + tm_wday: HEAP32[(((tm)+(24))>>2)], + tm_yday: HEAP32[(((tm)+(28))>>2)], + tm_isdst: HEAP32[(((tm)+(32))>>2)], + tm_gmtoff: HEAP32[(((tm)+(36))>>2)], + tm_zone: tm_zone ? UTF8ToString(tm_zone) : '' + }; + + var pattern = UTF8ToString(format); + + // expand format + var EXPANSION_RULES_1 = { + '%c': '%a %b %d %H:%M:%S %Y', // Replaced by the locale's appropriate date and time representation - e.g., Mon Aug 3 14:02:01 2013 + '%D': '%m/%d/%y', // Equivalent to %m / %d / %y + '%F': '%Y-%m-%d', // Equivalent to %Y - %m - %d + '%h': '%b', // Equivalent to %b + '%r': '%I:%M:%S %p', // Replaced by the time in a.m. and p.m. notation + '%R': '%H:%M', // Replaced by the time in 24-hour notation + '%T': '%H:%M:%S', // Replaced by the time + '%x': '%m/%d/%y', // Replaced by the locale's appropriate date representation + '%X': '%H:%M:%S', // Replaced by the locale's appropriate time representation + // Modified Conversion Specifiers + '%Ec': '%c', // Replaced by the locale's alternative appropriate date and time representation. + '%EC': '%C', // Replaced by the name of the base year (period) in the locale's alternative representation. + '%Ex': '%m/%d/%y', // Replaced by the locale's alternative date representation. + '%EX': '%H:%M:%S', // Replaced by the locale's alternative time representation. + '%Ey': '%y', // Replaced by the offset from %EC (year only) in the locale's alternative representation. + '%EY': '%Y', // Replaced by the full alternative year representation. + '%Od': '%d', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading zeros if there is any alternative symbol for zero; otherwise, with leading characters. + '%Oe': '%e', // Replaced by the day of the month, using the locale's alternative numeric symbols, filled as needed with leading characters. + '%OH': '%H', // Replaced by the hour (24-hour clock) using the locale's alternative numeric symbols. + '%OI': '%I', // Replaced by the hour (12-hour clock) using the locale's alternative numeric symbols. + '%Om': '%m', // Replaced by the month using the locale's alternative numeric symbols. + '%OM': '%M', // Replaced by the minutes using the locale's alternative numeric symbols. + '%OS': '%S', // Replaced by the seconds using the locale's alternative numeric symbols. + '%Ou': '%u', // Replaced by the weekday as a number in the locale's alternative representation (Monday=1). + '%OU': '%U', // Replaced by the week number of the year (Sunday as the first day of the week, rules corresponding to %U ) using the locale's alternative numeric symbols. + '%OV': '%V', // Replaced by the week number of the year (Monday as the first day of the week, rules corresponding to %V ) using the locale's alternative numeric symbols. + '%Ow': '%w', // Replaced by the number of the weekday (Sunday=0) using the locale's alternative numeric symbols. + '%OW': '%W', // Replaced by the week number of the year (Monday as the first day of the week) using the locale's alternative numeric symbols. + '%Oy': '%y', // Replaced by the year (offset from %C ) using the locale's alternative numeric symbols. + }; + for (var rule in EXPANSION_RULES_1) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_1[rule]); + } + + var WEEKDAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var MONTHS = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + + function leadingSomething(value, digits, character) { + var str = typeof value === 'number' ? value.toString() : (value || ''); + while (str.length < digits) { + str = character[0]+str; + } + return str; + } + + function leadingNulls(value, digits) { + return leadingSomething(value, digits, '0'); + } + + function compareByDay(date1, date2) { + function sgn(value) { + return value < 0 ? -1 : (value > 0 ? 1 : 0); + } + + var compare; + if ((compare = sgn(date1.getFullYear()-date2.getFullYear())) === 0) { + if ((compare = sgn(date1.getMonth()-date2.getMonth())) === 0) { + compare = sgn(date1.getDate()-date2.getDate()); + } + } + return compare; + } + + function getFirstWeekStartDate(janFourth) { + switch (janFourth.getDay()) { + case 0: // Sunday + return new Date(janFourth.getFullYear()-1, 11, 29); + case 1: // Monday + return janFourth; + case 2: // Tuesday + return new Date(janFourth.getFullYear(), 0, 3); + case 3: // Wednesday + return new Date(janFourth.getFullYear(), 0, 2); + case 4: // Thursday + return new Date(janFourth.getFullYear(), 0, 1); + case 5: // Friday + return new Date(janFourth.getFullYear()-1, 11, 31); + case 6: // Saturday + return new Date(janFourth.getFullYear()-1, 11, 30); + } + } + + function getWeekBasedYear(date) { + var thisDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); + + var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); + var janFourthNextYear = new Date(thisDate.getFullYear()+1, 0, 4); + + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + + if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { + // this date is after the start of the first week of this year + if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { + return thisDate.getFullYear()+1; + } else { + return thisDate.getFullYear(); + } + } else { + return thisDate.getFullYear()-1; + } + } + + var EXPANSION_RULES_2 = { + '%a': function(date) { + return WEEKDAYS[date.tm_wday].substring(0,3); + }, + '%A': function(date) { + return WEEKDAYS[date.tm_wday]; + }, + '%b': function(date) { + return MONTHS[date.tm_mon].substring(0,3); + }, + '%B': function(date) { + return MONTHS[date.tm_mon]; + }, + '%C': function(date) { + var year = date.tm_year+1900; + return leadingNulls((year/100)|0,2); + }, + '%d': function(date) { + return leadingNulls(date.tm_mday, 2); + }, + '%e': function(date) { + return leadingSomething(date.tm_mday, 2, ' '); + }, + '%g': function(date) { + // %g, %G, and %V give values according to the ISO 8601:2000 standard week-based year. + // In this system, weeks begin on a Monday and week 1 of the year is the week that includes + // January 4th, which is also the week that includes the first Thursday of the year, and + // is also the first week that contains at least four days in the year. + // If the first Monday of January is the 2nd, 3rd, or 4th, the preceding days are part of + // the last week of the preceding year; thus, for Saturday 2nd January 1999, + // %G is replaced by 1998 and %V is replaced by 53. If December 29th, 30th, + // or 31st is a Monday, it and any following days are part of week 1 of the following year. + // Thus, for Tuesday 30th December 1997, %G is replaced by 1998 and %V is replaced by 01. + + return getWeekBasedYear(date).toString().substring(2); + }, + '%G': function(date) { + return getWeekBasedYear(date); + }, + '%H': function(date) { + return leadingNulls(date.tm_hour, 2); + }, + '%I': function(date) { + var twelveHour = date.tm_hour; + if (twelveHour == 0) twelveHour = 12; + else if (twelveHour > 12) twelveHour -= 12; + return leadingNulls(twelveHour, 2); + }, + '%j': function(date) { + // Day of the year (001-366) + return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon-1), 3); + }, + '%m': function(date) { + return leadingNulls(date.tm_mon+1, 2); + }, + '%M': function(date) { + return leadingNulls(date.tm_min, 2); + }, + '%n': function() { + return '\n'; + }, + '%p': function(date) { + if (date.tm_hour >= 0 && date.tm_hour < 12) { + return 'AM'; + } else { + return 'PM'; + } + }, + '%S': function(date) { + return leadingNulls(date.tm_sec, 2); + }, + '%t': function() { + return '\t'; + }, + '%u': function(date) { + return date.tm_wday || 7; + }, + '%U': function(date) { + // Replaced by the week number of the year as a decimal number [00,53]. + // The first Sunday of January is the first day of week 1; + // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] + var janFirst = new Date(date.tm_year+1900, 0, 1); + var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7-janFirst.getDay()); + var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); + + // is target date after the first Sunday? + if (compareByDay(firstSunday, endDate) < 0) { + // calculate difference in days between first Sunday and endDate + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; + var firstSundayUntilEndJanuary = 31-firstSunday.getDate(); + var days = firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); + return leadingNulls(Math.ceil(days/7), 2); + } + + return compareByDay(firstSunday, janFirst) === 0 ? '01': '00'; + }, + '%V': function(date) { + // Replaced by the week number of the year (Monday as the first day of the week) + // as a decimal number [01,53]. If the week containing 1 January has four + // or more days in the new year, then it is considered week 1. + // Otherwise, it is the last week of the previous year, and the next week is week 1. + // Both January 4th and the first Thursday of January are always in week 1. [ tm_year, tm_wday, tm_yday] + var janFourthThisYear = new Date(date.tm_year+1900, 0, 4); + var janFourthNextYear = new Date(date.tm_year+1901, 0, 4); + + var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); + var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); + + var endDate = __addDays(new Date(date.tm_year+1900, 0, 1), date.tm_yday); + + if (compareByDay(endDate, firstWeekStartThisYear) < 0) { + // if given date is before this years first week, then it belongs to the 53rd week of last year + return '53'; + } + + if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { + // if given date is after next years first week, then it belongs to the 01th week of next year + return '01'; + } + + // given date is in between CW 01..53 of this calendar year + var daysDifference; + if (firstWeekStartThisYear.getFullYear() < date.tm_year+1900) { + // first CW of this year starts last year + daysDifference = date.tm_yday+32-firstWeekStartThisYear.getDate() + } else { + // first CW of this year starts this year + daysDifference = date.tm_yday+1-firstWeekStartThisYear.getDate(); + } + return leadingNulls(Math.ceil(daysDifference/7), 2); + }, + '%w': function(date) { + return date.tm_wday; + }, + '%W': function(date) { + // Replaced by the week number of the year as a decimal number [00,53]. + // The first Monday of January is the first day of week 1; + // days in the new year before this are in week 0. [ tm_year, tm_wday, tm_yday] + var janFirst = new Date(date.tm_year, 0, 1); + var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7-janFirst.getDay()+1); + var endDate = new Date(date.tm_year+1900, date.tm_mon, date.tm_mday); + + // is target date after the first Monday? + if (compareByDay(firstMonday, endDate) < 0) { + var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth()-1)-31; + var firstMondayUntilEndJanuary = 31-firstMonday.getDate(); + var days = firstMondayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate(); + return leadingNulls(Math.ceil(days/7), 2); + } + return compareByDay(firstMonday, janFirst) === 0 ? '01': '00'; + }, + '%y': function(date) { + // Replaced by the last two digits of the year as a decimal number [00,99]. [ tm_year] + return (date.tm_year+1900).toString().substring(2); + }, + '%Y': function(date) { + // Replaced by the year as a decimal number (for example, 1997). [ tm_year] + return date.tm_year+1900; + }, + '%z': function(date) { + // Replaced by the offset from UTC in the ISO 8601:2000 standard format ( +hhmm or -hhmm ). + // For example, "-0430" means 4 hours 30 minutes behind UTC (west of Greenwich). + var off = date.tm_gmtoff; + var ahead = off >= 0; + off = Math.abs(off) / 60; + // convert from minutes into hhmm format (which means 60 minutes = 100 units) + off = (off / 60)*100 + (off % 60); + return (ahead ? '+' : '-') + String("0000" + off).slice(-4); + }, + '%Z': function(date) { + return date.tm_zone; + }, + '%%': function() { + return '%'; + } + }; + for (var rule in EXPANSION_RULES_2) { + if (pattern.indexOf(rule) >= 0) { + pattern = pattern.replace(new RegExp(rule, 'g'), EXPANSION_RULES_2[rule](date)); + } + } + + var bytes = intArrayFromString(pattern, false); + if (bytes.length > maxsize) { + return 0; + } + + writeArrayToMemory(bytes, s); + return bytes.length-1; + } + + function _system(command) { + if (ENVIRONMENT_IS_NODE) { + if (!command) return 1; // shell is available + + var cmdstr = UTF8ToString(command); + if (!cmdstr.length) return 0; // this is what glibc seems to do (shell works test?) + + var cp = require('child_process'); + var ret = cp.spawnSync(cmdstr, [], {shell:true, stdio:'inherit'}); + + var _W_EXITCODE = function(ret, sig) { + return ((ret) << 8 | (sig)); + } + + // this really only can happen if process is killed by signal + if (ret.status === null) { + // sadly node doesn't expose such function + var signalToNumber = function(sig) { + // implement only the most common ones, and fallback to SIGINT + switch (sig) { + case 'SIGHUP': return 1; + case 'SIGINT': return 2; + case 'SIGQUIT': return 3; + case 'SIGFPE': return 8; + case 'SIGKILL': return 9; + case 'SIGALRM': return 14; + case 'SIGTERM': return 15; + } + return 2; // SIGINT + } + return _W_EXITCODE(0, signalToNumber(ret.signal)); + } + + return _W_EXITCODE(ret.status, 0); + } + // int system(const char *command); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/system.html + // Can't call external programs. + if (!command) return 0; // no shell available + setErrNo(6); + return -1; + } + + + function _time(ptr) { + var ret = (Date.now()/1000)|0; + if (ptr) { + HEAP32[((ptr)>>2)]=ret; + } + return ret; + } +var FSNode = /** @constructor */ function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + var readMode = 292/*292*/ | 73/*73*/; + var writeMode = 146/*146*/; + Object.defineProperties(FSNode.prototype, { + read: { + get: /** @this{FSNode} */function() { + return (this.mode & readMode) === readMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= readMode : this.mode &= ~readMode; + } + }, + write: { + get: /** @this{FSNode} */function() { + return (this.mode & writeMode) === writeMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= writeMode : this.mode &= ~writeMode; + } + }, + isFolder: { + get: /** @this{FSNode} */function() { + return FS.isDir(this.mode); + } + }, + isDevice: { + get: /** @this{FSNode} */function() { + return FS.isChrdev(this.mode); + } + } + }); + FS.FSNode = FSNode; + FS.staticInit();; +var ASSERTIONS = true; + +/** + * @license + * Copyright 2017 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +var asmGlobalArg = {}; +var asmLibraryArg = { "__clock_gettime": ___clock_gettime, "__handle_stack_overflow": ___handle_stack_overflow, "__map_file": ___map_file, "__sys_dup2": ___sys_dup2, "__sys_dup3": ___sys_dup3, "__sys_fcntl64": ___sys_fcntl64, "__sys_ioctl": ___sys_ioctl, "__sys_lstat64": ___sys_lstat64, "__sys_munmap": ___sys_munmap, "__sys_open": ___sys_open, "__sys_rename": ___sys_rename, "__sys_rmdir": ___sys_rmdir, "__sys_unlink": ___sys_unlink, "abort": _abort, "clock": _clock, "difftime": _difftime, "emscripten_get_sbrk_ptr": _emscripten_get_sbrk_ptr, "emscripten_longjmp": _emscripten_longjmp, "emscripten_memcpy_big": _emscripten_memcpy_big, "emscripten_resize_heap": _emscripten_resize_heap, "environ_get": _environ_get, "environ_sizes_get": _environ_sizes_get, "exit": _exit, "fd_close": _fd_close, "fd_read": _fd_read, "fd_seek": _fd_seek, "fd_write": _fd_write, "getTempRet0": _getTempRet0, "gmtime": _gmtime, "invoke_vii": invoke_vii, "localtime": _localtime, "memory": wasmMemory, "mktime": _mktime, "saveSetjmp": _saveSetjmp, "setTempRet0": _setTempRet0, "signal": _signal, "strftime": _strftime, "system": _system, "table": wasmTable, "testSetjmp": _testSetjmp, "time": _time }; +var asm = createWasm(); +Module["asm"] = asm; +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__wasm_call_ctors"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _main = Module["_main"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["main"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _fflush = Module["_fflush"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["fflush"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["malloc"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _free = Module["_free"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["free"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__errno_location"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _realloc = Module["_realloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["realloc"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __get_tzname = Module["__get_tzname"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_get_tzname"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __get_daylight = Module["__get_daylight"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_get_daylight"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __get_timezone = Module["__get_timezone"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_get_timezone"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _setThrew = Module["_setThrew"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["setThrew"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_vii = Module["dynCall_vii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_vii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var ___set_stack_limit = Module["___set_stack_limit"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__set_stack_limit"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackSave"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackAlloc"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackRestore"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __growWasmMemory = Module["__growWasmMemory"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__growWasmMemory"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_ii = Module["dynCall_ii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_ii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_vi = Module["dynCall_vi"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_vi"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iii = Module["dynCall_iii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iiii = Module["dynCall_iiii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iiii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iiiii = Module["dynCall_iiiii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iiiii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_viii = Module["dynCall_viii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_viii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_jiji = Module["dynCall_jiji"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_jiji"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iidiiii = Module["dynCall_iidiiii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iidiiii"].apply(null, arguments) +}; + + +function invoke_vii(index,a1,a2) { + var sp = stackSave(); + try { + dynCall_vii(index,a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0 && e !== 'longjmp') throw e; + _setThrew(1, 0); + } +} + + +/** + * @license + * Copyright 2010 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// === Auto-generated postamble setup entry stuff === + +Module['asm'] = asm; + +if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = function() { abort("'ccall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = function() { abort("'cwrap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getMemory")) Module["getMemory"] = function() { abort("'getMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "dynamicAlloc")) Module["dynamicAlloc"] = function() { abort("'dynamicAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "loadDynamicLibrary")) Module["loadDynamicLibrary"] = function() { abort("'loadDynamicLibrary' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "loadWebAssemblyModule")) Module["loadWebAssemblyModule"] = function() { abort("'loadWebAssemblyModule' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "makeBigInt")) Module["makeBigInt"] = function() { abort("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = function() { abort("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = function() { abort("'callMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = function() { abort("'abort' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = function() { abort("'stringToNewUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "abortOnCannotGrowMemory")) Module["abortOnCannotGrowMemory"] = function() { abort("'abortOnCannotGrowMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = function() { abort("'emscripten_realloc_buffer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setjmpId")) Module["setjmpId"] = function() { abort("'setjmpId' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = function() { abort("'ERRNO_CODES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = function() { abort("'ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = function() { abort("'setErrNo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = function() { abort("'DNS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = function() { abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = function() { abort("'Protocols' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = function() { abort("'Sockets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = function() { abort("'UNWIND_CACHE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = function() { abort("'readAsmConstArgs' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = function() { abort("'jstoi_q' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = function() { abort("'jstoi_s' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = function() { abort("'reallyNegative' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = function() { abort("'formatString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = function() { abort("'PATH' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = function() { abort("'PATH_FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = function() { abort("'SYSCALLS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = function() { abort("'syscallMmap2' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = function() { abort("'syscallMunmap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = function() { abort("'JSEvents' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = function() { abort("'specialHTMLTargets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = function() { abort("'demangle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = function() { abort("'demangleAll' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = function() { abort("'jsStackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = function() { abort("'getEnvStrings' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = function() { abort("'writeI53ToI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = function() { abort("'writeI53ToI64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = function() { abort("'writeI53ToI64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = function() { abort("'writeI53ToU64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = function() { abort("'writeI53ToU64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = function() { abort("'readI53FromI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = function() { abort("'readI53FromU64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = function() { abort("'convertI32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = function() { abort("'convertU32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = function() { abort("'Browser' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = function() { abort("'FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = function() { abort("'MEMFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = function() { abort("'TTY' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = function() { abort("'PIPEFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = function() { abort("'SOCKFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = function() { abort("'GL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = function() { abort("'emscriptenWebGLGet' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = function() { abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = function() { abort("'emscriptenWebGLGetUniform' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = function() { abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = function() { abort("'AL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = function() { abort("'SDL_unicode' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = function() { abort("'SDL_ttfContext' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = function() { abort("'SDL_audio' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = function() { abort("'SDL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = function() { abort("'SDL_gfx' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = function() { abort("'GLUT' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = function() { abort("'EGL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = function() { abort("'GLFW_Window' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = function() { abort("'GLFW' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = function() { abort("'GLEW' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = function() { abort("'IDBStore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = function() { abort("'runAndAbortIfError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = function() { abort("'allocateUTF8OnStack' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +Module["writeStackCookie"] = writeStackCookie; +Module["checkStackCookie"] = checkStackCookie; +Module["abortStackOverflow"] = abortStackOverflow;if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_DYNAMIC")) Object.defineProperty(Module, "ALLOC_DYNAMIC", { configurable: true, get: function() { abort("'ALLOC_DYNAMIC' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NONE")) Object.defineProperty(Module, "ALLOC_NONE", { configurable: true, get: function() { abort("'ALLOC_NONE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); + + + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function callMain(args) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = Module['_main']; + + + args = args || []; + + var argc = args.length+1; + var argv = stackAlloc((argc + 1) * 4); + HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram); + for (var i = 1; i < argc; i++) { + HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]); + } + HEAP32[(argv >> 2) + argc] = 0; + + + try { + + Module['___set_stack_limit'](STACK_MAX); + + var ret = entryFunction(argc, argv); + + + // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as execution is asynchronously handed + // off to a pthread. + // if we're not running an evented main loop, it's time to exit + exit(ret, /* implicit = */ true); + } + catch(e) { + if (e instanceof ExitStatus) { + // exit() throws this once it's done to make sure execution + // has been stopped completely + return; + } else if (e == 'unwind') { + // running an evented main loop, don't immediately exit + noExitRuntime = true; + return; + } else { + var toLog = e; + if (e && typeof e === 'object' && e.stack) { + toLog = [e, e.stack]; + } + err('exception thrown: ' + toLog); + quit_(1, e); + } + } finally { + calledMain = true; + } +} + + + + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + writeStackCookie(); + + preRun(); + + if (runDependencies > 0) return; // a preRun added a dependency, run will be called later + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (shouldRunNow) callMain(args); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var print = out; + var printErr = err; + var has = false; + out = err = function(x) { + has = true; + } + try { // it doesn't matter if it fails + var flush = Module['_fflush']; + if (flush) flush(0); + // also flush in the JS FS layer + ['stdout', 'stderr'].forEach(function(name) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty && tty.output && tty.output.length) { + has = true; + } + }); + } catch(e) {} + out = print; + err = printErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + checkUnflushedContent(); + + // if this is just main exit-ing implicitly, and the status is 0, then we + // don't need to do anything here and can just leave. if the status is + // non-zero, though, then we need to report it. + // (we may have warned about this earlier, if a situation justifies doing so) + if (implicit && noExitRuntime && status === 0) { + return; + } + + if (noExitRuntime) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; + err(msg); + } + } else { + + ABORT = true; + EXITSTATUS = status; + + exitRuntime(); + + if (Module['onExit']) Module['onExit'](status); + } + + quit_(status, new ExitStatus(status)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; + +if (Module['noInitialRun']) shouldRunNow = false; + + + noExitRuntime = true; + +run(); + + + + + +// {{MODULE_ADDITIONS}} + + + diff --git a/lua-5.4.0/src/lua.c b/lua-5.4.0/src/lua.c new file mode 100644 index 0000000..454ce12 --- /dev/null +++ b/lua-5.4.0/src/lua.c @@ -0,0 +1,635 @@ +/* +** $Id: lua.c $ +** Lua stand-alone interpreter +** See Copyright Notice in lua.h +*/ + +#define lua_c + +#include "lprefix.h" + + +#include +#include +#include + +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#if !defined(LUA_PROGNAME) +#define LUA_PROGNAME "lua" +#endif + +#if !defined(LUA_INIT_VAR) +#define LUA_INIT_VAR "LUA_INIT" +#endif + +#define LUA_INITVARVERSION LUA_INIT_VAR LUA_VERSUFFIX + + +static lua_State *globalL = NULL; + +static const char *progname = LUA_PROGNAME; + + +/* +** Hook set by signal function to stop the interpreter. +*/ +static void lstop (lua_State *L, lua_Debug *ar) { + (void)ar; /* unused arg. */ + lua_sethook(L, NULL, 0, 0); /* reset hook */ + luaL_error(L, "interrupted!"); +} + + +/* +** Function to be called at a C signal. Because a C signal cannot +** just change a Lua state (as there is no proper synchronization), +** this function only sets a hook that, when called, will stop the +** interpreter. +*/ +static void laction (int i) { + int flag = LUA_MASKCALL | LUA_MASKRET | LUA_MASKLINE | LUA_MASKCOUNT; + signal(i, SIG_DFL); /* if another SIGINT happens, terminate process */ + lua_sethook(globalL, lstop, flag, 1); +} + + +static void print_usage (const char *badoption) { + lua_writestringerror("%s: ", progname); + if (badoption[1] == 'e' || badoption[1] == 'l') + lua_writestringerror("'%s' needs argument\n", badoption); + else + lua_writestringerror("unrecognized option '%s'\n", badoption); + lua_writestringerror( + "usage: %s [options] [script [args]]\n" + "Available options are:\n" + " -e stat execute string 'stat'\n" + " -i enter interactive mode after executing 'script'\n" + " -l name require library 'name' into global 'name'\n" + " -v show version information\n" + " -E ignore environment variables\n" + " -W turn warnings on\n" + " -- stop handling options\n" + " - stop handling options and execute stdin\n" + , + progname); +} + + +/* +** Prints an error message, adding the program name in front of it +** (if present) +*/ +static void l_message (const char *pname, const char *msg) { + if (pname) lua_writestringerror("%s: ", pname); + lua_writestringerror("%s\n", msg); +} + + +/* +** Check whether 'status' is not OK and, if so, prints the error +** message on the top of the stack. It assumes that the error object +** is a string, as it was either generated by Lua or by 'msghandler'. +*/ +static int report (lua_State *L, int status) { + if (status != LUA_OK) { + const char *msg = lua_tostring(L, -1); + l_message(progname, msg); + lua_pop(L, 1); /* remove message */ + } + return status; +} + + +/* +** Message handler used to run all chunks +*/ +static int msghandler (lua_State *L) { + const char *msg = lua_tostring(L, 1); + if (msg == NULL) { /* is error object not a string? */ + if (luaL_callmeta(L, 1, "__tostring") && /* does it have a metamethod */ + lua_type(L, -1) == LUA_TSTRING) /* that produces a string? */ + return 1; /* that is the message */ + else + msg = lua_pushfstring(L, "(error object is a %s value)", + luaL_typename(L, 1)); + } + luaL_traceback(L, L, msg, 1); /* append a standard traceback */ + return 1; /* return the traceback */ +} + + +/* +** Interface to 'lua_pcall', which sets appropriate message function +** and C-signal handler. Used to run all chunks. +*/ +static int docall (lua_State *L, int narg, int nres) { + int status; + int base = lua_gettop(L) - narg; /* function index */ + lua_pushcfunction(L, msghandler); /* push message handler */ + lua_insert(L, base); /* put it under function and args */ + globalL = L; /* to be available to 'laction' */ + signal(SIGINT, laction); /* set C-signal handler */ + status = lua_pcall(L, narg, nres, base); + signal(SIGINT, SIG_DFL); /* reset C-signal handler */ + lua_remove(L, base); /* remove message handler from the stack */ + return status; +} + + +static void print_version (void) { + lua_writestring(LUA_COPYRIGHT, strlen(LUA_COPYRIGHT)); + lua_writeline(); +} + + +/* +** Create the 'arg' table, which stores all arguments from the +** command line ('argv'). It should be aligned so that, at index 0, +** it has 'argv[script]', which is the script name. The arguments +** to the script (everything after 'script') go to positive indices; +** other arguments (before the script name) go to negative indices. +** If there is no script name, assume interpreter's name as base. +*/ +static void createargtable (lua_State *L, char **argv, int argc, int script) { + int i, narg; + if (script == argc) script = 0; /* no script name? */ + narg = argc - (script + 1); /* number of positive indices */ + lua_createtable(L, narg, script + 1); + for (i = 0; i < argc; i++) { + lua_pushstring(L, argv[i]); + lua_rawseti(L, -2, i - script); + } + lua_setglobal(L, "arg"); +} + + +static int dochunk (lua_State *L, int status) { + if (status == LUA_OK) status = docall(L, 0, 0); + return report(L, status); +} + + +static int dofile (lua_State *L, const char *name) { + return dochunk(L, luaL_loadfile(L, name)); +} + + +static int dostring (lua_State *L, const char *s, const char *name) { + return dochunk(L, luaL_loadbuffer(L, s, strlen(s), name)); +} + + +/* +** Calls 'require(name)' and stores the result in a global variable +** with the given name. +*/ +static int dolibrary (lua_State *L, const char *name) { + int status; + lua_getglobal(L, "require"); + lua_pushstring(L, name); + status = docall(L, 1, 1); /* call 'require(name)' */ + if (status == LUA_OK) + lua_setglobal(L, name); /* global[name] = require return */ + return report(L, status); +} + + +/* +** Push on the stack the contents of table 'arg' from 1 to #arg +*/ +static int pushargs (lua_State *L) { + int i, n; + if (lua_getglobal(L, "arg") != LUA_TTABLE) + luaL_error(L, "'arg' is not a table"); + n = (int)luaL_len(L, -1); + luaL_checkstack(L, n + 3, "too many arguments to script"); + for (i = 1; i <= n; i++) + lua_rawgeti(L, -i, i); + lua_remove(L, -i); /* remove table from the stack */ + return n; +} + + +static int handle_script (lua_State *L, char **argv) { + int status; + const char *fname = argv[0]; + if (strcmp(fname, "-") == 0 && strcmp(argv[-1], "--") != 0) + fname = NULL; /* stdin */ + status = luaL_loadfile(L, fname); + if (status == LUA_OK) { + int n = pushargs(L); /* push arguments to script */ + status = docall(L, n, LUA_MULTRET); + } + return report(L, status); +} + + +/* bits of various argument indicators in 'args' */ +#define has_error 1 /* bad option */ +#define has_i 2 /* -i */ +#define has_v 4 /* -v */ +#define has_e 8 /* -e */ +#define has_E 16 /* -E */ + + +/* +** Traverses all arguments from 'argv', returning a mask with those +** needed before running any Lua code (or an error code if it finds +** any invalid argument). 'first' returns the first not-handled argument +** (either the script name or a bad argument in case of error). +*/ +static int collectargs (char **argv, int *first) { + int args = 0; + int i; + for (i = 1; argv[i] != NULL; i++) { + *first = i; + if (argv[i][0] != '-') /* not an option? */ + return args; /* stop handling options */ + switch (argv[i][1]) { /* else check option */ + case '-': /* '--' */ + if (argv[i][2] != '\0') /* extra characters after '--'? */ + return has_error; /* invalid option */ + *first = i + 1; + return args; + case '\0': /* '-' */ + return args; /* script "name" is '-' */ + case 'E': + if (argv[i][2] != '\0') /* extra characters? */ + return has_error; /* invalid option */ + args |= has_E; + break; + case 'W': + if (argv[i][2] != '\0') /* extra characters? */ + return has_error; /* invalid option */ + break; + case 'i': + args |= has_i; /* (-i implies -v) *//* FALLTHROUGH */ + case 'v': + if (argv[i][2] != '\0') /* extra characters? */ + return has_error; /* invalid option */ + args |= has_v; + break; + case 'e': + args |= has_e; /* FALLTHROUGH */ + case 'l': /* both options need an argument */ + if (argv[i][2] == '\0') { /* no concatenated argument? */ + i++; /* try next 'argv' */ + if (argv[i] == NULL || argv[i][0] == '-') + return has_error; /* no next argument or it is another option */ + } + break; + default: /* invalid option */ + return has_error; + } + } + *first = i; /* no script name */ + return args; +} + + +/* +** Processes options 'e' and 'l', which involve running Lua code, and +** 'W', which also affects the state. +** Returns 0 if some code raises an error. +*/ +static int runargs (lua_State *L, char **argv, int n) { + int i; + for (i = 1; i < n; i++) { + int option = argv[i][1]; + lua_assert(argv[i][0] == '-'); /* already checked */ + switch (option) { + case 'e': case 'l': { + int status; + const char *extra = argv[i] + 2; /* both options need an argument */ + if (*extra == '\0') extra = argv[++i]; + lua_assert(extra != NULL); + status = (option == 'e') + ? dostring(L, extra, "=(command line)") + : dolibrary(L, extra); + if (status != LUA_OK) return 0; + break; + } + case 'W': + lua_warning(L, "@on", 0); /* warnings on */ + break; + } + } + return 1; +} + + +static int handle_luainit (lua_State *L) { + const char *name = "=" LUA_INITVARVERSION; + const char *init = getenv(name + 1); + if (init == NULL) { + name = "=" LUA_INIT_VAR; + init = getenv(name + 1); /* try alternative name */ + } + if (init == NULL) return LUA_OK; + else if (init[0] == '@') + return dofile(L, init+1); + else + return dostring(L, init, name); +} + + +/* +** {================================================================== +** Read-Eval-Print Loop (REPL) +** =================================================================== +*/ + +#if !defined(LUA_PROMPT) +#define LUA_PROMPT "> " +#define LUA_PROMPT2 ">> " +#endif + +#if !defined(LUA_MAXINPUT) +#define LUA_MAXINPUT 512 +#endif + + +/* +** lua_stdin_is_tty detects whether the standard input is a 'tty' (that +** is, whether we're running lua interactively). +*/ +#if !defined(lua_stdin_is_tty) /* { */ + +#if defined(LUA_USE_POSIX) /* { */ + +#include +#define lua_stdin_is_tty() isatty(0) + +#elif defined(LUA_USE_WINDOWS) /* }{ */ + +#include +#include + +#define lua_stdin_is_tty() _isatty(_fileno(stdin)) + +#else /* }{ */ + +/* ISO C definition */ +#define lua_stdin_is_tty() 1 /* assume stdin is a tty */ + +#endif /* } */ + +#endif /* } */ + + +/* +** lua_readline defines how to show a prompt and then read a line from +** the standard input. +** lua_saveline defines how to "save" a read line in a "history". +** lua_freeline defines how to free a line read by lua_readline. +*/ +#if !defined(lua_readline) /* { */ + +#if defined(LUA_USE_READLINE) /* { */ + +#include +#include +#define lua_initreadline(L) ((void)L, rl_readline_name="lua") +#define lua_readline(L,b,p) ((void)L, ((b)=readline(p)) != NULL) +#define lua_saveline(L,line) ((void)L, add_history(line)) +#define lua_freeline(L,b) ((void)L, free(b)) + +#else /* }{ */ + +#define lua_initreadline(L) ((void)L) +#define lua_readline(L,b,p) \ + ((void)L, fputs(p, stdout), fflush(stdout), /* show prompt */ \ + fgets(b, LUA_MAXINPUT, stdin) != NULL) /* get line */ +#define lua_saveline(L,line) { (void)L; (void)line; } +#define lua_freeline(L,b) { (void)L; (void)b; } + +#endif /* } */ + +#endif /* } */ + + +/* +** Returns the string to be used as a prompt by the interpreter. +*/ +static const char *get_prompt (lua_State *L, int firstline) { + const char *p; + lua_getglobal(L, firstline ? "_PROMPT" : "_PROMPT2"); + p = lua_tostring(L, -1); + if (p == NULL) p = (firstline ? LUA_PROMPT : LUA_PROMPT2); + return p; +} + +/* mark in error messages for incomplete statements */ +#define EOFMARK "" +#define marklen (sizeof(EOFMARK)/sizeof(char) - 1) + + +/* +** Check whether 'status' signals a syntax error and the error +** message at the top of the stack ends with the above mark for +** incomplete statements. +*/ +static int incomplete (lua_State *L, int status) { + if (status == LUA_ERRSYNTAX) { + size_t lmsg; + const char *msg = lua_tolstring(L, -1, &lmsg); + if (lmsg >= marklen && strcmp(msg + lmsg - marklen, EOFMARK) == 0) { + lua_pop(L, 1); + return 1; + } + } + return 0; /* else... */ +} + + +/* +** Prompt the user, read a line, and push it into the Lua stack. +*/ +static int pushline (lua_State *L, int firstline) { + char buffer[LUA_MAXINPUT]; + char *b = buffer; + size_t l; + const char *prmt = get_prompt(L, firstline); + int readstatus = lua_readline(L, b, prmt); + if (readstatus == 0) + return 0; /* no input (prompt will be popped by caller) */ + lua_pop(L, 1); /* remove prompt */ + l = strlen(b); + if (l > 0 && b[l-1] == '\n') /* line ends with newline? */ + b[--l] = '\0'; /* remove it */ + if (firstline && b[0] == '=') /* for compatibility with 5.2, ... */ + lua_pushfstring(L, "return %s", b + 1); /* change '=' to 'return' */ + else + lua_pushlstring(L, b, l); + lua_freeline(L, b); + return 1; +} + + +/* +** Try to compile line on the stack as 'return ;'; on return, stack +** has either compiled chunk or original line (if compilation failed). +*/ +static int addreturn (lua_State *L) { + const char *line = lua_tostring(L, -1); /* original line */ + const char *retline = lua_pushfstring(L, "return %s;", line); + int status = luaL_loadbuffer(L, retline, strlen(retline), "=stdin"); + if (status == LUA_OK) { + lua_remove(L, -2); /* remove modified line */ + if (line[0] != '\0') /* non empty? */ + lua_saveline(L, line); /* keep history */ + } + else + lua_pop(L, 2); /* pop result from 'luaL_loadbuffer' and modified line */ + return status; +} + + +/* +** Read multiple lines until a complete Lua statement +*/ +static int multiline (lua_State *L) { + for (;;) { /* repeat until gets a complete statement */ + size_t len; + const char *line = lua_tolstring(L, 1, &len); /* get what it has */ + int status = luaL_loadbuffer(L, line, len, "=stdin"); /* try it */ + if (!incomplete(L, status) || !pushline(L, 0)) { + lua_saveline(L, line); /* keep history */ + return status; /* cannot or should not try to add continuation line */ + } + lua_pushliteral(L, "\n"); /* add newline... */ + lua_insert(L, -2); /* ...between the two lines */ + lua_concat(L, 3); /* join them */ + } +} + + +/* +** Read a line and try to load (compile) it first as an expression (by +** adding "return " in front of it) and second as a statement. Return +** the final status of load/call with the resulting function (if any) +** in the top of the stack. +*/ +static int loadline (lua_State *L) { + int status; + lua_settop(L, 0); + if (!pushline(L, 1)) + return -1; /* no input */ + if ((status = addreturn(L)) != LUA_OK) /* 'return ...' did not work? */ + status = multiline(L); /* try as command, maybe with continuation lines */ + lua_remove(L, 1); /* remove line from the stack */ + lua_assert(lua_gettop(L) == 1); + return status; +} + + +/* +** Prints (calling the Lua 'print' function) any values on the stack +*/ +static void l_print (lua_State *L) { + int n = lua_gettop(L); + if (n > 0) { /* any result to be printed? */ + luaL_checkstack(L, LUA_MINSTACK, "too many results to print"); + lua_getglobal(L, "print"); + lua_insert(L, 1); + if (lua_pcall(L, n, 0, 0) != LUA_OK) + l_message(progname, lua_pushfstring(L, "error calling 'print' (%s)", + lua_tostring(L, -1))); + } +} + + +/* +** Do the REPL: repeatedly read (load) a line, evaluate (call) it, and +** print any results. +*/ +static void doREPL (lua_State *L) { + int status; + const char *oldprogname = progname; + progname = NULL; /* no 'progname' on errors in interactive mode */ + lua_initreadline(L); + while ((status = loadline(L)) != -1) { + if (status == LUA_OK) + status = docall(L, 0, LUA_MULTRET); + if (status == LUA_OK) l_print(L); + else report(L, status); + } + lua_settop(L, 0); /* clear stack */ + lua_writeline(); + progname = oldprogname; +} + +/* }================================================================== */ + + +/* +** Main body of stand-alone interpreter (to be called in protected mode). +** Reads the options and handles them all. +*/ +static int pmain (lua_State *L) { + int argc = (int)lua_tointeger(L, 1); + char **argv = (char **)lua_touserdata(L, 2); + int script; + int args = collectargs(argv, &script); + luaL_checkversion(L); /* check that interpreter has correct version */ + if (argv[0] && argv[0][0]) progname = argv[0]; + if (args == has_error) { /* bad arg? */ + print_usage(argv[script]); /* 'script' has index of bad arg. */ + return 0; + } + if (args & has_v) /* option '-v'? */ + print_version(); + if (args & has_E) { /* option '-E'? */ + lua_pushboolean(L, 1); /* signal for libraries to ignore env. vars. */ + lua_setfield(L, LUA_REGISTRYINDEX, "LUA_NOENV"); + } + luaL_openlibs(L); /* open standard libraries */ + createargtable(L, argv, argc, script); /* create table 'arg' */ + lua_gc(L, LUA_GCGEN, 0, 0); /* GC in generational mode */ + if (!(args & has_E)) { /* no option '-E'? */ + if (handle_luainit(L) != LUA_OK) /* run LUA_INIT */ + return 0; /* error running LUA_INIT */ + } + if (!runargs(L, argv, script)) /* execute arguments -e and -l */ + return 0; /* something failed */ + if (script < argc && /* execute main script (if there is one) */ + handle_script(L, argv + script) != LUA_OK) + return 0; + if (args & has_i) /* -i option? */ + doREPL(L); /* do read-eval-print loop */ + else if (script == argc && !(args & (has_e | has_v))) { /* no arguments? */ + if (lua_stdin_is_tty()) { /* running in interactive mode? */ + print_version(); + doREPL(L); /* do read-eval-print loop */ + } + else dofile(L, NULL); /* executes stdin as a file */ + } + lua_pushboolean(L, 1); /* signal no errors */ + return 1; +} + + +int main (int argc, char **argv) { + int status, result; + lua_State *L = luaL_newstate(); /* create state */ + if (L == NULL) { + l_message(argv[0], "cannot create state: not enough memory"); + return EXIT_FAILURE; + } + lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */ + lua_pushinteger(L, argc); /* 1st argument */ + lua_pushlightuserdata(L, argv); /* 2nd argument */ + status = lua_pcall(L, 2, 1, 0); /* do the call */ + result = lua_toboolean(L, -1); /* get result */ + report(L, status); + lua_close(L); + return (result && status == LUA_OK) ? EXIT_SUCCESS : EXIT_FAILURE; +} + diff --git a/lua-5.4.0/src/lua.h b/lua-5.4.0/src/lua.h new file mode 100644 index 0000000..b348c14 --- /dev/null +++ b/lua-5.4.0/src/lua.h @@ -0,0 +1,517 @@ +/* +** $Id: lua.h $ +** Lua - A Scripting Language +** Lua.org, PUC-Rio, Brazil (http://www.lua.org) +** See Copyright Notice at the end of this file +*/ + + +#ifndef lua_h +#define lua_h + +#include +#include + + +#include "luaconf.h" + + +#define LUA_VERSION_MAJOR "5" +#define LUA_VERSION_MINOR "4" +#define LUA_VERSION_RELEASE "0" + +#define LUA_VERSION_NUM 504 +#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 0) + +#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE +#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2020 Lua.org, PUC-Rio" +#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes" + + +/* mark for precompiled code ('Lua') */ +#define LUA_SIGNATURE "\x1bLua" + +/* option for multiple returns in 'lua_pcall' and 'lua_call' */ +#define LUA_MULTRET (-1) + + +/* +** Pseudo-indices +** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty +** space after that to help overflow detection) +*/ +#define LUA_REGISTRYINDEX (-LUAI_MAXSTACK - 1000) +#define lua_upvalueindex(i) (LUA_REGISTRYINDEX - (i)) + + +/* thread status */ +#define LUA_OK 0 +#define LUA_YIELD 1 +#define LUA_ERRRUN 2 +#define LUA_ERRSYNTAX 3 +#define LUA_ERRMEM 4 +#define LUA_ERRERR 5 + + +typedef struct lua_State lua_State; + + +/* +** basic types +*/ +#define LUA_TNONE (-1) + +#define LUA_TNIL 0 +#define LUA_TBOOLEAN 1 +#define LUA_TLIGHTUSERDATA 2 +#define LUA_TNUMBER 3 +#define LUA_TSTRING 4 +#define LUA_TTABLE 5 +#define LUA_TFUNCTION 6 +#define LUA_TUSERDATA 7 +#define LUA_TTHREAD 8 + +#define LUA_NUMTYPES 9 + + + +/* minimum Lua stack available to a C function */ +#define LUA_MINSTACK 20 + + +/* predefined values in the registry */ +#define LUA_RIDX_MAINTHREAD 1 +#define LUA_RIDX_GLOBALS 2 +#define LUA_RIDX_LAST LUA_RIDX_GLOBALS + + +/* type of numbers in Lua */ +typedef LUA_NUMBER lua_Number; + + +/* type for integer functions */ +typedef LUA_INTEGER lua_Integer; + +/* unsigned integer type */ +typedef LUA_UNSIGNED lua_Unsigned; + +/* type for continuation-function contexts */ +typedef LUA_KCONTEXT lua_KContext; + + +/* +** Type for C functions registered with Lua +*/ +typedef int (*lua_CFunction) (lua_State *L); + +/* +** Type for continuation functions +*/ +typedef int (*lua_KFunction) (lua_State *L, int status, lua_KContext ctx); + + +/* +** Type for functions that read/write blocks when loading/dumping Lua chunks +*/ +typedef const char * (*lua_Reader) (lua_State *L, void *ud, size_t *sz); + +typedef int (*lua_Writer) (lua_State *L, const void *p, size_t sz, void *ud); + + +/* +** Type for memory-allocation functions +*/ +typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize); + + +/* +** Type for warning functions +*/ +typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont); + + + + +/* +** generic extra include file +*/ +#if defined(LUA_USER_H) +#include LUA_USER_H +#endif + + +/* +** RCS ident string +*/ +extern const char lua_ident[]; + + +/* +** state manipulation +*/ +LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud); +LUA_API void (lua_close) (lua_State *L); +LUA_API lua_State *(lua_newthread) (lua_State *L); +LUA_API int (lua_resetthread) (lua_State *L); + +LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf); + + +LUA_API lua_Number (lua_version) (lua_State *L); + + +/* +** basic stack manipulation +*/ +LUA_API int (lua_absindex) (lua_State *L, int idx); +LUA_API int (lua_gettop) (lua_State *L); +LUA_API void (lua_settop) (lua_State *L, int idx); +LUA_API void (lua_pushvalue) (lua_State *L, int idx); +LUA_API void (lua_rotate) (lua_State *L, int idx, int n); +LUA_API void (lua_copy) (lua_State *L, int fromidx, int toidx); +LUA_API int (lua_checkstack) (lua_State *L, int n); + +LUA_API void (lua_xmove) (lua_State *from, lua_State *to, int n); + + +/* +** access functions (stack -> C) +*/ + +LUA_API int (lua_isnumber) (lua_State *L, int idx); +LUA_API int (lua_isstring) (lua_State *L, int idx); +LUA_API int (lua_iscfunction) (lua_State *L, int idx); +LUA_API int (lua_isinteger) (lua_State *L, int idx); +LUA_API int (lua_isuserdata) (lua_State *L, int idx); +LUA_API int (lua_type) (lua_State *L, int idx); +LUA_API const char *(lua_typename) (lua_State *L, int tp); + +LUA_API lua_Number (lua_tonumberx) (lua_State *L, int idx, int *isnum); +LUA_API lua_Integer (lua_tointegerx) (lua_State *L, int idx, int *isnum); +LUA_API int (lua_toboolean) (lua_State *L, int idx); +LUA_API const char *(lua_tolstring) (lua_State *L, int idx, size_t *len); +LUA_API lua_Unsigned (lua_rawlen) (lua_State *L, int idx); +LUA_API lua_CFunction (lua_tocfunction) (lua_State *L, int idx); +LUA_API void *(lua_touserdata) (lua_State *L, int idx); +LUA_API lua_State *(lua_tothread) (lua_State *L, int idx); +LUA_API const void *(lua_topointer) (lua_State *L, int idx); + + +/* +** Comparison and arithmetic functions +*/ + +#define LUA_OPADD 0 /* ORDER TM, ORDER OP */ +#define LUA_OPSUB 1 +#define LUA_OPMUL 2 +#define LUA_OPMOD 3 +#define LUA_OPPOW 4 +#define LUA_OPDIV 5 +#define LUA_OPIDIV 6 +#define LUA_OPBAND 7 +#define LUA_OPBOR 8 +#define LUA_OPBXOR 9 +#define LUA_OPSHL 10 +#define LUA_OPSHR 11 +#define LUA_OPUNM 12 +#define LUA_OPBNOT 13 + +LUA_API void (lua_arith) (lua_State *L, int op); + +#define LUA_OPEQ 0 +#define LUA_OPLT 1 +#define LUA_OPLE 2 + +LUA_API int (lua_rawequal) (lua_State *L, int idx1, int idx2); +LUA_API int (lua_compare) (lua_State *L, int idx1, int idx2, int op); + + +/* +** push functions (C -> stack) +*/ +LUA_API void (lua_pushnil) (lua_State *L); +LUA_API void (lua_pushnumber) (lua_State *L, lua_Number n); +LUA_API void (lua_pushinteger) (lua_State *L, lua_Integer n); +LUA_API const char *(lua_pushlstring) (lua_State *L, const char *s, size_t len); +LUA_API const char *(lua_pushstring) (lua_State *L, const char *s); +LUA_API const char *(lua_pushvfstring) (lua_State *L, const char *fmt, + va_list argp); +LUA_API const char *(lua_pushfstring) (lua_State *L, const char *fmt, ...); +LUA_API void (lua_pushcclosure) (lua_State *L, lua_CFunction fn, int n); +LUA_API void (lua_pushboolean) (lua_State *L, int b); +LUA_API void (lua_pushlightuserdata) (lua_State *L, void *p); +LUA_API int (lua_pushthread) (lua_State *L); + + +/* +** get functions (Lua -> stack) +*/ +LUA_API int (lua_getglobal) (lua_State *L, const char *name); +LUA_API int (lua_gettable) (lua_State *L, int idx); +LUA_API int (lua_getfield) (lua_State *L, int idx, const char *k); +LUA_API int (lua_geti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawget) (lua_State *L, int idx); +LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n); +LUA_API int (lua_rawgetp) (lua_State *L, int idx, const void *p); + +LUA_API void (lua_createtable) (lua_State *L, int narr, int nrec); +LUA_API void *(lua_newuserdatauv) (lua_State *L, size_t sz, int nuvalue); +LUA_API int (lua_getmetatable) (lua_State *L, int objindex); +LUA_API int (lua_getiuservalue) (lua_State *L, int idx, int n); + + +/* +** set functions (stack -> Lua) +*/ +LUA_API void (lua_setglobal) (lua_State *L, const char *name); +LUA_API void (lua_settable) (lua_State *L, int idx); +LUA_API void (lua_setfield) (lua_State *L, int idx, const char *k); +LUA_API void (lua_seti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawset) (lua_State *L, int idx); +LUA_API void (lua_rawseti) (lua_State *L, int idx, lua_Integer n); +LUA_API void (lua_rawsetp) (lua_State *L, int idx, const void *p); +LUA_API int (lua_setmetatable) (lua_State *L, int objindex); +LUA_API int (lua_setiuservalue) (lua_State *L, int idx, int n); + + +/* +** 'load' and 'call' functions (load and run Lua code) +*/ +LUA_API void (lua_callk) (lua_State *L, int nargs, int nresults, + lua_KContext ctx, lua_KFunction k); +#define lua_call(L,n,r) lua_callk(L, (n), (r), 0, NULL) + +LUA_API int (lua_pcallk) (lua_State *L, int nargs, int nresults, int errfunc, + lua_KContext ctx, lua_KFunction k); +#define lua_pcall(L,n,r,f) lua_pcallk(L, (n), (r), (f), 0, NULL) + +LUA_API int (lua_load) (lua_State *L, lua_Reader reader, void *dt, + const char *chunkname, const char *mode); + +LUA_API int (lua_dump) (lua_State *L, lua_Writer writer, void *data, int strip); + + +/* +** coroutine functions +*/ +LUA_API int (lua_yieldk) (lua_State *L, int nresults, lua_KContext ctx, + lua_KFunction k); +LUA_API int (lua_resume) (lua_State *L, lua_State *from, int narg, + int *nres); +LUA_API int (lua_status) (lua_State *L); +LUA_API int (lua_isyieldable) (lua_State *L); + +#define lua_yield(L,n) lua_yieldk(L, (n), 0, NULL) + + +/* +** Warning-related functions +*/ +LUA_API void (lua_setwarnf) (lua_State *L, lua_WarnFunction f, void *ud); +LUA_API void (lua_warning) (lua_State *L, const char *msg, int tocont); + + +/* +** garbage-collection function and options +*/ + +#define LUA_GCSTOP 0 +#define LUA_GCRESTART 1 +#define LUA_GCCOLLECT 2 +#define LUA_GCCOUNT 3 +#define LUA_GCCOUNTB 4 +#define LUA_GCSTEP 5 +#define LUA_GCSETPAUSE 6 +#define LUA_GCSETSTEPMUL 7 +#define LUA_GCISRUNNING 9 +#define LUA_GCGEN 10 +#define LUA_GCINC 11 + +LUA_API int (lua_gc) (lua_State *L, int what, ...); + + +/* +** miscellaneous functions +*/ + +LUA_API int (lua_error) (lua_State *L); + +LUA_API int (lua_next) (lua_State *L, int idx); + +LUA_API void (lua_concat) (lua_State *L, int n); +LUA_API void (lua_len) (lua_State *L, int idx); + +LUA_API size_t (lua_stringtonumber) (lua_State *L, const char *s); + +LUA_API lua_Alloc (lua_getallocf) (lua_State *L, void **ud); +LUA_API void (lua_setallocf) (lua_State *L, lua_Alloc f, void *ud); + +LUA_API void (lua_toclose) (lua_State *L, int idx); + + +/* +** {============================================================== +** some useful macros +** =============================================================== +*/ + +#define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE)) + +#define lua_tonumber(L,i) lua_tonumberx(L,(i),NULL) +#define lua_tointeger(L,i) lua_tointegerx(L,(i),NULL) + +#define lua_pop(L,n) lua_settop(L, -(n)-1) + +#define lua_newtable(L) lua_createtable(L, 0, 0) + +#define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n))) + +#define lua_pushcfunction(L,f) lua_pushcclosure(L, (f), 0) + +#define lua_isfunction(L,n) (lua_type(L, (n)) == LUA_TFUNCTION) +#define lua_istable(L,n) (lua_type(L, (n)) == LUA_TTABLE) +#define lua_islightuserdata(L,n) (lua_type(L, (n)) == LUA_TLIGHTUSERDATA) +#define lua_isnil(L,n) (lua_type(L, (n)) == LUA_TNIL) +#define lua_isboolean(L,n) (lua_type(L, (n)) == LUA_TBOOLEAN) +#define lua_isthread(L,n) (lua_type(L, (n)) == LUA_TTHREAD) +#define lua_isnone(L,n) (lua_type(L, (n)) == LUA_TNONE) +#define lua_isnoneornil(L, n) (lua_type(L, (n)) <= 0) + +#define lua_pushliteral(L, s) lua_pushstring(L, "" s) + +#define lua_pushglobaltable(L) \ + ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS)) + +#define lua_tostring(L,i) lua_tolstring(L, (i), NULL) + + +#define lua_insert(L,idx) lua_rotate(L, (idx), 1) + +#define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1)) + +#define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1)) + +/* }============================================================== */ + + +/* +** {============================================================== +** compatibility macros +** =============================================================== +*/ +#if defined(LUA_COMPAT_APIINTCASTS) + +#define lua_pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n)) +#define lua_tounsignedx(L,i,is) ((lua_Unsigned)lua_tointegerx(L,i,is)) +#define lua_tounsigned(L,i) lua_tounsignedx(L,(i),NULL) + +#endif + +#define lua_newuserdata(L,s) lua_newuserdatauv(L,s,1) +#define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1) +#define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1) + +#define LUA_NUMTAGS LUA_NUMTYPES + +/* }============================================================== */ + +/* +** {====================================================================== +** Debug API +** ======================================================================= +*/ + + +/* +** Event codes +*/ +#define LUA_HOOKCALL 0 +#define LUA_HOOKRET 1 +#define LUA_HOOKLINE 2 +#define LUA_HOOKCOUNT 3 +#define LUA_HOOKTAILCALL 4 + + +/* +** Event masks +*/ +#define LUA_MASKCALL (1 << LUA_HOOKCALL) +#define LUA_MASKRET (1 << LUA_HOOKRET) +#define LUA_MASKLINE (1 << LUA_HOOKLINE) +#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) + +typedef struct lua_Debug lua_Debug; /* activation record */ + + +/* Functions to be called by the debugger in specific events */ +typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); + + +LUA_API int (lua_getstack) (lua_State *L, int level, lua_Debug *ar); +LUA_API int (lua_getinfo) (lua_State *L, const char *what, lua_Debug *ar); +LUA_API const char *(lua_getlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_setlocal) (lua_State *L, const lua_Debug *ar, int n); +LUA_API const char *(lua_getupvalue) (lua_State *L, int funcindex, int n); +LUA_API const char *(lua_setupvalue) (lua_State *L, int funcindex, int n); + +LUA_API void *(lua_upvalueid) (lua_State *L, int fidx, int n); +LUA_API void (lua_upvaluejoin) (lua_State *L, int fidx1, int n1, + int fidx2, int n2); + +LUA_API void (lua_sethook) (lua_State *L, lua_Hook func, int mask, int count); +LUA_API lua_Hook (lua_gethook) (lua_State *L); +LUA_API int (lua_gethookmask) (lua_State *L); +LUA_API int (lua_gethookcount) (lua_State *L); + +LUA_API int (lua_setcstacklimit) (lua_State *L, unsigned int limit); + +struct lua_Debug { + int event; + const char *name; /* (n) */ + const char *namewhat; /* (n) 'global', 'local', 'field', 'method' */ + const char *what; /* (S) 'Lua', 'C', 'main', 'tail' */ + const char *source; /* (S) */ + size_t srclen; /* (S) */ + int currentline; /* (l) */ + int linedefined; /* (S) */ + int lastlinedefined; /* (S) */ + unsigned char nups; /* (u) number of upvalues */ + unsigned char nparams;/* (u) number of parameters */ + char isvararg; /* (u) */ + char istailcall; /* (t) */ + unsigned short ftransfer; /* (r) index of first value transferred */ + unsigned short ntransfer; /* (r) number of transferred values */ + char short_src[LUA_IDSIZE]; /* (S) */ + /* private part */ + struct CallInfo *i_ci; /* active function */ +}; + +/* }====================================================================== */ + + +/****************************************************************************** +* Copyright (C) 1994-2020 Lua.org, PUC-Rio. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to deal in the Software without restriction, including +* without limitation the rights to use, copy, modify, merge, publish, +* distribute, sublicense, and/or sell copies of the Software, and to +* permit persons to whom the Software is furnished to do so, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be +* included in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +******************************************************************************/ + + +#endif diff --git a/lua-5.4.0/src/lua.hpp b/lua-5.4.0/src/lua.hpp new file mode 100644 index 0000000..ec417f5 --- /dev/null +++ b/lua-5.4.0/src/lua.hpp @@ -0,0 +1,9 @@ +// lua.hpp +// Lua header files for C++ +// <> not supplied automatically because Lua also compiles as C++ + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} diff --git a/lua-5.4.0/src/luac b/lua-5.4.0/src/luac new file mode 100644 index 0000000..01300a9 --- /dev/null +++ b/lua-5.4.0/src/luac @@ -0,0 +1,5315 @@ +/** + * @license + * Copyright 2010 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(Module) { ..generated code.. } +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module !== 'undefined' ? Module : {}; + + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// {{PRE_JSES}} + +// Sometimes an existing Module object exists with properties +// meant to overwrite the default module functionality. Here +// we collect those properties and reapply _after_ we configure +// the current environment's defaults to avoid having to be so +// defensive during initialization. +var moduleOverrides = {}; +var key; +for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } +} + +var arguments_ = []; +var thisProgram = './this.program'; +var quit_ = function(status, toThrow) { + throw toThrow; +}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +var ENVIRONMENT_IS_WEB = false; +var ENVIRONMENT_IS_WORKER = false; +var ENVIRONMENT_IS_NODE = false; +var ENVIRONMENT_IS_SHELL = false; +ENVIRONMENT_IS_WEB = typeof window === 'object'; +ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof process.versions === 'object' && typeof process.versions.node === 'string'; +ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +if (Module['ENVIRONMENT']) { + throw new Error('Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -s ENVIRONMENT=web or -s ENVIRONMENT=node)'); +} + + + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var read_, + readAsync, + readBinary, + setWindowTitle; + +var nodeFS; +var nodePath; + +if (ENVIRONMENT_IS_NODE) { + if (ENVIRONMENT_IS_WORKER) { + scriptDirectory = require('path').dirname(scriptDirectory) + '/'; + } else { + scriptDirectory = __dirname + '/'; + } + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + read_ = function shell_read(filename, binary) { + if (!nodeFS) nodeFS = require('fs'); + if (!nodePath) nodePath = require('path'); + filename = nodePath['normalize'](filename); + return nodeFS['readFileSync'](filename, binary ? null : 'utf8'); + }; + + readBinary = function readBinary(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + + + + + if (process['argv'].length > 1) { + thisProgram = process['argv'][1].replace(/\\/g, '/'); + } + + arguments_ = process['argv'].slice(2); + + if (typeof module !== 'undefined') { + module['exports'] = Module; + } + + process['on']('uncaughtException', function(ex) { + // suppress ExitStatus exceptions from showing an error + if (!(ex instanceof ExitStatus)) { + throw ex; + } + }); + + process['on']('unhandledRejection', abort); + + quit_ = function(status) { + process['exit'](status); + }; + + Module['inspect'] = function () { return '[Emscripten Module object]'; }; + + + +} else +if (ENVIRONMENT_IS_SHELL) { + + + if (typeof read != 'undefined') { + read_ = function shell_read(f) { + return read(f); + }; + } + + readBinary = function readBinary(f) { + var data; + if (typeof readbuffer === 'function') { + return new Uint8Array(readbuffer(f)); + } + data = read(f, 'binary'); + assert(typeof data === 'object'); + return data; + }; + + if (typeof scriptArgs != 'undefined') { + arguments_ = scriptArgs; + } else if (typeof arguments != 'undefined') { + arguments_ = arguments; + } + + if (typeof quit === 'function') { + quit_ = function(status) { + quit(status); + }; + } + + if (typeof print !== 'undefined') { + // Prefer to use print/printErr where they exist, as they usually work better. + if (typeof console === 'undefined') console = /** @type{!Console} */({}); + console.log = /** @type{!function(this:Console, ...*): undefined} */ (print); + console.warn = console.error = /** @type{!function(this:Console, ...*): undefined} */ (typeof printErr !== 'undefined' ? printErr : print); + } + + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + if (ENVIRONMENT_IS_WORKER) { // Check worker, not web, since window could be polyfilled + scriptDirectory = self.location.href; + } else if (document.currentScript) { // web + scriptDirectory = document.currentScript.src; + } + // blob urls look like blob:http://site.com/etc/etc and we cannot infer anything from them. + // otherwise, slice off the final part of the url to find the script directory. + // if scriptDirectory does not contain a slash, lastIndexOf will return -1, + // and scriptDirectory will correctly be replaced with an empty string. + if (scriptDirectory.indexOf('blob:') !== 0) { + scriptDirectory = scriptDirectory.substr(0, scriptDirectory.lastIndexOf('/')+1); + } else { + scriptDirectory = ''; + } + + + // Differentiate the Web Worker from the Node Worker case, as reading must + // be done differently. + { + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + read_ = function shell_read(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.send(null); + return xhr.responseText; + }; + + if (ENVIRONMENT_IS_WORKER) { + readBinary = function readBinary(url) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = function readAsync(url, onload, onerror) { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = function xhr_onload() { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + onload(xhr.response); + return; + } + onerror(); + }; + xhr.onerror = onerror; + xhr.send(null); + }; + + + + + } + + setWindowTitle = function(title) { document.title = title }; +} else +{ + throw new Error('environment detection error'); +} + + +// Set up the out() and err() hooks, which are how we can print to stdout or +// stderr, respectively. +var out = Module['print'] || console.log.bind(console); +var err = Module['printErr'] || console.warn.bind(console); + +// Merge back in the overrides +for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } +} +// Free the object hierarchy contained in the overrides, this lets the GC +// reclaim data used e.g. in memoryInitializerRequest, which is a large typed array. +moduleOverrides = null; + +// Emit code to handle expected values on the Module object. This applies Module.x +// to the proper local x. This has two benefits: first, we only emit it if it is +// expected to arrive, and second, by using a local everywhere else that can be +// minified. +if (Module['arguments']) arguments_ = Module['arguments'];if (!Object.getOwnPropertyDescriptor(Module, 'arguments')) Object.defineProperty(Module, 'arguments', { configurable: true, get: function() { abort('Module.arguments has been replaced with plain arguments_') } }); +if (Module['thisProgram']) thisProgram = Module['thisProgram'];if (!Object.getOwnPropertyDescriptor(Module, 'thisProgram')) Object.defineProperty(Module, 'thisProgram', { configurable: true, get: function() { abort('Module.thisProgram has been replaced with plain thisProgram') } }); +if (Module['quit']) quit_ = Module['quit'];if (!Object.getOwnPropertyDescriptor(Module, 'quit')) Object.defineProperty(Module, 'quit', { configurable: true, get: function() { abort('Module.quit has been replaced with plain quit_') } }); + +// perform assertions in shell.js after we set up out() and err(), as otherwise if an assertion fails it cannot print the message +// Assertions on removed incoming Module JS APIs. +assert(typeof Module['memoryInitializerPrefixURL'] === 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['pthreadMainPrefixURL'] === 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['cdInitializerPrefixURL'] === 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['filePackagePrefixURL'] === 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); +assert(typeof Module['read'] === 'undefined', 'Module.read option was removed (modify read_ in JS)'); +assert(typeof Module['readAsync'] === 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); +assert(typeof Module['readBinary'] === 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); +assert(typeof Module['setWindowTitle'] === 'undefined', 'Module.setWindowTitle option was removed (modify setWindowTitle in JS)'); +assert(typeof Module['TOTAL_MEMORY'] === 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); +if (!Object.getOwnPropertyDescriptor(Module, 'read')) Object.defineProperty(Module, 'read', { configurable: true, get: function() { abort('Module.read has been replaced with plain read_') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'readAsync')) Object.defineProperty(Module, 'readAsync', { configurable: true, get: function() { abort('Module.readAsync has been replaced with plain readAsync') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'readBinary')) Object.defineProperty(Module, 'readBinary', { configurable: true, get: function() { abort('Module.readBinary has been replaced with plain readBinary') } }); +if (!Object.getOwnPropertyDescriptor(Module, 'setWindowTitle')) Object.defineProperty(Module, 'setWindowTitle', { configurable: true, get: function() { abort('Module.setWindowTitle has been replaced with plain setWindowTitle') } }); +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + + + + +/** + * @license + * Copyright 2017 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// {{PREAMBLE_ADDITIONS}} + +var STACK_ALIGN = 16; + +// stack management, and other functionality that is provided by the compiled code, +// should not be used before it is ready + +/** @suppress{duplicate} */ +var stackSave; +/** @suppress{duplicate} */ +var stackRestore; +/** @suppress{duplicate} */ +var stackAlloc; + +stackSave = stackRestore = stackAlloc = function() { + abort('cannot use the stack before compiled code is ready to run, and has provided stack access'); +}; + +function staticAlloc(size) { + abort('staticAlloc is no longer available at runtime; instead, perform static allocations at compile time (using makeStaticAlloc)'); +} + +function dynamicAlloc(size) { + assert(DYNAMICTOP_PTR); + var ret = HEAP32[DYNAMICTOP_PTR>>2]; + var end = (ret + size + 15) & -16; + assert(end <= HEAP8.length, 'failure to dynamicAlloc - memory growth etc. is not supported there, call malloc/sbrk directly'); + HEAP32[DYNAMICTOP_PTR>>2] = end; + return ret; +} + +function alignMemory(size, factor) { + if (!factor) factor = STACK_ALIGN; // stack alignment (16-byte) by default + return Math.ceil(size / factor) * factor; +} + +function getNativeTypeSize(type) { + switch (type) { + case 'i1': case 'i8': return 1; + case 'i16': return 2; + case 'i32': return 4; + case 'i64': return 8; + case 'float': return 4; + case 'double': return 8; + default: { + if (type[type.length-1] === '*') { + return 4; // A pointer + } else if (type[0] === 'i') { + var bits = Number(type.substr(1)); + assert(bits % 8 === 0, 'getNativeTypeSize invalid bits ' + bits + ', type ' + type); + return bits / 8; + } else { + return 0; + } + } + } +} + +function warnOnce(text) { + if (!warnOnce.shown) warnOnce.shown = {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + err(text); + } +} + + + + + +/** + * @license + * Copyright 2020 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + +// Wraps a JS function as a wasm function with a given signature. +function convertJsFunctionToWasm(func, sig) { + + // If the type reflection proposal is available, use the new + // "WebAssembly.Function" constructor. + // Otherwise, construct a minimal wasm module importing the JS function and + // re-exporting it. + if (typeof WebAssembly.Function === "function") { + var typeNames = { + 'i': 'i32', + 'j': 'i64', + 'f': 'f32', + 'd': 'f64' + }; + var type = { + parameters: [], + results: sig[0] == 'v' ? [] : [typeNames[sig[0]]] + }; + for (var i = 1; i < sig.length; ++i) { + type.parameters.push(typeNames[sig[i]]); + } + return new WebAssembly.Function(type, func); + } + + // The module is static, with the exception of the type section, which is + // generated based on the signature passed in. + var typeSection = [ + 0x01, // id: section, + 0x00, // length: 0 (placeholder) + 0x01, // count: 1 + 0x60, // form: func + ]; + var sigRet = sig.slice(0, 1); + var sigParam = sig.slice(1); + var typeCodes = { + 'i': 0x7f, // i32 + 'j': 0x7e, // i64 + 'f': 0x7d, // f32 + 'd': 0x7c, // f64 + }; + + // Parameters, length + signatures + typeSection.push(sigParam.length); + for (var i = 0; i < sigParam.length; ++i) { + typeSection.push(typeCodes[sigParam[i]]); + } + + // Return values, length + signatures + // With no multi-return in MVP, either 0 (void) or 1 (anything else) + if (sigRet == 'v') { + typeSection.push(0x00); + } else { + typeSection = typeSection.concat([0x01, typeCodes[sigRet]]); + } + + // Write the overall length of the type section back into the section header + // (excepting the 2 bytes for the section id and length) + typeSection[1] = typeSection.length - 2; + + // Rest of the module is static + var bytes = new Uint8Array([ + 0x00, 0x61, 0x73, 0x6d, // magic ("\0asm") + 0x01, 0x00, 0x00, 0x00, // version: 1 + ].concat(typeSection, [ + 0x02, 0x07, // import section + // (import "e" "f" (func 0 (type 0))) + 0x01, 0x01, 0x65, 0x01, 0x66, 0x00, 0x00, + 0x07, 0x05, // export section + // (export "f" (func 0 (type 0))) + 0x01, 0x01, 0x66, 0x00, 0x00, + ])); + + // We can compile this wasm module synchronously because it is very small. + // This accepts an import (at "e.f"), that it reroutes to an export (at "f") + var module = new WebAssembly.Module(bytes); + var instance = new WebAssembly.Instance(module, { + 'e': { + 'f': func + } + }); + var wrappedFunc = instance.exports['f']; + return wrappedFunc; +} + +var freeTableIndexes = []; + +// Weak map of functions in the table to their indexes, created on first use. +var functionsInTableMap; + +// Add a wasm function to the table. +function addFunctionWasm(func, sig) { + var table = wasmTable; + + // Check if the function is already in the table, to ensure each function + // gets a unique index. First, create the map if this is the first use. + if (!functionsInTableMap) { + functionsInTableMap = new WeakMap(); + for (var i = 0; i < table.length; i++) { + var item = table.get(i); + // Ignore null values. + if (item) { + functionsInTableMap.set(item, i); + } + } + } + if (functionsInTableMap.has(func)) { + return functionsInTableMap.get(func); + } + + // It's not in the table, add it now. + + + var ret; + // Reuse a free index if there is one, otherwise grow. + if (freeTableIndexes.length) { + ret = freeTableIndexes.pop(); + } else { + ret = table.length; + // Grow the table + try { + table.grow(1); + } catch (err) { + if (!(err instanceof RangeError)) { + throw err; + } + throw 'Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.'; + } + } + + // Set the new value. + try { + // Attempting to call this with JS function will cause of table.set() to fail + table.set(ret, func); + } catch (err) { + if (!(err instanceof TypeError)) { + throw err; + } + assert(typeof sig !== 'undefined', 'Missing signature argument to addFunction'); + var wrapped = convertJsFunctionToWasm(func, sig); + table.set(ret, wrapped); + } + + functionsInTableMap.set(func, ret); + + return ret; +} + +function removeFunctionWasm(index) { + functionsInTableMap.delete(wasmTable.get(index)); + freeTableIndexes.push(index); +} + +// 'sig' parameter is required for the llvm backend but only when func is not +// already a WebAssembly function. +function addFunction(func, sig) { + assert(typeof func !== 'undefined'); + + return addFunctionWasm(func, sig); +} + +function removeFunction(index) { + removeFunctionWasm(index); +} + + + +var funcWrappers = {}; + +function getFuncWrapper(func, sig) { + if (!func) return; // on null pointer, return undefined + assert(sig); + if (!funcWrappers[sig]) { + funcWrappers[sig] = {}; + } + var sigCache = funcWrappers[sig]; + if (!sigCache[func]) { + // optimize away arguments usage in common cases + if (sig.length === 1) { + sigCache[func] = function dynCall_wrapper() { + return dynCall(sig, func); + }; + } else if (sig.length === 2) { + sigCache[func] = function dynCall_wrapper(arg) { + return dynCall(sig, func, [arg]); + }; + } else { + // general case + sigCache[func] = function dynCall_wrapper() { + return dynCall(sig, func, Array.prototype.slice.call(arguments)); + }; + } + } + return sigCache[func]; +} + + +/** + * @license + * Copyright 2020 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + + + +function makeBigInt(low, high, unsigned) { + return unsigned ? ((+((low>>>0)))+((+((high>>>0)))*4294967296.0)) : ((+((low>>>0)))+((+((high|0)))*4294967296.0)); +} + +/** @param {Array=} args */ +function dynCall(sig, ptr, args) { + if (args && args.length) { + // j (64-bit integer) must be passed in as two numbers [low 32, high 32]. + assert(args.length === sig.substring(1).replace(/j/g, '--').length); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].apply(null, [ptr].concat(args)); + } else { + assert(sig.length == 1); + assert(('dynCall_' + sig) in Module, 'bad function pointer type - no table for sig \'' + sig + '\''); + return Module['dynCall_' + sig].call(null, ptr); + } +} + +var tempRet0 = 0; + +var setTempRet0 = function(value) { + tempRet0 = value; +}; + +var getTempRet0 = function() { + return tempRet0; +}; + +function getCompilerSetting(name) { + throw 'You must build with -s RETAIN_COMPILER_SETTINGS=1 for getCompilerSetting or emscripten_get_compiler_setting to work'; +} + +// The address globals begin at. Very low in memory, for code size and optimization opportunities. +// Above 0 is static memory, starting with globals. +// Then the stack. +// Then 'dynamic' memory for sbrk. +var GLOBAL_BASE = 1024; + + + +/** + * @license + * Copyright 2010 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + + +var wasmBinary;if (Module['wasmBinary']) wasmBinary = Module['wasmBinary'];if (!Object.getOwnPropertyDescriptor(Module, 'wasmBinary')) Object.defineProperty(Module, 'wasmBinary', { configurable: true, get: function() { abort('Module.wasmBinary has been replaced with plain wasmBinary') } }); +var noExitRuntime;if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime'];if (!Object.getOwnPropertyDescriptor(Module, 'noExitRuntime')) Object.defineProperty(Module, 'noExitRuntime', { configurable: true, get: function() { abort('Module.noExitRuntime has been replaced with plain noExitRuntime') } }); + + +if (typeof WebAssembly !== 'object') { + abort('No WebAssembly support found. Build with -s WASM=0 to target JavaScript instead.'); +} + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// In MINIMAL_RUNTIME, setValue() and getValue() are only available when building with safe heap enabled, for heap safety checking. +// In traditional runtime, setValue() and getValue() are always available (although their use is highly discouraged due to perf penalties) + +/** @param {number} ptr + @param {number} value + @param {string} type + @param {number|boolean=} noSafe */ +function setValue(ptr, value, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': HEAP8[((ptr)>>0)]=value; break; + case 'i8': HEAP8[((ptr)>>0)]=value; break; + case 'i16': HEAP16[((ptr)>>1)]=value; break; + case 'i32': HEAP32[((ptr)>>2)]=value; break; + case 'i64': (tempI64 = [value>>>0,(tempDouble=value,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((ptr)>>2)]=tempI64[0],HEAP32[(((ptr)+(4))>>2)]=tempI64[1]); break; + case 'float': HEAPF32[((ptr)>>2)]=value; break; + case 'double': HEAPF64[((ptr)>>3)]=value; break; + default: abort('invalid type for setValue: ' + type); + } +} + +/** @param {number} ptr + @param {string} type + @param {number|boolean=} noSafe */ +function getValue(ptr, type, noSafe) { + type = type || 'i8'; + if (type.charAt(type.length-1) === '*') type = 'i32'; // pointers are 32-bit + switch(type) { + case 'i1': return HEAP8[((ptr)>>0)]; + case 'i8': return HEAP8[((ptr)>>0)]; + case 'i16': return HEAP16[((ptr)>>1)]; + case 'i32': return HEAP32[((ptr)>>2)]; + case 'i64': return HEAP32[((ptr)>>2)]; + case 'float': return HEAPF32[((ptr)>>2)]; + case 'double': return HEAPF64[((ptr)>>3)]; + default: abort('invalid type for getValue: ' + type); + } + return null; +} + + + + + + +// Wasm globals + +var wasmMemory; + +// In fastcomp asm.js, we don't need a wasm Table at all. +// In the wasm backend, we polyfill the WebAssembly object, +// so this creates a (non-native-wasm) table for us. +var wasmTable = new WebAssembly.Table({ + 'initial': 24, + 'maximum': 24 + 0, + 'element': 'anyfunc' +}); + + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS = 0; + +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed: ' + text); + } +} + +// Returns the C function with a specified identifier (for C++, you need to do manual name mangling) +function getCFunc(ident) { + var func = Module['_' + ident]; // closure exported function + assert(func, 'Cannot call unknown function ' + ident + ', make sure it is exported'); + return func; +} + +// C calling interface. +/** @param {string|null=} returnType + @param {Array=} argTypes + @param {Arguments|Array=} args + @param {Object=} opts */ +function ccall(ident, returnType, argTypes, args, opts) { + // For fast lookup of conversion functions + var toC = { + 'string': function(str) { + var ret = 0; + if (str !== null && str !== undefined && str !== 0) { // null string + // at most 4 bytes per UTF-8 code point, +1 for the trailing '\0' + var len = (str.length << 2) + 1; + ret = stackAlloc(len); + stringToUTF8(str, ret, len); + } + return ret; + }, + 'array': function(arr) { + var ret = stackAlloc(arr.length); + writeArrayToMemory(arr, ret); + return ret; + } + }; + + function convertReturnValue(ret) { + if (returnType === 'string') return UTF8ToString(ret); + if (returnType === 'boolean') return Boolean(ret); + return ret; + } + + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + assert(returnType !== 'array', 'Return type should not be "array".'); + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + + ret = convertReturnValue(ret); + if (stack !== 0) stackRestore(stack); + return ret; +} + +/** @param {string=} returnType + @param {Array=} argTypes + @param {Object=} opts */ +function cwrap(ident, returnType, argTypes, opts) { + return function() { + return ccall(ident, returnType, argTypes, arguments, opts); + } +} + +var ALLOC_NORMAL = 0; // Tries to use _malloc() +var ALLOC_STACK = 1; // Lives for the duration of the current function call +var ALLOC_DYNAMIC = 2; // Cannot be freed except through sbrk +var ALLOC_NONE = 3; // Do not allocate + +// allocate(): This is for internal use. You can use it yourself as well, but the interface +// is a little tricky (see docs right below). The reason is that it is optimized +// for multiple syntaxes to save space in generated code. So you should +// normally not use allocate(), and instead allocate memory using _malloc(), +// initialize it with setValue(), and so forth. +// @slab: An array of data, or a number. If a number, then the size of the block to allocate, +// in *bytes* (note that this is sometimes confusing: the next parameter does not +// affect this!) +// @types: Either an array of types, one for each byte (or 0 if no type at that position), +// or a single type which is used for the entire block. This only matters if there +// is initial data - if @slab is a number, then this does not matter at all and is +// ignored. +// @allocator: How to allocate memory, see ALLOC_* +/** @type {function((TypedArray|Array|number), string, number, number=)} */ +function allocate(slab, types, allocator, ptr) { + var zeroinit, size; + if (typeof slab === 'number') { + zeroinit = true; + size = slab; + } else { + zeroinit = false; + size = slab.length; + } + + var singleType = typeof types === 'string' ? types : null; + + var ret; + if (allocator == ALLOC_NONE) { + ret = ptr; + } else { + ret = [_malloc, + stackAlloc, + dynamicAlloc][allocator](Math.max(size, singleType ? 1 : types.length)); + } + + if (zeroinit) { + var stop; + ptr = ret; + assert((ret & 3) == 0); + stop = ret + (size & ~3); + for (; ptr < stop; ptr += 4) { + HEAP32[((ptr)>>2)]=0; + } + stop = ret + size; + while (ptr < stop) { + HEAP8[((ptr++)>>0)]=0; + } + return ret; + } + + if (singleType === 'i8') { + if (slab.subarray || slab.slice) { + HEAPU8.set(/** @type {!Uint8Array} */ (slab), ret); + } else { + HEAPU8.set(new Uint8Array(slab), ret); + } + return ret; + } + + var i = 0, type, typeSize, previousType; + while (i < size) { + var curr = slab[i]; + + type = singleType || types[i]; + if (type === 0) { + i++; + continue; + } + assert(type, 'Must know what type to store in allocate!'); + + if (type == 'i64') type = 'i32'; // special case: we have one i32 here, and one i32 later + + setValue(ret+i, curr, type); + + // no need to look up size unless type changes, so cache it + if (previousType !== type) { + typeSize = getNativeTypeSize(type); + previousType = type; + } + i += typeSize; + } + + return ret; +} + +// Allocate memory during any stage of startup - static memory early on, dynamic memory later, malloc when ready +function getMemory(size) { + if (!runtimeInitialized) return dynamicAlloc(size); + return _malloc(size); +} + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// runtime_strings.js: Strings related runtime functions that are part of both MINIMAL_RUNTIME and regular runtime. + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the given array that contains uint8 values, returns +// a copy of that string as a Javascript String object. + +var UTF8Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined; + +/** + * @param {number} idx + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ArrayToString(heap, idx, maxBytesToRead) { + var endIdx = idx + maxBytesToRead; + var endPtr = idx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + // (As a tiny code save trick, compare endPtr against endIdx using a negation, so that undefined means Infinity) + while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; + + if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { + return UTF8Decoder.decode(heap.subarray(idx, endPtr)); + } else { + var str = ''; + // If building with TextDecoder, we have already computed the string length above, so test loop end condition against that + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heap[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heap[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heap[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce('Invalid UTF-8 leading byte 0x' + u0.toString(16) + ' encountered when deserializing a UTF-8 string on the asm.js/wasm heap to a JS string!'); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heap[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + } + return str; +} + +// Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the emscripten HEAP, returns a +// copy of that string as a Javascript String object. +// maxBytesToRead: an optional length that specifies the maximum number of bytes to read. You can omit +// this parameter to scan the string until the first \0 byte. If maxBytesToRead is +// passed, and the string at [ptr, ptr+maxBytesToReadr[ contains a null byte in the +// middle, then the string will cut short at that byte index (i.e. maxBytesToRead will +// not produce a string of exact length [ptr, ptr+maxBytesToRead[) +// N.B. mixing frequent uses of UTF8ToString() with and without maxBytesToRead may +// throw JS JIT optimizations off, so it is worth to consider consistently using one +// style or the other. +/** + * @param {number} ptr + * @param {number=} maxBytesToRead + * @return {string} + */ +function UTF8ToString(ptr, maxBytesToRead) { + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''; +} + +// Copies the given Javascript String object 'str' to the given byte array at address 'outIdx', +// encoded in UTF8 form and null-terminated. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// heap: the array to copy to. Each index in this array is assumed to be one 8-byte element. +// outIdx: The starting offset in the array to begin the copying. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. +// This count should include the null terminator, +// i.e. if maxBytesToWrite=1, only the null terminator will be written and nothing else. +// maxBytesToWrite=0 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) // Parameter maxBytesToWrite is not optional. Negative values, 0, null, undefined and false each don't write out any bytes. + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description and https://www.ietf.org/rfc/rfc2279.txt and https://tools.ietf.org/html/rfc3629 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) { + var u1 = str.charCodeAt(++i); + u = 0x10000 + ((u & 0x3FF) << 10) | (u1 & 0x3FF); + } + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u >= 0x200000) warnOnce('Invalid Unicode code point 0x' + u.toString(16) + ' encountered when serializing a JS string to an UTF-8 string on the asm.js/wasm heap! (Valid unicode code points should be in range 0-0x1FFFFF).'); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF8 form. The copy will require at most str.length*4+1 bytes of space in the HEAP. +// Use the function lengthBytesUTF8 to compute the exact number of bytes (excluding null terminator) that this function will write. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF8(str, outPtr, maxBytesToWrite) { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + return stringToUTF8Array(str, HEAPU8,outPtr, maxBytesToWrite); +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF8 byte array, EXCLUDING the null terminator byte. +function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! So decode UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var u = str.charCodeAt(i); // possibly a lead surrogate + if (u >= 0xD800 && u <= 0xDFFF) u = 0x10000 + ((u & 0x3FF) << 10) | (str.charCodeAt(++i) & 0x3FF); + if (u <= 0x7F) ++len; + else if (u <= 0x7FF) len += 2; + else if (u <= 0xFFFF) len += 3; + else len += 4; + } + return len; +} + + + +/** + * @license + * Copyright 2020 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// runtime_strings_extra.js: Strings related runtime functions that are available only in regular runtime. + +// Given a pointer 'ptr' to a null-terminated ASCII-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +function AsciiToString(ptr) { + var str = ''; + while (1) { + var ch = HEAPU8[((ptr++)>>0)]; + if (!ch) return str; + str += String.fromCharCode(ch); + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in ASCII form. The copy will require at most str.length+1 bytes of space in the HEAP. + +function stringToAscii(str, outPtr) { + return writeAsciiToMemory(str, outPtr, false); +} + +// Given a pointer 'ptr' to a null-terminated UTF16LE-encoded string in the emscripten HEAP, returns +// a copy of that string as a Javascript String object. + +var UTF16Decoder = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined; + +function UTF16ToString(ptr, maxBytesToRead) { + assert(ptr % 2 == 0, 'Pointer passed to UTF16ToString must be aligned to two bytes!'); + var endPtr = ptr; + // TextDecoder needs to know the byte length in advance, it doesn't stop on null terminator by itself. + // Also, use the length info to avoid running tiny strings through TextDecoder, since .subarray() allocates garbage. + var idx = endPtr >> 1; + var maxIdx = idx + maxBytesToRead / 2; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(idx >= maxIdx) && HEAPU16[idx]) ++idx; + endPtr = idx << 1; + + if (endPtr - ptr > 32 && UTF16Decoder) { + return UTF16Decoder.decode(HEAPU8.subarray(ptr, endPtr)); + } else { + var i = 0; + + var str = ''; + while (1) { + var codeUnit = HEAP16[(((ptr)+(i*2))>>1)]; + if (codeUnit == 0 || i == maxBytesToRead / 2) return str; + ++i; + // fromCharCode constructs a character from a UTF-16 code unit, so we can pass the UTF16 string right through. + str += String.fromCharCode(codeUnit); + } + } +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF16 form. The copy will require at most str.length*4+2 bytes of space in the HEAP. +// Use the function lengthBytesUTF16() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=2, only the null terminator will be written and nothing else. +// maxBytesToWrite<2 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF16(str, outPtr, maxBytesToWrite) { + assert(outPtr % 2 == 0, 'Pointer passed to stringToUTF16 must be aligned to two bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF16(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 2) return 0; + maxBytesToWrite -= 2; // Null terminator. + var startPtr = outPtr; + var numCharsToWrite = (maxBytesToWrite < str.length*2) ? (maxBytesToWrite / 2) : str.length; + for (var i = 0; i < numCharsToWrite; ++i) { + // charCodeAt returns a UTF-16 encoded code unit, so it can be directly written to the HEAP. + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + HEAP16[((outPtr)>>1)]=codeUnit; + outPtr += 2; + } + // Null-terminate the pointer to the HEAP. + HEAP16[((outPtr)>>1)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF16(str) { + return str.length*2; +} + +function UTF32ToString(ptr, maxBytesToRead) { + assert(ptr % 4 == 0, 'Pointer passed to UTF32ToString must be aligned to four bytes!'); + var i = 0; + + var str = ''; + // If maxBytesToRead is not passed explicitly, it will be undefined, and this + // will always evaluate to true. This saves on code size. + while (!(i >= maxBytesToRead / 4)) { + var utf32 = HEAP32[(((ptr)+(i*4))>>2)]; + if (utf32 == 0) break; + ++i; + // Gotcha: fromCharCode constructs a character from a UTF-16 encoded code (pair), not from a Unicode code point! So encode the code point to UTF-16 for constructing. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + if (utf32 >= 0x10000) { + var ch = utf32 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } else { + str += String.fromCharCode(utf32); + } + } + return str; +} + +// Copies the given Javascript String object 'str' to the emscripten HEAP at address 'outPtr', +// null-terminated and encoded in UTF32 form. The copy will require at most str.length*4+4 bytes of space in the HEAP. +// Use the function lengthBytesUTF32() to compute the exact number of bytes (excluding null terminator) that this function will write. +// Parameters: +// str: the Javascript string to copy. +// outPtr: Byte address in Emscripten HEAP where to write the string to. +// maxBytesToWrite: The maximum number of bytes this function can write to the array. This count should include the null +// terminator, i.e. if maxBytesToWrite=4, only the null terminator will be written and nothing else. +// maxBytesToWrite<4 does not write any bytes to the output, not even the null terminator. +// Returns the number of bytes written, EXCLUDING the null terminator. + +function stringToUTF32(str, outPtr, maxBytesToWrite) { + assert(outPtr % 4 == 0, 'Pointer passed to stringToUTF32 must be aligned to four bytes!'); + assert(typeof maxBytesToWrite == 'number', 'stringToUTF32(str, outPtr, maxBytesToWrite) is missing the third parameter that specifies the length of the output buffer!'); + // Backwards compatibility: if max bytes is not specified, assume unsafe unbounded write is allowed. + if (maxBytesToWrite === undefined) { + maxBytesToWrite = 0x7FFFFFFF; + } + if (maxBytesToWrite < 4) return 0; + var startPtr = outPtr; + var endPtr = startPtr + maxBytesToWrite - 4; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); // possibly a lead surrogate + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) { + var trailSurrogate = str.charCodeAt(++i); + codeUnit = 0x10000 + ((codeUnit & 0x3FF) << 10) | (trailSurrogate & 0x3FF); + } + HEAP32[((outPtr)>>2)]=codeUnit; + outPtr += 4; + if (outPtr + 4 > endPtr) break; + } + // Null-terminate the pointer to the HEAP. + HEAP32[((outPtr)>>2)]=0; + return outPtr - startPtr; +} + +// Returns the number of bytes the given Javascript string takes if encoded as a UTF16 byte array, EXCLUDING the null terminator byte. + +function lengthBytesUTF32(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code unit, not a Unicode code point of the character! We must decode the string to UTF-32 to the heap. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var codeUnit = str.charCodeAt(i); + if (codeUnit >= 0xD800 && codeUnit <= 0xDFFF) ++i; // possibly a lead surrogate, so skip over the tail surrogate. + len += 4; + } + + return len; +} + +// Allocate heap space for a JS string, and write it there. +// It is the responsibility of the caller to free() that memory. +function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Allocate stack space for a JS string, and write it there. +function allocateUTF8OnStack(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = stackAlloc(size); + stringToUTF8Array(str, HEAP8, ret, size); + return ret; +} + +// Deprecated: This function should not be called because it is unsafe and does not provide +// a maximum length limit of how many bytes it is allowed to write. Prefer calling the +// function stringToUTF8Array() instead, which takes in a maximum length that can be used +// to be secure from out of bounds writes. +/** @deprecated + @param {boolean=} dontAddNull */ +function writeStringToMemory(string, buffer, dontAddNull) { + warnOnce('writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!'); + + var /** @type {number} */ lastChar, /** @type {number} */ end; + if (dontAddNull) { + // stringToUTF8Array always appends null. If we don't want to do that, remember the + // character that existed at the location where the null will be placed, and restore + // that after the write (below). + end = buffer + lengthBytesUTF8(string); + lastChar = HEAP8[end]; + } + stringToUTF8(string, buffer, Infinity); + if (dontAddNull) HEAP8[end] = lastChar; // Restore the value under the null character. +} + +function writeArrayToMemory(array, buffer) { + assert(array.length >= 0, 'writeArrayToMemory array must have a length (should be an array or typed array)') + HEAP8.set(array, buffer); +} + +/** @param {boolean=} dontAddNull */ +function writeAsciiToMemory(str, buffer, dontAddNull) { + for (var i = 0; i < str.length; ++i) { + assert(str.charCodeAt(i) === str.charCodeAt(i)&0xff); + HEAP8[((buffer++)>>0)]=str.charCodeAt(i); + } + // Null-terminate the pointer to the HEAP. + if (!dontAddNull) HEAP8[((buffer)>>0)]=0; +} + + + +// Memory management + +var PAGE_SIZE = 16384; +var WASM_PAGE_SIZE = 65536; +var ASMJS_PAGE_SIZE = 16777216; + +function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - (x % multiple); + } + return x; +} + +var HEAP, +/** @type {ArrayBuffer} */ + buffer, +/** @type {Int8Array} */ + HEAP8, +/** @type {Uint8Array} */ + HEAPU8, +/** @type {Int16Array} */ + HEAP16, +/** @type {Uint16Array} */ + HEAPU16, +/** @type {Int32Array} */ + HEAP32, +/** @type {Uint32Array} */ + HEAPU32, +/** @type {Float32Array} */ + HEAPF32, +/** @type {Float64Array} */ + HEAPF64; + +function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module['HEAP8'] = HEAP8 = new Int8Array(buf); + Module['HEAP16'] = HEAP16 = new Int16Array(buf); + Module['HEAP32'] = HEAP32 = new Int32Array(buf); + Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf); + Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf); + Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf); + Module['HEAPF32'] = HEAPF32 = new Float32Array(buf); + Module['HEAPF64'] = HEAPF64 = new Float64Array(buf); +} + +var STATIC_BASE = 1024, + STACK_BASE = 5256736, + STACKTOP = STACK_BASE, + STACK_MAX = 13856, + DYNAMIC_BASE = 5256736, + DYNAMICTOP_PTR = 13696; + +assert(STACK_BASE % 16 === 0, 'stack must start aligned'); +assert(DYNAMIC_BASE % 16 === 0, 'heap must start aligned'); + + + +var TOTAL_STACK = 5242880; +if (Module['TOTAL_STACK']) assert(TOTAL_STACK === Module['TOTAL_STACK'], 'the stack size can no longer be determined at runtime') + +var INITIAL_INITIAL_MEMORY = Module['INITIAL_MEMORY'] || 16777216;if (!Object.getOwnPropertyDescriptor(Module, 'INITIAL_MEMORY')) Object.defineProperty(Module, 'INITIAL_MEMORY', { configurable: true, get: function() { abort('Module.INITIAL_MEMORY has been replaced with plain INITIAL_INITIAL_MEMORY') } }); + +assert(INITIAL_INITIAL_MEMORY >= TOTAL_STACK, 'INITIAL_MEMORY should be larger than TOTAL_STACK, was ' + INITIAL_INITIAL_MEMORY + '! (TOTAL_STACK=' + TOTAL_STACK + ')'); + +// check for full engine support (use string 'subarray' to avoid closure compiler confusion) +assert(typeof Int32Array !== 'undefined' && typeof Float64Array !== 'undefined' && Int32Array.prototype.subarray !== undefined && Int32Array.prototype.set !== undefined, + 'JS engine does not provide full typed array support'); + + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + + + +// In standalone mode, the wasm creates the memory, and the user can't provide it. +// In non-standalone/normal mode, we create the memory here. + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// Create the main memory. (Note: this isn't used in STANDALONE_WASM mode since the wasm +// memory is created in the wasm, not in JS.) + + if (Module['wasmMemory']) { + wasmMemory = Module['wasmMemory']; + } else + { + wasmMemory = new WebAssembly.Memory({ + 'initial': INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE + , + 'maximum': INITIAL_INITIAL_MEMORY / WASM_PAGE_SIZE + }); + } + + +if (wasmMemory) { + buffer = wasmMemory.buffer; +} + +// If the user provides an incorrect length, just use that length instead rather than providing the user to +// specifically provide the memory length with Module['INITIAL_MEMORY']. +INITIAL_INITIAL_MEMORY = buffer.byteLength; +assert(INITIAL_INITIAL_MEMORY % WASM_PAGE_SIZE === 0); +updateGlobalBufferAndViews(buffer); + +HEAP32[DYNAMICTOP_PTR>>2] = DYNAMIC_BASE; + + + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + assert((STACK_MAX & 3) == 0); + // The stack grows downwards + HEAPU32[(STACK_MAX >> 2)+1] = 0x2135467; + HEAPU32[(STACK_MAX >> 2)+2] = 0x89BACDFE; + // Also test the global address 0 for integrity. + // We don't do this with ASan because ASan does its own checks for this. + HEAP32[0] = 0x63736d65; /* 'emsc' */ +} + +function checkStackCookie() { + var cookie1 = HEAPU32[(STACK_MAX >> 2)+1]; + var cookie2 = HEAPU32[(STACK_MAX >> 2)+2]; + if (cookie1 != 0x2135467 || cookie2 != 0x89BACDFE) { + abort('Stack overflow! Stack cookie has been overwritten, expected hex dwords 0x89BACDFE and 0x2135467, but received 0x' + cookie2.toString(16) + ' ' + cookie1.toString(16)); + } + // Also test the global address 0 for integrity. + // We don't do this with ASan because ASan does its own checks for this. + if (HEAP32[0] !== 0x63736d65 /* 'emsc' */) abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); +} + +function abortStackOverflow(allocSize) { + abort('Stack overflow! Attempted to allocate ' + allocSize + ' bytes on the stack, but stack has only ' + (STACK_MAX - stackSave() + allocSize) + ' bytes available!'); +} + + + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// Endianness check (note: assumes compiler arch was little-endian) +(function() { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) throw 'Runtime error: expected the system to be little-endian!'; +})(); + +function abortFnPtrError(ptr, sig) { + abort("Invalid function pointer " + ptr + " called with signature '" + sig + "'. Perhaps this is an invalid value (e.g. caused by calling a virtual method on a NULL pointer)? Or calling a function with an incorrect type, which will fail? (it is worth building your source files with -Werror (warnings are errors), as warnings can indicate undefined behavior which can cause this). Build with ASSERTIONS=2 for more info."); +} + + + +function callRuntimeCallbacks(callbacks) { + while(callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == 'function') { + callback(Module); // Pass the module as the first argument. + continue; + } + var func = callback.func; + if (typeof func === 'number') { + if (callback.arg === undefined) { + Module['dynCall_v'](func); + } else { + Module['dynCall_vi'](func, callback.arg); + } + } else { + func(callback.arg === undefined ? null : callback.arg); + } + } +} + +var __ATPRERUN__ = []; // functions called before the runtime is initialized +var __ATINIT__ = []; // functions called during startup +var __ATMAIN__ = []; // functions called when main() is to be run +var __ATEXIT__ = []; // functions called during shutdown +var __ATPOSTRUN__ = []; // functions called after the main() is called + +var runtimeInitialized = false; +var runtimeExited = false; + + +function preRun() { + + if (Module['preRun']) { + if (typeof Module['preRun'] == 'function') Module['preRun'] = [Module['preRun']]; + while (Module['preRun'].length) { + addOnPreRun(Module['preRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPRERUN__); +} + +function initRuntime() { + checkStackCookie(); + assert(!runtimeInitialized); + runtimeInitialized = true; + if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); +TTY.init(); + callRuntimeCallbacks(__ATINIT__); +} + +function preMain() { + checkStackCookie(); + FS.ignorePermissions = false; + callRuntimeCallbacks(__ATMAIN__); +} + +function exitRuntime() { + checkStackCookie(); + runtimeExited = true; +} + +function postRun() { + checkStackCookie(); + + if (Module['postRun']) { + if (typeof Module['postRun'] == 'function') Module['postRun'] = [Module['postRun']]; + while (Module['postRun'].length) { + addOnPostRun(Module['postRun'].shift()); + } + } + + callRuntimeCallbacks(__ATPOSTRUN__); +} + +function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); +} + +function addOnInit(cb) { + __ATINIT__.unshift(cb); +} + +function addOnPreMain(cb) { + __ATMAIN__.unshift(cb); +} + +function addOnExit(cb) { +} + +function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); +} + +/** @param {number|boolean=} ignore */ +function unSign(value, bits, ignore) { + if (value >= 0) { + return value; + } + return bits <= 32 ? 2*Math.abs(1 << (bits-1)) + value // Need some trickery, since if bits == 32, we are right at the limit of the bits JS uses in bitshifts + : Math.pow(2, bits) + value; +} +/** @param {number|boolean=} ignore */ +function reSign(value, bits, ignore) { + if (value <= 0) { + return value; + } + var half = bits <= 32 ? Math.abs(1 << (bits-1)) // abs is needed if bits == 32 + : Math.pow(2, bits-1); + if (value >= half && (bits <= 32 || value > half)) { // for huge values, we can hit the precision limit and always get true here. so don't do that + // but, in general there is no perfect solution here. With 64-bit ints, we get rounding and errors + // TODO: In i64 mode 1, resign the two parts separately and safely + value = -2*half + value; // Cannot bitshift half, as it may be at the limit of the bits JS uses in bitshifts + } + return value; +} + + +/** + * @license + * Copyright 2019 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/fround + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32 + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc + +assert(Math.imul, 'This browser does not support Math.imul(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.fround, 'This browser does not support Math.fround(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.clz32, 'This browser does not support Math.clz32(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); +assert(Math.trunc, 'This browser does not support Math.trunc(), build with LEGACY_VM_SUPPORT or POLYFILL_OLD_MATH_FUNCTIONS to add in a polyfill'); + +var Math_abs = Math.abs; +var Math_cos = Math.cos; +var Math_sin = Math.sin; +var Math_tan = Math.tan; +var Math_acos = Math.acos; +var Math_asin = Math.asin; +var Math_atan = Math.atan; +var Math_atan2 = Math.atan2; +var Math_exp = Math.exp; +var Math_log = Math.log; +var Math_sqrt = Math.sqrt; +var Math_ceil = Math.ceil; +var Math_floor = Math.floor; +var Math_pow = Math.pow; +var Math_imul = Math.imul; +var Math_fround = Math.fround; +var Math_round = Math.round; +var Math_min = Math.min; +var Math_max = Math.max; +var Math_clz32 = Math.clz32; +var Math_trunc = Math.trunc; + + + +// A counter of dependencies for calling run(). If we need to +// do asynchronous work before running, increment this and +// decrement it. Incrementing must happen in a place like +// Module.preRun (used by emcc to add file preloading). +// Note that you can add dependencies in preRun, even though +// it happens right before run - run will be postponed until +// the dependencies are met. +var runDependencies = 0; +var runDependencyWatcher = null; +var dependenciesFulfilled = null; // overridden to take different actions when all run dependencies are fulfilled +var runDependencyTracking = {}; + +function getUniqueRunDependency(id) { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } +} + +function addRunDependency(id) { + runDependencies++; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && typeof setInterval !== 'undefined') { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(function() { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err('dependency: ' + dep); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + } + } else { + err('warning: run dependency added without ID'); + } +} + +function removeRunDependency(id) { + runDependencies--; + + if (Module['monitorRunDependencies']) { + Module['monitorRunDependencies'](runDependencies); + } + + if (id) { + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + } else { + err('warning: run dependency removed without ID'); + } + if (runDependencies == 0) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); // can add another dependenciesFulfilled + } + } +} + +Module["preloadedImages"] = {}; // maps url to image data +Module["preloadedAudios"] = {}; // maps url to audio data + + +/** @param {string|number=} what */ +function abort(what) { + if (Module['onAbort']) { + Module['onAbort'](what); + } + + what += ''; + out(what); + err(what); + + ABORT = true; + EXITSTATUS = 1; + + var output = 'abort(' + what + ') at ' + stackTrace(); + what = output; + + // Throw a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + throw new WebAssembly.RuntimeError(what); +} + + +var memoryInitializer = null; + + +/** + * @license + * Copyright 2015 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + + + + + + + +/** + * @license + * Copyright 2017 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +function hasPrefix(str, prefix) { + return String.prototype.startsWith ? + str.startsWith(prefix) : + str.indexOf(prefix) === 0; +} + +// Prefix of data URIs emitted by SINGLE_FILE and related options. +var dataURIPrefix = 'data:application/octet-stream;base64,'; + +// Indicates whether filename is a base64 data URI. +function isDataURI(filename) { + return hasPrefix(filename, dataURIPrefix); +} + +var fileURIPrefix = "file://"; + +// Indicates whether filename is delivered via file protocol (as opposed to http/https) +function isFileURI(filename) { + return hasPrefix(filename, fileURIPrefix); +} + + + +var wasmBinaryFile = 'luac.wasm'; +if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); +} + +function getBinary() { + try { + if (wasmBinary) { + return new Uint8Array(wasmBinary); + } + + if (readBinary) { + return readBinary(wasmBinaryFile); + } else { + throw "both async and sync fetching of the wasm failed"; + } + } + catch (err) { + abort(err); + } +} + +function getBinaryPromise() { + // If we don't have the binary yet, and have the Fetch api, use that; + // in some environments, like Electron's render process, Fetch api may be present, but have a different context than expected, let's only use it on the Web + if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) && typeof fetch === 'function' + // Let's not use fetch to get objects over file:// as it's most likely Cordova which doesn't support fetch for file:// + && !isFileURI(wasmBinaryFile) + ) { + return fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(response) { + if (!response['ok']) { + throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"; + } + return response['arrayBuffer'](); + }).catch(function () { + return getBinary(); + }); + } + // Otherwise, getBinary should be able to get it synchronously + return new Promise(function(resolve, reject) { + resolve(getBinary()); + }); +} + + + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +function createWasm() { + // prepare imports + var info = { + 'env': asmLibraryArg, + 'wasi_snapshot_preview1': asmLibraryArg + }; + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + /** @param {WebAssembly.Module=} module*/ + function receiveInstance(instance, module) { + var exports = instance.exports; + Module['asm'] = exports; + removeRunDependency('wasm-instantiate'); + } + // we can't run yet (except in a pthread, where we have a custom sync instantiator) + addRunDependency('wasm-instantiate'); + + + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiatedSource(output) { + // 'output' is a WebAssemblyInstantiatedSource object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above USE_PTHREADS-enabled path. + receiveInstance(output['instance']); + } + + + function instantiateArrayBuffer(receiver) { + return getBinaryPromise().then(function(binary) { + return WebAssembly.instantiate(binary, info); + }).then(receiver, function(reason) { + err('failed to asynchronously prepare wasm: ' + reason); + abort(reason); + }); + } + + // Prefer streaming instantiation if available. + function instantiateAsync() { + if (!wasmBinary && + typeof WebAssembly.instantiateStreaming === 'function' && + !isDataURI(wasmBinaryFile) && + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + !isFileURI(wasmBinaryFile) && + typeof fetch === 'function') { + fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function (response) { + var result = WebAssembly.instantiateStreaming(response, info); + return result.then(receiveInstantiatedSource, function(reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err('wasm streaming compile failed: ' + reason); + err('falling back to ArrayBuffer instantiation'); + instantiateArrayBuffer(receiveInstantiatedSource); + }); + }); + } else { + return instantiateArrayBuffer(receiveInstantiatedSource); + } + } + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to run the instantiation parallel + // to any other async startup actions they are performing. + if (Module['instantiateWasm']) { + try { + var exports = Module['instantiateWasm'](info, receiveInstance); + return exports; + } catch(e) { + err('Module.instantiateWasm callback failed with error: ' + e); + return false; + } + } + + instantiateAsync(); + return {}; // no exports yet; we'll fill them in later +} + + +// Globals used by JS i64 conversions +var tempDouble; +var tempI64; + +// === Body === + +var ASM_CONSTS = { + +}; + + + + +// STATICTOP = STATIC_BASE + 12832; +/* global initializers */ __ATINIT__.push({ func: function() { ___wasm_call_ctors() } }); + + + + +/* no memory initializer */ +// {{PRE_LIBRARY}} + + + function demangle(func) { + warnOnce('warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling'); + return func; + } + + function demangleAll(text) { + var regex = + /\b_Z[\w\d_]+/g; + return text.replace(regex, + function(x) { + var y = demangle(x); + return x === y ? x : (y + ' [' + x + ']'); + }); + } + + function jsStackTrace() { + var err = new Error(); + if (!err.stack) { + // IE10+ special cases: It does have callstack info, but it is only populated if an Error object is thrown, + // so try that as a special-case. + try { + throw new Error(); + } catch(e) { + err = e; + } + if (!err.stack) { + return '(no stack trace available)'; + } + } + return err.stack.toString(); + } + + function stackTrace() { + var js = jsStackTrace(); + if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace'](); + return demangleAll(js); + } + + function ___handle_stack_overflow() { + abort('stack overflow') + } + + + + var PATH={splitPath:function(filename) { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + },normalizeArray:function(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + },normalize:function(path) { + var isAbsolute = path.charAt(0) === '/', + trailingSlash = path.substr(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + },dirname:function(path) { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + return root + dir; + },basename:function(path) { + // EMSCRIPTEN return '/'' for '/', not an empty string + if (path === '/') return '/'; + var lastSlash = path.lastIndexOf('/'); + if (lastSlash === -1) return path; + return path.substr(lastSlash+1); + },extname:function(path) { + return PATH.splitPath(path)[3]; + },join:function() { + var paths = Array.prototype.slice.call(arguments, 0); + return PATH.normalize(paths.join('/')); + },join2:function(l, r) { + return PATH.normalize(l + '/' + r); + }}; + + + function setErrNo(value) { + HEAP32[((___errno_location())>>2)]=value; + return value; + } + + var PATH_FS={resolve:function() { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter(function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + },relative:function(from, to) { + from = PATH_FS.resolve(from).substr(1); + to = PATH_FS.resolve(to).substr(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }}; + + var TTY={ttys:[],init:function () { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process['stdin']['setEncoding']('utf8'); + // } + },shutdown:function() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process['stdin']['pause'](); + // } + },register:function(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + },stream_ops:{open:function(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + },close:function(stream) { + // flush any pending line data + stream.tty.ops.flush(stream.tty); + },flush:function(stream) { + stream.tty.ops.flush(stream.tty); + },read:function(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + },write:function(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + }},default_tty_ops:{get_char:function(tty) { + if (!tty.input.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE); + var bytesRead = 0; + + try { + bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an exception, but on other OSes, + // reading EOF returns 0. Uniformize behavior by treating the EOF exception to return 0. + if (e.toString().indexOf('EOF') != -1) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } else { + result = null; + } + } else + if (typeof window != 'undefined' && + typeof window.prompt == 'function') { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else if (typeof readline == 'function') { + // Command line. + result = readline(); + if (result !== null) { + result += '\n'; + } + } + if (!result) { + return null; + } + tty.input = intArrayFromString(result, true); + } + return tty.input.shift(); + },put_char:function(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + out(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }},default_tty1_ops:{put_char:function(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + },flush:function(tty) { + if (tty.output && tty.output.length > 0) { + err(UTF8ArrayToString(tty.output, 0)); + tty.output = []; + } + }}}; + + var MEMFS={ops_table:null,mount:function(mount) { + return MEMFS.createNode(null, '/', 16384 | 511 /* 0777 */, 0); + },createNode:function(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // no supported + throw new FS.ErrnoError(63); + } + if (!MEMFS.ops_table) { + MEMFS.ops_table = { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + allocate: MEMFS.stream_ops.allocate, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + } + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + node.usedBytes = 0; // The actual number of bytes used in the typed array, as opposed to contents.length which gives the whole capacity. + // When the byte data of the file is populated, this will point to either a typed array, or a normal JS array. Typed arrays are preferred + // for performance, and used by default. However, typed arrays are not resizable like normal JS arrays are, so there is a small disk size + // penalty involved for appending file writes that continuously grow a file similar to std::vector capacity vs used -scheme. + node.contents = null; + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.timestamp = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + } + return node; + },getFileDataAsRegularArray:function(node) { + if (node.contents && node.contents.subarray) { + var arr = []; + for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i]); + return arr; // Returns a copy of the original data. + } + return node.contents; // No-op, the file contents are already in a JS array. Return as-is. + },getFileDataAsTypedArray:function(node) { + if (!node.contents) return new Uint8Array(0); + if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + return new Uint8Array(node.contents); + },expandFileStorage:function(node, newCapacity) { + var prevCapacity = node.contents ? node.contents.length : 0; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for large sizes, do a much more conservative size*1.125 increase to + // avoid overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = node.contents; + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0); // Copy old data over to the new storage. + return; + },resizeFileStorage:function(node, newSize) { + if (node.usedBytes == newSize) return; + if (newSize == 0) { + node.contents = null; // Fully decommit when requesting a resize to zero. + node.usedBytes = 0; + return; + } + if (!node.contents || node.contents.subarray) { // Resize a typed array if that is being used as the backing store. + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + if (oldContents) { + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + } + node.usedBytes = newSize; + return; + } + // Backing with a JS array. + if (!node.contents) node.contents = []; + if (node.contents.length > newSize) node.contents.length = newSize; + else while (node.contents.length < newSize) node.contents.push(0); + node.usedBytes = newSize; + },node_ops:{getattr:function(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.timestamp); + attr.mtime = new Date(node.timestamp); + attr.ctime = new Date(node.timestamp); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + },setattr:function(node, attr) { + if (attr.mode !== undefined) { + node.mode = attr.mode; + } + if (attr.timestamp !== undefined) { + node.timestamp = attr.timestamp; + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + },lookup:function(parent, name) { + throw FS.genericErrors[44]; + },mknod:function(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + },rename:function(old_node, new_dir, new_name) { + // if we're overwriting a directory at new_name, make sure it's empty. + if (FS.isDir(old_node.mode)) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + } + if (new_node) { + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + old_node.name = new_name; + new_dir.contents[new_name] = old_node; + old_node.parent = new_dir; + },unlink:function(parent, name) { + delete parent.contents[name]; + },rmdir:function(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + },readdir:function(node) { + var entries = ['.', '..']; + for (var key in node.contents) { + if (!node.contents.hasOwnProperty(key)) { + continue; + } + entries.push(key); + } + return entries; + },symlink:function(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 511 /* 0777 */ | 40960, 0); + node.link = oldpath; + return node; + },readlink:function(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }},stream_ops:{read:function(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + if (size > 8 && contents.subarray) { // non-trivial, and typed array + buffer.set(contents.subarray(position, position + size), offset); + } else { + for (var i = 0; i < size; i++) buffer[offset + i] = contents[position + i]; + } + return size; + },write:function(stream, buffer, offset, length, position, canOwn) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + + if (!length) return 0; + var node = stream.node; + node.timestamp = Date.now(); + + if (buffer.subarray && (!node.contents || node.contents.subarray)) { // This write is from a typed array to a typed array? + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + return length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + return length; + } else if (position + length <= node.usedBytes) { // Writing to an already allocated and used subrange of the file? + node.contents.set(buffer.subarray(offset, offset + length), position); + return length; + } + } + + // Appending to an existing file and we need to reallocate, or source data did not come as a typed array. + MEMFS.expandFileStorage(node, position+length); + if (node.contents.subarray && buffer.subarray) node.contents.set(buffer.subarray(offset, offset + length), position); // Use typed array write if available. + else { + for (var i = 0; i < length; i++) { + node.contents[position + i] = buffer[offset + i]; // Or fall back to manual write if not. + } + } + node.usedBytes = Math.max(node.usedBytes, position + length); + return length; + },llseek:function(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + },allocate:function(stream, offset, length) { + MEMFS.expandFileStorage(stream.node, offset + length); + stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length); + },mmap:function(stream, buffer, offset, length, position, prot, flags) { + // The data buffer should be a typed array view + assert(!(buffer instanceof ArrayBuffer)); + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if ( !(flags & 2) && + contents.buffer === buffer.buffer ) { + // We can't emulate MAP_SHARED when the file is not backed by the buffer + // we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + allocated = true; + // malloc() can lead to growing the heap. If targeting the heap, we need to + // re-acquire the heap buffer object in case growth had occurred. + var fromHeap = (buffer.buffer == HEAP8.buffer); + ptr = _malloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + (fromHeap ? HEAP8 : buffer).set(contents, ptr); + } + return { ptr: ptr, allocated: allocated }; + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (mmapFlags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + + var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }}}; + + var ERRNO_MESSAGES={0:"Success",1:"Arg list too long",2:"Permission denied",3:"Address already in use",4:"Address not available",5:"Address family not supported by protocol family",6:"No more processes",7:"Socket already connected",8:"Bad file number",9:"Trying to read unreadable message",10:"Mount device busy",11:"Operation canceled",12:"No children",13:"Connection aborted",14:"Connection refused",15:"Connection reset by peer",16:"File locking deadlock error",17:"Destination address required",18:"Math arg out of domain of func",19:"Quota exceeded",20:"File exists",21:"Bad address",22:"File too large",23:"Host is unreachable",24:"Identifier removed",25:"Illegal byte sequence",26:"Connection already in progress",27:"Interrupted system call",28:"Invalid argument",29:"I/O error",30:"Socket is already connected",31:"Is a directory",32:"Too many symbolic links",33:"Too many open files",34:"Too many links",35:"Message too long",36:"Multihop attempted",37:"File or path name too long",38:"Network interface is not configured",39:"Connection reset by network",40:"Network is unreachable",41:"Too many open files in system",42:"No buffer space available",43:"No such device",44:"No such file or directory",45:"Exec format error",46:"No record locks available",47:"The link has been severed",48:"Not enough core",49:"No message of desired type",50:"Protocol not available",51:"No space left on device",52:"Function not implemented",53:"Socket is not connected",54:"Not a directory",55:"Directory not empty",56:"State not recoverable",57:"Socket operation on non-socket",59:"Not a typewriter",60:"No such device or address",61:"Value too large for defined data type",62:"Previous owner died",63:"Not super-user",64:"Broken pipe",65:"Protocol error",66:"Unknown protocol",67:"Protocol wrong type for socket",68:"Math result not representable",69:"Read only file system",70:"Illegal seek",71:"No such process",72:"Stale file handle",73:"Connection timed out",74:"Text file busy",75:"Cross-device link",100:"Device not a stream",101:"Bad font file fmt",102:"Invalid slot",103:"Invalid request code",104:"No anode",105:"Block device required",106:"Channel number out of range",107:"Level 3 halted",108:"Level 3 reset",109:"Link number out of range",110:"Protocol driver not attached",111:"No CSI structure available",112:"Level 2 halted",113:"Invalid exchange",114:"Invalid request descriptor",115:"Exchange full",116:"No data (for no delay io)",117:"Timer expired",118:"Out of streams resources",119:"Machine is not on the network",120:"Package not installed",121:"The object is remote",122:"Advertise error",123:"Srmount error",124:"Communication error on send",125:"Cross mount point (not really error)",126:"Given log. name not unique",127:"f.d. invalid for this operation",128:"Remote address changed",129:"Can access a needed shared lib",130:"Accessing a corrupted shared lib",131:".lib section in a.out corrupted",132:"Attempting to link in too many libs",133:"Attempting to exec a shared library",135:"Streams pipe error",136:"Too many users",137:"Socket type not supported",138:"Not supported",139:"Protocol family not supported",140:"Can't send after socket shutdown",141:"Too many references",142:"Host is down",148:"No medium (in tape drive)",156:"Level 2 not synchronized"}; + + var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:function(e) { + if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace(); + return setErrNo(e.errno); + },lookupPath:function(path, opts) { + path = PATH_FS.resolve(FS.cwd(), path); + opts = opts || {}; + + if (!path) return { path: '', node: null }; + + var defaults = { + follow_mount: true, + recurse_count: 0 + }; + for (var key in defaults) { + if (opts[key] === undefined) { + opts[key] = defaults[key]; + } + } + + if (opts.recurse_count > 8) { // max recursive lookup of 8 + throw new FS.ErrnoError(32); + } + + // split the path + var parts = PATH.normalizeArray(path.split('/').filter(function(p) { + return !!p; + }), false); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + current = FS.lookupNode(current, parts[i]); + current_path = PATH.join2(current_path, parts[i]); + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current)) { + if (!islast || (islast && opts.follow_mount)) { + current = current.mounted.root; + } + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (!islast || opts.follow) { + var count = 0; + while (FS.isLink(current.mode)) { + var link = FS.readlink(current_path); + current_path = PATH_FS.resolve(PATH.dirname(current_path), link); + + var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); + current = lookup.node; + + if (count++ > 40) { // limit max consecutive symlinks to 40 (SYMLOOP_MAX). + throw new FS.ErrnoError(32); + } + } + } + } + + return { path: current_path, node: current }; + },getPath:function(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? mount + '/' + path : mount + path; + } + path = path ? node.name + '/' + path : node.name; + node = node.parent; + } + },hashName:function(parentid, name) { + var hash = 0; + + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + },hashAddNode:function(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + },hashRemoveNode:function(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + },lookupNode:function(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode, parent); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + },createNode:function(parent, name, mode, rdev) { + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + },destroyNode:function(node) { + FS.hashRemoveNode(node); + },isRoot:function(node) { + return node === node.parent; + },isMountpoint:function(node) { + return !!node.mounted; + },isFile:function(mode) { + return (mode & 61440) === 32768; + },isDir:function(mode) { + return (mode & 61440) === 16384; + },isLink:function(mode) { + return (mode & 61440) === 40960; + },isChrdev:function(mode) { + return (mode & 61440) === 8192; + },isBlkdev:function(mode) { + return (mode & 61440) === 24576; + },isFIFO:function(mode) { + return (mode & 61440) === 4096; + },isSocket:function(mode) { + return (mode & 49152) === 49152; + },flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str) { + var flags = FS.flagModes[str]; + if (typeof flags === 'undefined') { + throw new Error('Unknown file open mode: ' + str); + } + return flags; + },flagsToPermissionString:function(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + },nodePermissions:function(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.indexOf('r') !== -1 && !(node.mode & 292)) { + return 2; + } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) { + return 2; + } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) { + return 2; + } + return 0; + },mayLookup:function(dir) { + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + },mayCreate:function(dir, name) { + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + },mayDelete:function(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else { + if (FS.isDir(node.mode)) { + return 31; + } + } + return 0; + },mayOpen:function(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } else if (FS.isDir(node.mode)) { + if (FS.flagsToPermissionString(flags) !== 'r' || // opening for write + (flags & 512)) { // TODO: check for O_SEARCH? (== search for dir only) + return 31; + } + } + return FS.nodePermissions(node, FS.flagsToPermissionString(flags)); + },MAX_OPEN_FDS:4096,nextfd:function(fd_start, fd_end) { + fd_start = fd_start || 0; + fd_end = fd_end || FS.MAX_OPEN_FDS; + for (var fd = fd_start; fd <= fd_end; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + },getStream:function(fd) { + return FS.streams[fd]; + },createStream:function(stream, fd_start, fd_end) { + if (!FS.FSStream) { + FS.FSStream = /** @constructor */ function(){}; + FS.FSStream.prototype = { + object: { + get: function() { return this.node; }, + set: function(val) { this.node = val; } + }, + isRead: { + get: function() { return (this.flags & 2097155) !== 1; } + }, + isWrite: { + get: function() { return (this.flags & 2097155) !== 0; } + }, + isAppend: { + get: function() { return (this.flags & 1024); } + } + }; + } + // clone it, so we can return an instance of FSStream + var newStream = new FS.FSStream(); + for (var p in stream) { + newStream[p] = stream[p]; + } + stream = newStream; + var fd = FS.nextfd(fd_start, fd_end); + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + },closeStream:function(fd) { + FS.streams[fd] = null; + },chrdev_stream_ops:{open:function(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + },llseek:function() { + throw new FS.ErrnoError(70); + }},major:function(dev) { + return ((dev) >> 8); + },minor:function(dev) { + return ((dev) & 0xff); + },makedev:function(ma, mi) { + return ((ma) << 8 | (mi)); + },registerDevice:function(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + },getDevice:function(dev) { + return FS.devices[dev]; + },getMounts:function(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push.apply(check, m.mounts); + } + + return mounts; + },syncfs:function(populate, callback) { + if (typeof(populate) === 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err('warning: ' + FS.syncFSRequests + ' FS.syncfs operations in flight at once, probably just doing extra work'); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + mounts.forEach(function (mount) { + if (!mount.type.syncfs) { + return done(null); + } + mount.type.syncfs(mount, populate, done); + }); + },mount:function(type, opts, mountpoint) { + if (typeof type === 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type: type, + opts: opts, + mountpoint: mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + },unmount:function (mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + Object.keys(FS.nameTable).forEach(function (hash) { + var current = FS.nameTable[hash]; + + while (current) { + var next = current.name_next; + + if (mounts.indexOf(current.mount) !== -1) { + FS.destroyNode(current); + } + + current = next; + } + }); + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + },lookup:function(parent, name) { + return parent.node_ops.lookup(parent, name); + },mknod:function(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name || name === '.' || name === '..') { + throw new FS.ErrnoError(28); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + },create:function(path, mode) { + mode = mode !== undefined ? mode : 438 /* 0666 */; + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + },mkdir:function(path, mode) { + mode = mode !== undefined ? mode : 511 /* 0777 */; + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + },mkdirTree:function(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var i = 0; i < dirs.length; ++i) { + if (!dirs[i]) continue; + d += '/' + dirs[i]; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + },mkdev:function(path, mode, dev) { + if (typeof(dev) === 'undefined') { + dev = mode; + mode = 438 /* 0666 */; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + },symlink:function(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + },rename:function(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + try { + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + } catch (e) { + throw new FS.ErrnoError(10); + } + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + try { + if (FS.trackingDelegate['willMovePath']) { + FS.trackingDelegate['willMovePath'](old_path, new_path); + } + } catch(e) { + err("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + try { + if (FS.trackingDelegate['onMovePath']) FS.trackingDelegate['onMovePath'](old_path, new_path); + } catch(e) { + err("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: " + e.message); + } + },rmdir:function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readdir:function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node.node_ops.readdir) { + throw new FS.ErrnoError(54); + } + return node.node_ops.readdir(node); + },unlink:function(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + try { + if (FS.trackingDelegate['willDeletePath']) { + FS.trackingDelegate['willDeletePath'](path); + } + } catch(e) { + err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: " + e.message); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + try { + if (FS.trackingDelegate['onDeletePath']) FS.trackingDelegate['onDeletePath'](path); + } catch(e) { + err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: " + e.message); + } + },readlink:function(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)); + },stat:function(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + if (!node) { + throw new FS.ErrnoError(44); + } + if (!node.node_ops.getattr) { + throw new FS.ErrnoError(63); + } + return node.node_ops.getattr(node); + },lstat:function(path) { + return FS.stat(path, true); + },chmod:function(path, mode, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + mode: (mode & 4095) | (node.mode & ~4095), + timestamp: Date.now() + }); + },lchmod:function(path, mode) { + FS.chmod(path, mode, true); + },fchmod:function(fd, mode) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chmod(stream.node, mode); + },chown:function(path, uid, gid, dontFollow) { + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + node.node_ops.setattr(node, { + timestamp: Date.now() + // we ignore the uid / gid for now + }); + },lchown:function(path, uid, gid) { + FS.chown(path, uid, gid, true); + },fchown:function(fd, uid, gid) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + FS.chown(stream.node, uid, gid); + },truncate:function(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path === 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + if (!node.node_ops.setattr) { + throw new FS.ErrnoError(63); + } + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + node.node_ops.setattr(node, { + size: len, + timestamp: Date.now() + }); + },ftruncate:function(fd, len) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.truncate(stream.node, len); + },utime:function(path, atime, mtime) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + node.node_ops.setattr(node, { + timestamp: Math.max(atime, mtime) + }); + },open:function(path, flags, mode, fd_start, fd_end) { + if (path === "") { + throw new FS.ErrnoError(44); + } + flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags; + mode = typeof mode === 'undefined' ? 438 /* 0666 */ : mode; + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + if (typeof path === 'object') { + node = path; + } else { + path = PATH.normalize(path); + try { + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072) + }); + node = lookup.node; + } catch (e) { + // ignore + } + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else { + // node doesn't exist, try to create it + node = FS.mknod(path, mode, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512)) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node: node, + path: FS.getPath(node), // we want the absolute path to the node + flags: flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }, fd_start, fd_end); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (Module['logReadFiles'] && !(flags & 1)) { + if (!FS.readFiles) FS.readFiles = {}; + if (!(path in FS.readFiles)) { + FS.readFiles[path] = 1; + err("FS.trackingDelegate error on read file: " + path); + } + } + try { + if (FS.trackingDelegate['onOpenFile']) { + var trackingFlags = 0; + if ((flags & 2097155) !== 1) { + trackingFlags |= FS.tracking.openFlags.READ; + } + if ((flags & 2097155) !== 0) { + trackingFlags |= FS.tracking.openFlags.WRITE; + } + FS.trackingDelegate['onOpenFile'](path, trackingFlags); + } + } catch(e) { + err("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: " + e.message); + } + return stream; + },close:function(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + },isClosed:function(stream) { + return stream.fd === null; + },llseek:function(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + },read:function(stream, buffer, offset, length, position) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + },write:function(stream, buffer, offset, length, position, canOwn) { + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position !== 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + try { + if (stream.path && FS.trackingDelegate['onWriteToFile']) FS.trackingDelegate['onWriteToFile'](stream.path); + } catch(e) { + err("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: " + e.message); + } + return bytesWritten; + },allocate:function(stream, offset, length) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (offset < 0 || length <= 0) { + throw new FS.ErrnoError(28); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (!stream.stream_ops.allocate) { + throw new FS.ErrnoError(138); + } + stream.stream_ops.allocate(stream, offset, length); + },mmap:function(stream, buffer, offset, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + return stream.stream_ops.mmap(stream, buffer, offset, length, position, prot, flags); + },msync:function(stream, buffer, offset, length, mmapFlags) { + if (!stream || !stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + },munmap:function(stream) { + return 0; + },ioctl:function(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + },readFile:function(path, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'r'; + opts.encoding = opts.encoding || 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + throw new Error('Invalid encoding type "' + opts.encoding + '"'); + } + var ret; + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + ret = UTF8ArrayToString(buf, 0); + } else if (opts.encoding === 'binary') { + ret = buf; + } + FS.close(stream); + return ret; + },writeFile:function(path, data, opts) { + opts = opts || {}; + opts.flags = opts.flags || 'w'; + var stream = FS.open(path, opts.flags, opts.mode); + if (typeof data === 'string') { + var buf = new Uint8Array(lengthBytesUTF8(data)+1); + var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); + FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn); + } else if (ArrayBuffer.isView(data)) { + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + } else { + throw new Error('Unsupported data type'); + } + FS.close(stream); + },cwd:function() { + return FS.currentPath; + },chdir:function(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + },createDefaultDirectories:function() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + },createDefaultDevices:function() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: function() { return 0; }, + write: function(stream, buffer, offset, length, pos) { return length; } + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using Module['printErr'] + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + var random_device; + if (typeof crypto === 'object' && typeof crypto['getRandomValues'] === 'function') { + // for modern web browsers + var randomBuffer = new Uint8Array(1); + random_device = function() { crypto.getRandomValues(randomBuffer); return randomBuffer[0]; }; + } else + if (ENVIRONMENT_IS_NODE) { + // for nodejs with or without crypto support included + try { + var crypto_module = require('crypto'); + // nodejs has crypto support + random_device = function() { return crypto_module['randomBytes'](1)[0]; }; + } catch (e) { + // nodejs doesn't have crypto support + } + } else + {} + if (!random_device) { + // we couldn't find a proper implementation, as Math.random() is not suitable for /dev/random, see emscripten-core/emscripten/pull/7096 + random_device = function() { abort("no cryptographic support found for random_device. consider polyfilling it if you want to use something insecure like Math.random(), e.g. put this in a --pre-js: var crypto = { getRandomValues: function(array) { for (var i = 0; i < array.length; i++) array[i] = (Math.random()*256)|0 } };"); }; + } + FS.createDevice('/dev', 'random', random_device); + FS.createDevice('/dev', 'urandom', random_device); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + },createSpecialDirectories:function() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount: function() { + var node = FS.createNode('/proc/self', 'fd', 16384 | 511 /* 0777 */, 73); + node.node_ops = { + lookup: function(parent, name) { + var fd = +name; + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: function() { return stream.path } } + }; + ret.parent = ret; // make it look like a simple root node + return ret; + } + }; + return node; + } + }, {}, '/proc/self/fd'); + },createStandardStreams:function() { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (Module['stdin']) { + FS.createDevice('/dev', 'stdin', Module['stdin']); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (Module['stdout']) { + FS.createDevice('/dev', 'stdout', null, Module['stdout']); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (Module['stderr']) { + FS.createDevice('/dev', 'stderr', null, Module['stderr']); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 'r'); + var stdout = FS.open('/dev/stdout', 'w'); + var stderr = FS.open('/dev/stderr', 'w'); + assert(stdin.fd === 0, 'invalid handle for stdin (' + stdin.fd + ')'); + assert(stdout.fd === 1, 'invalid handle for stdout (' + stdout.fd + ')'); + assert(stderr.fd === 2, 'invalid handle for stderr (' + stderr.fd + ')'); + },ensureErrnoError:function() { + if (FS.ErrnoError) return; + FS.ErrnoError = /** @this{Object} */ function ErrnoError(errno, node) { + this.node = node; + this.setErrno = /** @this{Object} */ function(errno) { + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + }; + this.setErrno(errno); + this.message = ERRNO_MESSAGES[errno]; + + // Try to get a maximally helpful stack trace. On Node.js, getting Error.stack + // now ensures it shows what we want. + if (this.stack) { + // Define the stack property for Node.js 4, which otherwise errors on the next line. + Object.defineProperty(this, "stack", { value: (new Error).stack, writable: true }); + this.stack = demangleAll(this.stack); + } + }; + FS.ErrnoError.prototype = new Error(); + FS.ErrnoError.prototype.constructor = FS.ErrnoError; + // Some errors may happen quite a bit, to avoid overhead we reuse them (and suffer a lack of stack info) + [44].forEach(function(code) { + FS.genericErrors[code] = new FS.ErrnoError(code); + FS.genericErrors[code].stack = ''; + }); + },staticInit:function() { + FS.ensureErrnoError(); + + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + },init:function(input, output, error) { + assert(!FS.init.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.init.initialized = true; + + FS.ensureErrnoError(); + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + Module['stdin'] = input || Module['stdin']; + Module['stdout'] = output || Module['stdout']; + Module['stderr'] = error || Module['stderr']; + + FS.createStandardStreams(); + },quit:function() { + FS.init.initialized = false; + // force-flush all streams, so we get musl std streams printed out + var fflush = Module['_fflush']; + if (fflush) fflush(0); + // close all of our streams + for (var i = 0; i < FS.streams.length; i++) { + var stream = FS.streams[i]; + if (!stream) { + continue; + } + FS.close(stream); + } + },getMode:function(canRead, canWrite) { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + },joinPath:function(parts, forceRelative) { + var path = PATH.join.apply(null, parts); + if (forceRelative && path[0] == '/') path = path.substr(1); + return path; + },absolutePath:function(relative, base) { + return PATH_FS.resolve(base, relative); + },standardizePath:function(path) { + return PATH.normalize(path); + },findObject:function(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (ret.exists) { + return ret.object; + } else { + setErrNo(ret.error); + return null; + } + },analyzePath:function(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + },createFolder:function(parent, name, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.mkdir(path, mode); + },createPath:function(parent, path, canRead, canWrite) { + parent = typeof parent === 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + // ignore EEXIST + } + parent = current; + } + return current; + },createFile:function(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(canRead, canWrite); + return FS.create(path, mode); + },createDataFile:function(parent, name, data, canRead, canWrite, canOwn) { + var path = name ? PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name) : parent; + var mode = FS.getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + if (typeof data === 'string') { + var arr = new Array(data.length); + for (var i = 0, len = data.length; i < len; ++i) arr[i] = data.charCodeAt(i); + data = arr; + } + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 'w'); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + return node; + },createDevice:function(parent, name, input, output) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + var mode = FS.getMode(!!input, !!output); + if (!FS.createDevice.major) FS.createDevice.major = 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open: function(stream) { + stream.seekable = false; + }, + close: function(stream) { + // flush any pending line data + if (output && output.buffer && output.buffer.length) { + output(10); + } + }, + read: function(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.timestamp = Date.now(); + } + return bytesRead; + }, + write: function(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.timestamp = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + },createLink:function(parent, name, target, canRead, canWrite) { + var path = PATH.join2(typeof parent === 'string' ? parent : FS.getPath(parent), name); + return FS.symlink(target, path); + },forceLoadFile:function(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + var success = true; + if (typeof XMLHttpRequest !== 'undefined') { + throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."); + } else if (read_) { + // Command-line. + try { + // WARNING: Can't read binary files in V8's d8 or tracemonkey's js, as + // read() will try to parse UTF8. + obj.contents = intArrayFromString(read_(obj.url), true); + obj.usedBytes = obj.contents.length; + } catch (e) { + success = false; + } + } else { + throw new Error('Cannot load without read() or XMLHttpRequest.'); + } + if (!success) setErrNo(29); + return success; + },createLazyFile:function(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). Actual getting is abstracted away for eventual reuse. + /** @constructor */ + function LazyUint8Array() { + this.lengthKnown = false; + this.chunks = []; // Loaded chunks. Index is the chunk number + } + LazyUint8Array.prototype.get = /** @this{Object} */ function LazyUint8Array_get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + }; + LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { + this.getter = getter; + }; + LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + var datalength = Number(xhr.getResponseHeader("Content-length")); + var header; + var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; + var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (function(from, to) { + if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); + if (to > datalength-1) throw new Error("only " + datalength + " bytes available! programmer error!"); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); + + // Some hints to the browser that we want binary data. + if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } else { + return intArrayFromString(xhr.responseText || '', true); + } + }); + var lazyArray = this; + lazyArray.setDataGetter(function(chunkNum) { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof(lazyArray.chunks[chunkNum]) === "undefined") throw new Error("doXHR failed!"); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out("LazyFiles on gzip forces download of the whole file when length is accessed"); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + }; + if (typeof XMLHttpRequest !== 'undefined') { + if (!ENVIRONMENT_IS_WORKER) throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'; + var lazyArray = new LazyUint8Array(); + Object.defineProperties(lazyArray, { + length: { + get: /** @this{Object} */ function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + }, + chunkSize: { + get: /** @this{Object} */ function() { + if(!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + }); + + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: /** @this {FSNode} */ function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + var keys = Object.keys(node.stream_ops); + keys.forEach(function(key) { + var fn = node.stream_ops[key]; + stream_ops[key] = function forceLoadLazyFile() { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(29); + } + return fn.apply(null, arguments); + }; + }); + // use a custom read function + stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { + if (!FS.forceLoadFile(node)) { + throw new FS.ErrnoError(29); + } + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + }; + node.stream_ops = stream_ops; + return node; + },createPreloadedFile:function(parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { + Browser.init(); // XXX perhaps this method should move onto Browser? + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency('cp ' + fullname); // might have several active requests for the same fullname + function processData(byteArray) { + function finish(byteArray) { + if (preFinish) preFinish(); + if (!dontCreateFile) { + FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + if (onload) onload(); + removeRunDependency(dep); + } + var handled = false; + Module['preloadPlugins'].forEach(function(plugin) { + if (handled) return; + if (plugin['canHandle'](fullname)) { + plugin['handle'](byteArray, fullname, finish, function() { + if (onerror) onerror(); + removeRunDependency(dep); + }); + handled = true; + } + }); + if (!handled) finish(byteArray); + } + addRunDependency(dep); + if (typeof url == 'string') { + Browser.asyncLoad(url, function(byteArray) { + processData(byteArray); + }, onerror); + } else { + processData(url); + } + },indexedDB:function() { + return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; + },DB_NAME:function() { + return 'EM_FS_' + window.location.pathname; + },DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { + out('creating db'); + var db = openRequest.result; + db.createObjectStore(FS.DB_STORE_NAME); + }; + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite'); + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var putRequest = files.put(FS.analyzePath(path).object.contents, path); + putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; + putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + },loadFilesFromDB:function(paths, onload, onerror) { + onload = onload || function(){}; + onerror = onerror || function(){}; + var indexedDB = FS.indexedDB(); + try { + var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION); + } catch (e) { + return onerror(e); + } + openRequest.onupgradeneeded = onerror; // no database to load from + openRequest.onsuccess = function openRequest_onsuccess() { + var db = openRequest.result; + try { + var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly'); + } catch(e) { + onerror(e); + return; + } + var files = transaction.objectStore(FS.DB_STORE_NAME); + var ok = 0, fail = 0, total = paths.length; + function finish() { + if (fail == 0) onload(); else onerror(); + } + paths.forEach(function(path) { + var getRequest = files.get(path); + getRequest.onsuccess = function getRequest_onsuccess() { + if (FS.analyzePath(path).exists) { + FS.unlink(path); + } + FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); + ok++; + if (ok + fail == total) finish(); + }; + getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() }; + }); + transaction.onerror = onerror; + }; + openRequest.onerror = onerror; + }};var SYSCALLS={mappings:{},DEFAULT_POLLMASK:5,umask:511,calculateAt:function(dirfd, path) { + if (path[0] !== '/') { + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = FS.getStream(dirfd); + if (!dirstream) throw new FS.ErrnoError(8); + dir = dirstream.path; + } + path = PATH.join2(dir, path); + } + return path; + },doStat:function(func, path, buf) { + try { + var stat = func(path); + } catch (e) { + if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { + // an error occurred while trying to look up the path; we should just report ENOTDIR + return -54; + } + throw e; + } + HEAP32[((buf)>>2)]=stat.dev; + HEAP32[(((buf)+(4))>>2)]=0; + HEAP32[(((buf)+(8))>>2)]=stat.ino; + HEAP32[(((buf)+(12))>>2)]=stat.mode; + HEAP32[(((buf)+(16))>>2)]=stat.nlink; + HEAP32[(((buf)+(20))>>2)]=stat.uid; + HEAP32[(((buf)+(24))>>2)]=stat.gid; + HEAP32[(((buf)+(28))>>2)]=stat.rdev; + HEAP32[(((buf)+(32))>>2)]=0; + (tempI64 = [stat.size>>>0,(tempDouble=stat.size,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(40))>>2)]=tempI64[0],HEAP32[(((buf)+(44))>>2)]=tempI64[1]); + HEAP32[(((buf)+(48))>>2)]=4096; + HEAP32[(((buf)+(52))>>2)]=stat.blocks; + HEAP32[(((buf)+(56))>>2)]=(stat.atime.getTime() / 1000)|0; + HEAP32[(((buf)+(60))>>2)]=0; + HEAP32[(((buf)+(64))>>2)]=(stat.mtime.getTime() / 1000)|0; + HEAP32[(((buf)+(68))>>2)]=0; + HEAP32[(((buf)+(72))>>2)]=(stat.ctime.getTime() / 1000)|0; + HEAP32[(((buf)+(76))>>2)]=0; + (tempI64 = [stat.ino>>>0,(tempDouble=stat.ino,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[(((buf)+(80))>>2)]=tempI64[0],HEAP32[(((buf)+(84))>>2)]=tempI64[1]); + return 0; + },doMsync:function(addr, stream, len, flags, offset) { + var buffer = HEAPU8.slice(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + },doMkdir:function(path, mode) { + // remove a trailing slash, if one - /a/b/ has basename of '', but + // we want to create b in the context of this function + path = PATH.normalize(path); + if (path[path.length-1] === '/') path = path.substr(0, path.length-1); + FS.mkdir(path, mode, 0); + return 0; + },doMknod:function(path, mode, dev) { + // we don't want this in the JS API as it uses mknod to create all nodes. + switch (mode & 61440) { + case 32768: + case 8192: + case 24576: + case 4096: + case 49152: + break; + default: return -28; + } + FS.mknod(path, mode, dev); + return 0; + },doReadlink:function(path, buf, bufsize) { + if (bufsize <= 0) return -28; + var ret = FS.readlink(path); + + var len = Math.min(bufsize, lengthBytesUTF8(ret)); + var endChar = HEAP8[buf+len]; + stringToUTF8(ret, buf, bufsize+1); + // readlink is one of the rare functions that write out a C string, but does never append a null to the output buffer(!) + // stringToUTF8() always appends a null byte, so restore the character under the null byte after the write. + HEAP8[buf+len] = endChar; + + return len; + },doAccess:function(path, amode) { + if (amode & ~7) { + // need a valid mode + return -28; + } + var node; + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + if (!node) { + return -44; + } + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + },doDup:function(path, flags, suggestFD) { + var suggest = FS.getStream(suggestFD); + if (suggest) FS.close(suggest); + return FS.open(path, flags, 0, suggestFD, suggestFD).fd; + },doReadv:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.read(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + } + return ret; + },doWritev:function(stream, iov, iovcnt, offset) { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAP32[(((iov)+(i*8))>>2)]; + var len = HEAP32[(((iov)+(i*8 + 4))>>2)]; + var curr = FS.write(stream, HEAP8,ptr, len, offset); + if (curr < 0) return -1; + ret += curr; + } + return ret; + },varargs:undefined,get:function() { + assert(SYSCALLS.varargs != undefined); + SYSCALLS.varargs += 4; + var ret = HEAP32[(((SYSCALLS.varargs)-(4))>>2)]; + return ret; + },getStr:function(ptr) { + var ret = UTF8ToString(ptr); + return ret; + },getStreamFromFD:function(fd) { + var stream = FS.getStream(fd); + if (!stream) throw new FS.ErrnoError(8); + return stream; + },get64:function(low, high) { + if (low >= 0) assert(high === 0); + else assert(high === -1); + return low; + }};function ___sys_dup2(oldfd, suggestFD) {try { + + var old = SYSCALLS.getStreamFromFD(oldfd); + if (old.fd === suggestFD) return suggestFD; + return SYSCALLS.doDup(old.path, old.flags, suggestFD); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_dup3(fd, suggestFD, flags) {try { + + var old = SYSCALLS.getStreamFromFD(fd); + assert(!flags); + if (old.fd === suggestFD) return -28; + return SYSCALLS.doDup(old.path, old.flags, suggestFD); + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_fcntl64(fd, cmd, varargs) {SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = SYSCALLS.get(); + if (arg < 0) { + return -28; + } + var newStream; + newStream = FS.open(stream.path, stream.flags, 0, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = SYSCALLS.get(); + stream.flags |= arg; + return 0; + } + case 12: + /* case 12: Currently in musl F_GETLK64 has same value as F_GETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ { + + var arg = SYSCALLS.get(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)]=2; + return 0; + } + case 13: + case 14: + /* case 13: Currently in musl F_SETLK64 has same value as F_SETLK, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + /* case 14: Currently in musl F_SETLKW64 has same value as F_SETLKW, so omitted to avoid duplicate case blocks. If that changes, uncomment this */ + + + return 0; // Pretend that the locking is successful. + case 16: + case 8: + return -28; // These are for sockets. We don't have them fully implemented yet. + case 9: + // musl trusts getown return values, due to a bug where they must be, as they overlap with errors. just return -1 here, so fnctl() returns that, and we set errno ourselves. + setErrNo(28); + return -1; + default: { + return -28; + } + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_ioctl(fd, op, varargs) {SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: + case 21505: { + if (!stream.tty) return -59; + return 0; + } + case 21510: + case 21511: + case 21512: + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = SYSCALLS.get(); + HEAP32[((argp)>>2)]=0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21531: { + var argp = SYSCALLS.get(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + default: abort('bad ioctl syscall ' + op); + } + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function ___sys_open(path, flags, varargs) {SYSCALLS.varargs = varargs; + try { + + var pathname = SYSCALLS.getStr(path); + var mode = SYSCALLS.get(); + var stream = FS.open(pathname, flags, mode); + return stream.fd; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return -e.errno; + } + } + + function _abort() { + abort(); + } + + function _emscripten_get_sbrk_ptr() { + return 13696; + } + + + + + var setjmpId=0;function _saveSetjmp(env, label, table, size) { + // Not particularly fast: slow table lookup of setjmpId to label. But setjmp + // prevents relooping anyhow, so slowness is to be expected. And typical case + // is 1 setjmp per invocation, or less. + env = env|0; + label = label|0; + table = table|0; + size = size|0; + var i = 0; + setjmpId = (setjmpId+1)|0; + HEAP32[((env)>>2)]=setjmpId; + while ((i|0) < (size|0)) { + if (((HEAP32[(((table)+((i<<3)))>>2)])|0) == 0) { + HEAP32[(((table)+((i<<3)))>>2)]=setjmpId; + HEAP32[(((table)+((i<<3)+4))>>2)]=label; + // prepare next slot + HEAP32[(((table)+((i<<3)+8))>>2)]=0; + setTempRet0((size) | 0); + return table | 0; + } + i = i+1|0; + } + // grow the table + size = (size*2)|0; + table = _realloc(table|0, 8*(size+1|0)|0) | 0; + table = _saveSetjmp(env|0, label|0, table|0, size|0) | 0; + setTempRet0((size) | 0); + return table | 0; + } + + function _testSetjmp(id, table, size) { + id = id|0; + table = table|0; + size = size|0; + var i = 0, curr = 0; + while ((i|0) < (size|0)) { + curr = ((HEAP32[(((table)+((i<<3)))>>2)])|0); + if ((curr|0) == 0) break; + if ((curr|0) == (id|0)) { + return ((HEAP32[(((table)+((i<<3)+4))>>2)])|0); + } + i = i+1|0; + } + return 0; + }function _longjmp(env, value) { + _setThrew(env, value || 1); + throw 'longjmp'; + }function _emscripten_longjmp(env, value) { + _longjmp(env, value); + } + + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + + + function _emscripten_get_heap_size() { + return HEAPU8.length; + } + + function abortOnCannotGrowMemory(requestedSize) { + abort('Cannot enlarge memory arrays to size ' + requestedSize + ' bytes (OOM). Either (1) compile with -s INITIAL_MEMORY=X with X higher than the current value ' + HEAP8.length + ', (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 '); + }function _emscripten_resize_heap(requestedSize) { + requestedSize = requestedSize >>> 0; + abortOnCannotGrowMemory(requestedSize); + } + + function _exit(status) { + // void _exit(int status); + // http://pubs.opengroup.org/onlinepubs/000095399/functions/exit.html + exit(status); + } + + function _fd_close(fd) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_read(fd, iov, iovcnt, pnum) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doReadv(stream, iov, iovcnt); + HEAP32[((pnum)>>2)]=num + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {try { + + + var stream = SYSCALLS.getStreamFromFD(fd); + var HIGH_OFFSET = 0x100000000; // 2^32 + // use an unsigned operator on low and shift high by 32-bits + var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); + + var DOUBLE_LIMIT = 0x20000000000000; // 2^53 + // we also check for equality since DOUBLE_LIMIT + 1 == DOUBLE_LIMIT + if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { + return -61; + } + + FS.llseek(stream, offset, whence); + (tempI64 = [stream.position>>>0,(tempDouble=stream.position,(+(Math_abs(tempDouble))) >= 1.0 ? (tempDouble > 0.0 ? ((Math_min((+(Math_floor((tempDouble)/4294967296.0))), 4294967295.0))|0)>>>0 : (~~((+(Math_ceil((tempDouble - +(((~~(tempDouble)))>>>0))/4294967296.0)))))>>>0) : 0)],HEAP32[((newOffset)>>2)]=tempI64[0],HEAP32[(((newOffset)+(4))>>2)]=tempI64[1]); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _fd_write(fd, iov, iovcnt, pnum) {try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = SYSCALLS.doWritev(stream, iov, iovcnt); + HEAP32[((pnum)>>2)]=num + return 0; + } catch (e) { + if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e); + return e.errno; + } + } + + function _getTempRet0() { + return (getTempRet0() | 0); + } + + + function _setTempRet0($i) { + setTempRet0(($i) | 0); + } + + + function _time(ptr) { + var ret = (Date.now()/1000)|0; + if (ptr) { + HEAP32[((ptr)>>2)]=ret; + } + return ret; + } +var FSNode = /** @constructor */ function(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.mounted = null; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.node_ops = {}; + this.stream_ops = {}; + this.rdev = rdev; + }; + var readMode = 292/*292*/ | 73/*73*/; + var writeMode = 146/*146*/; + Object.defineProperties(FSNode.prototype, { + read: { + get: /** @this{FSNode} */function() { + return (this.mode & readMode) === readMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= readMode : this.mode &= ~readMode; + } + }, + write: { + get: /** @this{FSNode} */function() { + return (this.mode & writeMode) === writeMode; + }, + set: /** @this{FSNode} */function(val) { + val ? this.mode |= writeMode : this.mode &= ~writeMode; + } + }, + isFolder: { + get: /** @this{FSNode} */function() { + return FS.isDir(this.mode); + } + }, + isDevice: { + get: /** @this{FSNode} */function() { + return FS.isChrdev(this.mode); + } + } + }); + FS.FSNode = FSNode; + FS.staticInit();; +var ASSERTIONS = true; + +/** + * @license + * Copyright 2017 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +/** @type {function(string, boolean=, number=)} */ +function intArrayFromString(stringy, dontAddNull, length) { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; +} + +function intArrayToString(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + var chr = array[i]; + if (chr > 0xFF) { + if (ASSERTIONS) { + assert(false, 'Character code ' + chr + ' (' + String.fromCharCode(chr) + ') at offset ' + i + ' not in 0x00-0xFF.'); + } + chr &= 0xFF; + } + ret.push(String.fromCharCode(chr)); + } + return ret.join(''); +} + + +var asmGlobalArg = {}; +var asmLibraryArg = { "__handle_stack_overflow": ___handle_stack_overflow, "__sys_dup2": ___sys_dup2, "__sys_dup3": ___sys_dup3, "__sys_fcntl64": ___sys_fcntl64, "__sys_ioctl": ___sys_ioctl, "__sys_open": ___sys_open, "abort": _abort, "emscripten_get_sbrk_ptr": _emscripten_get_sbrk_ptr, "emscripten_longjmp": _emscripten_longjmp, "emscripten_memcpy_big": _emscripten_memcpy_big, "emscripten_resize_heap": _emscripten_resize_heap, "exit": _exit, "fd_close": _fd_close, "fd_read": _fd_read, "fd_seek": _fd_seek, "fd_write": _fd_write, "getTempRet0": _getTempRet0, "invoke_vii": invoke_vii, "memory": wasmMemory, "saveSetjmp": _saveSetjmp, "setTempRet0": _setTempRet0, "table": wasmTable, "testSetjmp": _testSetjmp, "time": _time }; +var asm = createWasm(); +Module["asm"] = asm; +/** @type {function(...*):?} */ +var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__wasm_call_ctors"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _main = Module["_main"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["main"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var ___errno_location = Module["___errno_location"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__errno_location"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _malloc = Module["_malloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["malloc"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _free = Module["_free"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["free"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _realloc = Module["_realloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["realloc"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _fflush = Module["_fflush"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["fflush"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __get_tzname = Module["__get_tzname"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_get_tzname"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __get_daylight = Module["__get_daylight"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_get_daylight"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __get_timezone = Module["__get_timezone"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["_get_timezone"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var _setThrew = Module["_setThrew"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["setThrew"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_vii = Module["dynCall_vii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_vii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var ___set_stack_limit = Module["___set_stack_limit"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__set_stack_limit"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var stackSave = Module["stackSave"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackSave"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var stackAlloc = Module["stackAlloc"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackAlloc"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var stackRestore = Module["stackRestore"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["stackRestore"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var __growWasmMemory = Module["__growWasmMemory"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["__growWasmMemory"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_ii = Module["dynCall_ii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_ii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iiii = Module["dynCall_iiii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iiii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iiiii = Module["dynCall_iiiii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iiiii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iii = Module["dynCall_iii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_viii = Module["dynCall_viii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_viii"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_jiji = Module["dynCall_jiji"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_jiji"].apply(null, arguments) +}; + +/** @type {function(...*):?} */ +var dynCall_iidiiii = Module["dynCall_iidiiii"] = function() { + assert(runtimeInitialized, 'you need to wait for the runtime to be ready (e.g. wait for main() to be called)'); + assert(!runtimeExited, 'the runtime was exited (use NO_EXIT_RUNTIME to keep it alive after main() exits)'); + return Module["asm"]["dynCall_iidiiii"].apply(null, arguments) +}; + + +function invoke_vii(index,a1,a2) { + var sp = stackSave(); + try { + dynCall_vii(index,a1,a2); + } catch(e) { + stackRestore(sp); + if (e !== e+0 && e !== 'longjmp') throw e; + _setThrew(1, 0); + } +} + + +/** + * @license + * Copyright 2010 The Emscripten Authors + * SPDX-License-Identifier: MIT + */ + +// === Auto-generated postamble setup entry stuff === + +Module['asm'] = asm; + +if (!Object.getOwnPropertyDescriptor(Module, "intArrayFromString")) Module["intArrayFromString"] = function() { abort("'intArrayFromString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "intArrayToString")) Module["intArrayToString"] = function() { abort("'intArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ccall")) Module["ccall"] = function() { abort("'ccall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "cwrap")) Module["cwrap"] = function() { abort("'cwrap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setValue")) Module["setValue"] = function() { abort("'setValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getValue")) Module["getValue"] = function() { abort("'getValue' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocate")) Module["allocate"] = function() { abort("'allocate' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getMemory")) Module["getMemory"] = function() { abort("'getMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF8ArrayToString")) Module["UTF8ArrayToString"] = function() { abort("'UTF8ArrayToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF8ToString")) Module["UTF8ToString"] = function() { abort("'UTF8ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8Array")) Module["stringToUTF8Array"] = function() { abort("'stringToUTF8Array' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF8")) Module["stringToUTF8"] = function() { abort("'stringToUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF8")) Module["lengthBytesUTF8"] = function() { abort("'lengthBytesUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPreRun")) Module["addOnPreRun"] = function() { abort("'addOnPreRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnInit")) Module["addOnInit"] = function() { abort("'addOnInit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPreMain")) Module["addOnPreMain"] = function() { abort("'addOnPreMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnExit")) Module["addOnExit"] = function() { abort("'addOnExit' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addOnPostRun")) Module["addOnPostRun"] = function() { abort("'addOnPostRun' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeStringToMemory")) Module["writeStringToMemory"] = function() { abort("'writeStringToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeArrayToMemory")) Module["writeArrayToMemory"] = function() { abort("'writeArrayToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeAsciiToMemory")) Module["writeAsciiToMemory"] = function() { abort("'writeAsciiToMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addRunDependency")) Module["addRunDependency"] = function() { abort("'addRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "removeRunDependency")) Module["removeRunDependency"] = function() { abort("'removeRunDependency' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createFolder")) Module["FS_createFolder"] = function() { abort("'FS_createFolder' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createPath")) Module["FS_createPath"] = function() { abort("'FS_createPath' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createDataFile")) Module["FS_createDataFile"] = function() { abort("'FS_createDataFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createPreloadedFile")) Module["FS_createPreloadedFile"] = function() { abort("'FS_createPreloadedFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createLazyFile")) Module["FS_createLazyFile"] = function() { abort("'FS_createLazyFile' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createLink")) Module["FS_createLink"] = function() { abort("'FS_createLink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_createDevice")) Module["FS_createDevice"] = function() { abort("'FS_createDevice' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS_unlink")) Module["FS_unlink"] = function() { abort("'FS_unlink' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ). Alternatively, forcing filesystem support (-s FORCE_FILESYSTEM=1) can export this for you") }; +if (!Object.getOwnPropertyDescriptor(Module, "dynamicAlloc")) Module["dynamicAlloc"] = function() { abort("'dynamicAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "loadDynamicLibrary")) Module["loadDynamicLibrary"] = function() { abort("'loadDynamicLibrary' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "loadWebAssemblyModule")) Module["loadWebAssemblyModule"] = function() { abort("'loadWebAssemblyModule' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getLEB")) Module["getLEB"] = function() { abort("'getLEB' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getFunctionTables")) Module["getFunctionTables"] = function() { abort("'getFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "alignFunctionTables")) Module["alignFunctionTables"] = function() { abort("'alignFunctionTables' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "registerFunctions")) Module["registerFunctions"] = function() { abort("'registerFunctions' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "addFunction")) Module["addFunction"] = function() { abort("'addFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "removeFunction")) Module["removeFunction"] = function() { abort("'removeFunction' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getFuncWrapper")) Module["getFuncWrapper"] = function() { abort("'getFuncWrapper' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "prettyPrint")) Module["prettyPrint"] = function() { abort("'prettyPrint' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "makeBigInt")) Module["makeBigInt"] = function() { abort("'makeBigInt' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "dynCall")) Module["dynCall"] = function() { abort("'dynCall' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getCompilerSetting")) Module["getCompilerSetting"] = function() { abort("'getCompilerSetting' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "print")) Module["print"] = function() { abort("'print' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "printErr")) Module["printErr"] = function() { abort("'printErr' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getTempRet0")) Module["getTempRet0"] = function() { abort("'getTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setTempRet0")) Module["setTempRet0"] = function() { abort("'setTempRet0' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "callMain")) Module["callMain"] = function() { abort("'callMain' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "abort")) Module["abort"] = function() { abort("'abort' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToNewUTF8")) Module["stringToNewUTF8"] = function() { abort("'stringToNewUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "abortOnCannotGrowMemory")) Module["abortOnCannotGrowMemory"] = function() { abort("'abortOnCannotGrowMemory' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscripten_realloc_buffer")) Module["emscripten_realloc_buffer"] = function() { abort("'emscripten_realloc_buffer' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ENV")) Module["ENV"] = function() { abort("'ENV' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setjmpId")) Module["setjmpId"] = function() { abort("'setjmpId' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_CODES")) Module["ERRNO_CODES"] = function() { abort("'ERRNO_CODES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "ERRNO_MESSAGES")) Module["ERRNO_MESSAGES"] = function() { abort("'ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "setErrNo")) Module["setErrNo"] = function() { abort("'setErrNo' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "DNS")) Module["DNS"] = function() { abort("'DNS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GAI_ERRNO_MESSAGES")) Module["GAI_ERRNO_MESSAGES"] = function() { abort("'GAI_ERRNO_MESSAGES' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Protocols")) Module["Protocols"] = function() { abort("'Protocols' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Sockets")) Module["Sockets"] = function() { abort("'Sockets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UNWIND_CACHE")) Module["UNWIND_CACHE"] = function() { abort("'UNWIND_CACHE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readAsmConstArgs")) Module["readAsmConstArgs"] = function() { abort("'readAsmConstArgs' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jstoi_q")) Module["jstoi_q"] = function() { abort("'jstoi_q' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jstoi_s")) Module["jstoi_s"] = function() { abort("'jstoi_s' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "reallyNegative")) Module["reallyNegative"] = function() { abort("'reallyNegative' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "formatString")) Module["formatString"] = function() { abort("'formatString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PATH")) Module["PATH"] = function() { abort("'PATH' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PATH_FS")) Module["PATH_FS"] = function() { abort("'PATH_FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SYSCALLS")) Module["SYSCALLS"] = function() { abort("'SYSCALLS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "syscallMmap2")) Module["syscallMmap2"] = function() { abort("'syscallMmap2' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "syscallMunmap")) Module["syscallMunmap"] = function() { abort("'syscallMunmap' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "JSEvents")) Module["JSEvents"] = function() { abort("'JSEvents' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "specialHTMLTargets")) Module["specialHTMLTargets"] = function() { abort("'specialHTMLTargets' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "demangle")) Module["demangle"] = function() { abort("'demangle' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "demangleAll")) Module["demangleAll"] = function() { abort("'demangleAll' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "jsStackTrace")) Module["jsStackTrace"] = function() { abort("'jsStackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackTrace")) Module["stackTrace"] = function() { abort("'stackTrace' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "getEnvStrings")) Module["getEnvStrings"] = function() { abort("'getEnvStrings' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64")) Module["writeI53ToI64"] = function() { abort("'writeI53ToI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Clamped")) Module["writeI53ToI64Clamped"] = function() { abort("'writeI53ToI64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToI64Signaling")) Module["writeI53ToI64Signaling"] = function() { abort("'writeI53ToI64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Clamped")) Module["writeI53ToU64Clamped"] = function() { abort("'writeI53ToU64Clamped' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "writeI53ToU64Signaling")) Module["writeI53ToU64Signaling"] = function() { abort("'writeI53ToU64Signaling' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readI53FromI64")) Module["readI53FromI64"] = function() { abort("'readI53FromI64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "readI53FromU64")) Module["readI53FromU64"] = function() { abort("'readI53FromU64' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "convertI32PairToI53")) Module["convertI32PairToI53"] = function() { abort("'convertI32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "convertU32PairToI53")) Module["convertU32PairToI53"] = function() { abort("'convertU32PairToI53' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "Browser")) Module["Browser"] = function() { abort("'Browser' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "FS")) Module["FS"] = function() { abort("'FS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "MEMFS")) Module["MEMFS"] = function() { abort("'MEMFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "TTY")) Module["TTY"] = function() { abort("'TTY' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "PIPEFS")) Module["PIPEFS"] = function() { abort("'PIPEFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SOCKFS")) Module["SOCKFS"] = function() { abort("'SOCKFS' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GL")) Module["GL"] = function() { abort("'GL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGet")) Module["emscriptenWebGLGet"] = function() { abort("'emscriptenWebGLGet' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetTexPixelData")) Module["emscriptenWebGLGetTexPixelData"] = function() { abort("'emscriptenWebGLGetTexPixelData' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetUniform")) Module["emscriptenWebGLGetUniform"] = function() { abort("'emscriptenWebGLGetUniform' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "emscriptenWebGLGetVertexAttrib")) Module["emscriptenWebGLGetVertexAttrib"] = function() { abort("'emscriptenWebGLGetVertexAttrib' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "AL")) Module["AL"] = function() { abort("'AL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_unicode")) Module["SDL_unicode"] = function() { abort("'SDL_unicode' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_ttfContext")) Module["SDL_ttfContext"] = function() { abort("'SDL_ttfContext' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_audio")) Module["SDL_audio"] = function() { abort("'SDL_audio' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL")) Module["SDL"] = function() { abort("'SDL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "SDL_gfx")) Module["SDL_gfx"] = function() { abort("'SDL_gfx' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLUT")) Module["GLUT"] = function() { abort("'GLUT' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "EGL")) Module["EGL"] = function() { abort("'EGL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLFW_Window")) Module["GLFW_Window"] = function() { abort("'GLFW_Window' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLFW")) Module["GLFW"] = function() { abort("'GLFW' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "GLEW")) Module["GLEW"] = function() { abort("'GLEW' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "IDBStore")) Module["IDBStore"] = function() { abort("'IDBStore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "runAndAbortIfError")) Module["runAndAbortIfError"] = function() { abort("'runAndAbortIfError' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "warnOnce")) Module["warnOnce"] = function() { abort("'warnOnce' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackSave")) Module["stackSave"] = function() { abort("'stackSave' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackRestore")) Module["stackRestore"] = function() { abort("'stackRestore' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stackAlloc")) Module["stackAlloc"] = function() { abort("'stackAlloc' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "AsciiToString")) Module["AsciiToString"] = function() { abort("'AsciiToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToAscii")) Module["stringToAscii"] = function() { abort("'stringToAscii' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF16ToString")) Module["UTF16ToString"] = function() { abort("'UTF16ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF16")) Module["stringToUTF16"] = function() { abort("'stringToUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF16")) Module["lengthBytesUTF16"] = function() { abort("'lengthBytesUTF16' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "UTF32ToString")) Module["UTF32ToString"] = function() { abort("'UTF32ToString' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "stringToUTF32")) Module["stringToUTF32"] = function() { abort("'stringToUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "lengthBytesUTF32")) Module["lengthBytesUTF32"] = function() { abort("'lengthBytesUTF32' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8")) Module["allocateUTF8"] = function() { abort("'allocateUTF8' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +if (!Object.getOwnPropertyDescriptor(Module, "allocateUTF8OnStack")) Module["allocateUTF8OnStack"] = function() { abort("'allocateUTF8OnStack' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") }; +Module["writeStackCookie"] = writeStackCookie; +Module["checkStackCookie"] = checkStackCookie; +Module["abortStackOverflow"] = abortStackOverflow;if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NORMAL")) Object.defineProperty(Module, "ALLOC_NORMAL", { configurable: true, get: function() { abort("'ALLOC_NORMAL' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_STACK")) Object.defineProperty(Module, "ALLOC_STACK", { configurable: true, get: function() { abort("'ALLOC_STACK' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_DYNAMIC")) Object.defineProperty(Module, "ALLOC_DYNAMIC", { configurable: true, get: function() { abort("'ALLOC_DYNAMIC' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); +if (!Object.getOwnPropertyDescriptor(Module, "ALLOC_NONE")) Object.defineProperty(Module, "ALLOC_NONE", { configurable: true, get: function() { abort("'ALLOC_NONE' was not exported. add it to EXTRA_EXPORTED_RUNTIME_METHODS (see the FAQ)") } }); + + + +var calledRun; + +/** + * @constructor + * @this {ExitStatus} + */ +function ExitStatus(status) { + this.name = "ExitStatus"; + this.message = "Program terminated with exit(" + status + ")"; + this.status = status; +} + +var calledMain = false; + + +dependenciesFulfilled = function runCaller() { + // If run has never been called, and we should call run (INVOKE_RUN is true, and Module.noInitialRun is not false) + if (!calledRun) run(); + if (!calledRun) dependenciesFulfilled = runCaller; // try this again later, after new deps are fulfilled +}; + +function callMain(args) { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(__ATPRERUN__.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = Module['_main']; + + + args = args || []; + + var argc = args.length+1; + var argv = stackAlloc((argc + 1) * 4); + HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram); + for (var i = 1; i < argc; i++) { + HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1]); + } + HEAP32[(argv >> 2) + argc] = 0; + + + try { + + Module['___set_stack_limit'](STACK_MAX); + + var ret = entryFunction(argc, argv); + + + // In PROXY_TO_PTHREAD builds, we should never exit the runtime below, as execution is asynchronously handed + // off to a pthread. + // if we're not running an evented main loop, it's time to exit + exit(ret, /* implicit = */ true); + } + catch(e) { + if (e instanceof ExitStatus) { + // exit() throws this once it's done to make sure execution + // has been stopped completely + return; + } else if (e == 'unwind') { + // running an evented main loop, don't immediately exit + noExitRuntime = true; + return; + } else { + var toLog = e; + if (e && typeof e === 'object' && e.stack) { + toLog = [e, e.stack]; + } + err('exception thrown: ' + toLog); + quit_(1, e); + } + } finally { + calledMain = true; + } +} + + + + +/** @type {function(Array=)} */ +function run(args) { + args = args || arguments_; + + if (runDependencies > 0) { + return; + } + + writeStackCookie(); + + preRun(); + + if (runDependencies > 0) return; // a preRun added a dependency, run will be called later + + function doRun() { + // run may have just been called through dependencies being fulfilled just in this very frame, + // or while the async setStatus time below was happening + if (calledRun) return; + calledRun = true; + Module['calledRun'] = true; + + if (ABORT) return; + + initRuntime(); + + preMain(); + + if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized'](); + + if (shouldRunNow) callMain(args); + + postRun(); + } + + if (Module['setStatus']) { + Module['setStatus']('Running...'); + setTimeout(function() { + setTimeout(function() { + Module['setStatus'](''); + }, 1); + doRun(); + }, 1); + } else + { + doRun(); + } + checkStackCookie(); +} +Module['run'] = run; + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var print = out; + var printErr = err; + var has = false; + out = err = function(x) { + has = true; + } + try { // it doesn't matter if it fails + var flush = Module['_fflush']; + if (flush) flush(0); + // also flush in the JS FS layer + ['stdout', 'stderr'].forEach(function(name) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty && tty.output && tty.output.length) { + has = true; + } + }); + } catch(e) {} + out = print; + err = printErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +/** @param {boolean|number=} implicit */ +function exit(status, implicit) { + checkUnflushedContent(); + + // if this is just main exit-ing implicitly, and the status is 0, then we + // don't need to do anything here and can just leave. if the status is + // non-zero, though, then we need to report it. + // (we may have warned about this earlier, if a situation justifies doing so) + if (implicit && noExitRuntime && status === 0) { + return; + } + + if (noExitRuntime) { + // if exit() was called, we may warn the user if the runtime isn't actually being shut down + if (!implicit) { + var msg = 'program exited (with status: ' + status + '), but EXIT_RUNTIME is not set, so halting execution but not exiting the runtime or preventing further async execution (build with EXIT_RUNTIME=1, if you want a true shutdown)'; + err(msg); + } + } else { + + ABORT = true; + EXITSTATUS = status; + + exitRuntime(); + + if (Module['onExit']) Module['onExit'](status); + } + + quit_(status, new ExitStatus(status)); +} + +if (Module['preInit']) { + if (typeof Module['preInit'] == 'function') Module['preInit'] = [Module['preInit']]; + while (Module['preInit'].length > 0) { + Module['preInit'].pop()(); + } +} + +// shouldRunNow refers to calling main(), not run(). +var shouldRunNow = true; + +if (Module['noInitialRun']) shouldRunNow = false; + + + noExitRuntime = true; + +run(); + + + + + +// {{MODULE_ADDITIONS}} + + + diff --git a/lua-5.4.0/src/luac.c b/lua-5.4.0/src/luac.c new file mode 100644 index 0000000..56ddc41 --- /dev/null +++ b/lua-5.4.0/src/luac.c @@ -0,0 +1,724 @@ +/* +** $Id: luac.c $ +** Lua compiler (saves bytecodes to files; also lists bytecodes) +** See Copyright Notice in lua.h +*/ + +#define luac_c +#define LUA_CORE + +#include "lprefix.h" + +#include +#include +#include +#include +#include + +#include "lua.h" +#include "lauxlib.h" + +#include "ldebug.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lopnames.h" +#include "lstate.h" +#include "lundump.h" + +static void PrintFunction(const Proto* f, int full); +#define luaU_print PrintFunction + +#define PROGNAME "luac" /* default program name */ +#define OUTPUT PROGNAME ".out" /* default output file */ + +static int listing=0; /* list bytecodes? */ +static int dumping=1; /* dump bytecodes? */ +static int stripping=0; /* strip debug information? */ +static char Output[]={ OUTPUT }; /* default output file name */ +static const char* output=Output; /* actual output file name */ +static const char* progname=PROGNAME; /* actual program name */ +static TString **tmname; + +static void fatal(const char* message) +{ + fprintf(stderr,"%s: %s\n",progname,message); + exit(EXIT_FAILURE); +} + +static void cannot(const char* what) +{ + fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno)); + exit(EXIT_FAILURE); +} + +static void usage(const char* message) +{ + if (*message=='-') + fprintf(stderr,"%s: unrecognized option '%s'\n",progname,message); + else + fprintf(stderr,"%s: %s\n",progname,message); + fprintf(stderr, + "usage: %s [options] [filenames]\n" + "Available options are:\n" + " -l list (use -l -l for full listing)\n" + " -o name output to file 'name' (default is \"%s\")\n" + " -p parse only\n" + " -s strip debug information\n" + " -v show version information\n" + " -- stop handling options\n" + " - stop handling options and process stdin\n" + ,progname,Output); + exit(EXIT_FAILURE); +} + +#define IS(s) (strcmp(argv[i],s)==0) + +static int doargs(int argc, char* argv[]) +{ + int i; + int version=0; + if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0]; + for (i=1; itop+(i))) + +static const Proto* combine(lua_State* L, int n) +{ + if (n==1) + return toproto(L,-1); + else + { + Proto* f; + int i=n; + if (lua_load(L,reader,&i,"=(" PROGNAME ")",NULL)!=LUA_OK) fatal(lua_tostring(L,-1)); + f=toproto(L,-1); + for (i=0; ip[i]=toproto(L,i-n-1); + if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0; + } + f->sizelineinfo=0; + return f; + } +} + +static int writer(lua_State* L, const void* p, size_t size, void* u) +{ + UNUSED(L); + return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0); +} + +static int pmain(lua_State* L) +{ + int argc=(int)lua_tointeger(L,1); + char** argv=(char**)lua_touserdata(L,2); + const Proto* f; + int i; + tmname=G(L)->tmname; + if (!lua_checkstack(L,argc)) fatal("too many input files"); + for (i=0; i1); + if (dumping) + { + FILE* D= (output==NULL) ? stdout : fopen(output,"wb"); + if (D==NULL) cannot("open"); + lua_lock(L); + luaU_dump(L,f,writer,D,stripping); + lua_unlock(L); + if (ferror(D)) cannot("write"); + if (fclose(D)) cannot("close"); + } + return 0; +} + +int main(int argc, char* argv[]) +{ + lua_State* L; + int i=doargs(argc,argv); + argc-=i; argv+=i; + if (argc<=0) usage("no input files given"); + L=luaL_newstate(); + if (L==NULL) fatal("cannot create state: not enough memory"); + lua_pushcfunction(L,&pmain); + lua_pushinteger(L,argc); + lua_pushlightuserdata(L,argv); + if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1)); + lua_close(L); + return EXIT_SUCCESS; +} + +/* +** print bytecodes +*/ + +#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : "-") +#define VOID(p) ((const void*)(p)) +#define eventname(i) (getstr(tmname[i])) + +static void PrintString(const TString* ts) +{ + const char* s=getstr(ts); + size_t i,n=tsslen(ts); + printf("\""); + for (i=0; ik[i]; + switch (ttypetag(o)) + { + case LUA_VNIL: + printf("N"); + break; + case LUA_VFALSE: + case LUA_VTRUE: + printf("B"); + break; + case LUA_VNUMFLT: + printf("F"); + break; + case LUA_VNUMINT: + printf("I"); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + printf("S"); + break; + default: /* cannot happen */ + printf("?%d",ttypetag(o)); + break; + } + printf("\t"); +} + +static void PrintConstant(const Proto* f, int i) +{ + const TValue* o=&f->k[i]; + switch (ttypetag(o)) + { + case LUA_VNIL: + printf("nil"); + break; + case LUA_VFALSE: + printf("false"); + break; + case LUA_VTRUE: + printf("true"); + break; + case LUA_VNUMFLT: + { + char buff[100]; + sprintf(buff,LUA_NUMBER_FMT,fltvalue(o)); + printf("%s",buff); + if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0"); + break; + } + case LUA_VNUMINT: + printf(LUA_INTEGER_FMT,ivalue(o)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + PrintString(tsvalue(o)); + break; + default: /* cannot happen */ + printf("?%d",ttypetag(o)); + break; + } +} + +#define COMMENT "\t; " +#define EXTRAARG GETARG_Ax(code[pc+1]) +#define EXTRAARGC (EXTRAARG*(MAXARG_C+1)) +#define ISK (isk ? "k" : "") + +static void PrintCode(const Proto* f) +{ + const Instruction* code=f->code; + int pc,n=f->sizecode; + for (pc=0; pc0) printf("[%d]\t",line); else printf("[-]\t"); + printf("%-9s\t",opnames[o]); + switch (o) + { + case OP_MOVE: + printf("%d %d",a,b); + break; + case OP_LOADI: + printf("%d %d",a,sbx); + break; + case OP_LOADF: + printf("%d %d",a,sbx); + break; + case OP_LOADK: + printf("%d %d",a,bx); + printf(COMMENT); PrintConstant(f,bx); + break; + case OP_LOADKX: + printf("%d",a); + printf(COMMENT); PrintConstant(f,EXTRAARG); + break; + case OP_LOADFALSE: + printf("%d",a); + break; + case OP_LFALSESKIP: + printf("%d",a); + break; + case OP_LOADTRUE: + printf("%d",a); + break; + case OP_LOADNIL: + printf("%d %d",a,b); + printf(COMMENT "%d out",b+1); + break; + case OP_GETUPVAL: + printf("%d %d",a,b); + printf(COMMENT "%s",UPVALNAME(b)); + break; + case OP_SETUPVAL: + printf("%d %d",a,b); + printf(COMMENT "%s",UPVALNAME(b)); + break; + case OP_GETTABUP: + printf("%d %d %d",a,b,c); + printf(COMMENT "%s",UPVALNAME(b)); + printf(" "); PrintConstant(f,c); + break; + case OP_GETTABLE: + printf("%d %d %d",a,b,c); + break; + case OP_GETI: + printf("%d %d %d",a,b,c); + break; + case OP_GETFIELD: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_SETTABUP: + printf("%d %d %d%s",a,b,c,ISK); + printf(COMMENT "%s",UPVALNAME(a)); + printf(" "); PrintConstant(f,b); + if (isk) { printf(" "); PrintConstant(f,c); } + break; + case OP_SETTABLE: + printf("%d %d %d%s",a,b,c,ISK); + if (isk) { printf(COMMENT); PrintConstant(f,c); } + break; + case OP_SETI: + printf("%d %d %d%s",a,b,c,ISK); + if (isk) { printf(COMMENT); PrintConstant(f,c); } + break; + case OP_SETFIELD: + printf("%d %d %d%s",a,b,c,ISK); + printf(COMMENT); PrintConstant(f,b); + if (isk) { printf(" "); PrintConstant(f,c); } + break; + case OP_NEWTABLE: + printf("%d %d %d",a,b,c); + printf(COMMENT "%d",c+EXTRAARGC); + break; + case OP_SELF: + printf("%d %d %d%s",a,b,c,ISK); + if (isk) { printf(COMMENT); PrintConstant(f,c); } + break; + case OP_ADDI: + printf("%d %d %d",a,b,sc); + break; + case OP_ADDK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_SUBK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_MULK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_MODK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_POWK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_DIVK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_IDIVK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_BANDK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_BORK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_BXORK: + printf("%d %d %d",a,b,c); + printf(COMMENT); PrintConstant(f,c); + break; + case OP_SHRI: + printf("%d %d %d",a,b,sc); + break; + case OP_SHLI: + printf("%d %d %d",a,b,sc); + break; + case OP_ADD: + printf("%d %d %d",a,b,c); + break; + case OP_SUB: + printf("%d %d %d",a,b,c); + break; + case OP_MUL: + printf("%d %d %d",a,b,c); + break; + case OP_MOD: + printf("%d %d %d",a,b,c); + break; + case OP_POW: + printf("%d %d %d",a,b,c); + break; + case OP_DIV: + printf("%d %d %d",a,b,c); + break; + case OP_IDIV: + printf("%d %d %d",a,b,c); + break; + case OP_BAND: + printf("%d %d %d",a,b,c); + break; + case OP_BOR: + printf("%d %d %d",a,b,c); + break; + case OP_BXOR: + printf("%d %d %d",a,b,c); + break; + case OP_SHL: + printf("%d %d %d",a,b,c); + break; + case OP_SHR: + printf("%d %d %d",a,b,c); + break; + case OP_MMBIN: + printf("%d %d %d",a,b,c); + printf(COMMENT "%s",eventname(c)); + break; + case OP_MMBINI: + printf("%d %d %d %d",a,sb,c,isk); + printf(COMMENT "%s",eventname(c)); + if (isk) printf(" flip"); + break; + case OP_MMBINK: + printf("%d %d %d %d",a,b,c,isk); + printf(COMMENT "%s ",eventname(c)); PrintConstant(f,b); + if (isk) printf(" flip"); + break; + case OP_UNM: + printf("%d %d",a,b); + break; + case OP_BNOT: + printf("%d %d",a,b); + break; + case OP_NOT: + printf("%d %d",a,b); + break; + case OP_LEN: + printf("%d %d",a,b); + break; + case OP_CONCAT: + printf("%d %d",a,b); + break; + case OP_CLOSE: + printf("%d",a); + break; + case OP_TBC: + printf("%d",a); + break; + case OP_JMP: + printf("%d",GETARG_sJ(i)); + printf(COMMENT "to %d",GETARG_sJ(i)+pc+2); + break; + case OP_EQ: + printf("%d %d %d",a,b,isk); + break; + case OP_LT: + printf("%d %d %d",a,b,isk); + break; + case OP_LE: + printf("%d %d %d",a,b,isk); + break; + case OP_EQK: + printf("%d %d %d",a,b,isk); + printf(COMMENT); PrintConstant(f,b); + break; + case OP_EQI: + printf("%d %d %d",a,sb,isk); + break; + case OP_LTI: + printf("%d %d %d",a,sb,isk); + break; + case OP_LEI: + printf("%d %d %d",a,sb,isk); + break; + case OP_GTI: + printf("%d %d %d",a,sb,isk); + break; + case OP_GEI: + printf("%d %d %d",a,sb,isk); + break; + case OP_TEST: + printf("%d %d",a,isk); + break; + case OP_TESTSET: + printf("%d %d %d",a,b,isk); + break; + case OP_CALL: + printf("%d %d %d",a,b,c); + printf(COMMENT); + if (b==0) printf("all in "); else printf("%d in ",b-1); + if (c==0) printf("all out"); else printf("%d out",c-1); + break; + case OP_TAILCALL: + printf("%d %d %d",a,b,c); + printf(COMMENT "%d in",b-1); + break; + case OP_RETURN: + printf("%d %d %d",a,b,c); + printf(COMMENT); + if (b==0) printf("all out"); else printf("%d out",b-1); + break; + case OP_RETURN0: + break; + case OP_RETURN1: + printf("%d",a); + break; + case OP_FORLOOP: + printf("%d %d",a,bx); + printf(COMMENT "to %d",pc-bx+2); + break; + case OP_FORPREP: + printf("%d %d",a,bx); + printf(COMMENT "to %d",pc+bx+2); + break; + case OP_TFORPREP: + printf("%d %d",a,bx); + printf(COMMENT "to %d",pc+bx+2); + break; + case OP_TFORCALL: + printf("%d %d",a,c); + break; + case OP_TFORLOOP: + printf("%d %d",a,bx); + printf(COMMENT "to %d",pc-bx+2); + break; + case OP_SETLIST: + printf("%d %d %d",a,b,c); + if (isk) printf(COMMENT "%d",c+EXTRAARGC); + break; + case OP_CLOSURE: + printf("%d %d",a,bx); + printf(COMMENT "%p",VOID(f->p[bx])); + break; + case OP_VARARG: + printf("%d %d",a,c); + printf(COMMENT); + if (c==0) printf("all out"); else printf("%d out",c-1); + break; + case OP_VARARGPREP: + printf("%d",a); + break; + case OP_EXTRAARG: + printf("%d",ax); + break; +#if 0 + default: + printf("%d %d %d",a,b,c); + printf(COMMENT "not handled"); + break; +#endif + } + printf("\n"); + } +} + + +#define SS(x) ((x==1)?"":"s") +#define S(x) (int)(x),SS(x) + +static void PrintHeader(const Proto* f) +{ + const char* s=f->source ? getstr(f->source) : "=?"; + if (*s=='@' || *s=='=') + s++; + else if (*s==LUA_SIGNATURE[0]) + s="(bstring)"; + else + s="(string)"; + printf("\n%s <%s:%d,%d> (%d instruction%s at %p)\n", + (f->linedefined==0)?"main":"function",s, + f->linedefined,f->lastlinedefined, + S(f->sizecode),VOID(f)); + printf("%d%s param%s, %d slot%s, %d upvalue%s, ", + (int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams), + S(f->maxstacksize),S(f->sizeupvalues)); + printf("%d local%s, %d constant%s, %d function%s\n", + S(f->sizelocvars),S(f->sizek),S(f->sizep)); +} + +static void PrintDebug(const Proto* f) +{ + int i,n; + n=f->sizek; + printf("constants (%d) for %p:\n",n,VOID(f)); + for (i=0; isizelocvars; + printf("locals (%d) for %p:\n",n,VOID(f)); + for (i=0; ilocvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); + } + n=f->sizeupvalues; + printf("upvalues (%d) for %p:\n",n,VOID(f)); + for (i=0; iupvalues[i].instack,f->upvalues[i].idx); + } +} + +static void PrintFunction(const Proto* f, int full) +{ + int i,n=f->sizep; + PrintHeader(f); + PrintCode(f); + if (full) PrintDebug(f); + for (i=0; ip[i],full); +} diff --git a/lua-5.4.0/src/luaconf.h b/lua-5.4.0/src/luaconf.h new file mode 100644 index 0000000..bdf927e --- /dev/null +++ b/lua-5.4.0/src/luaconf.h @@ -0,0 +1,776 @@ +/* +** $Id: luaconf.h $ +** Configuration file for Lua +** See Copyright Notice in lua.h +*/ + + +#ifndef luaconf_h +#define luaconf_h + +#include +#include + + +/* +** =================================================================== +** General Configuration File for Lua +** +** Some definitions here can be changed externally, through the +** compiler (e.g., with '-D' options). Those are protected by +** '#if !defined' guards. However, several other definitions should +** be changed directly here, either because they affect the Lua +** ABI (by making the changes here, you ensure that all software +** connected to Lua, such as C libraries, will be compiled with the +** same configuration); or because they are seldom changed. +** +** Search for "@@" to find all configurable definitions. +** =================================================================== +*/ + + +/* +** {==================================================================== +** System Configuration: macros to adapt (if needed) Lua to some +** particular platform, for instance restricting it to C89. +** ===================================================================== +*/ + +/* +@@ LUAI_MAXCSTACK defines the maximum depth for nested calls and +** also limits the maximum depth of other recursive algorithms in +** the implementation, such as syntactic analysis. A value too +** large may allow the interpreter to crash (C-stack overflow). +** The default value seems ok for regular machines, but may be +** too high for restricted hardware. +** The test file 'cstack.lua' may help finding a good limit. +** (It will crash with a limit too high.) +*/ +#if !defined(LUAI_MAXCSTACK) +#define LUAI_MAXCSTACK 2000 +#endif + + +/* +@@ LUA_USE_C89 controls the use of non-ISO-C89 features. +** Define it if you want Lua to avoid the use of a few C99 features +** or Windows-specific features on Windows. +*/ +/* #define LUA_USE_C89 */ + + +/* +** By default, Lua on Windows use (some) specific Windows features +*/ +#if !defined(LUA_USE_C89) && defined(_WIN32) && !defined(_WIN32_WCE) +#define LUA_USE_WINDOWS /* enable goodies for regular Windows */ +#endif + + +#if defined(LUA_USE_WINDOWS) +#define LUA_DL_DLL /* enable support for DLL */ +#define LUA_USE_C89 /* broadly, Windows is C89 */ +#endif + + +#if defined(LUA_USE_LINUX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* needs an extra library: -ldl */ +#endif + + +#if defined(LUA_USE_MACOSX) +#define LUA_USE_POSIX +#define LUA_USE_DLOPEN /* MacOS does not need -ldl */ +#endif + + +/* +@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits. +*/ +#define LUAI_IS32INT ((UINT_MAX >> 30) >= 3) + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Number types. +** =================================================================== +*/ + +/* +@@ LUA_32BITS enables Lua with 32-bit integers and 32-bit floats. +*/ +/* #define LUA_32BITS */ + + +/* +@@ LUA_C89_NUMBERS ensures that Lua uses the largest types available for +** C89 ('long' and 'double'); Windows always has '__int64', so it does +** not need to use this case. +*/ +#if defined(LUA_USE_C89) && !defined(LUA_USE_WINDOWS) +#define LUA_C89_NUMBERS +#endif + + +/* +@@ LUA_INT_TYPE defines the type for Lua integers. +@@ LUA_FLOAT_TYPE defines the type for Lua floats. +** Lua should work fine with any mix of these options supported +** by your C compiler. The usual configurations are 64-bit integers +** and 'double' (the default), 32-bit integers and 'float' (for +** restricted platforms), and 'long'/'double' (for C compilers not +** compliant with C99, which may not have support for 'long long'). +*/ + +/* predefined options for LUA_INT_TYPE */ +#define LUA_INT_INT 1 +#define LUA_INT_LONG 2 +#define LUA_INT_LONGLONG 3 + +/* predefined options for LUA_FLOAT_TYPE */ +#define LUA_FLOAT_FLOAT 1 +#define LUA_FLOAT_DOUBLE 2 +#define LUA_FLOAT_LONGDOUBLE 3 + +#if defined(LUA_32BITS) /* { */ +/* +** 32-bit integers and 'float' +*/ +#if LUAI_IS32INT /* use 'int' if big enough */ +#define LUA_INT_TYPE LUA_INT_INT +#else /* otherwise use 'long' */ +#define LUA_INT_TYPE LUA_INT_LONG +#endif +#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT + +#elif defined(LUA_C89_NUMBERS) /* }{ */ +/* +** largest types available for C89 ('long' and 'double') +*/ +#define LUA_INT_TYPE LUA_INT_LONG +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE + +#endif /* } */ + + +/* +** default configuration for 64-bit Lua ('long long' and 'double') +*/ +#if !defined(LUA_INT_TYPE) +#define LUA_INT_TYPE LUA_INT_LONGLONG +#endif + +#if !defined(LUA_FLOAT_TYPE) +#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE +#endif + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Paths. +** =================================================================== +*/ + +/* +** LUA_PATH_SEP is the character that separates templates in a path. +** LUA_PATH_MARK is the string that marks the substitution points in a +** template. +** LUA_EXEC_DIR in a Windows path is replaced by the executable's +** directory. +*/ +#define LUA_PATH_SEP ";" +#define LUA_PATH_MARK "?" +#define LUA_EXEC_DIR "!" + + +/* +@@ LUA_PATH_DEFAULT is the default path that Lua uses to look for +** Lua libraries. +@@ LUA_CPATH_DEFAULT is the default path that Lua uses to look for +** C libraries. +** CHANGE them if your machine has a non-conventional directory +** hierarchy or if you want to install your libraries in +** non-conventional directories. +*/ + +#define LUA_VDIR LUA_VERSION_MAJOR "." LUA_VERSION_MINOR +#if defined(_WIN32) /* { */ +/* +** In Windows, any exclamation mark ('!') in the path is replaced by the +** path of the directory of the executable file of the current process. +*/ +#define LUA_LDIR "!\\lua\\" +#define LUA_CDIR "!\\" +#define LUA_SHRDIR "!\\..\\share\\lua\\" LUA_VDIR "\\" + +#if !defined(LUA_PATH_DEFAULT) +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \ + LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \ + ".\\?.lua;" ".\\?\\init.lua" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.dll;" \ + LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \ + LUA_CDIR"loadall.dll;" ".\\?.dll" +#endif + +#else /* }{ */ + +#define LUA_ROOT "/usr/local/" +#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/" +#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/" + +#if !defined(LUA_PATH_DEFAULT) +#define LUA_PATH_DEFAULT \ + LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \ + LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \ + "./?.lua;" "./?/init.lua" +#endif + +#if !defined(LUA_CPATH_DEFAULT) +#define LUA_CPATH_DEFAULT \ + LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so" +#endif + +#endif /* } */ + + +/* +@@ LUA_DIRSEP is the directory separator (for submodules). +** CHANGE it if your machine does not use "/" as the directory separator +** and is not Windows. (On Windows Lua automatically uses "\".) +*/ +#if !defined(LUA_DIRSEP) + +#if defined(_WIN32) +#define LUA_DIRSEP "\\" +#else +#define LUA_DIRSEP "/" +#endif + +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Marks for exported symbols in the C code +** =================================================================== +*/ + +/* +@@ LUA_API is a mark for all core API functions. +@@ LUALIB_API is a mark for all auxiliary library functions. +@@ LUAMOD_API is a mark for all standard library opening functions. +** CHANGE them if you need to define those functions in some special way. +** For instance, if you want to create one Windows DLL with the core and +** the libraries, you may want to use the following definition (define +** LUA_BUILD_AS_DLL to get it). +*/ +#if defined(LUA_BUILD_AS_DLL) /* { */ + +#if defined(LUA_CORE) || defined(LUA_LIB) /* { */ +#define LUA_API __declspec(dllexport) +#else /* }{ */ +#define LUA_API __declspec(dllimport) +#endif /* } */ + +#else /* }{ */ + +#define LUA_API extern + +#endif /* } */ + + +/* +** More often than not the libs go together with the core. +*/ +#define LUALIB_API LUA_API +#define LUAMOD_API LUA_API + + +/* +@@ LUAI_FUNC is a mark for all extern functions that are not to be +** exported to outside modules. +@@ LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables, +** none of which to be exported to outside modules (LUAI_DDEF for +** definitions and LUAI_DDEC for declarations). +** CHANGE them if you need to mark them in some special way. Elf/gcc +** (versions 3.2 and later) mark them as "hidden" to optimize access +** when Lua is compiled as a shared library. Not all elf targets support +** this attribute. Unfortunately, gcc does not offer a way to check +** whether the target offers that support, and those without support +** give a warning about it. To avoid these warnings, change to the +** default definition. +*/ +#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \ + defined(__ELF__) /* { */ +#define LUAI_FUNC __attribute__((visibility("internal"))) extern +#else /* }{ */ +#define LUAI_FUNC extern +#endif /* } */ + +#define LUAI_DDEC(dec) LUAI_FUNC dec +#define LUAI_DDEF /* empty */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Compatibility with previous versions +** =================================================================== +*/ + +/* +@@ LUA_COMPAT_5_3 controls other macros for compatibility with Lua 5.3. +** You can define it to get all options, or change specific options +** to fit your specific needs. +*/ +#if defined(LUA_COMPAT_5_3) /* { */ + +/* +@@ LUA_COMPAT_MATHLIB controls the presence of several deprecated +** functions in the mathematical library. +** (These functions were already officially removed in 5.3; +** nevertheless they are still available here.) +*/ +#define LUA_COMPAT_MATHLIB + +/* +@@ LUA_COMPAT_APIINTCASTS controls the presence of macros for +** manipulating other integer types (lua_pushunsigned, lua_tounsigned, +** luaL_checkint, luaL_checklong, etc.) +** (These macros were also officially removed in 5.3, but they are still +** available here.) +*/ +#define LUA_COMPAT_APIINTCASTS + + +/* +@@ LUA_COMPAT_LT_LE controls the emulation of the '__le' metamethod +** using '__lt'. +*/ +#define LUA_COMPAT_LT_LE + + +/* +@@ The following macros supply trivial compatibility for some +** changes in the API. The macros themselves document how to +** change your code to avoid using them. +** (Once more, these macros were officially removed in 5.3, but they are +** still available here.) +*/ +#define lua_strlen(L,i) lua_rawlen(L, (i)) + +#define lua_objlen(L,i) lua_rawlen(L, (i)) + +#define lua_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ) +#define lua_lessthan(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPLT) + +#endif /* } */ + +/* }================================================================== */ + + + +/* +** {================================================================== +** Configuration for Numbers. +** Change these definitions if no predefined LUA_FLOAT_* / LUA_INT_* +** satisfy your needs. +** =================================================================== +*/ + +/* +@@ LUA_NUMBER is the floating-point type used by Lua. +@@ LUAI_UACNUMBER is the result of a 'default argument promotion' +@@ over a floating number. +@@ l_floatatt(x) corrects float attribute 'x' to the proper float type +** by prefixing it with one of FLT/DBL/LDBL. +@@ LUA_NUMBER_FRMLEN is the length modifier for writing floats. +@@ LUA_NUMBER_FMT is the format for writing floats. +@@ lua_number2str converts a float to a string. +@@ l_mathop allows the addition of an 'l' or 'f' to all math operations. +@@ l_floor takes the floor of a float. +@@ lua_str2number converts a decimal numeral to a number. +*/ + + +/* The following definitions are good for most cases here */ + +#define l_floor(x) (l_mathop(floor)(x)) + +#define lua_number2str(s,sz,n) \ + l_sprintf((s), sz, LUA_NUMBER_FMT, (LUAI_UACNUMBER)(n)) + +/* +@@ lua_numbertointeger converts a float number with an integral value +** to an integer, or returns 0 if float is not within the range of +** a lua_Integer. (The range comparisons are tricky because of +** rounding. The tests here assume a two-complement representation, +** where MININTEGER always has an exact representation as a float; +** MAXINTEGER may not have one, and therefore its conversion to float +** may have an ill-defined value.) +*/ +#define lua_numbertointeger(n,p) \ + ((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \ + (n) < -(LUA_NUMBER)(LUA_MININTEGER) && \ + (*(p) = (LUA_INTEGER)(n), 1)) + + +/* now the variable definitions */ + +#if LUA_FLOAT_TYPE == LUA_FLOAT_FLOAT /* { single float */ + +#define LUA_NUMBER float + +#define l_floatatt(n) (FLT_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.7g" + +#define l_mathop(op) op##f + +#define lua_str2number(s,p) strtof((s), (p)) + + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_LONGDOUBLE /* }{ long double */ + +#define LUA_NUMBER long double + +#define l_floatatt(n) (LDBL_##n) + +#define LUAI_UACNUMBER long double + +#define LUA_NUMBER_FRMLEN "L" +#define LUA_NUMBER_FMT "%.19Lg" + +#define l_mathop(op) op##l + +#define lua_str2number(s,p) strtold((s), (p)) + +#elif LUA_FLOAT_TYPE == LUA_FLOAT_DOUBLE /* }{ double */ + +#define LUA_NUMBER double + +#define l_floatatt(n) (DBL_##n) + +#define LUAI_UACNUMBER double + +#define LUA_NUMBER_FRMLEN "" +#define LUA_NUMBER_FMT "%.14g" + +#define l_mathop(op) op + +#define lua_str2number(s,p) strtod((s), (p)) + +#else /* }{ */ + +#error "numeric float type not defined" + +#endif /* } */ + + + +/* +@@ LUA_INTEGER is the integer type used by Lua. +** +@@ LUA_UNSIGNED is the unsigned version of LUA_INTEGER. +** +@@ LUAI_UACINT is the result of a 'default argument promotion' +@@ over a LUA_INTEGER. +@@ LUA_INTEGER_FRMLEN is the length modifier for reading/writing integers. +@@ LUA_INTEGER_FMT is the format for writing integers. +@@ LUA_MAXINTEGER is the maximum value for a LUA_INTEGER. +@@ LUA_MININTEGER is the minimum value for a LUA_INTEGER. +@@ LUA_MAXUNSIGNED is the maximum value for a LUA_UNSIGNED. +@@ LUA_UNSIGNEDBITS is the number of bits in a LUA_UNSIGNED. +@@ lua_integer2str converts an integer to a string. +*/ + + +/* The following definitions are good for most cases here */ + +#define LUA_INTEGER_FMT "%" LUA_INTEGER_FRMLEN "d" + +#define LUAI_UACINT LUA_INTEGER + +#define lua_integer2str(s,sz,n) \ + l_sprintf((s), sz, LUA_INTEGER_FMT, (LUAI_UACINT)(n)) + +/* +** use LUAI_UACINT here to avoid problems with promotions (which +** can turn a comparison between unsigneds into a signed comparison) +*/ +#define LUA_UNSIGNED unsigned LUAI_UACINT + + +#define LUA_UNSIGNEDBITS (sizeof(LUA_UNSIGNED) * CHAR_BIT) + + +/* now the variable definitions */ + +#if LUA_INT_TYPE == LUA_INT_INT /* { int */ + +#define LUA_INTEGER int +#define LUA_INTEGER_FRMLEN "" + +#define LUA_MAXINTEGER INT_MAX +#define LUA_MININTEGER INT_MIN + +#define LUA_MAXUNSIGNED UINT_MAX + +#elif LUA_INT_TYPE == LUA_INT_LONG /* }{ long */ + +#define LUA_INTEGER long +#define LUA_INTEGER_FRMLEN "l" + +#define LUA_MAXINTEGER LONG_MAX +#define LUA_MININTEGER LONG_MIN + +#define LUA_MAXUNSIGNED ULONG_MAX + +#elif LUA_INT_TYPE == LUA_INT_LONGLONG /* }{ long long */ + +/* use presence of macro LLONG_MAX as proxy for C99 compliance */ +#if defined(LLONG_MAX) /* { */ +/* use ISO C99 stuff */ + +#define LUA_INTEGER long long +#define LUA_INTEGER_FRMLEN "ll" + +#define LUA_MAXINTEGER LLONG_MAX +#define LUA_MININTEGER LLONG_MIN + +#define LUA_MAXUNSIGNED ULLONG_MAX + +#elif defined(LUA_USE_WINDOWS) /* }{ */ +/* in Windows, can use specific Windows types */ + +#define LUA_INTEGER __int64 +#define LUA_INTEGER_FRMLEN "I64" + +#define LUA_MAXINTEGER _I64_MAX +#define LUA_MININTEGER _I64_MIN + +#define LUA_MAXUNSIGNED _UI64_MAX + +#else /* }{ */ + +#error "Compiler does not support 'long long'. Use option '-DLUA_32BITS' \ + or '-DLUA_C89_NUMBERS' (see file 'luaconf.h' for details)" + +#endif /* } */ + +#else /* }{ */ + +#error "numeric integer type not defined" + +#endif /* } */ + +/* }================================================================== */ + + +/* +** {================================================================== +** Dependencies with C99 and other C details +** =================================================================== +*/ + +/* +@@ l_sprintf is equivalent to 'snprintf' or 'sprintf' in C89. +** (All uses in Lua have only one format item.) +*/ +#if !defined(LUA_USE_C89) +#define l_sprintf(s,sz,f,i) snprintf(s,sz,f,i) +#else +#define l_sprintf(s,sz,f,i) ((void)(sz), sprintf(s,f,i)) +#endif + + +/* +@@ lua_strx2number converts a hexadecimal numeral to a number. +** In C99, 'strtod' does that conversion. Otherwise, you can +** leave 'lua_strx2number' undefined and Lua will provide its own +** implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_strx2number(s,p) lua_str2number(s,p) +#endif + + +/* +@@ lua_pointer2str converts a pointer to a readable string in a +** non-specified way. +*/ +#define lua_pointer2str(buff,sz,p) l_sprintf(buff,sz,"%p",p) + + +/* +@@ lua_number2strx converts a float to a hexadecimal numeral. +** In C99, 'sprintf' (with format specifiers '%a'/'%A') does that. +** Otherwise, you can leave 'lua_number2strx' undefined and Lua will +** provide its own implementation. +*/ +#if !defined(LUA_USE_C89) +#define lua_number2strx(L,b,sz,f,n) \ + ((void)L, l_sprintf(b,sz,f,(LUAI_UACNUMBER)(n))) +#endif + + +/* +** 'strtof' and 'opf' variants for math functions are not valid in +** C89. Otherwise, the macro 'HUGE_VALF' is a good proxy for testing the +** availability of these variants. ('math.h' is already included in +** all files that use these macros.) +*/ +#if defined(LUA_USE_C89) || (defined(HUGE_VAL) && !defined(HUGE_VALF)) +#undef l_mathop /* variants not available */ +#undef lua_str2number +#define l_mathop(op) (lua_Number)op /* no variant */ +#define lua_str2number(s,p) ((lua_Number)strtod((s), (p))) +#endif + + +/* +@@ LUA_KCONTEXT is the type of the context ('ctx') for continuation +** functions. It must be a numerical type; Lua will use 'intptr_t' if +** available, otherwise it will use 'ptrdiff_t' (the nearest thing to +** 'intptr_t' in C89) +*/ +#define LUA_KCONTEXT ptrdiff_t + +#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \ + __STDC_VERSION__ >= 199901L +#include +#if defined(INTPTR_MAX) /* even in C99 this type is optional */ +#undef LUA_KCONTEXT +#define LUA_KCONTEXT intptr_t +#endif +#endif + + +/* +@@ lua_getlocaledecpoint gets the locale "radix character" (decimal point). +** Change that if you do not want to use C locales. (Code using this +** macro must include the header 'locale.h'.) +*/ +#if !defined(lua_getlocaledecpoint) +#define lua_getlocaledecpoint() (localeconv()->decimal_point[0]) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Language Variations +** ===================================================================== +*/ + +/* +@@ LUA_NOCVTN2S/LUA_NOCVTS2N control how Lua performs some +** coercions. Define LUA_NOCVTN2S to turn off automatic coercion from +** numbers to strings. Define LUA_NOCVTS2N to turn off automatic +** coercion from strings to numbers. +*/ +/* #define LUA_NOCVTN2S */ +/* #define LUA_NOCVTS2N */ + + +/* +@@ LUA_USE_APICHECK turns on several consistency checks on the C API. +** Define it as a help when debugging C code. +*/ +#if defined(LUA_USE_APICHECK) +#include +#define luai_apicheck(l,e) assert(e) +#endif + +/* }================================================================== */ + + +/* +** {================================================================== +** Macros that affect the API and must be stable (that is, must be the +** same when you compile Lua and when you compile code that links to +** Lua). +** ===================================================================== +*/ + +/* +@@ LUAI_MAXSTACK limits the size of the Lua stack. +** CHANGE it if you need a different limit. This limit is arbitrary; +** its only purpose is to stop Lua from consuming unlimited stack +** space (and to reserve some numbers for pseudo-indices). +** (It must fit into max(size_t)/32.) +*/ +#if LUAI_IS32INT +#define LUAI_MAXSTACK 1000000 +#else +#define LUAI_MAXSTACK 15000 +#endif + + +/* +@@ LUA_EXTRASPACE defines the size of a raw memory area associated with +** a Lua state with very fast access. +** CHANGE it if you need a different size. +*/ +#define LUA_EXTRASPACE (sizeof(void *)) + + +/* +@@ LUA_IDSIZE gives the maximum size for the description of the source +@@ of a function in debug information. +** CHANGE it if you want a different size. +*/ +#define LUA_IDSIZE 60 + + +/* +@@ LUAL_BUFFERSIZE is the buffer size used by the lauxlib buffer system. +*/ +#define LUAL_BUFFERSIZE ((int)(16 * sizeof(void*) * sizeof(lua_Number))) + + +/* +@@ LUAI_MAXALIGN defines fields that, when used in a union, ensure +** maximum alignment for the other items in that union. +*/ +#define LUAI_MAXALIGN lua_Number n; double u; void *s; lua_Integer i; long l + +/* }================================================================== */ + + + + + +/* =================================================================== */ + +/* +** Local configuration. You can use this space to add your redefinitions +** without modifying the main part of the file. +*/ + + + + + +#endif + diff --git a/lua-5.4.0/src/lualib.h b/lua-5.4.0/src/lualib.h new file mode 100644 index 0000000..eb08b53 --- /dev/null +++ b/lua-5.4.0/src/lualib.h @@ -0,0 +1,58 @@ +/* +** $Id: lualib.h $ +** Lua standard libraries +** See Copyright Notice in lua.h +*/ + + +#ifndef lualib_h +#define lualib_h + +#include "lua.h" + + +/* version suffix for environment variable names */ +#define LUA_VERSUFFIX "_" LUA_VERSION_MAJOR "_" LUA_VERSION_MINOR + + +LUAMOD_API int (luaopen_base) (lua_State *L); + +#define LUA_COLIBNAME "coroutine" +LUAMOD_API int (luaopen_coroutine) (lua_State *L); + +#define LUA_TABLIBNAME "table" +LUAMOD_API int (luaopen_table) (lua_State *L); + +#define LUA_IOLIBNAME "io" +LUAMOD_API int (luaopen_io) (lua_State *L); + +#define LUA_OSLIBNAME "os" +LUAMOD_API int (luaopen_os) (lua_State *L); + +#define LUA_STRLIBNAME "string" +LUAMOD_API int (luaopen_string) (lua_State *L); + +#define LUA_UTF8LIBNAME "utf8" +LUAMOD_API int (luaopen_utf8) (lua_State *L); + +#define LUA_MATHLIBNAME "math" +LUAMOD_API int (luaopen_math) (lua_State *L); + +#define LUA_DBLIBNAME "debug" +LUAMOD_API int (luaopen_debug) (lua_State *L); + +#define LUA_LOADLIBNAME "package" +LUAMOD_API int (luaopen_package) (lua_State *L); + + +/* open all previous libraries */ +LUALIB_API void (luaL_openlibs) (lua_State *L); + + + +#if !defined(lua_assert) +#define lua_assert(x) ((void)0) +#endif + + +#endif diff --git a/lua-5.4.0/src/lundump.c b/lua-5.4.0/src/lundump.c new file mode 100644 index 0000000..4243678 --- /dev/null +++ b/lua-5.4.0/src/lundump.c @@ -0,0 +1,323 @@ +/* +** $Id: lundump.c $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#define lundump_c +#define LUA_CORE + +#include "lprefix.h" + + +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lmem.h" +#include "lobject.h" +#include "lstring.h" +#include "lundump.h" +#include "lzio.h" + + +#if !defined(luai_verifycode) +#define luai_verifycode(L,f) /* empty */ +#endif + + +typedef struct { + lua_State *L; + ZIO *Z; + const char *name; +} LoadState; + + +static l_noret error (LoadState *S, const char *why) { + luaO_pushfstring(S->L, "%s: bad binary format (%s)", S->name, why); + luaD_throw(S->L, LUA_ERRSYNTAX); +} + + +/* +** All high-level loads go through loadVector; you can change it to +** adapt to the endianness of the input +*/ +#define loadVector(S,b,n) loadBlock(S,b,(n)*sizeof((b)[0])) + +static void loadBlock (LoadState *S, void *b, size_t size) { + if (luaZ_read(S->Z, b, size) != 0) + error(S, "truncated chunk"); +} + + +#define loadVar(S,x) loadVector(S,&x,1) + + +static lu_byte loadByte (LoadState *S) { + int b = zgetc(S->Z); + if (b == EOZ) + error(S, "truncated chunk"); + return cast_byte(b); +} + + +static size_t loadUnsigned (LoadState *S, size_t limit) { + size_t x = 0; + int b; + limit >>= 7; + do { + b = loadByte(S); + if (x >= limit) + error(S, "integer overflow"); + x = (x << 7) | (b & 0x7f); + } while ((b & 0x80) == 0); + return x; +} + + +static size_t loadSize (LoadState *S) { + return loadUnsigned(S, ~(size_t)0); +} + + +static int loadInt (LoadState *S) { + return cast_int(loadUnsigned(S, INT_MAX)); +} + + +static lua_Number loadNumber (LoadState *S) { + lua_Number x; + loadVar(S, x); + return x; +} + + +static lua_Integer loadInteger (LoadState *S) { + lua_Integer x; + loadVar(S, x); + return x; +} + + +/* +** Load a nullable string into prototype 'p'. +*/ +static TString *loadStringN (LoadState *S, Proto *p) { + lua_State *L = S->L; + TString *ts; + size_t size = loadSize(S); + if (size == 0) /* no string? */ + return NULL; + else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ + char buff[LUAI_MAXSHORTLEN]; + loadVector(S, buff, size); /* load string into buffer */ + ts = luaS_newlstr(L, buff, size); /* create string */ + } + else { /* long string */ + ts = luaS_createlngstrobj(L, size); /* create string */ + loadVector(S, getstr(ts), size); /* load directly in final place */ + } + luaC_objbarrier(L, p, ts); + return ts; +} + + +/* +** Load a non-nullable string into prototype 'p'. +*/ +static TString *loadString (LoadState *S, Proto *p) { + TString *st = loadStringN(S, p); + if (st == NULL) + error(S, "bad format for constant string"); + return st; +} + + +static void loadCode (LoadState *S, Proto *f) { + int n = loadInt(S); + f->code = luaM_newvectorchecked(S->L, n, Instruction); + f->sizecode = n; + loadVector(S, f->code, n); +} + + +static void loadFunction(LoadState *S, Proto *f, TString *psource); + + +static void loadConstants (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + f->k = luaM_newvectorchecked(S->L, n, TValue); + f->sizek = n; + for (i = 0; i < n; i++) + setnilvalue(&f->k[i]); + for (i = 0; i < n; i++) { + TValue *o = &f->k[i]; + int t = loadByte(S); + switch (t) { + case LUA_VNIL: + setnilvalue(o); + break; + case LUA_VFALSE: + setbfvalue(o); + break; + case LUA_VTRUE: + setbtvalue(o); + break; + case LUA_VNUMFLT: + setfltvalue(o, loadNumber(S)); + break; + case LUA_VNUMINT: + setivalue(o, loadInteger(S)); + break; + case LUA_VSHRSTR: + case LUA_VLNGSTR: + setsvalue2n(S->L, o, loadString(S, f)); + break; + default: lua_assert(0); + } + } +} + + +static void loadProtos (LoadState *S, Proto *f) { + int i; + int n = loadInt(S); + f->p = luaM_newvectorchecked(S->L, n, Proto *); + f->sizep = n; + for (i = 0; i < n; i++) + f->p[i] = NULL; + for (i = 0; i < n; i++) { + f->p[i] = luaF_newproto(S->L); + luaC_objbarrier(S->L, f, f->p[i]); + loadFunction(S, f->p[i], f->source); + } +} + + +static void loadUpvalues (LoadState *S, Proto *f) { + int i, n; + n = loadInt(S); + f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); + f->sizeupvalues = n; + for (i = 0; i < n; i++) { + f->upvalues[i].name = NULL; + f->upvalues[i].instack = loadByte(S); + f->upvalues[i].idx = loadByte(S); + f->upvalues[i].kind = loadByte(S); + } +} + + +static void loadDebug (LoadState *S, Proto *f) { + int i, n; + n = loadInt(S); + f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); + f->sizelineinfo = n; + loadVector(S, f->lineinfo, n); + n = loadInt(S); + f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); + f->sizeabslineinfo = n; + for (i = 0; i < n; i++) { + f->abslineinfo[i].pc = loadInt(S); + f->abslineinfo[i].line = loadInt(S); + } + n = loadInt(S); + f->locvars = luaM_newvectorchecked(S->L, n, LocVar); + f->sizelocvars = n; + for (i = 0; i < n; i++) + f->locvars[i].varname = NULL; + for (i = 0; i < n; i++) { + f->locvars[i].varname = loadStringN(S, f); + f->locvars[i].startpc = loadInt(S); + f->locvars[i].endpc = loadInt(S); + } + n = loadInt(S); + for (i = 0; i < n; i++) + f->upvalues[i].name = loadStringN(S, f); +} + + +static void loadFunction (LoadState *S, Proto *f, TString *psource) { + f->source = loadStringN(S, f); + if (f->source == NULL) /* no source in dump? */ + f->source = psource; /* reuse parent's source */ + f->linedefined = loadInt(S); + f->lastlinedefined = loadInt(S); + f->numparams = loadByte(S); + f->is_vararg = loadByte(S); + f->maxstacksize = loadByte(S); + loadCode(S, f); + loadConstants(S, f); + loadUpvalues(S, f); + loadProtos(S, f); + loadDebug(S, f); +} + + +static void checkliteral (LoadState *S, const char *s, const char *msg) { + char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ + size_t len = strlen(s); + loadVector(S, buff, len); + if (memcmp(s, buff, len) != 0) + error(S, msg); +} + + +static void fchecksize (LoadState *S, size_t size, const char *tname) { + if (loadByte(S) != size) + error(S, luaO_pushfstring(S->L, "%s size mismatch", tname)); +} + + +#define checksize(S,t) fchecksize(S,sizeof(t),#t) + +static void checkHeader (LoadState *S) { + /* skip 1st char (already read and checked) */ + checkliteral(S, &LUA_SIGNATURE[1], "not a binary chunk"); + if (loadByte(S) != LUAC_VERSION) + error(S, "version mismatch"); + if (loadByte(S) != LUAC_FORMAT) + error(S, "format mismatch"); + checkliteral(S, LUAC_DATA, "corrupted chunk"); + checksize(S, Instruction); + checksize(S, lua_Integer); + checksize(S, lua_Number); + if (loadInteger(S) != LUAC_INT) + error(S, "integer format mismatch"); + if (loadNumber(S) != LUAC_NUM) + error(S, "float format mismatch"); +} + + +/* +** Load precompiled chunk. +*/ +LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { + LoadState S; + LClosure *cl; + if (*name == '@' || *name == '=') + S.name = name + 1; + else if (*name == LUA_SIGNATURE[0]) + S.name = "binary string"; + else + S.name = name; + S.L = L; + S.Z = Z; + checkHeader(&S); + cl = luaF_newLclosure(L, loadByte(&S)); + setclLvalue2s(L, L->top, cl); + luaD_inctop(L); + cl->p = luaF_newproto(L); + luaC_objbarrier(L, cl, cl->p); + loadFunction(&S, cl->p, NULL); + lua_assert(cl->nupvalues == cl->p->sizeupvalues); + luai_verifycode(L, cl->p); + return cl; +} + diff --git a/lua-5.4.0/src/lundump.h b/lua-5.4.0/src/lundump.h new file mode 100644 index 0000000..f3748a9 --- /dev/null +++ b/lua-5.4.0/src/lundump.h @@ -0,0 +1,36 @@ +/* +** $Id: lundump.h $ +** load precompiled Lua chunks +** See Copyright Notice in lua.h +*/ + +#ifndef lundump_h +#define lundump_h + +#include "llimits.h" +#include "lobject.h" +#include "lzio.h" + + +/* data to catch conversion errors */ +#define LUAC_DATA "\x19\x93\r\n\x1a\n" + +#define LUAC_INT 0x5678 +#define LUAC_NUM cast_num(370.5) + +/* +** Encode major-minor version in one byte, one nibble for each +*/ +#define MYINT(s) (s[0]-'0') /* assume one-digit numerals */ +#define LUAC_VERSION (MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR)) + +#define LUAC_FORMAT 0 /* this is the official format */ + +/* load one chunk; from lundump.c */ +LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name); + +/* dump one chunk; from ldump.c */ +LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, + void* data, int strip); + +#endif diff --git a/lua-5.4.0/src/lutf8lib.c b/lua-5.4.0/src/lutf8lib.c new file mode 100644 index 0000000..901d985 --- /dev/null +++ b/lua-5.4.0/src/lutf8lib.c @@ -0,0 +1,289 @@ +/* +** $Id: lutf8lib.c $ +** Standard library for UTF-8 manipulation +** See Copyright Notice in lua.h +*/ + +#define lutf8lib_c +#define LUA_LIB + +#include "lprefix.h" + + +#include +#include +#include +#include + +#include "lua.h" + +#include "lauxlib.h" +#include "lualib.h" + + +#define MAXUNICODE 0x10FFFFu + +#define MAXUTF 0x7FFFFFFFu + +/* +** Integer type for decoded UTF-8 values; MAXUTF needs 31 bits. +*/ +#if (UINT_MAX >> 30) >= 1 +typedef unsigned int utfint; +#else +typedef unsigned long utfint; +#endif + + +#define iscont(p) ((*(p) & 0xC0) == 0x80) + + +/* from strlib */ +/* translate a relative string position: negative means back from end */ +static lua_Integer u_posrelat (lua_Integer pos, size_t len) { + if (pos >= 0) return pos; + else if (0u - (size_t)pos > len) return 0; + else return (lua_Integer)len + pos + 1; +} + + +/* +** Decode one UTF-8 sequence, returning NULL if byte sequence is +** invalid. The array 'limits' stores the minimum value for each +** sequence length, to check for overlong representations. Its first +** entry forces an error for non-ascii bytes with no continuation +** bytes (count == 0). +*/ +static const char *utf8_decode (const char *s, utfint *val, int strict) { + static const utfint limits[] = + {~(utfint)0, 0x80, 0x800, 0x10000u, 0x200000u, 0x4000000u}; + unsigned int c = (unsigned char)s[0]; + utfint res = 0; /* final result */ + if (c < 0x80) /* ascii? */ + res = c; + else { + int count = 0; /* to count number of continuation bytes */ + for (; c & 0x40; c <<= 1) { /* while it needs continuation bytes... */ + unsigned int cc = (unsigned char)s[++count]; /* read next byte */ + if ((cc & 0xC0) != 0x80) /* not a continuation byte? */ + return NULL; /* invalid byte sequence */ + res = (res << 6) | (cc & 0x3F); /* add lower 6 bits from cont. byte */ + } + res |= ((utfint)(c & 0x7F) << (count * 5)); /* add first byte */ + if (count > 5 || res > MAXUTF || res < limits[count]) + return NULL; /* invalid byte sequence */ + s += count; /* skip continuation bytes read */ + } + if (strict) { + /* check for invalid code points; too large or surrogates */ + if (res > MAXUNICODE || (0xD800u <= res && res <= 0xDFFFu)) + return NULL; + } + if (val) *val = res; + return s + 1; /* +1 to include first byte */ +} + + +/* +** utf8len(s [, i [, j [, lax]]]) --> number of characters that +** start in the range [i,j], or nil + current position if 's' is not +** well formed in that interval +*/ +static int utflen (lua_State *L) { + lua_Integer n = 0; /* counter for the number of characters */ + size_t len; /* string length in bytes */ + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer posj = u_posrelat(luaL_optinteger(L, 3, -1), len); + int lax = lua_toboolean(L, 4); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 2, + "initial position out of bounds"); + luaL_argcheck(L, --posj < (lua_Integer)len, 3, + "final position out of bounds"); + while (posi <= posj) { + const char *s1 = utf8_decode(s + posi, NULL, !lax); + if (s1 == NULL) { /* conversion error? */ + luaL_pushfail(L); /* return fail ... */ + lua_pushinteger(L, posi + 1); /* ... and current position */ + return 2; + } + posi = s1 - s; + n++; + } + lua_pushinteger(L, n); + return 1; +} + + +/* +** codepoint(s, [i, [j [, lax]]]) -> returns codepoints for all +** characters that start in the range [i,j] +*/ +static int codepoint (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer posi = u_posrelat(luaL_optinteger(L, 2, 1), len); + lua_Integer pose = u_posrelat(luaL_optinteger(L, 3, posi), len); + int lax = lua_toboolean(L, 4); + int n; + const char *se; + luaL_argcheck(L, posi >= 1, 2, "out of bounds"); + luaL_argcheck(L, pose <= (lua_Integer)len, 3, "out of bounds"); + if (posi > pose) return 0; /* empty interval; return no values */ + if (pose - posi >= INT_MAX) /* (lua_Integer -> int) overflow? */ + return luaL_error(L, "string slice too long"); + n = (int)(pose - posi) + 1; /* upper bound for number of returns */ + luaL_checkstack(L, n, "string slice too long"); + n = 0; /* count the number of returns */ + se = s + pose; /* string end */ + for (s += posi - 1; s < se;) { + utfint code; + s = utf8_decode(s, &code, !lax); + if (s == NULL) + return luaL_error(L, "invalid UTF-8 code"); + lua_pushinteger(L, code); + n++; + } + return n; +} + + +static void pushutfchar (lua_State *L, int arg) { + lua_Unsigned code = (lua_Unsigned)luaL_checkinteger(L, arg); + luaL_argcheck(L, code <= MAXUTF, arg, "value out of range"); + lua_pushfstring(L, "%U", (long)code); +} + + +/* +** utfchar(n1, n2, ...) -> char(n1)..char(n2)... +*/ +static int utfchar (lua_State *L) { + int n = lua_gettop(L); /* number of arguments */ + if (n == 1) /* optimize common case of single char */ + pushutfchar(L, 1); + else { + int i; + luaL_Buffer b; + luaL_buffinit(L, &b); + for (i = 1; i <= n; i++) { + pushutfchar(L, i); + luaL_addvalue(&b); + } + luaL_pushresult(&b); + } + return 1; +} + + +/* +** offset(s, n, [i]) -> index where n-th character counting from +** position 'i' starts; 0 means character at 'i'. +*/ +static int byteoffset (lua_State *L) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer n = luaL_checkinteger(L, 2); + lua_Integer posi = (n >= 0) ? 1 : len + 1; + posi = u_posrelat(luaL_optinteger(L, 3, posi), len); + luaL_argcheck(L, 1 <= posi && --posi <= (lua_Integer)len, 3, + "position out of bounds"); + if (n == 0) { + /* find beginning of current byte sequence */ + while (posi > 0 && iscont(s + posi)) posi--; + } + else { + if (iscont(s + posi)) + return luaL_error(L, "initial position is a continuation byte"); + if (n < 0) { + while (n < 0 && posi > 0) { /* move back */ + do { /* find beginning of previous character */ + posi--; + } while (posi > 0 && iscont(s + posi)); + n++; + } + } + else { + n--; /* do not move for 1st character */ + while (n > 0 && posi < (lua_Integer)len) { + do { /* find beginning of next character */ + posi++; + } while (iscont(s + posi)); /* (cannot pass final '\0') */ + n--; + } + } + } + if (n == 0) /* did it find given character? */ + lua_pushinteger(L, posi + 1); + else /* no such character */ + luaL_pushfail(L); + return 1; +} + + +static int iter_aux (lua_State *L, int strict) { + size_t len; + const char *s = luaL_checklstring(L, 1, &len); + lua_Integer n = lua_tointeger(L, 2) - 1; + if (n < 0) /* first iteration? */ + n = 0; /* start from here */ + else if (n < (lua_Integer)len) { + n++; /* skip current byte */ + while (iscont(s + n)) n++; /* and its continuations */ + } + if (n >= (lua_Integer)len) + return 0; /* no more codepoints */ + else { + utfint code; + const char *next = utf8_decode(s + n, &code, strict); + if (next == NULL) + return luaL_error(L, "invalid UTF-8 code"); + lua_pushinteger(L, n + 1); + lua_pushinteger(L, code); + return 2; + } +} + + +static int iter_auxstrict (lua_State *L) { + return iter_aux(L, 1); +} + +static int iter_auxlax (lua_State *L) { + return iter_aux(L, 0); +} + + +static int iter_codes (lua_State *L) { + int lax = lua_toboolean(L, 2); + luaL_checkstring(L, 1); + lua_pushcfunction(L, lax ? iter_auxlax : iter_auxstrict); + lua_pushvalue(L, 1); + lua_pushinteger(L, 0); + return 3; +} + + +/* pattern to match a single UTF-8 character */ +#define UTF8PATT "[\0-\x7F\xC2-\xFD][\x80-\xBF]*" + + +static const luaL_Reg funcs[] = { + {"offset", byteoffset}, + {"codepoint", codepoint}, + {"char", utfchar}, + {"len", utflen}, + {"codes", iter_codes}, + /* placeholders */ + {"charpattern", NULL}, + {NULL, NULL} +}; + + +LUAMOD_API int luaopen_utf8 (lua_State *L) { + luaL_newlib(L, funcs); + lua_pushlstring(L, UTF8PATT, sizeof(UTF8PATT)/sizeof(char) - 1); + lua_setfield(L, -2, "charpattern"); + return 1; +} + diff --git a/lua-5.4.0/src/lvm.c b/lua-5.4.0/src/lvm.c new file mode 100644 index 0000000..e7781db --- /dev/null +++ b/lua-5.4.0/src/lvm.c @@ -0,0 +1,1812 @@ +/* +** $Id: lvm.c $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#define lvm_c +#define LUA_CORE + +#include "lprefix.h" + +#include +#include +#include +#include +#include +#include + +#include "lua.h" + +#include "ldebug.h" +#include "ldo.h" +#include "lfunc.h" +#include "lgc.h" +#include "lobject.h" +#include "lopcodes.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" +#include "lvm.h" + + +/* +** By default, use jump tables in the main interpreter loop on gcc +** and compatible compilers. +*/ +#if !defined(LUA_USE_JUMPTABLE) +#if defined(__GNUC__) +#define LUA_USE_JUMPTABLE 1 +#else +#define LUA_USE_JUMPTABLE 0 +#endif +#endif + + + +/* limit for table tag-method chains (to avoid infinite loops) */ +#define MAXTAGLOOP 2000 + + +/* +** 'l_intfitsf' checks whether a given integer is in the range that +** can be converted to a float without rounding. Used in comparisons. +*/ + +/* number of bits in the mantissa of a float */ +#define NBM (l_floatatt(MANT_DIG)) + +/* +** Check whether some integers may not fit in a float, testing whether +** (maxinteger >> NBM) > 0. (That implies (1 << NBM) <= maxinteger.) +** (The shifts are done in parts, to avoid shifting by more than the size +** of an integer. In a worst case, NBM == 113 for long double and +** sizeof(long) == 32.) +*/ +#if ((((LUA_MAXINTEGER >> (NBM / 4)) >> (NBM / 4)) >> (NBM / 4)) \ + >> (NBM - (3 * (NBM / 4)))) > 0 + +/* limit for integers that fit in a float */ +#define MAXINTFITSF ((lua_Unsigned)1 << NBM) + +/* check whether 'i' is in the interval [-MAXINTFITSF, MAXINTFITSF] */ +#define l_intfitsf(i) ((MAXINTFITSF + l_castS2U(i)) <= (2 * MAXINTFITSF)) + +#else /* all integers fit in a float precisely */ + +#define l_intfitsf(i) 1 + +#endif + + +/* +** Try to convert a value from string to a number value. +** If the value is not a string or is a string not representing +** a valid numeral (or if coercions from strings to numbers +** are disabled via macro 'cvt2num'), do not modify 'result' +** and return 0. +*/ +static int l_strton (const TValue *obj, TValue *result) { + lua_assert(obj != result); + if (!cvt2num(obj)) /* is object not a string? */ + return 0; + else + return (luaO_str2num(svalue(obj), result) == vslen(obj) + 1); +} + + +/* +** Try to convert a value to a float. The float case is already handled +** by the macro 'tonumber'. +*/ +int luaV_tonumber_ (const TValue *obj, lua_Number *n) { + TValue v; + if (ttisinteger(obj)) { + *n = cast_num(ivalue(obj)); + return 1; + } + else if (l_strton(obj, &v)) { /* string coercible to number? */ + *n = nvalue(&v); /* convert result of 'luaO_str2num' to a float */ + return 1; + } + else + return 0; /* conversion failed */ +} + + +/* +** try to convert a float to an integer, rounding according to 'mode'. +*/ +int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode) { + lua_Number f = l_floor(n); + if (n != f) { /* not an integral value? */ + if (mode == F2Ieq) return 0; /* fails if mode demands integral value */ + else if (mode == F2Iceil) /* needs ceil? */ + f += 1; /* convert floor to ceil (remember: n != f) */ + } + return lua_numbertointeger(f, p); +} + + +/* +** try to convert a value to an integer, rounding according to 'mode', +** without string coercion. +** ("Fast track" handled by macro 'tointegerns'.) +*/ +int luaV_tointegerns (const TValue *obj, lua_Integer *p, F2Imod mode) { + if (ttisfloat(obj)) + return luaV_flttointeger(fltvalue(obj), p, mode); + else if (ttisinteger(obj)) { + *p = ivalue(obj); + return 1; + } + else + return 0; +} + + +/* +** try to convert a value to an integer. +*/ +int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode) { + TValue v; + if (l_strton(obj, &v)) /* does 'obj' point to a numerical string? */ + obj = &v; /* change it to point to its corresponding number */ + return luaV_tointegerns(obj, p, mode); +} + + +/* +** Try to convert a 'for' limit to an integer, preserving the semantics +** of the loop. Return true if the loop must not run; otherwise, '*p' +** gets the integer limit. +** (The following explanation assumes a positive step; it is valid for +** negative steps mutatis mutandis.) +** If the limit is an integer or can be converted to an integer, +** rounding down, that is the limit. +** Otherwise, check whether the limit can be converted to a float. If +** the float is too large, clip it to LUA_MAXINTEGER. If the float +** is too negative, the loop should not run, because any initial +** integer value is greater than such limit; so, the function returns +** true to signal that. (For this latter case, no integer limit would be +** correct; even a limit of LUA_MININTEGER would run the loop once for +** an initial value equal to LUA_MININTEGER.) +*/ +static int forlimit (lua_State *L, lua_Integer init, const TValue *lim, + lua_Integer *p, lua_Integer step) { + if (!luaV_tointeger(lim, p, (step < 0 ? F2Iceil : F2Ifloor))) { + /* not coercible to in integer */ + lua_Number flim; /* try to convert to float */ + if (!tonumber(lim, &flim)) /* cannot convert to float? */ + luaG_forerror(L, lim, "limit"); + /* else 'flim' is a float out of integer bounds */ + if (luai_numlt(0, flim)) { /* if it is positive, it is too large */ + if (step < 0) return 1; /* initial value must be less than it */ + *p = LUA_MAXINTEGER; /* truncate */ + } + else { /* it is less than min integer */ + if (step > 0) return 1; /* initial value must be greater than it */ + *p = LUA_MININTEGER; /* truncate */ + } + } + return (step > 0 ? init > *p : init < *p); /* not to run? */ +} + + +/* +** Prepare a numerical for loop (opcode OP_FORPREP). +** Return true to skip the loop. Otherwise, +** after preparation, stack will be as follows: +** ra : internal index (safe copy of the control variable) +** ra + 1 : loop counter (integer loops) or limit (float loops) +** ra + 2 : step +** ra + 3 : control variable +*/ +static int forprep (lua_State *L, StkId ra) { + TValue *pinit = s2v(ra); + TValue *plimit = s2v(ra + 1); + TValue *pstep = s2v(ra + 2); + if (ttisinteger(pinit) && ttisinteger(pstep)) { /* integer loop? */ + lua_Integer init = ivalue(pinit); + lua_Integer step = ivalue(pstep); + lua_Integer limit; + if (step == 0) + luaG_runerror(L, "'for' step is zero"); + setivalue(s2v(ra + 3), init); /* control variable */ + if (forlimit(L, init, plimit, &limit, step)) + return 1; /* skip the loop */ + else { /* prepare loop counter */ + lua_Unsigned count; + if (step > 0) { /* ascending loop? */ + count = l_castS2U(limit) - l_castS2U(init); + if (step != 1) /* avoid division in the too common case */ + count /= l_castS2U(step); + } + else { /* step < 0; descending loop */ + count = l_castS2U(init) - l_castS2U(limit); + /* 'step+1' avoids negating 'mininteger' */ + count /= l_castS2U(-(step + 1)) + 1u; + } + /* store the counter in place of the limit (which won't be + needed anymore */ + setivalue(plimit, l_castU2S(count)); + } + } + else { /* try making all values floats */ + lua_Number init; lua_Number limit; lua_Number step; + if (unlikely(!tonumber(plimit, &limit))) + luaG_forerror(L, plimit, "limit"); + if (unlikely(!tonumber(pstep, &step))) + luaG_forerror(L, pstep, "step"); + if (unlikely(!tonumber(pinit, &init))) + luaG_forerror(L, pinit, "initial value"); + if (step == 0) + luaG_runerror(L, "'for' step is zero"); + if (luai_numlt(0, step) ? luai_numlt(limit, init) + : luai_numlt(init, limit)) + return 1; /* skip the loop */ + else { + /* make sure internal values are all floats */ + setfltvalue(plimit, limit); + setfltvalue(pstep, step); + setfltvalue(s2v(ra), init); /* internal index */ + setfltvalue(s2v(ra + 3), init); /* control variable */ + } + } + return 0; +} + + +/* +** Execute a step of a float numerical for loop, returning +** true iff the loop must continue. (The integer case is +** written online with opcode OP_FORLOOP, for performance.) +*/ +static int floatforloop (StkId ra) { + lua_Number step = fltvalue(s2v(ra + 2)); + lua_Number limit = fltvalue(s2v(ra + 1)); + lua_Number idx = fltvalue(s2v(ra)); /* internal index */ + idx = luai_numadd(L, idx, step); /* increment index */ + if (luai_numlt(0, step) ? luai_numle(idx, limit) + : luai_numle(limit, idx)) { + chgfltvalue(s2v(ra), idx); /* update internal index */ + setfltvalue(s2v(ra + 3), idx); /* and control variable */ + return 1; /* jump back */ + } + else + return 0; /* finish the loop */ +} + + +/* +** Finish the table access 'val = t[key]'. +** if 'slot' is NULL, 't' is not a table; otherwise, 'slot' points to +** t[k] entry (which must be empty). +*/ +void luaV_finishget (lua_State *L, const TValue *t, TValue *key, StkId val, + const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + const TValue *tm; /* metamethod */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + if (slot == NULL) { /* 't' is not a table? */ + lua_assert(!ttistable(t)); + tm = luaT_gettmbyobj(L, t, TM_INDEX); + if (unlikely(notm(tm))) + luaG_typeerror(L, t, "index"); /* no metamethod */ + /* else will try the metamethod */ + } + else { /* 't' is a table */ + lua_assert(isempty(slot)); + tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */ + if (tm == NULL) { /* no metamethod? */ + setnilvalue(s2v(val)); /* result is nil */ + return; + } + /* else will try the metamethod */ + } + if (ttisfunction(tm)) { /* is metamethod a function? */ + luaT_callTMres(L, tm, t, key, val); /* call it */ + return; + } + t = tm; /* else try to access 'tm[key]' */ + if (luaV_fastget(L, t, key, slot, luaH_get)) { /* fast track? */ + setobj2s(L, val, slot); /* done */ + return; + } + /* else repeat (tail call 'luaV_finishget') */ + } + luaG_runerror(L, "'__index' chain too long; possible loop"); +} + + +/* +** Finish a table assignment 't[key] = val'. +** If 'slot' is NULL, 't' is not a table. Otherwise, 'slot' points +** to the entry 't[key]', or to a value with an absent key if there +** is no such entry. (The value at 'slot' must be empty, otherwise +** 'luaV_fastget' would have done the job.) +*/ +void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + TValue *val, const TValue *slot) { + int loop; /* counter to avoid infinite loops */ + for (loop = 0; loop < MAXTAGLOOP; loop++) { + const TValue *tm; /* '__newindex' metamethod */ + if (slot != NULL) { /* is 't' a table? */ + Table *h = hvalue(t); /* save 't' table */ + lua_assert(isempty(slot)); /* slot must be empty */ + tm = fasttm(L, h->metatable, TM_NEWINDEX); /* get metamethod */ + if (tm == NULL) { /* no metamethod? */ + if (isabstkey(slot)) /* no previous entry? */ + slot = luaH_newkey(L, h, key); /* create one */ + /* no metamethod and (now) there is an entry with given key */ + setobj2t(L, cast(TValue *, slot), val); /* set its new value */ + invalidateTMcache(h); + luaC_barrierback(L, obj2gco(h), val); + return; + } + /* else will try the metamethod */ + } + else { /* not a table; check metamethod */ + tm = luaT_gettmbyobj(L, t, TM_NEWINDEX); + if (unlikely(notm(tm))) + luaG_typeerror(L, t, "index"); + } + /* try the metamethod */ + if (ttisfunction(tm)) { + luaT_callTM(L, tm, t, key, val); + return; + } + t = tm; /* else repeat assignment over 'tm' */ + if (luaV_fastget(L, t, key, slot, luaH_get)) { + luaV_finishfastset(L, t, slot, val); + return; /* done */ + } + /* else 'return luaV_finishset(L, t, key, val, slot)' (loop) */ + } + luaG_runerror(L, "'__newindex' chain too long; possible loop"); +} + + +/* +** Compare two strings 'ls' x 'rs', returning an integer less-equal- +** -greater than zero if 'ls' is less-equal-greater than 'rs'. +** The code is a little tricky because it allows '\0' in the strings +** and it uses 'strcoll' (to respect locales) for each segments +** of the strings. +*/ +static int l_strcmp (const TString *ls, const TString *rs) { + const char *l = getstr(ls); + size_t ll = tsslen(ls); + const char *r = getstr(rs); + size_t lr = tsslen(rs); + for (;;) { /* for each segment */ + int temp = strcoll(l, r); + if (temp != 0) /* not equal? */ + return temp; /* done */ + else { /* strings are equal up to a '\0' */ + size_t len = strlen(l); /* index of first '\0' in both strings */ + if (len == lr) /* 'rs' is finished? */ + return (len == ll) ? 0 : 1; /* check 'ls' */ + else if (len == ll) /* 'ls' is finished? */ + return -1; /* 'ls' is less than 'rs' ('rs' is not finished) */ + /* both strings longer than 'len'; go on comparing after the '\0' */ + len++; + l += len; ll -= len; r += len; lr -= len; + } + } +} + + +/* +** Check whether integer 'i' is less than float 'f'. If 'i' has an +** exact representation as a float ('l_intfitsf'), compare numbers as +** floats. Otherwise, use the equivalence 'i < f <=> i < ceil(f)'. +** If 'ceil(f)' is out of integer range, either 'f' is greater than +** all integers or less than all integers. +** (The test with 'l_intfitsf' is only for performance; the else +** case is correct for all values, but it is slow due to the conversion +** from float to int.) +** When 'f' is NaN, comparisons must result in false. +*/ +static int LTintfloat (lua_Integer i, lua_Number f) { + if (l_intfitsf(i)) + return luai_numlt(cast_num(i), f); /* compare them as floats */ + else { /* i < f <=> i < ceil(f) */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Iceil)) /* fi = ceil(f) */ + return i < fi; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f > 0; /* greater? */ + } +} + + +/* +** Check whether integer 'i' is less than or equal to float 'f'. +** See comments on previous function. +*/ +static int LEintfloat (lua_Integer i, lua_Number f) { + if (l_intfitsf(i)) + return luai_numle(cast_num(i), f); /* compare them as floats */ + else { /* i <= f <=> i <= floor(f) */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Ifloor)) /* fi = floor(f) */ + return i <= fi; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f > 0; /* greater? */ + } +} + + +/* +** Check whether float 'f' is less than integer 'i'. +** See comments on previous function. +*/ +static int LTfloatint (lua_Number f, lua_Integer i) { + if (l_intfitsf(i)) + return luai_numlt(f, cast_num(i)); /* compare them as floats */ + else { /* f < i <=> floor(f) < i */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Ifloor)) /* fi = floor(f) */ + return fi < i; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f < 0; /* less? */ + } +} + + +/* +** Check whether float 'f' is less than or equal to integer 'i'. +** See comments on previous function. +*/ +static int LEfloatint (lua_Number f, lua_Integer i) { + if (l_intfitsf(i)) + return luai_numle(f, cast_num(i)); /* compare them as floats */ + else { /* f <= i <=> ceil(f) <= i */ + lua_Integer fi; + if (luaV_flttointeger(f, &fi, F2Iceil)) /* fi = ceil(f) */ + return fi <= i; /* compare them as integers */ + else /* 'f' is either greater or less than all integers */ + return f < 0; /* less? */ + } +} + + +/* +** Return 'l < r', for numbers. +*/ +static int LTnum (const TValue *l, const TValue *r) { + lua_assert(ttisnumber(l) && ttisnumber(r)); + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li < ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LTintfloat(li, fltvalue(r)); /* l < r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numlt(lf, fltvalue(r)); /* both are float */ + else /* 'l' is float and 'r' is int */ + return LTfloatint(lf, ivalue(r)); + } +} + + +/* +** Return 'l <= r', for numbers. +*/ +static int LEnum (const TValue *l, const TValue *r) { + lua_assert(ttisnumber(l) && ttisnumber(r)); + if (ttisinteger(l)) { + lua_Integer li = ivalue(l); + if (ttisinteger(r)) + return li <= ivalue(r); /* both are integers */ + else /* 'l' is int and 'r' is float */ + return LEintfloat(li, fltvalue(r)); /* l <= r ? */ + } + else { + lua_Number lf = fltvalue(l); /* 'l' must be float */ + if (ttisfloat(r)) + return luai_numle(lf, fltvalue(r)); /* both are float */ + else /* 'l' is float and 'r' is int */ + return LEfloatint(lf, ivalue(r)); + } +} + + +/* +** return 'l < r' for non-numbers. +*/ +static int lessthanothers (lua_State *L, const TValue *l, const TValue *r) { + lua_assert(!ttisnumber(l) || !ttisnumber(r)); + if (ttisstring(l) && ttisstring(r)) /* both are strings? */ + return l_strcmp(tsvalue(l), tsvalue(r)) < 0; + else + return luaT_callorderTM(L, l, r, TM_LT); +} + + +/* +** Main operation less than; return 'l < r'. +*/ +int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { + if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */ + return LTnum(l, r); + else return lessthanothers(L, l, r); +} + + +/* +** return 'l <= r' for non-numbers. +*/ +static int lessequalothers (lua_State *L, const TValue *l, const TValue *r) { + lua_assert(!ttisnumber(l) || !ttisnumber(r)); + if (ttisstring(l) && ttisstring(r)) /* both are strings? */ + return l_strcmp(tsvalue(l), tsvalue(r)) <= 0; + else + return luaT_callorderTM(L, l, r, TM_LE); +} + + +/* +** Main operation less than or equal to; return 'l <= r'. +*/ +int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { + if (ttisnumber(l) && ttisnumber(r)) /* both operands are numbers? */ + return LEnum(l, r); + else return lessequalothers(L, l, r); +} + + +/* +** Main operation for equality of Lua values; return 't1 == t2'. +** L == NULL means raw equality (no metamethods) +*/ +int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { + const TValue *tm; + if (ttypetag(t1) != ttypetag(t2)) { /* not the same variant? */ + if (ttype(t1) != ttype(t2) || ttype(t1) != LUA_TNUMBER) + return 0; /* only numbers can be equal with different variants */ + else { /* two numbers with different variants */ + lua_Integer i1, i2; /* compare them as integers */ + return (tointegerns(t1, &i1) && tointegerns(t2, &i2) && i1 == i2); + } + } + /* values have same type and same variant */ + switch (ttypetag(t1)) { + case LUA_VNIL: case LUA_VFALSE: case LUA_VTRUE: return 1; + case LUA_VNUMINT: return (ivalue(t1) == ivalue(t2)); + case LUA_VNUMFLT: return luai_numeq(fltvalue(t1), fltvalue(t2)); + case LUA_VLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); + case LUA_VLCF: return fvalue(t1) == fvalue(t2); + case LUA_VSHRSTR: return eqshrstr(tsvalue(t1), tsvalue(t2)); + case LUA_VLNGSTR: return luaS_eqlngstr(tsvalue(t1), tsvalue(t2)); + case LUA_VUSERDATA: { + if (uvalue(t1) == uvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, uvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, uvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + case LUA_VTABLE: { + if (hvalue(t1) == hvalue(t2)) return 1; + else if (L == NULL) return 0; + tm = fasttm(L, hvalue(t1)->metatable, TM_EQ); + if (tm == NULL) + tm = fasttm(L, hvalue(t2)->metatable, TM_EQ); + break; /* will try TM */ + } + default: + return gcvalue(t1) == gcvalue(t2); + } + if (tm == NULL) /* no TM? */ + return 0; /* objects are different */ + else { + luaT_callTMres(L, tm, t1, t2, L->top); /* call TM */ + return !l_isfalse(s2v(L->top)); + } +} + + +/* macro used by 'luaV_concat' to ensure that element at 'o' is a string */ +#define tostring(L,o) \ + (ttisstring(o) || (cvt2str(o) && (luaO_tostring(L, o), 1))) + +#define isemptystr(o) (ttisshrstring(o) && tsvalue(o)->shrlen == 0) + +/* copy strings in stack from top - n up to top - 1 to buffer */ +static void copy2buff (StkId top, int n, char *buff) { + size_t tl = 0; /* size already copied */ + do { + size_t l = vslen(s2v(top - n)); /* length of string being copied */ + memcpy(buff + tl, svalue(s2v(top - n)), l * sizeof(char)); + tl += l; + } while (--n > 0); +} + + +/* +** Main operation for concatenation: concat 'total' values in the stack, +** from 'L->top - total' up to 'L->top - 1'. +*/ +void luaV_concat (lua_State *L, int total) { + lua_assert(total >= 2); + do { + StkId top = L->top; + int n = 2; /* number of elements handled in this pass (at least 2) */ + if (!(ttisstring(s2v(top - 2)) || cvt2str(s2v(top - 2))) || + !tostring(L, s2v(top - 1))) + luaT_tryconcatTM(L); + else if (isemptystr(s2v(top - 1))) /* second operand is empty? */ + cast_void(tostring(L, s2v(top - 2))); /* result is first operand */ + else if (isemptystr(s2v(top - 2))) { /* first operand is empty string? */ + setobjs2s(L, top - 2, top - 1); /* result is second op. */ + } + else { + /* at least two non-empty string values; get as many as possible */ + size_t tl = vslen(s2v(top - 1)); + TString *ts; + /* collect total length and number of strings */ + for (n = 1; n < total && tostring(L, s2v(top - n - 1)); n++) { + size_t l = vslen(s2v(top - n - 1)); + if (unlikely(l >= (MAX_SIZE/sizeof(char)) - tl)) + luaG_runerror(L, "string length overflow"); + tl += l; + } + if (tl <= LUAI_MAXSHORTLEN) { /* is result a short string? */ + char buff[LUAI_MAXSHORTLEN]; + copy2buff(top, n, buff); /* copy strings to buffer */ + ts = luaS_newlstr(L, buff, tl); + } + else { /* long string; copy strings directly to final result */ + ts = luaS_createlngstrobj(L, tl); + copy2buff(top, n, getstr(ts)); + } + setsvalue2s(L, top - n, ts); /* create result */ + } + total -= n-1; /* got 'n' strings to create 1 new */ + L->top -= n-1; /* popped 'n' strings and pushed one */ + } while (total > 1); /* repeat until only 1 result left */ +} + + +/* +** Main operation 'ra = #rb'. +*/ +void luaV_objlen (lua_State *L, StkId ra, const TValue *rb) { + const TValue *tm; + switch (ttypetag(rb)) { + case LUA_VTABLE: { + Table *h = hvalue(rb); + tm = fasttm(L, h->metatable, TM_LEN); + if (tm) break; /* metamethod? break switch to call it */ + setivalue(s2v(ra), luaH_getn(h)); /* else primitive len */ + return; + } + case LUA_VSHRSTR: { + setivalue(s2v(ra), tsvalue(rb)->shrlen); + return; + } + case LUA_VLNGSTR: { + setivalue(s2v(ra), tsvalue(rb)->u.lnglen); + return; + } + default: { /* try metamethod */ + tm = luaT_gettmbyobj(L, rb, TM_LEN); + if (unlikely(notm(tm))) /* no metamethod? */ + luaG_typeerror(L, rb, "get length of"); + break; + } + } + luaT_callTMres(L, tm, rb, rb, ra); +} + + +/* +** Integer division; return 'm // n', that is, floor(m/n). +** C division truncates its result (rounds towards zero). +** 'floor(q) == trunc(q)' when 'q >= 0' or when 'q' is integer, +** otherwise 'floor(q) == trunc(q) - 1'. +*/ +lua_Integer luaV_idiv (lua_State *L, lua_Integer m, lua_Integer n) { + if (unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to divide by zero"); + return intop(-, 0, m); /* n==-1; avoid overflow with 0x80000...//-1 */ + } + else { + lua_Integer q = m / n; /* perform C division */ + if ((m ^ n) < 0 && m % n != 0) /* 'm/n' would be negative non-integer? */ + q -= 1; /* correct result for different rounding */ + return q; + } +} + + +/* +** Integer modulus; return 'm % n'. (Assume that C '%' with +** negative operands follows C99 behavior. See previous comment +** about luaV_idiv.) +*/ +lua_Integer luaV_mod (lua_State *L, lua_Integer m, lua_Integer n) { + if (unlikely(l_castS2U(n) + 1u <= 1u)) { /* special cases: -1 or 0 */ + if (n == 0) + luaG_runerror(L, "attempt to perform 'n%%0'"); + return 0; /* m % -1 == 0; avoid overflow with 0x80000...%-1 */ + } + else { + lua_Integer r = m % n; + if (r != 0 && (r ^ n) < 0) /* 'm/n' would be non-integer negative? */ + r += n; /* correct result for different rounding */ + return r; + } +} + + +/* +** Float modulus +*/ +lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) { + lua_Number r; + luai_nummod(L, m, n, r); + return r; +} + + +/* number of bits in an integer */ +#define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) + +/* +** Shift left operation. (Shift right just negates 'y'.) +*/ +#define luaV_shiftr(x,y) luaV_shiftl(x,-(y)) + +lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { + if (y < 0) { /* shift right? */ + if (y <= -NBITS) return 0; + else return intop(>>, x, -y); + } + else { /* shift left */ + if (y >= NBITS) return 0; + else return intop(<<, x, y); + } +} + + +/* +** create a new Lua closure, push it in the stack, and initialize +** its upvalues. +*/ +static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, + StkId ra) { + int nup = p->sizeupvalues; + Upvaldesc *uv = p->upvalues; + int i; + LClosure *ncl = luaF_newLclosure(L, nup); + ncl->p = p; + setclLvalue2s(L, ra, ncl); /* anchor new closure in stack */ + for (i = 0; i < nup; i++) { /* fill in its upvalues */ + if (uv[i].instack) /* upvalue refers to local variable? */ + ncl->upvals[i] = luaF_findupval(L, base + uv[i].idx); + else /* get upvalue from enclosing function */ + ncl->upvals[i] = encup[uv[i].idx]; + luaC_objbarrier(L, ncl, ncl->upvals[i]); + } +} + + +/* +** finish execution of an opcode interrupted by a yield +*/ +void luaV_finishOp (lua_State *L) { + CallInfo *ci = L->ci; + StkId base = ci->func + 1; + Instruction inst = *(ci->u.l.savedpc - 1); /* interrupted instruction */ + OpCode op = GET_OPCODE(inst); + switch (op) { /* finish its execution */ + case OP_MMBIN: case OP_MMBINI: case OP_MMBINK: { + setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top); + break; + } + case OP_UNM: case OP_BNOT: case OP_LEN: + case OP_GETTABUP: case OP_GETTABLE: case OP_GETI: + case OP_GETFIELD: case OP_SELF: { + setobjs2s(L, base + GETARG_A(inst), --L->top); + break; + } + case OP_LT: case OP_LE: + case OP_LTI: case OP_LEI: + case OP_GTI: case OP_GEI: + case OP_EQ: { /* note that 'OP_EQI'/'OP_EQK' cannot yield */ + int res = !l_isfalse(s2v(L->top - 1)); + L->top--; +#if defined(LUA_COMPAT_LT_LE) + if (ci->callstatus & CIST_LEQ) { /* "<=" using "<" instead? */ + ci->callstatus ^= CIST_LEQ; /* clear mark */ + res = !res; /* negate result */ + } +#endif + lua_assert(GET_OPCODE(*ci->u.l.savedpc) == OP_JMP); + if (res != GETARG_k(inst)) /* condition failed? */ + ci->u.l.savedpc++; /* skip jump instruction */ + break; + } + case OP_CONCAT: { + StkId top = L->top - 1; /* top when 'luaT_tryconcatTM' was called */ + int a = GETARG_A(inst); /* first element to concatenate */ + int total = cast_int(top - 1 - (base + a)); /* yet to concatenate */ + setobjs2s(L, top - 2, top); /* put TM result in proper position */ + if (total > 1) { /* are there elements to concat? */ + L->top = top - 1; /* top is one after last element (at top-2) */ + luaV_concat(L, total); /* concat them (may yield again) */ + } + break; + } + default: { + /* only these other opcodes can yield */ + lua_assert(op == OP_TFORCALL || op == OP_CALL || + op == OP_TAILCALL || op == OP_SETTABUP || op == OP_SETTABLE || + op == OP_SETI || op == OP_SETFIELD); + break; + } + } +} + + + + +/* +** {================================================================== +** Macros for arithmetic/bitwise/comparison opcodes in 'luaV_execute' +** =================================================================== +*/ + +#define l_addi(L,a,b) intop(+, a, b) +#define l_subi(L,a,b) intop(-, a, b) +#define l_muli(L,a,b) intop(*, a, b) +#define l_band(a,b) intop(&, a, b) +#define l_bor(a,b) intop(|, a, b) +#define l_bxor(a,b) intop(^, a, b) + +#define l_lti(a,b) (a < b) +#define l_lei(a,b) (a <= b) +#define l_gti(a,b) (a > b) +#define l_gei(a,b) (a >= b) + + +/* +** Arithmetic operations with immediate operands. 'iop' is the integer +** operation, 'fop' is the float operation. +*/ +#define op_arithI(L,iop,fop) { \ + TValue *v1 = vRB(i); \ + int imm = GETARG_sC(i); \ + if (ttisinteger(v1)) { \ + lua_Integer iv1 = ivalue(v1); \ + pc++; setivalue(s2v(ra), iop(L, iv1, imm)); \ + } \ + else if (ttisfloat(v1)) { \ + lua_Number nb = fltvalue(v1); \ + lua_Number fimm = cast_num(imm); \ + pc++; setfltvalue(s2v(ra), fop(L, nb, fimm)); \ + }} + + +/* +** Auxiliary function for arithmetic operations over floats and others +** with two register operands. +*/ +#define op_arithf_aux(L,v1,v2,fop) { \ + lua_Number n1; lua_Number n2; \ + if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ + pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \ + }} + + +/* +** Arithmetic operations over floats and others with register operands. +*/ +#define op_arithf(L,fop) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + op_arithf_aux(L, v1, v2, fop); } + + +/* +** Arithmetic operations with K operands for floats. +*/ +#define op_arithfK(L,fop) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); \ + op_arithf_aux(L, v1, v2, fop); } + + +/* +** Arithmetic operations over integers and floats. +*/ +#define op_arith_aux(L,v1,v2,iop,fop) { \ + if (ttisinteger(v1) && ttisinteger(v2)) { \ + lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ + pc++; setivalue(s2v(ra), iop(L, i1, i2)); \ + } \ + else op_arithf_aux(L, v1, v2, fop); } + + +/* +** Arithmetic operations with register operands. +*/ +#define op_arith(L,iop,fop) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + op_arith_aux(L, v1, v2, iop, fop); } + + +/* +** Arithmetic operations with K operands. +*/ +#define op_arithK(L,iop,fop) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); \ + op_arith_aux(L, v1, v2, iop, fop); } + + +/* +** Bitwise operations with constant operand. +*/ +#define op_bitwiseK(L,op) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = KC(i); \ + lua_Integer i1; \ + lua_Integer i2 = ivalue(v2); \ + if (tointegerns(v1, &i1)) { \ + pc++; setivalue(s2v(ra), op(i1, i2)); \ + }} + + +/* +** Bitwise operations with register operands. +*/ +#define op_bitwise(L,op) { \ + TValue *v1 = vRB(i); \ + TValue *v2 = vRC(i); \ + lua_Integer i1; lua_Integer i2; \ + if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \ + pc++; setivalue(s2v(ra), op(i1, i2)); \ + }} + + +/* +** Order operations with register operands. 'opn' actually works +** for all numbers, but the fast track improves performance for +** integers. +*/ +#define op_order(L,opi,opn,other) { \ + int cond; \ + TValue *rb = vRB(i); \ + if (ttisinteger(s2v(ra)) && ttisinteger(rb)) { \ + lua_Integer ia = ivalue(s2v(ra)); \ + lua_Integer ib = ivalue(rb); \ + cond = opi(ia, ib); \ + } \ + else if (ttisnumber(s2v(ra)) && ttisnumber(rb)) \ + cond = opn(s2v(ra), rb); \ + else \ + Protect(cond = other(L, s2v(ra), rb)); \ + docondjump(); } + + +/* +** Order operations with immediate operand. (Immediate operand is +** always small enough to have an exact representation as a float.) +*/ +#define op_orderI(L,opi,opf,inv,tm) { \ + int cond; \ + int im = GETARG_sB(i); \ + if (ttisinteger(s2v(ra))) \ + cond = opi(ivalue(s2v(ra)), im); \ + else if (ttisfloat(s2v(ra))) { \ + lua_Number fa = fltvalue(s2v(ra)); \ + lua_Number fim = cast_num(im); \ + cond = opf(fa, fim); \ + } \ + else { \ + int isf = GETARG_C(i); \ + Protect(cond = luaT_callorderiTM(L, s2v(ra), im, inv, isf, tm)); \ + } \ + docondjump(); } + +/* }================================================================== */ + + +/* +** {================================================================== +** Function 'luaV_execute': main interpreter loop +** =================================================================== +*/ + +/* +** some macros for common tasks in 'luaV_execute' +*/ + + +#define RA(i) (base+GETARG_A(i)) +#define RB(i) (base+GETARG_B(i)) +#define vRB(i) s2v(RB(i)) +#define KB(i) (k+GETARG_B(i)) +#define RC(i) (base+GETARG_C(i)) +#define vRC(i) s2v(RC(i)) +#define KC(i) (k+GETARG_C(i)) +#define RKC(i) ((TESTARG_k(i)) ? k + GETARG_C(i) : s2v(base + GETARG_C(i))) + + + +#define updatetrap(ci) (trap = ci->u.l.trap) + +#define updatebase(ci) (base = ci->func + 1) + + +#define updatestack(ci) { if (trap) { updatebase(ci); ra = RA(i); } } + + +/* +** Execute a jump instruction. The 'updatetrap' allows signals to stop +** tight loops. (Without it, the local copy of 'trap' could never change.) +*/ +#define dojump(ci,i,e) { pc += GETARG_sJ(i) + e; updatetrap(ci); } + + +/* for test instructions, execute the jump instruction that follows it */ +#define donextjump(ci) { Instruction ni = *pc; dojump(ci, ni, 1); } + +/* +** do a conditional jump: skip next instruction if 'cond' is not what +** was expected (parameter 'k'), else do next instruction, which must +** be a jump. +*/ +#define docondjump() if (cond != GETARG_k(i)) pc++; else donextjump(ci); + + +/* +** Correct global 'pc'. +*/ +#define savepc(L) (ci->u.l.savedpc = pc) + + +/* +** Whenever code can raise errors, the global 'pc' and the global +** 'top' must be correct to report occasional errors. +*/ +#define savestate(L,ci) (savepc(L), L->top = ci->top) + + +/* +** Protect code that, in general, can raise errors, reallocate the +** stack, and change the hooks. +*/ +#define Protect(exp) (savestate(L,ci), (exp), updatetrap(ci)) + +/* special version that does not change the top */ +#define ProtectNT(exp) (savepc(L), (exp), updatetrap(ci)) + +/* +** Protect code that will finish the loop (returns) or can only raise +** errors. (That is, it will not return to the interpreter main loop +** after changing the stack or hooks.) +*/ +#define halfProtect(exp) (savestate(L,ci), (exp)) + +/* idem, but without changing the stack */ +#define halfProtectNT(exp) (savepc(L), (exp)) + + +#define checkGC(L,c) \ + { luaC_condGC(L, L->top = (c), /* limit of live values */ \ + updatetrap(ci)); \ + luai_threadyield(L); } + + +/* fetch an instruction and prepare its execution */ +#define vmfetch() { \ + if (trap) { /* stack reallocation or hooks? */ \ + trap = luaG_traceexec(L, pc); /* handle hooks */ \ + updatebase(ci); /* correct stack */ \ + } \ + i = *(pc++); \ + ra = RA(i); /* WARNING: any stack reallocation invalidates 'ra' */ \ +} + +#define vmdispatch(o) switch(o) +#define vmcase(l) case l: +#define vmbreak break + + +void luaV_execute (lua_State *L, CallInfo *ci) { + LClosure *cl; + TValue *k; + StkId base; + const Instruction *pc; + int trap; +#if LUA_USE_JUMPTABLE +#include "ljumptab.h" +#endif + tailcall: + trap = L->hookmask; + cl = clLvalue(s2v(ci->func)); + k = cl->p->k; + pc = ci->u.l.savedpc; + if (trap) { + if (cl->p->is_vararg) + trap = 0; /* hooks will start after VARARGPREP instruction */ + else if (pc == cl->p->code) /* first instruction (not resuming)? */ + luaD_hookcall(L, ci); + ci->u.l.trap = 1; /* there may be other hooks */ + } + base = ci->func + 1; + /* main loop of interpreter */ + for (;;) { + Instruction i; /* instruction being executed */ + StkId ra; /* instruction's A register */ + vmfetch(); + lua_assert(base == ci->func + 1); + lua_assert(base <= L->top && L->top < L->stack + L->stacksize); + /* invalidate top for instructions not expecting it */ + lua_assert(isIT(i) || (cast_void(L->top = base), 1)); + vmdispatch (GET_OPCODE(i)) { + vmcase(OP_MOVE) { + setobjs2s(L, ra, RB(i)); + vmbreak; + } + vmcase(OP_LOADI) { + lua_Integer b = GETARG_sBx(i); + setivalue(s2v(ra), b); + vmbreak; + } + vmcase(OP_LOADF) { + int b = GETARG_sBx(i); + setfltvalue(s2v(ra), cast_num(b)); + vmbreak; + } + vmcase(OP_LOADK) { + TValue *rb = k + GETARG_Bx(i); + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADKX) { + TValue *rb; + rb = k + GETARG_Ax(*pc); pc++; + setobj2s(L, ra, rb); + vmbreak; + } + vmcase(OP_LOADFALSE) { + setbfvalue(s2v(ra)); + vmbreak; + } + vmcase(OP_LFALSESKIP) { + setbfvalue(s2v(ra)); + pc++; /* skip next instruction */ + vmbreak; + } + vmcase(OP_LOADTRUE) { + setbtvalue(s2v(ra)); + vmbreak; + } + vmcase(OP_LOADNIL) { + int b = GETARG_B(i); + do { + setnilvalue(s2v(ra++)); + } while (b--); + vmbreak; + } + vmcase(OP_GETUPVAL) { + int b = GETARG_B(i); + setobj2s(L, ra, cl->upvals[b]->v); + vmbreak; + } + vmcase(OP_SETUPVAL) { + UpVal *uv = cl->upvals[GETARG_B(i)]; + setobj(L, uv->v, s2v(ra)); + luaC_barrier(L, uv, s2v(ra)); + vmbreak; + } + vmcase(OP_GETTABUP) { + const TValue *slot; + TValue *upval = cl->upvals[GETARG_B(i)]->v; + TValue *rc = KC(i); + TString *key = tsvalue(rc); /* key must be a string */ + if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, upval, rc, ra, slot)); + vmbreak; + } + vmcase(OP_GETTABLE) { + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = vRC(i); + lua_Unsigned n; + if (ttisinteger(rc) /* fast track for integers? */ + ? (cast_void(n = ivalue(rc)), luaV_fastgeti(L, rb, n, slot)) + : luaV_fastget(L, rb, rc, slot, luaH_get)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_GETI) { + const TValue *slot; + TValue *rb = vRB(i); + int c = GETARG_C(i); + if (luaV_fastgeti(L, rb, c, slot)) { + setobj2s(L, ra, slot); + } + else { + TValue key; + setivalue(&key, c); + Protect(luaV_finishget(L, rb, &key, ra, slot)); + } + vmbreak; + } + vmcase(OP_GETFIELD) { + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = KC(i); + TString *key = tsvalue(rc); /* key must be a string */ + if (luaV_fastget(L, rb, key, slot, luaH_getshortstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_SETTABUP) { + const TValue *slot; + TValue *upval = cl->upvals[GETARG_A(i)]->v; + TValue *rb = KB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rb); /* key must be a string */ + if (luaV_fastget(L, upval, key, slot, luaH_getshortstr)) { + luaV_finishfastset(L, upval, slot, rc); + } + else + Protect(luaV_finishset(L, upval, rb, rc, slot)); + vmbreak; + } + vmcase(OP_SETTABLE) { + const TValue *slot; + TValue *rb = vRB(i); /* key (table is in 'ra') */ + TValue *rc = RKC(i); /* value */ + lua_Unsigned n; + if (ttisinteger(rb) /* fast track for integers? */ + ? (cast_void(n = ivalue(rb)), luaV_fastgeti(L, s2v(ra), n, slot)) + : luaV_fastget(L, s2v(ra), rb, slot, luaH_get)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else + Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + vmbreak; + } + vmcase(OP_SETI) { + const TValue *slot; + int c = GETARG_B(i); + TValue *rc = RKC(i); + if (luaV_fastgeti(L, s2v(ra), c, slot)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else { + TValue key; + setivalue(&key, c); + Protect(luaV_finishset(L, s2v(ra), &key, rc, slot)); + } + vmbreak; + } + vmcase(OP_SETFIELD) { + const TValue *slot; + TValue *rb = KB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rb); /* key must be a string */ + if (luaV_fastget(L, s2v(ra), key, slot, luaH_getshortstr)) { + luaV_finishfastset(L, s2v(ra), slot, rc); + } + else + Protect(luaV_finishset(L, s2v(ra), rb, rc, slot)); + vmbreak; + } + vmcase(OP_NEWTABLE) { + int b = GETARG_B(i); /* log2(hash size) + 1 */ + int c = GETARG_C(i); /* array size */ + Table *t; + if (b > 0) + b = 1 << (b - 1); /* size is 2^(b - 1) */ + lua_assert((!TESTARG_k(i)) == (GETARG_Ax(*pc) == 0)); + if (TESTARG_k(i)) /* non-zero extra argument? */ + c += GETARG_Ax(*pc) * (MAXARG_C + 1); /* add it to size */ + pc++; /* skip extra argument */ + L->top = ra + 1; /* correct top in case of emergency GC */ + t = luaH_new(L); /* memory allocation */ + sethvalue2s(L, ra, t); + if (b != 0 || c != 0) + luaH_resize(L, t, c, b); /* idem */ + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_SELF) { + const TValue *slot; + TValue *rb = vRB(i); + TValue *rc = RKC(i); + TString *key = tsvalue(rc); /* key must be a string */ + setobj2s(L, ra + 1, rb); + if (luaV_fastget(L, rb, key, slot, luaH_getstr)) { + setobj2s(L, ra, slot); + } + else + Protect(luaV_finishget(L, rb, rc, ra, slot)); + vmbreak; + } + vmcase(OP_ADDI) { + op_arithI(L, l_addi, luai_numadd); + vmbreak; + } + vmcase(OP_ADDK) { + op_arithK(L, l_addi, luai_numadd); + vmbreak; + } + vmcase(OP_SUBK) { + op_arithK(L, l_subi, luai_numsub); + vmbreak; + } + vmcase(OP_MULK) { + op_arithK(L, l_muli, luai_nummul); + vmbreak; + } + vmcase(OP_MODK) { + op_arithK(L, luaV_mod, luaV_modf); + vmbreak; + } + vmcase(OP_POWK) { + op_arithfK(L, luai_numpow); + vmbreak; + } + vmcase(OP_DIVK) { + op_arithfK(L, luai_numdiv); + vmbreak; + } + vmcase(OP_IDIVK) { + op_arithK(L, luaV_idiv, luai_numidiv); + vmbreak; + } + vmcase(OP_BANDK) { + op_bitwiseK(L, l_band); + vmbreak; + } + vmcase(OP_BORK) { + op_bitwiseK(L, l_bor); + vmbreak; + } + vmcase(OP_BXORK) { + op_bitwiseK(L, l_bxor); + vmbreak; + } + vmcase(OP_SHRI) { + TValue *rb = vRB(i); + int ic = GETARG_sC(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + pc++; setivalue(s2v(ra), luaV_shiftl(ib, -ic)); + } + vmbreak; + } + vmcase(OP_SHLI) { + TValue *rb = vRB(i); + int ic = GETARG_sC(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + pc++; setivalue(s2v(ra), luaV_shiftl(ic, ib)); + } + vmbreak; + } + vmcase(OP_ADD) { + op_arith(L, l_addi, luai_numadd); + vmbreak; + } + vmcase(OP_SUB) { + op_arith(L, l_subi, luai_numsub); + vmbreak; + } + vmcase(OP_MUL) { + op_arith(L, l_muli, luai_nummul); + vmbreak; + } + vmcase(OP_MOD) { + op_arith(L, luaV_mod, luaV_modf); + vmbreak; + } + vmcase(OP_POW) { + op_arithf(L, luai_numpow); + vmbreak; + } + vmcase(OP_DIV) { /* float division (always with floats) */ + op_arithf(L, luai_numdiv); + vmbreak; + } + vmcase(OP_IDIV) { /* floor division */ + op_arith(L, luaV_idiv, luai_numidiv); + vmbreak; + } + vmcase(OP_BAND) { + op_bitwise(L, l_band); + vmbreak; + } + vmcase(OP_BOR) { + op_bitwise(L, l_bor); + vmbreak; + } + vmcase(OP_BXOR) { + op_bitwise(L, l_bxor); + vmbreak; + } + vmcase(OP_SHR) { + op_bitwise(L, luaV_shiftr); + vmbreak; + } + vmcase(OP_SHL) { + op_bitwise(L, luaV_shiftl); + vmbreak; + } + vmcase(OP_MMBIN) { + Instruction pi = *(pc - 2); /* original arith. expression */ + TValue *rb = vRB(i); + TMS tm = (TMS)GETARG_C(i); + StkId result = RA(pi); + lua_assert(OP_ADD <= GET_OPCODE(pi) && GET_OPCODE(pi) <= OP_SHR); + Protect(luaT_trybinTM(L, s2v(ra), rb, result, tm)); + vmbreak; + } + vmcase(OP_MMBINI) { + Instruction pi = *(pc - 2); /* original arith. expression */ + int imm = GETARG_sB(i); + TMS tm = (TMS)GETARG_C(i); + int flip = GETARG_k(i); + StkId result = RA(pi); + Protect(luaT_trybiniTM(L, s2v(ra), imm, flip, result, tm)); + vmbreak; + } + vmcase(OP_MMBINK) { + Instruction pi = *(pc - 2); /* original arith. expression */ + TValue *imm = KB(i); + TMS tm = (TMS)GETARG_C(i); + int flip = GETARG_k(i); + StkId result = RA(pi); + Protect(luaT_trybinassocTM(L, s2v(ra), imm, flip, result, tm)); + vmbreak; + } + vmcase(OP_UNM) { + TValue *rb = vRB(i); + lua_Number nb; + if (ttisinteger(rb)) { + lua_Integer ib = ivalue(rb); + setivalue(s2v(ra), intop(-, 0, ib)); + } + else if (tonumberns(rb, nb)) { + setfltvalue(s2v(ra), luai_numunm(L, nb)); + } + else + Protect(luaT_trybinTM(L, rb, rb, ra, TM_UNM)); + vmbreak; + } + vmcase(OP_BNOT) { + TValue *rb = vRB(i); + lua_Integer ib; + if (tointegerns(rb, &ib)) { + setivalue(s2v(ra), intop(^, ~l_castS2U(0), ib)); + } + else + Protect(luaT_trybinTM(L, rb, rb, ra, TM_BNOT)); + vmbreak; + } + vmcase(OP_NOT) { + TValue *rb = vRB(i); + if (l_isfalse(rb)) + setbtvalue(s2v(ra)); + else + setbfvalue(s2v(ra)); + vmbreak; + } + vmcase(OP_LEN) { + Protect(luaV_objlen(L, ra, vRB(i))); + vmbreak; + } + vmcase(OP_CONCAT) { + int n = GETARG_B(i); /* number of elements to concatenate */ + L->top = ra + n; /* mark the end of concat operands */ + ProtectNT(luaV_concat(L, n)); + checkGC(L, L->top); /* 'luaV_concat' ensures correct top */ + vmbreak; + } + vmcase(OP_CLOSE) { + Protect(luaF_close(L, ra, LUA_OK)); + vmbreak; + } + vmcase(OP_TBC) { + /* create new to-be-closed upvalue */ + halfProtect(luaF_newtbcupval(L, ra)); + vmbreak; + } + vmcase(OP_JMP) { + dojump(ci, i, 0); + vmbreak; + } + vmcase(OP_EQ) { + int cond; + TValue *rb = vRB(i); + Protect(cond = luaV_equalobj(L, s2v(ra), rb)); + docondjump(); + vmbreak; + } + vmcase(OP_LT) { + op_order(L, l_lti, LTnum, lessthanothers); + vmbreak; + } + vmcase(OP_LE) { + op_order(L, l_lei, LEnum, lessequalothers); + vmbreak; + } + vmcase(OP_EQK) { + TValue *rb = KB(i); + /* basic types do not use '__eq'; we can use raw equality */ + int cond = luaV_rawequalobj(s2v(ra), rb); + docondjump(); + vmbreak; + } + vmcase(OP_EQI) { + int cond; + int im = GETARG_sB(i); + if (ttisinteger(s2v(ra))) + cond = (ivalue(s2v(ra)) == im); + else if (ttisfloat(s2v(ra))) + cond = luai_numeq(fltvalue(s2v(ra)), cast_num(im)); + else + cond = 0; /* other types cannot be equal to a number */ + docondjump(); + vmbreak; + } + vmcase(OP_LTI) { + op_orderI(L, l_lti, luai_numlt, 0, TM_LT); + vmbreak; + } + vmcase(OP_LEI) { + op_orderI(L, l_lei, luai_numle, 0, TM_LE); + vmbreak; + } + vmcase(OP_GTI) { + op_orderI(L, l_gti, luai_numgt, 1, TM_LT); + vmbreak; + } + vmcase(OP_GEI) { + op_orderI(L, l_gei, luai_numge, 1, TM_LE); + vmbreak; + } + vmcase(OP_TEST) { + int cond = !l_isfalse(s2v(ra)); + docondjump(); + vmbreak; + } + vmcase(OP_TESTSET) { + TValue *rb = vRB(i); + if (l_isfalse(rb) == GETARG_k(i)) + pc++; + else { + setobj2s(L, ra, rb); + donextjump(ci); + } + vmbreak; + } + vmcase(OP_CALL) { + int b = GETARG_B(i); + int nresults = GETARG_C(i) - 1; + if (b != 0) /* fixed number of arguments? */ + L->top = ra + b; /* top signals number of arguments */ + /* else previous instruction set top */ + ProtectNT(luaD_call(L, ra, nresults)); + vmbreak; + } + vmcase(OP_TAILCALL) { + int b = GETARG_B(i); /* number of arguments + 1 (function) */ + int nparams1 = GETARG_C(i); + /* delat is virtual 'func' - real 'func' (vararg functions) */ + int delta = (nparams1) ? ci->u.l.nextraargs + nparams1 : 0; + if (b != 0) + L->top = ra + b; + else /* previous instruction set top */ + b = cast_int(L->top - ra); + savepc(ci); /* some calls here can raise errors */ + if (TESTARG_k(i)) { + /* close upvalues from current call; the compiler ensures + that there are no to-be-closed variables here, so this + call cannot change the stack */ + luaF_close(L, base, NOCLOSINGMETH); + lua_assert(base == ci->func + 1); + } + while (!ttisfunction(s2v(ra))) { /* not a function? */ + luaD_tryfuncTM(L, ra); /* try '__call' metamethod */ + b++; /* there is now one extra argument */ + checkstackp(L, 1, ra); + } + if (!ttisLclosure(s2v(ra))) { /* C function? */ + luaD_call(L, ra, LUA_MULTRET); /* call it */ + updatetrap(ci); + updatestack(ci); /* stack may have been relocated */ + ci->func -= delta; + luaD_poscall(L, ci, cast_int(L->top - ra)); + return; + } + ci->func -= delta; + luaD_pretailcall(L, ci, ra, b); /* prepare call frame */ + goto tailcall; + } + vmcase(OP_RETURN) { + int n = GETARG_B(i) - 1; /* number of results */ + int nparams1 = GETARG_C(i); + if (n < 0) /* not fixed? */ + n = cast_int(L->top - ra); /* get what is available */ + savepc(ci); + if (TESTARG_k(i)) { /* may there be open upvalues? */ + if (L->top < ci->top) + L->top = ci->top; + luaF_close(L, base, LUA_OK); + updatetrap(ci); + updatestack(ci); + } + if (nparams1) /* vararg function? */ + ci->func -= ci->u.l.nextraargs + nparams1; + L->top = ra + n; /* set call for 'luaD_poscall' */ + luaD_poscall(L, ci, n); + return; + } + vmcase(OP_RETURN0) { + if (L->hookmask) { + L->top = ra; + halfProtectNT(luaD_poscall(L, ci, 0)); /* no hurry... */ + } + else { /* do the 'poscall' here */ + int nres = ci->nresults; + L->ci = ci->previous; /* back to caller */ + L->top = base - 1; + while (nres-- > 0) + setnilvalue(s2v(L->top++)); /* all results are nil */ + } + return; + } + vmcase(OP_RETURN1) { + if (L->hookmask) { + L->top = ra + 1; + halfProtectNT(luaD_poscall(L, ci, 1)); /* no hurry... */ + } + else { /* do the 'poscall' here */ + int nres = ci->nresults; + L->ci = ci->previous; /* back to caller */ + if (nres == 0) + L->top = base - 1; /* asked for no results */ + else { + setobjs2s(L, base - 1, ra); /* at least this result */ + L->top = base; + while (--nres > 0) /* complete missing results */ + setnilvalue(s2v(L->top++)); + } + } + return; + } + vmcase(OP_FORLOOP) { + if (ttisinteger(s2v(ra + 2))) { /* integer loop? */ + lua_Unsigned count = l_castS2U(ivalue(s2v(ra + 1))); + if (count > 0) { /* still more iterations? */ + lua_Integer step = ivalue(s2v(ra + 2)); + lua_Integer idx = ivalue(s2v(ra)); /* internal index */ + chgivalue(s2v(ra + 1), count - 1); /* update counter */ + idx = intop(+, idx, step); /* add step to index */ + chgivalue(s2v(ra), idx); /* update internal index */ + setivalue(s2v(ra + 3), idx); /* and control variable */ + pc -= GETARG_Bx(i); /* jump back */ + } + } + else if (floatforloop(ra)) /* float loop */ + pc -= GETARG_Bx(i); /* jump back */ + updatetrap(ci); /* allows a signal to break the loop */ + vmbreak; + } + vmcase(OP_FORPREP) { + savestate(L, ci); /* in case of errors */ + if (forprep(L, ra)) + pc += GETARG_Bx(i) + 1; /* skip the loop */ + vmbreak; + } + vmcase(OP_TFORPREP) { + /* create to-be-closed upvalue (if needed) */ + halfProtect(luaF_newtbcupval(L, ra + 3)); + pc += GETARG_Bx(i); + i = *(pc++); /* go to next instruction */ + lua_assert(GET_OPCODE(i) == OP_TFORCALL && ra == RA(i)); + goto l_tforcall; + } + vmcase(OP_TFORCALL) { + l_tforcall: + /* 'ra' has the iterator function, 'ra + 1' has the state, + 'ra + 2' has the control variable, and 'ra + 3' has the + to-be-closed variable. The call will use the stack after + these values (starting at 'ra + 4') + */ + /* push function, state, and control variable */ + memcpy(ra + 4, ra, 3 * sizeof(*ra)); + L->top = ra + 4 + 3; + ProtectNT(luaD_call(L, ra + 4, GETARG_C(i))); /* do the call */ + updatestack(ci); /* stack may have changed */ + i = *(pc++); /* go to next instruction */ + lua_assert(GET_OPCODE(i) == OP_TFORLOOP && ra == RA(i)); + goto l_tforloop; + } + vmcase(OP_TFORLOOP) { + l_tforloop: + if (!ttisnil(s2v(ra + 4))) { /* continue loop? */ + setobjs2s(L, ra + 2, ra + 4); /* save control variable */ + pc -= GETARG_Bx(i); /* jump back */ + } + vmbreak; + } + vmcase(OP_SETLIST) { + int n = GETARG_B(i); + unsigned int last = GETARG_C(i); + Table *h = hvalue(s2v(ra)); + if (n == 0) + n = cast_int(L->top - ra) - 1; /* get up to the top */ + else + L->top = ci->top; /* correct top in case of emergency GC */ + last += n; + if (TESTARG_k(i)) { + last += GETARG_Ax(*pc) * (MAXARG_C + 1); + pc++; + } + if (last > luaH_realasize(h)) /* needs more space? */ + luaH_resizearray(L, h, last); /* preallocate it at once */ + for (; n > 0; n--) { + TValue *val = s2v(ra + n); + setobj2t(L, &h->array[last - 1], val); + last--; + luaC_barrierback(L, obj2gco(h), val); + } + vmbreak; + } + vmcase(OP_CLOSURE) { + Proto *p = cl->p->p[GETARG_Bx(i)]; + halfProtect(pushclosure(L, p, cl->upvals, base, ra)); + checkGC(L, ra + 1); + vmbreak; + } + vmcase(OP_VARARG) { + int n = GETARG_C(i) - 1; /* required results */ + Protect(luaT_getvarargs(L, ci, ra, n)); + vmbreak; + } + vmcase(OP_VARARGPREP) { + luaT_adjustvarargs(L, GETARG_A(i), ci, cl->p); + updatetrap(ci); + if (trap) { + luaD_hookcall(L, ci); + L->oldpc = pc + 1; /* next opcode will be seen as a "new" line */ + } + updatebase(ci); /* function has new base after adjustment */ + vmbreak; + } + vmcase(OP_EXTRAARG) { + lua_assert(0); + vmbreak; + } + } + } +} + +/* }================================================================== */ diff --git a/lua-5.4.0/src/lvm.h b/lua-5.4.0/src/lvm.h new file mode 100644 index 0000000..2d4ac16 --- /dev/null +++ b/lua-5.4.0/src/lvm.h @@ -0,0 +1,134 @@ +/* +** $Id: lvm.h $ +** Lua virtual machine +** See Copyright Notice in lua.h +*/ + +#ifndef lvm_h +#define lvm_h + + +#include "ldo.h" +#include "lobject.h" +#include "ltm.h" + + +#if !defined(LUA_NOCVTN2S) +#define cvt2str(o) ttisnumber(o) +#else +#define cvt2str(o) 0 /* no conversion from numbers to strings */ +#endif + + +#if !defined(LUA_NOCVTS2N) +#define cvt2num(o) ttisstring(o) +#else +#define cvt2num(o) 0 /* no conversion from strings to numbers */ +#endif + + +/* +** You can define LUA_FLOORN2I if you want to convert floats to integers +** by flooring them (instead of raising an error if they are not +** integral values) +*/ +#if !defined(LUA_FLOORN2I) +#define LUA_FLOORN2I F2Ieq +#endif + + +/* +** Rounding modes for float->integer coercion + */ +typedef enum { + F2Ieq, /* no rounding; accepts only integral values */ + F2Ifloor, /* takes the floor of the number */ + F2Iceil /* takes the ceil of the number */ +} F2Imod; + + +/* convert an object to a float (including string coercion) */ +#define tonumber(o,n) \ + (ttisfloat(o) ? (*(n) = fltvalue(o), 1) : luaV_tonumber_(o,n)) + + +/* convert an object to a float (without string coercion) */ +#define tonumberns(o,n) \ + (ttisfloat(o) ? ((n) = fltvalue(o), 1) : \ + (ttisinteger(o) ? ((n) = cast_num(ivalue(o)), 1) : 0)) + + +/* convert an object to an integer (including string coercion) */ +#define tointeger(o,i) \ + (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointeger(o,i,LUA_FLOORN2I)) + + +/* convert an object to an integer (without string coercion) */ +#define tointegerns(o,i) \ + (ttisinteger(o) ? (*(i) = ivalue(o), 1) : luaV_tointegerns(o,i,LUA_FLOORN2I)) + + +#define intop(op,v1,v2) l_castU2S(l_castS2U(v1) op l_castS2U(v2)) + +#define luaV_rawequalobj(t1,t2) luaV_equalobj(NULL,t1,t2) + + +/* +** fast track for 'gettable': if 't' is a table and 't[k]' is present, +** return 1 with 'slot' pointing to 't[k]' (position of final result). +** Otherwise, return 0 (meaning it will have to check metamethod) +** with 'slot' pointing to an empty 't[k]' (if 't' is a table) or NULL +** (otherwise). 'f' is the raw get function to use. +*/ +#define luaV_fastget(L,t,k,slot,f) \ + (!ttistable(t) \ + ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ + : (slot = f(hvalue(t), k), /* else, do raw access */ \ + !isempty(slot))) /* result not empty? */ + + +/* +** Special case of 'luaV_fastget' for integers, inlining the fast case +** of 'luaH_getint'. +*/ +#define luaV_fastgeti(L,t,k,slot) \ + (!ttistable(t) \ + ? (slot = NULL, 0) /* not a table; 'slot' is NULL and result is 0 */ \ + : (slot = (l_castS2U(k) - 1u < hvalue(t)->alimit) \ + ? &hvalue(t)->array[k - 1] : luaH_getint(hvalue(t), k), \ + !isempty(slot))) /* result not empty? */ + + +/* +** Finish a fast set operation (when fast get succeeds). In that case, +** 'slot' points to the place to put the value. +*/ +#define luaV_finishfastset(L,t,slot,v) \ + { setobj2t(L, cast(TValue *,slot), v); \ + luaC_barrierback(L, gcvalue(t), v); } + + + + +LUAI_FUNC int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2); +LUAI_FUNC int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r); +LUAI_FUNC int luaV_tonumber_ (const TValue *obj, lua_Number *n); +LUAI_FUNC int luaV_tointeger (const TValue *obj, lua_Integer *p, F2Imod mode); +LUAI_FUNC int luaV_tointegerns (const TValue *obj, lua_Integer *p, + F2Imod mode); +LUAI_FUNC int luaV_flttointeger (lua_Number n, lua_Integer *p, F2Imod mode); +LUAI_FUNC void luaV_finishget (lua_State *L, const TValue *t, TValue *key, + StkId val, const TValue *slot); +LUAI_FUNC void luaV_finishset (lua_State *L, const TValue *t, TValue *key, + TValue *val, const TValue *slot); +LUAI_FUNC void luaV_finishOp (lua_State *L); +LUAI_FUNC void luaV_execute (lua_State *L, CallInfo *ci); +LUAI_FUNC void luaV_concat (lua_State *L, int total); +LUAI_FUNC lua_Integer luaV_idiv (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Integer luaV_mod (lua_State *L, lua_Integer x, lua_Integer y); +LUAI_FUNC lua_Number luaV_modf (lua_State *L, lua_Number x, lua_Number y); +LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y); +LUAI_FUNC void luaV_objlen (lua_State *L, StkId ra, const TValue *rb); + +#endif diff --git a/lua-5.4.0/src/lzio.c b/lua-5.4.0/src/lzio.c new file mode 100644 index 0000000..cd0a02d --- /dev/null +++ b/lua-5.4.0/src/lzio.c @@ -0,0 +1,68 @@ +/* +** $Id: lzio.c $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + +#define lzio_c +#define LUA_CORE + +#include "lprefix.h" + + +#include + +#include "lua.h" + +#include "llimits.h" +#include "lmem.h" +#include "lstate.h" +#include "lzio.h" + + +int luaZ_fill (ZIO *z) { + size_t size; + lua_State *L = z->L; + const char *buff; + lua_unlock(L); + buff = z->reader(L, z->data, &size); + lua_lock(L); + if (buff == NULL || size == 0) + return EOZ; + z->n = size - 1; /* discount char being returned */ + z->p = buff; + return cast_uchar(*(z->p++)); +} + + +void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, void *data) { + z->L = L; + z->reader = reader; + z->data = data; + z->n = 0; + z->p = NULL; +} + + +/* --------------------------------------------------------------- read --- */ +size_t luaZ_read (ZIO *z, void *b, size_t n) { + while (n) { + size_t m; + if (z->n == 0) { /* no bytes in buffer? */ + if (luaZ_fill(z) == EOZ) /* try to read more */ + return n; /* no more input; return number of missing bytes */ + else { + z->n++; /* luaZ_fill consumed first byte; put it back */ + z->p--; + } + } + m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ + memcpy(b, z->p, m); + z->n -= m; + z->p += m; + b = (char *)b + m; + n -= m; + } + return 0; +} + diff --git a/lua-5.4.0/src/lzio.h b/lua-5.4.0/src/lzio.h new file mode 100644 index 0000000..38f397f --- /dev/null +++ b/lua-5.4.0/src/lzio.h @@ -0,0 +1,66 @@ +/* +** $Id: lzio.h $ +** Buffered streams +** See Copyright Notice in lua.h +*/ + + +#ifndef lzio_h +#define lzio_h + +#include "lua.h" + +#include "lmem.h" + + +#define EOZ (-1) /* end of stream */ + +typedef struct Zio ZIO; + +#define zgetc(z) (((z)->n--)>0 ? cast_uchar(*(z)->p++) : luaZ_fill(z)) + + +typedef struct Mbuffer { + char *buffer; + size_t n; + size_t buffsize; +} Mbuffer; + +#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) + +#define luaZ_buffer(buff) ((buff)->buffer) +#define luaZ_sizebuffer(buff) ((buff)->buffsize) +#define luaZ_bufflen(buff) ((buff)->n) + +#define luaZ_buffremove(buff,i) ((buff)->n -= (i)) +#define luaZ_resetbuffer(buff) ((buff)->n = 0) + + +#define luaZ_resizebuffer(L, buff, size) \ + ((buff)->buffer = luaM_reallocvchar(L, (buff)->buffer, \ + (buff)->buffsize, size), \ + (buff)->buffsize = size) + +#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) + + +LUAI_FUNC void luaZ_init (lua_State *L, ZIO *z, lua_Reader reader, + void *data); +LUAI_FUNC size_t luaZ_read (ZIO* z, void *b, size_t n); /* read next n bytes */ + + + +/* --------- Private Part ------------------ */ + +struct Zio { + size_t n; /* bytes still unread */ + const char *p; /* current position in buffer */ + lua_Reader reader; /* reader function */ + void *data; /* additional data */ + lua_State *L; /* Lua state (for reader) */ +}; + + +LUAI_FUNC int luaZ_fill (ZIO *z); + +#endif diff --git a/main.html b/main.html deleted file mode 100644 index 31d5c05..0000000 --- a/main.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - -

    - -
    -
    - - \ No newline at end of file diff --git a/main.js b/main.js index cef7a55..d940c40 100644 --- a/main.js +++ b/main.js @@ -1,4 +1,22 @@ -var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;if(Module["ENVIRONMENT"]){if(Module["ENVIRONMENT"]==="WEB"){ENVIRONMENT_IS_WEB=true}else if(Module["ENVIRONMENT"]==="WORKER"){ENVIRONMENT_IS_WORKER=true}else if(Module["ENVIRONMENT"]==="NODE"){ENVIRONMENT_IS_NODE=true}else if(Module["ENVIRONMENT"]==="SHELL"){ENVIRONMENT_IS_SHELL=true}else{throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.")}}else{ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=console.log;if(!Module["printErr"])Module["printErr"]=console.warn;var nodeFS;var nodePath;Module["read"]=function read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);return binary?ret:ret.toString()};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};Module["readAsync"]=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.warn(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var Runtime={setTempRet0:(function(value){tempRet0=value;return value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return Module["dynCall_"+sig].apply(null,[ptr].concat(args))}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i>2];var end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*4294967296:+(low>>>0)+ +(high|0)*4294967296;return ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var ABORT=0;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof _malloc==="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(u8Array,idx){var endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function demangle(func){var __cxa_demangle_func=Module["___cxa_demangle"]||Module["__cxa_demangle"];if(__cxa_demangle_func){try{var s=func.substr(1);var len=lengthBytesUTF8(s)+1;var buf=_malloc(len);stringToUTF8(s,buf,len);var status=_malloc(4);var ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return func}Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return func}function demangleAll(text){var regex=/__Z[\w\d_]+/g;return text.replace(regex,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}Module["stackTrace"]=stackTrace;var WASM_PAGE_SIZE=65536;var ASMJS_PAGE_SIZE=16777216;function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var HEAP;var buffer;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBuffer(buf){Module["buffer"]=buffer=buf}function updateGlobalBufferViews(){Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed;var STACK_BASE,STACKTOP,STACK_MAX;var DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which adjusts the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;if(TOTAL_MEMORY0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["fround"]){var froundBuffer=new Float32Array(1);Math["fround"]=(function(x){froundBuffer[0]=x;return froundBuffer[0]})}Math.fround=Math["fround"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];if(!Math["trunc"])Math["trunc"]=(function(x){return x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math["trunc"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_round=Math.round;var Math_min=Math.min;var Math_clz32=Math.clz32;var Math_trunc=Math.trunc;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;function integrateWasmJS(Module){var method=Module["wasmJSMethod"]||"native-wasm";Module["wasmJSMethod"]=method;var wasmTextFile=Module["wasmTextFile"]||"main.wast";var wasmBinaryFile=Module["wasmBinaryFile"]||"main.wasm";var asmjsCodeFile=Module["asmjsCodeFile"]||"main.temp.asm.js";var wasmPageSize=64*1024;var asm2wasmImports={"f64-rem":(function(x,y){return x%y}),"f64-to-int":(function(x){return x|0}),"i32s-div":(function(x,y){return(x|0)/(y|0)|0}),"i32u-div":(function(x,y){return(x>>>0)/(y>>>0)>>>0}),"i32s-rem":(function(x,y){return(x|0)%(y|0)|0}),"i32u-rem":(function(x,y){return(x>>>0)%(y>>>0)>>>0}),"debugger":(function(){debugger})};var info={"global":null,"env":null,"asm2wasm":asm2wasmImports,"parent":Module};var exports=null;function lookupImport(mod,base){var lookup=info;if(mod.indexOf(".")<0){lookup=(lookup||{})[mod]}else{var parts=mod.split(".");lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort("bad lookupImport to ("+mod+")."+base)}return lookup}function mergeMemory(newBuffer){var oldBuffer=Module["buffer"];if(newBuffer.byteLength=0){Module["printErr"]("Memory size incompatibility issues may be due to changing TOTAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set TOTAL_MEMORY at runtime to something smaller than it was at compile time).")}return false}receiveInstance(instance);return exports}function doWasmPolyfill(global,env,providedBuffer,method){if(typeof WasmJS!=="function"){Module["printErr"]("WasmJS not detected - polyfill not bundled?");return false}var wasmJS=WasmJS({});wasmJS["outside"]=Module;wasmJS["info"]=info;wasmJS["lookupImport"]=lookupImport;assert(providedBuffer===Module["buffer"]);info.global=global;info.env=env;assert(providedBuffer===Module["buffer"]);env["memory"]=providedBuffer;assert(env["memory"]instanceof ArrayBuffer);wasmJS["providedTotalMemory"]=Module["buffer"].byteLength;var code;if(method==="interpret-binary"){code=getBinary()}else{code=Module["read"](method=="interpret-asm2wasm"?asmjsCodeFile:wasmTextFile)}var temp;if(method=="interpret-asm2wasm"){temp=wasmJS["_malloc"](code.length+1);wasmJS["writeAsciiToMemory"](code,temp);wasmJS["_load_asm2wasm"](temp)}else if(method==="interpret-s-expr"){temp=wasmJS["_malloc"](code.length+1);wasmJS["writeAsciiToMemory"](code,temp);wasmJS["_load_s_expr2wasm"](temp)}else if(method==="interpret-binary"){temp=wasmJS["_malloc"](code.length);wasmJS["HEAPU8"].set(code,temp);wasmJS["_load_binary2wasm"](temp,code.length)}else{throw"what? "+method}wasmJS["_free"](temp);wasmJS["_instantiate"](temp);if(Module["newBuffer"]){mergeMemory(Module["newBuffer"]);Module["newBuffer"]=null}exports=wasmJS["asmExports"];return exports}Module["asmPreload"]=Module["asm"];Module["reallocBuffer"]=(function(size){var PAGE_MULTIPLE=Module["usingWasm"]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var old=Module["buffer"];var oldSize=old.byteLength;if(Module["usingWasm"]){try{var result=Module["wasmMemory"].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return Module["buffer"]=Module["wasmMemory"].buffer}else{return null}}catch(e){return null}}else{exports["__growWasmMemory"]((size-oldSize)/wasmPageSize);return Module["buffer"]!==old?Module["buffer"]:null}});Module["asm"]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env["table"]){var TABLE_SIZE=Module["wasmTableSize"];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var MAX_TABLE_SIZE=Module["wasmMaxTableSize"];if(typeof WebAssembly==="object"&&typeof WebAssembly.Table==="function"){if(MAX_TABLE_SIZE!==undefined){env["table"]=new WebAssembly.Table({initial:TABLE_SIZE,maximum:MAX_TABLE_SIZE,element:"anyfunc"})}else{env["table"]=new WebAssembly.Table({initial:TABLE_SIZE,element:"anyfunc"})}}else{env["table"]=new Array(TABLE_SIZE)}Module["wasmTable"]=env["table"]}if(!env["memoryBase"]){env["memoryBase"]=Module["STATIC_BASE"]}if(!env["tableBase"]){env["tableBase"]=0}var exports;var methods=method.split(",");for(var i=0;i=0||Module["wasmJSMethod"].indexOf("interpret-asm2wasm")>=0?"main.js.mem":null;var STATIC_BUMP=18704;Module["STATIC_BASE"]=STATIC_BASE;Module["STATIC_BUMP"]=STATIC_BUMP;var tempDoublePtr=STATICTOP;STATICTOP+=16;var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};var ERRNO_MESSAGES={0:"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"};function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var PATH={splitPath:(function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up--;up){parts.unshift("..")}}return parts}),normalize:(function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path}),dirname:(function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir}),basename:(function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)}),extname:(function(path){return PATH.splitPath(path)[3]}),join:(function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))}),join2:(function(l,r){return PATH.normalize(l+"/"+r)}),resolve:(function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter((function(p){return!!p})),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["print"](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module["printErr"](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var MEMFS={ops_table:null,mount:(function(mount){return MEMFS.createNode(null,"/",16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;inode.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.lengthnewSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+lengthe2.timestamp){create.push(key);total++}}));var remove=[];Object.keys(dst.entries).forEach((function(key){var e=dst.entries[key];var e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return callback(null)}var completed=0;var db=src.type==="remote"?src.db:dst.db;var transaction=db.transaction([IDBFS.DB_STORE_NAME],"readwrite");var store=transaction.objectStore(IDBFS.DB_STORE_NAME);function done(err){if(err){if(!done.errored){done.errored=true;return callback(err)}return}if(++completed>=total){return callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type==="local"){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type==="local"){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node}),getMode:(function(path){var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return stat.mode}),realPath:(function(node){var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},flagsToPermissionString:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;if(flags in NODEFS.flagsToPermissionStringMap){return NODEFS.flagsToPermissionStringMap[flags]}else{throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}return node}),rename:(function(oldNode,newDir,newName){var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return 0;var nbuffer=new Buffer(length);var res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw new FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var i=0;i=stream.node.size)return 0;var chunk=stream.node.contents.slice(position,position+length);var ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new Uint8Array(ab),offset);return chunk.size}),write:(function(stream,buffer,offset,length,position){throw new FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}return position})}};STATICTOP+=16;STATICTOP+=16;STATICTOP+=16;var FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e instanceof FS.ErrnoError))throw e+" : "+stackTrace();return ___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}var parts=PATH.normalizeArray(path.split("/").filter((function(p){return!!p})),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length}),hashAddNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var err=FS.mayLookup(parent);if(err){throw new FS.ErrnoError(err,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var readMode=292|73;var writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return FS.isDir(this.mode)})},isDevice:{get:(function(){return FS.isChrdev(this.mode)})}})}var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:(function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags}),flagsToPermissionString:(function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return ERRNO_CODES.EACCES}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return ERRNO_CODES.EACCES}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return ERRNO_CODES.EACCES}return 0}),mayLookup:(function(dir){var err=FS.nodePermissions(dir,"x");if(err)return err;if(!dir.node_ops.lookup)return ERRNO_CODES.EACCES;return 0}),mayCreate:(function(dir,name){try{var node=FS.lookupNode(dir,name);return ERRNO_CODES.EEXIST}catch(e){}return FS.nodePermissions(dir,"wx")}),mayDelete:(function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var err=FS.nodePermissions(dir,"wx");if(err){return err}if(isdir){if(!FS.isDir(node.mode)){return ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return ERRNO_CODES.EISDIR}}return 0}),mayOpen:(function(node,flags){if(!node){return ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return ERRNO_CODES.ELOOP}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return ERRNO_CODES.EISDIR}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return this.flags&1024})}})}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw new FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return dev>>8}),minor:(function(dev){return dev&255}),makedev:(function(ma,mi){return ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return FS.devices[dev]}),getMounts:(function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts}),syncfs:(function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return callback(err)}function done(err){if(err){if(!done.errored){done.errored=true;return doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot}),unmount:(function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(ERRNO_CODES.EINVAL)}var err=FS.mayCreate(parent,name);if(err){throw new FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(ERRNO_CODES.EPERM)}return parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}});var lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize})}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return this.contents.length})}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach((function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}return fn.apply(null,arguments)}}));stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(ERRNO_CODES.EIO)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return 0}),doMsync:(function(addr,stream,len,flags){var buffer=new Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0}),doMknod:(function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return 0}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return 0}),doDup:(function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),getStreamFromFD:(function(){var stream=FS.getStream(SYSCALLS.get());if(!stream)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return stream}),getSocketFromFD:(function(){var socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw new FS.ErrnoError(ERRNO_CODES.EBADF);return socket}),getSocketAddress:(function(allowNull){var addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return null;var info=__read_sockaddr(addrp,addrlen);if(info.errno)throw new FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return info}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall63(which,varargs){SYSCALLS.varargs=varargs;try{var old=SYSCALLS.getStreamFromFD(),suggestFD=SYSCALLS.get();if(old.fd===suggestFD)return suggestFD;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["_memset"]=_memset;function ___syscall10(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){Module["abort"]()}function ___syscall196(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr(),buf=SYSCALLS.get();return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___lock(){}function ___unlock(){}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}function _system(command){___setErrNo(ERRNO_CODES.EAGAIN);return-1}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]);return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?Pointer_stringify(tm_zone):""};var pattern=Pointer_stringify(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":(function(date){return WEEKDAYS[date.tm_wday].substring(0,3)}),"%A":(function(date){return WEEKDAYS[date.tm_wday]}),"%b":(function(date){return MONTHS[date.tm_mon].substring(0,3)}),"%B":(function(date){return MONTHS[date.tm_mon]}),"%C":(function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)}),"%d":(function(date){return leadingNulls(date.tm_mday,2)}),"%e":(function(date){return leadingSomething(date.tm_mday,2," ")}),"%g":(function(date){return getWeekBasedYear(date).toString().substring(2)}),"%G":(function(date){return getWeekBasedYear(date)}),"%H":(function(date){return leadingNulls(date.tm_hour,2)}),"%I":(function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)}),"%j":(function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)}),"%m":(function(date){return leadingNulls(date.tm_mon+1,2)}),"%M":(function(date){return leadingNulls(date.tm_min,2)}),"%n":(function(){return"\n"}),"%p":(function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}}),"%S":(function(date){return leadingNulls(date.tm_sec,2)}),"%t":(function(){return"\t"}),"%u":(function(date){var day=new Date(date.tm_year+1900,date.tm_mon+1,date.tm_mday,0,0,0,0);return day.getDay()||7}),"%U":(function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"}),"%V":(function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)}),"%Z":(function(date){return date.tm_zone}),"%%":(function(){return"%"})};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _realloc(){throw"bad"}Module["_realloc"]=_realloc;Module["_saveSetjmp"]=_saveSetjmp;var _tzname=STATICTOP;STATICTOP+=16;var _daylight=STATICTOP;STATICTOP+=16;var _timezone=STATICTOP;STATICTOP+=16;function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[_timezone>>2]=-(new Date).getTimezoneOffset()*60;var winter=new Date(2e3,0,1);var summer=new Date(2e3,6,1);HEAP32[_daylight>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocate(intArrayFromString(winterName),"i8",ALLOC_NORMAL);var summerNamePtr=allocate(intArrayFromString(summerName),"i8",ALLOC_NORMAL);if(summer.getTimezoneOffset()>2]=winterNamePtr;HEAP32[_tzname+4>>2]=summerNamePtr}else{HEAP32[_tzname>>2]=summerNamePtr;HEAP32[_tzname+4>>2]=winterNamePtr}}function _mktime(tmPtr){_tzset();var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return date.getTime()/1e3|0}function __exit(status){Module["exit"](status)}function _exit(status){__exit(status)}function ___syscall330(which,varargs){SYSCALLS.varargs=varargs;try{var old=SYSCALLS.getStreamFromFD(),suggestFD=SYSCALLS.get(),flags=SYSCALLS.get();assert(!flags);if(old.fd===suggestFD)return-ERRNO_CODES.EINVAL;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall91(which,varargs){SYSCALLS.varargs=varargs;try{var addr=SYSCALLS.get(),len=SYSCALLS.get();var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);SYSCALLS.doMsync(addr,stream,len,info.flags);FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case 21505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};case 21519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0};case 21520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)};case 21523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return 0};default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var ___tm_current=STATICTOP;STATICTOP+=48;var ___tm_timezone=allocate(intArrayFromString("GMT"),"i8",ALLOC_STATIC);function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=(new Date(2e3,6,1)).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=date.getTimezoneOffset()==Math.min(winterOffset,summerOffset)|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[_tzname+(dst?Runtime.QUANTUM_SIZE:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _localtime(time){return _localtime_r(time,___tm_current)}function ___syscall38(which,varargs){SYSCALLS.varargs=varargs;try{var old_path=SYSCALLS.getStr(),new_path=SYSCALLS.getStr();FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}Module["_testSetjmp"]=_testSetjmp;function _longjmp(env,value){Module["setThrew"](env,value||1);throw"longjmp"}function _emscripten_get_now(){abort()}function _emscripten_get_now_is_monotonic(){return ENVIRONMENT_IS_NODE||typeof dateNow!=="undefined"||(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&self["performance"]&&self["performance"]["now"]}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if(clk_id===1&&_emscripten_get_now_is_monotonic()){now=_emscripten_get_now()}else{___setErrNo(ERRNO_CODES.EINVAL);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(){return _clock_gettime.apply(null,arguments)}function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _gmtime(time){return _gmtime_r(time,___tm_current)}function ___map_file(pathname,size){___setErrNo(ERRNO_CODES.EPERM);return-1}var _environ=STATICTOP;STATICTOP+=16;function ___buildEnvironment(env){var MAX_ENV_VALUES=64;var TOTAL_ENV_SIZE=1024;var poolPtr;var envPtr;if(!___buildEnvironment.called){___buildEnvironment.called=true;ENV["USER"]=ENV["LOGNAME"]="web_user";ENV["PATH"]="/";ENV["PWD"]="/";ENV["HOME"]="/home/web_user";ENV["LANG"]="C";ENV["_"]=Module["thisProgram"];poolPtr=allocate(TOTAL_ENV_SIZE,"i8",ALLOC_STATIC);envPtr=allocate(MAX_ENV_VALUES*4,"i8*",ALLOC_STATIC);HEAP32[envPtr>>2]=poolPtr;HEAP32[_environ>>2]=envPtr}else{envPtr=HEAP32[_environ>>2];poolPtr=HEAP32[envPtr>>2]}var strings=[];var totalSize=0;for(var key in env){if(typeof env[key]==="string"){var line=key+"="+env[key];strings.push(line);totalSize+=line.length}}if(totalSize>TOTAL_ENV_SIZE){throw new Error("Environment size exceeded TOTAL_ENV_SIZE!")}var ptrSize=4;for(var i=0;i>2]=poolPtr;poolPtr+=line.length+1}HEAP32[envPtr+strings.length*ptrSize>>2]=0}var ENV={};function _getenv(name){if(name===0)return 0;name=Pointer_stringify(name);if(!ENV.hasOwnProperty(name))return 0;if(_getenv.ret)_free(_getenv.ret);_getenv.ret=allocate(intArrayFromString(ENV[name]),"i8",ALLOC_NORMAL);return _getenv.ret}function ___syscall5(which,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(),flags=SYSCALLS.get(),mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var _llvm_pow_f64=Math_pow;Module["_sbrk"]=_sbrk;function _difftime(time1,time0){return time1-time0}Module["_llvm_bswap_i32"]=_llvm_bswap_i32;function ___syscall40(which,varargs){SYSCALLS.varargs=varargs;try{var path=SYSCALLS.getStr();FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall221(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),cmd=SYSCALLS.get();switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-ERRNO_CODES.EINVAL}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd};case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0};case 12:case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0};case 13:case 14:case 13:case 14:return 0;case 16:case 8:return-ERRNO_CODES.EINVAL;case 9:___setErrNo(ERRNO_CODES.EINVAL);return-1;default:{return-ERRNO_CODES.EINVAL}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall145(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return SYSCALLS.doReadv(stream,iov,iovcnt)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}FS.staticInit();__ATINIT__.unshift((function(){if(!Module["noFSInit"]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module["FS_createFolder"]=FS.createFolder;Module["FS_createPath"]=FS.createPath;Module["FS_createDataFile"]=FS.createDataFile;Module["FS_createPreloadedFile"]=FS.createPreloadedFile;Module["FS_createLazyFile"]=FS.createLazyFile;Module["FS_createLink"]=FS.createLink;Module["FS_createDevice"]=FS.createDevice;Module["FS_unlink"]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var fs=require("fs");var NODEJS_PATH=require("path");NODEFS.staticInit()}if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function _emscripten_get_now_actual(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else if(typeof self==="object"&&self["performance"]&&typeof self["performance"]["now"]==="function"){_emscripten_get_now=(function(){return self["performance"]["now"]()})}else if(typeof performance==="object"&&typeof performance["now"]==="function"){_emscripten_get_now=(function(){return performance["now"]()})}else{_emscripten_get_now=Date.now}___buildEnvironment(ENV);DYNAMICTOP_PTR=allocate(1,"i32",ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module["wasmTableSize"]=294;Module["wasmMaxTableSize"]=294;function invoke_ii(index,a1){try{return Module["dynCall_ii"](index,a1)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiii(index,a1,a2,a3){try{return Module["dynCall_iiii"](index,a1,a2,a3)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_vii(index,a1,a2){try{Module["dynCall_vii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iii(index,a1,a2){try{return Module["dynCall_iii"](index,a1,a2)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){try{return Module["dynCall_iiiii"](index,a1,a2,a3,a4)}catch(e){if(typeof e!=="number"&&e!=="longjmp")throw e;Module["setThrew"](1,0)}}Module.asmGlobalArg={"Math":Math,"Int8Array":Int8Array,"Int16Array":Int16Array,"Int32Array":Int32Array,"Uint8Array":Uint8Array,"Uint16Array":Uint16Array,"Uint32Array":Uint32Array,"Float32Array":Float32Array,"Float64Array":Float64Array,"NaN":NaN,"Infinity":Infinity};Module.asmLibraryArg={"abort":abort,"assert":assert,"enlargeMemory":enlargeMemory,"getTotalMemory":getTotalMemory,"abortOnCannotGrowMemory":abortOnCannotGrowMemory,"invoke_ii":invoke_ii,"invoke_iiii":invoke_iiii,"invoke_vii":invoke_vii,"invoke_iii":invoke_iii,"invoke_iiiii":invoke_iiiii,"___syscall221":___syscall221,"___lock":___lock,"_emscripten_get_now_is_monotonic":_emscripten_get_now_is_monotonic,"_llvm_pow_f64":_llvm_pow_f64,"___syscall63":___syscall63,"_abort":_abort,"___syscall40":___syscall40,"_difftime":_difftime,"_system":_system,"___buildEnvironment":___buildEnvironment,"_longjmp":_longjmp,"__addDays":__addDays,"_localtime_r":_localtime_r,"_tzset":_tzset,"___setErrNo":___setErrNo,"___syscall330":___syscall330,"___syscall196":___syscall196,"_emscripten_memcpy_big":_emscripten_memcpy_big,"__exit":__exit,"_mktime":_mktime,"_strftime":_strftime,"_clock":_clock,"__arraySum":__arraySum,"___syscall91":___syscall91,"_gmtime":_gmtime,"_getenv":_getenv,"___map_file":___map_file,"___syscall54":___syscall54,"___unlock":___unlock,"__isLeapYear":__isLeapYear,"___syscall38":___syscall38,"_emscripten_get_now":_emscripten_get_now,"___syscall10":___syscall10,"_gmtime_r":_gmtime_r,"_clock_gettime":_clock_gettime,"___syscall6":___syscall6,"___syscall5":___syscall5,"___clock_gettime":___clock_gettime,"_time":_time,"___syscall140":___syscall140,"_localtime":_localtime,"_exit":_exit,"___syscall145":___syscall145,"___syscall146":___syscall146,"DYNAMICTOP_PTR":DYNAMICTOP_PTR,"tempDoublePtr":tempDoublePtr,"ABORT":ABORT,"STACKTOP":STACKTOP,"STACK_MAX":STACK_MAX};var asm=Module["asm"](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module["asm"]=asm;var _testSetjmp=Module["_testSetjmp"]=(function(){return Module["asm"]["_testSetjmp"].apply(null,arguments)});var _saveSetjmp=Module["_saveSetjmp"]=(function(){return Module["asm"]["_saveSetjmp"].apply(null,arguments)});var getTempRet0=Module["getTempRet0"]=(function(){return Module["asm"]["getTempRet0"].apply(null,arguments)});var _free=Module["_free"]=(function(){return Module["asm"]["_free"].apply(null,arguments)});var runPostSets=Module["runPostSets"]=(function(){return Module["asm"]["runPostSets"].apply(null,arguments)});var setTempRet0=Module["setTempRet0"]=(function(){return Module["asm"]["setTempRet0"].apply(null,arguments)});var _realloc=Module["_realloc"]=(function(){return Module["asm"]["_realloc"].apply(null,arguments)});var ___errno_location=Module["___errno_location"]=(function(){return Module["asm"]["___errno_location"].apply(null,arguments)});var stackSave=Module["stackSave"]=(function(){return Module["asm"]["stackSave"].apply(null,arguments)});var _memset=Module["_memset"]=(function(){return Module["asm"]["_memset"].apply(null,arguments)});var _malloc=Module["_malloc"]=(function(){return Module["asm"]["_malloc"].apply(null,arguments)});var establishStackSpace=Module["establishStackSpace"]=(function(){return Module["asm"]["establishStackSpace"].apply(null,arguments)});var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=(function(){return Module["asm"]["_emscripten_get_global_libc"].apply(null,arguments)});var _memcpy=Module["_memcpy"]=(function(){return Module["asm"]["_memcpy"].apply(null,arguments)});var _run_lua=Module["_run_lua"]=(function(){return Module["asm"]["_run_lua"].apply(null,arguments)});var setThrew=Module["setThrew"]=(function(){return Module["asm"]["setThrew"].apply(null,arguments)});var _sbrk=Module["_sbrk"]=(function(){return Module["asm"]["_sbrk"].apply(null,arguments)});var _fflush=Module["_fflush"]=(function(){return Module["asm"]["_fflush"].apply(null,arguments)});var stackRestore=Module["stackRestore"]=(function(){return Module["asm"]["stackRestore"].apply(null,arguments)});var _llvm_bswap_i32=Module["_llvm_bswap_i32"]=(function(){return Module["asm"]["_llvm_bswap_i32"].apply(null,arguments)});var stackAlloc=Module["stackAlloc"]=(function(){return Module["asm"]["stackAlloc"].apply(null,arguments)});var dynCall_ii=Module["dynCall_ii"]=(function(){return Module["asm"]["dynCall_ii"].apply(null,arguments)});var dynCall_iiii=Module["dynCall_iiii"]=(function(){return Module["asm"]["dynCall_iiii"].apply(null,arguments)});var dynCall_vii=Module["dynCall_vii"]=(function(){return Module["asm"]["dynCall_vii"].apply(null,arguments)});var dynCall_iii=Module["dynCall_iii"]=(function(){return Module["asm"]["dynCall_iii"].apply(null,arguments)});var dynCall_iiiii=Module["dynCall_iiiii"]=(function(){return Module["asm"]["dynCall_iiiii"].apply(null,arguments)});Runtime.stackAlloc=Module["stackAlloc"];Runtime.stackSave=Module["stackSave"];Runtime.stackRestore=Module["stackRestore"];Runtime.establishStackSpace=Module["establishStackSpace"];Runtime.setTempRet0=Module["setTempRet0"];Runtime.getTempRet0=Module["getTempRet0"];Module["asm"]=asm;if(memoryInitializer){if(typeof Module["locateFile"]==="function"){memoryInitializer=Module["locateFile"](memoryInitializer)}else if(Module["memoryInitializerPrefixURL"]){memoryInitializer=Module["memoryInitializerPrefixURL"]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var data=Module["readBinary"](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency("memory initializer");var applyMemoryInitializer=(function(data){if(data.byteLength)data=new Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module["memoryInitializerRequest"])delete Module["memoryInitializerRequest"].response;removeRunDependency("memory initializer")});function doBrowserLoad(){Module["readAsync"](memoryInitializer,applyMemoryInitializer,(function(){throw"could not load memory initializer "+memoryInitializer}))}if(Module["memoryInitializerRequest"]){function useRequest(){var request=Module["memoryInitializerRequest"];if(request.status!==200&&request.status!==0){console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+request.status+", retrying "+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module["memoryInitializerRequest"].response){setTimeout(useRequest,0)}else{Module["memoryInitializerRequest"].addEventListener("load",useRequest)}}else{doBrowserLoad()}}}function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["exit"](status)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}run() +var initWasmModule = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(initWasmModule) { + initWasmModule = initWasmModule || {}; +var Module=typeof initWasmModule!=="undefined"?initWasmModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":203,"maximum":203+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var STACK_BASE=5266352,DYNAMIC_BASE=5266352,DYNAMICTOP_PTR=23312;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="main.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else _emscripten_get_now=function(){return performance.now()};var _emscripten_get_now_is_monotonic=true;function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now()}else{setErrNo(28);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(a0,a1){return _clock_gettime(a0,a1)}function ___map_file(pathname,size){setErrNo(63);return-1}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node},getFileDataAsRegularArray:function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_dup2(oldfd,suggestFD){try{var old=SYSCALLS.getStreamFromFD(oldfd);if(old.fd===suggestFD)return suggestFD;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_dup3(fd,suggestFD,flags){try{var old=SYSCALLS.getStreamFromFD(fd);if(old.fd===suggestFD)return-28;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMunmap(addr,len){if((addr|0)===-1||len===0){return-28}var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);if(info.prot&2){SYSCALLS.doMsync(addr,stream,len,info.flags,info.offset)}FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}function ___sys_munmap(addr,len){try{return syscallMunmap(addr,len)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rename(old_path,new_path){try{old_path=SYSCALLS.getStr(old_path);new_path=SYSCALLS.getStr(new_path);FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_unlink(path){try{path=SYSCALLS.getStr(path);FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){abort()}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}function _difftime(time1,time0){return time1-time0}function _emscripten_get_sbrk_ptr(){return 23312}var setjmpId=0;function _saveSetjmp(env,label,table,size){env=env|0;label=label|0;table=table|0;size=size|0;var i=0;setjmpId=setjmpId+1|0;HEAP32[env>>2]=setjmpId;while((i|0)<(size|0)){if((HEAP32[table+(i<<3)>>2]|0)==0){HEAP32[table+(i<<3)>>2]=setjmpId;HEAP32[table+((i<<3)+4)>>2]=label;HEAP32[table+((i<<3)+8)>>2]=0;setTempRet0(size|0);return table|0}i=i+1|0}size=size*2|0;table=_realloc(table|0,8*(size+1|0)|0)|0;table=_saveSetjmp(env|0,label|0,table|0,size|0)|0;setTempRet0(size|0);return table|0}function _testSetjmp(id,table,size){id=id|0;table=table|0;size=size|0;var i=0,curr=0;while((i|0)<(size|0)){curr=HEAP32[table+(i<<3)>>2]|0;if((curr|0)==0)break;if((curr|0)==(id|0)){return HEAP32[table+((i<<3)+4)>>2]|0}i=i+1|0}return 0}function _longjmp(env,value){_setThrew(env,value||1);throw"longjmp"}function _emscripten_longjmp(env,value){_longjmp(env,value)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ENV={};function __getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8","_":__getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _getTempRet0(){return getTempRet0()|0}var ___tm_current=23328;var ___tm_timezone=(stringToUTF8("GMT",23376,4),23376);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _gmtime(time){return _gmtime_r(time,___tm_current)}function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summer.getTimezoneOffset()>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _localtime(time){return _localtime_r(time,___tm_current)}function _mktime(tmPtr){_tzset();var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return date.getTime()/1e3|0}function _setTempRet0($i){setTempRet0($i|0)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _system(command){if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=function(ret,sig){return ret<<8|sig};if(ret.status===null){var signalToNumber=function(sig){switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;setErrNo(6);return-1}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"__clock_gettime":___clock_gettime,"__map_file":___map_file,"__sys_dup2":___sys_dup2,"__sys_dup3":___sys_dup3,"__sys_fcntl64":___sys_fcntl64,"__sys_ioctl":___sys_ioctl,"__sys_lstat64":___sys_lstat64,"__sys_munmap":___sys_munmap,"__sys_open":___sys_open,"__sys_rename":___sys_rename,"__sys_rmdir":___sys_rmdir,"__sys_unlink":___sys_unlink,"abort":_abort,"clock":_clock,"difftime":_difftime,"emscripten_get_sbrk_ptr":_emscripten_get_sbrk_ptr,"emscripten_longjmp":_emscripten_longjmp,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"environ_get":_environ_get,"environ_sizes_get":_environ_sizes_get,"exit":_exit,"fd_close":_fd_close,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_write":_fd_write,"getTempRet0":_getTempRet0,"gmtime":_gmtime,"invoke_vii":invoke_vii,"localtime":_localtime,"memory":wasmMemory,"mktime":_mktime,"saveSetjmp":_saveSetjmp,"setTempRet0":_setTempRet0,"strftime":_strftime,"system":_system,"table":wasmTable,"testSetjmp":_testSetjmp,"time":_time};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _run_lua=Module["_run_lua"]=function(){return(_run_lua=Module["_run_lua"]=Module["asm"]["run_lua"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var _realloc=Module["_realloc"]=function(){return(_realloc=Module["_realloc"]=Module["asm"]["realloc"]).apply(null,arguments)};var __get_tzname=Module["__get_tzname"]=function(){return(__get_tzname=Module["__get_tzname"]=Module["asm"]["_get_tzname"]).apply(null,arguments)};var __get_daylight=Module["__get_daylight"]=function(){return(__get_daylight=Module["__get_daylight"]=Module["asm"]["_get_daylight"]).apply(null,arguments)};var __get_timezone=Module["__get_timezone"]=function(){return(__get_timezone=Module["__get_timezone"]=Module["asm"]["_get_timezone"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["setThrew"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["dynCall_vii"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var __growWasmMemory=Module["__growWasmMemory"]=function(){return(__growWasmMemory=Module["__growWasmMemory"]=Module["asm"]["__growWasmMemory"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["dynCall_iii"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["dynCall_iiii"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["dynCall_iiiii"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["dynCall_ii"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["dynCall_viii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["dynCall_iidiiii"]).apply(null,arguments)};function invoke_vii(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&noExitRuntime&&status===0){return}if(noExitRuntime){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); + + return initWasmModule.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = initWasmModule; + else if (typeof define === 'function' && define['amd']) + define([], function() { return initWasmModule; }); + else if (typeof exports === 'object') + exports["initWasmModule"] = initWasmModule; + \ No newline at end of file diff --git a/main.wasm b/main.wasm index ff5d5cc0c388bba7cec7d560d9ecdd6a0d6b9e48..7822cc52296b4cfddc82b6a0937e82bb6dbaf107 100644 GIT binary patch literal 239035 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 literal 246887 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 z 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 Date: Tue, 21 Jul 2020 16:21:39 +0800 Subject: [PATCH 2/4] update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 748e9e4..c84e64c 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,10 @@ Currently test on Firefox 52.0 but probably works on other platforms as well. * Extensible debugger hooks for easy on-target debugging. Thanks to [rawgit](http://rawgit.com/) for hosting. + +# Files +- main.js, main.wasm: auto-generated +- main.c: export lua C function to javascript +- index.html: test page and useage example +- makefile: emcc config (which function to export, init function name, ...etc.) +- lua-: lua source code without any modify \ No newline at end of file From f7507dcf7f6745da7335886e9e4b7f793412f187 Mon Sep 17 00:00:00 2001 From: Dreagonmon <531486058@qq.com> Date: Tue, 21 Jul 2020 17:22:22 +0800 Subject: [PATCH 3/4] add library demo --- demolib.c | 14 ++++++++++++++ index.html | 4 +++- main.c | 7 ++++++- main.js | 2 +- main.wasm | Bin 239035 -> 239224 bytes 5 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 demolib.c diff --git a/demolib.c b/demolib.c new file mode 100644 index 0000000..ca2386b --- /dev/null +++ b/demolib.c @@ -0,0 +1,14 @@ +#include +/* use emscripten to execute javascript */ +#include "emscripten.h" + +EM_JS(void, js_alert, (const char* message), { + alert(UTF8ToString(message)); +}); + +static int lua_alert(lua_State* L) { + size_t len = 0; + const char * message = lua_tolstring(L, 1, &len); + js_alert(message); + return 0; +} \ No newline at end of file diff --git a/index.html b/index.html index 51bc247..d219e0a 100644 --- a/index.html +++ b/index.html @@ -51,9 +51,11 @@ function hello_lua() print "Hello Lua!" print(_VERSION) + alert("this alert is from lua") end -hello_lua() +hello_lua() +return "this is return value"
    diff --git a/main.c b/main.c index 45d1027..f38b629 100644 --- a/main.c +++ b/main.c @@ -2,9 +2,14 @@ #include "lua.h" #include #include +#include "demolib.c" int run_lua(const char* script) { lua_State* lua = luaL_newstate(); + + /* register demo library written in C, and call javascript */ + lua_register(lua,"alert",lua_alert); // lua_alert function defined in demolib.c + luaL_openlibs(lua); int res = luaL_dostring(lua, script); @@ -12,7 +17,7 @@ int run_lua(const char* script) { size_t len = 0; const char* value = lua_tolstring(lua, lua_gettop(lua), &len); - printf("%s\n", value); + printf("return value: %s\n", value); lua_close(lua); diff --git a/main.js b/main.js index d940c40..c5d4d39 100644 --- a/main.js +++ b/main.js @@ -6,7 +6,7 @@ var initWasmModule = (function() { function(initWasmModule) { initWasmModule = initWasmModule || {}; -var Module=typeof initWasmModule!=="undefined"?initWasmModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":203,"maximum":203+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var STACK_BASE=5266352,DYNAMIC_BASE=5266352,DYNAMICTOP_PTR=23312;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="main.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else _emscripten_get_now=function(){return performance.now()};var _emscripten_get_now_is_monotonic=true;function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now()}else{setErrNo(28);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(a0,a1){return _clock_gettime(a0,a1)}function ___map_file(pathname,size){setErrNo(63);return-1}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node},getFileDataAsRegularArray:function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_dup2(oldfd,suggestFD){try{var old=SYSCALLS.getStreamFromFD(oldfd);if(old.fd===suggestFD)return suggestFD;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_dup3(fd,suggestFD,flags){try{var old=SYSCALLS.getStreamFromFD(fd);if(old.fd===suggestFD)return-28;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMunmap(addr,len){if((addr|0)===-1||len===0){return-28}var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);if(info.prot&2){SYSCALLS.doMsync(addr,stream,len,info.flags,info.offset)}FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}function ___sys_munmap(addr,len){try{return syscallMunmap(addr,len)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rename(old_path,new_path){try{old_path=SYSCALLS.getStr(old_path);new_path=SYSCALLS.getStr(new_path);FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_unlink(path){try{path=SYSCALLS.getStr(path);FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){abort()}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}function _difftime(time1,time0){return time1-time0}function _emscripten_get_sbrk_ptr(){return 23312}var setjmpId=0;function _saveSetjmp(env,label,table,size){env=env|0;label=label|0;table=table|0;size=size|0;var i=0;setjmpId=setjmpId+1|0;HEAP32[env>>2]=setjmpId;while((i|0)<(size|0)){if((HEAP32[table+(i<<3)>>2]|0)==0){HEAP32[table+(i<<3)>>2]=setjmpId;HEAP32[table+((i<<3)+4)>>2]=label;HEAP32[table+((i<<3)+8)>>2]=0;setTempRet0(size|0);return table|0}i=i+1|0}size=size*2|0;table=_realloc(table|0,8*(size+1|0)|0)|0;table=_saveSetjmp(env|0,label|0,table|0,size|0)|0;setTempRet0(size|0);return table|0}function _testSetjmp(id,table,size){id=id|0;table=table|0;size=size|0;var i=0,curr=0;while((i|0)<(size|0)){curr=HEAP32[table+(i<<3)>>2]|0;if((curr|0)==0)break;if((curr|0)==(id|0)){return HEAP32[table+((i<<3)+4)>>2]|0}i=i+1|0}return 0}function _longjmp(env,value){_setThrew(env,value||1);throw"longjmp"}function _emscripten_longjmp(env,value){_longjmp(env,value)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ENV={};function __getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8","_":__getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _getTempRet0(){return getTempRet0()|0}var ___tm_current=23328;var ___tm_timezone=(stringToUTF8("GMT",23376,4),23376);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _gmtime(time){return _gmtime_r(time,___tm_current)}function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summer.getTimezoneOffset()>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _localtime(time){return _localtime_r(time,___tm_current)}function _mktime(tmPtr){_tzset();var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return date.getTime()/1e3|0}function _setTempRet0($i){setTempRet0($i|0)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _system(command){if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=function(ret,sig){return ret<<8|sig};if(ret.status===null){var signalToNumber=function(sig){switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;setErrNo(6);return-1}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"__clock_gettime":___clock_gettime,"__map_file":___map_file,"__sys_dup2":___sys_dup2,"__sys_dup3":___sys_dup3,"__sys_fcntl64":___sys_fcntl64,"__sys_ioctl":___sys_ioctl,"__sys_lstat64":___sys_lstat64,"__sys_munmap":___sys_munmap,"__sys_open":___sys_open,"__sys_rename":___sys_rename,"__sys_rmdir":___sys_rmdir,"__sys_unlink":___sys_unlink,"abort":_abort,"clock":_clock,"difftime":_difftime,"emscripten_get_sbrk_ptr":_emscripten_get_sbrk_ptr,"emscripten_longjmp":_emscripten_longjmp,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"environ_get":_environ_get,"environ_sizes_get":_environ_sizes_get,"exit":_exit,"fd_close":_fd_close,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_write":_fd_write,"getTempRet0":_getTempRet0,"gmtime":_gmtime,"invoke_vii":invoke_vii,"localtime":_localtime,"memory":wasmMemory,"mktime":_mktime,"saveSetjmp":_saveSetjmp,"setTempRet0":_setTempRet0,"strftime":_strftime,"system":_system,"table":wasmTable,"testSetjmp":_testSetjmp,"time":_time};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var _run_lua=Module["_run_lua"]=function(){return(_run_lua=Module["_run_lua"]=Module["asm"]["run_lua"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var _realloc=Module["_realloc"]=function(){return(_realloc=Module["_realloc"]=Module["asm"]["realloc"]).apply(null,arguments)};var __get_tzname=Module["__get_tzname"]=function(){return(__get_tzname=Module["__get_tzname"]=Module["asm"]["_get_tzname"]).apply(null,arguments)};var __get_daylight=Module["__get_daylight"]=function(){return(__get_daylight=Module["__get_daylight"]=Module["asm"]["_get_daylight"]).apply(null,arguments)};var __get_timezone=Module["__get_timezone"]=function(){return(__get_timezone=Module["__get_timezone"]=Module["asm"]["_get_timezone"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["setThrew"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["dynCall_vii"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var __growWasmMemory=Module["__growWasmMemory"]=function(){return(__growWasmMemory=Module["__growWasmMemory"]=Module["asm"]["__growWasmMemory"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["dynCall_iii"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["dynCall_iiii"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["dynCall_iiiii"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["dynCall_ii"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["dynCall_viii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["dynCall_iidiiii"]).apply(null,arguments)};function invoke_vii(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&noExitRuntime&&status===0){return}if(noExitRuntime){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); +var Module=typeof initWasmModule!=="undefined"?initWasmModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}function convertJsFunctionToWasm(func,sig){if(typeof WebAssembly.Function==="function"){var typeNames={"i":"i32","j":"i64","f":"f32","d":"f64"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":204,"maximum":204+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function getCFunc(ident){var func=Module["_"+ident];assert(func,"Cannot call unknown function "+ident+", make sure it is exported");return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string")return UTF8ToString(ret);if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var STACK_BASE=5266432,DYNAMIC_BASE=5266432,DYNAMICTOP_PTR=23392;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="main.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)&&typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"env":asmLibraryArg,"wasi_snapshot_preview1":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;function js_alert(message){alert(UTF8ToString(message))}__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=function(){var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else if(typeof dateNow!=="undefined"){_emscripten_get_now=dateNow}else _emscripten_get_now=function(){return performance.now()};var _emscripten_get_now_is_monotonic=true;function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}function _clock_gettime(clk_id,tp){var now;if(clk_id===0){now=Date.now()}else if((clk_id===1||clk_id===4)&&_emscripten_get_now_is_monotonic){now=_emscripten_get_now()}else{setErrNo(28);return-1}HEAP32[tp>>2]=now/1e3|0;HEAP32[tp+4>>2]=now%1e3*1e3*1e3|0;return 0}function ___clock_gettime(a0,a1){return _clock_gettime(a0,a1)}function ___map_file(pathname,size){setErrNo(63);return-1}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return node},getFileDataAsRegularArray:function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_dup2(oldfd,suggestFD){try{var old=SYSCALLS.getStreamFromFD(oldfd);if(old.fd===suggestFD)return suggestFD;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_dup3(fd,suggestFD,flags){try{var old=SYSCALLS.getStreamFromFD(fd);if(old.fd===suggestFD)return-28;return SYSCALLS.doDup(old.path,old.flags,suggestFD)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function syscallMunmap(addr,len){if((addr|0)===-1||len===0){return-28}var info=SYSCALLS.mappings[addr];if(!info)return 0;if(len===info.len){var stream=FS.getStream(info.fd);if(info.prot&2){SYSCALLS.doMsync(addr,stream,len,info.flags,info.offset)}FS.munmap(stream);SYSCALLS.mappings[addr]=null;if(info.allocated){_free(info.malloc)}}return 0}function ___sys_munmap(addr,len){try{return syscallMunmap(addr,len)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=SYSCALLS.get();var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rename(old_path,new_path){try{old_path=SYSCALLS.getStr(old_path);new_path=SYSCALLS.getStr(new_path);FS.rename(old_path,new_path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_unlink(path){try{path=SYSCALLS.getStr(path);FS.unlink(path);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function _abort(){abort()}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}function _difftime(time1,time0){return time1-time0}function _emscripten_get_sbrk_ptr(){return 23392}var setjmpId=0;function _saveSetjmp(env,label,table,size){env=env|0;label=label|0;table=table|0;size=size|0;var i=0;setjmpId=setjmpId+1|0;HEAP32[env>>2]=setjmpId;while((i|0)<(size|0)){if((HEAP32[table+(i<<3)>>2]|0)==0){HEAP32[table+(i<<3)>>2]=setjmpId;HEAP32[table+((i<<3)+4)>>2]=label;HEAP32[table+((i<<3)+8)>>2]=0;setTempRet0(size|0);return table|0}i=i+1|0}size=size*2|0;table=_realloc(table|0,8*(size+1|0)|0)|0;table=_saveSetjmp(env|0,label|0,table|0,size|0)|0;setTempRet0(size|0);return table|0}function _testSetjmp(id,table,size){id=id|0;table=table|0;size=size|0;var i=0,curr=0;while((i|0)<(size|0)){curr=HEAP32[table+(i<<3)>>2]|0;if((curr|0)==0)break;if((curr|0)==(id|0)){return HEAP32[table+((i<<3)+4)>>2]|0}i=i+1|0}return 0}function _longjmp(env,value){_setThrew(env,value||1);throw"longjmp"}function _emscripten_longjmp(env,value){_longjmp(env,value)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){requestedSize=requestedSize>>>0;abortOnCannotGrowMemory(requestedSize)}var ENV={};function __getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8","_":__getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _getTempRet0(){return getTempRet0()|0}var ___tm_current=23408;var ___tm_timezone=(stringToUTF8("GMT",23456,4),23456);function _gmtime_r(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return tmPtr}function _gmtime(time){return _gmtime_r(time,___tm_current)}function _tzset(){if(_tzset.called)return;_tzset.called=true;HEAP32[__get_timezone()>>2]=(new Date).getTimezoneOffset()*60;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);HEAP32[__get_daylight()>>2]=Number(winter.getTimezoneOffset()!=summer.getTimezoneOffset());function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summer.getTimezoneOffset()>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _localtime_r(time,tmPtr){_tzset();var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst;var zonePtr=HEAP32[__get_tzname()+(dst?4:0)>>2];HEAP32[tmPtr+40>>2]=zonePtr;return tmPtr}function _localtime(time){return _localtime_r(time,___tm_current)}function _mktime(tmPtr){_tzset();var date=new Date(HEAP32[tmPtr+20>>2]+1900,HEAP32[tmPtr+16>>2],HEAP32[tmPtr+12>>2],HEAP32[tmPtr+8>>2],HEAP32[tmPtr+4>>2],HEAP32[tmPtr>>2],0);var dst=HEAP32[tmPtr+32>>2];var guessedOffset=date.getTimezoneOffset();var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dstOffset=Math.min(winterOffset,summerOffset);if(dst<0){HEAP32[tmPtr+32>>2]=Number(summerOffset!=winterOffset&&dstOffset==guessedOffset)}else if(dst>0!=(dstOffset==guessedOffset)){var nonDstOffset=Math.max(winterOffset,summerOffset);var trueOffset=dst>0?dstOffset:nonDstOffset;date.setTime(date.getTime()+(trueOffset-guessedOffset)*6e4)}HEAP32[tmPtr+24>>2]=date.getDay();var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;return date.getTime()/1e3|0}function _setTempRet0($i){setTempRet0($i|0)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value==="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var janFirst=new Date(date.tm_year+1900,0,1);var firstSunday=janFirst.getDay()===0?janFirst:__addDays(janFirst,7-janFirst.getDay());var endDate=new Date(date.tm_year+1900,date.tm_mon,date.tm_mday);if(compareByDay(firstSunday,endDate)<0){var februaryFirstUntilEndMonth=__arraySum(__isLeapYear(endDate.getFullYear())?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,endDate.getMonth()-1)-31;var firstSundayUntilEndJanuary=31-firstSunday.getDate();var days=firstSundayUntilEndJanuary+februaryFirstUntilEndMonth+endDate.getDate();return leadingNulls(Math.ceil(days/7),2)}return compareByDay(firstSunday,janFirst)===0?"01":"00"},"%V":function(date){var janFourthThisYear=new Date(date.tm_year+1900,0,4);var janFourthNextYear=new Date(date.tm_year+1901,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);var endDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);if(compareByDay(endDate,firstWeekStartThisYear)<0){return"53"}if(compareByDay(firstWeekStartNextYear,endDate)<=0){return"01"}var daysDifference;if(firstWeekStartThisYear.getFullYear()=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};for(var rule in EXPANSION_RULES_2){if(pattern.indexOf(rule)>=0){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _system(command){if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=function(ret,sig){return ret<<8|sig};if(ret.status===null){var signalToNumber=function(sig){switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;setErrNo(6);return-1}function _time(ptr){var ret=Date.now()/1e3|0;if(ptr){HEAP32[ptr>>2]=ret}return ret}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"__clock_gettime":___clock_gettime,"__map_file":___map_file,"__sys_dup2":___sys_dup2,"__sys_dup3":___sys_dup3,"__sys_fcntl64":___sys_fcntl64,"__sys_ioctl":___sys_ioctl,"__sys_lstat64":___sys_lstat64,"__sys_munmap":___sys_munmap,"__sys_open":___sys_open,"__sys_rename":___sys_rename,"__sys_rmdir":___sys_rmdir,"__sys_unlink":___sys_unlink,"abort":_abort,"clock":_clock,"difftime":_difftime,"emscripten_get_sbrk_ptr":_emscripten_get_sbrk_ptr,"emscripten_longjmp":_emscripten_longjmp,"emscripten_memcpy_big":_emscripten_memcpy_big,"emscripten_resize_heap":_emscripten_resize_heap,"environ_get":_environ_get,"environ_sizes_get":_environ_sizes_get,"exit":_exit,"fd_close":_fd_close,"fd_read":_fd_read,"fd_seek":_fd_seek,"fd_write":_fd_write,"getTempRet0":_getTempRet0,"gmtime":_gmtime,"invoke_vii":invoke_vii,"js_alert":js_alert,"localtime":_localtime,"memory":wasmMemory,"mktime":_mktime,"saveSetjmp":_saveSetjmp,"setTempRet0":_setTempRet0,"strftime":_strftime,"system":_system,"table":wasmTable,"testSetjmp":_testSetjmp,"time":_time};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["__wasm_call_ctors"]).apply(null,arguments)};var ___em_js__js_alert=Module["___em_js__js_alert"]=function(){return(___em_js__js_alert=Module["___em_js__js_alert"]=Module["asm"]["__em_js__js_alert"]).apply(null,arguments)};var _run_lua=Module["_run_lua"]=function(){return(_run_lua=Module["_run_lua"]=Module["asm"]["run_lua"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["malloc"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["free"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["__errno_location"]).apply(null,arguments)};var _realloc=Module["_realloc"]=function(){return(_realloc=Module["_realloc"]=Module["asm"]["realloc"]).apply(null,arguments)};var __get_tzname=Module["__get_tzname"]=function(){return(__get_tzname=Module["__get_tzname"]=Module["asm"]["_get_tzname"]).apply(null,arguments)};var __get_daylight=Module["__get_daylight"]=function(){return(__get_daylight=Module["__get_daylight"]=Module["asm"]["_get_daylight"]).apply(null,arguments)};var __get_timezone=Module["__get_timezone"]=function(){return(__get_timezone=Module["__get_timezone"]=Module["asm"]["_get_timezone"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["setThrew"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["dynCall_vii"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["stackSave"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["stackAlloc"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["stackRestore"]).apply(null,arguments)};var __growWasmMemory=Module["__growWasmMemory"]=function(){return(__growWasmMemory=Module["__growWasmMemory"]=Module["asm"]["__growWasmMemory"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["dynCall_ii"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["dynCall_iii"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["dynCall_iiii"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["dynCall_iiiii"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["dynCall_viii"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["dynCall_jiji"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["dynCall_iidiiii"]).apply(null,arguments)};function invoke_vii(index,a1,a2){var sp=stackSave();try{dynCall_vii(index,a1,a2)}catch(e){stackRestore(sp);if(e!==e+0&&e!=="longjmp")throw e;_setThrew(1,0)}}Module["asm"]=asm;Module["ccall"]=ccall;Module["cwrap"]=cwrap;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0)return;function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&noExitRuntime&&status===0){return}if(noExitRuntime){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}noExitRuntime=true;run(); return initWasmModule.ready diff --git a/main.wasm b/main.wasm index 7822cc52296b4cfddc82b6a0937e82bb6dbaf107..9a441ec38a16048eb23c799d1cce2194bbc11330 100644 GIT binary patch delta 58481 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 delta 57791 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 lu)vqmC;~I&ORwOLj0h57KkK@Vw+W From 578bea87e0d6e48c5bbc7441397331efef7e0a25 Mon Sep 17 00:00:00 2001 From: Dreagonmon <531486058@qq.com> Date: Wed, 26 Aug 2020 11:07:03 +0800 Subject: [PATCH 4/4] Update c_cpp_properties.json delete some vscode config --- .vscode/c_cpp_properties.json | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 46f3e21..d6e0f84 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -9,15 +9,7 @@ "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" - }, - "macFrameworkPath": [ - "/System/Library/Frameworks", - "/Library/Frameworks" - ], - "intelliSenseMode": "clang-x64", - "compilerPath": "D:/IDE/VisualStudio2019/VC/Tools/MSVC/14.26.28801/bin/Hostx64/x64/cl.exe", - "cStandard": "c11", - "cppStandard": "c++17" + } }, { "name": "Linux", @@ -28,11 +20,7 @@ "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" - }, - "intelliSenseMode": "gcc-x64", - "compilerPath": "D:/IDE/VisualStudio2019/VC/Tools/MSVC/14.26.28801/bin/Hostx64/x64/cl.exe", - "cStandard": "c11", - "cppStandard": "c++17" + } }, { "name": "Win32", @@ -43,12 +31,7 @@ "browse": { "limitSymbolsToIncludedHeaders": true, "databaseFilename": "" - }, - "intelliSenseMode": "msvc-x64", - "compilerPath": "D:/IDE/VisualStudio2019/VC/Tools/MSVC/14.26.28801/bin/Hostx64/x64/cl.exe", - "cStandard": "c11", - "cppStandard": "c++17" + } } - ], - "version": 4 -} \ No newline at end of file + ] +}

    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 z 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≥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

    xXHjo4NpfzH5;Zw*biD^ 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%0AbmqDC`R+&>qv14@q(p-pbsUUBPd4D0HHYX;(i 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 z�ml1_V*1tB>nQtWDn)Ms9exGs^os|H=X473*R4AiUrh^B(3jNdr)%&tN z155+kn#%mF<^bIsUDdhKnRUuH>Xfe=68``I3e#Pd1&^bod!^!HR z=+`gTrDB`9B31q3pB9(wZR+e)Fbq3faRv#c-6a+>y2x_Hxy*QYTlf0*5JD(#;FrNk zlX5=g70P;t`f8J_%<4X2B!TKAT~K;FVg{Hm2erf2o~f^u&A@_}bV=^X)s*|w^O)D3 z7W_J&oBmabh!>v6mW5n9ETd6qo^|T1d|BL;vUWA4C8+6hrxQwp9@7aMqTj#?%|Up; zzE9W*ZR~{Ced_&h<-hoVOBTlAgwcsO;jlWTG%#?dQWNC6R9AJj@1nW}$yue>K?Snk zw+vWpZ|mD&Vne}8G&EHEHm#^_rr*Gmukk1H-!|K5Mfuv>(H&gm@1X4?|Dqu;Ua)o{ z7lb=Vl1bz2>5zC;?I7{EHajTalAh|1Vd&A7W2Y|e{2R+mZ5Eo^%-61P=vr;=(MH;9 z>mB9pBIWK(RN7bv25MO^G|1TB?dJ_~K@gF>ANNTtOojBy4uO(jgdjSPIi3w6-SNc! zAcKFK=WsaaOnQ3$5@Q%J-EnxTb^H0Zw|Uks_iW}6S?761`to$gWvL=&FnH+os5@z* zs?2&~9Ps9pO`I2&@gF`TuN(7H*LIK1o9sH#zAtY))GKfFWb`jt^J{U(IH-0P+48ZG z<5LAyZK<~WL3Yo$#wRAP;Yr3kCk5yKt5mU=+eVxTSn$^ssRLjz8N3pMee3Ie#~H`k z6XoBn5)|-KH(D=Uv7odL$Tjn-c--g8>)|IG+I&X90Mv%rSK4-Dwy%e$C3`6#7v-QY zk&mR>pHtVSm8z~B-llVpwoFwEZd29H%=X&^C(1ne`J$5ccfyBhoFJxMT}m>m%b>(6 zbKY<&ZMbXbjw_YY4ovu=-IgIMPPv~d)5j?DEnxxsMD1s|Ygk3}a@~;fcG}ggx=b!L zId^lg^f$$ko`kdm32gfr*tkynHR|l_Q(?Nj#wv#o2P=0tNH7-{pxQQRy=V05=ew_M z;Ogs&U@c^N@Od!(8mcRy9V)@FdidRPp)69(T??)7E*<7-rhv_lSJ zXE!^SpMKa7awvRQgOh0UsFK3%Oo;8u&Z#!6|Bw%ICCl9`4!}cK7A|$ILwtSrO$r*EFo4Rete zQl2qA-*_uz$^DT0bUTA96xN}?!so|xB612FEC1G1aA9ItYzPwn)yE1GKhDdEDATLZ zrfuGmZFHI=h4)I2O?s6M7&SC1{s%Bjl*mIUaut<@{tK~d=^E6VE%vhymS5Cd>OeUa zlnn^HJxkATTD*-2u}&UqDmb0sN#_Zkq@(ogjgbBiLKJU@M=V=9mB(rI$td@6zH$DK z_Ob4DA-`rk_TEqzcly@(sE*Go*IqhyKjhiBj0l*BD;EV!EVDuFI;j9FjU02YoX z$5H20`1t9E*%y(Vd^z%T9lp4Cq`Al5v`Kot?&m;Z^*%JwTSj+R4a~;#6&?A;XOI01 zD1v@_P`Jd6^+8`ovs`m%9kraRKJ-NrKS}jqFZnHxocu?9&aw)k>mj(6I~jHyjY+IO zR9L)(&%kwhgAxgK^Jbo9(~ju_11|gQ-o>S};lYD3z0})H6T{`JFa3-fjPp@h$*1ZX z&FEecfBxv{$wag`KmCA@nm=SI)po1b6xMtt?+`h*Cpcsq7F~T7MQt<07EuS>yCKkV zHkh9H;s+tS-uy+KYtq>s4sba)JSr{U$LX93gTPdl3drM0lLrYc`;v!G4Mawazc}b= z?P>Hjx@Tj-xQUF##4VU0xoetOv0I3@fJ*){>8Im)Vtcuc&tup8Fn3l{<%(=fr8G^u zf!MsC7x2vyre1sUdnN)r1lge@pGAq({U;WFp*pppDR#u8sI+>on7WXI>ASr_&^+$+ zm1lW`D}NAm?!olQUueZnA%}fLJYOQ>G&P^c$fDg$!R2$C3JTHj&i8g6Pc(y0fVUHs zdo*97-%nw~3Tn6r(lGeOQ?ZZ;j7^9^Nt z>Pl4BbRM|)Y*~*K0If~Fl^tl2^g`jeaC1MgzGK%DJZ-whg7*?U&4ss~IqJm481k&F zm$-HxA1rL-`)ik;o?PJFav>~h{_}(?8Z~-ECO!zcnBgX2DXpt`a=-o@;yszRH&ABX zCk#s7Kvjp&V+)%{Ve&qqS3SA)^_l<9yl~CHHRxkFTN{<~LsV9u>KoBGjKW#hLwaGfvy(uwgI!hJAa73` z-itDBd9P+d;V`aoJSmZNP#kgUCT;eGSJB3CxlhZ6I`;q^%09Tk-VZ{WmWI|KUPlDp zkM|b}-D1`~nbe_R)TKj(w~jeZ)T}|n%!dL}HEKJi0!Ax+jd6?{A?j_(JF>F@Q~rQbn34uQ>t$}Nzy9?J^>V2Ym2D-S|SmxUvu z*yOFo^*TOR6*g5~AoBau#!FFI?v-_H+r}h?VU`OD>kbzt-jjD=A{*Oo>$Rw?$<(Ff zoNCvSvsBA`Df?2?o*znQjE;!f^JsATS;k*jSp5nLe>2w6ojw0Kiqq3&(@cB|X#!IZk=MNPo-aRhfY_Bs-mEDAnG#B3z6j<${!kYWXgF&Wr>yUi1 zju-4v+i%`kByl7_9@A9&3Twx<+6Af)l9uK%BKV8xW`0_I@5RVPxxs#dgiaG5xqZ6C zOhQ}r`L%QGi9swLE3E&uZ!d-fynMLu-a+%^4i1lMjut*X`p%?SQMWY4F2y3W`nWes z_4rE=NI%Lgq-|rDUW-cmz=xh13hVyXRQXOYJ+;gqp3X>(z%D${aZ(4Y_td7xi*BRk7)iohN9q@BcaEmGryVCRn4CMXksEo%V6OaULyNe@lPr6U!PyKO3#{2p&<&9`w8!5?*3qanzyz=)stt46qdc z0K?rA!y6B@a%w%m^wEGC6|xzQWR!U0_Grw7$q63#LVA*Ln1PA8o(Q@>z0a?n%gc@f zI0&IMt`{$qp!A>F_06lS|NRi3b?UX$)F`CW%DN|FCpk^|p0a1qmr98``c}x`NvSgI(x=W$t+ORIc!t3ftNOrkW^h2U6g;0q z@Uer1_4_^+1n?~gfE{_k!G5Smddm=e4#q=7cp(H%+WGy3TfX7xL{1ZeO*0zJN#1k| zUZd0G{A2jKmyuDr*4eY!aH#J4AmjuLH7fKq2(5w%^i9LljI-?7e|711cynx)YY!LJ#zKmUw(5q$;%9OxQ)<(oYu0%W zzIndaq$@Y+X~KHDI#F=FN`DS{H&xhJ1)@20HaJXFZ^ds@H-Qh6I*h!<8gHjh(!tw0 zSXd2l`1*dqNII7B#3wIWeqh-vF8n;iUpZD-yeo!~-L+LrY{T*rJi#?dIwrR+ExI4F zX_lecrX^7Yz59rs-i?qY=`}vobp^+~brx1y_5Q+Y7`?0pz=#}PQhpft3kUfWqwd^k z`1F%nC-XNm{bmH~-s@K0of=g)=4pdU)i*U&r#G1cat>eav1O31bCM#P7!d1R%vWdn z-3Z>jxtrxxI@r40mQkv1(o~<`v@IwH#p}NfGWJPQyrcSQ`bnER(IqCgFTuehWpnpV zt6M>5j&iFxy-CuY4z7xc!@)=B%qAZ?^TZGu+e|vRcnuxApANRaO2e=YDRNCxJW<`7 zezGWt&irc#hEe`D4MVk#h7sX@t9(=N5H^fh9GoBSh+)KaqJz(Lz%a`HLI*F{V8y|+ z>EP6n4o5Ec$bAjN$RF*9VZ?Q%VZ?XDFr=T-!Mb;87(cmVy38pK8!q?QIGoPB(GgQu z(u1aMVkb1P0Rk%L)Sc#R( z4c0HDGnl`juegP&sQmv&_pne0iSKVIiE&(+rv69?bz!=eCoj-(lF`2RyNBs=B`VcC zA8(DB+jxYXq-HLi#PAuN#59*q@;QH!Wd0<(53`e8$dktaa=Y7!*e-udrqNn|D067f z<-Y0zaDnNEvYdfj&h;~_OZi+ngWmU6a-xwNsMDl(ry9Pm^W-Nu%|Ojf;$$)6E0t6t zd#QU^Y>q+O<|a2XIk74rHeRF9$#V7-A1tx2e9 zgmAg$*jbnm)gZm~K#6u@QFQo9sn#LY*!G9M_}q=N=!*}O=)0JLBV}d!zk>yavuicC zx`o9#XVdr~)_9#lHl7{<&{Z865QW_B}?Ug9)Jww`Ofi$u}+P7HRZ@2W7 zgVI+krTuH9QT5URjnX)ke6+7TK2$y?Qa(0TJ}yx{eug|@fjqH5KA~7Xako6_pgg%! zo>C*9R4Inc7ZxiQ?N%;6s9aL1Tw1gI zZO(C7z4C39<2ql*^`R>^>K)(Ft=N$0xM_yty9*qP3mo4ocKpk3$IS;Fw^TZAt#N$6 z-tmJ*#}bv(7rst=LY?+TI_--E@F|!x0|cc5?ql!--&?T?ODJ$3J6C)%5PT3L;$;%E zPLuabK*4$4ialVQGOJ{^0F)=kxp=HKs7yJH)W55qdZlMl)1}XKsAd>L%|Anja z73y(Hl$!k8Vr6>Wi&ej#uPHaOb|E}wwPH!!X#Urxt{nr%=J%{M#vwFpR3qyU9tU`F zTlG_!8{+GzuagF?c+NQuKZtajE|gNS8he;|_8M-OfmqPFG>!Vr)!EYS#p>Y}kvyxU zeV3pGlnLHNd6{lcZJgoK_rUaqbmGn0E3d~+c`@{^47R1JM1`3qGZAS`tVVO*ttK22_7OV>%G(WChMt`s-V z`8@n_w$pM($c6e`G%LR7CBJe0Dc|^eSo(D@xlY|HqncG7fw|!X*;CZIh4Aeof*3f) zZ+;9WX8UILQs%!%1bkfZLQBts=}8Ou`lY$EYN*ZWMIIwHuer@B)9VV%KQNM1=je?( z$Lr2Hn=kjMFl18Acra@JsCI|y{1THAIf?mvsMCgk0u(M0m|Ch*m=m#k^*Dt6OVx5* zJpK}Ec6lt7fM`5obLt@!9tDa>FkAE96u(_lir@1~THEzVJFvW`G0Kj#8~5$zjKy4V zX!nvuUE)%a9J(V%W=~|wv5z!o+qB4xWajfbi7$<}+_RvLuo!iO-RnV#O3g0xWB=$| zl(SyVwyxUc}w3l&EB^QKps-%_mI^owWWqEPANA?Rx{k`exuXd&GOjghW0gH^!`^sAQ5LC8l(qZ zm3Ec@oZ{P~6dY5Y3lphqUfTZ9>6n_A&SP3SGNFmHedM8R>xjLwN*>o*GIW4)b8l2JLvWglD;L>D z;HL-i)8)kV0t`OJN3yqgAR!`;E-N<=e)sh>T5biseubiicL$6ip~iFAh#|g zEvVRxoSqi>sICEf!qj`hP_)F5*ovt^Tg>t<%AD&8Gq{En9UaAWp4BhTvKG|*8I0o? zmp6?}jxt(AU{u8|X>S6X;0tc}8GP~C-tE$6U{uaSgTF09)4?CSUn8(SHceu2)?Tw} z1wbmWs*7TRN1F?M7spWcrsSW-3| z-om*FIv#z5gNBIctpq{dDg@?`_`9801!y(+Ygl?{G=nuXc8TQX{*GMUdW6!ldAvCz zu3wdLQG_@U00PvZfstnhMS!r3u?V6Y7ktt@+})!_gm^h7q)+o$Cfc(}iq4R)<%CHz zI03I)LU`SJhb?d)3?%^5k(_OV}j{QkFT0Go!?E#-1PZZ5sZxbtLtmsh0>)q3TTBIs;WRURso1r>{3}bT>91~8?wu}4qgR9 zuOmI?b^IhK{+{SHzym68uok#Ocq$TOjhAYWt_)2(!MKUl-3y(Z8FLJr=VXJB-t(Ow zV-YgD2yZT+b()f(iw#ld)(seg=DR$#UA6-3!xm(HrosMs1U|hgp0BB~U_t`nt)hVB z%p;BMs^u8g^-uZ@jQu$RqX8pq%M}*j+&H)g|8M$@#z0;K z9MZ(|c%^@-T8PXcQ5aO@jK4Z@b_(t3d zyOpN|;2`aV>XyB5zwZJfC9 zIJU+{uQaH*bKc$oa>NI??|3H+$ERv}9;Sb3&owht2u8tmt;-To_X{S(no<;#<2<6a zKH4q-JSDt62jJ~`vgdToO8JKu?YX?{st#bq6zw_QGg8lzhQ=|=je1^o26S%@hC)jOsBNNu`yDx#F1=1!MOf+A3`6nAqj?bKk@Aa&=x2II2 z;^i_v#J^N6#|^=&I9EJI%fKw%Ru&X3A7LF6iKDjD67=S4r&q0nPX*yfwZ6Fs_3N_USSz_k4$v(rid`H~cf*52zxlzm@N8X>Wr72W zV>}#Gm0D_iPX04+6Tkp6oi=`dYsRe>M!1xdGw0dyG) z%dqrQ%pu`*8_frg3qtQE_zo(_gd$mF3r6Z+;K=!XIGFkMYWyBLi#+*Onu+%gzHqr$ z)$AQaUl;zQwM6q)7jlPs!rO^#cJ;Vdl!Fa$2pInoV`$_lYVNhu?v-J3HJDt1Ux5MN zM1BQR=X>pRmCemMsCTI4l)L9;SUeo(gR#wHbLOCA4C~B>h_Enlj07K{YG3F&SBgz{ zYK$O;*`8Y;L?nM-#L6-%c^|QOwj4V$ONwkOena-edT?nHZ z&8cX9>0hdricPy(92ma?NqK(my5Uun{WPclwC3;`FQathe+*C$%rv+5A#c7zK4jdB zKIFZ=u@1{bAClHFzgBpgvBJxcTFHRYEq%d=EDAMGo7fA0axKq4*!BW938JyBc~x5X zZT@%0E(CL4x^YG_I>V1GEwKw)0y)%Gnj0=ioUv?ke8^x1m75Jywpfk`Vo^% zW0!R z%q2n+GgEGll%}HVJz!F-;@ixr*9u#wR730JYWRjb3GU=z!pTsCuH>+Y@o+ z8EwO2Woar?S!8B-qRlyac87vs&M;=gMo&XwdFZOSsqf8$5&EId1z~%Kp|C^YMrFc{ zvf-lmm#XEsVR#kggB$*4d|qzUo8A9Vs$lo+EAy4C{Veq3(zlCOY7K#7C4bWm=5n+u z`tP^5s}#5YA^Z!9Lq9&Tf3YcPSwQGrzYhGm;yN8}7uv0@R(Jh7X)O}w2lSQ+!LQE zC2z)2^5(OyVE`kJ%L8A+?oUcgP(-pk`RetcfF#N~p_3>-XZ_in@mOb)AA;{G=;xC5 zjqTKM*)myQTou9`Y$v?w{=i^R1BKJYYS@;eIqz)O@>@u<_0z>gKz|6m7k7H~Q^Kl_ z+i5@y=GT(9M2WEF;NlV-HK^-#J?ZD^q@Sl$daa0-e+j>6si3L*khdQ(DC27{OSIev zZ_rC`3bExJ=iMj9E_X7W88l-5$_hTfT9Zk7n(l|@hUQDq$D%4`>xFDjalO!<=ASp& zB}L<}6F0wModW*APg6d_jWcsME9<_*?G_OXQ@pk18FXUXrshvQqW|6V&-o9}AJS_4 zf==;#VLgM?oL^%_<8Ol3pI>92UWim4r|0zsM5Za~Zd=?a<2b5ZaacK|XmF&4_It~{ z4QBV2$m^NS>?N&LKTPB;Tld3kZ5PscXg#%=BI7rhw%~(Pz7n?Aw5l7OY0mlam9&4} zP6ODtsd=5T>5c-zdo)Zr@g{DQu_!zgkIxB&`kmBi>~8)7*dRY-GKgqu>*GM{klBSRIZgg~Z*O0TUJd&O zGr;e|e|N2H_z%|##g)XhF02)LE{#qfOm})Pt*?c~CQkDW*iP~saq_H-<77jb0rKLS z7wwPZwmAMa{#$!$$A5Sqeb{~Q@=DyZLJlz5+R}xlTM+PsX_<9^KA8VvTa3AO26!W1 z8$*F8tb0U%0RXP=aMdye$UKCVoMd*}kTZQFSMyM>*mZMV*P_v=h`(9*yw0;AqRh;C z+IC7FJ=T_^=C?>6rk%y~RO?2vZV4L1UO=Zr^>Z{u608B@M12m+g9Y2x+UZHV4$DW|rBHfZyP9z1Zs4 zyrpKbPQF(b`x>Me$A#g477KvhWIZ}+T9dH!F)?jvxiaUt#_d!fQDLu&e*C%+K9_yX zSeHR9!j)%|vV|{8QKxyWeVbZg;hyAa&w4S5cepQmIU0_o{pc2J<$=mu72lrhfEQcv ziWCZJRqu=8v%l%*SoSwv%CC1?_f+cwL$D;kG2T~bxQjKne{8TbdXB}ubrtE7j&#PcD0*{*KWo(?&8`i8h;CXg8cYCE%-{Q02QwiuAmatnSgvOV%lGb}m@;tmRl__G%wiF%p6*}gdoi67UDQ(n2Y zSAS!R@O0b{mQiiRq%N0AT5UXQAZo)QUKZpNdPj=QB8MTZC<<9 zc;ufe^@L+A zeou@qd>QW4(^N^oTXxC%@saBY>ove_w#KH9{)2i&gD87oa%G1|a_!hNVf6#~9Lk9d zsI@YEM^#@k#G1)|jDey;!ay0*=bUYU?e*?FO_vJ!$Ypn~Vd<>i;_F+~|EO+n`EoUenyFZFs0CL4|og?(>j_C0#m zwAlCG994qsNzk6=Emey(UeL6egW_c$`i5WC$OY9<`OPuqSdg#W@}QP59Lz27%~K9g zB+sIJwX?v4l#9lA4v*^IW%itCr2T-tdxzW$2*|W6t>t9AP;7!!_h>V69fa~iZ3!zefrdit$W5dqnynOE zh%`oMFBS646l-)^o1@}Vji918pskY?t;RhZj3}dQ?)|X6>ncQ2i#0-X2y~)!^&ILk zZo-akVOEr87L-L6MNcR`vCtap{uN>cHE))1;SN@fyK2od(>=EwqvmovLH;TcV zx2e?|DhaO(hqXG(!+&6$x$yDhrax|*T#_@+S_!@jW|JAnjPKH z*@ESEIybb7z!L4jhXB$)JY(3~(xYum`@qP*)@iQ zp!X@_$dVidD`S;oZZUNe-OXzDas?CEN}KvkRraRq`sN(=1{d8+f9a@K4;`3kZ!_L5 z^O9%T6;sVpp$mg`Ly_y3K&AWD*H;*;q|vT9e3F}DIr+Tx1+DJ+Wp2dEbb?aWP>WrndR<6^U-DYc6vZyuCu0H)?I%S2qFps5VBns} zbqK~ByJl)X;Saqhw|{sisiA>srtf36|7`X z;$Nzk=hqbNP5SuHu^_pB6}1CoDHn(SFQL9xn&St+apWA%_@9AHv7P(=({y&XDH1nhgef)36qbRiUzj^+U|M2{= zY<~EhqhO2k&6=F{S)1hnGLUz9dC=_VQNNnZL9G9Ym@_PC{~P+BWDY7}%1ez{0Sh=S zSbyJ;)*Ns$b^Zyl+-8q1YR?(_b|LGq^626c9QSc^j*-PM=MdW-!aYKcahVW6`e)yY zw-oC51(VN52u`~3ZrUy0LT(j$Hp0tj_UWugZFVdaCCw?rWnRJ$-_i{gumw z;)ws=I_mi!K8JsIoeuh6KL42i@cc+)HSe>3_AQIXBmN~A5IYeo&BfZ_;8WHQYUPXX zTx^t0podSkE&mwlDT^^N<{7o*HzQs{-tW6@A3Mt?n4Y@w9I2m-z6jE0_?@N-_jwn!mHPx+65Te zUf1)rbNu*d3qXcqY~N*)s86e4V@qd4d{Kt}X>QxL8q>d$bwan)G zhVnf#c|XU{W~0zU#%+{XH`|g&S{UGY#}751RQJkt+TYGIw5?jqBkc(AbXckQuX8*! z->~zokBo*$P7GNi5OE>iM_6Alu z)NFJ8mDyZ+Ay8jA^ssVpQ8XIGk$e-MeYiSyT7?%iJ0QEonMIZGHT##U#k#}d^pH(v zK1+Li3SCWp{{fRz&kKlSunGz>?w6aFSUFZKiyXM~p^7ZSZT?4Q$BPCeeikAAY@;ka z&Z>{lcNwjW8K9SL%%r1#@vj>_hCez&e_dGx@O6ZZo#(pG+o{4gG&thOq{L@oN}A1R$9+_;Uk#2CB#Ies8qugg!6LbGi|1y3;8b8cVgwMK5gE{&&24-bQEcgUms2ciTZ6YMOMmC55yc&6D7t#Cc`t8G4ppT#5PO@Zuf#7< z-2;di=Ye|MPn8Gmhi91T7icvHRfX%VAA;zK1C?M|d8E|K@=NTQcKXD@=C<;|ZXcpk zQM9MpMx{z90t3s1&%qF;dpkTI2}YjTz0q8AL3k~Z)RiiUz2DXd)pikVfqXOuHc~4efSTT^=6O@&g?}cvUl4IR=Xp2 z!3}wHK%@5*@4>0A+9fB@lxg)q4u!aPiaS<;BP=iHll~@?%u}sFrP&w`fvX$gmNvOt zr`dMFjqnd=bWTxcn@m3OsVLnAwWD-&>d#i61;On1p5Me#=^&|O*j4Z2ddUf#zl zjkgG7U^7818D{Stx2-{vI|DR$L11PaR4(5uyDBW0MIT-=yd)^Ds`mGSZsi2DdRKHj z;FSAIoOuIjFxYj z1o9Lf_#HEmh>|J;S#~bdeJme+6JfgR&L-&Hy&Avue10;d5QQ`R)L z=E#HuRgSTN+?u%=JG|*-7RZ6gp|1hWKFTta7+fdq%1(p>Tpxt+!Yd!(Alsh$UF@Y{ z@C*RE`O%yP)Z7%2Gjt*q7o$~c!a9NXsJUH8{tSwn*B)4t0Hz>y>EzMyuC8>NLaagWy5e~@0Z`pMV!_njC-5rh{)i zFO(Jr@JOx^DVyi#VNu)&nTHzlQg(k6c#>8k5>`<|3bS z6N)x>(U|5m6{JrT(c*a%;XK#ukl%dO<3>bOIye|ya3fT9m|^nH{YP|e9&#}#{9Z_I z!)eo{KHCHq>;m~jq9=NmzEOBC?-p(`(PHqiwRgM2^N9B*eMNR2)n6njUMdDM+Up*m z(@sD@Ym@|+Zqxz+T^=Osw09bpX9cKvrv`B8ZJq>b-aRn0N0MT^3JB=BHgxcbV1i5c zqeAlH<%EEKqA8}ZB=dFYVz66mv#B06+t(Mf2mrI8;4i1uTracH+m-Z5RHo$ z@>kbUkI`C5vwovI80s0?DY5QiEH#w$-kc&|pKQ)&rWSgilxzj`esjh#^dvPFW6taB zU4JzUgk(iR$-JdpG*^U6j7Ho>1H25Y#Wo>0W5O5sm#XFC zwqnl=vacvc4SWo2$^ux?nd9#SsB`)wBEy0+8)H9JfD+VHNQMSgEU~$H$>Cdb@F{ng z+I-pZ^>zW}VRkTxI!Z#OQaz6w&f6+aI8Sihg;J5(QUT$aEcDZ%dH9#E3EdOLnz7z} zQPb+C;)Eg(e3q)^xCwX_`y2`P(rR6lv~ObdR%EsfYJm+mG$*QIJFvT;mC}GDqjm_) z2?;&|@uZtd@LE3w=5843FptilES@k9>Zm zl=5k-@$98~dh)i2Gq*+&ts!4W6UeF`tFG}V-A&8|yv*D`Occ#4%R%+fs}$RHE*(aD z@0#5%bbY5!4u@4c1M(0qa{!nXJCh=D{9IFv{7?R=ux@DjY@KeS&IMUja_;{z`jNO) z7R28-xJ{+paf?s#PriMUSO+CutHZy4t&TnZN@W*TJRL@a%J2He0RfVA>=Ce9zE*4T zzsgzj>G~ReZlt(Azvdugg$ln^Eng=f&H)`G?44GbI!}tUb)}1JHYUUKle)FYGL$Syi*leoz*82bC@+wt zQDpX=e##TJkg`r`Rf7yM7E_MP2|gcx^u5m%qR3pZ{l3|Kr#qfCDJwoISIb*+^OA)w zSQLeLAwrVQ?iNu93DzX-VPGek<0S09+F*@NQUf<-EoEFDt!jJP;0GSE6z02j!*84K zs|&fXC$0-216F$dj~DV9hUds`44|U`(b0-Zg+Y5$1A_VYXhh@LUi`{)Fw2#k2p3%4 zY6I&WfdFZT=0gZ*VDRkN{C=L29A2k7WAkqebj8D8_;==y!H`AHg=W9@Ec0iFNB@Pr z3RMqi0=v0)t!AcJ^+3_`f^%;vuY{TB<+ikQurAd(3AquIW32LnuLZ zf@8l^)-~(B>cyNQ7)P=;E!Ixmf^yB3!5g#D0?DB#ku0Z%0!4dcIMsUT3kZjWTCaIs zKeF`TEV|;3v7c~KI8ZhdJY5%fy5#Rzw%+)WbEc0R*AMDvn&2=MxEq%g?|hM5cCYJ2 zJ$;GREPAyiSaeL?4!hQDyWGX~+-AkBws5D-IxeA0iRiynURB(FK1YHc(mJ*x=Cd6 zjeaa$I%D47rM{2fC{n^_MVzhh+2J6o&}-Pl=>Yfh zE;YP#&wS-a`^be>OQQ35;_uD{ev9{mgPZES>M~s6I8UIZ66&J^KizQ; zx{laR^*<;U5l$LVEFV|X#dV?aujU|elri+oKfQceu?PmqJqLA;Ve{7XIH$#U$2SXl zysXH5zHXQmfrSQ*>M{jyET;KT(xkMIHQozG1z_68z**x&r; z#pJ{~A8(93wt4&U@bCdWx#A}Y#J>iX%HMiLu-{c5D6Ba)ZlZd_s31j%;7UZLJ@#6I z6a4&23`p5Bo_T>k&`mr14*+4)>k0Bop4rC}(iYn_@>^J3d7-#;iF> zOtQBdr$sBm z^U^#5)PoZ7(WaEy+W0}?QEAr&1f&8)YcR79W!x69B|cxUbKMMCkiOdcM8$8b&$p^- z`0$wU1gnpwBy=dKj$2(=dpKqy|5R@s={qsNhA54w!Y-naxX%Q}J`n{$H49 z5ta2Ie{#!XtbIB{e7-q%ODApPTT?bwiiH*P@^nKtO}2|4ueq{>e;x%(uhFEVrPckA zgMi^$ z6P0rOX*2am)e0<=*FF* zS~C4)m6QG3nSQolZgaOm{bZ>u*Mssu4mMZ`>sfifZCKqtwbbGIp03+{SBH!)%A5VZ zf_2*_7qS+H>K?~j4R;BDd`f>*;g9#}59$)7!I^kF2w`N{3w*sZ*%q)DNFnRoJbo9l zoTQJ#&gPYB+H77I9C@}b+9Hbiirba}fY7(05Ne}qigOMMpo2(at8#?`=y`8`VA;V6 zpjiyn=8^5HN!w%ubiROdZx*}nxyITFf$D+l^Lb7_S6}WGt@k?a$d|uYQikRvY@=AV z+a5a$3I7)B>1&q5St@u|I2YOUWIs8rL|?3PlvU*Kc@4Hs#|)z&R{J4^^#TAJ*KEB|2?^ONL(rG5b$xj6pnWj?d01Eb`-Yntr>LPkqT6q7 zN7-(M)Q!}eaWI>#l~8Y1*20eUR%F&fk014KZl90?p87p!(R#{Hg?t-tM-2SYl(lO@ z&Q2F4wBGU;OpJ*?)@6MyVrBm9gCnlB5xUytD~4}ko~!71KAksN9sK- z?%Fi5`n*e%)n_|j<3X{MA$*bMhAVUPAVT7AmZoeIMCD_Fe1qyU+s+pVj+QF;xY3hz zbbSS(&^TT+Jn%d&)?_Zn38}bavV@myv(9>f0;yB7n>s(mjJ60t&uT&QxlGg@hN~nR#zO#h2*yLe77yklRm*X;colKA9r1Uy!Hf1uvq3Ga zp%ZS+OM@B5(ZS8{nQ`38SQeQ!nvLa+15@YIIip7lzrmm8=AZXvU#)9?&+KN{+MQbL zX37syY`{N%>t*GD8r{89QNK}+@|D}EhtJjxmV${3Q64@-q3`^>U9w;pTVFeDnQ(tjg+FRiJ;KtqSZ;V;s4Y{j);r4Na zCz+R$I{ehP+S88F?ydCp277|m<59>t?Fgtwd>^@HZUVGsPpOIJr5DKC69IB>u#O?p zg{;8-b@VkURSgs%?B6V&G_d>6sG`l=UK`~^EuYI<)0_(99%EPh)TGCd`g zVsMpw9BoQrOX)$U3W z)f&@ly zRsbC~7E~&~5yO5relqkBLZWCXVHFOq3keAdZH2{b6W;omH^`zUxg(@>1duNB4+9e8^`n$i4jOi&=TxdT$D=pe_>~p7%7(BL z3{l3V(g{p-0*wn!5Qh^~*-%IC-&<3WX|W&`e6?XGqFy=;{sL7ZGQrrQ(kZe|8fr3F zX(L5RH7iWJKKxPdj22&}L))Y!MrS>3U8v^W=gu4aWv>J3VSB@bz~*rG;w*&*{f&^} z%<^78(sk|_b9C%TU_sHOLn+WZ!{eu64o#Gf<=BrI=p?xRDPEfewouTNg4oWp<-YS09!36N4-q^Is+s2ww35 z5yv>NMk7O5K#0PcqjUM~n|AkgUbQX-A85~IM}F>p@Mvw$4isIQxpHe$WePYEuR9?s zCTQT(R~C{dGXi$BS$)Z)@9NVDTAsmv6EcdY#@zfmlP7qtCrqq2FEP+e*^@k(3GC$= zA53+OC=7|IaG=6vcsjm?A#PDi9Y^vx(66HZm{YtI>BurU5ASHKblzgW8SC~1w}Hs# z2dwpUbJ9_3j`@E$x%K!RsV_(rnuB*a*AvN?DGBCMOlOr$b0)f>L!Gmt!yj z9ubGaQ$0?Cf2mrIn}t^qBO%5((f@VqA5x<4N-W4rZ-%U4uV-DzLr+zaEiNR;w{xrL z*eNCOL75avkj(fo%cL&LEH{x3bOX#9J+XY;;z=T66Q$>!vAZYhxQ*8Of2t1oBjDBJ zJ%;Iv-DYV~s4x_Kpt8Z7ue%)t3~vz0mImD%r$Aj(+p8~M`=M@jvxo4$>&{LeW#X2& zuK3^QPduPr2{OB*z@F(XHmje2dU)L^*p+;#Fdh~1LkA3GN;2z}mCK`0n7rh)%`h$- zvtggMCjS)B6pT!3RmK^zZ5!PJKw1~w(|3-XNE^=)%H?%xeT=Ritge35hy*RxH4^L? zXS2Pj=u%1ZPyPtYF`&+EJk=39gv&nZ78a_|YKDUq@7z4T^tD8>1J zO<2I=9i=&y z$G3S+*W;J7N+-&u3F8{de-nbR!N_1FT;6y(2zB;?p}<2JlNxk=BCRv`;It2N_i;Py@ejSfnF~w9W?VM_Ih$$9$Ux z5AKxvSgDuPceq2ZxNSxDsd1fghNJ8Z?_!c!Asm7DjUO3bt#f?0xZ^?a2~Db8!5!Rg z`IK`mbNGNmx;qV~a9yl#n=k9y*hf`Vw9_}_p^8wI-JW~O4Rr9{N!Qos`&qh&%4@t! zYP@?~_TF>ZyT^Cld%pATam9Pj74L{z?|rr2y{~$gUiI$%y?5#N-o3ARAH3$>C`8o0 z>sle*!{xyWb(3}o#8ZAe3W_+mjPK&hzjR#sT{`sRUYfR@2)J6-bT?AFVr zHEY#Rs!9#?&|c|LTYg1>@u`w^zTvSP6mG!6LBW|THqBV|LFkljR+j^&pDRmT=lG*v zZM0Eln>V#idDuB0S&zh3=+3M^Cjo8d+ry(4znNOW4OL<^zt4VN z=lxUrAgsuE@qlx`7+=mvMT=3Y6LcRMlN!{u!OoS240KP&;6qC>cv z+Kj&JfXiu7C;<|@V`#D~OxV|VER*Y36-Bm8*!Zcgd1o8*Qa5$4k^bU+xWT*LI!oGL zm2PkqEs%BNJ!3m`Kz1n^u}-5$AJ156z|@@S+bxFBvv%!9iVCPCXimIj60|Mf5Odwa zIFH?iu(S5!j*ajj>|^?+Im!n+ekuVQ`fzjrR%&u76I4SR+4C~X{kYh)#T`}XA^h0_ zsgqjKbz{;3sk8dE;&Lt)l4XP1?zj4YR&lFafqA4dP2U?=-rRiUBD-&kXxgHjlIp+H zBXIQuhaSXJ8Xi|+${uJQos$76a@~VTkyMf*M^)UfD_j)6N0axZf=^^u{~gg6p{Dfd ztHxE=tY6eaxfi3+a_5cafr<{!nu0J--(E#ZsYrD|1raTP$VN*L{KWbcQKi;4Yyl)l}@+pl3<*z+|wNG5V z{7sPay@gcT|6%VLg&?3o&|<|lC@4;tFeuK!2^7JAL(vMNqICij z0vJcoT1%@w1#7MCZQD2@PHlpqRMDbP#ey{mRa&jmI$>$=e&@A!g7$u%=lzcF*Zb%5 zXb&LS+1bNdYp-=)=fF%f{#~4FlD3ug_%_7c1CNB`n6YRR4)%N!n`C`J)b)N5TstPI z*8L3ka;#8)cb{zlwg@ulAySS{C==oM4rS2LnhY+z(yYf&u*)WKsVZU4O3kZ z9c{aYt45|fO9HOZHAEtF>}xeTcVSEq$1U!0eDs0_*pIo&MTlW{D;~q?K8ZK`?QvXK z>t0NR8|ISF73S_v?mA)801Sw zebYC5F*=nFi|mkg|{Yo(|fXc_XY9%y5UXWuxy@jszV2jHCZq@GP+ib#Fm4#vwPKj%f%Y`-&Q>e4_iMBs#6q(LZ0_y{YfOQw;(K8QLeJOs>1TvL zhaxN4_QVS5^&~FEbbx z*l)v7@RMClOY3-9e$TX)kM;3b;tTTE@lj{C)_5(SWWDhyw7J9mDRrgFe%6P*aq9eD zRbvem@QYw)=KJ1{I#qQcMD=>Ddub(dmciemeo>kb+^dsbM*ekFKZ6Hew_fM9{i?pr zdF8L#OSv?&KZ4@QTS5QiOn;K1pu%Y04ftwbUl`x%el56=ApoGObDK#6&i&d=$8H zO&Qe*&mzz3Y6=BM4a2UN5giy9!1Ii4-KlY%H7{5kqW$zzCb8@|g5Y*iY}93AYvB?z zkcUxI=XJ&9el&rJJG-`xj)bZCCN~`{patUdmB@sxoqB&4KnWBo%aQI&Sn6M_hxxC^ zMkSXMB(@WfSk$r%_~mnRe+QGneqnPk)>G^8)A#oOMGrm*9qxSx1>86aylY8zvjew z;LtxvqDk{H>TTX{3g)k{& zw}3A_jt!I8RdO!<9T7K(G64BZc{DQZnU{H4%r+*Bg0XQ(e8gs|oxow5nR{@OZtrpF zj#rKeaaZfB>l!Ma&QjQ7%mNe2s3LR@>54xwF@2W6)43zrJ9jE~_?CGuc=4PDgwoz( z_}ilw#ml#5)fXc6u6B7V0*yDaiE^6TQlLPQX)hR}LCWs0>H6+y>brWoI6vz#TA=jp z(9Z9cS{dbNc{A3QA+O3p5pcgUS7~)-o;Q&cuIxVAeN7ODb>Qt(Y=;!&IpjoNQ8b%( z+#085Gq|Yr-h{Gc>da@e{E8;uhADn~0q*=V z>R;z`RbjfxNnQ3=`MEhR7p=*uv(-%D+<8tCnp?!gg8J8vSPS`)X%5C*YNE)W&tya<9!-lL#4$o77ZRU>8$3 zx$8Ugjk_7Y0mXz(`S@vCL6W6r%CwE#!f0g{J8s%>K3v~JGU1dhmD?VyiezxM|X5|4wF>98F%nxx8R^H@Gg3B zJYQ3j^}>+((L{zYfDC2?ogI$-trIzhR>AmF=C}+`KLhXdTIt8XTvGbw9{}IadT*!pyzK(`kjq$K~A;zroUtOnRF?CuSQSU z*Jb#2j@&JDy6H|+-?v*vSc94GjN0Ijy$~_`LAlo)3@%8*?KB*oB^R4TW7+~QXqdkF za}dv!9_JT7-ej+BV5lRJI99u6sBi&#L^Li9G`t8HEqf2`rbz)Q$k$Ly;F6`E~*$(4p!Cl^eJZ0k&QG7bFelo^%uZVhbh&kS zLdG?Q%y)}q_X@0OeD|=E4e#RgDciU(y~TPe|6bm4OqUeI4DBy!uF7#?biW4fTHIn& z-=Nj}1lEx;oKjMRxel_U>zjlle>zLHTYsy5Sv3>b3BZR(fA3E!5SZ8IB$;G zGoE>%>Zv8j%FzK3ym-2r!Z$2kBVWd17QPK){kvTTZVD?m0X@GL*)a6-pK>|rOf}o` zj&~VClOn9+_HtbPGv2mGH$51{d@(O(s7EM;!&0;@JA`;60u@CHwvRx%O z+-Gwg*@xxeCA+9af}InY_N&y9X+G%mG_UC8e{CWi%u|-yH8^KGT1X=YbUt8a zuEg@Emp{|YW{+cr9Op0Ties?CuzMTdF(a4R-N|1QD7y4J&*aNi1<`}&Wi0Q_QjXiE zQg=5|_Qam8V)C6YT=Qni#+@}w{iq-RxSNJ*8cRNDD$H4mvv`8Z6cg5YHkItsGH<_y!#0}1Ve3i=ZZhuWjH$rTBX?& zx^uaUnw^;oewlVuLXC!E(~A;w?BgTc=01`Z#@JUBHCG2ZD5pla@t7i&88b8toMT@$ zW(0t?vq`oOMle`?CUDIpK_Ap*&Ur(Mq!N=9X^TodFsX156Cf#|FvjboThjZIZfTXC zbW6)gx1@8SjoVeETZ&|KON_`#O}eFXA*5RpZJ?OPpK0S3e+t8>ji#8#b+qRWR}wi* z=}jAtr;QCvj^zk9Y@8ZG8}E#zjgK=MOKD>ZZOludjV+sL&pEWQE{u3&J4b7981a}HXXBp3B9bKja5VFm>-O$6TD5wEbnQ?3DyKs+T?25b3_qot=ipo zBARj}ZG47F$m|qN!p6O5&+Qba$zu{SmD_3Ke(u<~ES8SBB90Ej#{nBF18L*ML9}rZ z9Y*_hx^$^b=;eew?73ttZ5&1knVQ$kdlvgVWH$bY4nzJP?fC$0+%lc^TsO{$pw1Nz zIA+ruOz0)mR^oC0P&4bu0hfoP%RSP~Ka-{rmrCl^9PiH`wC2}s2L%B)G5e%cZ zI_}bDc0;_S$_XB_Dz)gsz90jy_@vP!2M_4{>_kX~ikzGzsLSkA%$tqO%V_!j3ZqHH z*U00TcMVQXe)5PdX#qO}+$4Rg3hagPRLZF^a(qMqoGo|0DX^az>&AN$@vdih?Y^Lz zR8M7=!>;vCPO?_HBiyF#$Nqx6$$*W^WYC<&91fGTj@TY^n~42d9~WteDOFM}=f@pc zW;|q1N*QW|mJeZ06NWQ-3sk|{eE8PLk*a9=PwvHgxSlrd1#vZqJD>{i@EmRS zoTPH`j4ShuQtd>c#p)|ztp#M|y<~dB@Z8Dl@DlOg_gEEzRjC#6A0c#$>0Z4*@r#p? z&^YP*s=G|%Y zlM@FMrH*4ziEJ*;Y;F1v6!ARx%b7Y`0KSiDTTD^w4ELDI?Cu#XS)mr9Vzwcpxo{y{ zF++mfP_?7g8zI1B&{b=J>exBPErF6fUzV)uIG@D$PfLuaa@UJe*H78f6&$|Yozf4F1n{tnjeuP7bpAlmG6ku;UpwfQ_7Q*6KJSxy1EPr54 zY-@KID@@}ENFziLUdJ zRaskKcCCgSwLsNp9_O61ss{>FtiF>e?TqxVF!$Jrv`{NBq?@xbyF+j_1gW!OD-;VH zHjUI;&TyyuZ*g4U0+_tNOgl3#4RRFGJlR3DBu^~3HcU3WJ>XKkhTgWg2sFZx>1%q_ zlB%Hs&~fR8jLC2~zSCdprqcGB_H12(p9gtzTp3aBPi`r178G= zUhUkexilMuIi3(V>OI|83?`H~kh*-uIm^BSg!Zp0I9+{#) zAjxS#)lBc6w|9OzFUS}zRVrnUb4xy+%lp?2{k-G$Z&|f0{HJ=YS6mOG_wDDPVCJ|` zkgC>|j>(4o{85SMNf~9}krTr73ByJC)4+3DMh*#uqa7AF?9y$@Ol+T}9xaw6X;q5g z@SV=jWz#dDOax1qwFe2AN(T*-J6{jVFst&|0J`Z*k^U1gx?LTDhv! za=_*HLoP@1fuYk^nI$=6hiqU^!+2k z+vQ(5536y{E9qlG)#HWq%NfBaz-6)K5O&$PWP&%G46eguRYH7H5P;%Z;Y25hTZlzo z+P~Q)SJ$guCRYb%qp6kyeXT25T$-i`>lYZ0ek*qeYosJf!NCYGM}yOf(0B(LHw4Ks zejn1pX@jbVK7=~-hjxXi;eZdhtXStAuGJI{2BwW{=^YJ}@hnh{Bd$@p{s~B}HYWR9x%kfYCu-j;~NJ`rP+Pw8H7Im3y{$M-#XIgOB2@ zSa?ZeX`N$#^Lo^paofO)3O-gjt{bL({)>@iZyedGdRDc1r^= z(={U+?MqOqZ0ttMe}AOyv%ukw)}qpdHY;7Ih*qKV(Q{rz{#AvAr|3 zU%RHcPPI!y%ucGxtSo5NC3>Rl%lx%wKK=qoP8F5ChB8hMjP)$up0_C~rJ);r&)bxj z()h|>b_Q+r%Ps8;`LTb*Mo3QLIWAa2%g5%^3zG=luAtTJLxvmp#T?#K^|jxeOoQSf zexjxKGIv&uLO`r8NzQ7MW@OSj4~)VNFGnlH@IhI1UFWer-HV`B?6X+90eTi7R!a_t zXv0EHL4LUzm!z94Vc*l5s_~0%BrtNB0}JvbFbI*}Cnhg+uW|S%0%$4MaHecl;;RlT%%YM>FdU!JN>Y%`pibk*rHn77fEX_^UvG@f zBXf)sMSe^&^36j9eVD`f#*e&5+5(>evCN?LHm$tNGnUG8>D2E02Vj)=F?p?AwS7NA zOyTeXQB`Ex=Tc1ffCEM@d!2@s>`&kbV!<~YNRP*N-PmO{ z25Ac{XI{Ad3`jR)%Th)k0ftyJ)CxM4XVNF`3rQOm;(nO$2JnS@TAf+WGNAVJ9J>q5 zI$Q8|8FmALB7nf8Zg-YP2jUKR>9-AhXNgi{BGh*#m1z`_t>fW14Wk_O8_}=KZTy*yjYz#{(4Ca;&wA$YlX6 zkTHbrw44Py&~zfxZcB**`Y`bPLe)Qx61OR*x})=0IMbEOsZl-iikaDEh-F?t$ssbW z%gcsbm7KtBC@N|`S(NyBENhN~{z8XMm6XP_Wl7cu(esPZR;Lo|BYc;sXJy@+u>`de zZT+s4P_&b?QoysD>0Sk*Q{i4!&;j>j3oSSVsfdOAQ)l_X%g9hPyEcGfx;oDaj?+&d z_$IAd3Zx!oqR2F@G&<|?`3wNu#r62cPc>d_8oR;fd35zGTMoPR>@aho)IeAuiSu;W zeCw5k%X4FQIpU(Vn1{WMu|ik`ni~O-HbW*Gtx~^CKWYsw`ITI{hR~vtuk7!Pa%;iHcctIb#t%?VK7N?$Ps%!1?dG^XUT zkH*9COmjL`fR8Vw2DE@~Y!(fBg>$-Bqyea#l9cfzY=a0r+X^Tyfr=UTb}*N2?&Hx5 zw|7$J?47_N+5xP?6&3d0jH!9zp;rNY?yYd0ME&ie)#;5946xrOKS1rC#C)%mBHnSlh^r+0df`4#$QW}mv@={?5;HqJQ%IOI(LOAao#113wJZ%vw&c1Jc`*f zgSGW{1G=Q^legpMKvN81Z6$<=sXYi0%j^wAEP4__QSHpeZ_&ow0kp9(7PwX62?FLg z-n4NWZOluijb&R&;Cb4u1c$+3ZGSRY+i$ezte%A8)e$hKUqgtPrif6yr*0**bZ2<3 zkaH29)%Xr^z+b!p!(q;CaxtnpO{VK9gkEV|EA2jC+A}?MpHgOsvfIfIb@BF=DqwUY ziuW764?q>iF0Wvr`+SLk*H3&8;1m>~a#$qgb2?#yw2Wh*$gWQKAOX)ZGGy~7Ae$pk z3GYsoiQG7qSwR;oJIjqGhx`JWBdzmO*MPgsw^K;YfV<3>%c2G*7W-*wKcJ%PIQeoH zP|=NmnM&zI@Gn(P9zid$Bus5+y>G*fUe%YplB>hrU9ub|?a0-6sk3-D+jSe}l@-JQ zlXhq32(dqw)4KqCUe?$1!>m{%n~}uk5`(IMHuh5YM}Onma$e0)T#nal9!vDTmHW%@ z#szAodqd~B=an3wH+z*ty$X1l)=}s@yW$@^Ot?X%#*{oXg0Lgbv6VyPHfgtEPRpb` z)DD!W7%5D4k>y+zmM>e_E;RLr6c znEh_E*HXR^tu-wDSGpYNzC15ply2(gTz%x4sT$WGA+LRLUgu}4%PO@k7vyN zxXI*nEV<_8z&vfdVY?09{1_{5o}qb@G>O5j=w2oj2BOhO7LG)a1}FMx5<|Qs(5K2djMCWyVH`Sc6~Qih1l)~`1L{9{;L>g$ zIN`|Fwvlxc-$VaW<-qsQXg&C>j*58ZEM7(6(krqv)*#+05;oep`Wxar0b!n&#KLPM2wa=8S-J_g3wbNWc( zwN_Y5+S%MYnYGA&)vZ;kK=keBFP<_?<|P8OBnBf{DKGC zew^HGr8$b(I-gYtJn4-v8J<_tcB3v-T{g`jt)xSz{o3VxPo>PxPEVbI!+3TE#VOK? zIXHlb-=CRH4jF1e5IjIeYL)zH_z5XA5Gu(%KtbZFp&(3-Q0UzdDyCAHwx4q450u^2 zVDaYCr=(A!tuy>j#6d1m4ohWSR`zCRNw<6nf=(`E0ik zDT_q2BI-s~J`Hhayf|+9^SjBR@a=E$vX36{)M~tRhcs8=nazyOe!XC)jkPd2#*eR% zY~Pz8=LIyLC<-e~i60S}(X@fBDq?w)5|0@b0s#oI_B+Q+F~1uSWG#A{nF$3hHPipe zT`NiO8v6e^!mU%qRL?r7qH@n*5zPyPG%skAlOYoIRq`*uSWwJ7x*m`zzw%6hJzvg0 zJ^;plnqYqKavB#*xUiU4L_zIeug)qNd%{b2s#ZQExM9#XQH|dP8R=Cmu;(FD*iSH60H?NCu8ap0Hb6o&e;E)XV9W2$<;uzGi1_H8oA&Bq z<72I-;Es$sk;B|Ifa~dR^{~rW&w$;((5+oziYcz z^2acCr+t&Rv+SW;<#-U(o@>gc_5Db!d%YT0vX2I;sr<*YN#*!IJe#QfI*F8`^dzd% zEq0Mj9w-UNqmB`Mwx1`yq+9@&l_$x1`LpgiSt=OD>E<{4b z0`*}Bu04xCnv=}Sl`6N9G}%ZU2z(HfrAGMz2gkr+62HT=1Al+zU$g_BJMG|2>_8Q& zKCI$JLzvsB1gmx%48pU|Er(U&IVFCJR)KhICRObQH@~Y~G?zC~%2QpOxisIB=Td4H zj)EK64;$az<%-D;oGVzitO4gb$lKxJ4KE`MzAFa%|>;-Pr zbTA>9@w)zQGOL44tA8hp*(UX>7o$~eTtiyb`3Z;_ns&0N;q)ie_)C_?8XFNLL_Pu5 z8JTr>zYe{B?bNQgFVM&d^|$+FwHBYJf2nc~=N8ydl3bk99(wWqiR6U+hTb0a~cf~94ptZ0Ynbl)b+GA5}Z@~Vb z-TG;K6~oP{CCU6S`7kltetGtxX?leXN?kdN5SRGZ?t!JFi1=ID~H=>G%Nu?OIXV z5GK>>JsUTt-}dj4A75B^z&w^-ulX@75gzuX=7pS3&GC*8@E<)CuD*!M8f?VRvZInM z&LJ;F0KICW2ib%N4|3$LwNSsg!tQSM$}e@^+0CP83-xDQMmzAQ$+d0~Leyt_i}Sd$ z%;0BX3OrD_sG4H+`sF}_?tqJcdC*WLQ1CG-Mb=8-9+w8KYx^(I&B#!DQwQ@WI&N`S za&giFsLCuCLz!j~ay5=Obr50<{oVwN2SXqxAI(NFo9iMTC)z^PCwdgH%zn=-U@md`k^ zb>wkL16hUIyNIiaeG{USfJ7>`7ME&D_r2Zwn=HZW03p^kGC|&wL(k3ZeqPb3Zj~@9wyi0l+&pEu&D1W_Io^NI_6(}v`)>3TDCuewT4f^FJ zeJnL7#o}fRAa(8ci-kWa9p4v&-w^$cAXW3JX|22@v-5^r0_B(+bptoN^?98u!Zz!+ zs}z?yR#%6pV7sG*$m)cayM7(dtBE7fbWFE+uVPRXX&Q^7qy@pHLsCWJUISM~vsn+p z>vx=|EsmB|=n_;5E%rR^$QThSik|oyj77Q%%(zVs7Mdr5EymVXs?v%)~)yie0I7!@!Nu^bL} z5b@xW-glTR%pH^xKE82WZ}6wA)3tn;f)4q{nRbcYGyY%HnxbN$2U)HCeAuJwvSC!szZl-uh1%FNn#^hcdD&@kfW<^QIW)IJW{2|Q>*xOvP2y?p6 zzHxO{kKU=?NBOzR%&TV5gi4RKQ{pZwVqDPEQa#Zx6sIgU`sV9?uJRS2hZNuXXAc?4 z^+gZq5FU`!4$QX;Moj(30398XK-=3f%>zH1~B5y_aNYDI+`7Sx_XLkLbNWvavd5$ zOOKZV+D;MY2k03K3Uie9cHK=OpkLd@MQ93k-;NgQXMfx+LUsHCH`jXqPW0S=A-6b# zXfCr;0dCDwrP}XshC=vnD1`GfUn+$E2n4qz1!J*PuxZ#HRn}dvgVXDHQ%yc2O&>&< zd2T3OYl>kR0Jhgd8FF!tynXrFB?cfSy-6T+z?0$(CH! za<-CF5R0+hycY{zb5Y4Jv|yRiRQ}m4)H?BT=zC@tupst~#}viUf`aSv4EgGhyV`GOS$#FREDd&L)(6npOVM0ey6+NACL;9UE?p@|o!+#CDx1Xt}t6R@H zq{zTF34?gjCVcrGRpgEWU0BrK+uqsM*08g!Th!F(#hqX1jkS6B)})q#0RQn5Z$D$9 z&nO13jTw|!9vc{&$9xsY6Ya4i&5<1=WMW7C`GscEhvAmSUAbK~or%^ddT_$lu8w_A zl346}pkY><5YLnX;kqCI%mAKU7*Ql{rN~T*hIf`UO1I%YFo$@ysBv}m)#hVG4?0zScKqbwdL-if zZ=^axvXQ+puIhV6VTG1{-qs=JeMYCh;#SgO`)DTR+Y*?QvE3U$c=^M?w^G?l_Wc=a z!+BxINb$Vp_M*oAAHvAK82}yLy?qxaQ#%(4A+re6J53j9A7B!qXyjVNjhUTH`slO!i;;>1UVYpD~o9y`n2zrjnuz9Cw`gFl}JGmY^3W0~(u#Vr4!sI7eZ zEUToE`HCaA4=iR{PTV&iVJeuH7e>xy)9O!IJ;3zRb4t&f`ru%7fdBTQ z_LC!L`7t9@Vuw{mHT_=2*py(y*Cu}8$iBDwE3 zz7}fwKl&a7_vP5-E<^6__4ZIZEtO1W?b@)zeNER_r!pPoSLSL(K(EGTF1=smw}aJ$ zW!$*C+A6X{2k;XzlHktFt*nHm(=cF`_}bydZ!lC>Uipaau^1g9iC-W=?EBzF+nIK~ z@BYdqIQDa`(pA(-pPa2uhABo#(i|#tv80UhVaY}rSYx2bCMUw&UT@LpUl)rQMi1q z+R6`F@%8Q;d#?CgPB5ZOVg|K8KWw$TGq|P5#K#+st7_#WBYFSqp3T(`^@$v87~0bzEW>-_i5`! zSUWiek0ni~Xk7Vv&NQoNuHl8XmHNj&wSBeq0sFxx7=^*3S)K7%is5AVoEv}cWu=6& z1H?r70^0bb1NM4qKDZ96a}^(1MwApx5MC9F>PY&>2BuBj+B9QP3;PU16KVhR3)`4< z7u2jW`Bux+9YyWOCZ>$AJyGy?;*nT90akRyedYU!)hs;k`GM8uFdF?QH$hOjvH*|E zSJMv(NfM|~IS&}=$IU+?~`nq~#h7H=W_ruK*4I=Rf{5zX^()(P{XLi)zAEFGv>-d=oh26HX4QPp+XZot8t>4s3x+7JDKyPba_u%*Ykxjv_Lv`Kp0YBPYJQxfx3UUI+a9^2 z_52(_>Gi&M3!O|9s(?xrVFkpeRHSu}*8fL~h zc*$XJnu2CLzrL1v;aTP`Z&y~-olFf{n)#bJKkS7`5tEw?CfEUH&XxRV1|;0$stRkW4N&sr8LUft*wzU8s<-JK#{Jpa5d#L=hj1RZ=Q$+tMS zEAx<6QhF9?^>Q(1Eeb9H9KjQ)xi)BmxJQDWO(Q1p$4(8E+#3+0umh3omQ)(Va}z03 z{Z67BgI5+&IYud$92*c)Y^aPVR;Bh(X6@*+s?;VA%bU!}+txJD`ShVpAMO_|>v>@2 zPX172iC2auc6by7i1`v|#zH1^tHKUs%)XbS0c%Ggn5Pyj$P%O%3l8J*75Iep#XWRbYsQMk0JUG8SNAiw4pqsxOjmxmoL9TL~y6|PUzuFtYu zJBwZaFuML(=lXAp`zAO(@tBCP12Hq9l*46_e17DOkov)2K8{p~c%i`;G~Bi@R`6LR=Wx@VJa#af zaS}_EB4vl82b{?Y91u!KsbUW_kYZ*l$jQ~9$BT!|c(IaR)F^Z!j&3*EgKF>*Ltos` ziD+pri(;vAWS621+iJ+<8%^~RDBO_4Rfk%7!^?1|-{h{@HZ9yV6=OpGmQK3D=Ir=? zu6ewYDV+D%{Q9ffx40`pBOzBaL~w?#Ssz&qD0m>fW%F{^k76VLF%QyFPe1QL$;=|3ul9+B81*I4xI*f&d42{B* za*&OlarBzvx4!H#LRYV7$X2xf3)b z!FIZ+F#k+Z7=cw=2v9@?B_{TOK2*ZXfZ)u=PH2pjZ&+YMK~lT4ets7{WpFKn*HtLN z!O^0JR2N6g!oxa#JA$RWP7X>}kXV-P}@G4v{rj8F23GFD?`yKf|y_0C= zY&DoIc?Zwc?=r43^ALw_-mqZfycbpakZq~8%rY7IikI6sPHAC<$yX;_;fK(gIr+u{ zhWdTY%dz)>ny>-+MTsjg|DQb3cTH@Vb>e*N8_^Da;~N7 zV(Wwb1zC}-V0aYou=Qm!I4aL!D1R^5=`yO=I|?RLrZQ@aOPTk)&M$|feKYI0d(F#} zWc@0pLcF2aI%O85s9;Quk(Zv8tVT5m&&qS|cvhA<;91$h$FovPPlt4Re3a8uAekOO z;i8VzOD2ITk{z>Io<#sB3&y$NRvZFBRi;(Sr(vLy=sEoVjCo{giXQ-<^5Ca3HAT07 z^pTxJw_wGl=V!51LFzVm<-(*6ev++Dh$`bTYn^ZfTYKdGpZiO9ZEz`kP?e5vy{rNn zz7rmn>?wO$1sv6@vAYVG_nmHfJZu6{1@wPO0(5`Ir4(~G4}e<0AYtkWnC*Q>-2^`R{QdBrhSA=NrL#c$ITwXSHMz=h z1hH9r?AEgX`Tu%)Zm$u;oZFFwtpLRSMV!Nu(tUH^Dw8=Zv307SyR<#G*>K7Ik9cb! zvvgmpRViwYW;@p^gQ-XM(7OoUQwcw|<6f*8+A|aOjtA{@GX-su*Mqf8wOGE_bpsR0?>sTl!D8M?U{ zW%r+!zMWCl#1o}!B-i0%pEVBpPN!iI!0~Z7jf2)X$LVByK(94|hSJ{lKtBZ-_Zi!v zS3TwB7*U$?4QW_GIdM!1_QL6m`C-r0T{_lVHEN;XFrV5((#GX;+07QZ{3%6g&r!hJf&Pd4(?QL5=333Jt*z3q54`KNg(Xew>kQq@;}5Iwgow< z<={9EM@b0g{Jh~y|0?y*o4d<|J5jC_+N}Ei?1iRJ*0q|~4)-$YB@O;2-ZX_NL^ou- z#raA0AI0s_pStdeT>OXDZ2rXcqH^-5E*s;re=&V_?tn|lu-U(qil1aZD{hQ_E30{d zYstvj&q^C4Cff=A{NawCfHZROMtSBm6NyQaeO_^{{=} zIy%dXFfUf$F-*Q;M!GA zT$T4&BOT};Gf1waXzmv*N_{Gq3mhMO*2uJ0F9$aMZQc&j*db;+GHnmp+6~U!M>yA| zvy_?JvyzP{S0#upX%3S++^HNsD~1DpfJe{m1;7~lgoo8-lc9D+kf@B$_>7|D%eMSH4sjGAr!tnShVWJL77W~q|{<~T|-$TB&ffV4@+)% zax2>=pUnK6F8->_ujt~B|1s%bbi_Mag*&WI`Z1yZtmVurmBu1(E~CJD_sTOiy$UhQ z*4W2ik6hN%I>A{ggs2XdhPm7j_td*yfL7STMEh|7-&pkzU2p%7nTiSpfX9uIX+IIe zxqJ@pwEDInosbX2t=nDh&YqZ8X8rmTnIBt!duP340Zv_WfbOMNW>Z-;aogISv%X1R zChcb+!?u$E-ircXJY8r7PP%-$XJx+MGDVT087IjusVkWY+{tP!Ot<2&TVKMtH7gji zqiwcWf?EkNHcI@Yz*-KtaU4E^3jt&w?J`X4zQc2Fz=1H9wT}7%(H*}DVyO4b$l}fad8VHpncA8ZT+Z*yDxt+2mBUMK+7?yHqm^i7c@F&cFlojPh zEOi4cg9n^@<6ryw_FLBTV5+o_%H?Bu;gzm68Rp(%rPA}fE~r0tlFv!JsZm9HR&ua( z4!Rh1tun8DX%8Gjo5E2GiW(TZadL4?D(6S6$;utlKxID-|&N=J02{h_x<54ls4Ue-zr9Gy3_pg?Y;W?^7zG1VX`}^~6gpF5TBvRQMuDAz-=~Zkvssvr& zZ7_;#&*x>&&BOCmn<%|{9IopSEh9dxXTofXa+zqtb0 zA$E@;b;eUK!*`Yaofs&Tqfv4sOSH31%}&^;T@yvHn|mdA2&7_*_$ zhUU1+$EvD47SF7v5FZJUxcMo&sQMs5tQ>?WFZB<9bgM7FNbpn+YJS4T>1mp-r^ItE zXWhQeFwCh6Xwr*gv>z;!_HEG8JNlm>%rZZlv- z8UT1b_?cLEVE|y)SA-!r890)Qu%_ZfDSrftCDC4&N@ZNRm=DPnunR_hrA>EoLdLe0 z)*g&*5Qk5)9L^bxW-5W{14MXlP^orCBX%kro#1auv*LmXS&L>d6XqE*x+b5KDSMY#HNyk^hMQf zweIj5uTfq&(1Wu;b|EBs-@J3qsamiu8)WO=;$GAtO>SSaykel;mrBFWf}n_jvP?BE z3^;(`Z3jq_1}XF{h2h0$@vlo(p3+T%=Xs&8rIg8DPA>sV>cc)D>zxwbDL8ONZh*2$ z$b?7@Gqe<1XeaHIx{RKo`SgcjHToe&{Y<->Z9}x?tY|Iyd@F~7*>+>XLlbPTB1OS6 z`RqCsR&TDD&QE|T43mO4eEJPlaI>x#vJ@6HbHQ4(Qxi<_I#vLOX4>^P%fZs%aE{~u z!Z|v4>E4g*GxMElx&LN|1i9guy#AQv{G51sZqALjIBbQ)O2EirYBcvE`}i!i&x>WkJkq_u7#C=j1kpbarUm)NFT_fH7prO)tTn`p7=F?AXG1gH9iK@+VRuWtrwJRZRO@EYmMwCW}ESuuK95W9OO^*-OVt^=`n3NOCdWx=SjqG!Coqb;CQI2B$)TjNIuM#s9x-xcaA}kCML+P z9q!yY?{_xKx$*S&gb>P9CXi@0mp$(VPrM8<_V4^U^%_w-JT}LatgOZ{{5o|oUbXJuWOxuFggFoak-;(xvO>g#pLpk zt#tS?b zDMKk`XsK{#wsNds=V~QFhjNr=q32>H*DK|>_fj0ZQ~{nb1zxeKS3Vph+$qG+yj{A; zt=mjZM>3=XOM5J1Cn!t?uA=+hp*vOmI6DQ75Nk?GF%dWnzpY}05{rMI!SY7=B-nB- za5=?siAxfVOG46>Y*Lb3ofJGJNii)cVn&iOF)40Vl6rPhVoH)mla!v8R5CBAWo}yWuoeq<+qheRj2Dg=X zZ5@Ct$yoE(t0e_foX3TiatcDzw21+bGk${(@AukT3v*{owvTUM@W5 zOt~^4aXiY=Sg6Fq%u~wb*<6f&!3|em4fmStw9|gEJa42{aj??Jz3OP@NJ8lj_3I7s z755-LOmvBAAs(EfU$l5`Y#OH2JM#C=KX|Bg+ZjC8EG|&=1M{ll%t?JwI+kpRDvRUr-~c!P#xV2;LfyW`92m5w?05dIfR*r~<#FICy+T^YD| zwtCD1JR3V4amngdMfrtjTrKW%AjqKKSW$}MT@CXy5LF{yNCE1 z(FJiOO;mqa`O7zYlONlP)f;z`h+!x-@0`ab_cwj_lLX*k6^^S4=bG+N;yjHA?P-I_ zzApmv>o?qvn#W<{%pDIZzRFKBlx=Fopn(tJ|4xnK?G6D@EMM`oV4<(+d=E_3oqa1# z8U@k@J<;729^jo$rwtvYT>*uRG$Ve)%IRs(ntAp7=-<0Upeh4 zQbfYs$gaP`A^Dj%{ETTGr_?4#^ZiOrf4i@obQ_Cx8@F&ba(pOml`|XvAIR8FREWsR z`q5aLn_vUItj7&YC&N+-T=URM$2d58IbOfN>w+twESrsM-4fkZ=J%c$RB=3Cm*&S7R=*BW>-qe8mTLN}WnegI|S&5E1>FE4B5qfeL7R}RTAv+))t)<6Bt z9k1N-sdJh>qbovfqwVbcq#%$UasU5{pKUuwi)|h}v#h|w)^x7jKC#Ss8^f%NtZcQ- z+&_^@th6(Dy0@JPO|mWqR;CjHhJ4;nUIn=b6R@HO$Kq#2Fn6vU#~qPbg`Pm?f|!ew z_AC%Q_lPw1=fE}VLv6*%Qt4LqeD4IV&V1q}j2?iG4n~*&b&j+eDbT(18MdynE+bDG z{d1uAcI)LDy=Xgi$H*OzE?g6LAGtJ>P-W_PqOay$u(_%qzntL5^n*QCA1l~xvCEqB z%)L@|%mgoE=P}%xub-bBYI|qpk}faA>%K=0SDU2{7P7W_p7|x2+2OZgnLjZWTE7Oa zThC=+!q2R?Y)wu8b3YjRTXqaz(YV&0p)yCNHQHM8k;e-%xVCf;j22%veOkb717g&o z7N(6Oq@k$&#MUIwPl`Iu{5s2%jvvbr*h0YV>tt+qr?0#hKJlaIaOu58N#j?W> z_P(vxmfkb}t@Pv^pK$$cvu*GylC8Jz9--2{mpU+4|8(vf2-*ehH}YEjg2kAzw+4cs z$)V9@$NeEkWEdE>fbcr+w)HyvnInDKK=YnIH`;Cm`19?2p!x zi#Tm;VbIOr1G07xh-OToIvIjhAHqyh``BS)Bbh=8N@(LO4?3Qey|J-=GM$TLvjuye z?*`nIJAk0jgXGpOI7LvX+FONxUzS>(V(Q%%fG+F>c1{=bdKX=;xlreuE19gab_fG(%I!*(_`gtaW1(dtI zGE^2*cIbrB6vFaTieqM$oL^lU_u;{dr;HPtDz0>yz@`^C6)=PWc)p$#Zw*NH7(UEvCM0BiFA=2zR|R~O*lSmysDx91(R|1YYZcXd4< zwDf$Y>-B`&>-Vx=f41~e_6~|k3yRwpG~rH=x_6&xX?+s+^+~Dhqv_puURvMueSH_- z>6_L2wN?9GTX*L*Q}2-MsF0OuAvIC3{18b*(JI+#xPB0WsS>UqF&vQ*geI^81ocv> zdJ11zRIk{)1CHphsxp)tHDe_fg(HYjb<)0xym*mrDVbMqeXQIb7O(Z209bexF>#E< z#Hk@BPMSg|u`}&f@J)m93kSa_!|{s}Zt5m1#h8Doa(D$X>#`*b&)}t35QBSpQZ(#g zr!%H*b0D*O9jDq?>F?R5>}Ta1K(rh)hvgiQ-@|LH_INKmf)pNZi|FU8UO^Am$(>&H z3aWf;e(4o7cBF9XGyuu0BlR;sb$lpm_q)XFJC)bMd{PSz?S^TjMXy=&JY1QJ|>a#v;>n$_8d_qY6Nh8mD>%f*vBiGFLz9Z1{qcHDg2*! z155g3VX8Mt7N?RIXexB#x-b!@{U19**bDurCN?cn!6Vz)hAZO1Bxlq zeXU}A2j;|^rpEHTHr@5R3YS;7Xyp6+D&Pj-?6Z9+V$@ejrFLa%m4!}tg2UH(Qz9n( zQ=K89Qfb#P2C{3xH zm36$3EpL}PVOpN$#53x9rs-z$mXXo7#f!}H&)6N-_gr9}tlSv>zuhkfw#sQ5=&Nu`5-+fPx#nfE0z_NcV$Y?bz!T#l>R$A6xE z>?(0`X)MLt2@+t!40S z(^#YHv^2P1zs@$bEJ+RP+fT4oQw5oMm53+%<-5lLH>(OrD`9yZW@BSERGNUA(KenN zZ89}OlNWDD%PCZ8d%ueQ^3!YQ^d!i(mGGl%V9FA3siuHgJjCZ9PSi&1^bLA7)+DTdx`dhgM;JKe5fVW0C5UAqc?e}CdFsBR-Z^p|F zq+CEDP5WnP-mdWqSe_kEd!)Is%VubUYeutIF5O&;DhiYY{(>3@?%rF>=IHsYPDcM- zH{!XGwxi$E5uw4Xbba;CO6%M&`RRU+kT>+|3)|;A9l$=Z;ruLs)N?eyGoV;5p|yYx zfqLJqacPL_AI#SKu{DjQna&Ecr>+dVO2b%v)&t5Q&sD$APN0A=0kbSS(KLqFh7t^l zK0Gm$VQL$`ndU`QZPR~F+?J7H`EibP*m-?OH#Sa>c^k@L-ex}_847pH*(3v=0G#%j zl&9a9|AfVIHH~a?rQf`z^VQpo`s9LLdT^Jw+0G1FaAG<^K0OQMV_@LS`#w(|FtG_f z=9S6&==M44J&<9c=j2-30W(ogOtC|sHNnJ{W2fhN1&4SA6kWdZJ>Y`AeJeUKIjrMf zDAoP-QT~a>ZWLv9H3d~wU$m-vL3k{}HcTWg!Jh%M1n0qJhp8|y#4`Fvl4ekz$`#TM zyfTr*vftOa(>?YU*LxK32X3>LSV8$n6I^a^*Fj}10 zP^O;^FRYk+lE09fu=dM&vBqHt-JMwUjM)Ym_sb{bRrXKzOBr*&Z(@#qHt7*zzozLG zeG+~n4fmUQnI>QireDqj5hH^!ob`P&wjW&ICDvPUTy5tu6@b`6L;=f|LB9S3`&jQv zcdkaE6@ZFSqUKCW)EdgyG%qvE@JXhwsj@a)Dfkk%}bvy_v5WHb{ z2Cpg399Y}n9Hl)HFyW8|GnZMfF(7yYf%m&vlGT9aO_C2~b}!bn9lt~|iHbs~AG+j; zD;VxlPN6yp%lnTAOy!2dWAw=jH(q`1DXy2GF9T+MnYZ!I3P9Kkj=#_DOQwFqaq}pL zQBN-SPPH%LSF_e7Nosm^4v0DZDbeD=!E4ykc}XY=cac!UtY_G}+Kst!5fw~Rk+XtS zj}zOt2U+J^u%>9ON=z*outf=PY4m38t=j4TT6C>%tjNyC`O>BxrxemEZ)Oj-p)7>7 zr}53NZdHVDuC3x%-oa|GR$D-6Uf1?5g|o)4Y_u-du9t_@7g# zh=#BI8=WZ&Q)SGq^O3GmUJQdD`Yee*QhpxL#F9_mIzP%Gd&Jc;;6jHSXkbLr@iom^ zjG!7Zc*FFuapngWYSENg_%BmwRgO(7SIWi{5~5Lb)(!q0PHznmIGuIWVye7 zmD=v0Re~-J|3dD5a&RJ(cjC@qn6G{22Pj}nuDm-DMf!>*aN)_BTI4VCP#9h<8F82L zX`0Cr>b2Pr|1O6xVF_l_N*7b&TU~L6Cs<9>OtO~|DBqU^_qWiI;QqD*0rxj6mEiu? zn-SdKsV?fx-rQllDF>#BR%)mtmIFtuJLkZ)p7kM>eW;H`a$>NhqJ)Fx%+l>5+bdGy zY_T|7$$K@;Pnk~gQ{?Aq3CH2m0wfeGW|QMpAb`SNcr2;hV6C8gL&4;IB}yrP^;U;H za-OE8sVWV8Q-$z6PAe^y@_IlHdTKPX4Ae*{j5@KZkZ)25972{650xHw4rTK5q%7`8 z*_kvq;bs3d)3J{pE!VK{eJzW}(e2Q222lqEo9l2;EICq1BFY1@lyT`sfH(Y};GFhC z4S>>iC_v>T9>|WFgB_wu>=0>)@8XFE#$U9Y1-5vyPqe^X%ww_q@m+(;nI@s=I(f6l ze@a4Guk30$da%`~u9sNuV*(iLB!e3gE*zueHjpiQbF&xH&*um&XDhWoMCSc4uJDKP z`+kVh{osIORGr+N^~d-suL<;+A1ssb@r1C4Ft(JyHClNSRrGUpupjWF(ZGlHVK~qOvtuY(^tL) zT;qN+>ox}hwgc<8RZuvBI1-`^(AhlJZWGM^BJ$pCZ#v5?)+nR%s}^CQT??CU3{sOy zGXj~?Jxk61I)k%Ium}cmaN%g~z($qXcJ*%UE`i^NQc&MmhWBoRX%$ltn4EQKU#8YL z(>?2?{`L62Odu7N+#u+9h4Pvc6;;a27-`3CW6FH4%o=y3#hUJeEf^bB8W~jyi#mz? z29IJS*|?u#gxceM#tjlh_cl2^wQo_)AaFB^3yg*_j7kgL@LltyTdKTN`_sE8sv@|@ zUFYiKVG6rN+OKB!@gGNrdrnd2%2L74z zBu!`iQIW`AJ-Xf)+Z%BN)25jpPb_MbQAAr~|3@3o;czVpg;Azl_P8NI$o2-SP5-tu zhYP*^zrH=~y@eNHl>6aT_*1aYjB?f8frIAzy3D&KJbvQHH8;OsUY z)QndD_wpw?g)a%{AFn6)JmzXFx; zfwoRW4$VzvW+$!o5_-c#_9o0PyilrUS$8%eP#`RlOV&feaeZxueKGAt;y}vS2-gF092r}(QRL;u4v7z1bkyv8Xs3x<7U=B0STjmWqp7Lm@VlnT^FRO!0+>5 z!r}aAJDW&Tac`h!`T6Vy{kZXIdjpMIQ&`D~d!nlis z{Mw{y@?_Pv1uEqeO%+pTlfKpEr92MMLcX}?y%yXvNqL%3zb`OS;F||ho69CzgceG$ zjkor&HdnCT469n;Ox6|1YBWzj_v4@URN)o}cr(yu<0B0FRx=NIH3zl!JYFYqmWv!D zMg?uB<^-ul2Y88!@IwC?@`EIQ2bpzUh@3EKkmIiDlY#o8Q!aBkrnM{3BG)f3g99v7 zHx49EZo0ond}ze93Vbt+YNOl$!cU;v~e6*NxWzE)$GC;hgd9nD^Ki zjl>oF(dE&m@8tf|So!V+>DWM(yspg0>omM>lr&;UB1BPqsDugRsAY2C2r?;#(#TZv$!AG0DkfSt< zT&7tX2lup8xCFb213KZvH#$ci*WEZm81ATCpoDZ3N;%K50Q&*ltAHB-_xW8x&lfG@ z(guQLiO}@4ar?C+oWoi|q%bSFH26CA>hy zMQUBU!puYhFwA90Z-QN}>4qidkB7 z7~%^(O{>%ug(ZL-Ll)ZxUH9qE=!wIvu2|BF@SF_5jXVp$h~^srU|NO@7D%(ofyn0+kQ7pVqMPdwF=?IL<_z zaYyTMfOkh(OV+U3oUGw{`#dh2sIZ3Hp*LS-rayj+*IAj|ePRqO3F#bf5wkA|KgpEo zPtuixVvSOw&E(SLz*FQx1?Fhc8-9|gWFQfO!Ab#U`{8vDvMQyqMwQV}+9|3xd}A6x zTaEUm`)33x-HIyn-CLl#mF>TI>HH<@J?F_yKNgASC5b(!n5_5A@UPHzZ_#;|%g%SKs_(y zZ7#w`wQ|SoIe0y>K>fQmgOp*ZyAVN~6;-I#pyy2=E55kN@i}UKwF$c~(N|Klzc47$ z1srta69m*8m0?R@3FH&e-nqpYsg3^7H`&YPi{hvZcSJ0>Cg^L-;`2hB@|V<1r(B-) zEBB>oPJa!10Gg+sfa$Xe&1+Dhd1(thf0?jgL#1PueT_y!)C7V}j+;=Y%fbC8GqUU)jN}+CdQky*yn!MjJl(=v zQ1^!4yB}UYt`drBovf{G>YO*i47ZH6XjBoa=K)?{7>362gE(IX<(4%_{S>8q$F+*dBZ0uofp-W0nTaH@|tqfLH zlT}xbS)}rq;UY_n>q9!&XroB*jb)CzEMGl|BZ-MIlk?QQnx(~LgJDn2P|SSaksBJ@ z@jMd04;-0BM+`n4!1S7Hl!Lo8@SF-VR2H+;7MQ#f$m9+0o_axGce0=@d(bU{=(XJ=S9Vx0!gy?x&TQ?1TPOP=W8NFY5;=A$ z!lf3)SbmDrY$(Ua854Nl&5_chUPa4z9PGqJ>nphBzQRoHS5$}92uwmyw5rg~m`o$C3q%ZQ#&kIXssg`V$oTW5ih zspt$@#vNZ80zF@9f)?eT8b|c}#;t&RbHL~ndR@Tigb%;Vi30%t(U|HM44A= z*A9;q4{XPF^IeTMW*7=HUPtxnHNy!1-B5>R?LTZLS=}yMC z-Fh~%u^+?uk=j4s=w1r1Dx}ADMF-ElyY#T)UYf7)i2Pw-srbxh(=7f&F0!~{W~Q<0oRLKxg+$Z& zRr(x-zkc1^tCr%Ifbi-yNz(`TS=*rR_aPG&+xrb45+2Kj((Hpnl$MI5QlLER?Q$kM z)Lgc4O7I$rwY5ZvZT~mfT_+PTDsVmdWN}E83^i)^7Vcx>=M8g~^x9~MZH5hNG9+=l zw>H;@h5k6QrlD`bI@>kKr$GrHuD7)#bl%{wDPBD8(5hBaUPsuh)a#Ikf-I)Sg9+EI zPbozKF_kvw8Mq@SDQMMYpv)>K=STJsxDarZkEyHKmp?^jk-q}cCp#7mnbQwtt0zxU zGPG*A=Nj2D5_!Ar`q$Q5rm>yt0>Kj{S;7(-1OI#tknL8;5QO_-P2^Wuh@U@m4P_Xm z(l6WCwll%0CR`sCT{ah(HvQwUL^)xGhDK!P-q1(Jvo@iR@3_8Bz4diMk!=nhm@uim ze5G|yze5V@viC(1T=alZw+@C(Cc$!Cb5Q<1k~@OleUtDb*v;hNg?oiWmJ9@4y(yZ{ z;e_{K>G+Rr_FYnL_wEm0hSLL}Ge_bnjTQpUy%ScEGkz$Xr2I5=VF_2urfVe`Ev|ir zMY%CUH}a`#`9Xb6TtG~T40$Dfgr#h!^)j^fsq0Riei9wJ8ReYSNuQ`ASky|xu%odR zart<1tUu>va|P+t#-j=U$Ox(1n#S^kG8;geks&sU;9dOHN8d_tbqnhvmfw5k40}XWdP+Md7C{ELDH?0Xt+6e>E@mMo&*4~cjDhPg6%#MUywJ0~pSbo;-RvjmMZ$`7z{;#wlIFb$JAYqj1xhgR^x0IRf)mXmgN03z zHI0jBUa`sgCpcrxgzq%&bT42{W6CqSMRTKL-X@yclbzb+cgy|&Glvdcm^_AVmYg4M z|D10~XG&Sx&y;QpfS~Wtu&99oS0*8n{1RNu6m!Xit?n7_aI=_e5NF!|I9r$ z!}Pg84P}W>WM>(cwS-$6Rw3lQovxT`Q{SI_o)Sr+L|{A zsw&N6Cd7B-PjEciGUxDDPtwkw_4e;K?C2kR(^SSw`(@XLPCw!I&x+e`m&cYyNZeg^ z7)O4%9@@RP`he+F=aeGbl$y|#nwtxkCU03*k^A6w_eVAAVnzLz(=dVD%Bp(%9H$C_N-^X0Ma=He4^ zxr1aP-O?R(uk*ONJ=}4k$w`}ZW-OJnAiX_r(bY8xD&uXDZdJI~+HU{-ygPcBs%3cW zr@adDyatMraI^j=hdr;7ZrO1rKI%jm?;h@cts_Vh?snFU(}Z4-^^oY|cRQ3{6$d44 z>UPW9hdX`CZ#Ma-@l)uGV}9Y1VAh6H_%Oal&TmEz-|c(2@_Xk^*O!{sY;!5dODWFF zj(cHle<+Nn9*0Lxet$}>iAKkqL0@>?NNeAg?QbvWni7*ILdV^F9#a~=ibzsByUUk3YNsSyOYo9oCnXf(b*~2@iiHrmy0)B7ubIIGxtN+B2iQay6rA$ z*gw^aZ`^QqzI*r)H$vrf>2al@qM~X%o3;)XFYo z+NE3%O)0+j*P|eumA2{T`Szma*}FK_+g|65FJC3wZcck_@4{_sy&ShIF-P|(s!7Xm zftfcai(Z~9_%y2K7?i~q*L-E`Ffd7QF0^}=IVP-FohRDjH)KKHlKhm!_gWtAkk zkbw_PS+*&=uFA(+yKwqVGAP3bk>i)g)_uS3WTpP1aUFU3ITLDHAm7xrDshkbr)mH6 z(KtGRF#?>9_x z|MS4E{u%Q(E~{ThUcd5T%~k9yO!bnRsl_+nrb|lxJ>JjFEo%Hfba81vUiNBb^->qk zt>imo$?p5!$>$7NvRKK*w=Vw5hzhc*AEWbAnnF$QkO!I3Jl%&(ZpVSk_+39dkZ;=b zI`6DM8TG|}5jmJiyF1L+l_lx>u;fB&%^n{Q!-Hc{qO)^+r)=C(nQZN}?`>0LFNfcR zS$a^T_qWLo_no^>?KyKL zhUjMK!>>=;$Fn!-CY%1Y&1FS<-jThlJ_asKQOjH~k&l{$L11kv+`D-8$w<14U*vsV z9>Y9^OMkzq`gfa8o@eP7^}c5}dU{KV$l39J$uS=?yr|9A_oAshYd@h@}a~CGS4;9?@wg#yHe%0cjlwoa3WfX zW*N_wMLTP<7NykOTm1bACDXnOafZo%H_)2StA{s3O{bA1CUDv{^QOeda?p#s))!x? zeWvFa>DTh(BV?ZC{US+nJL{CqDcJBE9-!GRo?mMKb4$ zZzl9QA4g~R&eWQvtA9D`R_tS)hB-hK^ao}{ha3!}v#;uXlte@143#6eV2*t{B-QSC zI?AubR5Q){AmF;_7gXqs&9A#Yh~#$r)K7ZDpcB^;tA$0xc^tFUT>ioAd!DzLDuK=? z_c8+F`s+MbMrpU3PbydC@X4xlISMgxn$DW0o4-DHp|i&G;uGn1DTIDb&+X=#Y2;$& zQ9Hdmh*pCjx#=S_O#1mN%Nd>cBJbVJC$Bm5=zx=dXu|e?(0a0_LqUbkIC0{~X-Q@u_*4>6?6mJ$Q>C|Y zu{kD9@#onV`fx(|o0S6nB$(&amoL(O`Gc zyRit5c5lt?PMYtETyAgMGC9&=IT^H+yL+<>BX{&S$u(FzXve;erfxnPYB#1}O4Wo) z>WS7pvDk6v?55+eL9mco=ZkA2r4TxsPo{p;bDEg6de__=bv>BH_4@idZ%eB29v%zm z9~Njg#Tk;#6awvm+Xk#v^i)mgg-lxqsv;jA^NYgH7a1!&`t?5EmM}AJgg!n}7Ml~C zwCN#4h|gauA@H3qK5vR7GENuzaBErg%0RVaQ`rbf2vh;l9_Oy!mTIOQPOVAtv7-%t zyy@h^_Z+U`i}}R}h@w0Fi5(DdQo|)(XjgqMi9Qy2^tpe#aeMx^VTSeFo$F>4pOZ-> z83dSzlh07`RA)P`(jXzKe1Sm(hE6}~R|VDRxET8N{xI1Tm7OkhhJ8oZ-`0BTr)2S!m;G1#OVI|E zlZBh~UbE@*WErHl6JRu@-1XopNCQc~q2HNhy5n1u+%JrPee-Yb_IA*>eD`7}pV{c$ zpEmm~5{o`fxLwKD4xg5xh%i~V2fqI2@^eM(<_3AvYrE+7< zcy!owGEGigNv(q{7^b#GxWBB8Mec76Z%3y5V1n|Dom-B*_b?Tg2NM4I3? zA%{_*lgbV6mYiH40x4ArqcHjXameDski{*=+PrfOMXW4c=;Iev%rbz=dhp)DBs;fi zn`u!i+LlstCE=@sVPth;RDLOM)Q`d!=GgROWebVwZ4P~S)USq2xB-6cD}z`Y_%L5j zE%;pDT>LXc<4k&)QII5NiWYYX2|Fqy2IrVj*3*K(?>%1ei372A+$2#%;<^pf|a${J?Da(yv zYg z3pLW_V+!%m96Hn~h_TvF%su-bnIKScXC+m3Dc8+Ji%$kew7n(HVKNqJ5+D(1YdAf_sKo&1kCaLo3<)B^ou$j!)8GoNBiu-J?ng8V1 zDh?tx!ejd>kf=~JIEvR}(`jOtl9B&=D7WD~}m#cFJwexpwgcCEv?oK=X zdXe{v%(#@h1Gsk7W{2QP{$R=VH5g7rq3O-jBb|7}9BFSl;_YYuWE{cC-NeG zApC5*US0;R#2C(x9m*kbF)OY;dsO$S^B?~GT5n)gA6Jqob}BUIJ%;Oa=}e0)ZZ;_)5(CyMqvQvle7^2~eD!4e|M=>! zU;f8e9S8o$SBrxVCNWd`@B5YUH@f$7qxzgkLk!E;ei197G|mv0F#aWx8IU}Oeb0Sz z2@Dgz&bWsIJ@N6)(CJ&tB8g;%*|F(A7k8;J>P(nI@)4^@*pauH#bqz>=;reAx3`(6 z@Iv%Qf0;y+QT&-UJ&MD?6Y4 z+Q1oyn99Q?1M4*xJ~tM=_CkXz@|}t6NLEq`=-OuF~nCKdzeB96_*ctg?X}L|4fMH_cE>nl>-aNxcZDHf^b?# z-lJrLBH8ui1J9vY<)LrQ{)-UZnC?WBO*~nz`R!kAerrF3-I`M{ZbK7KQE|1S42os( z%aaD>P*M%ulGbX&c-C?j3EelqK)-c$LB$>+L>vR5isr9e)4Li`(bRx$5-X=JdjB@kYtpG%STaVPXjO z<`q41NmT1n{N~f)^g)iK-j(Vjcr`obHl2ub>xOXF3-@mA=8GZ9ckW7b@`=kK)+#2( zVULyn?Y-`iRjVLnKZNAERW3FC_LO0+)DbuK!sm{)-#K$Hi77Ic>>dY*^ZT{5lLwJb zA|vvyOes#!OPN~n_zs-T+qmLO-Pv} zL7H2;fo;kuLoTSQ5~%0>MU6l{6OzQyH*y&gM?HC7`=?1WHNIt%pQWYeH#l37gZBiI zgCoenYB4*0hV3k8alheEhMzoT?3|?3$9!pMGh`m*@A-?m?M8x+k+k)l7xeQCkL0> zsc`TFiqxJ!4rZ+(#gBK$m7N2~!P#LXjnS{eCAjBYGmaa>WodL$HWkIjIL} z^E-D1dZUgsL%NYP!_5NCXq`$9E*?sn@gq4nw-;%~0uR!R>*V0Z&E()e$-(SYa&YMg z(sl32!36`!!NWaqFxQSBixJ#T4xV92x^6W&`0hw@ zZ~SpsOXp?$3>NPxeeXaH%fCZl>Lxl^OWE?4+vNQi2WwfSRFu)p6t@UF70qUgw4SCU zJ@{i1K+<_qQ7SoIZnlgRAkHW6l_um;#jQA<KPFtUf~X zoa+d*z4AXa&w2Vpg8#+3UzIjQ#A;jaHmzXyuCAi=WK*|sV<$w0i`a@1Ao)c(xQ+bj z%yf_CRXqhOIBKc!ZN*+-*?SqylJR{+Y=UCXA1t`zDRO2ZaT?6NES@vTwQf0?$v0Aq zgs}LRqG2p)7NG5A9H}HDl{T!6An;T!5{nXGo9PYmncvd|+W+njw4@y^2z>4bC zT8-q)zY%!qqasokm%)W#>q14;!sHcD}s*MhGmMGO?q<<%U z0+eqf6|1vI#VX4bXN3#!Ydd*^>u9h*@E0v-u@2zXg7*!@Xfww9236PfDkGAz-6}U- z@(J(9I_CMOjB6_#h8$~E{H02ym?qQYKm||$l{}I+u$?VKO_b|Z}~{GPZ@2a`zd}xJ=-;v&5x@E?_xtNDfwk87g>E(qIvb{ zSGKD{KEtFK??~4au`~CjcR!{u3EV5btl{u$z1TgQH51gx(XP@A<*vrPO^?X9y-bD< zmz?u0Kz-fWB>AZybY??T!aG@}`#C-u2{UFCj^Kxrf-nzlH^11+=2 zu%irCbkrDaoS&)ntsDJp5T!J0T==iTy{VULQJ@7rls;sRupx^n{$Li>%0#QFjKijY z4+T1=k|?1#qIiyx0uQycvee=N@mbFHWfUQuT@n-xCO=@wczyrRO{Ox?2Iu$#N>m%NbIiBeVQPnx<9;6xfYE zz&oF<+GmV)aF@GV+xuTXPWa--%jN7oU;J2TH}#7jxmDUPe_U!m13xBlJFxVS?1z;6 zYLl%(0ZFapT~J1R=e45B&6Lx5t;)(;Yw{CIpfj}Kz-~ZV`|+j$TrsIy4V*)qJ=BkP zN-?Ab>8+-&z6^8@YcTpJiy7ArX9^OtDrz1@oxJ}e1(!LLc%7hN4mrN9ir}I&97EY7 zQe5WF{L_jgRcIqD37*_SQaIFj=<5h6ev6&NRC11JnsZ7U#*LA$1DgP;1&z5u&iSLa z8^bi0l@}o&at9zc!%i23Z5Sx!E4|kN1~A)KF6cSz+-!<*qsFZB!D4EqP@JjuNg?va z1^j)!7v`8Qqt%}RI+Yu`P`H+|5VQjYr6vrZ3yXhgsCn!kR+%WrTEZs~E|pFUx(l-a zURh6Y7OhOBb)03X6ayqlz#!|)WBTN;&a_VwxMbeOps&R5Tt-?`Y7h@Ff=Jjzv)rjW zXwX(fNmWWN$W7}1pX0?vMq7>7SxsU)RH+K02I(xr*j9lm zh98Bhyq-Q5sf@~FJy)<;D3@Z{XC2fD2R15-O#<3+8OVt&t2DLT6;0k~T#6P7ti#&)$KS&HY!aKi|WSUxHCZk2Jmk=*4VlJP7g+}A=M7VZ`-VR>^& zrZ^WQ(KR0FiV|hLYrpIVS=|AJf$A4Z#j?9)j#P9rDZLcS8?@#jiXm#O?R4$gKmg0V z2_yyZ52n}iM@&)443+6RC2-=TtJv|hTmltGS;0v3TR)C7t)STTJFWaXcCK`m^;&{n z&teV3e=T(4+A(x>SFBQyV+P^8;#mx&no#d4ooZI9J&V3o9i=d zE7b7XCg#HV>OqPesbjk!U6V+4ig%wIHO9{cU1|1WxhrO57tVP)gcI|zw3xt$wu7~(&w{DlqK)Rt2rT^!p ze=kpNPk*j&7`JyMw@)0`Zvodoo7*>^+pmP%zk)lUj{9{ZH=vC>@C`Ry#2+c+kMiVy z>(3t@#vc>O9~;MySiq0W=8wzgk1ydzRq!X&@h3L&C$;e>lZ<>}vP?M3Q#jjSI44Xv zH&Qq+PB?#oa6z_kVZLxtiEwd+Fr^M`*vpr)mglxFTOu=B+bCS(X|&GYXnmN`50OS2 z;*5S=V3eP|d}D#p#uB5=6-Ha?jJ7r!{nTc(?Tt~XNW4!b-tQ?s;4eNHCO#A?E{hYF zFA!H`ix20EkCcdyR)~+)iH|pmPqc|oz7f}pOfJbxe)lxF>~GQ#X7Wd*$(1;hs|!pT zvrVq$n_Mq3X{s=3t~0sOXmYd7CJw9@L1A}}ArTczU?K_;?J1i=) z9WIviRP>h`B6?$4@(sxGvF!hwvsYVb($Ye3imm{#2zr!dLV#8QSVYw7{~c}>Y9olH zDWfb~;qZmj@P(9EMEHxAvseVH$AYKhA9xDr7nC?Qj_Dy}`?#$Tv?^Ib{D!nj9?a(% z29ucJ(#b$N!NG6jFIo=lAG})dRMhqq;5{&}jn{L(?%$xb+og>%6x$j>j}WMJP1HgM z%X_v`<`c`~kfWui9XPJYZ>*^84wjr10>%jA;#$mo1@J5w8<|`m>%U?g@kgJ0Z zHIttqWfgei7p6VUcs1bA6Pp^gaJ_(U9Nc+*AcdWOP+gb6zt2oZb?1e9K@288 z!AesnjeYLm|4krt6KHvKQNPY^cWYo^c8*!~7lz{pSvd}CiMZ zVT1xOs$h)of9iL(fOv~OG2xU7e$t`YtV@?cUE@E4&C^xxz1ufCzcQB;KkCwO!8CJ; zpRWX()8QL{+cWKE@2Xi`pM0LV_@1zH!kZ^ePzymI%DHO^g*E1&Z%L8D z>}JQHHILU16UG$qfA>=LG&JGH?1J;1JY5Bu-XOeh8xtVBo~>uz+5cMSA8DXGtGh0Y z*8D7^aF!GY-$u?LUh5H%^F~q>>qBeufu;;Xm-pFY49eIV2JpEl_p<=7QMtb*AO;B0 zFn6E0E-Te1AHPl@c+>pQ)?oOM-yx?P5Y%@V)QcNHtp^y%s)Z3GZT--ihGVG_l-vEb z>s+8)5LnAK`Lp=IwV%>Vl=qvi4CBlVD`eoVT+{I09r?wUqJ0uVFTJX19`Q-tBX~L^ zIinx_;1QF%xe6xbp>-hfxNJ?|HKUy#^c`BFO7^v-|R7Qq&y(u5wkEt z>si&|@|vCmk#EODANeXZSkgd%Om!_;qfuF2jbt4YJDmhEuy*Pp#1X)QzLdyiA~u5> z_8*v;Jhdp>1GP-Q|wEgc%Ohx!!A8-v+LCrD*3sB4E1-m8P1s1 zgph9J^ZPB)>&K-#b6B{}k}(>!yI(C*4y#T| z&m|B|$z)1H9+iIEwe#o;n6^VSk~uT%)FxN-5uM$fr@CqU1H9jqA)&H4UUDk1{P6st z|202}9XK&UkEIIlYQXBdm+wtTrq-GIJefNcBZ=YH=0{Ha%!hNyS?>(ib`H~fg$#IUw#DPaeMHVn1a}dOs76pjZRpLrJ{UVUKUHngduq5zF7q+5rVAY}R!`jY-@v`WG!{u{PqJ1#cMbI}zT4 z;1co5dcmoG@TWAE%*{ymFNnBWuDV*z#?N{^+dlTTgX~mKW<7oN;+bwF;vRgvb3J+B z++!Bm4`);{=Q^RY$y~1=d*8vc&PxaAJ990m#T4LJMR0hPISNl*pclf-^OZW(G!i;E z^x)Xyd+DC2r<+dMAZp;c<<`RMTkW3j9tPYyrfj!g!B68ju>~<-b$X^>n4?B^RBqx} z_!ER?6WqZKN~Torxa~T)ICtCyFLtl`OFp7QZTl2crKaeKL3pP5|Fy2B(P&HWB_all z>!>&BX9*dLa^hTBoKG?a_cH`LL({!3-mnG%Rt2!94x3yNN@czcHm}9doJ-$4n~#wO zG7*Wx*b+c~TuonPG>1p|*(azD_~!wjX)V9gv4OmZXI``d?|Lkq zI9oJ?s+?4m%tPx}h2M&0qA-X!k~Jws{}7vq#tRM+eE$MSae)sjuoU42j!2+`5hw`< z0wjt1r?~^x(`n2Z6>59QO4LOypRJZ4G%kmMP%VXJ5tuF*w(->t(|3{g1SkCiLnDB$+6m zbKqKS?vqrTts?ThSad>2Of9@E`Q|^u2FtsaWIC~W;C~)n@4Ww7?{oN|wqL>zW2C@f zDwzKzSjhy7Wwi3Y=|Uz}G8Tgm9oUNA^hM7Z>P)WFxPwfz*|#*{!?`3WGpK-zR;R&H zmjG1{KYe@CAtq4wp)*4k5t+<~NCv6dCn7sEosPK)UWpu5)7>KQHRQ6SK!qPl#BzvS z8U#NqizNp!RGQ^7LKOuM0OL$70>(z33rS(Yi=yL9>;fuNoYx0ZseC{wzRe7^vh!$F zXEORnE5U)irGa)49tNxurB{YJY#SQyFCdqii24JernMs;L3&+ui~Vc}TcW@#HWeluWY z6HplTPc4fzgY`<=<+0<`-;;vs5gR_&QyQe7o&mF7>iV4TWNGj_J~+&{(tAj_p#|qs zN}W+^D}bO|K`d%Ai&vB`uJ4Lw<&(nDTnBv%T7Ekz+}2w!S9?BV%ckPIjr0(?{*X7I zI*nlrT|_-ZX{JZ z6AdYkN3C>khDl-Si2F)mP43jpw&e|KXM-%kSOg3QFE3e1*+hm6XesC77saXbCc^_r;;%}QruAfNfn`01r>ByfW%X}KcWnu2=Bzt?u%k7+ z7vnsQdY|2jTfb~PJXi1b+&u{M^-phLz@fG`aw)8uv`YlKuJK)O2XuaLFWFpj89e(W zqC}f0M^9p_6~Pf7^^7nR!oGd?HDM17?$vO3V}t`WaU)asJxS^0>r_j$>I>Yztpd95 z=Qp#(3iXsjP~iB~)$bAki^DiWSAVBv(AG8*8qSLoovQa?Bs;IoBQS5Wd3>fCd6qzr z^1Zg{ey-Q>yP?ZQH~r{?ie2Ao1GeO%CEWT?-In)0`x%J5}#wR&T5Za7u^ z23J=}2MCQueX<-&U0j?zPbCEvkkExn zFD_UfPaG7dk5Yk4)If`?r<3BeZRg5tHV5I8;_;gVCKi=(kUefW2sYWG&3c{8SaffV z$P~Neyp<5hU6LFjGm)>KiPVRQ+03{y_Otj{NvYI?n#W~$Ps^xLH(5(hB^KWBZ#Pm^ z${}MzV@TL%g|Z|J^EnBnEFbFW9weR#qaR5=jUk3aV%8)_fM`1(@j#Wkp`ED5h6 zpsf|3zM|yvCt0R<^`??RCAm6zokBOeKgweb=#q#R+F>TmRb`Fa1|5Vn>C{S z>&k*|uU3UJrg+Hpuj>i;M<^HA6k$2)f}(GYvrAU}4rqj-W_J3tFfp0R)`V-6dNl@{0(6DPGT)y~yhZjx4ki9!#jBSbi8sVuj*N_utQs*{Z(Jqg z!(?oAhTAPXRsW{!2f}aGcrb*z0s*r`OsVtSrMwHD7q`7$EX-ZP{etrF4w3i>um~p6 zWgB+Gp8C?AKdY4Bt=qoXV2NA+t}ZP~=4}UjQc1xHlR>;oU`m(kTibYuG5Zen{g+t} zL%v?(F+mk6RDj=&O1|ESSFL!zi;fQ?^7c*k+z4j^4kDiz$+VG{+;Xr)NW>`8W-NzxF4aaj>t3Kzm%MZolL zE0B7i*AAIH^V-BOzlHHOgSbrki9r}Os(D-SWzJy7jmwX z%rJd>J59apr5zd837#$==E>9~cr2U{ft7E6P^_zbOhy;9dTB@1W?Cotm2@q!b1PA5 z$kt%d6shxJb-KZIxztf9foNj_P@}GOv`A_-c0T?Z8ISw543Lhs@;`yH(ucsNYscyB ztneQenjxaUg0Z^vpZ1PR`;Kw4Q)(V_dwT-DngqP$R!hmTyUo+N*(yan_ghe}{do?! zE(<8*=oSzCt;g)^C@}e*Wy>@~|7o-P0!A`ahW;K9m);BPL|OJFJ%J)7=&3OneO7s9 z%}SHCOt_@o{Gi!Q*1a?7eJegcW7oHG)9Z$39CNKhY1&+1xDoxN%y-WQ9@i+1BY5wF z3I?`+qv3vW{>ZnLrg!Q2q*rqPXfaJ1Zi-#suW7HW1;o?$8#Hz$ZR^`M3A*)hKe8im zfobdcQoTEee01&YRgyZ4J>;m1Img0x5n~gfgqgX&+EH*tJzSMCFze9q>GbHhO?gp z1KlU`4;C)v@s+HkA}?;;Zjhce9-F>F)s(^XRpYLcrejr>p!qWNU4vO#Db#P+!d{Oe7^!&V!`b}^_rd) zlz@`V$i{zt0&u^Rb!Q9|owcH701*Ng7 zwM3A(K}QHC=6S8Aa4;RM1C+kb7Poy#>^ynA+e!+BatH}Egwkju6Ze^!ZCytZEb0bF zUeS7GP<9^!D$GyTL3b_#vzr>``>(#9G%{?o=JJ)vKvT2#P7a+ya9m)&g6?M_HSRBGQ3s{*ujLexJNFq0(8JiT zjT=dDP)LRxV){oIROHu7>==9WFVI}aB}+1r9tFf)p^+YtRuWS_A)nl~Z^A~xd~}#G zWMVgw4}B90tWRl1FPyoV9C0{t8$EEToKbWOX1=D|4O`!5v%ysKvf(ehgSiTXl0!Zb z3Z~x<{^M|uwx{`c-|>X-^XQrhe2Pp13NQefe2Q@iX=Vb6Z*0(`)+aR0;X8wW>am_9 z^B6xuv~tRyR)DY>bG#`fBoBxnvSKjr!jwP0#$nmCPyM8)vb3H|I-;d)VT6P`Y9g`Y zpezp&mDgPHJc3}NKppL8rT=N_gCW|&r@c?;%4QiczD(~W zwyVjn;NJSrV;!1TN5^%Jn(kCcS{3E+C7 zR~-h&Fip;1052?kO=Hq2Y43ES2vNfn3J))S>iU|JrnQ5wp1FCS#Jg72cP`J1$AG6l zD~r?OG7S}L^cwn5Vx~2Me?I{IJ8wLpGs3>q91^6T$bcTb$?i>QyfBlNobr)Y4SQeL z7r%g7wE5sP8Z89(8HkOWj;xU_$z*&apdd}S6nwsgpz>fattX8P=3(CmT|4~S)+5GViVXlqG)nm?D4@rA_xY1pQo-uEp5y3%_*RJ zJ-DWE=_&g7e*?{C*mz$YbA)-uxfIfSPDtR_6!|-9r~cjK$zjyp4_;zFkHPycXI$?o z;EdLVGjK%!vRT3hUe2F{S0P}Q3A2vo%}leVIV^eBunOlsaV0W|*jN4WDi*OtizdJj zQdZs}Sl3yaQ)EMZeMPB8s?pTY&Gib(!rnMDS{o<{G-nB8?t*_vBw))yBpuGvDDD!P zcAmO~$?#IZPRo$3U@1(UvGry=QWnT^sAJ*FK#`yl&L3aS18A|>QYqsgW&18dw+$d@ zukyXX4H*?pvdBBiD!*Bu8NWriqWFQ*c#51SFKA5A+HGOmF`IO}p?6qkUMTaX3IIPl zMKLl)3ik7H+pZ?tl*QY^kA%fYseP`&ecWS&g#C+OY&b;Av4@4{w%`R*|B?8!BsQqD zsy8JaV{l#madfCj3Mwrku_Usgpdq_itDFBlcitW23BzaS`d*6HgGy`Lc}2s9Xm)>?DGUujpU2oW)Y(ogwFe$st!6*B=P# z{GibBiQeMH#>_eH*A<_9ZHF=89R1#mCTg*RLz^uOP$oQB?XuB3@EPb3!`+qa#A0kKXd#UAIUh>6RDhFD32!oEtHZ`U&`oww>Uei`AU}YeET=kNN*+7S4a= zU=ju_CJV>e=~c8-J92UUDko&Bzv6r%1e>060!cB=Xesfg9R^| z`XBmS4@-7JIJZG%OTyOubryf?hl4v>t>hb%FXIcXKkD6c!Zk&5JSKdRA*5yt$__Gaz@ZJSIL3lH;LeRYehrrl}Tp>gbjyO z6j!ip~C3;WYEAXPwkKZ+BPYVi$y2<22q*y>4?ubOj2Nbdi0E8 zF%C9!Sit-gd&=aa6@q@v(j2lp-6pC9cHlB?&F1!kqkp7jgDFr6b5u$ltB}*X9@aCl zy`!VawmL_pXzY5x^sdq*)+oO0H-FlKO_lX>Q_%P33Ko&*t*K48{Tu}zKh|h( ztKciAbJ$;hhyC@qf|&l@{4|1YWxH?l<2ESmN*V<#vc2j^+*edY&TO!h`54QAGn?4P z0{UoY9zZy|wQxHpirx_Oy11Ld-3s?9&F0vR&TaDwD(1UdlCagl8O1D7wK>^y7&zls za;2-*c;e|T(kseS0`Y}tB%@d&maUFb49P_-J7|#Fx{f32PVU0#O79ZM$6dyyCsSwIU{*mWO)Wr7N^dghDW6! z8oMT8a}ocAf2Z5`-zKcL{_Rd!_R04bqhFHb(6S}cCdxRgw>9tTL+8ZSyoV&6;om-p zAju0B=hd&QLhf8$nDEF7JK=vNULw1(KTISxdRsuua%=q7cZmZn33*&TE`kuE9$xch z9&BVGi3<;lT1Z>c^d{99;=RVjTu6C=s&8(_vl6D9*OQq6$hdlCG7P!dFKx^jf>3?S z#!g1CeqGbyR2$|QN3GtxID~>yj=V8B)5jn2$Q|)0Z7F?r)tROZ9eAYQX2v!&I(h6w z{Mh2UVImxl7T4HG$#l4ABI9XkS?-%VjDMx?At@};V)Xw zVx6Ema2&PQZ15d&YrfQhf2vL2>vf>LB@v-q6127$pqp$+$a;$}m)5g-gOO3KWSd$R zDBu3DRM{2#ywQ~Z#5yKgf9(HGUw-XW|5;x)&Q=bqViec0F$08u6q{cHMTOK8nn#*e znPtlJn;~`QB@GgW540n?3)YP)<`mR(?Y2a0o0N~$gAq1r}_aRW~*bn1Kjfs8srdPZKj}n6*h9u4cA2G4UM+c zh5ihw+#JYh#6U!`*7r0o?c3ekP*`0r5^ptAXqhXZ(F*Ml8m0vf#QK2hq}A^9#3$|6 zN~`tL!7HQ?qCt5Caj_6ZvvtER7VSfj0TU{eWujl>USY$o=^I+6%l9jDA=1V|Ef+xpd< zgRqJEhUH!HNnXd(f)TzsnuafZzvdX~*}Va}V?oAlUI<}ndh{9E$2tqQo9-kgyyK1BletAg)wFz-Gb5= z#kCnrO_!pJnw!g1d+t)GIj!Ctsq9n*PT1@b2tX$yXICk76wt7?)u_Qc#IW03NPgC_ zrCjoFQAJ-Oc2a)59J}+ZMu4Hrsu_lT<1x$->o_4%&6ZSl)}i`4=lZ#SuQl^KMbF&Dw=*cP7zjLB@!2RKlZw^;h@71Cahc4oUPx4wGqn!z;+TKKn{L-5n6V@n+ z4}GzZ1S7(p(i0&v?z&kUXay*TWDnjGa0KQ=rYBK;lK~Wl6s(;)&q6|$|E@eV#_aOJ z4p?ZraH>dRgnR}fkn2LbUZW43qC_n@8ZM!Eq|8Pom<`ge z!NbflOcEax4wWDno zZ%a!ug88|3gyL99J4GXu@1G?&zf+NnSdeBso=sa4r$wMiK^8dWAmiUbxE!WAm56_cpGxxmwafVgHxifhk|lVf_}ql<;$`HJVI&AZ z&2Kf=U(G!oX=w&cSTwtbs$v0&VmIej34r3`2X|t?HzN8;b$w760$Vc6pP}NS6&-pa zS_fsouU5K`)R}+r3%L<+iAa9`Z8NX)S+v^_6|kA`yjEf0bwL8^w?k;jxOjhVLBp_CHUR28EKY33k@=fMu7IHU~8 zynq1c4VC*2zJaCA}YHrf- z*4C`GV}#J?l~#6=>PlMrhet?+-y<&I{Xz9w@yyN)$_CuFL$ z%t@#(W@z!nGMbi+c-dV`vF_cE%lYU{{{_C`VcGI2U%QZNAX4XR8$20Cd1Sseg3Q|A{YqMC8>j@#(YZB@->reHl z1}a06=Cx|7_Sb(vVpf6@vsKnmZ?A%u5_I7JkTBqGXWfwMx66KJwc0kq%#aF^6(175 zFhQ%1X-if!8mdf)P*CP57?*5*q0#g(j97N)5;_5ErB>3oM#ONRQV$=x>X7awVC?^1 z43|3Q3K;E$$zY%aAQDYh{d@=k>)7PDAD0& zeZ%q9FgC$G8 z?s^e$+$AQDG=O-g=_!O{ZI5o6PF=LdTyj46%zyz}qMZ|;f!L5dfURmumi6la{V%_n z?m&?HcCOXFN}^cp=ld8v1{aLtfW(m~u1x}r6>U%LBmTB5$88D1^<7vuE@V1(EE+}V zj?Vzy45@**8A&Ec<)=-T zLd>6W`pyZE&q5{dlYGB5Q4UGQoAQjUwL~5#*{k*Wgk)3|L!OrW97Q;1nDPo2FBd>@ z*n8b4xtq&CnZoPRc+?nq1EG|lTLZHK@`+>mF}6YumG2ODw6d$@^UUS&6%zNjMr3b~ zTIYNLchI172V0L%&P^B9h}d3hdU_}nwZz=uMQaGccgh_epa|2$Uef2Taq@YLdJBl{ z2Q9#bOBo~|>2>|kG=%G1x*hXGW%XjBx3+>;GVD$HW0b!t!Tf&_kp^`(yoo|7DExw; zY9i7PuG0|jq~z+C<`!v*a#YN_TvVeQK?&Iib~w7ssESO%Zo9D|qp?CXyh~PBkDAAT zu%p)}hxKV%aG)EJ?GV6@bS1Ae4;p%%dl4`+>n2^Di~$@2-OA{ZsD%XdcIY(1fi9ng zNI1$iXFGLg$r|ti67K*aATjR2CG#6zYp!6}i|PU`KvAGom(hnXk8@I0qYkT7s^%2y zcy)Yqn;BrMKry05gIIIW{6pYIHitAe*qE42)CH-JNU+1ShyXRN1E{0Tx;hn-)u1_z zlu%7+Th`T6mDPoTw`t9_@7m%MHPi@!8su1|%GNd}*fUF{4^d<5%>*^3k@lX8cSGq> z$txXp6^703KuH)h1mo;&15$7_$l~f_>wD?hA?Ieo@~hy{+nJ{-x2aOI!WdvAR_|7) zW@e&*&r-|PTggoAHGo}Ll!)$+xJdUAAxdxAeTLzu`4KOlSo4Tq|2{;p&vA;O+^vzw z-MWa}Z6;x_^;z!b0Iz`@&49?=-cGO;Xb3|9l7LyTh2WGV)Gqy#hdiG8p*=+@kyb%_ zYAmN!sHssuQa48my3}jjNy8#Ut6$hz^7AYpeu2D~4}okqjQMLcYZIBlsK8THv--y2 z9aQsfkws^txl)9H{k}#^nV(I0lT8be)4k^MQbCSQ$>GrNI8E8|4`or1x}Rfv8~|(2!v!eMKSuGnE?hV zR2MQQsgo@c_omCBn?h2J%g->>9LKzzC!!?Xv81-}%YI7G7yT6U+v~0P)Ott~P$+UD zPR}IbG|3MH%moNeLemb4zF1D>+Mpf;mCosgk*n(y-!Rtunfwp&6fesQpW<^zuH7V6 ze6G`JW31-@(mfoIZcRUELI9{ypQJ%GH(#aa0s~8}k>n`_NuJ~@zPH*25CH%ZHfUg@ zt`o#3Cp)`lrVw=)nr!9v?UzC|c;d6dbEP_UhQhNbk`mg}WL*hX=aRrNGA$4LWu2otka>5W#%uX_ zNX9P-gU4JePV#c24#mS`mZt(NiFmjTj(-pk0T5o1qw}c<%~lto%K{t4Fq~$I7SXfz zNiI{3j(2?w;I9hnzkf8|-pME94%h$A^?T{05lo^fbi193E93k>NsFohZZKb2Dal8? z0V{&sLKr!yH?6y9yU5QdMTPl?$JR&F39`v?ZVYE_;=6M2K!Ubs(I+$^ln8(?xk7~c zx2s$muEndi&>qA>Jhdl^j{-2sFJEXt6wI9`jsQc$-+A4PcfczcNrdz_Alw15|i9QfsB1A ziZ65oz3e4!v!9a-pw-jEZuuk+a?A2;p_|{DkR4Fc3p@F1F1bgmI>h#9kLK47?a^`q z5rHntBB<5DDJt|1f}}321MdtXwhfUL>W34IV~eUZ@|)ID`jZ^JGN z)3@0pr(IfWqfMAMm`2f4?dVAYy0pKr#sruIb)w-dR8w+;KR|BkB8%=u^G=a@yWH#o zZ17Ds<$g9w>e%(gW4CFHQ{DgyDNxygFe*+&P8fl4yga&7V7XeD(F&Mgxa!yW1u%3bW#Rd2HF_tq*yyC z8c8-Fp3?;KDJLX{Pm(PTA62NLlTcG;FwI70Ww4!yOQ76bg)j*8vlICHdLkB({s-gW zK8Q)-h!`&7d{p7?=HX6zEyhaU(Q2vr;wp{1!rxi>wLx=BB&29FU#tzh{Bv$qvCy~2ZARmi-#V#pfTZq`T=-X|CK7t1NaHg ztSl#9dzsPxGD96NDWmULOm!LFnXbYyqz+FSQ+LUo)B&_%iQR@d(p@S#LM;gC!Zb-@ zM&pX^#dd*Y)Rm1pVIgjJB>nChK)oIDja+q0>i2}2zYFZb2rs<)QNL2pb`5Em!DHdt>&8@1M4u#xThB4S;ME2Z(lp^q=k5<%fESA>K9Kl`gc!D`QmApRT8d$ z`q1Pro@O*b&Am`A7EXE(Ocx5w7XFU6m->=D+2PYIu2CDpa)1R>;P;d|OZ}q3#o}oy z+Hv^`TSi2<`T^MzX(+rK@tf>)_*FiNtNtN-EaEmyQax?|?j>2%kf#FH-R5CLfZu3L|>59X-`Rcc-21Zn5s(EZw>)-EZp|MeU4b{fydvdX@nr z$BvOFW-QEN6jU)5x6>EY)8|*w=ZfiRS@iUNx#)hpWN$`SKt$vnFY(9;Q*GOtY}@@N zbT&=sZW>qbH@=~1yrSu=e!s8!nkLHp-O8I`ox&RSI6(6}jCr1FcCYpKSdY0Y{Jq+m zz1sb~JDa_`{e6_pzJ1L;{rkOfN0&q}HSqpQzG*9OMaorO7(u?=Tq6@hVWXXDxf<2%pB zcLyf)olWQuOjMptlm(@ix58krIn}Lm;7qM+om(F?uc39GB4~bF>-_ehj81xpo*qwt zd^Nw;Jbz4UIt8(>+Sb_Ut^0uZ^f}Rzdiq8GX)`sQ^>#_4`9;$1{I0$68%EJng!I`m z`Wy<{ZCd3cXG!UIEfKD|5!aGxFiQ+L!NoSMx1BCn2ezYK?lbo=AswEKURz6_r=Vwa z(=#cIYyl%z$jFy67ReZewG7xFmUc6iQ*?I-bax4L_egd3$#nPE>VBut{k~iGM}Zz_ zJL?VfKzDykrgywn4|JU{P#6R&cMVv#fo>*c-IuW*C|D0`S&zF}PbutY0`?0b`=ylq zx|aP$#(t+@zwc&$q!?LQ8Ci>rMkN`IksFO~G@8(3Gu zcMJmpj(5*6Un(y}#7nZ`%}U~dju;3y^BQ>>J-ke+akiCluE;n)$#{|6xNwK@l1AgD zJ;uwa!*^H>-xX@@kZkQ*Y`r^lxcg3P5EIm`8UF3T;Rh}a|KZv2dPCDg_NIqJO&ya> zkI7As?=U^tXnMNG^bFOa$I9Z4$l|WZ`d+q0-x`a*4_Z9BWbx#gMZcltb9>8yP|H`@ zmdZ7jZx31yUb6h~%u--9VuZtpkuyh(&KY5|cEq?tBWy2^`0DuxJ0ok)CTs88*84y; zfg}(R#Zp6;xk_Y|M({v7n5oAEgAD0XOv_lU)zZ7-#&w=#II#Yv26KpjmAwVHdKHJp z6~qeZh>h1@Xnt&t$wK4?L|DMtt&RurME{v`=0l<(l0+A~2_>x3h26M6!9 z>bFPkHZy3>@|Wr&_=>bdIB2e+5>J@=p=WeNGPf<{ABt`hm`}Lg?tb|ht)q!Xcu~w7HD+EjXW!UF``S`3%@yvj+Qv=IONtttp3>obS}XuQ7B_9sbwrx5PQ=vfasUd+0e#pV|e+zt6T~v<1UPJW=^+BX+MQ_TRc@k9vR4hGx&9U3l=PdI}Y31crY5&K(>SiO`uX4D#r9#*l5{L5$rZ%X(E2cMq=%fVn7X& z$4|-x)fzGs3&E5FP{A+PD7+TMLevw2SZD`e2uPzSLnmaCfI?XYkEwN)hH!o8yGhBh+ceFNz{BDHHiKqGjdyC#i)dRq*9s1r6%|=50Kz{G%59K)>&Cv0IpkF`f zG(+#?DCkM~BIwybEx~*g9>SPb%m%$wxhVN8kP~CRrcbvY*#?#iYZ2*>53+Xx0g+N_a44fe|whJI@Z5-xJw0z3@5sfZv3zJ@+v`$x+9uEk}e1j8r!BDw=ymx2hL zbf?eE>n`X7cCT^C7XM*V6#a@cRT)bv z{-EFk$PP?RQ9%jDM+A;`oGGw`yn!83P;Y0YF(Q!s=6X|m`uY>uv%)r3k ziw-8?d|3>SXA7pClSF)m#^+8fNdgK56X2exkPw%t5b575+Jn3>3j0T?oGh5;nU1( zhHINyaa10;|C{33N4h-14YLlX%*GSAKc19_4&!}p+4DR7pVVqvLo&>)Kt=QY=)H{*OhZsk z9!Nz{o;FG%PJ%C&ASPvaYO&*mOIm?{(HV2~)C)%EJR_!5ydO6xa`p^H&xHZxQI@zc(j!LB4Pvwi?aoU8M(0+LjoiSFAV#!3y$`5|)Yed=7 z(NIX7=0^Y_AJPhwn@am9&+&!CZqenFL;JLr@=(h-!0{1UL9gOfp38|U*Ktra;n3s0 zZEY+?iW4je;ZMDbkfXShe+~EmebI6vxS6lwsFMhb@ZhpuJ(*JtaC4A3TxIn_)Dj1E z&9rY+;-(B@SstzId}*cPk1Qg)=H(ftxqmr5MGon|6}=EW)P(%E07B}_ z(Slnj5k%`0HE|)!q?B}nSj3+Kc#1+$Dx?5b0#FNDwpNr!E(GiX*HZ)O}@TpOktM67e9uK-Mf z5qd!lBrrnT$*TZiT&iA-9*np;bdMI?M)Zo+YH)&oZs=-9@r3T7CxRIrtO{7cPC}s%+y{iXpQg6DW-flx*kMPe z!Sy3PT7V;>3LP+dA-W20z`J5>JW~vpU6J-_<=1lSD1Bqe_xg<=XxFih^4q(?FofKoE914NZH_m z%iK2F)Up}ZPbLxI?x|^HILy)bOyLgJa6Hhp)AI0>yrxNRl@E$9r2yP)U_%7rX zB?N`hsXLeqfY-)#DOn|2mtvyA zf>$U*E;4R8s|_xH%k3uLpSpEhQTv;lF0j-Phji2x`51SUO2HR|+XZ0E_8K%$sB8b- zswEWqUoLwaoyf<=7r&tL(_#IemxGH|4qD03!l)nNY*|iq?J}q)S}r<>V1&L#rEIB? z{wFwJAccy%7{Eb_;+cR2z81r@xk@Zz|TUW&ctOVs((R z(Cl>HDVT~{aFQ^BK8h^jvbP;(XM;KEA0nSDG5m&op}QBf?9Te|emg)pLJ&2C+(LG{ zlvxjCSCSbUu;(wD6Q4G}!AeRh)W^U_qfY=Km{9*RGLjP-FpE+_<1RU_evifMj#}p7 z=;AR~1VC7dhV^l*AM!+7mYu;GWNE`B&#@Cp1Vst)Fweq%37n-N8}3bzYajq0gtoU( z=vWCFN+L`=0?ps&p#kNn1JDR3vsdS(nv+R8no6Mkp}tIYJ`Qg^6e{Fkon3DW^uDNC zBAHqDuDpW0>xuQo1SoE=#4aS&i-o9pqoWdiwwa*R<2MB|;Rc#ih_$lKn~V--U{M5- zWE$vpv*8?m0q&nLQ~&XNTIY?Xf0f&98uC>ly44KtTskz8I8? z;7ZfYB7hHY%yzGCm2W5D`%|kQ9%j<8Oyubg6KFa?M%K-26Ed4>^}D+Dy9EeF>Z@f< z&yZUT+1!(nD0D+Uay+iNPPbI?qt?q&zk!7Bp@3D0%*c8cy2;)0(-Uefr3M;1>kiB# z{JQ7tbkO%Vx@&jT9x|m&Z^aa)ULi!zxt+Pbyxf9 zTivVw>|gyC0C)V#enI7PyUG{B$^miZOKIh+tjgE2N@Z2$o7&2^^_A}wm4oe-@4G8M zDA@)&h93>qnCvh#J-%jmg`r8IAwSxXH^N>kW49(6PnwuCJ zjWrx*xX#{corC>4N6|W`&~?rg>s+$e0qEzlW}W+vbsh)Tc{Z-|y0p%_XPwWpb-vUM zV#5ugRvTv8ZwM1@2oK#5k+dN)dqb3bgJjKy=p7qk4sM8T+z@wZLwwJMgl8KPshhG4 zH)UIG%CX;+E83J7x+yL1bXi%hcQ?5ex_SLr%Zz`}3Hax32F8}7lj;$vTZavkw_4K8!Klf}s^K5H7wdRsx&1I{aEA}-VqMECr zHP@1Au4mVD%4_~uQ*&cS&CP=~06d2Gy_8aID57E;Jlmj2;iNac=t6wXj6Tvh};IHqL+a}c0*h2c-o z;p0r|NR5aBbHKF}V*b;j*eW3DbDAicQ+5i(18!5p=xMbXarc)>4G6gZb7VP-ZoDyc zgYzVWFV}wt^ivo`04@u4cL{W%6R;E-1MRv8>UF=Z(%mc8J!GI)->>_FQ12%(j4=Jz zINNj2-j+7w1W;bXxio-?9&bVZTaezb;@a%h_-0 z*zc;@ZyVTyZS41*><@kHkHo2MNS?6dxlEqdaDu~WzS(g2emLcclll)siwB05Zw&2p zhS{48a~M0!(S4ZHq+!m{!(8SJb1fX^Rx!+d^DvM7!#s}<^EyAw`;TEh4~F@^879`@ zhMI6^j^&2AbHgWbBci#HbGT83TuB8tdNVg>KR5O`H|{(){ts@#18(9QZkCR5wuy1h zSmRuG&B!_5usO5dxj#fveAQ1%pE64jRhLQ0u?1m3V8|omn5K24t$m)8^L`D7es#Z zv{jV#=K11<1CZ$gN&sMhfeP*f>oAlaLl-7ll^#=9QP4fmYDppQf%idq@dogrH~!36 z{vu;40&qZ^EKl5!E6^EW8bBUK2kHyd+4jOL$m?WB6WnX}YHt~30Bjj2V0MAIYMpq5 z7O0Rkl5718OLx{vWp)?rHR*Hp&d$-hU?DUBDrqvAjP(U}U{=EyXvZOEpi&xGQtCnu zSQ~KJ#|G#&sHUfJS7ZrVwaj}*nWyR?OD2?j)~qTL(5KjSi8~4KU>YQ)=zi+fh9V(- z)V|ex0lJkT&lS_<2&O={s!Nti={L?pO9H(^WjVT4PUPNIJa2{w4DM4Qy{@%Ioo7g| z`zy{f(yR2LOA1LaWpt|LZqdFRG9~V|o&~pD)v5Q(+^XM@t1;m%-&^LzXtr&1oYH;4 z$W3)$A2)X$TBey?wwkkr)j>hRRkdDH7G8L88Xta5~@U_ zXI(??-^^91T{1N%W?}p#FGU_Oegohwz{?D7Nb+$=>dC+NqgfR3t1RngR#(Q+2%=?x zS`Of{oE+n(Y$LI{rBNZD4|4+>HZG`#PF6~YjCH3ena19P3qV8o1*&0d;PW_3&#&tJM==7Ta?2KNr+tU11fALpf-o1+E z4z2EOG>_ewy8lh{YQem~KB5Ej?xOkhVm^;(z5|$VNsF(nBxIH5r1d3}wrNh@T{8KA z=9I%FQ%-44Z7G?0L33J1$+Rxb>AfY>A8F1QD48*+DJj7vtF)rmfhs#&CwXHg(y{aW-MVb8pYZRJ(k zt2@e9cWHm!TmJPU?aG1j%0cbwl8Wk8I-A#5Y~H4`Wp~Av13Fs|S8P3{v#q6K+XbDP zj*6Nto$b99+aKwCGf?r(piW)Min>+0``547zfJes-7CI5p!?n772loGJARiQOwt9MC&?c;(4cdZ$`ep1PoS zx?|<(F1??7e?gAUU#k^MJ%WbDkwW@5?@YAOFvIz}vkEyMKmf~I&U{VgI z9i`dZwbvf_Zs%y*D=t60@UhdT+4E_tE@2(bqnhSkPID`ud1hfQQp{P5In^K0G83Bx z37DGdtdE??lY5jxEs@%2Tf>LuX=tvto)&(0sZ^1VCvsJ_bU>FD*3AO=rT@i=ipST4( z*zYKaRRG+A|4c0S`I%|=5Jdop1)|}5l7{bt@iaSzf7dwt`<~%HQcVw9nf@d)J(6U4 zY>n~agT_!=0D4txI9x?0NV0$#G2rg*+ zkL5?|2&)kzto=reN**z$c*NM9BgS7IVS9VTL=9{E5!Q}=*3JZ>0oV*AvA|bjbkc~? zDSo48C6At6JbKQ~(es){XN(w=tuZF^_Gq9T6nt7&d(APe+ZvidBA7y!RTKP)^FeZP zzBqiq!hur4j;OMa&I+FuU+rYS`i1b)&XLQ7y0t`$oMehX(oQgY)Lrr{-J@c?!*=Ls z9s_nrm0p9IAoAajV=Zcw|4V|%r-S>?2T@HB`JWueeRO4#gcx&Oo{e(f5k~g6-pM7cPDfz z4Md=*td{}*J7gma2|yXFRlN+LL0yqu_qsy%w}2oLhMJe&UQ&Duo-;|cJBMkGZbMKZ z;p;y-9{SPX2^Au@4WQYT0NlRH5#V=;y01f~5vdnHb&!JMd+aW@t1_9F`l>m313KU} zJnXl6BzD|FFbHPeB;fjF60XmQB`~>S^#ql(U?2yn7l>j2B0M!gWdN(PmjX}nfR=FT z%EYb2h?UEx>c0lYNkCEqGg|o#P%h9oH(Qz)YOAh?wRF)K|5@ zwv@t0-V*Sc=wFh6LK#ogGGq^k=QhvYH9jGU$gzd%Y4Jce>mu6}9g1-N#In$kc#r5n})%VCOG>?nk>B1Rx- z<(I2wjTEKc!fZB=vH@m4;ca}|yL=;>=d){|K^}ez{P~n?h>wt>rXjSdXb3qf z5$PDBx6-@-Q41QmEwriU^huDmMcw-{(6uqKpG0sa@z{c@czw$3rR25BfM9|hcJy&4`pOhsHDAo`q=n|3r>^i#*K zDz+)nuo)CtD&-cvRHVQm>DarA#~siZf4F%3DGl3}Vq3^K;au+0_^P+~D>Ik$)L!Q*0 z;5kx_GkbXRFY)H>;H5#1V#UiQiH#7q{+aU#M9BY;lnkXWpEDf)UneF1$Aj5FM6%oC ze$*KM?;=^xh_CMWeRVhatNX=YJ=pox!=|qu-~Q^U#>8hMCcf~S_%eCo>*9%Tc20cP zH1YlIi61o_tgIcZ{T)W7IE=v@#_n<$-|R5qj>ANnqrJ7GqranbilZy$=)TL*v)R%6 zj-xNlCCS<)#ouLCipy-wWzH^_dCe{vcU&@QuG!YEx&E&CDXxn!*TP+{OPXDm-f>+{ z^VnhSvCH3MPm0Gr%wzv9kMEj2zQ5z~BhB-mwdYU%o<~wVk71t2cX^&{_B?&Z^9;?W z$J*zPzt7zipZl24gIzukn|&VN@p($~eP-?Z!r%90itlU8_suTfcg?=<@A!VC`B{zh zvkveZmFhR9#Bc0wzws@8r~uUTw;$>67~t=m>hD_O@4nmLv&G-L*WXt&C~0I+NGw;fKiEC}VaxQ#z0;qj&Ujriqn|V5xzmh+@ELD*&v@4|<9+XpkD4>BM$NPioH=UN z%rW@Pv3q8YKRYwyZe*rbRQ9N-+`y>(Sy7AdsKPx_%e7*59EmEr8nrAxGJQkj+#`|m zBO=r8hWTnmCXI?r35@hU66SSv=2tIg+Hu1ioWq4^xNX$;>nB5UE zd-D-D`}?~wKWfDu92NUhVC<1uvB&V(<9lLHo{c?yH};HHLeHp#JAnyzXC>Un6CUhI zcz8D9@!f={T8Ym_CB6tud^s!eHJN*jGntIXzrf0x%*1z?%zB2yVkki z-<$g*ecr**^L`4NcO-4zvC?_R_s%=nI`8zod1vSgdPXm}6SUxN+JgI~3m)uU@UV5k z<9iF9(leip&U_J+`7$l@b!q0Cy_xS?GvD9K{7BES8k1ukoHJ^6&X}^CvHNnypUatW zKW8E%*M3Z{V^proqFlF4xgN)Iy{_l_yv~&xFLVlCG%spl+Mu!u=($QB(j&s8n2 zAxWh}Ajqc{9SM{`08(o{{|}N)Ny?>Of1r4r>}K&N#jXtfe8le`1Al<}_ebT$5HFUT{rDLbwu79u3Lt@s4-509 zsH)siG5RwO?EI#S@*DwKTx3N)F|#dO1LIVodT5M3ovYyE4#`zWhVy;tE|EVI9iI{c zcb0RKt;siQAGEAFY%&|qr?S>Xb7Gb{04f10!qma0VLiQ`=a@Q#XEofwod2Q z!>b>jVl$hBFbn|o%VBo!Wf}XGko}y(exhLgEo0pivTjpYe=79Bg6x`5e{x1+5m22t zt;q7%JY**Y_}{9oIXZZs_sa==o(X8+K$h1N<8&~O-~hE})k7(KRl`_$&I zzPr(I@y-#gu^J;+WD73-WTzjh*(8j((fTiP(SO$57;lUgkDOLi&nN^H6zHM^x;wfV zONF}M5t^I5cDmjDdOs6NgA<^($A^BFES`m)8SWXso~mTv(a1CdRm<-2E=V~j=! z2y|?*Sa+WRE9KHJjl~-LlG+8BmKMm#)PL8vnn{4xj1o9Emx{G&?8IT$24=(lD2~ z%`OXQt~vg$3o+Nl&92L6UQPa9t(ey@&0ZI2-k1HouVLOdn!W#|`P}yRxrh1u-R$#( z=KI{=_Z8;*w%PXsEx<1zAgCl@a!bH;&A^!ffsrMFF)e`!nnB3{L33Mz7NiEHYX;{8 z1TQQJUfdGAOmk{ez|_`~slT*Ly{I|ua=^4}CDU%SO#4%F`t5+}Q}2e0M@596o$*04 z+%GUZ2oImUXNFR9#`Ay~uXay=)I0rN$@B$UQ8|H83-PGMXQLwVh?uhx30jfKfstu= z;cicF=-*r3?NZojH(}soa}6*t*~eJ@W%S z&o4MHs4Q>txxDF&{F%Y|k!ATY=kgO63zLHvrj;$6dv4(Z#-g0yMGMOoEk3ts8KbBv zxah*{qPBfS7a2=02QR%=w)DoirGGM(-40%MuWZ@h=axNTEPo!n{8icVx966BV3hcU zlmwNROl~Wgu8q$O!6U)=uMdyYE=>+81qe?7;xN9J+^piZm%$a=(|p^$IW559s7JLk z3&dpKKI&%m!^*E^3zOJNSn%EYmxVA7M*oK569LP^zW?WQRLpLue~`|jE48xtj9fQH zUPxJ}01p%XBN2*ZK_N)lrfh?Xz@($%K!oUQAZZXJ=c#~EP|hfm34~1dyBx^gGM-|ESZy*`SZ84AuHK3=oY8I7~ob0!kCfSOT__is#g( zce+#WXE*&0iT<^6y%Ru(lIa~QAP7=*dM9lFonHAnQq6S3gwKP*4Iu{6-NG8}GYG|p<6hZQ%*iZ^$Ma?Lj&JLF8Z zviRG|@~xGfuC@JeYx5gc#w)B$wpa~6VP*Eq4&&k-!w*?GjI(z1uy&ek?Y!99ZH2Y_ z7Hf}ht-XHP<($0BCCA$H#I6^jZxB(*#Pa!A%NJHPmqTl=Ce>U6$`SC54%Xaktm(Q` zbE~K3&u2A%QNIE7`-;1H$E2F;KuFqAbB0>e{=oFirLCuXww`R1 z_Bo~O15j9iqXxW|YWBMZ_S-skmhPCG+j|n8?@2V;mtDNSdguPFP5ZZ9-d}Tj|Mur& zH*eX$<HE4t$kjvIeCX8h5`;~Q3tKk@DOlPAWXzA^r1-3gb5 zk3Zz_-A|LpADKJ;*xK)oH+^^N@9}5ej&C16;j+X2b$a@<6zUoH(MsY{dVHJ z6F(~FPE^KBe3kR#>&X*edQ2Q}`0@FOAD@kL4tG2f_QE+!&o$fhSmHzHxL=*)e>xI7 z&pB#|vt*@n^j7DHSm(%HM`CU|Crok98Sk3A>)7I-jxD)zY-#hcqC3Zyy>qS7b6;cX zzRuHq{S@~NvF;n^xo=wHUcJ(N>q+-*zq;4lbl?8a{hN30^?IHMO+62d_x#Dz^Y9eU zBe9-G=XoAm;@Pm$^Y~WJ6W@8BJn4D*rsvNOJ_^10)g7yf4k!p^+L&b&-H^D5W(?RUQKPM&$A=ljgm_xZZhf9yJa z(j|?3fa}^hSjiX3Uh@l{X6MmY)mqS&Fcl8kzbZIb zI8$O@a8}5}VwhR>oo5xsSQfL*-sT*|9Lr;N*r%UUm}3P@p}qE5AqRsoG4?iRyE(LQ zX1KlNY%P}-#gy8YpOx}xG0ge)4QB<$w0LHLec#z`V_Fuo#h!moVTR>0uh~n_b(_-) zn7#JZ=VUC*gZap=p_#(QyqE)aoy`h1=F42{(0^XW#(bDfb_UJ0OqwI}qMfi=pigsV z-mt4`ma;H=W}BU)S*A~OW&UX=YZkDu4yMFW{F~Gn`;)0~)c#%Oh23HnIQIY6?Mi#b zY<0BxUEzgwGSeOFextZz*O^kss^6q8w42NYj_JQCoUtxuo@3qb6kpmq<`YNlOG01l zJyYq}_q)Ou`^XeJwf!y(#w_#~I(1(X&cMX_0nYrZvT$ss{s$+@RYf=!rk~&}yDEsJ zMeFxD*IgGTV1@dZoyFIs@wA2dH=MJscgNET^lv-!uT$c&Ed3T|yX)O?Sfakdx$mkX z3X9V(aBjaUjiSZsFK|{|l}6HH^yfNfU8O`|5&AQo#aCq!Sfu`2r~WI_88jdL=T3s_ zwQ)2r{lA^+uXInxT=l!1%C88g)9mz%oRpU+8MH(Czqo|l6lP#Y^gCVBZz@({j;waK zkUPTFm@})(t>6yjYs`(+>sEb7_BH0gdgRt{hf;}ou?E~a@5m}KAJ(9o@(yJ^CT0b= z^Y6;mV>4M(-QDg|HelhbaCgaF*#<0<73W@Xm$DI)uu|Qt@5(k}F|7IS4ReaddEiWT6&e;`|pxv<*YZSE_!VYw`cYx*rkK6YJS z>RNtFxDfk8Ki#$NmSQ1xQ$NeK?Ury6c1yp&weOZ<5%!n9!d3e(VG;IBzs=R=FGUgd zLciTL@AUg!+x`+R$KLBJUHkr0 zEXO|T3*Fp$C^*Jpg}X_5WH`oS#km#qP)adAE7h&KM^=grXU%tO=%JKhW~@B7&K_AA zX2B|QQ}$3+VRoz*H~t;jD$IceqYiqcB{U<}WH-AWMFw_EzuTq!rf>mvT))qy?xtb^ zc2d9JrR}CL6FaT1bm_aP$i&X*3thEu3G=W^`XR11w-kBU6@9U5$Sq+$c2z&b!{&iv zH@1!?_6T_(+=FdkNj%aYDE45RSW=Jj2g1GBW>&gK-2=s5Y%43vqwRrkA6COE@aTJ> z*oS??Qg~=T6du41vf4as9x4uCKe5_9LLLgg$BwW%J<=a4zQ>NSx;@Gt3V*qBTyULPy zrax93!LGBUp5>2)N3lOx>7I3u6-Tj~tSryA$HHUSEmnbN-($rw>@SwWQ~Rm#6!whO z=4ta(aSD6EYWECzDm;z7Vs&{IJf-}MDOtUq)lX$VV{ciHJR6=;&R~PA0ng5-vNPBR z)}W{IDWwH7UP4R9wZP*i!HEm%?jUG&|k9?xo@y7R%1^ZhI-bj>WSJy!&1%u49R8g}3%=VHcLo zZu7Qzt?0sX+3nsTuZ6d;e0HaI`fJ54Y!SQLyZp8APppvL=Uw+&@h7%~-S6G@TKE^X zls)LJd`;=as@MTO{5P^*Y%P1LkJ}r{U2Hu&+(+_8b{E^oj`JyaL%D}lvr~Pl-^lJ^ zTiEk`8s1RuW82tyKAmr5_p$BlA|K@&$|J0v-QvT4Cwqh)Vqfradq;VU9cFjz9{voH9%eWbj{2G||Gl8>_Y*eiCIZ^1{(2TaNC^{xIW`+&V=Kk{w( zNco5jvIl%SKgvF0AJ~Jw%8wLH+yH#w`69U{Zp4`?b`w#xa1JM2ED_1Ia2_X4TmT+* zIG>X$t`^DZ_;AjAaRUIBxH+dl+$U;e;FcVP7#QVD+@8}Ww()Od;*OklafrW2A9v<- ziqriY^>J5DuejP@&cZ!7kHiiBR5tF#84!2+%h|XOXHcy4r*iO@tWHn6XWcEBFI(s> zeOY^zwv7GOTl%i{F|CuG?As<1F|^z`x5e6lA`TwP2?@0cY~*kL6^Awgrle@pw)_XkTEXF`md#glY$i%o3oi(z z2H|{eYIt?1JP04oogdy1N)5)%xOw57q4Hqdf?E`>45d!R?YJ%B{4n`c+<|)`+%1ec z4R_*pgiFHY({LAVS9n1fbvo|G?G3LElTXJzxR1gc!l*NFFYZ8iXPA5j?!z4nSB6o; zaWOX_f*&Cd$7gb#Bk*u;c!VSZ1_eiQ<01+osFApYn;KCaA&%#sZd_zRG&K#c=B7qgN6XXjE!_E$4bjxu_%?1{WM{N|Hol!(6se4+&d2My zEs^|K`F#8k_d=vwEHwi^%`PTyn)*rSsg21fS=$#ifo9bX5y!~ z1CgDv@=W|^?qH-cmYRpRa|5FI@$x+UGIwf}TRb%%@8E_PSN zjjE29FT`(f=SMZfQy1Y~+`OpHc=;myPi|3^GM-w5_j6mK_=)l&{5khRlv^ToDL%mM zh>|4Am*TIuT~P&z)MdDm+Z$D#C|`!Zu2e|`Lor&`0_y_J_lroW8f*bGx zB>W_K32wxjDsfAq;y8yFE|Db3ah%7ClN2OTOL0CgRZ^WKFU5!R=1UrqsAaerFHh2$ zBrn4)ctsLr5_J`B$7_-BQ{<~~2i^sVTMBhG?!@bmNK)jhaTi{fq#%X*HSWgil~kw5 zzs5ayk0cE#)JoioHz4UukyqkAyg`XFg}NRW^8%vzv*hdXnY^jdZnLNx@Niyuv}Bfi z10KnXi!PW&-H1zgsnON5S=3E<94{}rbC!G)p1>=LR?ebs!?SoT(frx+ zZFmmvLbTg#Y7L&p>xh=jme=45d0o*3v#Hzh0$y))^=$ced@=7)bi-`wH+T_mAi8t5 z{2P23Z!lUpo4OmX;swO;=g4>CYk5;++~!dC;OlweF_Jm*J@`gmTui|n>R!B>ml{(& zN4^)|!kZt{Fo(Ji-^R;}>6|0qhi~T<#VF@c58(B@mKgp#`2qY8??Q~*JnHxOVO~d! zWS;zc{3x$0reGfR2fTsT8&f?`{sVr3_b8@e9`#536mKA=bDsQ1{Ab=^jB+0JFy77! zh~;O<59614Q)AsSs7LS)9ogqJp-{57%wq=Np;kS4N zv3(hh$MC;+idgMT(JA~HuPxRlv+)%Eg4Z4!k|{ckzvRu2ZOD+H#$WNeVhb{RFs) z93CghmY>CW#&K~4+0<5?Z=4!eoh@(0ha1n2YsjXa!(jwjTxYiY9ByG;6sOFlUcl{) zTjKb+@(Z|w@r5|ITsKJ^+d zF;0!I&X-@qV~pp=H{?^V<8j7$@tyhd>v)3kvUtk>!`z*JHFfX(-)ATlPTbvW8P$X! zI}B|}P|1Kw5)zV#Rggg@5eT4&R*`w0E#2&srh1PdhXf-B8me-KoF}SGhq&( zh*c3}3NqcXJ@>h;>$|S+_g>dp_Ye1<;99u&tj+8Fd_?aUQuEb&PUK=-dpdQXywuL1ig80X>{sndXnC% zw|eZ@s9L5T&&MoQ@*+K3&(S9)Hgz)nvR;T!ORV1uwTpVrK8~?|FV!yT9rX!`Rh~@G z*E{Z$A1j$mzoHl6BaM~3QoE`b=Od3*ew$vQ_sB;-KJ{(-O}%G6R`JU3(r@W?`*_5s zzDvKYH{=r&pZY%iq28)bO8ky#wYz$gJ|*$jrq%B2P5acx?|83PtGDQ*p2(R`@6faJ zHB00yr1$7~_y#3P7Sj9mLVV@%%JXVndJeuei8~h3`}Bmq8Ht=lwE?};z7>gMi|Ipp z5x&yI)TQ(hy#!x*qVj6`jNT(({p8fu^bdN^e65m|*V5#h3Ala)W)q=k0~v61+FwrLCgn-Fyg z=QBhH?-3HCuoVz}{PB={iR5!+J3b_&MZ(#HXycEB1W6=no3`Okhe#!mR4;AwKwoPBS!lk7-q=BU1eF@chJi6JFD*%s__l5#iF-R0cAF zPY9Q{DqABn_($RT&r_|DIedG#-E$5TS-?xfgPtq15IO!uc>eQL7V;7QHoWFJhmEY^ z<>6D$C2V8^Zxf;3!Qmkg!7jqAL&8I}2#yhU9UMNQL-2?Q>X7geJ%TVIqk|(rwi1FO z$~z{Va|qc*Xo)cEk{m)T3GESfT^xIaMvz7X zbxG_I20<2)(Zz8<_7J8b%DW^E$UeeML`xUvFv29rBc{3}hY>cxCQ`kJa|CfB*hQN4 zNRA*b1jk6b9*!&GO7Msb>XEo2?gU|EMi0jg@gxLAmiI{95HCVVWJ?dn9q}f_L{9Zc z+!0?weWZFH=NJ-7Xo)oIlN>|B3GI<~eH?Ejk|2!?>XUdQ(F9p!Mjyuqi6u-$miI|~ zka)sOWJ@2%7fB?@Bd7W#zDP2`CQ7}Za~#Pc*hQK3OO7Mi1ji`5e$ELbm*5c<)Gs-K zhdB{Q2f;4dY*-S3bP*h*?S?s#NDsjyI%rrDiS!YK(HX;>D5Red6kR?ni9!Ym zA<-?voM>d25EDH$EQv-&3H8zHqnrd}me3MyHY!O#<_PW4cB7m`WPu=!4jPptB1;5W zbjBzr30WpgMVF6Cl8_a`OmxdACmC5I$fKu5CCSJJ!6rt1jPo4=8Q8^`jY+;kvn3rOwgDl9nmuo#$=3fzDKqi1jUq(Nxnz68-&EPjByZzU=R~CH6}q2qCtI( z`UK|(WS2opjM;?b2gK5#J;rW=BSvTj(wLwLi5OuR$YL@kI6oqL45nhrCnP^2`wV7c zS|&Ib5T=1VW@nOf5j<8LJeAC&0a|gk#K|d zSi4u8A|%p48XNRVQiMbs$YL{Iajqh<22-)+uOwHIc!QbPmRFo&B+)<~JM~IZj3gV_ z#HqjLlp$FLc5!B}C1psqfn%KAYtD5f*T5q#=(XfJl4l@{%XrQC2`MlLiYtFD`3bpV z5E9q&n)5SKWDpZK^;+^XQfyEkr~ZcXD^h9D5@+^C@+(qh&>m;^hI0d{Hju^zy^-8N z?ik48GTv~0L+%<(#g)I2{D#~&n2Bq7!}%vtYaoxCdL#KKQfFWjul|m63+XVhi#K~G zxrKBYIL6z(<5VL(1|IQ2?kg22=6n z?>`K+WF*-i{eXqn|aMhL{1gsEA{V}wYoPf(xZJVSO7TN2FX zB+n2_VtazwbBXn)CHzQu{qr4cgi7pA@R&<&Md-w#gqS(yHpGhfA|Zb+wGG)ze49`+ zr~DkTCe9~F=Te^|EaGZ{`U0mLaU$9!nk`7W5f`FkqTK?g2XQ5OBnB-=dJuP_Ffn6+ z(~Ec#gA&UZB)tfmXp>m8pxlQXBSs`j7gGBWA7VnHd_j2#2_Zg8)L%*+Lc)m860Mdv z!$>4ini#Ys8AhUsvc!xf&Il4qoJuTTl8hkn#F<2!r5(da0&zZ3x|BMKBoS8=EL_C%hv#dOcMP_bF(FC5to#O9g(Jd|v; zro4c36OSZ&tfej>y~Jb5F>A_;h?ICdIe#s65g8z!Nv>H_UP6Y55y{fE)Fotun2;=A zQ(i@8h>w!ZHYBUa9I-vwZiBOiED)v1K^u}aWQizC&e-6rBg@38QGa6dyKl3k`1M@0?QCLPK2;23ReS|fgwxs#KohU$`zWyWw+ zK1cOQ$20ReX`iFpNM|x@I4YY^JSiem%1PUV8jun)G?; z6wqLhMlw@ujlR&>Lz>Jiu`T^VV;^Zcv)-UB!?^;zLAcGE6FWO$S>8=a3}d>rSOe(H9SdySta~ZT@5c%a8^CvNKeC?6qP08 zm+EQwl9IBN_8Z|fLP^b8hWktL8sVh2ESvpC1dT{iZDM2HeG?JCF-^f5CmNc1F zvcJ?oBc3#!RlnbesF6ro%#!UdC2Ay-*0XGEjQ|ZA=~+m$2aPBicS(~M4G)x(&}@?9MaKjF#^@!| zv5P4Oj7-o1QqaYU1LGzdg`}{H(gSIx8pWifi|Plt<{CFizhAUEs6y7LCiPwv9!#U4 z_egIq)*Mu^Kp&9iFUk+9P|Ep$jgK1Q>lXNKC%3g(rc9V`|d)TMZ z&|cE9>==6$Iw~a{&(60`qoV_)GubuvDhzap6p<~pPh+4Xq=am_y^1wDLu$!3JKSKc zF-vOBwmPiBMCVD}*&c_}nCK#DC_Cn`3Jcw7{3u7?CG8Np+ju@l>XLRCWf`yL$X!&9 zppM48Tz%KHBdD|SpS265H{UhQ4LxdnCbz~_ z#T`9n9FZ$^O>;+mj1zL@t}4gS5aUO=`tE7R&@kg?xmNBf-e`nzcdmzfnl~C{Jd_*b zuHu8n7{AEPcTe*{hHCOJgavaSx=3UbFOgoNVG(L36 z%2VY8nqz$Al80y73G|Zju}d+YDuHOe@$pOfis}z~+4#(*8c&szXrXb$C8=lHN%X35 z!X>$aghVThA6?S-N;`wzG=6r;%1h-edds-`l80B?S@gE?(4`nJm0+~S_{F7sue4zF zp7GmDHC`&`&azcC1Y7$hA%e>T{fP|EB9?k zLRXAu@>+bk$>^G~Ja5XkAsO8;w#irb<9>%iCU*H|ehuHDS|*P9c7EJ+RL8_4KgLhx zdsN@#cz(WL+V|*olaTx%zlL;lo5`8{j1$~TsHaI#LHUV>OQ@GgNI}a9ZXW7w5>qgB zq9G6UHK{L9KglgbLrq!=%uY5GqTwd(1$HO7MQEgnv>@nYLlGKn@}eOBWZG3U&g5-D z%}JGFG{I!PAmyadRW#8=UNCjCp%_gzvAL{%id%+enb=)6JJnEzW}7%(wmZeWj^>(p zTn;+ba2?Gv5nj$X#r+8_FbTR`eyZUo^omKy<(5<2pV1E8$m#0oO{EXf;nYvv5ZNqQqeUq8X zE#GqgiPoCPFHe2j@K3bP#O8|nS?(>g!^G~2+1Z9$XqSoO6}z+CYP841<4VxkhHA9W zM0h3REcZ6rZxVE+{A|N*bkHQ^O3PX99dy_v=E~IBhCAqtNzxUibKD2$tVzoivvUm( z&^eR#D|Y9&wdjJ0^h(gVhFWyVM0O?P9QPr*Y%+DF{9MCBbj4)mO3OKJ9lB;BzcO{M zp$^?Ju_;s!Eq$)RHeD}NiZtrha55DX8Ag_NYq*#?6xl=?^=P=7x)li{OM5gRQ$e9& zXz3#jEmMa=n^2=B4INXrLSblWlZKwDPhm=^QM1NY)4;-#&{747W*S^rA8PbigJ2p} zC<`rptU)wQDpU$LdZw|pxB0&Xr8I?YDO$~5-l(dx>_FFFo|9<4Y}G9%YB6wnZ{h5ifwp>7Ms>zRgdSs zMJr8PuA0R+yhW=_+ppTibKjxWrqZiH@eS|LJEpR$HC-x)Mb_l`Thgwy!y*=W^_IL# z<%r0U%&XS#NjoBPCLgM{>QQkO9U&j7_UK7-6}gd*Rmb$GxQRT-$E)*u(%eKx$!Dr- zdQ{v+$H)=Y(w;PTkqioVmA5k3nZFNnbimxbvJYOyCOY;>akyoqbeJaOAnPlE=v;KzTqHMC` zZM%N%2~jTD<91Mg!wFFyS$I36pBpGDAP3#n?@v39yF(tioibnz;%!XcMOM1BXC`0hdVaIMv=H4vfCZuaA_p2 zkL+_NW!NYR*G~?-Q!-o{g&QOX->DxqipC9-qwdItOQUh4cZ=M4+i}qUEbcaW;C4m-cp#2QPP(Pk zWpoI)i`;z6u&eYC&XU}A%cjf79!Deh-V%0|+T$4Hky|NUMh>_=m)# zReP&H12<}(RHgLX$Qn0m-dtt)ywn;uXWmw2^W2DuTQKjf5u zOFnulq+^_q(Yo}} z;A+hmZ_1vQTHxx;*A;|1*I1Nm?r}5dNrSN{&s=yj;|bS9RA3%-v;0YeiRg-X$jz1~ zTvJhzdCbkJCk>{eV)Oc&>QA}mqDu3Yn`TcN%tck^?Kkb7a>=4B{=YMnqhq`C_H)aVZg(Y`$Kp^rQh0 zG0bHZ8I9a8M0?DqD#{xhz7Xv*pQ&hRlmZ&21|6o6@vJ&gO?It(sJH zL`TezRC+WSY2%#CTZ+w+8&=Ud)AnM!WbPWeU@9#RN^V#~mrP~F8Ohvr^rPw9;+kZY z4RqCXzF3-^wt=pjt`^IaRX!7Gn)533C260DwwNEPu#%{#iL}j+RCq|z)I_@G$0}kZ zDxZt=&5u{)OVU0UZ8JYpQ6o{=B*L3VR7fRhn?wfY2^DgQ%4X3{^G6l>jcJ=jyUm|f zST(8uBC2_Jg-2r=AflU37MCQeETG+{M~XcX(-zQP(__Uki7Jbz)bx09eq!1pI$(OH zxF%6$2^}(xD3&IsEukZ(3B~e6l~r`c^ii>Xve84_GG+4q)Vqc|q8ZAg`}*(G9*90r zp53>4uTm?Tr*z-2n<0V*P>Af>Afl$wE+TxKR2Kw?dh|U;p0!IgVxV zP3_Kw@owA^3+GzL1^*tLo5j)EkcIIcoQH*fZRUc1FYc(t>Dr2g@m}09i?G`E1^+&r zk40SV%))pdZiEtXU;54{0XIu-zGFCAnt+=lx7~3Z^-shtk_YaDjE*PbxZro1w`ii@NCakt`CX)!LDvVK?T^>`UBhvIzC@wNYT+$GAHua5a?idzo+if5Y9Q{Bf`1&G>J)2b9HovNxsw z#MM#O?Hg1p-e82vk(H-18x${oO z9Jfuhof1-$`O5#QD4sHNx8)VLSd>VS-&KFjEfZx??CzPpZYUEypv>R1d1q8Dsxf_W zH9tOW8og)w_G(SM%6s&I>HJk`eA;{Tp{Y%=dLnlo?J%_~HcM=nN4rc{ugc@O)uJAX z$Nivp4b`GPN`0;R5_d=xYSB__w$v~r3b$ylwOis2iy|$gwLwb_!=h*lS#8D=cSICx zF;!c>)G#87x0tDIS>le05-sGlQ%en_qGSu3hw97R7osc+yN71W4KGC57LE_?mbouQ zxfUJ|gO(d!it;Rk4>OjzlcEBPpoitlY3rho7H{inHdHo5s}}Qh(v7qY(YnQIoqR)4 zf6=7cwVQEN)x_G=BkdlX^J-#U>aq3=j_v2-t<<3Qa!%vt;_cLkb}8rlCb0oEpCSWJEyWPX~JRqi1huULo z8@~|mqt3Lq*xG_(CRNs+VQc$^cn@`|z1;RZC}vSt+vT>Z+G0m4uS1`IUR&%;J=9^v zSJe@_Qaw6?_>DSZcdD=>gKw)V_M`@Nl=B;P#a`5qjuyVHp7;p$NQabvUQg^pP3VyG zRq^5w>Z1<*{pa!GFzT}otNp43aRjxy!(;z>f;fsg)Dg2^)j%9WebJGx7&waKsBb%J z_Nx-b3Do%x>HhOXaT0a4L%v^?B+jJrI`t2nCy6go4|UocfQ^A%s#~Y<0A>v2QGGg7 z4!|Zr0X49*=0GL2xzq3?Li)RE4VgD?fSOP%a2Ifzk!`_$>q`h&0qP)l9xlpVw@fI8}Wr; zC=hR_g><(#+3pt;XffSWPL2D;L|T2fx{K{0@h)0Rx0y@hA+aT`z1z;k)?Q4bNxOqw z8tuglnyfp+#nwT*hc?w+?$YQW-bb71ZgH_aEN0T=-BT`&hsA7~O^>>302Sz@e$%zn zeu4^gQ=PjU?E`2)FZF0wi2Vc&kW&4-GVKHCzyS4hSG_yz3nbDOdt~mIFOW=I?@{uE zj{{jWL9d}Fb{xp2IrQ3i!Y6=Snp>~X6FULq(R_MSJmEl~fEL(W;)w+US7^b#^`7ua zpokXLEAzxo0>!kXUL`O13{XjH?lttn&Hz=kwq6@A_$*LO>+KbKVP}Cmw2|HvFE|*u zOPlO1@xp?E`?TradN24KP)l3vm3d+3fI8ZGuaY+$0d&v=eTLpx1kgou=(F*LBY_^8 zn_{qwMFM>^pS~1tI11>e1@@JAV^P2$Ex51V8;%BsX;F$TFBT1q(vtd=eBlIOme$;7 z=!+!)bF{WT8(%mPSfKUx34O6dV2L);m*NX20n4<>z7k(730R>`_tpEt$-o+Iy-&#x z{tkfX0;!=N_8p)_caYln!Rdew-AyX=!_omgx{ox)5B?t5N?+`g`C`ey1}#up;)i_? zY^MiH>-}H^Akd?vGCvFfi1Z|>QULq|u#4U-H4MOh04(WkQkwu+4AAJkQegll1{m}a zX-WY6Bd~`)DJ==WegyW>r=|4)@CATLUzExMunPd2zAjZd0p|ctbV0x22`mS2p*!^3 zoPcuySGrrj@C23%xYK?5Q%=B_08e^gf5{2#65vG-?yo-q=KUnoP>*jNP2I-@FZ3QMAJw5Q%=HHfmr%vf5}PgDiBYf?yo-y z7Xyj(#eUgItQbh9ulFmRg3Ev`x?sTY6jlag(;WtEPQllKT)NwU@Dz3($fNrVq@03( z0t)DX10|=hpMWd$;DP#6@XtUIJ!(L93i}x-rY8+3eGC5zRMMLV48O&G1*+(612*5n zH-Kt-?||@I>;`a$J~EKARv)C=5i|(LUTEo>q58Z80cowS$`shA`DQDr^KtDZju;eUu8yKVq57wWB z?*PN}s6p9T><%zWPa0G@2R{I2>CJQ_jH; zfo1ySV97b`A+SQ9R!o86I$({yI4C=Z)d3sy^+Baj_z?gx1Ve_Q*dsuT;V@(q3O4~d z47VX+DAok%F?@znLg8j$DOa0>m?>6@zbh6i8$&4$GpkQ6QPIKCBcAzW}lrf)T@5>;;g` za2T47U+sEcOz}WB81u#KMz60V8mvBo>SN(oKoKKqL>7y^0*V<) zBTDh`TcDEBJYpD+y#=ZmZ6h}E@H?QI(K{lHho^zNjLDIbc5{OU=bK#oF1)6oLB^g7-6IBi2+N%2qSKE zCUIg(F+gt^)l3dp1@1GZN9yC@_dqRUaYPo6y$9+T>my2u@I27L5R4ioW2?X%qfN0^ zhu44wM(?OF8CwIE7$c)8$?!U`%$OW4NygTJ6~?q;$PRA+YmCKFSu(Z(Y%tbGl_cbJR=xqJX?9QeMZSaV-^Q>c2 zfDY(peRMXYY2wp{+kZB*DL@xIY8^ErlVG}_mvyjW)eY-`-qumGvL;Lq^tDc!ReB8L z!BFewS;NN|9t^i`Q_Q*?N6e=?P2%v#bRl44+^mFvr^YgX5D%(uHhmw-3T6m@$}V?eih!32Xuu zSOe=eMg#k-edbbHVLCWyeS9vz^*sH;fOXhhdusp# z9I=j@n`xb(gG1Iyb4t$xtS`)1Kbos}KEVQ4tv}4ko?~oq!+L#AsRQPL5K}O3*n#mt zEvCb~O@}S}!kYE7IjiTY%nS3@-E$s_jr)Z~>!G=r=c=p=a_bj!`OnX@E__tX-_4%G zd{BoOIA79%3Bc{l;Q9Ivct1#FHq2{w1sno*Gk>4o*)?$pq%u3_9lHYfpf2<1d`QOx zAJk|1&u4bn?!Q1_#>`K3Oza1DGJEHRU6?({V2;eEbioeb9_HkHNf+h-?qg2R*LT5( zK_+u?Ue<*j2H8xv1z`{73c53W7E*d(H_($AsF+h@ZlD)4Sh2Z>-9c|=)PiPTz%ek4 z*|y-=7vK#>F$Wex`X)YY?#CB0`vQExIOZP<6@3#vU;^{QLVI6;FPOyqxG>W<;R|Lm zxr>_p0ms3M%x@NV_D>uKbC}MHj{OsdK}RNcL9-{|2(@?!Mn`K#gaiR7`)G% zUaTL4&w;hf#YNd5b`Gp#t}iML!x3NyQ?O(>j75N5Ob5jY0UQbTFx{4f!&oHP#~fG; z8Jsu^)-ZjRQikCuu%8*YR5FZ3frHFo#hC#d4GuG-mSn?NG&sskT2dN?6Tn$!^OE5x zmH^H%+Z6W(a3Z+C>|GL$Vu|1qb7U!H6ixz{nUhN;qgWES!kk{JABB^_HRj@yY!pid zH<;^7N@MVMAjA^L4aczWKrNPo+-3|;2X$C(a^V=34(hRdnGp~Ad|HymrY<7KsIY#uJjVl0i9TaWy6IeTeMM;&egr~n!K&db_6XEsJFMEw!cCwK z+ig`ii#36IY@gMXS-2V8$_`vDnZ=sH?d;&y`dRofNMJ{;%4V_0Ad#K4sx${b19!2T zR}JT|XP_m!ZPjKDZUt%V-c{io)(SG%BdaNMa2vRXJ-J#khqZzG*wd@^bMSMJ$zEKQ z&0)_$HhXjQn+Ns7A{cnAz-H?J8kVMAazyKT*82_6O`*}ZGRC2Sas zW{)UNV&D-lmOZ&vvV@I*@$Bif`XzW2Ok^*v$(FEDFqyr+rnC&d0JGSFb;D)s1(?lt zShrb*UxK-8w{_t%_7cov`>dxd!;@eEJ8->Z8Jh&Ju!Gm@m*H1n5j$#Kwv4?3i`hx* zN-OYNu#(-pZn%QI1*_O?>ozO!JFuGFyDnV8-hp@6BkL(E@HBXrJ-J@8f=z?>+0*Ow zEAV@;mc6(xTfyFgb?o(Zr8RgS>|hHv4A-!Eu#4@mVY3D=fIV!t4dEKL0QRwc6lXl} zBG}Ik+$dSY7QsPw@J9U_yaW!jqc&t~*b+F(PEy?Sz^mXayLrQK16u{>*lim&8}J&q z!0z1;ZeVNR5_?2(>I1KX%k0UGk_~JfTwzad)NjBW;2L{zL$-l!fE(=f4J8igGYH}d zGhfJI@D7<&$(FPhKE&jbEk@)n`7{bfWb znYRupA0UySES_M?jss;RD4XZ7g>!&p4CV6Nw)h<=GluebK3h@`kW8QgUf`B%2g*#K zE4<(>k^>}DsE8M}W$ZwiDOAi$+M;}rWDZsGnz!sYSY{4Y@!Ga<4wA@FHLrJz-@!66 zbcZ*xCG{YQ0^Q|JZn<`_i~`-~O>dDLBw0YUyu~eJ2g@v=I^OygWqT48>fi~qcG#Cu zp)Q_-7RR1MgL-&wT7LFrG^mf~qm^n;qC@?>K&@-`Wprqe7px_*Co!O5UX<3DeHjB9 z(ji_7IKVtL^7fW)Cs=BigBonG&>zKdF7qrOW}^$Dh`gxR4G*O#Y(wm`mAVh|OQu zR(2&Fft>gPogJ=aM<5rzgAT`)3-V&w#R@&k3Qxt6&>Ui@Gk zi7Uw+^5#eBjJcM%L%#eZ9c6dYF({PZth2+t>=+czZ`0wplf0owey@(7dzm*B%^%T8 zRg9#dSpKBWHTNf5W2z-)|GgYPC`ZeDBUs7vXf9TKS@{F zi*yF6Od+|M_n7!+F z_#Ib_c?EI$8Uef?vUUlc>F){nOq@j(4C%)PeD-6OmEeVbLBOLQv-SyQ^!o!o%gJ&S zwCH~sz!NJz#Yy!~1$_5o)?UE}{f>a|E+`%stNP0UpQS@u0tfvAe!O(ZNg&v|<3w2w zrz$pY@S9jA_8hb{?@Zaa12QEryIK)AKw z#CMkUTQ(J#I`RFQ?C|KOOeDbq0C`%yN_T{NZWm(w* z$885r@vcMp0{?AUr;h&wT^5|)R(a~hPf(#CY+J{v<3B_Bo6{UM(-oYR!mLurRSLz* zd1t!nfgA-f^}nD~qe>TMG%w8l7ZD0%4#2EGVD?AY@o&aX+l-yRGIrT(eB>Kr*Q3U6 zr;Xj?j6MEt?0MPv=s%3T?inBZ-Pn7;IQgS#=HI@|+ViZn3P?vaQs1 zsniLm)D5rHJ71}vUAYyj+*Vb&y|EJCRY{nrG?=R-s#fjPs@ert?Y6A4w5_7LRM7&e z=;2k2^Ho;aReP|iy;W8F8mp|ksubbRzWCaqE~ZpeJ3LW4GFLmQ%3giSUK?a@tgtl| zi8xu^`aVX)K}MvOMEKeH$bdUh;dc}r&@G$4*_pwJwUo#{Q`O$=yi@6kAxSlBvtYO3 zlM<3@_GX9OHct$V&)?eIz1!ny3iC+U8^A9(#?v_7QqMmQx%(K*QO`)Fe+Ds#}0>s5?7kJXLMLnd;af zd0>pBmZRSnZPbQRk2YW5#Ov+WyX&2mDObE^D85t~fAeqE@IK=G=b3&s6QI zcAWFffiY9H3hf4G&4YgCYB#liciwq$%v|l3cBixBK|iwEZS4W)kb`4nwHobl=gfnC z6t#QWe>hhh9HXc`(Ei}ue$dZC?VEU-P+DB zj`n^uwO;L`E+O_~v~)S?MRxw-G#2`i^ftTZunHSpCCz6`52vxwb<%3K{ICiS)imbi z=sTtH&@IM?a;%(G_^7t=ksJ@FG(M_pd@Lu%NkxF_8z0ZfcS;kW+lY%aD zcsi%v#pp0vXKa&Ku{=JBE3^oE*uL!l3U}2a?%~Yx_$yq6MZ-hQ75}%mn-;%6+_^IT z7I({{^P%I4|2y1mi-CtBE938QH5TI!GgthlarZ3#cv!JAK8<@|@!?_nivN4uLyM0O zXI94FAH%w@kQK_MOa~B@m1WsMQ5GkhW{FF z(PE%3WMg~{C$|`{%iQo^7iCkAZHqlscJ90avi&u-qF(89uDYTZy;GoUXukQP!b023 zBQZ0(6t;Z{=ieroOHsli}sOxGUSFtIf zU4e{j`U^HFbNt&+3YIMMZ#U{c1)?8R;O;r%Zijr*$o^e~{%r;)YsWnle(|Q{Q+)50 z<0qqHT=UNy-^>>?n&5|>;JhQa81jiU_*en1wu9?4pdqxyXxA2!(-xD^EoNC;zN*|} z-m!%;yJaV&wR@KqRS|*?)w0Uc+FPk*-J!*r)e=Iw{=5EX3BJ-@{~sjy-a*6PO^bN=e5 zu&>H5e)W$(>&>4`0!7LB-)O}0K(F?A{hu!~O z+u8E#Th3qK4*R<1;@9_Xe*K{H>xUn{mTjSo@20$Prc8!WrY=(cxJh~2NtymYnb~4t zWVxHS9R`x3tQ(+*@TC)Md$k}E_(1BJw%HUX32I>I%H;F{%dzq-XW z@8(kGxjVIOcT;VtM{Ma4wpKZ|dvDoVciXb&ZH3x`GP1c@m5tKhU?)XB{fqDPzdCr? z%q*_n@KgV=rGDj8P_$%%Zr(-NSEFj(qRN!2vZhqoa#crlH79*FXEQYyE43prY91MC zp80A=%hkMU)Q+{Nc}vxNLjEkjIi?@UJin*p{9Xm0>3E*@Nzgpcuv4Wf*h{lbVfvpG z%)dCy_zEOWk$THSVp29m#~@L5n<70v{ijU+)5%k0-xB4>fATLi@`5xjdHflUi$N`fK$r>+Q-NasKR~8Neh}`qhv;63=x(N{CI(j%^2xt^_*Xto zQH}c(y!<3z+5lZvK&P3wLmlY&lg3mSnfL2)_x~kdUYPkSG$&P{n85#*%2POb3N7#d z*Hm6^i1Po0%2O`LgbEb?W%7SR|*D8xw6uCLS;zg)a z3@0{f0@1a%bah%%vEIQPJfvf_htUy6>YjNFaP7q zEBC%E{Qb+KfiJKA@nx~1Ag9RFDKd0leOsyKvouX5xh|&F-s=IsnU$wdizyBGm z`>Rd&DO*SGRCMk3-spBFcOND9o+kIjk)?kp_g^Lt{DVArk394{d3b<4@&|cTQKeI~ z>9$#X_{w5VQJ+&Z=oB%!(-uo{7V^LUJ5pz{`uktyI*W~u7Mi$S(Dq$hzTTy^ZR7biduD7r#p%SEYELD<0>HC;E29<6QAXSFIw>RT@m}+O@r^Lsz#Zb*GYYn7*2X zD!S<5uAiZ-A5ye*_UQMnIaE%^gd$m-DbX)eRv@O^epTKs_ph)ae3xpLBKyVM?4rqO zh3u;kB5Eo&Z)W{d5w`@|N;W@B+1#w)gcU(cLtsSdi*bc3obsvlsz8O`3PDBg^@HpS z0Y`gXNt=5OTulM(u4x|{({|jUbHq=_Qnz zGQQ!O-ZMoh*$@A_GNFxgD_t#oul^>Z&AeSsuB21j`~Kx_q$(2Vb2hjx(%&>QIa~jH zkSGw=FY_C|{Hvn;AGPx|!jQ7Ti&TTR%EWoef9S=Ef95B;RpmeAwpCTT@4owgmD~RE z-u~scRoL#U`BY}MZc%U>wtMm$_mtS~EpObLVr!MrX!V~gkALYN|KWXb4}WsnnlD!z zxT2uf@qSGzM37XfYwSB;#$k!E9^uyEuwn69~2B*yPa6tB9__xIMwpwjNJu! z%Y~E!`5900GY=HxKPf0VaJl^dEUx|DDm&CR^{j2?&~y2-=PCBmj8p+G5V7>iNOY2a({jjukSY|&m)jBd`KPqn>O>vmY_~PlUAD%wg{Or*W&z@~= z?f#+le=M|#9=`qG3T^*V-|D~lwdMC;{{_PRS0zqi)O`Z#{`Bhpb4ogMe{BBa*pmHm z<&Wbk_Q%)!nUZdKobXq4x`OXj)8tjpKi1N8tex*IZSt1!eWsdxX86AHCf^i6P)2i5 zrr=b5^QjWS>GI~&6@qVT{vEGwKKd8Pm(k>r$@k1p|I_Mgn#y$eSpHn`;`}H(yngG# z$^&rq(S_A#;9B>EwV?~kg@>0jFUWtm@P73R`FG&^d57t#w(0z~*Ch^rl(+p+;qa!W z?M=PI+m^Ps?GEpxZSQ0bucw}ycQ~6r>HJ#a{Po?=uPU9t`la*BYn^6U&R-Tdo1vY= zRA+_yO6KjUe&o?wK~U|dc4PUynAxJpY$BN;i?d6k1ltydt9uabXj+}_`G)g z`!CYJS9*xL>Q(B@XK)z06B$%1dZpRFFrRfwkR(~tQVW!cXrGz_;qjatlPQe-gBvWr*G(fTYc%|e~UDFAAr{lZOBU;nXPcO(9Z!P%6v!I~A;F{;<*U}$nJuWQk zi+l3L!}>qI)c>I=|A$uT;yv_ac&NH)u(oL624V0W{`o@T z^EJFQy+|r1^ye1!7ZC=o54VmTYkOVztQFtdQ`lOIf7XP5T3z_G2><)_!ryP;pX3%k znf0n$9;{0})`AYT3~zt<^2)<^gZCv~4~n+myME=~jqUfVuiRhTR+E0EM!fy*^0wbz zUjFUf(Hs2(H(IydXuAAs_2vJocH6HV-oujro2)mFYT|6e#@U>}L~#(>0znqB3WUvy z8W34xY*ATa+qa*sRYcs8#MWITWCmh`T55mcgB6%Z1YH7tpgQmXjFtC3uEA~f5bSk2ExCqeVvwX5;m ztIv+CdVYN1`RP?JDhFO%T4iV+FkD^r@{fU+w^j|_9T1AN7DXxJ%OT{ir9D;Vw%f_MXZSF)G|3`Exw98$a zhX06qLs{;oG~!3p2g-35uR-$B0I0$pU&GHw1EKTok~Mff8U$6l%hnM2C>xTxE7u?e zXfSleomj&!KtrHLckLRy01bs&+)ZnU0yGR#xQo+~LX-pP-0^gNAsPwk-6iRGAsPi4 z+-2!RAvzy2x+~L>A~YH@yA$dBB6I;{ao48fMQ99UbvLCGMc`F!WA5U$$Wb%_^7p{k z@{gj6p_v|%wfIqV3B>l0ttF14OQA3iN^+TbBshaW?~figT~>xg6M3P|XoT!;LOehY2$AlC7J zMpr_+JhbcZpV3uNmWOE_@iUqV<#>qKBc+w=_GgR#%TThgt z8IaUNxgIG)w?J1si1qw3G!ts{(5}bJPyy89VOmd=p+ZREA>M$TLU%(t4}1gv6uJk} zdq_6mr_jBS!9%uzIE7|GMi1o%q#WG`nLUUN{BkrKvUq4W;N_?YvU->{5annNH0B}R zh@3$WK>nWiM*bP}AT-lcvJpRn=0j{x*+$|FS^$N4DmNk(=pksfC$W)VfgXnDd1^P} z6=)$e-_x{_s6dOLSWodLHOQZZZ{c4?|A1z)BwO&y=yizAl5HU_qc@;1mU0Vn1-%K)W)WNXSI}-~ z9!t9gzk>Ea^I4`X#1*s`ie-s2kp}b*l+MC4`3>k@Xah@kfi&^8v4$!|m-K)YDlOuP{tfU;PoOrjChKshY20Fk55pb8c);LFkH(0P_bfXmSr zP&G>?Ampe4lCqQnqy>EmU14bjaV_zKPy_3}0B=Eupca-%K(wGnNWl^dk#_VAq+{Vi zemnXW(z7H&yd52Z3@n+DXt#X_y<#;9P3`DA$jl;ydju^ASs3ZQb=p@EG zFYQ(w3^rnrgN=w^(aDThFY$Ls7wXPP_rky9ccC7P4PKJ(@GjJok>Mr#j_5*J4563u zJLGqioL)qH$NwFj%Gl+l{SN;fC1(|xz9W7|$r(f9?~&_h0HeYS|DJyx4P>16l6;R} zM}rvEUb63r>nNKc1(S&oax&2sFXDSXm?*?(^wNHhgF!-!7BAEH1ehPhPk3W{@Lqa1APAkdtl* z4VuFkn=0OoJVFmJ{Jrtr{72|P#!PR?Zu}9N&tQAYb`y`#0!A1ZUW4e+Lkx0e4PS>I zW{{(5a2;C6AScuiI<$xp>n+}cJVi?w>E8Gr{!{cgV}rM35B?M_Wn_5E_7G3eGKLTg zok8^I2?jZ9hOb9YGRP4#xE?*lAScTZdbFI8<1OBcyg)B7D!lQ%{1<2?;eVso8EhZfKH_im1|tj%XF<&9O$IrWg%2jMFy{Ga z_u*jh3S+*HX&(XRtuSJJ#M#I&dWVtjgJ<)H(YuTdK9X#F7`?~H@R4N`!>F1e^igIb zV1x=|n-7uAx1bLgK* zp2HtS-!k+*k{o;#9bp)JWI4nrYGoLGlsO2PLc%bEktO^w^gV-|RDzG8qYQFD2{DF_ zF~)qv5(L8>VgCSJ!pATtcxHe^f@2sAvjb!j0>hYaSb$Q3TPyD4d^`W`(uX}yglI0 z)2n~%mczjy&V~01qFW~iQ?T;Nkup}VwjBkEN0DLy!r!%YbI|AVg0cX!h@;idy zive|KwD}kZ)&<}d{6Z`e)(1!`@IovKHU!8jh(c^WYz$CVAVpX-Yz`nQ_(j+P*b<BaL*cxD}Ad0Y9cq~AC7CDL~!2W^wS^iOMF+4L+auz>|ErHpAva`fdY$+TTs62}l zV~OzWK;kUF7)yfZ1!~VqiaV0w=)lKkiDE1Tjtvz5f*iw^!|8$eFZ^TJ*YJiw$uIaZ z>>D^EQ1%OP3|j#U1C_rZKV#p*+X9JS_&;MS;a!2+U+|x?Rd80I=@+Dwn+l5p-~D1! zifx1|0`YVFQtokheb9+Y@i}fOygBG%rScrN3>E~nR@$8Bo`Am(x>*@_o_iAB8Far= ze4cv>-W&9?QhA4vx8(8h%;CL92TU!fK*_I;MqaM1%3r~7@ik&;6nHr zyMyriz&Gbj<#q>Pzo3`rmF0F>@L*umdDAJoeekQmYv;qu?Xuy20`HvPT5czT-v&NA zFFwWH3%>}wcs{O-n+Z1r-ajWU;|gGT;LCH$GOiGA4}5pd<`j1~{3!6y`M6WuJ@C`O z6XzwR9h>2cfpzD!r5zctEU@#OZ&}9{IEO8+Mda8sxPpz>^5xib_&i%ui_5VWa5Y<2 zOUN+;EM+TekrwPFe1%Qa@>{S$xRI@`#apl;xP@)1C0Z~etYC|!NIUih*0JAJ+0=5I z;737+s^e<8&G6Hp6V>8ct{i?5bg^1l%WZ*&f?BI>q}*2c@1UF2aZ+v@JREetS}f(Z z!y`d2tCdo&0v-)|S8a2ddkvn(K6EkeGWQR72K&TC@n!CHIEa1mqVh8L1{}(6y=ZfV zdlUYIee+`66>c{?mwo@D_zJfNj$*&OsJz1Mg=5(7F4{D3@4#!=hic*)xOd_8>=QNO z2JSt0Gy7tVvVp6H1?<)un?~+^_o-L8$?brxxV9TULJ7$HAY^4-YVDDfvn~?Gq*n8N*)=F^&HVRwW zCMlu7#^5owScY_9j!gexT*mLfoR~9%B{IANgPH7LnT+Vbn9Q(Xr3?Yh(#+Yxgp3b* zq?u$BIQ}c<%p`liiC?kF%-CS@C8P^;XQl_^m-t#iK=52lN{)vRdK&&t`9j;FTTzFhPgT9 zV!iS-!? zFRv(jx#SFjcUNrsxCzW@A&2VX`nZdkGeS<(iTk)qm_Z>I>y&-mrOeQfRxn$Eo5=hm z~{DR7gSQ6Vqul>OWkCOPoJ<~DaZb4|#h`ncOz6f-A8+<@G}HZm(h z@CN=pY!mZ*h@=6(hizt7hsYX;dsqfj8lnV~9k4CTDh-fgfF`EF5*;qEy z5~2nD*qDfE4KaZ>Y%GU479ws!9$^QV{-Jmi{}FbOIWtt!gg?Uane0$m6Y&TuV1|V% zn-Cp#2y|8xO?(|jHdJeya2-|%`lwA!gbphL?bG6B)i4`FwV<~dt7W!?n&gB5 zlY*9JaSJkpH8FLecng0BYi8<0B`x?6CTG43t!vQ^b+j-|p%+^a(Adv3hY~G((9h4b zglb!GBi0U@o2P0*Q7wDQeZH)zP$w&G^2hdDpY1p4r?UeJdxZbOE#JIwSjyp2DM-DPeFleFQ( z*ga-On5>N$#?(w!$O!g~SrLY} z^GC4f%=2NAc6ydESKpV#!+gK z+}w%IvpIy8pPM_$c^*fr#dC9=o#%5*S|T@hvU4m){172uh>_00AM*F-dN^<3NFL(k zn=vvtvWLX}T$ZztqkM>vugKWOAs+I7%$@4Ii=%yrlkdvN;+P&1Kj!*4=WxW2ko?>L z=L!z~h@YPu=zN|dd4%WZ202%AWRHmaT(+~6qkM!EmYMk;xbEV@Ws&p(yB$5|gK(c|R%SPYReJ#i{G z%h?Ft$FjBDUgZ2X@|j*%ZlB})9=w>vRBnI3*)QtAv+y(a2c18TDtX2)x8LXdD)O2> zyxcz9d1jR48Ga@=-Dz&x_JN!z=8IoEJpB zd1k7xFL6!-uPX^ZXMfyzT~x{Qt>^4Zoi~B^mdMW8mpNxfH9a?-%Pn-CAEkVboL{(+ z$wVq_4#Ydgttbh15QDdt+Sq*O3*NcvVq^2UGcs*0cGk<6ckOXPWZVJ#^q~oPj+>s_ z87jEbB5%EBI-8eoS3X+$#bb4Sj#~b78ou*G4s$~5*y9K{SLBwo+VR9c4mY^A4~0l^ z#G-RWaqgYdpVh^Ou8+IISH?z8`ptp2z4Ef{#WhNBT$I3#pVN`YIh@1{ZjV?bO0vEc z7y>%lqHHho2n{cw#hG%g)6teb0H== zr}GYir^~Ts*Jv0grS{!i+h<|Owac9SHSO^J15S?iiNE{U<{o3;Or9~l@HMNG7xCY@ zGd5Ux;R{V)q)Z5Q zLnrQEi6_RHKKjx>;l)YcoC4f;vY0m|ZY8u>O#XvaRQ3r<{Z5R~oL?weu*DSY#vfIN z2lu)89Zu6t$OliVu`Wm{+ezJ}rY=X*ylgVHO)ITghcgCkFH6Ojf#mpgeiAUFk-TR8 zplU(w6(^mNaacQ%Cywa+=S$_9KWs^fNY#w4G|T1T-IWqwSC{wLY~<*X562}fyKO}n z{mAlORnt^Y@^s9QYI{xDA@T-Qa)s*p=GB|Oik>KrfDdX{CCVHN{9P0gwyvjta;kg` z0jYfK<5Ikg?e@7tMDCPn%d4jNPWa0)Zf(Lbj)c6gCaI?FmMbYJ?Stm5n&048`A$w? zufjNeX#+6N*5PQ=nMX;Bg0ug<=UO0rF$=>xa^FrqY#LqY-&%CPVM);HTz}*@q2q`1 zsT&v`GFSz79jK)=#}sLx6zcS@A+uZn1{RSkY>esEf79f9vP_on#p};_i+EGgTJ6YP zEV6QhhK!C`&#AkPby?>7bIoKgzx<K7q9Lzr?Ik6cJb_*Yya5;F!RO((D1~tQiKkcY{QHk0$ zaH%g_s10_D8=W#Ma*~Tn@o8srXGd$SBguxj9lL7dKS`S$Ps;RDYMoSVQhn1A>N_!~ ztnyklEflJ@UX}c$xBHY?AK$F#f_})OP)HkHl0?hTO6!6o))`8E^r9qHOOW@SVg^u| zcazeVO>vo|bhy((Z$qoJzwQ^GfC7ITrXMG1T`mnthIUc^jO6h(HaFM&3K!*5TN7)0 z_yJ6bVy*Sfsf^3q;Wb!?P5-NpT)tcI&B-{Qag^xiC&uv_meVURWL_Ysx4j-WYvOH= z{i`xsNewXq&5X@TT1!$lMe>B)^wqpQfg?Dn~V%ZMYpm{rKELeQRbMiBIL$eS&SY z(up4Eub;HpQh-O>Oj$f}mhFp!l5dj0z9FNNzDxRQ0rijdgT@`TMn~E2q#`}>arq&T zK`G{8>#heG7r66cI#3P(ufu<_-J#ij6Vuu$Da7WC7_N zk_Pl&ko~}A@qzw#_jb$v@CK6eFDi9aihcX$_(Gq2y@}d0RlP>lIxQ$M-QVp;UBC~2 zQ4c>lXl}_=+5d(FCrIuvl)u>j0Wd!-sWW|f|NkI&Fs$&Ey7YvsHXmGF_P)S=;)Kgc zQ0CSH9=;)NrlnuxMRZYy@Q8?Ytr{W)V)DmR3nCUJq%Y5+<*hNt&~z$jwb|eIfO&<> zCoWy7)F#atR7IT3$g=w+oLk2i1Jn-V99fu@u<#kXV^{1|U{b8C&WKsIPaO`nQSvd` zZEY%4w^7&BwMbR1^^^>^cUwnJmCdCevaMIw^pHWBsv+I$noEuYW8}ULhS}WcE4}SW zp;U`d*BIzben&K9;AECC_D3x0a0v{xd$AtVk-2eikmEh_&Oc&) zJhik|oOFCEr!N+4PduseLPJci;i=tF4)+T62(h+Txp(GM_o9*a8k+CTluhxUZnI-i z9&c9O5PM734BtMt_Z_ypPh;uj!{cgZfF-6=F<2w*Jys5 zxrE%FRO_4v)muAW2ZARhCCtZWN?IX>;zDDLM!!FR7KkEs^H<(pPZ@w}y_+&Cq|hd~ zDpS106Id8iO3!wnb{n5^XXapQ!j;p#V&hhJtr!Oa3n%j+L;`@+I%lQ1>nI65EmD0K zy@8E`8jE0nx;vpt)T8;7vfW^;OIvL(qwJL(P_g@|JO|t00@vwz;fsR`<6dL{80U}n z%$@^?<&m#x5|C}pswo@S;RcPW?cR*I4}GRHCv?X4`4$g^Uc4O?TmTf>^@A_{muI8A zqzPk_^RyFz%Qx|p#a)TC824)G3fVs`nGsO<+VvwpzH8c9=nyHr0LXPsp8mw>hk!Y? z=AaP=wo8hJrftM1f=eB{cb+}LP#m!X988-6jL58`X~Pb*wRGD-$) zy8!9+D|y^8E3zQn<;W$9sExK+TLr9(v|(v0GBm?1FY7F@O>w?{-ErTR%Ej50Tlru3 zdBvUm-RVM=<1MbOT8OwVOjJ5JFw-vDk~i9Gohw)&5|g&T9FweTpt*`%s;mEl29O8V zksemszW`!xc?(k%W=I!ZdxCj?%<1>(oWnMW_o_@IML;C9(LD2P<@SvRyV3IQ-B+ry}ObcdC*rMPC=Y@a$mUmDI%2X$KAl%sCD=h>?F12D?$L)Oz)=bu4+mf#&FOhx8)f##kdu7D*00{R)K z5hxz=ju0{frv4WFlH`_@spIOrVy3=b$mF z_5tH*jXi+LXGIakD;=)qp2maif#Noqop>if?(k_qjRUOrHtF zHwSQ^M-d|GuRJGwQ-U%g@1HPm@eh#7)!e6blwSZ`1^!{*yRYbnZc_BuEu%F#+qz(7 z84W4=_5szg#s4B=Yi1eDn6`MbFXEXYN!b-F4);s0sA8NrMY<#p!lt_P1@t*M<_|&? zh7W2Y1YeFT`zf~ND#rl)F7eyXNO?0=OXKIK0`ixPo{|d-s%ESsS zG3B~pnpyztXsfMY4jzCHY(=n7Y|##%3#`ci7$l0V{KMG9kpp5@BJMWEwe49Lk$*sv zOtZDlIWFDGgI%krN7ylF*(dxj{39>%KXD&iKVZ7C)I>76MLeY6#YMULJq17t>zpLR zFl_}I292DWhj8U#ryu>_+lRX}oF$Q@AyrkEP02@lrZuu?#RH0@H>X-!f_#)!Okd`N ztvTqoPd6&bFYg!xUoQJE^%c=c&E|se-sOB`*<&8`?f5=hID+G})*D1gn#Q{yQRHK# zHCvOxvCER${!1rFe|7B0=bS+ZXx4_TMeIO{0>$ zS5rTWra(2;#+B-EjBC`W>vmA5N3*T-3d?B9X#|wBt&RTnNo!**`(gad-Em-NNlf~B z+~T(O8XE8VyH9Xgl)QEYEfV#$)pM{XH6)#Q3!sme#|tTbNG&Ru7_j$28I22;m}Gqy zjSDSOT|*l!Sw{74K?8+#3Tt#*#*kfYE%!>Wf@gDNYqWCv9VrDV#+V-ci&|~fab-fM zL-0}*x#7F%k?ov4r1Kx<;tGV2AFzYFF&JD6u{MNcn;NTJ@Qeb09F=H5vy;Y!IYasuK{-va z&F!@+`61-`W}vV9(Jvevc{YyuH8d3f7$-91*u_L}XFGt%G2Ysl$uwxym#)MJ&mWxPgrwZ(nH>5m8Q-<{*M z)OTy-88Z3*3GRCw9aXKJS|TQ+37G#TshuK?OL`Qud-(2asYh0~^;%lEtT&%Sz>vO+ z%S-%mi1qq2MjU1TXLULx#>tRx1jGYRQj%kT+U^MABwzBD@1`+Ko}+K*@^|xRfhf>V zV~=bWqQRZ(Ow=9-HKT>9{KI&D1`-0Ed&;cwiw*zpnYSmgnrNVJEH^h#qO=g`_k#8^ zTEFF~mR9Zz{(cs~99#hmdBb;*H?;=!Ir{pJ&}+p(;ZtmR9r3)J#kM0&#MD!Kl9mKz znNG1+1M!}f*G$3UO6y2%9aCBfU%&j$#dcW&Z{u{kzh}h*jR^}bTg-#@73ov$Ie``i~0{uQ;x1BW=6tJ7T6?eDHaEke(j)YIJ1xf z?xOzDcJ=;mD1e(YWZ9WHM7vCu7^$x77aBtiE$h8k&xOHOiO2F5IFKq=LIH4&T9jhw z+C-t}@Q~_tO?52x^a>TaVv%af_wD>-V;DDk6R=`RYgpd&BnGi@Uq^O0p!&*TW+4cR zeEhYJT1Inwp#}=3HmSA9EU%imc4XT0t3EEhc8+<;Gs2Jl-@RPv*^F0~%g7y5$ZU?T z9ig>fJ$g#DlePsrhK%zBSo{i7m%l|bpmQUaU>&JYP4a(ZnV$}LT2rV-a&!P?~I z0QVt{0yWV|>)Up=h`V=|-6sxXaSlJFNoZ`awAZRj58+jGFd-o~(X(3ST!ND-qI8H@ zQi%i&J8B04Jz8Tl2nLe&D4JTQ7OAB%gpNQN zRdq>a6ZsiripF1BI(Cye71oRTyTu$hsjCoV4s(vx0>;T}}1S`fdpsCy}e-J|Y zeQnkq8pFqS(X)Z6vavFmwmdsuue^UKs?-js(kk_CO4ih)Cv~1B;gd5dkT1SMIZ)Yj za4g9>C)+ZYC8i|5hxIG49l%MN<3(P7Wf^_gaD+O{UhxO@Y13iq@Fc5~I+QP>4%^D; z!`39~@PQ$`BU@+-u){hzVO=fF;rrVU>#mpKE&E8SI0nKT*Gou_zAk)c9z|Rpdzj@?mN%RilFbufC?>WA2cpuBHX9{(*`~_1gU0F)hLB z3Z$-1;X2)Q7@4F*xvvN1U4t^l*Of^f_+n zZa(pVRA4DA=Ua>|=ooEiEPt>T#PqfUUPjs(Hr@zrQ%D#AIhC5`R*pa59 zBv@!1%~m(0Qrq8_+8-e>Q|_YBYUxqWrX`^-FIUSkkkhaa zKSnctV0>C@e{{T3=Kz3nAk3vd&Y}1{MIvK{G_M7l=(U}R#Jd=XX5k;^@kqRi8q-?=@YuS^oiYqpXd{YxdHSy z1dkYtE^(6A7E`;I+8-m*e@cJEks6?L+^U%ox2FL!vIW@3JczYrBm~?F z6;xb)np!(u+aDAo1^jNlh~-D=ovuM)s6RJzx@DU0RYd~h^TgW}%r&Q~8czSK`MUae`EoLPyqjIT9R0Dr{-#1@CUlEg!n|qg>U*Cc*Pj&g!JF_ zq-f{gj*A{f^V0X*k;_`%KOzWk```8Y(}PHMEwt{fxypF<&%6>mC+RC0c6w6M160r=D4@@&p&)7p_6SeYCyeLlFYOpqb258r z?6iz#>bmIdcv~ZP{PolX@IXeAI)QxI@pIIw>zhA@DfC^H@%E~05Wu6&2=E2wxuuuW z7d9UYq<$%~wiv$p&~eGDltMDCXfZD#;Zuj6b#j{eXhb=I+T3e>*UpNd zq}URZqubA>jLn;#vfB7%An&=!h(2s2eQe9Ty#K%j{>xm_vd93LP}QEK`HEhdsLVR* z0i^08bdllg*v>e59jkyNuef2(H- za5Run7e7A_Tb_&fc{caES%7AeA7n}*kk8=GUR2;j(;lNCThL5hy<8>AF@DGrN4q@YUCXO{(Xr+n7N7JRH{!)1BqRfO zOPKBEcxmE(I$Al`sIg=oqN14^kYiJQMQ2j}0bbfEwk|$+FX{IIhZdw7xh_HFCe9%s zJHYg%FH%-mogV(-c%3vYen}5Ywv7XXM&D{nlgA-VgzzS1VREeVYpN}_3WE}8(#S{X z;fUf&l9_=tWUJr=l?xSG7d&8pj0Jx}IuKSL@pkuY%HnB8yN#c^)0;D>uFqUZtL=gs ztK$zn5Qq#t0k#j}FN){=yo07gD*+uc4sRnNG+OWz4TP!~k)i4Y-kOh(Co@X7Y^`)B z`E|;jg%LIjpKasn*%ZV7OuQ)0P4+Ab+j8kD85;p^AQe3TA?zhHmKRV?Ne*{b(FZg? z6j@sYWme@jPT}WoK!OGEg`=UYvtbaRCGQU8MYyIRM~+NM{4LDoix2oefXot*bicdf zqos$L{eLQH%8>yM7w_A@=di(Ang@*{!_A* z+9h?fMklumb(B+iiT%6@=QeM3OUaA)BJDJ7BUSC$ssIc=kGe;(nf#X!*n)f%Z zpLRdW6}YJ+?E(p(VGgx9a|R8&1x=JA2Fy;1?7$}Umzp%V%EuUGqSqMvYL-yNFcX+{O=h7`)@XzMk$Cefmi2}IoZ6_w-w4p&o; z&;6Lm)B79}9Tr9u&l)dv(C@8%5C1H2IuNl4M8b2I`Nxf=@RsS`fyAckqlhkwd^HTJ zBLroXXbJmc3RO`plKiTz37xNP`qR!)(Y90_h_TBDritf%82*d>M4!JL!9O2knE>#P z(!8=y_?|{B{pcy(ej4C*0DxPW5ykbtgp!df`(G(i_u}x@UOKP8q3}c z8e0V~X{M$Z4H!%J*_4NZ{G9SVi1aMA;kj^mio%)EFQ&O&)o_ZlNtF`~spi*8;TAEK zqMz(oxb_~Uf2r2@tIDRM6vZ8F*B_ftA$*k7aKWxB#t!3*>3}IcM%yt>duIQV3tLwl zmQB10SkEIz<(eO9Jp*Grbx=Ov4J2{*(;R8XkY%6XE-h7-(QIAAcmT_&kFI$OA3EU# zOdyDr~F{6Dz%i_vNSRY#C|QHOC{{FY5TUB-A>M5SVUmQ4bojI$c2(k932TDNOl z$K=_^$EjJ9!qE7`zxt7t!t#$tIm{``H&A=35vBGA9Wq^80e-|Znv4hYDykgMymkNp zN)|9}=iHi}bmT7zw*hxuP;<+%sty8o@MJO%B7-N7DUw`n-E}HMVAuT0_A>Gjc_Rmy z`E8`8jM+QpAEATRZPrMQI*a;Il}MxclnxOz3|TnRhfX(}92cAHk8Jn-ZEX{D>++X} z6uuK?`AvN2+AVnm{kO&zgbc|1AhjzqX#4@X)|iRYx&~le9aSPp$pm(jKMKuS{3RJx z4G6=|Z3GIVw0@M3n*iePUv&k$;iEnM0BfITc4WUImFZndAvdBSVo`pnuj3wSr91z* z!>%+q)hZl6HGOtuc3?PGnGsK3#TA(loQz)x?pU*${7)-WdD$VMzw{U#so6bbY!t|7 zOREtH%@AF1wPVoGBsfU#sCl&3Fe8OhpwRTYH^) zf*if5T(>z(JjRxg)UpVCt)3DGP>!;vmsLc;N^`F&=#=k?0=`2mG4WG61ZM#WjBZ04 z8vMNtc{?tyXWl@kZrB1kPC4;+cT$3+7Ae#arGxTRV{;P4r$z^jErL_jf*0vVdyG3h zXyY=Z-kJH1#v66aD!u#wAs~}Arg?dDrn=ZpJVtNV+(E-0!2{UAmvhvKt_@4F?t4(J z;|}e#^G~{!>f3Ds8S*ab;fi#k^8PLww{{ry`)W*%KVO5uEj~$^3*N4KmB)edo|D!>gL`K8uv*n9rMlOg@XVPs`e1-fURG~NU1eSaD=ijsp|GZ<5OB1 z=NeV7yH_+*g0F5Zx71Bxp9rGhoph4#g_iUM`I40|e>uL$Tz%2g1QrkQL*H(mJMZiR zr-DYu!uSYYo?{Nr#@^-lG5nQ3aLqIEzUnYWg|r&dM>h^zcPwaFk+pH-_KPbkSX`sV-8 z2B^?#?P2Yv7ob&RY-y&!pv}5RlhKCG_zt+WK-v4rY<(I@VHMVYYS}ed_G&vaV>3A~ zZ5aLo(27q$!Oc(OWe3*wvU)o|qDuf)TKCqnw{h38F#tZpvA{{(Pn)aVLzd>6 zzZj+h`)=3B$*XN#ui6}0^M@T^ve&{A?<{d=Hr~iut=)JOL^Ai40EI zMU-6jPxy!`N{tPl_<@X{S5MspsJhGQRaep!N1odMrnZ97|1%kRcn~}FNcvr~nA|(V zXtL!trPD2`=C-LcqsX@IJh>vlFUh{|ncnWP1dAsf!u@ms@UB7Ko*ISY(@H9spg@lD zfd5iL!M;IMt{zw9hF(p}3!jLw$zD@FKvb@kui}4cjsr%?!iaP8+~WkzLN(L~XRXNvLW1nkN2-flt^U z)uh~0hJ)(O*}xF*Y~JeIw{T9!+G^<2Wx+pfFL_K$N265NDw?tJR~9H~!xcO*Zh6@< z|4nB)1apCmke+!FXFctW?KJAMYm|&jT01~tHNaxTE%-q8Y_r|a6M$kiZ&}WtC%P#tNags-d^P`8T@uGTGWxn^DO%#bAKpcSZw{=}Mw5vvbhgR4a38xyU%Ajp+N5 zb3+`l|2eJO+17n4)i0^l($qrCt3Ue-83v?z4V>(~=J|8e)Fep1t_(6`K@ z=r}-(?AiK3ZC|}~84EP=>$xI7$ zSbvN{lX9zdfHe*ta-q86d)CYI5Gm5YC75(MV4hub?f(iRC_lT9c5gsIxH+ga{97U5 zpK+srK!W^-OWGZ}z*gNL)whJQm7mNAAgh5MxzEY`o#qcf4^_84C>vHURJZ&>!$GYz zOUg=*f06*CjI5e{$W;Cb7;9kbRiThnI4b4piUj9*P7A+2#n;7;4BNc8pnU*xV8FuU zItOh{_77NST1plauc@RByE^8S`kPGIbq|vAq$F!OOxuXfP5g^xTY=m!{c`nZWVkQ2 zzpk6s@Kx5RZgmp1R)DkqeYHid1mPDD#e3p#u*Y8+#tJ@)MPt8)^JZ5@aCg<9KqcR< zV1QB7w3PfaXr3oM?{uq(0piM!Q@$-)Xnmc9EbFEQ^P%guYd z((VKB9A70c^|VcJ*Y;<<6?5NC*gVECZSq zbwY9=AIO9Z@HCfOYyTb>n`~*uEbc?$RbUIOOF?YA-~+lCZKbs}bHzBOGz&G&-a!{r z$wq(_7hlBIH{iq7q;pvBNN& z?u;6A-N{*;>YtB&MSD2IgXX$gEyExMCET{pCiAXsFQE$pb@fGtmd{z8o2g)baV{BT zyR~i>DFmtgqsbZm*zPb}pg%yGK(an<871-RhOdL%egM_okUvNLAyD;JDy{sr6$L!u zb;NC&Vb&L^T2E5c0N6hHz>0D7YE$T2E2qSPC|=$p(EI}8g$e7UDf#_p(2y>g8 z7)`(DZsh({G1!>NZsz4=g!WU1=pPSK4?o&%%}QlS;;;VqQJ3dw3eQxax~cIxi?E|g zQ2v*pd%BX^k7kXr`K>pf?p~NOi|k&A`Cff2jQZioLBrh4<8(O2*q*78@80^Yw-)>` z=!yYmh@aQs@5Z7yNKV`b6F|J=7F`gu(i)YrVjhjA4ZXUSHPe>QBZ~=SWK3lN&Gc)m zO%K%PC{(|*cadeXG9K;{Pg?B7AI@62OIrGheA#%SQnQI$5WK6ye3gd|oh0hx+B6lz;U-Tfmq z%9|y?HzBJo=O1mR0khqjrBQ#3(k!W`fAem>k2m;^iE0$t8N~1N4?bZ2%pp8DVd3&< z)Gw_MbAake-2^4)JEVOK>pxU;lh3m5ykHRY%M%4HSCb{){@n|c*3)>jYtY;*kW^>0*yt(!-+OyZit%1S zi);ZRX!Dk=lZPsC#x*mA3Gs;_MhwyF)~Zm|Rnisi+1A|y>N1+;JW#@5*>(Y0& z(rNf81H^D1hb1NRzKlCt0;_e7`(J?-Dw%cls!jhTUsS-Feuj!w7n?aC3w7k1X=j7R zSv1&>l5xx_VNGE zD6jpM@h6B>^&*FOiB$X0v!-QqP1;H8-sB9k?R&Yh4j4_c^KC+(4fCkWkqI=ewOQvr zU=PMuOG$HHlmJYaJuv47sZ9rrj8m%~N3@0_L+e*Ff{RIo#X)|Si68~XX&hQ*mG`hR zsioBe=xykxbfNvQHTrPb845{tjYVqtCO^``)aX64RtJ+Y7}IBDP1r-qMkZOUf>CM_ zh1T5<%F-|Zc@c}2RIQd4ZT0N|3n-U&@*J%BfLdHPL4$+Rqd~d3ocA6+aM;@4Fs~y z_qO26@f{Ew0`=sN}E2dW0C`9;3=ZVFgR0t6b94%N^Y)ML$3l(pK$e|v514^-An z2zmf?=VF5@iIPApkO#~O^r9hr6G z5;8onqLx}5RZP2OZU(6ItV0gF_@+E|2ch;E-_SaxQ8iEUoKA{dlBxk_-=9gxz#SG9 zC;J4bnE_M!+?jq!ofYj)7Y{ieIP2RR=2G;8DtLNeox5_y5^9Y_J!RGL%cB3B?w(Dd znn9#7H_%S)ydhmwW+yFlni!#KJY~NYlQ`5F}R~ybza=9O1E>h@&)PP&(4x6!goP)a9kEP%l@Rn18F z%A2Y?>0+ZpGZ$n8@osxhkWF>{0((A%c#KoVxRJUD4y_P zd^B@f(l-Z*l0>k*%29^z)PjEZJ~xkGT1cCF`|JNhOMH!W?<#c^by`>7Yp6d=V?vFU z)6RZ@wLYKX&ntCm5muLPt28uR(76W4YVv7X!(2^oQAkqse_42}9ezoUKae4kE zzWp>9$yn?<9Z1UFE%;t{(g^_pGBS7kX#-_72UYtrF-jMN=Ju8S_sZiYlD1BWe8F=E zd4v)y^x~8tuP>++=xMHEP6w!4<|TsGI?@puq->B#V3lX8$Gx{Up}P4lwWgqKJW8mp z>+tnE9LYvp39n(A(*bm>`;8WfHr+5yPnv}4w&P%%-(8D~C_YYW_JB1jhxG|1h^iQ& zVgKTB>tU{+N>{e5wC<|Oco-kF+Xk$T22q_YXB;i2iX5p54zfV8O!@8r$X$lN1N%;8 zwA}Agl3tf;X@Emd+?z2Sw1JUrE>0hlx-)2Q`-HW9E)|$N@F$u5+?=^uL%VK0RGx1n z$9Mi>G3oeCxpZeQb#q2huld77+It!@&yk9qt`Jmfp#nL)lGgHW>zfBGTDmliz53RV zCsP`ctQjdXz25>hg+FR13kHk2^J`MQebI9)yn~_v&@2zo#Z@qs3F?w?(7ZL_`?tK) zGPr*{TbPiL{v(yp7g|T!%4qBb2H(>7oH8_-z@wGGFNYl+!D}q~kfS3$6S-5uNi0}q z>k_xJsth^44~QKo8%$eFHh^7ayOX6KX%&n9hAWiwwG0U5P$Y;l?|In~MzfD=A|ksy?b^D^e8QdP)Lq4KSZMVLOP5y8Hzy;$1)w)Tc#T-CW3eBhW2Dx_O`(Uw4k~Cu}G(*WINE&FG-I zHM5#_y(}W3?whjJv2=_FG@u=b*tDTzeT%K_#N0FIoJxxrfToa6^`wa9Joi52Qb6ETPet3y1JL+HX5%*b?EGEtIc(_EWn!4F+nOV>39 zb@Im$Fb2$I6T#BD#DcU%%D^}mp|l2=RjzV4SP5ktbDNfyJ@5On@Au*Ez4!gS&-459 zJhTzj0kRJ*A&fo~{UeK+gu7OOl44Q(O`&C4tg`+hU2c~ET&>KMk(e$iyTJM8`XG0KT0uxW&Hs^j2&3Sqg9V}+^%BVwm9gvOGV{lo&0Pw#bx};<+hMx#88Yn) zS_TR6UT{*)&`tJO`1Nyo=Cv{ie8Av%l$#Ww;?C3jgb6Th*y&QZVsg`qK)5crmhWP$- z&1Y!WADj5{iO|={3KtA12d6=wo^%?a5#w^C1hF7c|GfJ)efutQdWE1HygHUJZ^aVF zW=T_F>Hf2n`X~UDC;FZ#4m4Mt-qvxj4$UJl@7@<|_PBThB1D0st2X{gT7gOcN7lxq zUh?eIrXyO8ygnDlHGD@3MPMDK{Q0ZMe#fWlVsadA9OvT^VUW!B8Q1Cf^RZx2|RLLsT zL#D}9oVlf+w|}2{xlsm#70iU4ty&aSmY328qo^Ik3g>}wQt|YJ#6JEA=-+cfI!=a0 zf~|(6bFdcRw#q>1i@O$pKFW z0Wg!CZ4V^e=tZ6cFl*=yr9Hd@_YC^5>e#7ZjpmvGvAK%+N;OP%u)l@xPN<=suB@#j aT5CG6o*6d266_pUxqu@&Y`O%`WBCuGaHW8)bigsoXXd?Yc9S7tRWsU@{(b!+mTUjOk)98IQV$o#NeK*gI?$ zuR2Bd^lUI3tBrR5u;{$kx8iNPH|dOuLBHsZTWWmRDcbyh+a7iYlTq=meLgBee+TV; zvEL~sqt4+2HM86*o)5;wVdtpZ?|2^v!%lllSK~r0snANRSS^kw{ey9rPR`oH_Gt%D z=hL&Mw?0>VC|a%KPQNpxg~Q@taM)?JijQjJPOCT@b{2+{e$hTV>+}zK-yP2j$OzlR z;={*pW;CGccU#5!d;09Rdxhh@7`KlD+@q|OmP&)EeuoagS|uszuyjl1KCjrd)+*Av!;owFX(b6C9Vj!%mA z!FU2R8l-UFW5~l|1XO%IviaMebbE*M0%&~FwRtGkdV|q~xmg>Wo^^Xvu(tb5!D+jH z3_*bQ3?_!10mV!~8z=3t#&bTHFth!!1}Ur_c+2xf8SUN(5*lcp!@vba`$!;)vZ`}5 z?~Q4c5p7NoMUi2)u=!Ct`<0n2V**VX6*r1M#upDnQeW7jTUZeN z{XAl&XmNB-yJOL4iIdQlR^c)9D^l0!<_n=xNN2p~0$Q*SJ4Zt0Aa>MbM*RKBU@+=@ zlL{9$6#<=LnW%veA6{&&@BMjuef#4_gKvAlqUxRsyuMRsw|^X)4`>ZUYvgw}9GrEA z<8Ei9=1x0-6rkYYyJ6P|rK9!Hp7bCt=QeQ-w|m|3d8_y#tnYW4$6gOc1lT~&N{wwB zHL+sO&U)v?o*`?G`Ov%_b&sKBb#8<(84lrgMW_F^I~?>+`P>-A{zt-8`|Y56Se&%q zYFvDWJVpam2T1sA_buQ~hI-lUcgI~|{JYJ9&%BRdlhF-fiK9S_qKP-1^KZU@Ad4oS zL~H@e#fL8nEtJ5VS|{z%=DYq2AKJMJ&%v-LQv~#+#&>!5njX9%`}PgxK7PSWsmJ#4 zc%lK0_9(Rb`Wt(wB~Igz&M8kDtwlX(fk{1Sc$xp2bjPX_=b;I^7*9s?pkwD`IC$sq zjP)@-`sND}Fj#slmU{}9HgvP%MJzeGH7%m-ZogIh2y?LIH5rWur`^A+5*%p%TrG_{ zW7ZsVpk3_wUpBTjpFdlFzLTCq>IcrA3hSde>M&JaY1I081c$T{XLa{Bw)bAGKhn^k z_l}RY{(f`o-`BS;E%JQx@%p6&wtrZE`m`)j@4+Altl?d^e+U{MiZ%H1VG`;UB1oZ* zZ?D_7uR~(08mEfNpze8VpN&W>1sVqx75szXQTLSP*6w%McUds)LL*wp*2H|VKk@xr z9JJSEu1o)t)gU%>G76w)P;SWXib&EwZf_+`PT&u4=%!WG}YXweYDkA>1Br8Nwmxa$W8=vL+j^^Ci&lyerm+!@;oG@TJ(wio!`C=nfmtVF%8B zAc+I%XHdWjBtk*l6})SAsZ)F)^93XG!I|;=rdUbmef#vR2k&1PGW07OP!aEoaswc z+nYBQt&gjt^Zr5k^-;Iq9-jMm*wZUp@H^dc5B_8L)4V*{c4nl{FAPwly^N5=yF{-g z{%S9sX#I6jM-P)S?7-KDon}LbXw0<^yNIc$on{SFbD*lR$OMAUq63!Qi3W(dWfuf4q+~x7+9shNlt>I*r!}pwN6EYlmRBA(*u=wjr3T zaD*NKu|GlDeSp+BKDzHPYM*r^IAP_OP<#Hg>^MxH1Oj@ufq=jCo=tr?>ExrQRBL~t zMG&!Pi%LU;(Y-|QyuUgew$Gas4E40`3Pj)$lAa#N`i>+XXf5-{hzj`maa4z$Vz+^; z^0x81#q1q}?eB`^*mqT4sg>Vde%%V%PIK|6pB9hjMY;wQJPwF*38+@LHIm}oT%mLT zCTveG!WA`PJ;LK}cN?zMjvA!^W`k2(siQ%kNk!m4Xiw0|*WVv>jCVIOjkNPVHY|x} zawaAWFMr=1Z=1{oix0I%#nEtZDt?W~aBR}I_8j^PRNL&lhhZVA^$(l|)%r1-N-12ih$P%}=g3nauimed-Wz!)63{OI#y^@GUT z0Nyj&H!P<0+@u*%i-@MNn=uNn6^s$D8{ZVBG=1T0Y8JmVaX>)TrdaEQ3C@+V2)bTf z$X#Ngw9BY;^T-AUDiZ~i>+qu08C%k_JZz8KJ|W^hfeO`xufm#u7i%UMrdDOF2w)L1 zqZ0KK)_?PemEtTia=x&7L-$@b6G}r%VOk={&Wtj!eV14r9*-`-Z)HiAr44ny-DIt$ z!q;gm6;9KTwIqVQ0FhVFvJ-nw!ud>RU7R73jxS;xtnL>{8JCP_r5EitvSabi%wY(A z!Q{hglYGM0$q4fevIy3-H;8Fi1BR`%=)-KG=8gtfWlT0M4GeSAfBi+lu3Y>{#XsCw z^M@a?^EE$c{fmW!lC9q07#hh+$7R_RCw>s>&SU>--I{w)q|Ve@(X{c@TEsrmr^(m> znlYm3=XVi?oG@48)9jh))dT-%@JQwjjKVaeWTP^Tv)e!DO{A|sM>decBy6LeXkN5) z^*V25xM-fiKv|e03Bd>&`*27%#MSFbsysv$J}~1A#uCPVss(4lyV!H7(VAB3DjrN% z(A8c_>}$>9Z_;Id`K4Yw7X(G0wbs(>f}YmQ?&zbPH@P0&0pS{iV9<5l^dM;ngWfq3 z4}&(6nU)Ago!$`?guKs=(E?RRwRL?sI53k$>%i?W+a|=r(gX`VU(oLCYOT@mz}I@A z>ifOHelZ#LMra&^H$|`eren_@oQ%h34;B|kSeshR!eVE9p#Nqwl8va{mp;?&%T(6x zpFpi?rA`Yj(MzqF7UNLA&4w`ipfP7WZYl0VwbHEY+LP8uM(Sa6 zX-a2nWut0JaJ#+iYxQ!yL)s-g*fw=W{x~XZUDQlN_$$=kSGIuDG}^+B4`oL;2CKEK z$v(yYQ;-T95|N89d4-ohk+FfTfZU*LC z6qIOT9_=?9->>f=z0m}6r_5fJBB=a_O=%hFX`n3CM;JY0v*_$}-Y41JY2+fF0dzxnk!%yqQI$llK%(`G zGP%vIPrr)0P>;-kvvEn=P_z1UNftLfinAd-M660mbMbQP>Bwxqf!vlt>jgLvF08Rs zQ^@omFCM?U;;A}@w@Cdai3fV|H;gKj@u~)Dh4fvQpdZs5tA?5kCr#XKy^cnbHYIyP z5&ug&LCz4uT;a+rgqg7~2nh1v81$0F#nnL3Hk$h6%$OP8RgiCf)Zvg%IBwoxihp;~ zJ;1q#n1MoQt`7V$Ci!UZ8I2FAhYe7T@rCy1p*d5w@L-6kiMCWG`41Xa8&!;{jKUhy zU<;|`uo)fzq3Y3Gz25q8Sgk6tuU=QsJnIZ`J?^*V?sSivd_m?dskld6(N4||r$22^ zwHKE;OoEyj{3NxC6^99cJsILZ(0(1fSSL8d+rxtsoN2xrV;rnQjP*ngi(UsGt*U;% zrXjN5_S)T3Q|!!#U6}ip%BP)EY^WR2anurB+kFbh-;X$43~TeDLZIpBdh{@UHbB>7u^~9{oGA-{$vA@X#_tf&|^gI_iL1_};$s z95ZW#-a634xhq9xgEUjETt)ll%EQ5=fQ3Vsio-O^h~y40*^$#1Y4bBmd?Q-Av1x$~ z1OtpSr`zL>i!fO9y&}qTYOVnr3$@%``XajOW|W_3`jaJd6Y0Ln`}dwj7Nrj#jh@bmrLuBiYvsCE3%)>rX^VUiWIW z`P8 zv*v4qYRq0PCD(%rShwtU+HPuFjfu!f@6mc@{kfS)d)86Ai>@W!;|f&ReBc{I2aJd> z5d^Dd6SkhIGKBrTH8zSKrseKfFaEq;tiIU5n^HAG#W|Vcnlhzy-y=fEa3~{HGD9Hf zMkn0GwTj?Fdj~5EAR!-Pl<^K-gEfzp8B`I~v^CF$Em#Deu^g`j)vWTrB|Ha*+3s>J zh-TOLEn$+t_ks-{nz$B3v&#RL@JRT+jB@mTMt>%HbdS!V8QF+gNq^opf9h-$6GCx70Jwik;G|8rRL~Im~%&a2HJM}EkQVD*}JOf7RFUN zxn}9r9$pY|ka__r_Bk{YzgjuISfNuRhyY+u3}v_hM&@J=+b- z7z{!159_Nh?yT%q%Y66U%IjE6;cgEL1+NgzBpmQ(`OCTD55njF?Rc15D( zt!RUlVjqYb#2(6^3O&*XTZC#l4aEvB76CUH+jCc6R&L3$E^EA=TBMSU z-5lea%IG*gZz)i!KgZb;u(zny^LNw^w1vUiJ62m3aDR;* zc;(lf$dWnb)v$dg6EOypgbBDj0ov`+Y5B+x{uIY7D9k;qeZu#LomPoGY?2sQ$A2C@ z2|<)QgIBcBRHO3#9}A-ljV?Fb&296F*+oI+vi`8KoDD{JzS(-xM&MQy?b~=fy!uU? zv8yoX(|w!{vA3HtisBQVhzSLE_@=m^JJ{1p1|~}{JkbYu>gPi|{$2JXbydLy@e>9$ zXJ|Y^Po+3-##1Rk8U?`@vtTlEzZtQ5GcH4|AJuw}eyBwh7iXi(N^f-GAs*RV6pf$l z3A`gcIntA(yv(6Jp$q^)IZoxVkF5E0dJX&f?(5hf9vtLf9x+3^w%&`zTb(1?eNB+4 zF%*My*WbT>o%f=E@us@!8XfcJTeTB7&^N{H+ub;5{8kLPRRYmEn~Y8jdu99G*RR9+ z_B9%~uY6sz@N2a_^3kf9n+^Kfk-;#`D<>0d`^T9e*)82X+ux%-SwxUQ=a08;VJa$PerRd zg(2vvm4#q=$5#VJM}2TbhM--EO##oGF*OPbn04xjLkI+CL{Op0C4@((No#!;VQQR} zM$^DW@>Xp((q$wt@Ty2s_k>*pEkk-Gl0)&-(U|T+pk~ZY&;IgazUc50ZIt=e@vu3a zu2?RbDOyNAD$Txl41m~FVwQfJw&E$kA+jZ32l)<|6=SBeZv-w8Mm%orI&oHpO>bc- z#v#8-C+p-}l~@_(2;QefrRtHgqboM}`~tmmsJ0D7`(zVYY(dC@;jSR@jUhEno?44l z5D4U^_O67D41OZDYXb@pEfff4-i>slxXSAsff8B<-tklw(ZHidle|HZA#NGzbQvAzTwU2 zJ-qmoo~L?yElE+mYNc4vT-42>0b~FZK*Fr){0o8ReLr2c&!H!&uyP4=1RB3?F_M-O z_Wd1mLZg?SA*AA93aDzLBi`(^j&9D$$1dXlI%a2xiweq<7g?uI?OeH)q+B480E5#= zz7ajMO{QriWGm11!VoYIan?7kjqs}JEn*`xq&Fnu`$zVCaZbq$_R6Hx)bu-KHC*_T zd1yUG=C>T`(Jobu`v*pol{VE#z#S2huplmjAf}OSuEBNe=lGukc&iA{q zDdoPPyE35>zt@3L`;mFu7R_fb>xl<~M6qYI(YFqtwa>ht)k79_O}Y%6!g|SM%J!j+ zRr~U^EE#rN1MH!-XZ^&b?_sELPw|rojER=v9DF`92x5T7YX{UjZB)Zpfk}WmQCB1p zPx@UV;(YL};)%y7grouLMaZ)bAxi#P$13DV2^vCdIm1hok!HL~MAUu*0%I`JtUbkdm{oL0;Am3SK1-PCY>~U+_(0OZ*w>6yG7_nDDXRPr4 z;2o!S>0jhe)8F`%Zgs>!+O{BkMt$lqn`rKc>>_lI88rRDY%NjXuP>n}e3a0G=cz(x zgD`s)^%Qv0q=cz6yhC%}+fiuktfFvxI)=|hHW4P0LQR+15dAS+m{|i=GU752U6V(Q z5>ePs@@$cEp|h^A`Gj>%b~wv3912PL@fnOS8ZRwAU28?gCtt%3h=rG}K7G3RYHw#% z=G^bMHec=h&dM= z5^sYB5kqcl4=OpHo9LWw11pDCu2!>s?n-3XphE-Yx|y}Qw1)Luaed)b79Y|*;t0~T!USKrvKnBmAz{|by(CMs~;#LZLX%z^eN<@@@0jQ&-B zE`V%yLX=+H8iKXZ=tE?YVq_R$z=SX(3QP?}K%`A2Q&=N1(&44Kz|75ZlMak>^f^G| z9R--oXoYQl4FkFg*ARr1GVzbH+4+!%q%@049^cgYDJ9X zw$!@G$=GT1Y)ojkia6L>%2t8kd;P5mJW$BbMf2X>1q|^lEpiCyn77Wq$eWtXV=xE{ z^6i_;U{vff?BWipu7=Bp*Di4eHj?#YYY{XC2Ln<85>I(X`)50%y|6&~fnX-^MHL!q zHsT7E2Z3hhwESIhV>jL>;w2#=us645EXZ(UyQpm~)GU5#gf?iY!53q6iT=FJ-Fkno zTb4q|4#cqJz-`k04aL4C=N6lila|~l*zFRV{TCRPtxjzV_+`gKA4bd*B>8QtGhTvI z;&yTGcxSv*K8-lXdQ1v8r?ae*J%xHhUG}V5bt|hX*7jPleW`A1A>$Z=r)0_|9^crb zon3DzXOPot76dXXw$^u6H=ggUZ9aRk@pOG_Z+m@bXXE+z+YgtGBBooG39plqQ0!4) zFZk4ld&pK%pjF%kaxvl*OJ|2I4ygb${HQqQFdV0;ST@JdXq%LFf01cJ3x)3$|f$4lq<{OKJZf=!cl*qlpb52g{Xq2${S&-@*qQ2<@qO{_NdlIz`5cW zOtt*yVy)83<%p{kO}O(cUXoNH>&zhR>b@WLqOfG>5b^YUP${R-FeNZO!koOy;N;eReh+TdLSKoU1 zd}rg?I?nvg_%GVF!y!UIOkc5{*@>-^bD8FC94BowqxKPJ3`wmR6CU`cW>55vA4@#D!f2N4sa~UrR`u?H)-U$(tkd6Gm+FAdF1@gaaOSM|f9< z=!Yci^0b^f>q5*KeQGbAGi)bO+U3}fl6_1miXwJ=ZX!(OjUS2sXyRq%g;)7ye?Y>G zb|3M)KiC$EasfTz+=O#$+#_R@VnL;Y3?(<5yZLnJveCV77C4FUrdS=Ew1=x>|Lo%O z0&1=ucu|~?%23^c5KQwAA~9PLGka%6GQNTC5meTWcPw_Eg-|K7?EY?(>=wg0={Bz) z8py=ivMs)G2|ZO%pw%Z;SXKa*YAoMNeJo$zhec+Ec((}F%H>roWQ&-b)3c3xcfrc8 z4MCdOyghwv(OEvQc@#GVsO`1)N7+kMvf?`gq1KX=JvHT(NJq8g&%72PDN^jL1p>l2 zC72bSTdZna-_-mQLMg8|FDWR_s@=Prs@=I@I#ak@;Kec2 z%!u9O*TBGttf@wsSs0eZ@&^4mF7EoG|5Zyn@lRXYg6dy$O$YOZ&|X>EGgk98i`qKQ z%2tCFWs+NE%rI8eb?Mm9WAt zcdZ{GFv!FOYB|l3l38cYuT`5uHU-E%AQC;qa}(<%ts4NO@auqlNNL3O9n^VGn~HRk zQgf3=S-`OOOAk}#yC8BoCz~@xXZ6wM)(+cK$Uht_5JEj&p;ZuOW$|iAmyJPR;(r4P zSc&*_duu3qEQb3if7dZ)faep=@TFb*5NZ;%b_Dg!Al4c^(r8L-fPQU7c zsmRmn!Ju~I!TMh}b_fyQdAZGKWHw6qQHl@Ip3}UA*k`GQ9?sdpi}(TnEmb7`F&7k( zj;dk2=}i<^!gjD~6%j4XW613Qz6+?bma*>vP=tBH91Clu%`n8pDh-CE4|oof%ZeF$EY*7F zPMRoVuf`+=zhuR#MO=}jeT-vOQ}=-xE)8$dk)ZCc| zu)I^pz9*lXa^b{>N}Z)Z6)WuhS>I}m$ME;l0kGc<(QZn?@p9+M!hPpFCgjf-x81HO z_K&*NwJB`;wB&KcYDtiyGytha5RKE{ep}$C;%H0U^o%Mfgmv-Y&8p6xG^u5aNv&Wx zvjw~}0EGK$$)>@=C{v*rco6suf4udN9=Gi2mvWT0^O%Pcr5OyAsCo#9$X8IKk26w?n`W|b(l)*{@&su__?Ap!ytM$a9r z$%$#pR#Cc6B;HFZ7bilbCya)1VKQdf#6j9$9o~yERw`{cp60X?-^ z8VO}1SWeaYt^XyJYGx{KBI}qQCb^hI|XDPR=|nut_vRC20hwV!W3mrLc2Red}_YBZVM65*S?$)0Opnxs&T z;+qziZNf5}F~;(G46}WWb^Faw88#)}>8=^Oq`^e|w0BD=%zq>m;$j(-vW#t_d+_F* z6-AmWb0_#sQTrWSR&z@3q??18rsU~Q| z$}C1_x*`fmvpkd`*|Sw_59}Tv=R5T_J$E`5KA}wGE-}SUkNYgxRMYe5+VT^mi7ZUT zsbC`I+)|vO34+N=hmA%}BRw-D&MgY4KaqHI|3R^;Buj8ji4aP947HLZl&xDw=~_A* z6~7?DCO4dpk5WOKGdVLkHVIPVKyt{y&Mk{az9r==-kM};8HgXHt9IaLM>at6N6}^< zaTi~GxZjG&1nnVADh#F;5y^LP{|+LgT>F zaT4{%82!ecIDxbgG)m8@wxCirL#FqH=}0p`@rV;7Vl^9-W~U(2bW+n6OiLm$&3Txk z0T-eDfFC!TwbBdA>T&jTYo^N6++pa4tD+f~cfWO7`3@0UGy|;hxCD@!MgctSWAn6YRjB+;x@d}%(KYU<$%lKp$|mD`ioyQ!JdK@dSKswl!JN#T&`_Sr?Irkh)Kl zty9Kg9nGRlwZ&jtB!Jx=2bCs+G!RCZu##cW2mrT7Y?Ni)6yYg+$QcxV5r3eh%dwb` z=H-2hAI=O9H_F>7JRiBLvf_XspsFVS$=Vp2QG|0@-Jqz}v^kqGBu%Q0RC0_+q~O1| zS%oaoVdt&xHWamJA_Fr0lv_-*5F~mMV$+BKHW}1j?>mchEYaa&O z8SW@EvmndJ)AT^5H7-??$B`!Qtk|uMzVF5-Jz_S7-hA4c!T0ShCs)9ZBQ^p6yJlO8 zW*W=*jiPUyXwvT~K*vUb3yt7;7$=+ifrY3BpO^-aPmihVs#4OJzG)tr0o1VPW*FTG z&)k_7FHpx zY5d66S9lqvFl+7~qLRIi8T1HMYSi6(;O^J7C|Ai5ZFpY_efugY97p&@;|L>sv;Hg-%~0Fp{PLrj;de z&X4IkyEFMp3zmF>2u=w0_t`^racWe`OnT9E0%s+@&tKO{z+k7eyd&fa&nPh&yl0DOhZoQw1A`?-?hh z*f^`jv=Bp~7q$~qNY9wpY_!H=Osg^eXd=CYWB11!b3Ej3hy&OtdWFPJd2MVnMUyfU zU!($dY3%&u;?OM#-q9*1`!Z=lYV!zz8;!wkqJ*&fvd`j=h>7||x2|_)fSP22#+9~C zc^`rdNwi{nxDN*j-8NT6Db}L-159Bv{Sa1*8%iqz+zBo1V^N|m%rsQSEWQ2CvFX#s zSd9h~Ex>r%(C!9VZ($tgI+q#tJ`+ zx@2V{;#L>WtO%u?TMf5C_}UM1jax&xklCGB3udoYoQ=|51Ke0-b5hWd0;JAu@J>a0N=arn=U#_x7`{Hj~DfAk@^ew|4+<= zjM2PWZ^U&P@7}#@bvxrDt28`1Smgi8%2!{v6vQYvQ!gq##_l;P%PaIx74FmD}E^^obtN}fR$?k@FW5t zNInE46^^3NrSenJ6BP5MndlM3b$~eX+_jQ*CV^m);8BVjY5wiOj z5y0sDjtnyiEWMY*X|mKBNBj3O1IG0PAzHc%6n7HyNys1>MQ3Q&<7$z#MUuEMoVO#V z*v{wP?nU!oYubJ5&Iv#fc}+_8}QS(BNA2;5^R<4Iw9FK2NfWQUusjx zpxtjl!SWJ6IijziuP`A~_!W_HB>AD>U5M>Q0yA&QMO3@={_%ZXq);@e{~e5O3H^hI zYw4k=|IU*q+1VO{BATcJzXR~--TQ6ilQOK=l*lBA6m7{spCO1)tGX3GK*TaTqlF9x z*65N=aMfzdll#@82!iEA;;>oIL^hZ%iOr0W(`1*nNNP=T{$r-K(sCvpha`K}cA!j! z*Y@mzACdoQ$@(x;UlnLfPa1#y$IsBXW+RwGyQozQSHXK@d|>Tw;s`b_q})mmUK?&lS&TzAZF$x+qIH-2S?Hg zVi{)jL047Oz$S)$7Sw*&7bf!Ojh$$`Hd#e|kPe5v)}7-V?Vtl_fURPLi&-Z%_(06A zUHU$s502zZr#Nv?)(5+O6~_irBR!O z_az<$JxIE*6Y(QyA_j(0gGp;v&MDoetYkOJhr@MoqT!l=j}^oWD2m8QeHh&4y*3zL zM8o|koDyLOZr9IH92T2_bH)WA#%Q!fddZ+HigZEDc))GnN`zsDi(Rb*057BuqY=I~ z#811;Ugnnjmbwwyzyh#B^FBRtNQrBO!$vHb5YZ&OrGEX?lO72IFcI1)Nz!r6Ttr_OkrrC!> zdb7l^Dk=BC&-Viog0#tK8uXY|WjsbuBvryLNy9;WTvLf>olPg z4e$G1duG2Za!6dvmMxvIi+6@Mfd1Tff>$Y?nw<$Wz$CUx#4F*B zNET1$s7vNbP%S-3p>^D+gF(;6XX=BF3GlD(hB{owNm`lQr3T^D`Z$YkL{gZ9tfW zc3o|(G(5XyLdmY*y0mEf#i#TTKN>9)=QvJBjb!* z2o-Z<;8&H(3yW(e>x1}U^y3O>n4;UooeN?1F&m+A*Pbb=Gt~9zwI0;W4~%PnMN%^IK}gd*lH{`9LI{{jNd;ghMEmhYtDS8VSft5 zVBQ_uo}w!Mneuo|cegl*aDZLnI2K+P$F+H7Qn#_txU1wM`u~06`0pn?x!mMfzCdEi z+_3D+b;$|)V`@Hd66r$QGooKF-jCh-XLxsrV`Uju8?u9WR@tZ zruqq`zGZ8>=4D)&|34Sveoq1ET0+kZp()8mzE@`=f#jdtx0yYEV|PbZUh`gai{~KN z$m>OHM~Y>FYrx8cY9z^UrXLoB^@abw^nfZ-g-erV3xaE(dzj_Q(yz>4#2!=gaqr=^ z9kxH!(_J31HWgR<@vn4kuWqkxY+T^muI)d`b}WO&=Q**HS!H!}(Cy|1v2yi7GOS+r z*9G5W$`2-bHUqu0EI*JM+jcB z7|*8d1BU;6BXazQWnqeVn4%b6BJ+3LAxv`zWsa^-b5tzfd%FG)qc_nD8_n{)7$EU0 zq9(XXh8seZ87!GGuty|{wr+BY&ZP#0NjQds&>$1ksuKdUijr8Z1eHRV5PZ~ z;|m#GNzP0v)iu5{eTFSwLv=qmtB2-A(5%zUxBY)#G=#>CkB|X}k<0U@f$IeVnVW)C zq8>lOr8c&OfT4|CcGE;fi&mHnj^VK>aB=v#MTwX}7+ok4LG%{kQ8J8MfshiTBNG@F z2b(a0bhV<9?-a73%(t#)Dbh-sMPPO}6w@GW(g%Pl^arznzvRp|Z^#gX>A|C2(tN9i zoXOL17b3Lp$R`oPEYeDFYD~up^Fs#ekX@BB6tnHhbzCo zkLBBy{{cQ0h?J=;1*00CDqFsj%jLVi(}lTj@C?L^c$e(@pJ{`*67Ju_2m!}^#5rY* zpNC|wP^99xyU*e0@%e*5W5I<+=kh2;BL}yDFif1F?75cEYSQ0VHZKJ$*-&7%N_+Ob(^T`wK5@NwpKkMb}6n2o5&HPs{un-R(%C1Ok zpvMvWWm�=OudYK{{{6j`trt+DeESL?nij(^wN);W&kG-r<^*-^cS?R{K+l*+03 zS%#2WcXgLm=~2mCS?mS~!n2%K9-5&I5$P!2ewaM1!7ZvS-Zw)bBJO$Y{erga@Omzs zBriA?T~v4&8}*Goth#72xVFJJ0y?{on$=fx8LYm1jC#>;ZZ8AxlK9<`e?5a)sh?o# zI3AyvjAT1{X)+6>T++)eL}Mh6T(!Bg@`xQ42;8j*=IMS@QidU7lbX7FD<<}G8a5l4mqp~Qcmb0@3lgFW`qRbQ zXqYwewt3d>>ZGGsu$q$eJLR1+$Fo;6$;@iHkD8Spn1pyv600rDL=py&evUu7M1r}} zY9XJ-O)PTL@H7>?32|R!{Q2b2&05&#B~9A|R|NW`a8WDriGQxSiMfIZKUutw2~Iv& zyuY*ZzvBI`2(0>j#rwPe0P+6r{{ZnGB4wR^qIiGF&PQXgK@;y;b2G&Ish#gL<@+lE z|6lq3GWnj9*SUP}0>=e1d$Pe<)TJcB+}7xF{6b-lr&%&MBoU9@%Q_XsgKRr5rQ%Es z{~aUBUJeMl9OO*LNZc%y!fmlG2|7{?kv~dut735coPQRR5)bSmQCqUT zlJMl=f%2*cUuGknCZC#d&p>FY=lTa7L`og^TYKM4x~arm!lOn?Ggh=^vKf9~}ky@Of-D9f}yC z^>C_=h~SgORjtY!m1SA&u1sfz729&XIAao*CXa^FmU}*x7pvc|?`?1V$2!EeeDBVE zBy6#aS6mCTm%qFB<(GHv`8!_ydAss*`QBGweYLX8`_f`=9=n%kO{F)PaHk1L7M;!n z`g?qU@u?lK3MOHqRET2;#qlRp3L0L8sj#t=?S#PzT8*7EawQvE6`egY-fM}wi^z!c zLK`Hfv4Ww9VX)FnnNKS#^74MA46Q8Rt2eWJuTn88n=1mBl1VqiO^74MF z^74M@rJU~BRWit!yR6b>urW7fPYJqg9%uH&RHa%nPCFX%d7WL2OlA=iOk-Xx%yXy~ z7LGFDZ>;54=y@_hOGO(Wf4TDImtQX3&ED*6zM$!{Q1)u?+3H_;x4d$1CDaJ1XlJ$- z-qGIPi=8d2ch{&du-&o?7=}TyMa^BHVsR zOWa;9m${2QA#R#&)1c#qtep+ui+`W3Kik~;5kO;a)fW&15n_o&+s@%>lv`v@+kDr5 zF&vPieS99%_!m&Lyf1ZXp??X0%zi7>qHGT1FGU&L&<JN&VJANf_w!$E#0Cal0pZ(gvYqprm6l{fqQTqIgG- zbY34^xD?gz1#%}mjs1DM1^;t>G%`9RUUIosJop1|39(JjGLBe29?2FMgKmLwv^c<)GFDvjT@-nYzFPy_sOi zajG5 zYBS<;1PHxcw#9NIrYzAF*FaTP;nFz?TDg=#Q89+!dmWbPOg-e*+#@08vAUEg9LsV?jyBkyMQIl{0qcY9g*U3$N=eCNx%_r4PGUs%+p zfCO7FIoo84G=*GP zOM>NXIZu39J0$gaUS%#%ty|2vRz>27CLq<9I2*#4L!QKuh{LDUKH326_@*jmE8ikW z58n9IIC-0%q){B7P3tZGG2QGJNA-{3y6faK!MjdDK+XIi2eGvang6VVZ7OC9k*!9L{YL9OB9iy(k{3#aIE|APPs90 zaHtb#?c({%r%xj=bAK#0OBYqU^iCN>6@f|WM|4ctk+&lVlW25ze|dVobQ!g7zv0Bx zWQg>81f_(%W#N^r@uDe*5D-G%N?t4+j)*{oj?xQR3CNJ9yBxE#cWg`;;Jf&FIXnmH zsg#Y|ki*3|*?r%u+uQ3~I~$wNw;x)(BRf2ub^Awy)=g$p!eu$5LRp{>2^IS+;Zai$ z?UOSJJFizhOl|{(=zf40!}+#Q2|7*nTceZi5jRYVWSwY(${9-_qZN%vDJb*aoUU