//------------------------------------------------------------ // 評価実行。 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); }
//------------------------------------------------------------ // FR割り当て。 void eventSetupFR(SemanticAnalyzeComponent aComp) { // 1つめ byte frIndex = aComp.FunctionCallFRNextIndex(); aComp.BCFunction.AddOPCode_CU1_SR( BCOpCode.OpType.LDFRSR , frIndex , mFirstNode.GetEvaluateInfo().SR ); // 2つめがあれば2つめも if (mNextNode != null) { mNextNode.SendEvent(aComp, EvaluateNodeEventKind.SetupFR); } }