//------------------------------------------------------------ // コンストラクタ。 public BCFunction(BCModule aBCModule, FunctionSymbolNode aFunctionSymbolNode) { mBCModule = aBCModule; mFunctionSymbolNode = aFunctionSymbolNode; mBCOpCodeList = new List <BCOpCode>(); mBCLabelReferenceList = new List <BCLabelReference>(); }
//------------------------------------------------------------ // 評価準備。 void eventAnalyze(SemanticAnalyzeComponent aComp) { // 1つめを評価 mFirstNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze); // 関数シンボルかどうかのチェック if (mFirstNode.GetEvaluateInfo().Kind != EvaluateInfo.InfoKind.StaticSymbol || mFirstNode.GetEvaluateInfo().Symbol.GetNodeKind() != SymbolNodeKind.Function ) {// エラー aComp.ThrowErrorException(SymbolTree.ErrorKind.FUNCTION_SYMBOL_EXPECTED, mFirstExpr.GetToken()); } // 引数ありの対応 if (mSeqNode != null) { mSeqNode.SendEvent(aComp, EvaluateNodeEventKind.Analyze); } // シンボルの取得 FunctionSymbolNode funcSymbol = (FunctionSymbolNode)mFirstNode.GetEvaluateInfo().Symbol; // 評価情報を作成 mEvaluateInfo = EvaluateInfo.CreateAsValue(funcSymbol.ReturnTypeInfo()); // 伝搬情報ホルダーの作成 mTransferredEI = new TransferredEIHolder(mEvaluateInfo); }
//------------------------------------------------------------ // 評価実行。 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); }
//------------------------------------------------------------ // 関数を生成する。 public BCFunction GenerateFunction(FunctionSymbolNode aFunctionSymbolNode) { // 作成 var func = new BCFunction(mBCModule, aFunctionSymbolNode); // 追加 mFunctionList.Add(func); // 返す return(func); }
//------------------------------------------------------------ // FunctionNode宣言展開。 private void expandFunctionNodeDecl() { // まず子ノード expandChilds(SymbolExpandCmdKind.FunctionNodeDecl); // シンボル走査 foreach (SymbolDef symbol in mStaticTypeDef.SymbolDefList) { if (symbol.MemberFunctionDecl != null) { // 重複チェック checkIdentDuplication(symbol.MemberFunctionDecl.Ident); // ノード作成 var newNode = new FunctionSymbolNode(this, mBCObjectType, symbol.MemberFunctionDecl); // 更に展開 newNode.SymbolExpand(SymbolExpandCmdKind.FunctionNodeDecl); // 追加 addNode(newNode); } } }