X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=lib%2Fas3%2Fparser.y;h=85304ee575f753d822138dcb63d900629a4ddecf;hb=486b321557df1a1342fc93b38c05e7c83da3d7ed;hp=82d47fb066e4774218a838d9f2b62045f001c524;hpb=6f85c5198bbc7c27d0a868a25b23215fd4795c83;p=swftools.git diff --git a/lib/as3/parser.y b/lib/as3/parser.y index 82d47fb..85304ee 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -87,6 +87,7 @@ %token KW_SET "set" %token KW_VOID "void" %token KW_STATIC +%token KW_INSTANCEOF "instanceof" %token KW_IMPORT "import" %token KW_RETURN "return" %token KW_TYPEOF "typeof" @@ -293,7 +294,7 @@ DECLARE_LIST(state); namespace_t m##_ns;\ registry_fill_multiname(&m, &m##_ns, x); -#define MEMBER_MULTINAME(m,f) \ +#define MEMBER_MULTINAME(m,f,n) \ multiname_t m;\ namespace_t m##_ns;\ if(f) { \ @@ -307,7 +308,7 @@ DECLARE_LIST(state); m.type = MULTINAME; \ m.ns =0; \ m.namespace_set = &nopackage_namespace_set; \ - m.name = f->name; \ + m.name = n; \ } /* warning: list length of namespace set is undefined */ @@ -526,8 +527,9 @@ static void startclass(int flags, char*classname, classinfo_t*extends, classinfo state->cls->abc = abc_class_new(global->file, &classname2, extends2); if(flags&FLAG_FINAL) abc_class_final(state->cls->abc); - if(flags&FLAG_DYNAMIC) abc_class_sealed(state->cls->abc); + if(!(flags&FLAG_DYNAMIC)) abc_class_sealed(state->cls->abc); if(interface) abc_class_interface(state->cls->abc); + abc_class_protectedNS(state->cls->abc, classname); for(mlist=implements;mlist;mlist=mlist->next) { MULTINAME(m, mlist->classinfo); @@ -1243,6 +1245,8 @@ IF : "if" '(' {new_state();} EXPRESSION ')' CODEBLOCK MAYBEELSE { myif->branch = $$ = abc_label($$); if($7) { $$ = code_append($$, $7); + // might use a nop here too, depending on whether + // the code $7 reaches the end or not myjmp->branch = $$ = abc_label($$); } @@ -1256,7 +1260,7 @@ FOR_INIT : VOIDEXPRESSION FOR : "for" '(' {new_state();} FOR_INIT ';' EXPRESSION ';' VOIDEXPRESSION ')' CODEBLOCK { $$ = code_new(); $$ = code_append($$, $4); - code_t*loopstart = $$ = abc_label($$); + code_t*loopstart = $$ = abc_nop($$); $$ = code_append($$, $6.c); code_t*myif = $$ = abc_iffalse($$, 0); $$ = code_append($$, $10); @@ -1271,13 +1275,14 @@ FOR : "for" '(' {new_state();} FOR_INIT ';' EXPRESSION ';' VOIDEXPRESSION ')' CO WHILE : "while" '(' {new_state();} EXPRESSION ')' CODEBLOCK { $$ = code_new(); + code_t*myjmp = $$ = abc_jump($$, 0); code_t*loopstart = $$ = abc_label($$); $$ = code_append($$, $6); - myjmp->branch = $$ = abc_label($$); + myjmp->branch = $$ = abc_nop($$); $$ = code_append($$, $4.c); $$ = abc_iftrue($$, loopstart); - code_t*out = $$ = abc_label($$); + code_t*out = $$ = abc_nop($$); breakjumpsto($$, out); $$ = killvars($$);old_state(); @@ -1891,6 +1896,12 @@ E : E "as" E {char use_astype=0; // flash player's astype works differently than } } +E : E "instanceof" E + {$$.c = code_append($1.c, $3.c); + $$.c = abc_instanceof($$.c); + $$.t = TYPE_BOOLEAN; + } + E : E "is" E {$$.c = code_append($1.c, $3.c); $$.c = abc_istypelate($$.c); $$.t = TYPE_BOOLEAN; @@ -2081,7 +2092,7 @@ E : "super" '.' T_IDENTIFIER memberinfo_t*f = registry_findmember(t, $3); namespace_t ns = {flags2access(f->flags), ""}; - MEMBER_MULTINAME(m, f); + MEMBER_MULTINAME(m, f, $3); $$.c = 0; $$.c = abc_getlocal_0($$.c); $$.c = abc_getsuper2($$.c, &m); @@ -2104,7 +2115,7 @@ E : E '.' T_IDENTIFIER if(f && f->slot && !noslot) { $$.c = abc_getslot($$.c, f->slot); } else { - MEMBER_MULTINAME(m, f); + MEMBER_MULTINAME(m, f, $3); $$.c = abc_getproperty2($$.c, &m); } /* determine type */