X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;ds=inline;f=lib%2Fas3%2Fparser.y;h=000680cea65e69fb93ad00433f2fcacf944d1ab9;hb=e93f2e3f38277d48fc4204ab6c7bdb9386ec4c6b;hp=152a0012fce2ad99d8bb175bbb0c5fb546dc9df6;hpb=264d24eab52421606f62c73b4a7e9bdd543b9165;p=swftools.git diff --git a/lib/as3/parser.y b/lib/as3/parser.y index 152a001..000680c 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -666,6 +666,8 @@ void breakjumpsto(code_t*c, code_t*jump) } code_t*converttype(code_t*c, class_signature_t*from, class_signature_t*to) { + if(from==to) + return c; if(!to) { /*TODO: can omit this if from is zero? */ return abc_coerce_a(c); @@ -1010,23 +1012,27 @@ E : E "!=" E {$$.c = code_append($1.c,$3.c);$$.c = abc_equals($$.c);$$.c = abc_n $$.t = TYPE_BOOLEAN; } -E : E "||" E {$$.c = $1.c; - $$.c=abc_dup($$.c); +E : E "||" E {$$.t = join_types($1.t, $3.t, 'O'); + $$.c = $1.c; + $$.c = converttype($$.c, $1.t, $$.t); + $$.c = abc_dup($$.c); code_t*jmp = $$.c = abc_iftrue($$.c, 0); - $$.c=abc_pop($$.c); + $$.c = abc_pop($$.c); $$.c = code_append($$.c,$3.c); + $$.c = converttype($$.c, $1.t, $$.t); code_t*label = $$.c = abc_label($$.c); jmp->branch = label; - $$.t = join_types($1.t, $3.t, 'O'); } -E : E "&&" E {$$.c = $1.c; - $$.c=abc_dup($$.c); +E : E "&&" E {$$.t = join_types($1.t, $3.t, 'A'); + $$.c = $1.c; + $$.c = converttype($$.c, $1.t, $$.t); + $$.c = abc_dup($$.c); code_t*jmp = $$.c = abc_iffalse($$.c, 0); - $$.c=abc_pop($$.c); + $$.c = abc_pop($$.c); $$.c = code_append($$.c,$3.c); + $$.c = converttype($$.c, $1.t, $$.t); code_t*label = $$.c = abc_label($$.c); - jmp->branch = label; - $$.t = join_types($1.t, $3.t, 'A'); + jmp->branch = label; } E : '!' E {$$.c=$2.c;