static void leaveblock(ktap_funcstate *fs) { ktap_blockcnt *bl = fs->bl; ktap_lexstate *ls = fs->ls; if (bl->previous && bl->upval) { /* create a 'jump to here' to close upvalues */ int j = codegen_jump(fs); codegen_patchclose(fs, j, bl->nactvar); codegen_patchtohere(fs, j); } if (bl->isloop) breaklabel(ls); /* close pending breaks */ fs->bl = bl->previous; removevars(fs, bl->nactvar); ktap_assert(bl->nactvar == fs->nactvar); fs->freereg = fs->nactvar; /* free registers */ ls->dyd->label.n = bl->firstlabel; /* remove local labels */ if (bl->previous) /* inner block? */ movegotosout(fs, bl); /* update pending gotos to outer block */ else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ }
/*static*/ void FuncState::leaveblock (/*FuncState *fs*/) { //BlockCnt *bl = fs->bl; //LexState *ls = fs->ls; if (bl->previous && bl->upval) { /* create a 'jump to here' to close upvalues */ int j = luaK_jump(); luaK_patchclose(j, bl->nactvar); luaK_patchtohere(j); } if (bl->isloop) ls->breaklabel(); /* close pending breaks */ bl = bl->previous; removevars(bl->nactvar); lua_assert(bl->nactvar == nactvar); free_reg = nactvar; /* free registers */ ls->dyd->label.n = bl->firstlabel; /* remove local labels */ if (bl->previous) /* inner block? */ movegotosout(bl); /* update pending gotos to outer block */ else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ ls->undefgoto(&ls->dyd->gt.arr[bl->firstgoto]); /* error */ }