コード例 #1
0
ファイル: SyntaxTreePaser.cs プロジェクト: xiaoxiaofish/LuaVM
        private void CGForInStat(FuncInfo funcInfo, ForInStatNode node)
        {
            funcInfo.EnterScope(true);
            LocalVarDecStatNode varDecStatNode = new LocalVarDecStatNode();

            varDecStatNode.ExpList  = node.ExpList;
            varDecStatNode.NameList = new List <ConstExpNode>()
            {
                new ConstExpNode(new Token(TokenType.Identifier, "for_generator", -1)),
                new ConstExpNode(new Token(TokenType.Identifier, "for_state", -1)),
                new ConstExpNode(new Token(TokenType.Identifier, "for_control", -1))
            };

            foreach (var name in node.NameList.NameList)
            {
                funcInfo.AddLocalVar(name.name);
            }

            int jmpToTFCPC = funcInfo.EmitJMP(0, 0);

            CGBlock(funcInfo, node.DoBlock.Block);
            funcInfo.FixSBX(jmpToTFCPC, funcInfo.PC() - jmpToTFCPC);
            var geneartor = funcInfo.VarDic1["for_generator"];

            funcInfo.EmitTForCall(geneartor.RegIndex, node.NameList.NameList.Count);
            funcInfo.EmitTForLoop(geneartor.RegIndex + 2, jmpToTFCPC - funcInfo.PC() - 1);
            funcInfo.ExitScope();
        }