X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Ftokenizer.lex;h=d2e277c91029c34c3d9287c439aafb04af5bcb11;hb=6a35c7253ba161c50a18ecc86e46d0b3ead9a2a0;hp=3ed3b6b09a72d801f8ab623e38f15c5dd04a04d0;hpb=9b2965dda762f2cf28b52ca9bad86eefe0836b52;p=swftools.git diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 3ed3b6b..d2e277c 100644 --- a/lib/as3/tokenizer.lex +++ b/lib/as3/tokenizer.lex @@ -129,16 +129,13 @@ void handleInclude(char*text, int len, char quotes) //BEGIN(INITIAL); keep context } -string_t string_unescape(const char*in, int l) +static int do_unescape(const char*s, const char*end, char*n) { - int len=0; - const char*s = in; - const char*end = &in[l]; - char*n = (char*)malloc(l); char*o = n; + int len=0; while(s256) syntaxerror("octal number out of range (0-255): %d", num); - o[len++] = num; + if(o) o[len] = num;len++; continue; } case 'x': case 'u': { @@ -214,12 +211,12 @@ string_t string_unescape(const char*in, int l) if(unicode) { char*utf8 = getUTF8(num); while(*utf8) { - o[len++] = *utf8++; + if(o) o[len] = *utf8;utf8++;len++; } } else { if(num>256) syntaxerror("byte out of range (0-255): %d", num); - o[len++] = num; + if(o) o[len] = num;len++; } break; } @@ -227,8 +224,19 @@ string_t string_unescape(const char*in, int l) syntaxerror("unknown escape sequence: \"\\%c\"", *s); } } + if(o) o[len]=0; + return len; +} + +static string_t string_unescape(const char*in, int l) +{ + const char*s = in; + const char*end = &in[l]; + + int len = do_unescape(s, end, 0); + char*n = (char*)malloc(len+1); + do_unescape(s, end, n); string_t out = string_new(n, len); - o[len]=0; return out; } @@ -298,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() { @@ -312,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); @@ -464,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);} @@ -497,6 +522,7 @@ native {c();return m(KW_NATIVE);} static {c();return m(KW_STATIC);} import {c();return m(KW_IMPORT);} typeof {c();return m(KW_TYPEOF);} +throw {c();return m(KW_THROW);} class {c();return m(KW_CLASS);} const {c();return m(KW_CONST);} catch {c();return m(KW_CATCH);} @@ -504,11 +530,13 @@ final {c();return m(KW_FINAL);} false {c();return m(KW_FALSE);} break {c();return m(KW_BREAK);} super {c();return m(KW_SUPER);} +each {c();return m(KW_EACH);} void {c();return m(KW_VOID);} 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);} @@ -516,6 +544,7 @@ set {c();return m(KW_SET);} var {c();return m(KW_VAR);} try {c();return m(KW_TRY);} is {c();return m(KW_IS) ;} +in {c();return m(KW_IN) ;} if {c();return m(KW_IF) ;} as {c();return m(KW_AS);} {NAME} {c();BEGIN(INITIAL);return mkid(T_IDENTIFIER);}