Пример #1
0
            //------------------------------------------------------------ 
            // 評価実行。 
            void eventEvaluate(SemanticAnalyzeComponent aComp)
            {
                // レジスタの確保
                if (mEvaluateInfo.TypeInfo.Symbol.GetKind() != TypeInfo.TypeSymbol.Kind.BuiltIn || // 組み込み型じゃない
                    mEvaluateInfo.TypeInfo.Symbol.GetBuiltInType() != BuiltInType.Void // voidじゃない
                    )
                {                                                                      // レジスタが必要
                    // 伝搬情報を取得してみる
                    mTransferredEI.ReceiveAndSetSR(aComp);
                }

                // 1つめを評価
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);

                // シンボルの取得
                FunctionSymbolNode funcSymbol = (FunctionSymbolNode)mFirstNode.GetEvaluateInfo().Symbol;

                // 引数の対応
                if (mSeqNode != null)
                {
                    // まず評価設定
                    mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.Evaluate);

                    // 関数情報設定
                    aComp.FunctionCallTargetSet(funcSymbol);

                    // 戻り値用のFRを確保
                    if (mEvaluateInfo.SR.IsValid)
                    {
                        aComp.FunctionCallFRNextIndex();
                    }

                    // 引数のFRを確保
                    mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.SetupFR);

                    // 関数情報リセット
                    aComp.FunctionCallTargetReset();
                }

                // 関数コール命令
                aComp.BCFunction.AddOPCode_SymbolTableIndex(
                    BCOpCode.OpType.CALL
                    , funcSymbol
                    );

                // 関数の結果を受け取る
                if (mEvaluateInfo.SR.IsValid)
                {
                    aComp.BCFunction.AddOPCode_SReg(
                        BCOpCode.OpType.LDSRFZ
                        , mEvaluateInfo.SR
                        );
                }

                // 評価終了イベント送信
                mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Release);
            }