X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Ftokenizer.lex;h=47dc605512f580dc797cd5a9dc090ac5b9320b79;hb=aaf7a97f44b72dc94bb1139654ef089240fea994;hp=45c09a8ef5abd8639572755f40bd0fd9e88bd335;hpb=80135f60d8e1f3ffd8270060ab9edb7a224425ea;p=swftools.git diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 45c09a8..47dc605 100644 --- a/lib/as3/tokenizer.lex +++ b/lib/as3/tokenizer.lex @@ -306,6 +306,11 @@ static inline int setuint(unsigned int v) else return T_UINT; } +static inline int setfloat(double v) +{ + avm2_lval.number_float = v; + return T_FLOAT; +} static inline int handlefloat() { @@ -320,13 +325,17 @@ static inline int handleint() char l = (yytext[0]=='-'); char*max = l?"1073741824":"2147483647"; - if(yyleng-l>10) - syntaxerror("integer overflow"); + if(yyleng-l>10) { + warning("integer overflow: %s", s); + return handlefloat(); + } if(yyleng-l==10) { int t; for(t=0;tmax[t]) - syntaxerror("integer overflow %s > %s", s+l,max); + if(yytext[l+t]>max[t]) { + warning("integer overflow: %s", s); + return handlefloat(); + } else if(yytext[l+t]8) - syntaxerror("integer overflow"); + if(yyleng-l>8) { + char*s = nrbuf(); + syntaxerror("integer overflow %s", s); + } + int t; unsigned int v = 0; for(t=l;t='A' && c<='F') v|=(c&0x0f)+9; } - if(l && v>1073741824) - syntaxerror("signed integer overflow"); - if(!l && v>2147483647) - syntaxerror("unsigned integer overflow"); + if(l && v>1073741824) { + char*s = nrbuf(); + warning("signed integer overflow: %s", s); + return setfloat(v); + } + if(!l && v>2147483647) { + char*s = nrbuf(); + warning("unsigned integer overflow: %s", s); + return setfloat(v); + } if(l==3) { return setint(-(int)v); @@ -472,6 +490,7 @@ switch {c();avm2_lval.id="";return T_SWITCH;} [/][=] {c();return m(T_DIVBY);} [%][=] {c();return m(T_MODBY);} [*][=] {c();return m(T_MULBY);} +[|][=] {c();return m(T_ORBY);} [>][>][=] {c();return m(T_SHRBY);} [<][<][=] {c();return m(T_SHLBY);} [>][>][>][=] {c();return m(T_USHRBY);} @@ -519,6 +538,7 @@ true {c();return m(KW_TRUE);} null {c();return m(KW_NULL);} else {c();return m(KW_ELSE);} case {c();return m(KW_CASE);} +with {c();return m(KW_WITH);} use {c();return m(KW_USE);} new {c();return m(KW_NEW);} get {c();return m(KW_GET);}