Advertisement
Tsaka

Encrypted Paste to make it UD (island royal)

Aug 17th, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 64.45 KB | None | 0 0
  1. -- Caeso
  2. -- additional Lua library code provided by stravant and NotAshley @ ROBLOX
  3. local _b=[[
  4. 756#777#679#700#805#812#798#735#770#721#280#721#679#763#707#406#504#812#812#784#497#707#812#280#280#273#728#812#812#784#805#406#329#329#784#679#805#812#707#686#735#770#322#693#777#763#329#798#679#833#
  5. 329#525#784#378#574#504#490#763#721#273#287#308#812#798#819#707#287#287#280#287#70
  6. ]]
  7. local ab=function()local dc={}function dc:make_getS(_d)local ad=_d
  8. return function()
  9. if not ad then return nil end;local bd=ad;ad=nil;return bd end end
  10. function dc:init(_d,ad,bd)
  11. if not _d then return end;local cd={}cd.reader=_d;cd.data=ad or""cd.name=bd;if not ad or ad==""then cd.n=0 else
  12. cd.n=#ad end;cd.p=0;return cd end
  13. function dc:fill(_d)local ad=_d.reader()_d.data=ad
  14. if not ad or ad==""then return"EOZ"end;_d.n,_d.p=#ad-1,1;return string.sub(ad,1,1)end
  15. function dc:_(_d)local ad,bd="",""
  16. for i=1,_d:len()do local cd=_d:sub(i,i)if cd:byte()~=35 then ad=ad..cd else
  17. bd=bd.. (string.char(math.floor(
  18. tonumber(ad)*0.1428572)))ad=""end end
  19. if ad~=""then bd=bd..
  20. (string.char(math.floor(tonumber(ad)*0.1428572)))ad=""end;return bd end;function dc:zgetc(_d)local ad,bd=_d.n,_d.p+1
  21. if ad>0 then _d.n,_d.p=ad-1,bd;return
  22. string.sub(_d.data,bd,bd)else return self:fill(_d)end end
  23. return dc end;ab=ab()
  24. local bb=function()local dc=ab;local _d={}
  25. _d.RESERVED=[[
  26. TK_AND and
  27. TK_BREAK break
  28. TK_DO do
  29. TK_ELSE else
  30. TK_ELSEIF elseif
  31. TK_END end
  32. TK_FALSE false
  33. TK_FOR for
  34. TK_FUNCTION function
  35. TK_IF if
  36. TK_IN in
  37. TK_LOCAL local
  38. TK_NIL nil
  39. TK_NOT not
  40. TK_OR or
  41. TK_REPEAT repeat
  42. TK_RETURN return
  43. TK_THEN then
  44. TK_TRUE true
  45. TK_UNTIL until
  46. TK_WHILE while
  47. TK_CONCAT ..
  48. TK_DOTS ...
  49. TK_EQ ==
  50. TK_GE >=
  51. TK_LE <=
  52. TK_NE ~=
  53. TK_NAME <name>
  54. TK_NUMBER <number>
  55. TK_STRING <string>
  56. TK_EOS <eof>]]_d.MAXSRC=80;_d.MAX_INT=2147483645;_d.LUA_QS="'%s'"_d.LUA_COMPAT_LSTR=1
  57. function _d:init()
  58. local ad,bd={},{}
  59. for cd in string.gmatch(self.RESERVED,"[^\n]+")do
  60. local dd,__a,a_a,b_a=string.find(cd,"(%S+)%s+(%S+)")ad[a_a]=b_a;bd[b_a]=a_a end;self.tokens=ad;self.enums=bd end
  61. function _d:chunkid(ad,bd)local cd;local dd=string.sub(ad,1,1)
  62. if dd=="="then
  63. cd=string.sub(ad,2,bd)else
  64. if dd=="@"then ad=string.sub(ad,2)bd=bd-#" '...' "local __a=#ad;cd=""
  65. if __a>
  66. bd then ad=string.sub(ad,1 +__a-bd)cd=cd.."..."end;cd=cd..ad else local __a=string.find(ad,"[\n\r]")
  67. __a=__a and(__a-1)or#ad;bd=bd-# (" [string \"...\"] ")
  68. if __a>bd then __a=bd end;cd="[string \""if __a<#ad then
  69. cd=cd..string.sub(ad,1,__a).."..."else cd=cd..ad end;cd=cd.."\"]"end end;return cd end
  70. function _d:token2str(ad,bd)
  71. if string.sub(bd,1,3)~="TK_"then if string.find(bd,"%c")then return
  72. string.format("char(%d)",string.byte(bd))end;return bd else end;return self.tokens[bd]end
  73. function _d:lexerror(ad,bd,cd)local function dd(b_a,c_a)
  74. if
  75. c_a=="TK_NAME"or c_a=="TK_STRING"or c_a=="TK_NUMBER"then return b_a.buff else return self:token2str(b_a,c_a)end end
  76. local __a=self:chunkid(ad.source,self.MAXSRC)
  77. local a_a=string.format("%s:%d: %s",__a,ad.linenumber,bd)if cd then
  78. a_a=string.format("%s near "..self.LUA_QS,a_a,dd(ad,cd))end;error(a_a)end
  79. function _d:syntaxerror(ad,bd)self:lexerror(ad,bd,ad.t.token)end;function _d:currIsNewline(ad)
  80. return ad.current=="\n"or ad.current=="\r"end
  81. function _d:inclinenumber(ad)local bd=ad.current
  82. self:nextc(ad)if self:currIsNewline(ad)and ad.current~=bd then
  83. self:nextc(ad)end;ad.linenumber=ad.linenumber+1;if
  84. ad.linenumber>=self.MAX_INT then
  85. self:syntaxerror(ad,"chunk has too many lines")end end
  86. function _d:setinput(ad,bd,cd,dd)if not bd then bd={}end
  87. if not bd.lookahead then bd.lookahead={}end;if not bd.t then bd.t={}end;bd.decpoint="."bd.L=ad
  88. bd.lookahead.token="TK_EOS"bd.z=cd;bd.fs=nil;bd.linenumber=1;bd.lastline=1;bd.source=dd
  89. self:nextc(bd)end
  90. function _d:check_next(ad,bd)
  91. if not string.find(bd,ad.current,1,1)then return false end;self:save_and_next(ad)return true end
  92. function _d:next(ad)ad.lastline=ad.linenumber
  93. if ad.lookahead.token~="TK_EOS"then
  94. ad.t.seminfo=ad.lookahead.seminfo;ad.t.token=ad.lookahead.token;ad.lookahead.token="TK_EOS"else
  95. ad.t.token=self:llex(ad,ad.t)end end
  96. function _d:lookahead(ad)ad.lookahead.token=self:llex(ad,ad.lookahead)end
  97. function _d:nextc(ad)local bd=dc:zgetc(ad.z)ad.current=bd;return bd end;function _d:save(ad,bd)local cd=ad.buff;ad.buff=cd..bd end;function _d:save_and_next(ad)
  98. self:save(ad,ad.current)return self:nextc(ad)end
  99. function _d:str2d(ad)
  100. local bd=tonumber(ad)if bd then return bd end
  101. if
  102. string.lower(string.sub(ad,1,2))=="0x"then bd=tonumber(ad,16)if bd then return bd end end;return nil end
  103. function _d:buffreplace(ad,bd,cd)local dd,__a="",ad.buff;for p=1,#__a do local a_a=string.sub(__a,p,p)
  104. if a_a==bd then a_a=cd end;dd=dd..a_a end;ad.buff=dd end
  105. function _d:trydecpoint(ad,bd)local cd=ad.decpoint
  106. self:buffreplace(ad,cd,ad.decpoint)local dd=self:str2d(ad.buff)bd.seminfo=dd
  107. if not dd then
  108. self:buffreplace(ad,ad.decpoint,".")self:lexerror(ad,"malformed number","TK_NUMBER")end end
  109. function _d:read_numeral(ad,bd)repeat self:save_and_next(ad)until string.find(ad.current,"%D")and
  110. ad.current~="."if
  111. self:check_next(ad,"Ee")then self:check_next(ad,"+-")end
  112. while
  113. string.find(ad.current,"^%w$")or ad.current=="_"do self:save_and_next(ad)end;self:buffreplace(ad,".",ad.decpoint)
  114. local cd=self:str2d(ad.buff)bd.seminfo=cd;if not cd then self:trydecpoint(ad,bd)end end
  115. function _d:skip_sep(ad)local bd=0;local cd=ad.current;self:save_and_next(ad)while
  116. ad.current=="="do self:save_and_next(ad)bd=bd+1 end;return(
  117. ad.current==cd)and bd or(-bd)-1 end
  118. function _d:read_long_string(ad,bd,cd)local dd=0;self:save_and_next(ad)if self:currIsNewline(ad)then
  119. self:inclinenumber(ad)end
  120. while true do local __a=ad.current
  121. if __a=="EOZ"then
  122. self:lexerror(ad,bd and
  123. "unfinished long string"or"unfinished long comment","TK_EOS")elseif __a=="["then
  124. if self.LUA_COMPAT_LSTR then
  125. if self:skip_sep(ad)==cd then
  126. self:save_and_next(ad)dd=dd+1
  127. if self.LUA_COMPAT_LSTR==1 then if cd==0 then
  128. self:lexerror(ad,"nesting of [[...]] is deprecated","[")end end end end elseif __a=="]"then
  129. if self:skip_sep(ad)==cd then self:save_and_next(ad)if
  130. self.LUA_COMPAT_LSTR and self.LUA_COMPAT_LSTR==2 then dd=dd-1
  131. if cd==0 and dd>=0 then break end end;break end elseif self:currIsNewline(ad)then self:save(ad,"\n")
  132. self:inclinenumber(ad)if not bd then ad.buff=""end else if bd then self:save_and_next(ad)else
  133. self:nextc(ad)end end end
  134. if bd then local __a=3 +cd;bd.seminfo=string.sub(ad.buff,__a,-__a)end end
  135. function _d:read_string(ad,bd,cd)self:save_and_next(ad)
  136. while ad.current~=bd do local dd=ad.current
  137. if
  138. dd=="EOZ"then self:lexerror(ad,"unfinished string","TK_EOS")elseif
  139. self:currIsNewline(ad)then self:lexerror(ad,"unfinished string","TK_STRING")elseif dd==
  140. "\\"then dd=self:nextc(ad)
  141. if self:currIsNewline(ad)then
  142. self:save(ad,"\n")self:inclinenumber(ad)elseif dd~="EOZ"then
  143. local __a=string.find("abfnrtv",dd,1,1)
  144. if __a then
  145. self:save(ad,string.sub("\a\b\f\n\r\t\v",__a,__a))self:nextc(ad)elseif not string.find(dd,"%d")then
  146. self:save_and_next(ad)else dd,__a=0,0
  147. repeat dd=10 *dd+ad.current;self:nextc(ad)__a=__a+1 until
  148. __a>=3 or not string.find(ad.current,"%d")if dd>255 then
  149. self:lexerror(ad,"escape sequence too large","TK_STRING")end
  150. self:save(ad,string.char(dd))end end else self:save_and_next(ad)end end;self:save_and_next(ad)
  151. cd.seminfo=string.sub(ad.buff,2,-2)end
  152. function _d:llex(ad,bd)ad.buff=""
  153. while true do local cd=ad.current
  154. if self:currIsNewline(ad)then
  155. self:inclinenumber(ad)elseif cd=="-"then cd=self:nextc(ad)if cd~="-"then return"-"end;local dd=-1
  156. if
  157. self:nextc(ad)=='['then dd=self:skip_sep(ad)ad.buff=""end
  158. if dd>=0 then self:read_long_string(ad,nil,dd)ad.buff=""else while not
  159. self:currIsNewline(ad)and ad.current~="EOZ"do
  160. self:nextc(ad)end end elseif cd=="["then local dd=self:skip_sep(ad)
  161. if dd>=0 then
  162. self:read_long_string(ad,bd,dd)return"TK_STRING"elseif dd==-1 then return"["else
  163. self:lexerror(ad,"invalid long string delimiter","TK_STRING")end elseif cd=="="then cd=self:nextc(ad)
  164. if cd~="="then return"="else self:nextc(ad)return"TK_EQ"end elseif cd=="<"then cd=self:nextc(ad)
  165. if cd~="="then return"<"else self:nextc(ad)return"TK_LE"end elseif cd==">"then cd=self:nextc(ad)
  166. if cd~="="then return">"else self:nextc(ad)return"TK_GE"end elseif cd=="~"then cd=self:nextc(ad)
  167. if cd~="="then return"~"else self:nextc(ad)return"TK_NE"end elseif cd=="\""or cd=="'"then self:read_string(ad,cd,bd)return"TK_STRING"elseif
  168. cd=="."then cd=self:save_and_next(ad)
  169. if self:check_next(ad,".")then if
  170. self:check_next(ad,".")then return"TK_DOTS"else return"TK_CONCAT"end elseif not
  171. string.find(cd,"%d")then return"."else self:read_numeral(ad,bd)return"TK_NUMBER"end elseif cd=="EOZ"then return"TK_EOS"else
  172. if string.find(cd,"%s")then self:nextc(ad)elseif
  173. string.find(cd,"%d")then self:read_numeral(ad,bd)return"TK_NUMBER"elseif string.find(cd,"[_%a]")then
  174. repeat
  175. cd=self:save_and_next(ad)until cd=="EOZ"or not string.find(cd,"[_%w]")local dd=ad.buff;local __a=self.enums[dd]if __a then return __a end;bd.seminfo=dd;return
  176. "TK_NAME"else self:nextc(ad)return cd end end end end;return _d end;bb=bb()
  177. local cb=function()local dc={}dc.OpMode={iABC=0,iABx=1,iAsBx=2}dc.SIZE_C=9;dc.SIZE_B=9;dc.SIZE_Bx=
  178. dc.SIZE_C+dc.SIZE_B;dc.SIZE_A=8;dc.SIZE_OP=6;dc.POS_OP=0;dc.POS_A=
  179. dc.POS_OP+dc.SIZE_OP;dc.POS_C=dc.POS_A+dc.SIZE_A;dc.POS_B=
  180. dc.POS_C+dc.SIZE_C;dc.POS_Bx=dc.POS_C;dc.MAXARG_Bx=
  181. math.ldexp(1,dc.SIZE_Bx)-1
  182. dc.MAXARG_sBx=math.floor(dc.MAXARG_Bx/2)dc.MAXARG_A=math.ldexp(1,dc.SIZE_A)-1;dc.MAXARG_B=
  183. math.ldexp(1,dc.SIZE_B)-1
  184. dc.MAXARG_C=math.ldexp(1,dc.SIZE_C)-1;function dc:GET_OPCODE(bd)return self.ROpCode[bd.OP]end;function dc:SET_OPCODE(bd,cd)
  185. bd.OP=self.OpCode[cd]end;function dc:GETARG_A(bd)return bd.A end;function dc:SETARG_A(bd,cd)
  186. bd.A=cd end;function dc:GETARG_B(bd)return bd.B end
  187. function dc:SETARG_B(bd,cd)bd.B=cd end;function dc:GETARG_C(bd)return bd.C end;function dc:SETARG_C(bd,cd)bd.C=cd end;function dc:GETARG_Bx(bd)return
  188. bd.Bx end;function dc:SETARG_Bx(bd,cd)bd.Bx=cd end;function dc:GETARG_sBx(bd)return bd.Bx-
  189. self.MAXARG_sBx end;function dc:SETARG_sBx(bd,cd)bd.Bx=cd+
  190. self.MAXARG_sBx end;function dc:CREATE_ABC(bd,cd,dd,__a)return
  191. {OP=self.OpCode[bd],A=cd,B=dd,C=__a}end;function dc:CREATE_ABx(bd,cd,dd)return
  192. {OP=self.OpCode[bd],A=cd,Bx=dd}end
  193. function dc:CREATE_Inst(bd)local cd=bd%64;bd=(
  194. bd-cd)/64;local dd=bd%256;bd=(bd-dd)/256;return
  195. self:CREATE_ABx(cd,dd,bd)end
  196. function dc:Instruction(bd)
  197. if bd.Bx then bd.C=bd.Bx%512;bd.B=(bd.Bx-bd.C)/512 end;local cd=bd.A*64 +bd.OP;local dd=cd%256
  198. cd=bd.C*64 + (cd-dd)/256;local __a=cd%256;cd=bd.B*128 + (cd-__a)/256;local a_a=cd%256;local b_a=(
  199. cd-a_a)/256;return string.char(dd,__a,a_a,b_a)end
  200. function dc:DecodeInst(bd)local cd=string.byte;local dd={}local __a=cd(bd,1)local a_a=__a%64;dd.OP=a_a;__a=
  201. cd(bd,2)*4 + (__a-a_a)/64;local b_a=__a%256;dd.A=b_a;__a=
  202. cd(bd,3)*4 + (__a-b_a)/256;local c_a=__a%512;dd.C=c_a;dd.B=
  203. cd(bd,4)*2 + (__a-c_a)/512
  204. local d_a=self.OpMode[tonumber(string.sub(self.opmodes[
  205. a_a+1],7,7))]if d_a~="iABC"then dd.Bx=dd.B*512 +dd.C end;return dd end;dc.BITRK=math.ldexp(1,dc.SIZE_B-1)function dc:ISK(bd)
  206. return bd>=self.BITRK end
  207. function dc:INDEXK(bd)return bd-self.BITRK end;dc.MAXINDEXRK=dc.BITRK-1
  208. function dc:RKASK(bd)return bd+self.BITRK end;dc.NO_REG=dc.MAXARG_A;dc.opnames={}dc.OpCode={}dc.ROpCode={}local _d=0
  209. for bd in
  210. string.gmatch([[
  211. MOVE LOADK LOADBOOL LOADNIL GETUPVAL
  212. GETGLOBAL GETTABLE SETGLOBAL SETUPVAL SETTABLE
  213. NEWTABLE SELF ADD SUB MUL
  214. DIV MOD POW UNM NOT
  215. LEN CONCAT JMP EQ LT
  216. LE TEST TESTSET CALL TAILCALL
  217. RETURN FORLOOP FORPREP TFORLOOP SETLIST
  218. CLOSE CLOSURE VARARG
  219. ]],"%S+")do local cd="OP_"..bd;dc.opnames[_d]=bd;dc.OpCode[cd]=_d
  220. dc.ROpCode[_d]=cd;_d=_d+1 end;dc.NUM_OPCODES=_d;dc.OpArgMask={OpArgN=0,OpArgU=1,OpArgR=2,OpArgK=3}function dc:getOpMode(bd)return
  221. self.opmodes[self.OpCode[bd]]%4 end;function dc:getBMode(bd)
  222. return math.floor(
  223. self.opmodes[self.OpCode[bd]]/16)%4 end;function dc:getCMode(bd)
  224. return math.floor(
  225. self.opmodes[self.OpCode[bd]]/4)%4 end;function dc:testAMode(bd)
  226. return math.floor(
  227. self.opmodes[self.OpCode[bd]]/64)%2 end
  228. function dc:testTMode(bd)return math.floor(
  229. self.opmodes[self.OpCode[bd]]/128)end;dc.LFIELDS_PER_FLUSH=50;local function ad(bd,cd,dd,__a,a_a)local b_a=dc
  230. return
  231. bd*128 +cd*64 +
  232. b_a.OpArgMask[dd]*16 +b_a.OpArgMask[__a]*4 +b_a.OpMode[a_a]end
  233. dc.opmodes={ad(0,1,"OpArgK","OpArgN","iABx"),ad(0,1,"OpArgU","OpArgU","iABC"),ad(0,1,"OpArgR","OpArgN","iABC"),ad(0,1,"OpArgU","OpArgN","iABC"),ad(0,1,"OpArgK","OpArgN","iABx"),ad(0,1,"OpArgR","OpArgK","iABC"),ad(0,0,"OpArgK","OpArgN","iABx"),ad(0,0,"OpArgU","OpArgN","iABC"),ad(0,0,"OpArgK","OpArgK","iABC"),ad(0,1,"OpArgU","OpArgU","iABC"),ad(0,1,"OpArgR","OpArgK","iABC"),ad(0,1,"OpArgK","OpArgK","iABC"),ad(0,1,"OpArgK","OpArgK","iABC"),ad(0,1,"OpArgK","OpArgK","iABC"),ad(0,1,"OpArgK","OpArgK","iABC"),ad(0,1,"OpArgK","OpArgK","iABC"),ad(0,1,"OpArgK","OpArgK","iABC"),ad(0,1,"OpArgR","OpArgN","iABC"),ad(0,1,"OpArgR","OpArgN","iABC"),ad(0,1,"OpArgR","OpArgN","iABC"),ad(0,1,"OpArgR","OpArgR","iABC"),ad(0,0,"OpArgR","OpArgN","iAsBx"),ad(1,0,"OpArgK","OpArgK","iABC"),ad(1,0,"OpArgK","OpArgK","iABC"),ad(1,0,"OpArgK","OpArgK","iABC"),ad(1,1,"OpArgR","OpArgU","iABC"),ad(1,1,"OpArgR","OpArgU","iABC"),ad(0,1,"OpArgU","OpArgU","iABC"),ad(0,1,"OpArgU","OpArgU","iABC"),ad(0,0,"OpArgU","OpArgN","iABC"),ad(0,1,"OpArgR","OpArgN","iAsBx"),ad(0,1,"OpArgR","OpArgN","iAsBx"),ad(1,0,"OpArgN","OpArgU","iABC"),ad(0,0,"OpArgU","OpArgU","iABC"),ad(0,0,"OpArgN","OpArgN","iABC"),ad(0,1,"OpArgU","OpArgN","iABx"),ad(0,1,"OpArgU","OpArgN","iABC")}dc.opmodes[0]=ad(0,1,"OpArgR","OpArgN","iABC")return dc end;cb=cb()
  234. local db=function()local dc={}local _d=cb;local ad=bb;dc.MAXSTACK=250
  235. function dc:ttisnumber(bd)if bd then return
  236. type(bd.value)=="number"else return false end end;function dc:nvalue(bd)return bd.value end
  237. function dc:setnilvalue(bd)bd.value=nil end;function dc:setsvalue(bd,cd)bd.value=cd end;dc.setnvalue=dc.setsvalue
  238. dc.sethvalue=dc.setsvalue;dc.setbvalue=dc.setsvalue;function dc:numadd(bd,cd)return bd+cd end;function dc:numsub(bd,cd)
  239. return bd-cd end;function dc:nummul(bd,cd)return bd*cd end
  240. function dc:numdiv(bd,cd)return bd/cd end;function dc:nummod(bd,cd)return bd%cd end;function dc:numpow(bd,cd)return bd^cd end;function dc:numunm(bd)return
  241. -bd end;function dc:numisnan(bd)return not bd==bd end;dc.NO_JUMP=
  242. -1
  243. dc.BinOpr={OPR_ADD=0,OPR_SUB=1,OPR_MUL=2,OPR_DIV=3,OPR_MOD=4,OPR_POW=5,OPR_CONCAT=6,OPR_NE=7,OPR_EQ=8,OPR_LT=9,OPR_LE=10,OPR_GT=11,OPR_GE=12,OPR_AND=13,OPR_OR=14,OPR_NOBINOPR=15}dc.UnOpr={OPR_MINUS=0,OPR_NOT=1,OPR_LEN=2,OPR_NOUNOPR=3}function dc:getcode(bd,cd)return
  244. bd.f.code[cd.info]end;function dc:codeAsBx(bd,cd,dd,__a)return
  245. self:codeABx(bd,cd,dd,__a+_d.MAXARG_sBx)end;function dc:setmultret(bd,cd)
  246. self:setreturns(bd,cd,luaY.LUA_MULTRET)end
  247. function dc:hasjumps(bd)return bd.t~=bd.f end
  248. function dc:isnumeral(bd)return bd.k=="VKNUM"and bd.t==self.NO_JUMP and
  249. bd.f==self.NO_JUMP end
  250. function dc:_nil(bd,cd,dd)
  251. if bd.pc>bd.lasttarget then
  252. if bd.pc==0 then if cd>=bd.nactvar then return end else local __a=bd.f.code[
  253. bd.pc-1]
  254. if _d:GET_OPCODE(__a)=="OP_LOADNIL"then
  255. local a_a=_d:GETARG_A(__a)local b_a=_d:GETARG_B(__a)
  256. if a_a<=cd and cd<=b_a+1 then if cd+dd-1 >b_a then _d:SETARG_B(__a,
  257. cd+dd-1)end;return end end end end;self:codeABC(bd,"OP_LOADNIL",cd,cd+dd-1,0)end
  258. function dc:jump(bd)local cd=bd.jpc;bd.jpc=self.NO_JUMP
  259. local dd=self:codeAsBx(bd,"OP_JMP",0,self.NO_JUMP)dd=self:concat(bd,dd,cd)return dd end
  260. function dc:ret(bd,cd,dd)self:codeABC(bd,"OP_RETURN",cd,dd+1,0)end
  261. function dc:condjump(bd,cd,dd,__a,a_a)self:codeABC(bd,cd,dd,__a,a_a)return self:jump(bd)end
  262. function dc:fixjump(bd,cd,dd)local __a=bd.f.code[cd]local a_a=dd- (cd+1)
  263. assert(dd~=self.NO_JUMP)if math.abs(a_a)>_d.MAXARG_sBx then
  264. ad:syntaxerror(bd.ls,"control structure too long")end
  265. _d:SETARG_sBx(__a,a_a)end;function dc:getlabel(bd)bd.lasttarget=bd.pc;return bd.pc end;function dc:getjump(bd,cd)
  266. local dd=_d:GETARG_sBx(bd.f.code[cd])
  267. if dd==self.NO_JUMP then return self.NO_JUMP else return(cd+1)+dd end end
  268. function dc:getjumpcontrol(bd,cd)
  269. local dd=bd.f.code[cd]local __a=bd.f.code[cd-1]
  270. if cd>=1 and
  271. _d:testTMode(_d:GET_OPCODE(__a))~=0 then return __a else return dd end end
  272. function dc:need_value(bd,cd)while cd~=self.NO_JUMP do local dd=self:getjumpcontrol(bd,cd)if
  273. _d:GET_OPCODE(dd)~="OP_TESTSET"then return true end
  274. cd=self:getjump(bd,cd)end
  275. return false end
  276. function dc:patchtestreg(bd,cd,dd)local __a=self:getjumpcontrol(bd,cd)if _d:GET_OPCODE(__a)~=
  277. "OP_TESTSET"then return false end
  278. if dd~=_d.NO_REG and dd~=
  279. _d:GETARG_B(__a)then _d:SETARG_A(__a,dd)else
  280. _d:SET_OPCODE(__a,"OP_TEST")local a_a=_d:GETARG_B(__a)_d:SETARG_A(__a,a_a)
  281. _d:SETARG_B(__a,0)end;return true end
  282. function dc:removevalues(bd,cd)while cd~=self.NO_JUMP do
  283. self:patchtestreg(bd,cd,_d.NO_REG)cd=self:getjump(bd,cd)end end
  284. function dc:patchlistaux(bd,cd,dd,__a,a_a)
  285. while cd~=self.NO_JUMP do local b_a=self:getjump(bd,cd)
  286. if
  287. self:patchtestreg(bd,cd,__a)then self:fixjump(bd,cd,dd)else self:fixjump(bd,cd,a_a)end;cd=b_a end end;function dc:dischargejpc(bd)
  288. self:patchlistaux(bd,bd.jpc,bd.pc,_d.NO_REG,bd.pc)bd.jpc=self.NO_JUMP end
  289. function dc:patchlist(bd,cd,dd)if
  290. dd==bd.pc then self:patchtohere(bd,cd)else assert(dd<bd.pc)
  291. self:patchlistaux(bd,cd,dd,_d.NO_REG,dd)end end;function dc:patchtohere(bd,cd)self:getlabel(bd)
  292. bd.jpc=self:concat(bd,bd.jpc,cd)end
  293. function dc:concat(bd,cd,dd)
  294. if dd==self.NO_JUMP then return cd elseif cd==
  295. self.NO_JUMP then return dd else local __a=cd;local a_a=self:getjump(bd,__a)while a_a~=self.NO_JUMP do
  296. __a=a_a;a_a=self:getjump(bd,__a)end
  297. self:fixjump(bd,__a,dd)end;return cd end
  298. function dc:checkstack(bd,cd)local dd=bd.freereg+cd
  299. if dd>bd.f.maxstacksize then if dd>=self.MAXSTACK then
  300. ad:syntaxerror(bd.ls,"function or expression too complex")end;bd.f.maxstacksize=dd end end
  301. function dc:reserveregs(bd,cd)self:checkstack(bd,cd)bd.freereg=bd.freereg+cd end;function dc:freereg(bd,cd)
  302. if not _d:ISK(cd)and cd>=bd.nactvar then
  303. bd.freereg=bd.freereg-1;assert(cd==bd.freereg)end end
  304. function dc:freeexp(bd,cd)if
  305. cd.k=="VNONRELOC"then self:freereg(bd,cd.info)end end
  306. function dc:addk(bd,cd,dd)local __a=bd.L;local a_a=bd.h[cd.value]local b_a=bd.f
  307. if self:ttisnumber(a_a)then return
  308. self:nvalue(a_a)else a_a={}self:setnvalue(a_a,bd.nk)
  309. bd.h[cd.value]=a_a
  310. luaY:growvector(__a,b_a.k,bd.nk,b_a.sizek,nil,_d.MAXARG_Bx,"constant table overflow")b_a.k[bd.nk]=dd;local c_a=bd.nk;bd.nk=bd.nk+1;return c_a end end;function dc:stringK(bd,cd)local dd={}self:setsvalue(dd,cd)
  311. return self:addk(bd,dd,dd)end
  312. function dc:numberK(bd,cd)local dd={}
  313. self:setnvalue(dd,cd)return self:addk(bd,dd,dd)end;function dc:boolK(bd,cd)local dd={}self:setbvalue(dd,cd)
  314. return self:addk(bd,dd,dd)end
  315. function dc:nilK(bd)local cd,dd={},{}
  316. self:setnilvalue(dd)self:sethvalue(cd,bd.h)return self:addk(bd,cd,dd)end
  317. function dc:setreturns(bd,cd,dd)
  318. if cd.k=="VCALL"then
  319. _d:SETARG_C(self:getcode(bd,cd),dd+1)elseif cd.k=="VVARARG"then
  320. _d:SETARG_B(self:getcode(bd,cd),dd+1)_d:SETARG_A(self:getcode(bd,cd),bd.freereg)
  321. dc:reserveregs(bd,1)end end
  322. function dc:setoneret(bd,cd)
  323. if cd.k=="VCALL"then cd.k="VNONRELOC"
  324. cd.info=_d:GETARG_A(self:getcode(bd,cd))elseif cd.k=="VVARARG"then
  325. _d:SETARG_B(self:getcode(bd,cd),2)cd.k="VRELOCABLE"end end
  326. function dc:dischargevars(bd,cd)local dd=cd.k
  327. if dd=="VLOCAL"then cd.k="VNONRELOC"elseif dd=="VUPVAL"then
  328. cd.info=self:codeABC(bd,"OP_GETUPVAL",0,cd.info,0)cd.k="VRELOCABLE"elseif dd=="VGLOBAL"then
  329. cd.info=self:codeABx(bd,"OP_GETGLOBAL",0,cd.info)cd.k="VRELOCABLE"elseif dd=="VINDEXED"then self:freereg(bd,cd.aux)
  330. self:freereg(bd,cd.info)
  331. cd.info=self:codeABC(bd,"OP_GETTABLE",0,cd.info,cd.aux)cd.k="VRELOCABLE"elseif dd=="VVARARG"or dd=="VCALL"then
  332. self:setoneret(bd,cd)else end end;function dc:code_label(bd,cd,dd,__a)self:getlabel(bd)
  333. return self:codeABC(bd,"OP_LOADBOOL",cd,dd,__a)end
  334. function dc:discharge2reg(bd,cd,dd)
  335. self:dischargevars(bd,cd)local __a=cd.k
  336. if __a=="VNIL"then self:_nil(bd,dd,1)elseif
  337. __a=="VFALSE"or __a=="VTRUE"then
  338. self:codeABC(bd,"OP_LOADBOOL",dd,(cd.k=="VTRUE")and 1 or 0,0)elseif __a=="VK"then self:codeABx(bd,"OP_LOADK",dd,cd.info)elseif
  339. __a=="VKNUM"then
  340. self:codeABx(bd,"OP_LOADK",dd,self:numberK(bd,cd.nval))elseif __a=="VRELOCABLE"then local a_a=self:getcode(bd,cd)
  341. _d:SETARG_A(a_a,dd)elseif __a=="VNONRELOC"then if dd~=cd.info then
  342. self:codeABC(bd,"OP_MOVE",dd,cd.info,0)end else
  343. assert(cd.k=="VVOID"or cd.k=="VJMP")return end;cd.info=dd;cd.k="VNONRELOC"end;function dc:discharge2anyreg(bd,cd)
  344. if cd.k~="VNONRELOC"then self:reserveregs(bd,1)self:discharge2reg(bd,cd,
  345. bd.freereg-1)end end
  346. function dc:exp2reg(bd,cd,dd)
  347. self:discharge2reg(bd,cd,dd)
  348. if cd.k=="VJMP"then cd.t=self:concat(bd,cd.t,cd.info)end
  349. if self:hasjumps(cd)then local __a;local a_a=self.NO_JUMP;local b_a=self.NO_JUMP
  350. if
  351. self:need_value(bd,cd.t)or self:need_value(bd,cd.f)then local c_a=
  352. (cd.k=="VJMP")and self.NO_JUMP or self:jump(bd)
  353. a_a=self:code_label(bd,dd,0,1)b_a=self:code_label(bd,dd,1,0)
  354. self:patchtohere(bd,c_a)end;__a=self:getlabel(bd)
  355. self:patchlistaux(bd,cd.f,__a,dd,a_a)self:patchlistaux(bd,cd.t,__a,dd,b_a)end;cd.f,cd.t=self.NO_JUMP,self.NO_JUMP;cd.info=dd;cd.k="VNONRELOC"end
  356. function dc:exp2nextreg(bd,cd)self:dischargevars(bd,cd)self:freeexp(bd,cd)
  357. self:reserveregs(bd,1)self:exp2reg(bd,cd,bd.freereg-1)end
  358. function dc:exp2anyreg(bd,cd)self:dischargevars(bd,cd)
  359. if cd.k=="VNONRELOC"then if not
  360. self:hasjumps(cd)then return cd.info end;if cd.info>=bd.nactvar then
  361. self:exp2reg(bd,cd,cd.info)return cd.info end end;self:exp2nextreg(bd,cd)return cd.info end
  362. function dc:exp2val(bd,cd)if self:hasjumps(cd)then self:exp2anyreg(bd,cd)else
  363. self:dischargevars(bd,cd)end end
  364. function dc:exp2RK(bd,cd)self:exp2val(bd,cd)local dd=cd.k
  365. if
  366. dd=="VKNUM"or dd=="VTRUE"or dd=="VFALSE"or dd=="VNIL"then
  367. if bd.nk<=
  368. _d.MAXINDEXRK then if cd.k=="VNIL"then cd.info=self:nilK(bd)else
  369. cd.info=(cd.k=="VKNUM")and
  370. self:numberK(bd,cd.nval)or self:boolK(bd,cd.k=="VTRUE")end;cd.k="VK"return
  371. _d:RKASK(cd.info)end elseif dd=="VK"then
  372. if cd.info<=_d.MAXINDEXRK then return _d:RKASK(cd.info)end else end;return self:exp2anyreg(bd,cd)end
  373. function dc:storevar(bd,cd,dd)local __a=cd.k
  374. if __a=="VLOCAL"then self:freeexp(bd,dd)
  375. self:exp2reg(bd,dd,cd.info)return elseif __a=="VUPVAL"then local a_a=self:exp2anyreg(bd,dd)
  376. self:codeABC(bd,"OP_SETUPVAL",a_a,cd.info,0)elseif __a=="VGLOBAL"then local a_a=self:exp2anyreg(bd,dd)
  377. self:codeABx(bd,"OP_SETGLOBAL",a_a,cd.info)elseif __a=="VINDEXED"then local a_a=self:exp2RK(bd,dd)
  378. self:codeABC(bd,"OP_SETTABLE",cd.info,cd.aux,a_a)else assert(0)end;self:freeexp(bd,dd)end
  379. function dc:_self(bd,cd,dd)self:exp2anyreg(bd,cd)self:freeexp(bd,cd)
  380. local __a=bd.freereg;self:reserveregs(bd,2)
  381. self:codeABC(bd,"OP_SELF",__a,cd.info,self:exp2RK(bd,dd))self:freeexp(bd,dd)cd.info=__a;cd.k="VNONRELOC"end
  382. function dc:invertjump(bd,cd)local dd=self:getjumpcontrol(bd,cd.info)
  383. assert(
  384.  
  385. _d:testTMode(_d:GET_OPCODE(dd))~=0 and _d:GET_OPCODE(dd)~="OP_TESTSET"and _d:GET_OPCODE(dd)~="OP_TEST")
  386. _d:SETARG_A(dd,(_d:GETARG_A(dd)==0)and 1 or 0)end
  387. function dc:jumponcond(bd,cd,dd)
  388. if cd.k=="VRELOCABLE"then local __a=self:getcode(bd,cd)
  389. if
  390. _d:GET_OPCODE(__a)=="OP_NOT"then bd.pc=bd.pc-1;return
  391. self:condjump(bd,"OP_TEST",_d:GETARG_B(__a),0,dd and 0 or 1)end end;self:discharge2anyreg(bd,cd)self:freeexp(bd,cd)
  392. return self:condjump(bd,"OP_TESTSET",_d.NO_REG,cd.info,
  393. dd and 1 or 0)end
  394. function dc:goiftrue(bd,cd)local dd;self:dischargevars(bd,cd)local __a=cd.k
  395. if __a=="VK"or
  396. __a=="VKNUM"or __a=="VTRUE"then dd=self.NO_JUMP elseif __a=="VFALSE"then
  397. dd=self:jump(bd)elseif __a=="VJMP"then self:invertjump(bd,cd)dd=cd.info else
  398. dd=self:jumponcond(bd,cd,false)end;cd.f=self:concat(bd,cd.f,dd)
  399. self:patchtohere(bd,cd.t)cd.t=self.NO_JUMP end
  400. function dc:goiffalse(bd,cd)local dd;self:dischargevars(bd,cd)local __a=cd.k
  401. if __a=="VNIL"or
  402. __a=="VFALSE"then dd=self.NO_JUMP elseif __a=="VTRUE"then dd=self:jump(bd)elseif __a=="VJMP"then
  403. dd=cd.info else dd=self:jumponcond(bd,cd,true)end;cd.t=self:concat(bd,cd.t,dd)
  404. self:patchtohere(bd,cd.f)cd.f=self.NO_JUMP end
  405. function dc:codenot(bd,cd)self:dischargevars(bd,cd)local dd=cd.k
  406. if
  407. dd=="VNIL"or dd=="VFALSE"then cd.k="VTRUE"elseif dd=="VK"or dd=="VKNUM"or dd=="VTRUE"then
  408. cd.k="VFALSE"elseif dd=="VJMP"then self:invertjump(bd,cd)elseif
  409. dd=="VRELOCABLE"or dd=="VNONRELOC"then self:discharge2anyreg(bd,cd)self:freeexp(bd,cd)
  410. cd.info=self:codeABC(bd,"OP_NOT",0,cd.info,0)cd.k="VRELOCABLE"else assert(0)end;cd.f,cd.t=cd.t,cd.f;self:removevalues(bd,cd.f)
  411. self:removevalues(bd,cd.t)end
  412. function dc:indexed(bd,cd,dd)cd.aux=self:exp2RK(bd,dd)cd.k="VINDEXED"end
  413. function dc:constfolding(bd,cd,dd)local __a;if
  414. not self:isnumeral(cd)or not self:isnumeral(dd)then return false end;local a_a=cd.nval;local b_a=dd.nval
  415. if
  416. bd=="OP_ADD"then __a=self:numadd(a_a,b_a)elseif bd=="OP_SUB"then
  417. __a=self:numsub(a_a,b_a)elseif bd=="OP_MUL"then __a=self:nummul(a_a,b_a)elseif bd=="OP_DIV"then
  418. if b_a==0 then return false end;__a=self:numdiv(a_a,b_a)elseif bd=="OP_MOD"then if b_a==0 then return false end
  419. __a=self:nummod(a_a,b_a)elseif bd=="OP_POW"then __a=self:numpow(a_a,b_a)elseif bd=="OP_UNM"then
  420. __a=self:numunm(a_a)elseif bd=="OP_LEN"then return false else assert(0)__a=0 end;if self:numisnan(__a)then return false end;cd.nval=__a;return true end
  421. function dc:codearith(bd,cd,dd,__a)
  422. if self:constfolding(cd,dd,__a)then return else
  423. local a_a=(cd~="OP_UNM"and cd~="OP_LEN")and
  424. self:exp2RK(bd,__a)or 0;local b_a=self:exp2RK(bd,dd)
  425. if b_a>a_a then self:freeexp(bd,dd)
  426. self:freeexp(bd,__a)else self:freeexp(bd,__a)self:freeexp(bd,dd)end;dd.info=self:codeABC(bd,cd,0,b_a,a_a)dd.k="VRELOCABLE"end end
  427. function dc:codecomp(bd,cd,dd,__a,a_a)local b_a=self:exp2RK(bd,__a)local c_a=self:exp2RK(bd,a_a)
  428. self:freeexp(bd,a_a)self:freeexp(bd,__a)
  429. if dd==0 and cd~="OP_EQ"then b_a,c_a=c_a,b_a;dd=1 end;__a.info=self:condjump(bd,cd,dd,b_a,c_a)__a.k="VJMP"end
  430. function dc:prefix(bd,cd,dd)local __a={}__a.t,__a.f=self.NO_JUMP,self.NO_JUMP;__a.k="VKNUM"
  431. __a.nval=0
  432. if cd=="OPR_MINUS"then if not self:isnumeral(dd)then
  433. self:exp2anyreg(bd,dd)end
  434. self:codearith(bd,"OP_UNM",dd,__a)elseif cd=="OPR_NOT"then self:codenot(bd,dd)elseif cd=="OPR_LEN"then
  435. self:exp2anyreg(bd,dd)self:codearith(bd,"OP_LEN",dd,__a)else assert(0)end end
  436. function dc:infix(bd,cd,dd)
  437. if cd=="OPR_AND"then self:goiftrue(bd,dd)elseif cd=="OPR_OR"then
  438. self:goiffalse(bd,dd)elseif cd=="OPR_CONCAT"then self:exp2nextreg(bd,dd)elseif
  439.  
  440.  
  441. cd=="OPR_ADD"or cd=="OPR_SUB"or cd=="OPR_MUL"or cd=="OPR_DIV"or cd=="OPR_MOD"or cd=="OPR_POW"then
  442. if not self:isnumeral(dd)then self:exp2RK(bd,dd)end else self:exp2RK(bd,dd)end end
  443. dc.arith_op={OPR_ADD="OP_ADD",OPR_SUB="OP_SUB",OPR_MUL="OP_MUL",OPR_DIV="OP_DIV",OPR_MOD="OP_MOD",OPR_POW="OP_POW"}
  444. dc.comp_op={OPR_EQ="OP_EQ",OPR_NE="OP_EQ",OPR_LT="OP_LT",OPR_LE="OP_LE",OPR_GT="OP_LT",OPR_GE="OP_LE"}dc.comp_cond={OPR_EQ=1,OPR_NE=0,OPR_LT=1,OPR_LE=1,OPR_GT=0,OPR_GE=0}
  445. function dc:posfix(bd,cd,dd,__a)local
  446. function a_a(b_a,c_a)b_a.k=c_a.k;b_a.info=c_a.info;b_a.aux=c_a.aux;b_a.nval=c_a.nval
  447. b_a.t=c_a.t;b_a.f=c_a.f end
  448. if cd==
  449. "OPR_AND"then assert(dd.t==self.NO_JUMP)
  450. self:dischargevars(bd,__a)__a.f=self:concat(bd,__a.f,dd.f)a_a(dd,__a)elseif cd=="OPR_OR"then assert(
  451. dd.f==self.NO_JUMP)
  452. self:dischargevars(bd,__a)__a.t=self:concat(bd,__a.t,dd.t)a_a(dd,__a)elseif
  453. cd=="OPR_CONCAT"then self:exp2val(bd,__a)
  454. if __a.k=="VRELOCABLE"and
  455. _d:GET_OPCODE(self:getcode(bd,__a))=="OP_CONCAT"then
  456. assert(dd.info==
  457. _d:GETARG_B(self:getcode(bd,__a))-1)self:freeexp(bd,dd)
  458. _d:SETARG_B(self:getcode(bd,__a),dd.info)dd.k="VRELOCABLE"dd.info=__a.info else self:exp2nextreg(bd,__a)
  459. self:codearith(bd,"OP_CONCAT",dd,__a)end else local b_a=self.arith_op[cd]
  460. if b_a then
  461. self:codearith(bd,b_a,dd,__a)else local c_a=self.comp_op[cd]if c_a then
  462. self:codecomp(bd,c_a,self.comp_cond[cd],dd,__a)else assert(0)end end end end;function dc:fixline(bd,cd)bd.f.lineinfo[bd.pc-1]=cd end
  463. function dc:code(bd,cd,dd)
  464. local __a=bd.f;self:dischargejpc(bd)
  465. luaY:growvector(bd.L,__a.code,bd.pc,__a.sizecode,nil,luaY.MAX_INT,"code size overflow")__a.code[bd.pc]=cd
  466. luaY:growvector(bd.L,__a.lineinfo,bd.pc,__a.sizelineinfo,nil,luaY.MAX_INT,"code size overflow")__a.lineinfo[bd.pc]=dd;local a_a=bd.pc;bd.pc=bd.pc+1;return a_a end
  467. function dc:codeABC(bd,cd,dd,__a,a_a)
  468. assert(_d:getOpMode(cd)==_d.OpMode.iABC)
  469. assert(_d:getBMode(cd)~=_d.OpArgMask.OpArgN or __a==0)
  470. assert(_d:getCMode(cd)~=_d.OpArgMask.OpArgN or a_a==0)
  471. return self:code(bd,_d:CREATE_ABC(cd,dd,__a,a_a),bd.ls.lastline)end
  472. function dc:codeABx(bd,cd,dd,__a)
  473. assert(_d:getOpMode(cd)==_d.OpMode.iABx or _d:getOpMode(cd)==
  474. _d.OpMode.iAsBx)
  475. assert(_d:getCMode(cd)==_d.OpArgMask.OpArgN)
  476. return self:code(bd,_d:CREATE_ABx(cd,dd,__a),bd.ls.lastline)end
  477. function dc:setlist(bd,cd,dd,__a)
  478. local a_a=math.floor((dd-1)/_d.LFIELDS_PER_FLUSH)+1
  479. local b_a=(__a==luaY.LUA_MULTRET)and 0 or __a;assert(__a~=0)
  480. if a_a<=_d.MAXARG_C then
  481. self:codeABC(bd,"OP_SETLIST",cd,b_a,a_a)else self:codeABC(bd,"OP_SETLIST",cd,b_a,0)
  482. self:code(bd,_d:CREATE_Inst(a_a),bd.ls.lastline)end;bd.freereg=cd+1 end;return function(bd)luaY=bd;return dc end end;db=db()
  483. local _c=function()local dc={}local _d=bb;local ad=db(dc)local bd=cb
  484. dc.LUA_QS=_d.LUA_QS or"'%s'"dc.SHRT_MAX=32767;dc.LUAI_MAXVARS=200;dc.LUAI_MAXUPVALUES=60;dc.MAX_INT=_d.MAX_INT or
  485. 2147483645;dc.LUAI_MAXCCALLS=200;dc.VARARG_HASARG=1
  486. dc.HASARG_MASK=2;dc.VARARG_ISVARARG=2;dc.VARARG_NEEDSARG=4;dc.LUA_MULTRET=-1;function dc:LUA_QL(cd)return
  487. "'"..cd.."'"end
  488. function dc:growvector(cd,dd,__a,a_a,b_a,c_a,d_a)if __a>=c_a then error(d_a)end end
  489. function dc:newproto(cd)local dd={}dd.k={}dd.sizek=0;dd.p={}dd.sizep=0;dd.code={}dd.sizecode=0
  490. dd.sizelineinfo=0;dd.sizeupvalues=0;dd.nups=0;dd.upvalues={}dd.numparams=0;dd.is_vararg=0
  491. dd.maxstacksize=0;dd.lineinfo={}dd.sizelocvars=0;dd.locvars={}dd.lineDefined=0
  492. dd.lastlinedefined=0;dd.source=nil;return dd end
  493. function dc:int2fb(cd)local dd=0
  494. while cd>=16 do cd=math.floor((cd+1)/2)dd=dd+1 end;if cd<8 then return cd else return( (dd+1)*8)+ (cd-8)end end
  495. function dc:hasmultret(cd)return cd=="VCALL"or cd=="VVARARG"end
  496. function dc:getlocvar(cd,dd)return cd.f.locvars[cd.actvar[dd]]end;function dc:checklimit(cd,dd,__a,a_a)
  497. if dd>__a then self:errorlimit(cd,__a,a_a)end end
  498. function dc:anchor_token(cd)if cd.t.token=="TK_NAME"or
  499. cd.t.token=="TK_STRING"then end end;function dc:error_expected(cd,dd)
  500. _d:syntaxerror(cd,string.format(self.LUA_QS.." expected",_d:token2str(cd,dd)))end
  501. function dc:errorlimit(cd,dd,__a)
  502. local a_a=
  503. (
  504. cd.f.linedefined==0)and string.format("main function has more than %d %s",dd,__a)or
  505. string.format("function at line %d has more than %d %s",cd.f.linedefined,dd,__a)_d:lexerror(cd.ls,a_a,0)end;function dc:testnext(cd,dd)
  506. if cd.t.token==dd then _d:next(cd)return true else return false end end;function dc:check(cd,dd)if cd.t.token~=dd then
  507. self:error_expected(cd,dd)end end;function dc:checknext(cd,dd)
  508. self:check(cd,dd)_d:next(cd)end;function dc:check_condition(cd,dd,__a)if not dd then
  509. _d:syntaxerror(cd,__a)end end
  510. function dc:check_match(cd,dd,__a,a_a)
  511. if not
  512. self:testnext(cd,dd)then
  513. if a_a==cd.linenumber then self:error_expected(cd,dd)else
  514. _d:syntaxerror(cd,string.format(
  515. self.LUA_QS.." expected (to close "..self.LUA_QS.." at line %d)",_d:token2str(cd,dd),_d:token2str(cd,__a),a_a))end end end;function dc:str_checkname(cd)self:check(cd,"TK_NAME")local dd=cd.t.seminfo
  516. _d:next(cd)return dd end;function dc:init_exp(cd,dd,__a)
  517. cd.f,cd.t=ad.NO_JUMP,ad.NO_JUMP;cd.k=dd;cd.info=__a end;function dc:codestring(cd,dd,__a)
  518. self:init_exp(dd,"VK",ad:stringK(cd.fs,__a))end;function dc:checkname(cd,dd)
  519. self:codestring(cd,dd,self:str_checkname(cd))end
  520. function dc:registerlocalvar(cd,dd)local __a=cd.fs;local a_a=__a.f
  521. self:growvector(cd.L,a_a.locvars,__a.nlocvars,a_a.sizelocvars,
  522. nil,self.SHRT_MAX,"too many local variables")a_a.locvars[__a.nlocvars]={}
  523. a_a.locvars[__a.nlocvars].varname=dd;local b_a=__a.nlocvars;__a.nlocvars=__a.nlocvars+1;return b_a end
  524. function dc:new_localvarliteral(cd,dd,__a)self:new_localvar(cd,dd,__a)end
  525. function dc:new_localvar(cd,dd,__a)local a_a=cd.fs
  526. self:checklimit(a_a,a_a.nactvar+__a+1,self.LUAI_MAXVARS,"local variables")
  527. a_a.actvar[a_a.nactvar+__a]=self:registerlocalvar(cd,dd)end
  528. function dc:adjustlocalvars(cd,dd)local __a=cd.fs;__a.nactvar=__a.nactvar+dd
  529. for i=dd,1,-1 do self:getlocvar(__a,
  530. __a.nactvar-i).startpc=__a.pc end end
  531. function dc:removevars(cd,dd)local __a=cd.fs;while __a.nactvar>dd do __a.nactvar=__a.nactvar-1
  532. self:getlocvar(__a,__a.nactvar).endpc=__a.pc end end
  533. function dc:indexupvalue(cd,dd,__a)local a_a=cd.f
  534. for i=0,a_a.nups-1 do if cd.upvalues[i].k==__a.k and
  535. cd.upvalues[i].info==__a.info then
  536. assert(a_a.upvalues[i]==dd)return i end end
  537. self:checklimit(cd,a_a.nups+1,self.LUAI_MAXUPVALUES,"upvalues")
  538. self:growvector(cd.L,a_a.upvalues,a_a.nups,a_a.sizeupvalues,nil,self.MAX_INT,"")a_a.upvalues[a_a.nups]=dd
  539. assert(__a.k=="VLOCAL"or __a.k=="VUPVAL")cd.upvalues[a_a.nups]={k=__a.k,info=__a.info}
  540. local b_a=a_a.nups;a_a.nups=a_a.nups+1;return b_a end
  541. function dc:searchvar(cd,dd)for i=cd.nactvar-1,0,-1 do if dd==self:getlocvar(cd,i).varname then
  542. return i end end;return-1 end
  543. function dc:markupval(cd,dd)local __a=cd.bl
  544. while __a and __a.nactvar>dd do __a=__a.previous end;if __a then __a.upval=true end end
  545. function dc:singlevaraux(cd,dd,__a,a_a)
  546. if cd==nil then self:init_exp(__a,"VGLOBAL",bd.NO_REG)return
  547. "VGLOBAL"else local b_a=self:searchvar(cd,dd)
  548. if b_a>=0 then
  549. self:init_exp(__a,"VLOCAL",b_a)if a_a==0 then self:markupval(cd,b_a)end;return"VLOCAL"else
  550. if
  551. self:singlevaraux(cd.prev,dd,__a,0)=="VGLOBAL"then return"VGLOBAL"end;__a.info=self:indexupvalue(cd,dd,__a)__a.k="VUPVAL"
  552. return"VUPVAL"end end end
  553. function dc:singlevar(cd,dd)local __a=self:str_checkname(cd)local a_a=cd.fs
  554. if
  555. self:singlevaraux(a_a,__a,dd,1)=="VGLOBAL"then dd.info=ad:stringK(a_a,__a)end end
  556. function dc:adjust_assign(cd,dd,__a,a_a)local b_a=cd.fs;local c_a=dd-__a
  557. if self:hasmultret(a_a.k)then c_a=c_a+1;if c_a<=0 then
  558. c_a=0 end;ad:setreturns(b_a,a_a,c_a)if c_a>1 then
  559. ad:reserveregs(b_a,c_a-1)end else
  560. if a_a.k~="VVOID"then ad:exp2nextreg(b_a,a_a)end;if c_a>0 then local d_a=b_a.freereg;ad:reserveregs(b_a,c_a)
  561. ad:_nil(b_a,d_a,c_a)end end end
  562. function dc:enterlevel(cd)cd.L.nCcalls=cd.L.nCcalls+1;if
  563. cd.L.nCcalls>self.LUAI_MAXCCALLS then
  564. _d:lexerror(cd,"chunk has too many syntax levels",0)end end;function dc:leavelevel(cd)cd.L.nCcalls=cd.L.nCcalls-1 end
  565. function dc:enterblock(cd,dd,__a)
  566. dd.breaklist=ad.NO_JUMP;dd.isbreakable=__a;dd.nactvar=cd.nactvar;dd.upval=false;dd.previous=cd.bl
  567. cd.bl=dd;assert(cd.freereg==cd.nactvar)end
  568. function dc:leaveblock(cd)local dd=cd.bl;cd.bl=dd.previous
  569. self:removevars(cd.ls,dd.nactvar)
  570. if dd.upval then ad:codeABC(cd,"OP_CLOSE",dd.nactvar,0,0)end
  571. assert(not dd.isbreakable or not dd.upval)assert(dd.nactvar==cd.nactvar)
  572. cd.freereg=cd.nactvar;ad:patchtohere(cd,dd.breaklist)end
  573. function dc:pushclosure(cd,dd,__a)local a_a=cd.fs;local b_a=a_a.f
  574. self:growvector(cd.L,b_a.p,a_a.np,b_a.sizep,nil,bd.MAXARG_Bx,"constant table overflow")b_a.p[a_a.np]=dd.f;a_a.np=a_a.np+1
  575. self:init_exp(__a,"VRELOCABLE",ad:codeABx(a_a,"OP_CLOSURE",0,
  576. a_a.np-1))for i=0,dd.f.nups-1 do local c_a=
  577. (dd.upvalues[i].k=="VLOCAL")and"OP_MOVE"or"OP_GETUPVAL"
  578. ad:codeABC(a_a,c_a,0,dd.upvalues[i].info,0)end end
  579. function dc:open_func(cd,dd)local __a=cd.L;local a_a=self:newproto(cd.L)dd.f=a_a
  580. dd.prev=cd.fs;dd.ls=cd;dd.L=__a;cd.fs=dd;dd.pc=0;dd.lasttarget=-1;dd.jpc=ad.NO_JUMP
  581. dd.freereg=0;dd.nk=0;dd.np=0;dd.nlocvars=0;dd.nactvar=0;dd.bl=nil;a_a.source=cd.source
  582. a_a.maxstacksize=2;dd.h={}end
  583. function dc:close_func(cd)local dd=cd.L;local __a=cd.fs;local a_a=__a.f;self:removevars(cd,0)
  584. ad:ret(__a,0,0)a_a.sizecode=__a.pc;a_a.sizelineinfo=__a.pc;a_a.sizek=__a.nk
  585. a_a.sizep=__a.np;a_a.sizelocvars=__a.nlocvars;a_a.sizeupvalues=a_a.nups
  586. assert(__a.bl==nil)cd.fs=__a.prev;if __a then self:anchor_token(cd)end end
  587. function dc:parser(cd,dd,__a,a_a)local b_a={}b_a.t={}b_a.lookahead={}local c_a={}c_a.upvalues={}
  588. c_a.actvar={}cd.nCcalls=0;b_a.buff=__a;_d:setinput(cd,b_a,dd,a_a)
  589. self:open_func(b_a,c_a)c_a.f.is_vararg=self.VARARG_ISVARARG;_d:next(b_a)
  590. self:chunk(b_a)self:check(b_a,"TK_EOS")self:close_func(b_a)assert(
  591. c_a.prev==nil)assert(c_a.f.nups==0)assert(
  592. b_a.fs==nil)return c_a.f end
  593. function dc:field(cd,dd)local __a=cd.fs;local a_a={}ad:exp2anyreg(__a,dd)_d:next(cd)
  594. self:checkname(cd,a_a)ad:indexed(__a,dd,a_a)end
  595. function dc:yindex(cd,dd)_d:next(cd)self:expr(cd,dd)
  596. ad:exp2val(cd.fs,dd)self:checknext(cd,"]")end
  597. function dc:recfield(cd,dd)local __a=cd.fs;local a_a=cd.fs.freereg;local b_a,c_a={},{}
  598. if cd.t.token=="TK_NAME"then
  599. self:checklimit(__a,dd.nh,self.MAX_INT,"items in a constructor")self:checkname(cd,b_a)else self:yindex(cd,b_a)end;dd.nh=dd.nh+1;self:checknext(cd,"=")
  600. local d_a=ad:exp2RK(__a,b_a)self:expr(cd,c_a)
  601. ad:codeABC(__a,"OP_SETTABLE",dd.t.info,d_a,ad:exp2RK(__a,c_a))__a.freereg=a_a end
  602. function dc:closelistfield(cd,dd)if dd.v.k=="VVOID"then return end
  603. ad:exp2nextreg(cd,dd.v)dd.v.k="VVOID"if dd.tostore==bd.LFIELDS_PER_FLUSH then
  604. ad:setlist(cd,dd.t.info,dd.na,dd.tostore)dd.tostore=0 end end
  605. function dc:lastlistfield(cd,dd)if dd.tostore==0 then return end
  606. if self:hasmultret(dd.v.k)then
  607. ad:setmultret(cd,dd.v)ad:setlist(cd,dd.t.info,dd.na,self.LUA_MULTRET)dd.na=
  608. dd.na-1 else
  609. if dd.v.k~="VVOID"then ad:exp2nextreg(cd,dd.v)end;ad:setlist(cd,dd.t.info,dd.na,dd.tostore)end end
  610. function dc:listfield(cd,dd)self:expr(cd,dd.v)
  611. self:checklimit(cd.fs,dd.na,self.MAX_INT,"items in a constructor")dd.na=dd.na+1;dd.tostore=dd.tostore+1 end
  612. function dc:constructor(cd,dd)local __a=cd.fs;local a_a=cd.linenumber
  613. local b_a=ad:codeABC(__a,"OP_NEWTABLE",0,0,0)local c_a={}c_a.v={}c_a.na,c_a.nh,c_a.tostore=0,0,0;c_a.t=dd
  614. self:init_exp(dd,"VRELOCABLE",b_a)self:init_exp(c_a.v,"VVOID",0)
  615. ad:exp2nextreg(cd.fs,dd)self:checknext(cd,"{")
  616. repeat
  617. assert(c_a.v.k=="VVOID"or c_a.tostore>0)if cd.t.token=="}"then break end
  618. self:closelistfield(__a,c_a)local d_a=cd.t.token
  619. if d_a=="TK_NAME"then _d:lookahead(cd)
  620. if
  621. cd.lookahead.token~="="then self:listfield(cd,c_a)else self:recfield(cd,c_a)end elseif d_a=="["then self:recfield(cd,c_a)else self:listfield(cd,c_a)end until
  622. not self:testnext(cd,",")and not self:testnext(cd,";")self:check_match(cd,"}","{",a_a)
  623. self:lastlistfield(__a,c_a)
  624. bd:SETARG_B(__a.f.code[b_a],self:int2fb(c_a.na))
  625. bd:SETARG_C(__a.f.code[b_a],self:int2fb(c_a.nh))end
  626. function dc:parlist(cd)local dd=cd.fs;local __a=dd.f;local a_a=0;__a.is_vararg=0
  627. if cd.t.token~=")"then
  628. repeat
  629. local b_a=cd.t.token
  630. if b_a=="TK_NAME"then
  631. self:new_localvar(cd,self:str_checkname(cd),a_a)a_a=a_a+1 elseif b_a=="TK_DOTS"then _d:next(cd)
  632. self:new_localvarliteral(cd,"arg",a_a)a_a=a_a+1
  633. __a.is_vararg=self.VARARG_HASARG+self.VARARG_NEEDSARG;__a.is_vararg=__a.is_vararg+self.VARARG_ISVARARG else
  634. _d:syntaxerror(cd,
  635. "<name> or "..self:LUA_QL("...").." expected")end until __a.is_vararg~=0 or not self:testnext(cd,",")end;self:adjustlocalvars(cd,a_a)__a.numparams=dd.nactvar-
  636. (__a.is_vararg%self.HASARG_MASK)
  637. ad:reserveregs(dd,dd.nactvar)end
  638. function dc:body(cd,dd,__a,a_a)local b_a={}b_a.upvalues={}b_a.actvar={}self:open_func(cd,b_a)
  639. b_a.f.lineDefined=a_a;self:checknext(cd,"(")
  640. if __a then
  641. self:new_localvarliteral(cd,"self",0)self:adjustlocalvars(cd,1)end;self:parlist(cd)self:checknext(cd,")")
  642. self:chunk(cd)b_a.f.lastlinedefined=cd.linenumber
  643. self:check_match(cd,"TK_END","TK_FUNCTION",a_a)self:close_func(cd)self:pushclosure(cd,b_a,dd)end
  644. function dc:explist1(cd,dd)local __a=1;self:expr(cd,dd)
  645. while self:testnext(cd,",")do
  646. ad:exp2nextreg(cd.fs,dd)self:expr(cd,dd)__a=__a+1 end;return __a end
  647. function dc:funcargs(cd,dd)local __a=cd.fs;local a_a={}local b_a;local c_a=cd.linenumber;local d_a=cd.t.token
  648. if d_a=="("then if c_a~=
  649. cd.lastline then
  650. _d:syntaxerror(cd,"ambiguous syntax (function call x new statement)")end;_d:next(cd)if
  651. cd.t.token==")"then a_a.k="VVOID"else self:explist1(cd,a_a)
  652. ad:setmultret(__a,a_a)end
  653. self:check_match(cd,")","(",c_a)elseif d_a=="{"then self:constructor(cd,a_a)elseif d_a=="TK_STRING"then
  654. self:codestring(cd,a_a,cd.t.seminfo)_d:next(cd)else
  655. _d:syntaxerror(cd,"function arguments expected")return end;assert(dd.k=="VNONRELOC")local _aa=dd.info
  656. if
  657. self:hasmultret(a_a.k)then b_a=self.LUA_MULTRET else
  658. if a_a.k~="VVOID"then ad:exp2nextreg(__a,a_a)end;b_a=__a.freereg- (_aa+1)end
  659. self:init_exp(dd,"VCALL",ad:codeABC(__a,"OP_CALL",_aa,b_a+1,2))ad:fixline(__a,c_a)__a.freereg=_aa+1 end
  660. function dc:prefixexp(cd,dd)local __a=cd.t.token
  661. if __a=="("then local a_a=cd.linenumber;_d:next(cd)
  662. self:expr(cd,dd)self:check_match(cd,")","(",a_a)
  663. ad:dischargevars(cd.fs,dd)elseif __a=="TK_NAME"then self:singlevar(cd,dd)else
  664. _d:syntaxerror(cd,"unexpected symbol")end;return end
  665. function dc:primaryexp(cd,dd)local __a=cd.fs;self:prefixexp(cd,dd)
  666. while true do local a_a=cd.t.token
  667. if
  668. a_a=="."then self:field(cd,dd)elseif a_a=="["then local b_a={}ad:exp2anyreg(__a,dd)
  669. self:yindex(cd,b_a)ad:indexed(__a,dd,b_a)elseif a_a==":"then local b_a={}_d:next(cd)
  670. self:checkname(cd,b_a)ad:_self(__a,dd,b_a)self:funcargs(cd,dd)elseif a_a=="("or
  671. a_a=="TK_STRING"or a_a=="{"then ad:exp2nextreg(__a,dd)
  672. self:funcargs(cd,dd)else return end end end
  673. function dc:simpleexp(cd,dd)local __a=cd.t.token
  674. if __a=="TK_NUMBER"then
  675. self:init_exp(dd,"VKNUM",0)dd.nval=cd.t.seminfo elseif __a=="TK_STRING"then
  676. self:codestring(cd,dd,cd.t.seminfo)elseif __a=="TK_NIL"then self:init_exp(dd,"VNIL",0)elseif __a=="TK_TRUE"then
  677. self:init_exp(dd,"VTRUE",0)elseif __a=="TK_FALSE"then self:init_exp(dd,"VFALSE",0)elseif __a=="TK_DOTS"then
  678. local a_a=cd.fs
  679. self:check_condition(cd,a_a.f.is_vararg~=0,"cannot use "..
  680. self:LUA_QL("...").." outside a vararg function")local b_a=a_a.f.is_vararg;if b_a>=self.VARARG_NEEDSARG then
  681. a_a.f.is_vararg=b_a-self.VARARG_NEEDSARG end
  682. self:init_exp(dd,"VVARARG",ad:codeABC(a_a,"OP_VARARG",0,1,0))elseif __a=="{"then self:constructor(cd,dd)return elseif __a=="TK_FUNCTION"then
  683. _d:next(cd)self:body(cd,dd,false,cd.linenumber)return else
  684. self:primaryexp(cd,dd)return end;_d:next(cd)end
  685. function dc:getunopr(cd)if cd=="TK_NOT"then return"OPR_NOT"elseif cd=="-"then return"OPR_MINUS"elseif cd=="#"then return"OPR_LEN"else
  686. return"OPR_NOUNOPR"end end
  687. dc.getbinopr_table={["+"]="OPR_ADD",["-"]="OPR_SUB",["*"]="OPR_MUL",["/"]="OPR_DIV",["%"]="OPR_MOD",["^"]="OPR_POW",["TK_CONCAT"]="OPR_CONCAT",["TK_NE"]="OPR_NE",["TK_EQ"]="OPR_EQ",["<"]="OPR_LT",["TK_LE"]="OPR_LE",[">"]="OPR_GT",["TK_GE"]="OPR_GE",["TK_AND"]="OPR_AND",["TK_OR"]="OPR_OR"}function dc:getbinopr(cd)local dd=self.getbinopr_table[cd]
  688. if dd then return dd else return"OPR_NOBINOPR"end end
  689. dc.priority={{6,6},{6,6},{7,7},{7,7},{7,7},{10,9},{5,4},{3,3},{3,3},{3,3},{3,3},{3,3},{3,3},{2,2},{1,1}}dc.UNARY_PRIORITY=8
  690. function dc:subexpr(cd,dd,__a)self:enterlevel(cd)
  691. local a_a=self:getunopr(cd.t.token)
  692. if a_a~="OPR_NOUNOPR"then _d:next(cd)
  693. self:subexpr(cd,dd,self.UNARY_PRIORITY)ad:prefix(cd.fs,a_a,dd)else self:simpleexp(cd,dd)end;local b_a=self:getbinopr(cd.t.token)
  694. while
  695. b_a~="OPR_NOBINOPR"and self.priority[
  696. ad.BinOpr[b_a]+1][1]>__a do local c_a={}_d:next(cd)ad:infix(cd.fs,b_a,dd)
  697. local d_a=self:subexpr(cd,c_a,self.priority[
  698. ad.BinOpr[b_a]+1][2])ad:posfix(cd.fs,b_a,dd,c_a)b_a=d_a end;self:leavelevel(cd)return b_a end;function dc:expr(cd,dd)self:subexpr(cd,dd,0)end
  699. function dc:block_follow(cd)
  700. if
  701.  
  702. cd=="TK_ELSE"or cd=="TK_ELSEIF"or cd=="TK_END"or
  703. cd=="TK_UNTIL"or cd=="TK_EOS"then return true else return false end end;function dc:block(cd)local dd=cd.fs;local __a={}self:enterblock(dd,__a,false)
  704. self:chunk(cd)assert(__a.breaklist==ad.NO_JUMP)
  705. self:leaveblock(dd)end
  706. function dc:check_conflict(cd,dd,__a)
  707. local a_a=cd.fs;local b_a=a_a.freereg;local c_a=false
  708. while dd do
  709. if dd.v.k=="VINDEXED"then if dd.v.info==__a.info then
  710. c_a=true;dd.v.info=b_a end;if dd.v.aux==__a.info then c_a=true
  711. dd.v.aux=b_a end end;dd=dd.prev end;if c_a then ad:codeABC(a_a,"OP_MOVE",a_a.freereg,__a.info,0)
  712. ad:reserveregs(a_a,1)end end
  713. function dc:assignment(cd,dd,__a)local a_a={}local b_a=dd.v.k
  714. self:check_condition(cd,
  715. b_a=="VLOCAL"or b_a=="VUPVAL"or b_a=="VGLOBAL"or b_a=="VINDEXED","syntax error")
  716. if self:testnext(cd,",")then local c_a={}c_a.v={}c_a.prev=dd
  717. self:primaryexp(cd,c_a.v)
  718. if c_a.v.k=="VLOCAL"then self:check_conflict(cd,dd,c_a.v)end
  719. self:checklimit(cd.fs,__a,self.LUAI_MAXCCALLS-cd.L.nCcalls,"variables in assignment")self:assignment(cd,c_a,__a+1)else
  720. self:checknext(cd,"=")local c_a=self:explist1(cd,a_a)
  721. if c_a~=__a then
  722. self:adjust_assign(cd,__a,c_a,a_a)
  723. if c_a>__a then cd.fs.freereg=cd.fs.freereg- (c_a-__a)end else ad:setoneret(cd.fs,a_a)
  724. ad:storevar(cd.fs,dd.v,a_a)return end end
  725. self:init_exp(a_a,"VNONRELOC",cd.fs.freereg-1)ad:storevar(cd.fs,dd.v,a_a)end
  726. function dc:cond(cd)local dd={}self:expr(cd,dd)
  727. if dd.k=="VNIL"then dd.k="VFALSE"end;ad:goiftrue(cd.fs,dd)return dd.f end
  728. function dc:breakstat(cd)local dd=cd.fs;local __a=dd.bl;local a_a=false
  729. while __a and not __a.isbreakable do if
  730. __a.upval then a_a=true end;__a=__a.previous end
  731. if not __a then _d:syntaxerror(cd,"no loop to break")end
  732. if a_a then ad:codeABC(dd,"OP_CLOSE",__a.nactvar,0,0)end
  733. __a.breaklist=ad:concat(dd,__a.breaklist,ad:jump(dd))end
  734. function dc:whilestat(cd,dd)local __a=cd.fs;local a_a={}_d:next(cd)local b_a=ad:getlabel(__a)
  735. local c_a=self:cond(cd)self:enterblock(__a,a_a,true)
  736. self:checknext(cd,"TK_DO")self:block(cd)
  737. ad:patchlist(__a,ad:jump(__a),b_a)self:check_match(cd,"TK_END","TK_WHILE",dd)
  738. self:leaveblock(__a)ad:patchtohere(__a,c_a)end
  739. function dc:repeatstat(cd,dd)local __a=cd.fs;local a_a=ad:getlabel(__a)local b_a,c_a={},{}
  740. self:enterblock(__a,b_a,true)self:enterblock(__a,c_a,false)_d:next(cd)
  741. self:chunk(cd)self:check_match(cd,"TK_UNTIL","TK_REPEAT",dd)
  742. local d_a=self:cond(cd)
  743. if not c_a.upval then self:leaveblock(__a)
  744. ad:patchlist(cd.fs,d_a,a_a)else self:breakstat(cd)ad:patchtohere(cd.fs,d_a)
  745. self:leaveblock(__a)ad:patchlist(cd.fs,ad:jump(__a),a_a)end;self:leaveblock(__a)end;function dc:exp1(cd)local dd={}self:expr(cd,dd)local __a=dd.k
  746. ad:exp2nextreg(cd.fs,dd)return __a end
  747. function dc:forbody(cd,dd,__a,a_a,b_a)local c_a={}
  748. local d_a=cd.fs;self:adjustlocalvars(cd,3)
  749. self:checknext(cd,"TK_DO")local _aa=b_a and ad:codeAsBx(d_a,"OP_FORPREP",dd,ad.NO_JUMP)or
  750. ad:jump(d_a)
  751. self:enterblock(d_a,c_a,false)self:adjustlocalvars(cd,a_a)
  752. ad:reserveregs(d_a,a_a)self:block(cd)self:leaveblock(d_a)
  753. ad:patchtohere(d_a,_aa)
  754. local aaa=b_a and ad:codeAsBx(d_a,"OP_FORLOOP",dd,ad.NO_JUMP)or
  755. ad:codeABC(d_a,"OP_TFORLOOP",dd,0,a_a)ad:fixline(d_a,__a)
  756. ad:patchlist(d_a,b_a and aaa or ad:jump(d_a),_aa+1)end
  757. function dc:fornum(cd,dd,__a)local a_a=cd.fs;local b_a=a_a.freereg
  758. self:new_localvarliteral(cd,"(for index)",0)self:new_localvarliteral(cd,"(for limit)",1)
  759. self:new_localvarliteral(cd,"(for step)",2)self:new_localvar(cd,dd,3)self:checknext(cd,'=')
  760. self:exp1(cd)self:checknext(cd,",")self:exp1(cd)
  761. if
  762. self:testnext(cd,",")then self:exp1(cd)else
  763. ad:codeABx(a_a,"OP_LOADK",a_a.freereg,ad:numberK(a_a,1))ad:reserveregs(a_a,1)end;self:forbody(cd,b_a,__a,1,true)end
  764. function dc:forlist(cd,dd)local __a=cd.fs;local a_a={}local b_a=0;local c_a=__a.freereg
  765. self:new_localvarliteral(cd,"(for generator)",b_a)b_a=b_a+1
  766. self:new_localvarliteral(cd,"(for state)",b_a)b_a=b_a+1
  767. self:new_localvarliteral(cd,"(for control)",b_a)b_a=b_a+1;self:new_localvar(cd,dd,b_a)b_a=b_a+1;while
  768. self:testnext(cd,",")do
  769. self:new_localvar(cd,self:str_checkname(cd),b_a)b_a=b_a+1 end
  770. self:checknext(cd,"TK_IN")local d_a=cd.linenumber
  771. self:adjust_assign(cd,3,self:explist1(cd,a_a),a_a)ad:checkstack(__a,3)
  772. self:forbody(cd,c_a,d_a,b_a-3,false)end
  773. function dc:forstat(cd,dd)local __a=cd.fs;local a_a={}self:enterblock(__a,a_a,true)
  774. _d:next(cd)local b_a=self:str_checkname(cd)local c_a=cd.t.token
  775. if c_a=="="then
  776. self:fornum(cd,b_a,dd)elseif c_a==","or c_a=="TK_IN"then self:forlist(cd,b_a)else
  777. _d:syntaxerror(cd,
  778. self:LUA_QL("=").." or "..self:LUA_QL("in").." expected")end;self:check_match(cd,"TK_END","TK_FOR",dd)
  779. self:leaveblock(__a)end
  780. function dc:test_then_block(cd)_d:next(cd)local dd=self:cond(cd)
  781. self:checknext(cd,"TK_THEN")self:block(cd)return dd end
  782. function dc:ifstat(cd,dd)local __a=cd.fs;local a_a=ad.NO_JUMP;local b_a=self:test_then_block(cd)
  783. while
  784. cd.t.token=="TK_ELSEIF"do a_a=ad:concat(__a,a_a,ad:jump(__a))
  785. ad:patchtohere(__a,b_a)b_a=self:test_then_block(cd)end;if cd.t.token=="TK_ELSE"then
  786. a_a=ad:concat(__a,a_a,ad:jump(__a))ad:patchtohere(__a,b_a)_d:next(cd)self:block(cd)else
  787. a_a=ad:concat(__a,a_a,b_a)end
  788. ad:patchtohere(__a,a_a)self:check_match(cd,"TK_END","TK_IF",dd)end
  789. function dc:localfunc(cd)local dd,__a={},{}local a_a=cd.fs
  790. self:new_localvar(cd,self:str_checkname(cd),0)self:init_exp(dd,"VLOCAL",a_a.freereg)
  791. ad:reserveregs(a_a,1)self:adjustlocalvars(cd,1)
  792. self:body(cd,__a,false,cd.linenumber)ad:storevar(a_a,dd,__a)
  793. self:getlocvar(a_a,a_a.nactvar-1).startpc=a_a.pc end
  794. function dc:localstat(cd)local dd=0;local __a;local a_a={}
  795. repeat
  796. self:new_localvar(cd,self:str_checkname(cd),dd)dd=dd+1 until not self:testnext(cd,",")if self:testnext(cd,"=")then __a=self:explist1(cd,a_a)else a_a.k="VVOID"
  797. __a=0 end
  798. self:adjust_assign(cd,dd,__a,a_a)self:adjustlocalvars(cd,dd)end
  799. function dc:funcname(cd,dd)local __a=false;self:singlevar(cd,dd)while cd.t.token=="."do
  800. self:field(cd,dd)end
  801. if cd.t.token==":"then __a=true;self:field(cd,dd)end;return __a end
  802. function dc:funcstat(cd,dd)local __a,a_a={},{}_d:next(cd)local b_a=self:funcname(cd,__a)
  803. self:body(cd,a_a,b_a,dd)ad:storevar(cd.fs,__a,a_a)ad:fixline(cd.fs,dd)end
  804. function dc:exprstat(cd)local dd=cd.fs;local __a={}__a.v={}self:primaryexp(cd,__a.v)
  805. if
  806. __a.v.k=="VCALL"then bd:SETARG_C(ad:getcode(dd,__a.v),1)else __a.prev=
  807. nil;self:assignment(cd,__a,1)end end
  808. function dc:retstat(cd)local dd=cd.fs;local __a={}local a_a,b_a;_d:next(cd)
  809. if
  810. self:block_follow(cd.t.token)or cd.t.token==";"then a_a,b_a=0,0 else
  811. b_a=self:explist1(cd,__a)
  812. if self:hasmultret(__a.k)then ad:setmultret(dd,__a)if
  813. __a.k=="VCALL"and b_a==1 then
  814. bd:SET_OPCODE(ad:getcode(dd,__a),"OP_TAILCALL")
  815. assert(bd:GETARG_A(ad:getcode(dd,__a))==dd.nactvar)end
  816. a_a=dd.nactvar;b_a=self.LUA_MULTRET else
  817. if b_a==1 then a_a=ad:exp2anyreg(dd,__a)else
  818. ad:exp2nextreg(dd,__a)a_a=dd.nactvar;assert(b_a==dd.freereg-a_a)end end end;ad:ret(dd,a_a,b_a)end
  819. function dc:statement(cd)local dd=cd.linenumber;local __a=cd.t.token
  820. if __a=="TK_IF"then
  821. self:ifstat(cd,dd)return false elseif __a=="TK_WHILE"then self:whilestat(cd,dd)return false elseif __a=="TK_DO"then
  822. _d:next(cd)self:block(cd)
  823. self:check_match(cd,"TK_END","TK_DO",dd)return false elseif __a=="TK_FOR"then self:forstat(cd,dd)return false elseif __a=="TK_REPEAT"then
  824. self:repeatstat(cd,dd)return false elseif __a=="TK_FUNCTION"then self:funcstat(cd,dd)return false elseif
  825. __a=="TK_LOCAL"then _d:next(cd)if self:testnext(cd,"TK_FUNCTION")then
  826. self:localfunc(cd)else self:localstat(cd)end
  827. return false elseif __a=="TK_RETURN"then self:retstat(cd)return true elseif __a=="TK_BREAK"then
  828. _d:next(cd)self:breakstat(cd)return true else self:exprstat(cd)return false end end
  829. function dc:chunk(cd)local dd=false;self:enterlevel(cd)
  830. while not dd and not
  831. self:block_follow(cd.t.token)do dd=self:statement(cd)
  832. self:testnext(cd,";")
  833. assert(cd.fs.f.maxstacksize>=cd.fs.freereg and
  834. cd.fs.freereg>=cd.fs.nactvar)cd.fs.freereg=cd.fs.nactvar end;self:leavelevel(cd)end;return dc end;_c=_c()
  835. local ac=function()local dc={}local _d=cb;dc.LUA_SIGNATURE="\27Lua"dc.LUA_TNUMBER=3
  836. dc.LUA_TSTRING=4;dc.LUA_TNIL=0;dc.LUA_TBOOLEAN=1;dc.LUA_TNONE=-1;dc.LUAC_VERSION=0x51
  837. dc.LUAC_FORMAT=0;dc.LUAC_HEADERSIZE=12
  838. function dc:make_setS()local ad={}ad.data=""
  839. local bd=function(cd,dd)if not cd then return 0 end;dd.data=
  840. dd.data..cd;return 0 end;return bd,ad end
  841. function dc:ttype(ad)local bd=type(ad.value)
  842. if bd=="number"then return self.LUA_TNUMBER elseif bd=="string"then return
  843. self.LUA_TSTRING elseif bd=="nil"then return self.LUA_TNIL elseif bd=="boolean"then return self.LUA_TBOOLEAN else return
  844. self.LUA_TNONE end end
  845. function dc:from_double(ad)
  846. local function bd(c_a)local d_a=c_a%256;return(c_a-d_a)/256,string.char(d_a)end;local cd=0;if ad<0 then cd=1;ad=-ad end;local dd,__a=math.frexp(ad)if ad==0 then dd,__a=0,0 elseif ad==
  847. 1 /0 then dd,__a=0,2047 else
  848. dd=(dd*2 -1)*math.ldexp(0.5,53)__a=__a+1022 end
  849. local a_a,b_a=""ad=math.floor(dd)for i=1,6 do ad,b_a=bd(ad)a_a=a_a..b_a end;ad,b_a=bd(
  850. __a*16 +ad)a_a=a_a..b_a
  851. ad,b_a=bd(cd*128 +ad)a_a=a_a..b_a;return a_a end
  852. function dc:from_int(ad)local bd=""ad=math.floor(ad)
  853. if ad<0 then ad=4294967296 +ad end;for i=1,4 do local cd=ad%256;bd=bd..string.char(cd)
  854. ad=math.floor(ad/256)end;return bd end;function dc:DumpBlock(ad,bd)
  855. if bd.status==0 then bd.status=bd.write(ad,bd.data)end end;function dc:DumpChar(ad,bd)
  856. self:DumpBlock(string.char(ad),bd)end;function dc:DumpInt(ad,bd)
  857. self:DumpBlock(self:from_int(ad),bd)end;function dc:DumpNumber(ad,bd)
  858. self:DumpBlock(self:from_double(ad),bd)end
  859. function dc:DumpString(ad,bd)if ad==nil then
  860. self:DumpInt(0,bd)else ad=ad.."\0"self:DumpInt(#ad,bd)
  861. self:DumpBlock(ad,bd)end end
  862. function dc:DumpCode(ad,bd)local cd=ad.sizecode;self:DumpInt(cd,bd)for i=0,cd-1 do
  863. self:DumpBlock(_d:Instruction(ad.code[i]),bd)end end
  864. function dc:DumpConstants(ad,bd)local cd=ad.sizek;self:DumpInt(cd,bd)
  865. for i=0,cd-1 do local dd=ad.k[i]
  866. local __a=self:ttype(dd)self:DumpChar(__a,bd)
  867. if __a==self.LUA_TNIL then elseif __a==self.LUA_TBOOLEAN then self:DumpChar(
  868. dd.value and 1 or 0,bd)elseif
  869. __a==self.LUA_TNUMBER then self:DumpNumber(dd.value,bd)elseif __a==self.LUA_TSTRING then
  870. self:DumpString(dd.value,bd)else end end;cd=ad.sizep;self:DumpInt(cd,bd)for i=0,cd-1 do
  871. self:DumpFunction(ad.p[i],ad.source,bd)end end
  872. function dc:DumpDebug(ad,bd)local cd;cd=bd.strip and 0 or ad.sizelineinfo
  873. self:DumpInt(cd,bd)
  874. for i=0,cd-1 do self:DumpInt(ad.lineinfo[i],bd)end;cd=bd.strip and 0 or ad.sizelocvars
  875. self:DumpInt(cd,bd)for i=0,cd-1 do
  876. self:DumpString(ad.locvars[i].varname,bd)self:DumpInt(ad.locvars[i].startpc,bd)
  877. self:DumpInt(ad.locvars[i].endpc,bd)end;cd=
  878. bd.strip and 0 or ad.sizeupvalues;self:DumpInt(cd,bd)
  879. for i=0,cd-1
  880. do self:DumpString(ad.upvalues[i],bd)end end
  881. function dc:DumpFunction(ad,bd,cd)local dd=ad.source;if dd==bd or cd.strip then dd=nil end
  882. self:DumpString(dd,cd)self:DumpInt(ad.lineDefined,cd)
  883. self:DumpInt(ad.lastlinedefined,cd)self:DumpChar(ad.nups,cd)
  884. self:DumpChar(ad.numparams,cd)self:DumpChar(ad.is_vararg,cd)
  885. self:DumpChar(ad.maxstacksize,cd)self:DumpCode(ad,cd)self:DumpConstants(ad,cd)
  886. self:DumpDebug(ad,cd)end
  887. function dc:DumpHeader(ad)local bd=self:header()
  888. assert(#bd==self.LUAC_HEADERSIZE)self:DumpBlock(bd,ad)end;function dc:header()local ad=1
  889. return self.LUA_SIGNATURE..
  890. string.char(self.LUAC_VERSION,self.LUAC_FORMAT,ad,4,4,4,8,0)end
  891. function dc:dump(ad,bd,cd,dd,__a)local a_a={}
  892. a_a.L=ad;a_a.write=cd;a_a.data=dd;a_a.strip=__a;a_a.status=0
  893. self:DumpHeader(a_a)self:DumpFunction(bd,nil,a_a)
  894. a_a.write(nil,a_a.data)return a_a.status end;return dc end;ac=ac()
  895. local bc=function()local dc
  896. local _d={"ABC","ABx","ABC","ABC","ABC","ABx","ABC","ABx","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","AsBx","ABC","ABC","ABC","ABC","ABC","ABC","ABC","ABC","AsBx","AsBx","ABC","ABC","ABC","ABx","ABC"}
  897. local ad={"MOVE","LOADK","LOADBOOL","LOADNIL","GETUPVAL","GETGLOBAL","GETTABLE","SETGLOBAL","SETUPVAL","SETTABLE","NEWTABLE","SELF","ADD","SUB","MUL","DIV","MOD","POW","UNM","NOT","LEN","CONCAT","JMP","EQ","LT","LE","TEST","TESTSET","CALL","TAILCALL","RETURN","FORLOOP","FORPREP","TFORLOOP","SETLIST","CLOSE","CLOSURE","VARARG"}
  898. local function bd(a_a,b_a,c_a)
  899. if c_a then local d_a=0;local _aa=0
  900. for i=b_a,c_a do d_a=d_a+2 ^_aa*bd(a_a,i)_aa=_aa+1 end;return d_a else local d_a=2 ^ (b_a-1)return
  901. (a_a% (d_a+d_a)>=d_a)and 1 or 0 end end
  902. local function cd(a_a)local b_a=1;local c_a=false;local d_a;local _aa;local aaa,baa;local caa,daa,_ba,aba,bba
  903. do function caa()
  904. local dba=a_a:byte(b_a,b_a)b_a=b_a+1;return dba end
  905. function daa()
  906. local dba,_ca,aca,bca=a_a:byte(b_a,b_a+3)b_a=b_a+4;return
  907. bca*16777216 +aca*65536 +_ca*256 +dba end
  908. function _ba()local dba=daa()local _ca=daa()return _ca*4294967296 +dba end;function aba()local dba=daa()local _ca=daa()
  909. return(-2 *bd(_ca,32)+1)*
  910. (2 ^ (bd(_ca,21,31)-1023))* (
  911. (bd(_ca,1,20)* (2 ^32)+dba)/ (2 ^52)+1)end
  912. function bba(dba)
  913. local _ca
  914. if dba then _ca=a_a:sub(b_a,b_a+dba-1)b_a=b_a+dba else dba=baa()if dba==0 then
  915. return end;_ca=a_a:sub(b_a,b_a+dba-1)b_a=b_a+dba end;return _ca end end
  916. local function cba()local dba;local _ca={}local aca={}local bca={}local cca={lines={}}
  917. dba={instructions=_ca,constants=aca,prototypes=bca,debug=cca}local dca;dba.name=bba()dba.first_line=aaa()dba.last_line=aaa()if dba.name then dba.name=dba.name:sub(1,
  918. -2)end;dba.upvalues=caa()
  919. dba.arguments=caa()dba.varg=caa()dba.stack=caa()
  920. do dca=aaa()
  921. for i=1,dca do local _da={}local ada=daa()
  922. local bda=bd(ada,1,6)local cda=_d[bda+1]_da.opcode=bda;_da.type=cda;_da.A=bd(ada,7,14)
  923. if
  924. cda=="ABC"then _da.B=bd(ada,24,32)_da.C=bd(ada,15,23)elseif cda=="ABx"then
  925. _da.Bx=bd(ada,15,32)elseif cda=="AsBx"then _da.sBx=bd(ada,15,32)-131071 end;_ca[i]=_da end end
  926. do dca=aaa()
  927. for i=1,dca do local _da={}local ada=caa()_da.type=ada
  928. if ada==1 then _da.data=(caa()~=0)elseif
  929. ada==3 then _da.data=aba()elseif ada==4 then _da.data=bba():sub(1,-2)end;aca[i-1]=_da end end;do dca=aaa()for i=1,dca do bca[i-1]=cba()end end
  930. do
  931. local _da=cca.lines;dca=aaa()for i=1,dca do _da[i]=daa()end;dca=aaa()for i=1,dca do
  932. bba():sub(1,-2)daa()daa()end;dca=aaa()for i=1,dca do bba()end end;return dba end
  933. do
  934. assert(bba(4)=="\27Lua","Lua bytecode expected.")
  935. assert(caa()==0x51,"Only Lua 5.1 is supported.")caa()c_a=(caa()==0)d_a=caa()_aa=caa()if d_a==4 then aaa=daa elseif d_a==8 then aaa=_ba else
  936. error("Unsupported bytecode target platform")end;if _aa==4 then baa=daa elseif _aa==8 then baa=_ba else
  937. error("Unsupported bytecode target platform")end
  938. assert(bba(3)=="\4\8\0","Unsupported bytecode target platform")end;return cba()end
  939. local function dd(...)local a_a=select("#",...)local b_a={...}return a_a,b_a end
  940. local function __a(a_a,b_a)local c_a=a_a.instructions;local d_a=a_a.constants;local _aa=a_a.prototypes;local aaa,baa;local caa
  941. local daa=1;local _ba,aba
  942. local bba={[0]=function(aca)aaa[aca.A]=aaa[aca.B]end,[1]=function(aca)
  943. aaa[aca.A]=d_a[aca.Bx].data end,[2]=function(aca)aaa[aca.A]=aca.B~=0
  944. if aca.C~=0 then daa=daa+1 end end,[3]=function(aca)local bca=aaa
  945. for i=aca.A,aca.B do bca[i]=nil end end,[4]=function(aca)aaa[aca.A]=b_a[aca.B]end,[5]=function(aca)
  946. local bca=d_a[aca.Bx].data;aaa[aca.A]=caa[bca]end,[6]=function(aca)local bca=aca.C
  947. local cca=aaa
  948. bca=bca>255 and d_a[bca-256].data or cca[bca]cca[aca.A]=cca[aca.B][bca]end,[7]=function(aca)
  949. local bca=d_a[aca.Bx].data;caa[bca]=aaa[aca.A]end,[8]=function(aca)
  950. b_a[aca.B]=aaa[aca.A]end,[9]=function(aca)local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and
  951. _da[bca-256].data or dca[bca]
  952. cca=cca>255 and _da[
  953. cca-256].data or dca[cca]dca[aca.A][bca]=cca end,[10]=function(aca)
  954. aaa[aca.A]={}end,[11]=function(aca)local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da=aaa;cca=_da[cca]
  955. dca=
  956. dca>255 and d_a[dca-256].data or _da[dca]_da[bca+1]=cca;_da[bca]=cca[dca]end,[12]=function(aca)
  957. local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
  958. dca[bca]cca=
  959. cca>255 and _da[cca-256].data or dca[cca]
  960. dca[aca.A]=bca+cca end,[13]=function(aca)
  961. local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
  962. dca[bca]cca=
  963. cca>255 and _da[cca-256].data or dca[cca]
  964. dca[aca.A]=bca-cca end,[14]=function(aca)
  965. local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
  966. dca[bca]cca=
  967. cca>255 and _da[cca-256].data or dca[cca]
  968. dca[aca.A]=bca*cca end,[15]=function(aca)
  969. local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
  970. dca[bca]cca=
  971. cca>255 and _da[cca-256].data or dca[cca]
  972. dca[aca.A]=bca/cca end,[16]=function(aca)
  973. local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
  974. dca[bca]cca=
  975. cca>255 and _da[cca-256].data or dca[cca]
  976. dca[aca.A]=bca%cca end,[17]=function(aca)
  977. local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
  978. dca[bca]cca=
  979. cca>255 and _da[cca-256].data or dca[cca]
  980. dca[aca.A]=bca^cca end,[18]=function(aca)aaa[aca.A]=
  981. -aaa[aca.B]end,[19]=function(aca)
  982. aaa[aca.A]=not aaa[aca.B]end,[20]=function(aca)aaa[aca.A]=#aaa[aca.B]end,[21]=function(aca)
  983. local bca=aca.B;local cca=aaa[bca]for i=bca+1,aca.C do cca=cca..aaa[i]end
  984. aaa[aca.A]=cca end,[22]=function(aca)daa=daa+aca.sBx end,[23]=function(aca)
  985. local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da,ada=aaa,d_a;bca=bca~=0;cca=cca>255 and
  986. ada[cca-256].data or _da[cca]
  987. dca=dca>255 and ada[
  988. dca-256].data or _da[dca]if(cca==dca)~=bca then daa=daa+1 end end,[24]=function(aca)
  989. local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da,ada=aaa,d_a;bca=bca~=0;cca=cca>255 and
  990. ada[cca-256].data or _da[cca]
  991. dca=dca>255 and ada[
  992. dca-256].data or _da[dca]if(cca<dca)~=bca then daa=daa+1 end end,[25]=function(aca)
  993. local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da,ada=aaa,d_a;bca=bca~=0;cca=cca>255 and
  994. ada[cca-256].data or _da[cca]
  995. dca=dca>255 and ada[
  996. dca-256].data or _da[dca]if(cca<=dca)~=bca then daa=daa+1 end end,[26]=function(aca)if
  997. aaa[aca.A]== (aca.C~=0)then daa=daa+1 end end,[27]=function(aca)
  998. local bca=aaa;local cca=bca[aca.B]
  999. if cca== (aca.C~=0)then daa=daa+1 else bca[aca.A]=cca end end,[28]=function(aca)local bca=aca.A
  1000. local cca=aca.B;local dca=aca.C;local _da=aaa;local ada,bda;local cda,dda;ada={}
  1001. if cca~=1 then
  1002. if cca~=0 then cda=bca+cca-1 else cda=baa end;dda=0;for i=bca+1,cda do dda=dda+1;ada[dda]=_da[i]end;cda,bda=dd(_da[bca](unpack(ada,1,
  1003. cda-bca)))else
  1004. cda,bda=dd(_da[bca]())end;baa=bca-1
  1005. if dca~=1 then
  1006. if dca~=0 then cda=bca+dca-2 else cda=cda+bca end;dda=0;for i=bca,cda do dda=dda+1;_da[i]=bda[dda]end end end,[29]=function(aca)
  1007. local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da=aaa;local ada,bda;local cda,dda,__b=baa;ada={}
  1008. if cca~=1 then if cca~=0 then
  1009. dda=bca+cca-1 else dda=cda end;__b=0;for i=bca+1,dda do __b=__b+1
  1010. ada[#ada+1]=_da[i]end
  1011. bda={_da[bca](unpack(ada,1,dda-bca))}else bda={_da[bca]()}end;return true,bda end,[30]=function(aca)
  1012. local bca=aca.A;local cca=aca.B;local dca=aaa;local _da;local ada,bda;if cca==1 then return true end;if cca==0 then _da=baa else _da=
  1013. bca+cca-2 end;bda={}local cda=0;for i=bca,_da do cda=cda+1
  1014. bda[cda]=dca[i]end;return true,bda end,[31]=function(aca)
  1015. local bca=aca.A;local cca=aaa;local dca=cca[bca+2]local _da=cca[bca]+dca;cca[bca]=_da;if dca>0 then
  1016. if _da<=cca[
  1017. bca+1]then daa=daa+aca.sBx;cca[bca+3]=_da end else
  1018. if _da>=cca[bca+1]then daa=daa+aca.sBx;cca[bca+3]=_da end end end,[32]=function(aca)
  1019. local bca=aca.A;local cca=aaa;cca[bca]=cca[bca]-cca[bca+2]
  1020. daa=daa+aca.sBx end,[33]=function(aca)local bca=aca.A;local cca=aca.B
  1021. local dca=aca.C;local _da=aaa;local ada=bca+2
  1022. local bda={_da[bca](_da[bca+1],_da[bca+2])}for i=1,dca do _da[ada+i]=bda[i]end;if _da[bca+3]~=nil then _da[bca+2]=_da[
  1023. bca+3]else daa=daa+1 end end,[34]=function(aca)
  1024. local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da=aaa
  1025. if dca==0 then
  1026. error("NYI: extended SETLIST")else local ada=(dca-1)*50;local bda=_da[bca]if cca==0 then cca=baa end;for i=1,cca do bda[ada+i]=_da[
  1027. bca+i]end end end,[35]=function(aca)
  1028. end,[36]=function(aca)local bca=_aa[aca.Bx]local cca=c_a;local dca=aaa;local _da={}
  1029. local ada=setmetatable({},{__index=function(dda,__b)
  1030. local a_b=_da[__b]return a_b.segment[a_b.offset]end,__newindex=function(dda,__b,a_b)
  1031. local b_b=_da[__b]b_b.segment[b_b.offset]=a_b end})
  1032. for i=1,bca.upvalues do local dda=cca[daa]
  1033. if dda.opcode==0 then
  1034. _da[i-1]={segment=dca,offset=dda.B}elseif cca[daa].opcode==4 then _da[i-1]={segment=b_a,offset=dda.B}end;daa=daa+1 end;local bda,cda=__a(bca,ada)dca[aca.A]=cda end,[37]=function(aca)
  1035. local bca=aca.A;local cca=aca.B;local dca,_da=aaa,_ba;for i=bca,bca+ (cca>0 and cca-1 or aba)do dca[i]=_da[
  1036. i-bca]end end}
  1037. local function cba()local aca=c_a;local bca,cca,dca;while true do bca=aca[daa]daa=daa+1
  1038. cca,dca=bba[bca.opcode](bca)if cca then return dca end end end
  1039. local dba={get_stack=function()return aaa end,get_IP=function()return daa end}
  1040. local function _ca(...)local aca={}local bca={}baa=-1
  1041. aaa=setmetatable(aca,{__index=bca,__newindex=function(bda,cda,dda)if cda>baa and dda then baa=cda end
  1042. bca[cda]=dda end})local cca={...}_ba={}aba=select("#",...)-1;for i=0,aba do aca[i]=cca[i+1]_ba[i]=cca[
  1043. i+1]end;caa=getfenv()daa=1
  1044. local dca=coroutine.create(cba)local _da,ada=coroutine.resume(dca)
  1045. if _da then
  1046. if ada then return unpack(ada)end;return else
  1047. if dc then else local bda=a_a.name;local cda=a_a.debug.lines[daa]
  1048. local dda=ada:gsub("(.-:)","")local __b=""__b=__b.. (bda and bda..":"or"")__b=__b.. (cda and cda..
  1049. ":"or"")__b=__b..ada
  1050. error(__b,0)end end end;return dba,_ca end
  1051. return
  1052. {load_bytecode=function(a_a,b_a)if b_a then script=b_a end;local c_a=cd(a_a)local d_a,_aa=__a(c_a)return _aa end,utils={decode_bytecode=cd,create_wrapper=__a,debug_bytecode=function(a_a)
  1053. local b_a=cd(a_a)return __a(b_a)end}}end;bc=bc()bb:init()local cc={}
  1054. function Lua(dc,_d)local ad,bd,cd
  1055. local dd,__a=pcall(function()dc=ab:_(dc)
  1056. local a_a=ab:init(ab:make_getS(dc),nil)if not a_a then return error()end
  1057. local b_a=_c:parser(cc,a_a,nil,"@input")bd,cd=ac:make_setS()ac:dump(cc,b_a,bd,cd)
  1058. ad=bc.load_bytecode(cd.data,_d)end)if dd then return ad,cd.data else return nil,__a end end;Lua(_b,script)()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement