X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=blobdiff_plain;f=lib%2Fas3%2Fparser.y;h=3abeaa3c6a88db79b95b2b34cd6f3c2cb3d18a4e;hp=701d49b5f4dd2e7daac86cf5118d7feb35c09380;hb=79e69e1d109a95f9495b96b29a723758d06a71d9;hpb=b99a9f03d0f161800baafab39eedde7353630d7f diff --git a/lib/as3/parser.y b/lib/as3/parser.y index 701d49b..3abeaa3 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -625,6 +625,7 @@ typedef struct _variable { int index; classinfo_t*type; char init; + char is_parameter; methodstate_t*is_inner_method; } variable_t; @@ -811,6 +812,19 @@ static code_t* method_header(methodstate_t*m) c = abc_getlocal_0(c); c = abc_constructsuper(c, 0); } + + if(m->slots) { + /* all parameters that are used by inner functions + need to be copied from local to slot */ + parserassert(m->activation_var); + DICT_ITERATE_ITEMS(m->slots,char*,name,variable_t*,v) { + if(v->is_parameter) { + c = abc_getlocal(c, m->activation_var); + c = abc_getlocal(c, v->index); + c = abc_setslot(c, v->index); + } + } + } list_free(m->innerfunctions); m->innerfunctions = 0; return c; @@ -927,9 +941,13 @@ static void function_initvars(methodstate_t*m, params_t*params, int flags, char if(params) { param_list_t*p=0; for(p=params->list;p;p=p->next) { - new_variable(p->param->name, p->param->type, 0, 1); + variable_t*v = new_variable2(p->param->name, p->param->type, 0, 1); + v->is_parameter = 1; } } + if(m->uses_slots) { + dict_dump(m->slots, stdout, ""); + } methodstate_list_t*l = m->innerfunctions; while(l) {