X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fas3%2Fparser.y;h=4699a9015acecbcab16a6fe297b204a1b97fa804;hb=4dacf8e5890fb8cd0f53afbd4305c8b9ff9e7986;hp=a574b88bc76f6540950ed390ad4e8485ef7785d7;hpb=8384058f169f17c67c30f29aa30a285ed1e36b1b;p=swftools.git diff --git a/lib/as3/parser.y b/lib/as3/parser.y index a574b88..4699a90 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -665,6 +665,9 @@ static code_t*defaultvalue(code_t*c, classinfo_t*type) c = abc_pushnan(c); } else if(TYPE_IS_BOOLEAN(type)) { c = abc_pushfalse(c); + } else if(TYPE_IS_STRING(type)) { + c = abc_pushnull(c); + c = abc_coerce_s(c); } else if(!type) { //c = abc_pushundefined(c); syntaxerror("internal error: can't generate default value for * type"); @@ -727,14 +730,12 @@ static code_t* var_block(code_t*body) code_t*k = 0; int t; int num=0; - for(t=0;tvars->hashsize;t++) { - DICT_ITERATE_DATA(state->vars, variable_t*, v) { - if(v->type && v->init) { - c = defaultvalue(c, v->type); - c = abc_setlocal(c, v->index); - k = abc_kill(k, v->index); - num++; - } + DICT_ITERATE_DATA(state->vars, variable_t*, v) { + if(v->type && v->init) { + c = defaultvalue(c, v->type); + c = abc_setlocal(c, v->index); + k = abc_kill(k, v->index); + num++; } } @@ -1589,12 +1590,18 @@ code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to) if(TYPE_IS_STRING(to)) return abc_convert_s(c); if(TYPE_IS_OBJECT(to)) - return abc_convert_o(c); + return abc_coerce2(c, &m); + if(TYPE_IS_OBJECT(from) && TYPE_IS_XMLLIST(to)) + return abc_coerce2(c, &m); + if(TYPE_IS_OBJECT(from) && TYPE_IS_ARRAY(to)) + return abc_coerce2(c, &m); classinfo_t*supertype = from; while(supertype) { if(supertype == to) { - // target type is one of from's superclasses + /* target type is one of from's superclasses. + (not sure we need this coerce - as far as the verifier + is concerned, object==object (i think) */ return abc_coerce2(c, &m); } int t=0; @@ -1620,7 +1627,17 @@ code_t*converttype(code_t*c, classinfo_t*from, classinfo_t*to) return c; } -/* move to ast.c todo end */ +code_t* coerce_to_type(code_t*c, classinfo_t*t) +{ + if(!t) { + return abc_coerce_a(c); + } else if(TYPE_IS_STRING(t)) { + return abc_coerce_s(c); + } else { + MULTINAME(m, t); + return abc_coerce2(c, &m); + } +} char is_pushundefined(code_t*c) { @@ -2608,6 +2625,10 @@ IDECLARATION : MAYBE_MODIFIERS "function" GETSET T_IDENTIFIER '(' MAYBE_PARAM_LI // instance variable traits = &state->cls->abc->traits; code = &state->cls->init->header; + + if(ns.access == ACCESS_PROTECTED) { + ns.name = concat3(state->cls->info->package,":",state->cls->info->name); + } } if(c) *c = code; @@ -3074,8 +3095,8 @@ FUNCTIONCALL : E '(' MAYBE_EXPRESSION_LIST ')' { // calling a class is like a typecast $$.t = (classinfo_t*)v.t->data; } else { - $$.c = abc_coerce_a($$.c); $$.t = TYPE_ANY; + $$.c = abc_coerce_a($$.c); } }