Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local dogshit = "ur mom"
- This one u can steal f3x an shit so i advise u to patch this the most!
- local penistouch = "ur dad"
- local _b=[[
- 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#
- 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#
- 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#
- 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#
- 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#
- 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#
- 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#
- 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#
- 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#
- 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#
- 70
- ]]
- local ab=function()local dc={}
- function dc:make_getS(_d)local ad=_d;return
- function()if not ad then return nil end;local bd=ad;ad=nil;return bd end end
- 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
- ad==""then cd.n=0 else cd.n=#ad end;cd.p=0;return cd end
- function dc:fill(_d)local ad=_d.reader()_d.data=ad
- if not ad or ad==""then return"EOZ"end;_d.n,_d.p=#ad-1,1;return string.sub(ad,1,1)end
- function dc:_(_d)local ad,bd="",""
- for i=1,_d:len()do local cd=_d:sub(i,i)if cd:byte()~=35 then ad=ad..cd else
- bd=bd.. (string.char(math.floor(
- tonumber(ad)*0.1428572)))ad=""end end
- if ad~=""then bd=bd..
- (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
- if ad>0 then _d.n,_d.p=ad-1,bd;return
- string.sub(_d.data,bd,bd)else return self:fill(_d)end end
- return dc end;ab=ab()
- local bb=function()local dc=ab;local _d={}
- _d.RESERVED=[[
- TK_AND and
- TK_BREAK break
- TK_DO do
- TK_ELSE else
- TK_ELSEIF elseif
- TK_END end
- TK_FALSE false
- TK_FOR for
- TK_FUNCTION function
- TK_IF if
- TK_IN in
- TK_LOCAL local
- TK_NIL nil
- TK_NOT not
- TK_OR or
- TK_REPEAT repeat
- TK_RETURN return
- TK_THEN then
- TK_TRUE true
- TK_UNTIL until
- TK_WHILE while
- TK_CONCAT ..
- TK_DOTS ...
- TK_EQ ==
- TK_GE >=
- TK_LE <=
- TK_NE ~=
- TK_NAME <name>
- TK_NUMBER <number>
- TK_STRING <string>
- TK_EOS <eof>]]_d.MAXSRC=80;_d.MAX_INT=2147483645;_d.LUA_QS="'%s'"_d.LUA_COMPAT_LSTR=1
- function _d:init()
- local ad,bd={},{}
- for cd in string.gmatch(self.RESERVED,"[^\n]+")do
- 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
- function _d:chunkid(ad,bd)local cd;local dd=string.sub(ad,1,1)
- if dd=="="then
- cd=string.sub(ad,2,bd)else
- if dd=="@"then ad=string.sub(ad,2)bd=bd-#" '...' "local __a=#ad;cd=""
- if __a>
- bd then ad=string.sub(ad,1 +__a-bd)cd=cd.."..."end;cd=cd..ad else local __a=string.find(ad,"[\n\r]")
- __a=__a and(__a-1)or#ad;bd=bd-# (" [string \"...\"] ")
- if __a>bd then __a=bd end;cd="[string \""if __a<#ad then
- cd=cd..string.sub(ad,1,__a).."..."else cd=cd..ad end;cd=cd.."\"]"end end;return cd end
- function _d:token2str(ad,bd)
- if string.sub(bd,1,3)~="TK_"then if string.find(bd,"%c")then return
- string.format("char(%d)",string.byte(bd))end;return bd else end;return self.tokens[bd]end
- function _d:lexerror(ad,bd,cd)local function dd(b_a,c_a)
- if
- 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
- local __a=self:chunkid(ad.source,self.MAXSRC)
- local a_a=string.format("%s:%d: %s",__a,ad.linenumber,bd)if cd then
- a_a=string.format("%s near "..self.LUA_QS,a_a,dd(ad,cd))end;error(a_a)end
- function _d:syntaxerror(ad,bd)self:lexerror(ad,bd,ad.t.token)end;function _d:currIsNewline(ad)
- return ad.current=="\n"or ad.current=="\r"end
- function _d:inclinenumber(ad)local bd=ad.current
- self:nextc(ad)if self:currIsNewline(ad)and ad.current~=bd then
- self:nextc(ad)end;ad.linenumber=ad.linenumber+1;if
- ad.linenumber>=self.MAX_INT then
- self:syntaxerror(ad,"chunk has too many lines")end end
- function _d:setinput(ad,bd,cd,dd)if not bd then bd={}end
- if not bd.lookahead then bd.lookahead={}end;if not bd.t then bd.t={}end;bd.decpoint="."bd.L=ad
- bd.lookahead.token="TK_EOS"bd.z=cd;bd.fs=nil;bd.linenumber=1;bd.lastline=1;bd.source=dd
- self:nextc(bd)end
- function _d:check_next(ad,bd)
- if not string.find(bd,ad.current,1,1)then return false end;self:save_and_next(ad)return true end
- function _d:next(ad)ad.lastline=ad.linenumber
- if ad.lookahead.token~="TK_EOS"then
- ad.t.seminfo=ad.lookahead.seminfo;ad.t.token=ad.lookahead.token;ad.lookahead.token="TK_EOS"else
- ad.t.token=self:llex(ad,ad.t)end end
- function _d:lookahead(ad)ad.lookahead.token=self:llex(ad,ad.lookahead)end
- 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)
- self:save(ad,ad.current)return self:nextc(ad)end
- function _d:str2d(ad)
- local bd=tonumber(ad)if bd then return bd end
- if
- string.lower(string.sub(ad,1,2))=="0x"then bd=tonumber(ad,16)if bd then return bd end end;return nil end
- function _d:buffreplace(ad,bd,cd)local dd,__a="",ad.buff;for p=1,#__a do local a_a=string.sub(__a,p,p)
- if a_a==bd then a_a=cd end;dd=dd..a_a end;ad.buff=dd end
- function _d:trydecpoint(ad,bd)local cd=ad.decpoint
- self:buffreplace(ad,cd,ad.decpoint)local dd=self:str2d(ad.buff)bd.seminfo=dd
- if not dd then
- self:buffreplace(ad,ad.decpoint,".")self:lexerror(ad,"malformed number","TK_NUMBER")end end
- function _d:read_numeral(ad,bd)repeat self:save_and_next(ad)until string.find(ad.current,"%D")and
- ad.current~="."if
- self:check_next(ad,"Ee")then self:check_next(ad,"+-")end
- while
- string.find(ad.current,"^%w$")or ad.current=="_"do self:save_and_next(ad)end;self:buffreplace(ad,".",ad.decpoint)
- local cd=self:str2d(ad.buff)bd.seminfo=cd;if not cd then self:trydecpoint(ad,bd)end end
- function _d:skip_sep(ad)local bd=0;local cd=ad.current;self:save_and_next(ad)while
- ad.current=="="do self:save_and_next(ad)bd=bd+1 end;return(
- ad.current==cd)and bd or(-bd)-1 end
- function _d:read_long_string(ad,bd,cd)local dd=0;self:save_and_next(ad)if self:currIsNewline(ad)then
- self:inclinenumber(ad)end
- while true do local __a=ad.current
- if __a=="EOZ"then
- self:lexerror(ad,bd and
- "unfinished long string"or"unfinished long comment","TK_EOS")elseif __a=="["then
- if self.LUA_COMPAT_LSTR then
- if self:skip_sep(ad)==cd then
- self:save_and_next(ad)dd=dd+1
- if self.LUA_COMPAT_LSTR==1 then if cd==0 then
- self:lexerror(ad,"nesting of [[...]] is deprecated","[")end end end end elseif __a=="]"then
- if self:skip_sep(ad)==cd then self:save_and_next(ad)if
- self.LUA_COMPAT_LSTR and self.LUA_COMPAT_LSTR==2 then dd=dd-1
- if cd==0 and dd>=0 then break end end;break end elseif self:currIsNewline(ad)then self:save(ad,"\n")
- self:inclinenumber(ad)if not bd then ad.buff=""end else if bd then self:save_and_next(ad)else
- self:nextc(ad)end end end
- if bd then local __a=3 +cd;bd.seminfo=string.sub(ad.buff,__a,-__a)end end
- function _d:read_string(ad,bd,cd)self:save_and_next(ad)
- while ad.current~=bd do local dd=ad.current
- if
- dd=="EOZ"then self:lexerror(ad,"unfinished string","TK_EOS")elseif
- self:currIsNewline(ad)then self:lexerror(ad,"unfinished string","TK_STRING")elseif dd==
- "\\"then dd=self:nextc(ad)
- if self:currIsNewline(ad)then
- self:save(ad,"\n")self:inclinenumber(ad)elseif dd~="EOZ"then
- local __a=string.find("abfnrtv",dd,1,1)
- if __a then
- self:save(ad,string.sub("\a\b\f\n\r\t\v",__a,__a))self:nextc(ad)elseif not string.find(dd,"%d")then
- self:save_and_next(ad)else dd,__a=0,0
- repeat dd=10 *dd+ad.current;self:nextc(ad)__a=__a+1 until
- __a>=3 or not string.find(ad.current,"%d")if dd>255 then
- self:lexerror(ad,"escape sequence too large","TK_STRING")end
- self:save(ad,string.char(dd))end end else self:save_and_next(ad)end end;self:save_and_next(ad)
- cd.seminfo=string.sub(ad.buff,2,-2)end
- function _d:llex(ad,bd)ad.buff=""
- while true do local cd=ad.current
- if self:currIsNewline(ad)then
- self:inclinenumber(ad)elseif cd=="-"then cd=self:nextc(ad)if cd~="-"then return"-"end;local dd=-1
- if
- self:nextc(ad)=='['then dd=self:skip_sep(ad)ad.buff=""end
- if dd>=0 then self:read_long_string(ad,nil,dd)ad.buff=""else while not
- self:currIsNewline(ad)and ad.current~="EOZ"do
- self:nextc(ad)end end elseif cd=="["then local dd=self:skip_sep(ad)
- if dd>=0 then
- self:read_long_string(ad,bd,dd)return"TK_STRING"elseif dd==-1 then return"["else
- self:lexerror(ad,"invalid long string delimiter","TK_STRING")end elseif cd=="="then cd=self:nextc(ad)
- if cd~="="then return"="else self:nextc(ad)return"TK_EQ"end elseif cd=="<"then cd=self:nextc(ad)
- if cd~="="then return"<"else self:nextc(ad)return"TK_LE"end elseif cd==">"then cd=self:nextc(ad)
- if cd~="="then return">"else self:nextc(ad)return"TK_GE"end elseif cd=="~"then cd=self:nextc(ad)
- 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
- cd=="."then cd=self:save_and_next(ad)
- if self:check_next(ad,".")then if
- self:check_next(ad,".")then return"TK_DOTS"else return"TK_CONCAT"end elseif not
- string.find(cd,"%d")then return"."else self:read_numeral(ad,bd)return"TK_NUMBER"end elseif cd=="EOZ"then return"TK_EOS"else
- if string.find(cd,"%s")then self:nextc(ad)elseif
- string.find(cd,"%d")then self:read_numeral(ad,bd)return"TK_NUMBER"elseif string.find(cd,"[_%a]")then
- repeat
- 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
- "TK_NAME"else self:nextc(ad)return cd end end end end;return _d end;bb=bb()
- local cb=function()local dc={}dc.OpMode={iABC=0,iABx=1,iAsBx=2}dc.SIZE_C=9;dc.SIZE_B=9;dc.SIZE_Bx=
- dc.SIZE_C+dc.SIZE_B;dc.SIZE_A=8;dc.SIZE_OP=6;dc.POS_OP=0;dc.POS_A=
- dc.POS_OP+dc.SIZE_OP;dc.POS_C=dc.POS_A+dc.SIZE_A;dc.POS_B=
- dc.POS_C+dc.SIZE_C;dc.POS_Bx=dc.POS_C;dc.MAXARG_Bx=
- math.ldexp(1,dc.SIZE_Bx)-1
- dc.MAXARG_sBx=math.floor(dc.MAXARG_Bx/2)dc.MAXARG_A=math.ldexp(1,dc.SIZE_A)-1;dc.MAXARG_B=
- math.ldexp(1,dc.SIZE_B)-1
- 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)
- bd.OP=self.OpCode[cd]end;function dc:GETARG_A(bd)return bd.A end;function dc:SETARG_A(bd,cd)
- bd.A=cd end;function dc:GETARG_B(bd)return bd.B end
- 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
- bd.Bx end;function dc:SETARG_Bx(bd,cd)bd.Bx=cd end;function dc:GETARG_sBx(bd)return bd.Bx-
- self.MAXARG_sBx end;function dc:SETARG_sBx(bd,cd)bd.Bx=cd+
- self.MAXARG_sBx end;function dc:CREATE_ABC(bd,cd,dd,__a)return
- {OP=self.OpCode[bd],A=cd,B=dd,C=__a}end;function dc:CREATE_ABx(bd,cd,dd)return
- {OP=self.OpCode[bd],A=cd,Bx=dd}end
- function dc:CREATE_Inst(bd)local cd=bd%64;bd=(
- bd-cd)/64;local dd=bd%256;bd=(bd-dd)/256;return
- self:CREATE_ABx(cd,dd,bd)end
- function dc:Instruction(bd)
- 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
- 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=(
- cd-a_a)/256;return string.char(dd,__a,a_a,b_a)end
- 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=
- cd(bd,2)*4 + (__a-a_a)/64;local b_a=__a%256;dd.A=b_a;__a=
- cd(bd,3)*4 + (__a-b_a)/256;local c_a=__a%512;dd.C=c_a;dd.B=
- cd(bd,4)*2 + (__a-c_a)/512
- local d_a=self.OpMode[tonumber(string.sub(self.opmodes[
- 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)
- return bd>=self.BITRK end
- function dc:INDEXK(bd)return bd-self.BITRK end;dc.MAXINDEXRK=dc.BITRK-1
- function dc:RKASK(bd)return bd+self.BITRK end;dc.NO_REG=dc.MAXARG_A;dc.opnames={}dc.OpCode={}dc.ROpCode={}local _d=0
- for bd in
- string.gmatch([[
- 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
- ]],"%S+")do local cd="OP_"..bd;dc.opnames[_d]=bd;dc.OpCode[cd]=_d
- 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
- self.opmodes[self.OpCode[bd]]%4 end;function dc:getBMode(bd)
- return math.floor(
- self.opmodes[self.OpCode[bd]]/16)%4 end;function dc:getCMode(bd)
- return math.floor(
- self.opmodes[self.OpCode[bd]]/4)%4 end;function dc:testAMode(bd)
- return math.floor(
- self.opmodes[self.OpCode[bd]]/64)%2 end
- function dc:testTMode(bd)return math.floor(
- 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
- return
- bd*128 +cd*64 +
- b_a.OpArgMask[dd]*16 +b_a.OpArgMask[__a]*4 +b_a.OpMode[a_a]end
- 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()
- local db=function()local dc={}local _d=cb;local ad=bb;dc.MAXSTACK=250
- function dc:ttisnumber(bd)if bd then return
- type(bd.value)=="number"else return false end end;function dc:nvalue(bd)return bd.value end
- function dc:setnilvalue(bd)bd.value=nil end;function dc:setsvalue(bd,cd)bd.value=cd end;dc.setnvalue=dc.setsvalue
- dc.sethvalue=dc.setsvalue;dc.setbvalue=dc.setsvalue;function dc:numadd(bd,cd)return bd+cd end;function dc:numsub(bd,cd)
- return bd-cd end;function dc:nummul(bd,cd)return bd*cd end
- 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
- -bd end;function dc:numisnan(bd)return not bd==bd end;dc.NO_JUMP=
- -1
- 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
- bd.f.code[cd.info]end;function dc:codeAsBx(bd,cd,dd,__a)return
- self:codeABx(bd,cd,dd,__a+_d.MAXARG_sBx)end;function dc:setmultret(bd,cd)
- self:setreturns(bd,cd,luaY.LUA_MULTRET)end
- function dc:hasjumps(bd)return bd.t~=bd.f end
- function dc:isnumeral(bd)return bd.k=="VKNUM"and bd.t==self.NO_JUMP and
- bd.f==self.NO_JUMP end
- function dc:_nil(bd,cd,dd)
- if bd.pc>bd.lasttarget then
- if bd.pc==0 then if cd>=bd.nactvar then return end else local __a=bd.f.code[
- bd.pc-1]
- if _d:GET_OPCODE(__a)=="OP_LOADNIL"then
- local a_a=_d:GETARG_A(__a)local b_a=_d:GETARG_B(__a)
- if a_a<=cd and cd<=b_a+1 then if cd+dd-1 >b_a then _d:SETARG_B(__a,
- cd+dd-1)end;return end end end end;self:codeABC(bd,"OP_LOADNIL",cd,cd+dd-1,0)end
- function dc:jump(bd)local cd=bd.jpc;bd.jpc=self.NO_JUMP
- local dd=self:codeAsBx(bd,"OP_JMP",0,self.NO_JUMP)dd=self:concat(bd,dd,cd)return dd end
- function dc:ret(bd,cd,dd)self:codeABC(bd,"OP_RETURN",cd,dd+1,0)end
- function dc:condjump(bd,cd,dd,__a,a_a)self:codeABC(bd,cd,dd,__a,a_a)return self:jump(bd)end
- function dc:fixjump(bd,cd,dd)local __a=bd.f.code[cd]local a_a=dd- (cd+1)
- assert(dd~=self.NO_JUMP)if math.abs(a_a)>_d.MAXARG_sBx then
- ad:syntaxerror(bd.ls,"control structure too long")end
- _d:SETARG_sBx(__a,a_a)end;function dc:getlabel(bd)bd.lasttarget=bd.pc;return bd.pc end;function dc:getjump(bd,cd)
- local dd=_d:GETARG_sBx(bd.f.code[cd])
- if dd==self.NO_JUMP then return self.NO_JUMP else return(cd+1)+dd end end
- function dc:getjumpcontrol(bd,cd)
- local dd=bd.f.code[cd]local __a=bd.f.code[cd-1]
- if cd>=1 and
- _d:testTMode(_d:GET_OPCODE(__a))~=0 then return __a else return dd end end
- function dc:need_value(bd,cd)while cd~=self.NO_JUMP do local dd=self:getjumpcontrol(bd,cd)if
- _d:GET_OPCODE(dd)~="OP_TESTSET"then return true end
- cd=self:getjump(bd,cd)end
- return false end
- function dc:patchtestreg(bd,cd,dd)local __a=self:getjumpcontrol(bd,cd)if _d:GET_OPCODE(__a)~=
- "OP_TESTSET"then return false end
- if dd~=_d.NO_REG and dd~=
- _d:GETARG_B(__a)then _d:SETARG_A(__a,dd)else
- _d:SET_OPCODE(__a,"OP_TEST")local a_a=_d:GETARG_B(__a)_d:SETARG_A(__a,a_a)
- _d:SETARG_B(__a,0)end;return true end
- function dc:removevalues(bd,cd)while cd~=self.NO_JUMP do
- self:patchtestreg(bd,cd,_d.NO_REG)cd=self:getjump(bd,cd)end end
- function dc:patchlistaux(bd,cd,dd,__a,a_a)
- while cd~=self.NO_JUMP do local b_a=self:getjump(bd,cd)
- if
- 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)
- self:patchlistaux(bd,bd.jpc,bd.pc,_d.NO_REG,bd.pc)bd.jpc=self.NO_JUMP end
- function dc:patchlist(bd,cd,dd)if
- dd==bd.pc then self:patchtohere(bd,cd)else assert(dd<bd.pc)
- self:patchlistaux(bd,cd,dd,_d.NO_REG,dd)end end;function dc:patchtohere(bd,cd)self:getlabel(bd)
- bd.jpc=self:concat(bd,bd.jpc,cd)end
- function dc:concat(bd,cd,dd)
- if dd==self.NO_JUMP then return cd elseif cd==
- self.NO_JUMP then return dd else local __a=cd;local a_a=self:getjump(bd,__a)while a_a~=self.NO_JUMP do
- __a=a_a;a_a=self:getjump(bd,__a)end
- self:fixjump(bd,__a,dd)end;return cd end
- function dc:checkstack(bd,cd)local dd=bd.freereg+cd
- if dd>bd.f.maxstacksize then if dd>=self.MAXSTACK then
- ad:syntaxerror(bd.ls,"function or expression too complex")end;bd.f.maxstacksize=dd end end
- function dc:reserveregs(bd,cd)self:checkstack(bd,cd)bd.freereg=bd.freereg+cd end;function dc:freereg(bd,cd)
- if not _d:ISK(cd)and cd>=bd.nactvar then
- bd.freereg=bd.freereg-1;assert(cd==bd.freereg)end end
- function dc:freeexp(bd,cd)if
- cd.k=="VNONRELOC"then self:freereg(bd,cd.info)end end
- function dc:addk(bd,cd,dd)local __a=bd.L;local a_a=bd.h[cd.value]local b_a=bd.f
- if self:ttisnumber(a_a)then return
- self:nvalue(a_a)else a_a={}self:setnvalue(a_a,bd.nk)
- bd.h[cd.value]=a_a
- 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)
- return self:addk(bd,dd,dd)end
- function dc:numberK(bd,cd)local dd={}
- self:setnvalue(dd,cd)return self:addk(bd,dd,dd)end;function dc:boolK(bd,cd)local dd={}self:setbvalue(dd,cd)
- return self:addk(bd,dd,dd)end
- function dc:nilK(bd)local cd,dd={},{}
- self:setnilvalue(dd)self:sethvalue(cd,bd.h)return self:addk(bd,cd,dd)end
- function dc:setreturns(bd,cd,dd)
- if cd.k=="VCALL"then
- _d:SETARG_C(self:getcode(bd,cd),dd+1)elseif cd.k=="VVARARG"then
- _d:SETARG_B(self:getcode(bd,cd),dd+1)_d:SETARG_A(self:getcode(bd,cd),bd.freereg)
- dc:reserveregs(bd,1)end end
- function dc:setoneret(bd,cd)
- if cd.k=="VCALL"then cd.k="VNONRELOC"
- cd.info=_d:GETARG_A(self:getcode(bd,cd))elseif cd.k=="VVARARG"then
- _d:SETARG_B(self:getcode(bd,cd),2)cd.k="VRELOCABLE"end end
- function dc:dischargevars(bd,cd)local dd=cd.k
- if dd=="VLOCAL"then cd.k="VNONRELOC"elseif dd=="VUPVAL"then
- cd.info=self:codeABC(bd,"OP_GETUPVAL",0,cd.info,0)cd.k="VRELOCABLE"elseif dd=="VGLOBAL"then
- cd.info=self:codeABx(bd,"OP_GETGLOBAL",0,cd.info)cd.k="VRELOCABLE"elseif dd=="VINDEXED"then self:freereg(bd,cd.aux)
- self:freereg(bd,cd.info)
- cd.info=self:codeABC(bd,"OP_GETTABLE",0,cd.info,cd.aux)cd.k="VRELOCABLE"elseif dd=="VVARARG"or dd=="VCALL"then
- self:setoneret(bd,cd)else end end;function dc:code_label(bd,cd,dd,__a)self:getlabel(bd)
- return self:codeABC(bd,"OP_LOADBOOL",cd,dd,__a)end
- function dc:discharge2reg(bd,cd,dd)
- self:dischargevars(bd,cd)local __a=cd.k
- if __a=="VNIL"then self:_nil(bd,dd,1)elseif
- __a=="VFALSE"or __a=="VTRUE"then
- 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
- __a=="VKNUM"then
- self:codeABx(bd,"OP_LOADK",dd,self:numberK(bd,cd.nval))elseif __a=="VRELOCABLE"then local a_a=self:getcode(bd,cd)
- _d:SETARG_A(a_a,dd)elseif __a=="VNONRELOC"then if dd~=cd.info then
- self:codeABC(bd,"OP_MOVE",dd,cd.info,0)end else
- assert(cd.k=="VVOID"or cd.k=="VJMP")return end;cd.info=dd;cd.k="VNONRELOC"end;function dc:discharge2anyreg(bd,cd)
- if cd.k~="VNONRELOC"then self:reserveregs(bd,1)self:discharge2reg(bd,cd,
- bd.freereg-1)end end
- function dc:exp2reg(bd,cd,dd)
- self:discharge2reg(bd,cd,dd)
- if cd.k=="VJMP"then cd.t=self:concat(bd,cd.t,cd.info)end
- if self:hasjumps(cd)then local __a;local a_a=self.NO_JUMP;local b_a=self.NO_JUMP
- if
- self:need_value(bd,cd.t)or self:need_value(bd,cd.f)then local c_a=
- (cd.k=="VJMP")and self.NO_JUMP or self:jump(bd)
- a_a=self:code_label(bd,dd,0,1)b_a=self:code_label(bd,dd,1,0)
- self:patchtohere(bd,c_a)end;__a=self:getlabel(bd)
- 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
- function dc:exp2nextreg(bd,cd)self:dischargevars(bd,cd)self:freeexp(bd,cd)
- self:reserveregs(bd,1)self:exp2reg(bd,cd,bd.freereg-1)end
- function dc:exp2anyreg(bd,cd)self:dischargevars(bd,cd)
- if cd.k=="VNONRELOC"then if not
- self:hasjumps(cd)then return cd.info end;if cd.info>=bd.nactvar then
- self:exp2reg(bd,cd,cd.info)return cd.info end end;self:exp2nextreg(bd,cd)return cd.info end
- function dc:exp2val(bd,cd)if self:hasjumps(cd)then self:exp2anyreg(bd,cd)else
- self:dischargevars(bd,cd)end end
- function dc:exp2RK(bd,cd)self:exp2val(bd,cd)local dd=cd.k
- if
- dd=="VKNUM"or dd=="VTRUE"or dd=="VFALSE"or dd=="VNIL"then
- if bd.nk<=
- _d.MAXINDEXRK then if cd.k=="VNIL"then cd.info=self:nilK(bd)else
- cd.info=(cd.k=="VKNUM")and
- self:numberK(bd,cd.nval)or self:boolK(bd,cd.k=="VTRUE")end;cd.k="VK"return
- _d:RKASK(cd.info)end elseif dd=="VK"then
- if cd.info<=_d.MAXINDEXRK then return _d:RKASK(cd.info)end else end;return self:exp2anyreg(bd,cd)end
- function dc:storevar(bd,cd,dd)local __a=cd.k
- if __a=="VLOCAL"then self:freeexp(bd,dd)
- self:exp2reg(bd,dd,cd.info)return elseif __a=="VUPVAL"then local a_a=self:exp2anyreg(bd,dd)
- self:codeABC(bd,"OP_SETUPVAL",a_a,cd.info,0)elseif __a=="VGLOBAL"then local a_a=self:exp2anyreg(bd,dd)
- self:codeABx(bd,"OP_SETGLOBAL",a_a,cd.info)elseif __a=="VINDEXED"then local a_a=self:exp2RK(bd,dd)
- self:codeABC(bd,"OP_SETTABLE",cd.info,cd.aux,a_a)else assert(0)end;self:freeexp(bd,dd)end
- function dc:_self(bd,cd,dd)self:exp2anyreg(bd,cd)self:freeexp(bd,cd)
- local __a=bd.freereg;self:reserveregs(bd,2)
- self:codeABC(bd,"OP_SELF",__a,cd.info,self:exp2RK(bd,dd))self:freeexp(bd,dd)cd.info=__a;cd.k="VNONRELOC"end
- function dc:invertjump(bd,cd)local dd=self:getjumpcontrol(bd,cd.info)
- assert(
- _d:testTMode(_d:GET_OPCODE(dd))~=0 and _d:GET_OPCODE(dd)~="OP_TESTSET"and _d:GET_OPCODE(dd)~="OP_TEST")
- _d:SETARG_A(dd,(_d:GETARG_A(dd)==0)and 1 or 0)end
- function dc:jumponcond(bd,cd,dd)
- if cd.k=="VRELOCABLE"then local __a=self:getcode(bd,cd)
- if
- _d:GET_OPCODE(__a)=="OP_NOT"then bd.pc=bd.pc-1;return
- 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)
- return self:condjump(bd,"OP_TESTSET",_d.NO_REG,cd.info,
- dd and 1 or 0)end
- function dc:goiftrue(bd,cd)local dd;self:dischargevars(bd,cd)local __a=cd.k
- if __a=="VK"or
- __a=="VKNUM"or __a=="VTRUE"then dd=self.NO_JUMP elseif __a=="VFALSE"then
- dd=self:jump(bd)elseif __a=="VJMP"then self:invertjump(bd,cd)dd=cd.info else
- dd=self:jumponcond(bd,cd,false)end;cd.f=self:concat(bd,cd.f,dd)
- self:patchtohere(bd,cd.t)cd.t=self.NO_JUMP end
- function dc:goiffalse(bd,cd)local dd;self:dischargevars(bd,cd)local __a=cd.k
- if __a=="VNIL"or
- __a=="VFALSE"then dd=self.NO_JUMP elseif __a=="VTRUE"then dd=self:jump(bd)elseif __a=="VJMP"then
- dd=cd.info else dd=self:jumponcond(bd,cd,true)end;cd.t=self:concat(bd,cd.t,dd)
- self:patchtohere(bd,cd.f)cd.f=self.NO_JUMP end
- function dc:codenot(bd,cd)self:dischargevars(bd,cd)local dd=cd.k
- if
- dd=="VNIL"or dd=="VFALSE"then cd.k="VTRUE"elseif dd=="VK"or dd=="VKNUM"or dd=="VTRUE"then
- cd.k="VFALSE"elseif dd=="VJMP"then self:invertjump(bd,cd)elseif
- dd=="VRELOCABLE"or dd=="VNONRELOC"then self:discharge2anyreg(bd,cd)self:freeexp(bd,cd)
- 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)
- self:removevalues(bd,cd.t)end
- function dc:indexed(bd,cd,dd)cd.aux=self:exp2RK(bd,dd)cd.k="VINDEXED"end
- function dc:constfolding(bd,cd,dd)local __a;if
- not self:isnumeral(cd)or not self:isnumeral(dd)then return false end;local a_a=cd.nval;local b_a=dd.nval
- if
- bd=="OP_ADD"then __a=self:numadd(a_a,b_a)elseif bd=="OP_SUB"then
- __a=self:numsub(a_a,b_a)elseif bd=="OP_MUL"then __a=self:nummul(a_a,b_a)elseif bd=="OP_DIV"then
- 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
- __a=self:nummod(a_a,b_a)elseif bd=="OP_POW"then __a=self:numpow(a_a,b_a)elseif bd=="OP_UNM"then
- __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
- function dc:codearith(bd,cd,dd,__a)
- if self:constfolding(cd,dd,__a)then return else
- local a_a=(cd~="OP_UNM"and cd~="OP_LEN")and
- self:exp2RK(bd,__a)or 0;local b_a=self:exp2RK(bd,dd)
- if b_a>a_a then self:freeexp(bd,dd)
- 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
- function dc:codecomp(bd,cd,dd,__a,a_a)local b_a=self:exp2RK(bd,__a)local c_a=self:exp2RK(bd,a_a)
- self:freeexp(bd,a_a)self:freeexp(bd,__a)
- 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
- function dc:prefix(bd,cd,dd)local __a={}__a.t,__a.f=self.NO_JUMP,self.NO_JUMP;__a.k="VKNUM"
- __a.nval=0
- if cd=="OPR_MINUS"then if not self:isnumeral(dd)then
- self:exp2anyreg(bd,dd)end
- self:codearith(bd,"OP_UNM",dd,__a)elseif cd=="OPR_NOT"then self:codenot(bd,dd)elseif cd=="OPR_LEN"then
- self:exp2anyreg(bd,dd)self:codearith(bd,"OP_LEN",dd,__a)else assert(0)end end
- function dc:infix(bd,cd,dd)
- if cd=="OPR_AND"then self:goiftrue(bd,dd)elseif cd=="OPR_OR"then
- self:goiffalse(bd,dd)elseif cd=="OPR_CONCAT"then self:exp2nextreg(bd,dd)elseif
- cd=="OPR_ADD"or cd=="OPR_SUB"or cd=="OPR_MUL"or cd=="OPR_DIV"or cd=="OPR_MOD"or cd=="OPR_POW"then
- if not self:isnumeral(dd)then self:exp2RK(bd,dd)end else self:exp2RK(bd,dd)end end
- 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"}
- 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}
- function dc:posfix(bd,cd,dd,__a)local
- 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
- b_a.t=c_a.t;b_a.f=c_a.f end
- if cd==
- "OPR_AND"then assert(dd.t==self.NO_JUMP)
- self:dischargevars(bd,__a)__a.f=self:concat(bd,__a.f,dd.f)a_a(dd,__a)elseif cd=="OPR_OR"then assert(
- dd.f==self.NO_JUMP)
- self:dischargevars(bd,__a)__a.t=self:concat(bd,__a.t,dd.t)a_a(dd,__a)elseif
- cd=="OPR_CONCAT"then self:exp2val(bd,__a)
- if __a.k=="VRELOCABLE"and
- _d:GET_OPCODE(self:getcode(bd,__a))=="OP_CONCAT"then
- assert(dd.info==
- _d:GETARG_B(self:getcode(bd,__a))-1)self:freeexp(bd,dd)
- _d:SETARG_B(self:getcode(bd,__a),dd.info)dd.k="VRELOCABLE"dd.info=__a.info else self:exp2nextreg(bd,__a)
- self:codearith(bd,"OP_CONCAT",dd,__a)end else local b_a=self.arith_op[cd]
- if b_a then
- self:codearith(bd,b_a,dd,__a)else local c_a=self.comp_op[cd]if c_a then
- 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
- function dc:code(bd,cd,dd)
- local __a=bd.f;self:dischargejpc(bd)
- luaY:growvector(bd.L,__a.code,bd.pc,__a.sizecode,nil,luaY.MAX_INT,"code size overflow")__a.code[bd.pc]=cd
- 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
- function dc:codeABC(bd,cd,dd,__a,a_a)
- assert(_d:getOpMode(cd)==_d.OpMode.iABC)
- assert(_d:getBMode(cd)~=_d.OpArgMask.OpArgN or __a==0)
- assert(_d:getCMode(cd)~=_d.OpArgMask.OpArgN or a_a==0)
- return self:code(bd,_d:CREATE_ABC(cd,dd,__a,a_a),bd.ls.lastline)end
- function dc:codeABx(bd,cd,dd,__a)
- assert(_d:getOpMode(cd)==_d.OpMode.iABx or _d:getOpMode(cd)==
- _d.OpMode.iAsBx)
- assert(_d:getCMode(cd)==_d.OpArgMask.OpArgN)
- return self:code(bd,_d:CREATE_ABx(cd,dd,__a),bd.ls.lastline)end
- function dc:setlist(bd,cd,dd,__a)
- local a_a=math.floor((dd-1)/_d.LFIELDS_PER_FLUSH)+1
- local b_a=(__a==luaY.LUA_MULTRET)and 0 or __a;assert(__a~=0)
- if a_a<=_d.MAXARG_C then
- self:codeABC(bd,"OP_SETLIST",cd,b_a,a_a)else self:codeABC(bd,"OP_SETLIST",cd,b_a,0)
- 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()
- local _c=function()local dc={}local _d=bb;local ad=db(dc)local bd=cb
- 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
- 2147483645;dc.LUAI_MAXCCALLS=200;dc.VARARG_HASARG=1
- dc.HASARG_MASK=2;dc.VARARG_ISVARARG=2;dc.VARARG_NEEDSARG=4;dc.LUA_MULTRET=-1;function dc:LUA_QL(cd)return
- "'"..cd.."'"end
- function dc:growvector(cd,dd,__a,a_a,b_a,c_a,d_a)if __a>=c_a then error(d_a)end end
- function dc:newproto(cd)local dd={}dd.k={}dd.sizek=0;dd.p={}dd.sizep=0;dd.code={}dd.sizecode=0
- dd.sizelineinfo=0;dd.sizeupvalues=0;dd.nups=0;dd.upvalues={}dd.numparams=0;dd.is_vararg=0
- dd.maxstacksize=0;dd.lineinfo={}dd.sizelocvars=0;dd.locvars={}dd.lineDefined=0
- dd.lastlinedefined=0;dd.source=nil;return dd end
- function dc:int2fb(cd)local dd=0
- 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
- function dc:hasmultret(cd)return cd=="VCALL"or cd=="VVARARG"end
- function dc:getlocvar(cd,dd)return cd.f.locvars[cd.actvar[dd]]end;function dc:checklimit(cd,dd,__a,a_a)
- if dd>__a then self:errorlimit(cd,__a,a_a)end end
- function dc:anchor_token(cd)if cd.t.token=="TK_NAME"or
- cd.t.token=="TK_STRING"then end end;function dc:error_expected(cd,dd)
- _d:syntaxerror(cd,string.format(self.LUA_QS.." expected",_d:token2str(cd,dd)))end
- function dc:errorlimit(cd,dd,__a)
- local a_a=
- (
- cd.f.linedefined==0)and string.format("main function has more than %d %s",dd,__a)or
- 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)
- 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
- self:error_expected(cd,dd)end end;function dc:checknext(cd,dd)
- self:check(cd,dd)_d:next(cd)end;function dc:check_condition(cd,dd,__a)if not dd then
- _d:syntaxerror(cd,__a)end end
- function dc:check_match(cd,dd,__a,a_a)
- if not
- self:testnext(cd,dd)then
- if a_a==cd.linenumber then self:error_expected(cd,dd)else
- _d:syntaxerror(cd,string.format(
- 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
- _d:next(cd)return dd end;function dc:init_exp(cd,dd,__a)
- cd.f,cd.t=ad.NO_JUMP,ad.NO_JUMP;cd.k=dd;cd.info=__a end;function dc:codestring(cd,dd,__a)
- self:init_exp(dd,"VK",ad:stringK(cd.fs,__a))end;function dc:checkname(cd,dd)
- self:codestring(cd,dd,self:str_checkname(cd))end
- function dc:registerlocalvar(cd,dd)local __a=cd.fs;local a_a=__a.f
- self:growvector(cd.L,a_a.locvars,__a.nlocvars,a_a.sizelocvars,
- nil,self.SHRT_MAX,"too many local variables")a_a.locvars[__a.nlocvars]={}
- a_a.locvars[__a.nlocvars].varname=dd;local b_a=__a.nlocvars;__a.nlocvars=__a.nlocvars+1;return b_a end
- function dc:new_localvarliteral(cd,dd,__a)self:new_localvar(cd,dd,__a)end
- function dc:new_localvar(cd,dd,__a)local a_a=cd.fs
- self:checklimit(a_a,a_a.nactvar+__a+1,self.LUAI_MAXVARS,"local variables")
- a_a.actvar[a_a.nactvar+__a]=self:registerlocalvar(cd,dd)end
- function dc:adjustlocalvars(cd,dd)local __a=cd.fs;__a.nactvar=__a.nactvar+dd
- for i=dd,1,-1 do self:getlocvar(__a,
- __a.nactvar-i).startpc=__a.pc end end
- function dc:removevars(cd,dd)local __a=cd.fs;while __a.nactvar>dd do __a.nactvar=__a.nactvar-1
- self:getlocvar(__a,__a.nactvar).endpc=__a.pc end end
- function dc:indexupvalue(cd,dd,__a)local a_a=cd.f
- for i=0,a_a.nups-1 do if cd.upvalues[i].k==__a.k and
- cd.upvalues[i].info==__a.info then
- assert(a_a.upvalues[i]==dd)return i end end
- self:checklimit(cd,a_a.nups+1,self.LUAI_MAXUPVALUES,"upvalues")
- self:growvector(cd.L,a_a.upvalues,a_a.nups,a_a.sizeupvalues,nil,self.MAX_INT,"")a_a.upvalues[a_a.nups]=dd
- assert(__a.k=="VLOCAL"or __a.k=="VUPVAL")cd.upvalues[a_a.nups]={k=__a.k,info=__a.info}
- local b_a=a_a.nups;a_a.nups=a_a.nups+1;return b_a end
- function dc:searchvar(cd,dd)for i=cd.nactvar-1,0,-1 do if dd==self:getlocvar(cd,i).varname then
- return i end end;return-1 end
- function dc:markupval(cd,dd)local __a=cd.bl
- while __a and __a.nactvar>dd do __a=__a.previous end;if __a then __a.upval=true end end
- function dc:singlevaraux(cd,dd,__a,a_a)
- if cd==nil then self:init_exp(__a,"VGLOBAL",bd.NO_REG)return
- "VGLOBAL"else local b_a=self:searchvar(cd,dd)
- if b_a>=0 then
- self:init_exp(__a,"VLOCAL",b_a)if a_a==0 then self:markupval(cd,b_a)end;return"VLOCAL"else
- if
- self:singlevaraux(cd.prev,dd,__a,0)=="VGLOBAL"then return"VGLOBAL"end;__a.info=self:indexupvalue(cd,dd,__a)__a.k="VUPVAL"
- return"VUPVAL"end end end
- function dc:singlevar(cd,dd)local __a=self:str_checkname(cd)local a_a=cd.fs
- if
- self:singlevaraux(a_a,__a,dd,1)=="VGLOBAL"then dd.info=ad:stringK(a_a,__a)end end
- function dc:adjust_assign(cd,dd,__a,a_a)local b_a=cd.fs;local c_a=dd-__a
- if self:hasmultret(a_a.k)then c_a=c_a+1;if c_a<=0 then
- c_a=0 end;ad:setreturns(b_a,a_a,c_a)if c_a>1 then
- ad:reserveregs(b_a,c_a-1)end else
- 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)
- ad:_nil(b_a,d_a,c_a)end end end
- function dc:enterlevel(cd)cd.L.nCcalls=cd.L.nCcalls+1;if
- cd.L.nCcalls>self.LUAI_MAXCCALLS then
- _d:lexerror(cd,"chunk has too many syntax levels",0)end end;function dc:leavelevel(cd)cd.L.nCcalls=cd.L.nCcalls-1 end
- function dc:enterblock(cd,dd,__a)
- dd.breaklist=ad.NO_JUMP;dd.isbreakable=__a;dd.nactvar=cd.nactvar;dd.upval=false;dd.previous=cd.bl
- cd.bl=dd;assert(cd.freereg==cd.nactvar)end
- function dc:leaveblock(cd)local dd=cd.bl;cd.bl=dd.previous
- self:removevars(cd.ls,dd.nactvar)
- if dd.upval then ad:codeABC(cd,"OP_CLOSE",dd.nactvar,0,0)end
- assert(not dd.isbreakable or not dd.upval)assert(dd.nactvar==cd.nactvar)
- cd.freereg=cd.nactvar;ad:patchtohere(cd,dd.breaklist)end
- function dc:pushclosure(cd,dd,__a)local a_a=cd.fs;local b_a=a_a.f
- 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
- self:init_exp(__a,"VRELOCABLE",ad:codeABx(a_a,"OP_CLOSURE",0,
- a_a.np-1))for i=0,dd.f.nups-1 do local c_a=
- (dd.upvalues[i].k=="VLOCAL")and"OP_MOVE"or"OP_GETUPVAL"
- ad:codeABC(a_a,c_a,0,dd.upvalues[i].info,0)end end
- function dc:open_func(cd,dd)local __a=cd.L;local a_a=self:newproto(cd.L)dd.f=a_a
- dd.prev=cd.fs;dd.ls=cd;dd.L=__a;cd.fs=dd;dd.pc=0;dd.lasttarget=-1;dd.jpc=ad.NO_JUMP
- dd.freereg=0;dd.nk=0;dd.np=0;dd.nlocvars=0;dd.nactvar=0;dd.bl=nil;a_a.source=cd.source
- a_a.maxstacksize=2;dd.h={}end
- function dc:close_func(cd)local dd=cd.L;local __a=cd.fs;local a_a=__a.f;self:removevars(cd,0)
- ad:ret(__a,0,0)a_a.sizecode=__a.pc;a_a.sizelineinfo=__a.pc;a_a.sizek=__a.nk
- a_a.sizep=__a.np;a_a.sizelocvars=__a.nlocvars;a_a.sizeupvalues=a_a.nups
- assert(__a.bl==nil)cd.fs=__a.prev;if __a then self:anchor_token(cd)end end
- function dc:parser(cd,dd,__a,a_a)local b_a={}b_a.t={}b_a.lookahead={}local c_a={}c_a.upvalues={}
- c_a.actvar={}cd.nCcalls=0;b_a.buff=__a;_d:setinput(cd,b_a,dd,a_a)
- self:open_func(b_a,c_a)c_a.f.is_vararg=self.VARARG_ISVARARG;_d:next(b_a)
- self:chunk(b_a)self:check(b_a,"TK_EOS")self:close_func(b_a)assert(
- c_a.prev==nil)assert(c_a.f.nups==0)assert(
- b_a.fs==nil)return c_a.f end
- function dc:field(cd,dd)local __a=cd.fs;local a_a={}ad:exp2anyreg(__a,dd)_d:next(cd)
- self:checkname(cd,a_a)ad:indexed(__a,dd,a_a)end
- function dc:yindex(cd,dd)_d:next(cd)self:expr(cd,dd)
- ad:exp2val(cd.fs,dd)self:checknext(cd,"]")end
- function dc:recfield(cd,dd)local __a=cd.fs;local a_a=cd.fs.freereg;local b_a,c_a={},{}
- if cd.t.token=="TK_NAME"then
- 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,"=")
- local d_a=ad:exp2RK(__a,b_a)self:expr(cd,c_a)
- ad:codeABC(__a,"OP_SETTABLE",dd.t.info,d_a,ad:exp2RK(__a,c_a))__a.freereg=a_a end
- function dc:closelistfield(cd,dd)if dd.v.k=="VVOID"then return end
- ad:exp2nextreg(cd,dd.v)dd.v.k="VVOID"if dd.tostore==bd.LFIELDS_PER_FLUSH then
- ad:setlist(cd,dd.t.info,dd.na,dd.tostore)dd.tostore=0 end end
- function dc:lastlistfield(cd,dd)if dd.tostore==0 then return end
- if self:hasmultret(dd.v.k)then
- ad:setmultret(cd,dd.v)ad:setlist(cd,dd.t.info,dd.na,self.LUA_MULTRET)dd.na=
- dd.na-1 else
- if dd.v.k~="VVOID"then ad:exp2nextreg(cd,dd.v)end;ad:setlist(cd,dd.t.info,dd.na,dd.tostore)end end
- function dc:listfield(cd,dd)self:expr(cd,dd.v)
- self:checklimit(cd.fs,dd.na,self.MAX_INT,"items in a constructor")dd.na=dd.na+1;dd.tostore=dd.tostore+1 end
- function dc:constructor(cd,dd)local __a=cd.fs;local a_a=cd.linenumber
- 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
- self:init_exp(dd,"VRELOCABLE",b_a)self:init_exp(c_a.v,"VVOID",0)
- ad:exp2nextreg(cd.fs,dd)self:checknext(cd,"{")
- repeat
- assert(c_a.v.k=="VVOID"or c_a.tostore>0)if cd.t.token=="}"then break end
- self:closelistfield(__a,c_a)local d_a=cd.t.token
- if d_a=="TK_NAME"then _d:lookahead(cd)
- if
- 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
- not self:testnext(cd,",")and not self:testnext(cd,";")self:check_match(cd,"}","{",a_a)
- self:lastlistfield(__a,c_a)
- bd:SETARG_B(__a.f.code[b_a],self:int2fb(c_a.na))
- bd:SETARG_C(__a.f.code[b_a],self:int2fb(c_a.nh))end
- function dc:parlist(cd)local dd=cd.fs;local __a=dd.f;local a_a=0;__a.is_vararg=0
- if cd.t.token~=")"then
- repeat
- local b_a=cd.t.token
- if b_a=="TK_NAME"then
- self:new_localvar(cd,self:str_checkname(cd),a_a)a_a=a_a+1 elseif b_a=="TK_DOTS"then _d:next(cd)
- self:new_localvarliteral(cd,"arg",a_a)a_a=a_a+1
- __a.is_vararg=self.VARARG_HASARG+self.VARARG_NEEDSARG;__a.is_vararg=__a.is_vararg+self.VARARG_ISVARARG else
- _d:syntaxerror(cd,
- "<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-
- (__a.is_vararg%self.HASARG_MASK)
- ad:reserveregs(dd,dd.nactvar)end
- function dc:body(cd,dd,__a,a_a)local b_a={}b_a.upvalues={}b_a.actvar={}self:open_func(cd,b_a)
- b_a.f.lineDefined=a_a;self:checknext(cd,"(")
- if __a then
- self:new_localvarliteral(cd,"self",0)self:adjustlocalvars(cd,1)end;self:parlist(cd)self:checknext(cd,")")
- self:chunk(cd)b_a.f.lastlinedefined=cd.linenumber
- self:check_match(cd,"TK_END","TK_FUNCTION",a_a)self:close_func(cd)self:pushclosure(cd,b_a,dd)end
- function dc:explist1(cd,dd)local __a=1;self:expr(cd,dd)
- while self:testnext(cd,",")do
- ad:exp2nextreg(cd.fs,dd)self:expr(cd,dd)__a=__a+1 end;return __a end
- 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
- if d_a=="("then if c_a~=
- cd.lastline then
- _d:syntaxerror(cd,"ambiguous syntax (function call x new statement)")end;_d:next(cd)if
- cd.t.token==")"then a_a.k="VVOID"else self:explist1(cd,a_a)
- ad:setmultret(__a,a_a)end
- self:check_match(cd,")","(",c_a)elseif d_a=="{"then self:constructor(cd,a_a)elseif d_a=="TK_STRING"then
- self:codestring(cd,a_a,cd.t.seminfo)_d:next(cd)else
- _d:syntaxerror(cd,"function arguments expected")return end;assert(dd.k=="VNONRELOC")local _aa=dd.info
- if
- self:hasmultret(a_a.k)then b_a=self.LUA_MULTRET else
- if a_a.k~="VVOID"then ad:exp2nextreg(__a,a_a)end;b_a=__a.freereg- (_aa+1)end
- 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
- function dc:prefixexp(cd,dd)local __a=cd.t.token
- if __a=="("then local a_a=cd.linenumber;_d:next(cd)
- self:expr(cd,dd)self:check_match(cd,")","(",a_a)
- ad:dischargevars(cd.fs,dd)elseif __a=="TK_NAME"then self:singlevar(cd,dd)else
- _d:syntaxerror(cd,"unexpected symbol")end;return end
- function dc:primaryexp(cd,dd)local __a=cd.fs;self:prefixexp(cd,dd)
- while true do local a_a=cd.t.token
- if
- a_a=="."then self:field(cd,dd)elseif a_a=="["then local b_a={}ad:exp2anyreg(__a,dd)
- self:yindex(cd,b_a)ad:indexed(__a,dd,b_a)elseif a_a==":"then local b_a={}_d:next(cd)
- self:checkname(cd,b_a)ad:_self(__a,dd,b_a)self:funcargs(cd,dd)elseif a_a=="("or
- a_a=="TK_STRING"or a_a=="{"then ad:exp2nextreg(__a,dd)
- self:funcargs(cd,dd)else return end end end
- function dc:simpleexp(cd,dd)local __a=cd.t.token
- if __a=="TK_NUMBER"then
- self:init_exp(dd,"VKNUM",0)dd.nval=cd.t.seminfo elseif __a=="TK_STRING"then
- self:codestring(cd,dd,cd.t.seminfo)elseif __a=="TK_NIL"then self:init_exp(dd,"VNIL",0)elseif __a=="TK_TRUE"then
- self:init_exp(dd,"VTRUE",0)elseif __a=="TK_FALSE"then self:init_exp(dd,"VFALSE",0)elseif __a=="TK_DOTS"then
- local a_a=cd.fs
- self:check_condition(cd,a_a.f.is_vararg~=0,"cannot use "..
- self:LUA_QL("...").." outside a vararg function")local b_a=a_a.f.is_vararg;if b_a>=self.VARARG_NEEDSARG then
- a_a.f.is_vararg=b_a-self.VARARG_NEEDSARG end
- 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
- _d:next(cd)self:body(cd,dd,false,cd.linenumber)return else
- self:primaryexp(cd,dd)return end;_d:next(cd)end
- 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
- return"OPR_NOUNOPR"end end
- 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]
- if dd then return dd else return"OPR_NOBINOPR"end end
- 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
- function dc:subexpr(cd,dd,__a)self:enterlevel(cd)
- local a_a=self:getunopr(cd.t.token)
- if a_a~="OPR_NOUNOPR"then _d:next(cd)
- 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)
- while
- b_a~="OPR_NOBINOPR"and self.priority[
- ad.BinOpr[b_a]+1][1]>__a do local c_a={}_d:next(cd)ad:infix(cd.fs,b_a,dd)
- local d_a=self:subexpr(cd,c_a,self.priority[
- 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
- function dc:block_follow(cd)
- if
- cd=="TK_ELSE"or cd=="TK_ELSEIF"or cd=="TK_END"or
- 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)
- self:chunk(cd)assert(__a.breaklist==ad.NO_JUMP)
- self:leaveblock(dd)end
- function dc:check_conflict(cd,dd,__a)
- local a_a=cd.fs;local b_a=a_a.freereg;local c_a=false
- while dd do
- if dd.v.k=="VINDEXED"then if dd.v.info==__a.info then
- c_a=true;dd.v.info=b_a end;if dd.v.aux==__a.info then c_a=true
- 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)
- ad:reserveregs(a_a,1)end end
- function dc:assignment(cd,dd,__a)local a_a={}local b_a=dd.v.k
- self:check_condition(cd,
- b_a=="VLOCAL"or b_a=="VUPVAL"or b_a=="VGLOBAL"or b_a=="VINDEXED","syntax error")
- if self:testnext(cd,",")then local c_a={}c_a.v={}c_a.prev=dd
- self:primaryexp(cd,c_a.v)
- if c_a.v.k=="VLOCAL"then self:check_conflict(cd,dd,c_a.v)end
- self:checklimit(cd.fs,__a,self.LUAI_MAXCCALLS-cd.L.nCcalls,"variables in assignment")self:assignment(cd,c_a,__a+1)else
- self:checknext(cd,"=")local c_a=self:explist1(cd,a_a)
- if c_a~=__a then
- self:adjust_assign(cd,__a,c_a,a_a)
- if c_a>__a then cd.fs.freereg=cd.fs.freereg- (c_a-__a)end else ad:setoneret(cd.fs,a_a)
- ad:storevar(cd.fs,dd.v,a_a)return end end
- self:init_exp(a_a,"VNONRELOC",cd.fs.freereg-1)ad:storevar(cd.fs,dd.v,a_a)end
- function dc:cond(cd)local dd={}self:expr(cd,dd)
- if dd.k=="VNIL"then dd.k="VFALSE"end;ad:goiftrue(cd.fs,dd)return dd.f end
- function dc:breakstat(cd)local dd=cd.fs;local __a=dd.bl;local a_a=false
- while __a and not __a.isbreakable do if
- __a.upval then a_a=true end;__a=__a.previous end
- if not __a then _d:syntaxerror(cd,"no loop to break")end
- if a_a then ad:codeABC(dd,"OP_CLOSE",__a.nactvar,0,0)end
- __a.breaklist=ad:concat(dd,__a.breaklist,ad:jump(dd))end
- function dc:whilestat(cd,dd)local __a=cd.fs;local a_a={}_d:next(cd)local b_a=ad:getlabel(__a)
- local c_a=self:cond(cd)self:enterblock(__a,a_a,true)
- self:checknext(cd,"TK_DO")self:block(cd)
- ad:patchlist(__a,ad:jump(__a),b_a)self:check_match(cd,"TK_END","TK_WHILE",dd)
- self:leaveblock(__a)ad:patchtohere(__a,c_a)end
- function dc:repeatstat(cd,dd)local __a=cd.fs;local a_a=ad:getlabel(__a)local b_a,c_a={},{}
- self:enterblock(__a,b_a,true)self:enterblock(__a,c_a,false)_d:next(cd)
- self:chunk(cd)self:check_match(cd,"TK_UNTIL","TK_REPEAT",dd)
- local d_a=self:cond(cd)
- if not c_a.upval then self:leaveblock(__a)
- ad:patchlist(cd.fs,d_a,a_a)else self:breakstat(cd)ad:patchtohere(cd.fs,d_a)
- 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
- ad:exp2nextreg(cd.fs,dd)return __a end
- function dc:forbody(cd,dd,__a,a_a,b_a)local c_a={}
- local d_a=cd.fs;self:adjustlocalvars(cd,3)
- self:checknext(cd,"TK_DO")local _aa=b_a and ad:codeAsBx(d_a,"OP_FORPREP",dd,ad.NO_JUMP)or
- ad:jump(d_a)
- self:enterblock(d_a,c_a,false)self:adjustlocalvars(cd,a_a)
- ad:reserveregs(d_a,a_a)self:block(cd)self:leaveblock(d_a)
- ad:patchtohere(d_a,_aa)
- local aaa=b_a and ad:codeAsBx(d_a,"OP_FORLOOP",dd,ad.NO_JUMP)or
- ad:codeABC(d_a,"OP_TFORLOOP",dd,0,a_a)ad:fixline(d_a,__a)
- ad:patchlist(d_a,b_a and aaa or ad:jump(d_a),_aa+1)end
- function dc:fornum(cd,dd,__a)local a_a=cd.fs;local b_a=a_a.freereg
- self:new_localvarliteral(cd,"(for index)",0)self:new_localvarliteral(cd,"(for limit)",1)
- self:new_localvarliteral(cd,"(for step)",2)self:new_localvar(cd,dd,3)self:checknext(cd,'=')
- self:exp1(cd)self:checknext(cd,",")self:exp1(cd)
- if
- self:testnext(cd,",")then self:exp1(cd)else
- 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
- function dc:forlist(cd,dd)local __a=cd.fs;local a_a={}local b_a=0;local c_a=__a.freereg
- self:new_localvarliteral(cd,"(for generator)",b_a)b_a=b_a+1
- self:new_localvarliteral(cd,"(for state)",b_a)b_a=b_a+1
- 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
- self:testnext(cd,",")do
- self:new_localvar(cd,self:str_checkname(cd),b_a)b_a=b_a+1 end
- self:checknext(cd,"TK_IN")local d_a=cd.linenumber
- self:adjust_assign(cd,3,self:explist1(cd,a_a),a_a)ad:checkstack(__a,3)
- self:forbody(cd,c_a,d_a,b_a-3,false)end
- function dc:forstat(cd,dd)local __a=cd.fs;local a_a={}self:enterblock(__a,a_a,true)
- _d:next(cd)local b_a=self:str_checkname(cd)local c_a=cd.t.token
- if c_a=="="then
- self:fornum(cd,b_a,dd)elseif c_a==","or c_a=="TK_IN"then self:forlist(cd,b_a)else
- _d:syntaxerror(cd,
- self:LUA_QL("=").." or "..self:LUA_QL("in").." expected")end;self:check_match(cd,"TK_END","TK_FOR",dd)
- self:leaveblock(__a)end
- function dc:test_then_block(cd)_d:next(cd)local dd=self:cond(cd)
- self:checknext(cd,"TK_THEN")self:block(cd)return dd end
- function dc:ifstat(cd,dd)local __a=cd.fs;local a_a=ad.NO_JUMP;local b_a=self:test_then_block(cd)
- while
- cd.t.token=="TK_ELSEIF"do a_a=ad:concat(__a,a_a,ad:jump(__a))
- ad:patchtohere(__a,b_a)b_a=self:test_then_block(cd)end;if cd.t.token=="TK_ELSE"then
- a_a=ad:concat(__a,a_a,ad:jump(__a))ad:patchtohere(__a,b_a)_d:next(cd)self:block(cd)else
- a_a=ad:concat(__a,a_a,b_a)end
- ad:patchtohere(__a,a_a)self:check_match(cd,"TK_END","TK_IF",dd)end
- function dc:localfunc(cd)local dd,__a={},{}local a_a=cd.fs
- self:new_localvar(cd,self:str_checkname(cd),0)self:init_exp(dd,"VLOCAL",a_a.freereg)
- ad:reserveregs(a_a,1)self:adjustlocalvars(cd,1)
- self:body(cd,__a,false,cd.linenumber)ad:storevar(a_a,dd,__a)
- self:getlocvar(a_a,a_a.nactvar-1).startpc=a_a.pc end
- function dc:localstat(cd)local dd=0;local __a;local a_a={}
- repeat
- 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"
- __a=0 end
- self:adjust_assign(cd,dd,__a,a_a)self:adjustlocalvars(cd,dd)end
- function dc:funcname(cd,dd)local __a=false;self:singlevar(cd,dd)while cd.t.token=="."do
- self:field(cd,dd)end
- if cd.t.token==":"then __a=true;self:field(cd,dd)end;return __a end
- function dc:funcstat(cd,dd)local __a,a_a={},{}_d:next(cd)local b_a=self:funcname(cd,__a)
- self:body(cd,a_a,b_a,dd)ad:storevar(cd.fs,__a,a_a)ad:fixline(cd.fs,dd)end
- function dc:exprstat(cd)local dd=cd.fs;local __a={}__a.v={}self:primaryexp(cd,__a.v)
- if
- __a.v.k=="VCALL"then bd:SETARG_C(ad:getcode(dd,__a.v),1)else __a.prev=
- nil;self:assignment(cd,__a,1)end end
- function dc:retstat(cd)local dd=cd.fs;local __a={}local a_a,b_a;_d:next(cd)
- if
- self:block_follow(cd.t.token)or cd.t.token==";"then a_a,b_a=0,0 else
- b_a=self:explist1(cd,__a)
- if self:hasmultret(__a.k)then ad:setmultret(dd,__a)if
- __a.k=="VCALL"and b_a==1 then
- bd:SET_OPCODE(ad:getcode(dd,__a),"OP_TAILCALL")
- assert(bd:GETARG_A(ad:getcode(dd,__a))==dd.nactvar)end
- a_a=dd.nactvar;b_a=self.LUA_MULTRET else
- if b_a==1 then a_a=ad:exp2anyreg(dd,__a)else
- 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
- function dc:statement(cd)local dd=cd.linenumber;local __a=cd.t.token
- if __a=="TK_IF"then
- self:ifstat(cd,dd)return false elseif __a=="TK_WHILE"then self:whilestat(cd,dd)return false elseif __a=="TK_DO"then
- _d:next(cd)self:block(cd)
- 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
- self:repeatstat(cd,dd)return false elseif __a=="TK_FUNCTION"then self:funcstat(cd,dd)return false elseif
- __a=="TK_LOCAL"then _d:next(cd)if self:testnext(cd,"TK_FUNCTION")then
- self:localfunc(cd)else self:localstat(cd)end
- return false elseif __a=="TK_RETURN"then self:retstat(cd)return true elseif __a=="TK_BREAK"then
- _d:next(cd)self:breakstat(cd)return true else self:exprstat(cd)return false end end
- function dc:chunk(cd)local dd=false;self:enterlevel(cd)
- while not dd and not
- self:block_follow(cd.t.token)do dd=self:statement(cd)
- self:testnext(cd,";")
- assert(cd.fs.f.maxstacksize>=cd.fs.freereg and
- cd.fs.freereg>=cd.fs.nactvar)cd.fs.freereg=cd.fs.nactvar end;self:leavelevel(cd)end;return dc end;_c=_c()
- local ac=function()local dc={}local _d=cb;dc.LUA_SIGNATURE="\27Lua"dc.LUA_TNUMBER=3
- dc.LUA_TSTRING=4;dc.LUA_TNIL=0;dc.LUA_TBOOLEAN=1;dc.LUA_TNONE=-1;dc.LUAC_VERSION=0x51
- dc.LUAC_FORMAT=0;dc.LUAC_HEADERSIZE=12
- function dc:make_setS()local ad={}ad.data=""
- local bd=function(cd,dd)if not cd then return 0 end;dd.data=
- dd.data..cd;return 0 end;return bd,ad end
- function dc:ttype(ad)local bd=type(ad.value)
- if bd=="number"then return self.LUA_TNUMBER elseif bd=="string"then return
- self.LUA_TSTRING elseif bd=="nil"then return self.LUA_TNIL elseif bd=="boolean"then return self.LUA_TBOOLEAN else return
- self.LUA_TNONE end end
- function dc:from_double(ad)
- 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==
- 1 /0 then dd,__a=0,2047 else
- dd=(dd*2 -1)*math.ldexp(0.5,53)__a=__a+1022 end
- 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(
- __a*16 +ad)a_a=a_a..b_a
- ad,b_a=bd(cd*128 +ad)a_a=a_a..b_a;return a_a end
- function dc:from_int(ad)local bd=""ad=math.floor(ad)
- if ad<0 then ad=4294967296 +ad end;for i=1,4 do local cd=ad%256;bd=bd..string.char(cd)
- ad=math.floor(ad/256)end;return bd end;function dc:DumpBlock(ad,bd)
- if bd.status==0 then bd.status=bd.write(ad,bd.data)end end;function dc:DumpChar(ad,bd)
- self:DumpBlock(string.char(ad),bd)end;function dc:DumpInt(ad,bd)
- self:DumpBlock(self:from_int(ad),bd)end;function dc:DumpNumber(ad,bd)
- self:DumpBlock(self:from_double(ad),bd)end
- function dc:DumpString(ad,bd)if ad==nil then
- self:DumpInt(0,bd)else ad=ad.."\0"self:DumpInt(#ad,bd)
- self:DumpBlock(ad,bd)end end
- function dc:DumpCode(ad,bd)local cd=ad.sizecode;self:DumpInt(cd,bd)for i=0,cd-1 do
- self:DumpBlock(_d:Instruction(ad.code[i]),bd)end end
- function dc:DumpConstants(ad,bd)local cd=ad.sizek;self:DumpInt(cd,bd)
- for i=0,cd-1 do local dd=ad.k[i]
- local __a=self:ttype(dd)self:DumpChar(__a,bd)
- if __a==self.LUA_TNIL then elseif __a==self.LUA_TBOOLEAN then self:DumpChar(
- dd.value and 1 or 0,bd)elseif
- __a==self.LUA_TNUMBER then self:DumpNumber(dd.value,bd)elseif __a==self.LUA_TSTRING then
- self:DumpString(dd.value,bd)else end end;cd=ad.sizep;self:DumpInt(cd,bd)for i=0,cd-1 do
- self:DumpFunction(ad.p[i],ad.source,bd)end end
- function dc:DumpDebug(ad,bd)local cd;cd=bd.strip and 0 or ad.sizelineinfo
- self:DumpInt(cd,bd)
- for i=0,cd-1 do self:DumpInt(ad.lineinfo[i],bd)end;cd=bd.strip and 0 or ad.sizelocvars
- self:DumpInt(cd,bd)for i=0,cd-1 do
- self:DumpString(ad.locvars[i].varname,bd)self:DumpInt(ad.locvars[i].startpc,bd)
- self:DumpInt(ad.locvars[i].endpc,bd)end;cd=
- bd.strip and 0 or ad.sizeupvalues;self:DumpInt(cd,bd)
- for i=0,cd-1
- do self:DumpString(ad.upvalues[i],bd)end end
- function dc:DumpFunction(ad,bd,cd)local dd=ad.source;if dd==bd or cd.strip then dd=nil end
- self:DumpString(dd,cd)self:DumpInt(ad.lineDefined,cd)
- self:DumpInt(ad.lastlinedefined,cd)self:DumpChar(ad.nups,cd)
- self:DumpChar(ad.numparams,cd)self:DumpChar(ad.is_vararg,cd)
- self:DumpChar(ad.maxstacksize,cd)self:DumpCode(ad,cd)self:DumpConstants(ad,cd)
- self:DumpDebug(ad,cd)end
- function dc:DumpHeader(ad)local bd=self:header()
- assert(#bd==self.LUAC_HEADERSIZE)self:DumpBlock(bd,ad)end;function dc:header()local ad=1
- return self.LUA_SIGNATURE..
- string.char(self.LUAC_VERSION,self.LUAC_FORMAT,ad,4,4,4,8,0)end
- function dc:dump(ad,bd,cd,dd,__a)local a_a={}
- a_a.L=ad;a_a.write=cd;a_a.data=dd;a_a.strip=__a;a_a.status=0
- self:DumpHeader(a_a)self:DumpFunction(bd,nil,a_a)
- a_a.write(nil,a_a.data)return a_a.status end;return dc end;ac=ac()
- local bc=function()local dc
- 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"}
- 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"}
- local function bd(a_a,b_a,c_a)
- if c_a then local d_a=0;local _aa=0
- 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
- (a_a% (d_a+d_a)>=d_a)and 1 or 0 end end
- 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
- do function caa()
- local dba=a_a:byte(b_a,b_a)b_a=b_a+1;return dba end
- function daa()
- local dba,_ca,aca,bca=a_a:byte(b_a,b_a+3)b_a=b_a+4;return
- bca*16777216 +aca*65536 +_ca*256 +dba end
- function _ba()local dba=daa()local _ca=daa()return _ca*4294967296 +dba end;function aba()local dba=daa()local _ca=daa()
- return(-2 *bd(_ca,32)+1)*
- (2 ^ (bd(_ca,21,31)-1023))* (
- (bd(_ca,1,20)* (2 ^32)+dba)/ (2 ^52)+1)end
- function bba(dba)
- local _ca
- 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
- return end;_ca=a_a:sub(b_a,b_a+dba-1)b_a=b_a+dba end;return _ca end end
- local function cba()local dba;local _ca={}local aca={}local bca={}local cca={lines={}}
- 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,
- -2)end;dba.upvalues=caa()
- dba.arguments=caa()dba.varg=caa()dba.stack=caa()
- do dca=aaa()
- for i=1,dca do local _da={}local ada=daa()
- local bda=bd(ada,1,6)local cda=_d[bda+1]_da.opcode=bda;_da.type=cda;_da.A=bd(ada,7,14)
- if
- cda=="ABC"then _da.B=bd(ada,24,32)_da.C=bd(ada,15,23)elseif cda=="ABx"then
- _da.Bx=bd(ada,15,32)elseif cda=="AsBx"then _da.sBx=bd(ada,15,32)-131071 end;_ca[i]=_da end end
- do dca=aaa()
- for i=1,dca do local _da={}local ada=caa()_da.type=ada
- if ada==1 then _da.data=(caa()~=0)elseif
- 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
- do
- local _da=cca.lines;dca=aaa()for i=1,dca do _da[i]=daa()end;dca=aaa()for i=1,dca do
- bba():sub(1,-2)daa()daa()end;dca=aaa()for i=1,dca do bba()end end;return dba end
- do
- assert(bba(4)=="\27Lua","Lua bytecode expected.")
- 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
- error("Unsupported bytecode target platform")end;if _aa==4 then baa=daa elseif _aa==8 then baa=_ba else
- error("Unsupported bytecode target platform")end
- assert(bba(3)=="\4\8\0","Unsupported bytecode target platform")end;return cba()end
- local function dd(...)local a_a=select("#",...)local b_a={...}return a_a,b_a end
- 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
- local daa=1;local _ba,aba
- local bba={[0]=function(aca)aaa[aca.A]=aaa[aca.B]end,[1]=function(aca)
- aaa[aca.A]=d_a[aca.Bx].data end,[2]=function(aca)aaa[aca.A]=aca.B~=0
- if aca.C~=0 then daa=daa+1 end end,[3]=function(aca)local bca=aaa
- 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)
- local bca=d_a[aca.Bx].data;aaa[aca.A]=caa[bca]end,[6]=function(aca)local bca=aca.C
- local cca=aaa
- bca=bca>255 and d_a[bca-256].data or cca[bca]cca[aca.A]=cca[aca.B][bca]end,[7]=function(aca)
- local bca=d_a[aca.Bx].data;caa[bca]=aaa[aca.A]end,[8]=function(aca)
- 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
- _da[bca-256].data or dca[bca]
- cca=cca>255 and _da[
- cca-256].data or dca[cca]dca[aca.A][bca]=cca end,[10]=function(aca)
- 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]
- dca=
- dca>255 and d_a[dca-256].data or _da[dca]_da[bca+1]=cca;_da[bca]=cca[dca]end,[12]=function(aca)
- local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
- dca[bca]cca=
- cca>255 and _da[cca-256].data or dca[cca]
- dca[aca.A]=bca+cca end,[13]=function(aca)
- local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
- dca[bca]cca=
- cca>255 and _da[cca-256].data or dca[cca]
- dca[aca.A]=bca-cca end,[14]=function(aca)
- local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
- dca[bca]cca=
- cca>255 and _da[cca-256].data or dca[cca]
- dca[aca.A]=bca*cca end,[15]=function(aca)
- local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
- dca[bca]cca=
- cca>255 and _da[cca-256].data or dca[cca]
- dca[aca.A]=bca/cca end,[16]=function(aca)
- local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
- dca[bca]cca=
- cca>255 and _da[cca-256].data or dca[cca]
- dca[aca.A]=bca%cca end,[17]=function(aca)
- local bca=aca.B;local cca=aca.C;local dca,_da=aaa,d_a;bca=bca>255 and _da[bca-256].data or
- dca[bca]cca=
- cca>255 and _da[cca-256].data or dca[cca]
- dca[aca.A]=bca^cca end,[18]=function(aca)aaa[aca.A]=
- -aaa[aca.B]end,[19]=function(aca)
- aaa[aca.A]=not aaa[aca.B]end,[20]=function(aca)aaa[aca.A]=#aaa[aca.B]end,[21]=function(aca)
- local bca=aca.B;local cca=aaa[bca]for i=bca+1,aca.C do cca=cca..aaa[i]end
- aaa[aca.A]=cca end,[22]=function(aca)daa=daa+aca.sBx end,[23]=function(aca)
- 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
- ada[cca-256].data or _da[cca]
- dca=dca>255 and ada[
- dca-256].data or _da[dca]if(cca==dca)~=bca then daa=daa+1 end end,[24]=function(aca)
- 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
- ada[cca-256].data or _da[cca]
- dca=dca>255 and ada[
- dca-256].data or _da[dca]if(cca<dca)~=bca then daa=daa+1 end end,[25]=function(aca)
- 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
- ada[cca-256].data or _da[cca]
- dca=dca>255 and ada[
- dca-256].data or _da[dca]if(cca<=dca)~=bca then daa=daa+1 end end,[26]=function(aca)if
- aaa[aca.A]== (aca.C~=0)then daa=daa+1 end end,[27]=function(aca)
- local bca=aaa;local cca=bca[aca.B]
- if cca== (aca.C~=0)then daa=daa+1 else bca[aca.A]=cca end end,[28]=function(aca)local bca=aca.A
- local cca=aca.B;local dca=aca.C;local _da=aaa;local ada,bda;local cda,dda;ada={}
- if cca~=1 then
- 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,
- cda-bca)))else
- cda,bda=dd(_da[bca]())end;baa=bca-1
- if dca~=1 then
- 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)
- local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da=aaa;local ada,bda;local cda,dda,__b=baa;ada={}
- if cca~=1 then if cca~=0 then
- dda=bca+cca-1 else dda=cda end;__b=0;for i=bca+1,dda do __b=__b+1
- ada[#ada+1]=_da[i]end
- bda={_da[bca](unpack(ada,1,dda-bca))}else bda={_da[bca]()}end;return true,bda end,[30]=function(aca)
- 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=
- bca+cca-2 end;bda={}local cda=0;for i=bca,_da do cda=cda+1
- bda[cda]=dca[i]end;return true,bda end,[31]=function(aca)
- local bca=aca.A;local cca=aaa;local dca=cca[bca+2]local _da=cca[bca]+dca;cca[bca]=_da;if dca>0 then
- if _da<=cca[
- bca+1]then daa=daa+aca.sBx;cca[bca+3]=_da end else
- if _da>=cca[bca+1]then daa=daa+aca.sBx;cca[bca+3]=_da end end end,[32]=function(aca)
- local bca=aca.A;local cca=aaa;cca[bca]=cca[bca]-cca[bca+2]
- daa=daa+aca.sBx end,[33]=function(aca)local bca=aca.A;local cca=aca.B
- local dca=aca.C;local _da=aaa;local ada=bca+2
- 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[
- bca+3]else daa=daa+1 end end,[34]=function(aca)
- local bca=aca.A;local cca=aca.B;local dca=aca.C;local _da=aaa
- if dca==0 then
- 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[
- bca+i]end end end,[35]=function(aca)
- end,[36]=function(aca)local bca=_aa[aca.Bx]local cca=c_a;local dca=aaa;local _da={}
- local ada=setmetatable({},{__index=function(dda,__b)
- local a_b=_da[__b]return a_b.segment[a_b.offset]end,__newindex=function(dda,__b,a_b)
- local b_b=_da[__b]b_b.segment[b_b.offset]=a_b end})
- for i=1,bca.upvalues do local dda=cca[daa]
- if dda.opcode==0 then
- _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)
- 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[
- i-bca]end end}
- local function cba()local aca=c_a;local bca,cca,dca;while true do bca=aca[daa]daa=daa+1
- cca,dca=bba[bca.opcode](bca)if cca then return dca end end end
- local dba={get_stack=function()return aaa end,get_IP=function()return daa end}
- local function _ca(...)local aca={}local bca={}baa=-1
- aaa=setmetatable(aca,{__index=bca,__newindex=function(bda,cda,dda)if cda>baa and dda then baa=cda end
- bca[cda]=dda end})local cca={...}_ba={}aba=select("#",...)-1;for i=0,aba do aca[i]=cca[i+1]_ba[i]=cca[
- i+1]end;caa=getfenv()daa=1
- local dca=coroutine.create(cba)local _da,ada=coroutine.resume(dca)
- if _da then
- if ada then return unpack(ada)end;return else
- if dc then else local bda=a_a.name;local cda=a_a.debug.lines[daa]
- local dda=ada:gsub("(.-:)","")local __b=""__b=__b.. (bda and bda..":"or"")__b=__b.. (cda and cda..
- ":"or"")__b=__b..ada
- error(__b,0)end end end;return dba,_ca end
- return
- {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)
- local b_a=cd(a_a)return __a(b_a)end}}end;bc=bc()bb:init()local cc={}
- function Lua(dc,_d)local ad,bd,cd
- local dd,__a=pcall(function()dc=ab:_(dc)
- local a_a=ab:init(ab:make_getS(dc),nil)if not a_a then return error()end
- local b_a=_c:parser(cc,a_a,nil,"@input")bd,cd=ac:make_setS()ac:dump(cc,b_a,bd,cd)
- 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