From 6a35c7253ba161c50a18ecc86e46d0b3ead9a2a0 Mon Sep 17 00:00:00 2001 From: kramm Date: Tue, 6 Jan 2009 21:37:02 +0000 Subject: [PATCH] convert integers to float if they're too large --- lib/as3/tokenizer.lex | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 4647d30..d2e277c 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,8 +325,10 @@ 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;t8) - 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 +488,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);} -- 1.7.10.4