Advertisement
Guest User

Untitled

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