X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fparser.y;h=c64fb41d6757a50367855a9ac4bf38b4d28a8949;hb=2daadb492b21a94a54c73b0d524b636d3e9da009;hp=4b533c89c61a0aee6cc4c1d2d5074897326077e2;hpb=5d26b457da36bed1528830b46ba6107929730e2d;p=swftools.git diff --git a/lib/as3/parser.y b/lib/as3/parser.y index 4b533c8..c64fb41 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -636,7 +636,7 @@ void breakjumpsto(code_t*c, code_t*jump) while(c->prev) c=c->prev; while(c) { - if(c->opcode == OPCODE_BREAK) { + if(c->opcode == OPCODE___BREAK__) { c->opcode = OPCODE_JUMP; c->branch = jump; } @@ -645,8 +645,19 @@ void breakjumpsto(code_t*c, code_t*jump) } code_t*converttype(code_t*c, class_signature_t*from, class_signature_t*to) { - /* TODO */ - return abc_nop(c); + if(!to) { + /*TODO: can omit this if from is zero? */ + return abc_coerce_a(c); + } + if(TYPE_IS_NUMBER(from) && TYPE_IS_UINT(to)) { + MULTINAME(m, TYPE_UINT); + return abc_coerce2(c, &m); + } + if(TYPE_IS_NUMBER(from) && TYPE_IS_INT(to)) { + MULTINAME(m, TYPE_INT); + return abc_coerce2(c, &m); + } + return c; } code_t*defaultvalue(code_t*c, class_signature_t*type) @@ -728,7 +739,7 @@ VARIABLE_DECLARATION : VAR T_IDENTIFIER MAYBETYPE MAYBEEXPRESSION { int index = new_variable($2->text, $3); if($3) { - if($4.c->prev || $4.c->opcode != OPCODE_PUSH_UNDEFINED) { + if($4.c->prev || $4.c->opcode != OPCODE_PUSHUNDEFINED) { $$ = $4.c; $$ = converttype($$, $4.t, $3); $$ = abc_setlocal($$, index); @@ -746,7 +757,7 @@ VARIABLE_DECLARATION : VAR T_IDENTIFIER MAYBETYPE MAYBEEXPRESSION { or var x=expr; */ - if($4.c->prev || $4.c->opcode != OPCODE_PUSH_UNDEFINED) { + if($4.c->prev || $4.c->opcode != OPCODE_PUSHUNDEFINED) { $$ = $4.c; $$ = abc_coerce_a($$); $$ = abc_setlocal($$, index); @@ -804,7 +815,7 @@ FOR_INIT : {$$=code_new();} FOR_INIT : ASSIGNMENT | VARIABLE_DECLARATION | VOIDEXPRESSION FOR : "for" '(' {new_state();} FOR_INIT ';' EXPRESSION ';' VOIDEXPRESSION ')' CODEBLOCK { - code_append($$, state->initcode);state->initcode=0; + $$ = state->initcode;state->initcode=0; $$ = code_append($$, $4); code_t*loopstart = $$ = abc_label($$); @@ -953,28 +964,30 @@ E : '(' E ')' {$$=$2;} E : '-' E {$$=$2;} E : LH "+=" E {$$.c = $1.read;$$.c=code_append($$.c,$3.c);$$.c=abc_add($$.c); - MULTINAME(m, registry_getintclass()); - $$.c=abc_coerce2($$.c, &m); // FIXME + class_signature_t*type = join_types($1.type, $3.t, '+'); + $$.c=converttype($$.c, type, $1.type); $$.c=abc_dup($$.c);$$.c=code_append($$.c,$1.write); $$.t = $1.type; } E : LH "-=" E {$$.c = $1.read;$$.c=code_append($$.c,$3.c);$$.c=abc_add($$.c); - MULTINAME(m, registry_getintclass()); - $$.c=abc_coerce2($$.c, &m); // FIXME + class_signature_t*type = join_types($1.type, $3.t, '-'); + $$.c=converttype($$.c, type, $1.type); $$.c=abc_dup($$.c);$$.c=code_append($$.c,$1.write); $$.t = $1.type; } // TODO: use inclocal where appropriate E : LH "++" {$$.c = $1.read;$$.c=abc_increment($$.c); - MULTINAME(m, registry_getintclass()); - $$.c=abc_coerce2($$.c, &m); //FIXME + class_signature_t*type = $1.type; + if(TYPE_IS_INT(type) || TYPE_IS_UINT(type)) type = TYPE_NUMBER; + $$.c=converttype($$.c, type, $1.type); $$.c=abc_dup($$.c);$$.c=code_append($$.c,$1.write); $$.t = $1.type; } E : LH "--" {$$.c = $1.read;$$.c=abc_decrement($$.c); - MULTINAME(m, registry_getintclass()); - $$.c=abc_coerce2($$.c, &m); //FIXME + class_signature_t*type = $1.type; + if(TYPE_IS_INT(type) || TYPE_IS_UINT(type)) type = TYPE_NUMBER; + $$.c=converttype($$.c, 0, $1.type); $$.c=abc_dup($$.c);$$.c=code_append($$.c,$1.write); $$.t = $1.type; }