public void CheckBodySemantics(TigerScope scope, Report report) { //If CheckSemantics failed (FunctionInfo was not created) return if (!IsOK) { return; } IsOK = false; //Create function scope FunctionBodyNode.CheckSemantics(FunctionScope, report); if (!FunctionBodyNode.IsOK) { return; } IsOK = true; if (ReturnTypeNode != null && !ReturnTypeNode.TigerType.Assignable(FunctionBodyNode.TigerType)) { report.AddError(SemanticErrors.IncompatibleFunctionReturnTypeBody(FunctionBodyNode, ReturnTypeNode.TigerType, FunctionBodyNode.TigerType)); } else if (ReturnTypeNode == null && !TigerType.AreOfSameType(TigerType.Void, FunctionBodyNode.TigerType)) { report.AddError(SemanticErrors.IncompatibleFunctionReturnTypeBody(FunctionBodyNode, TigerType.Void, FunctionBodyNode.TigerType)); } }
public override void GenerateCode(ILGenerator generator) { for (var i = 0; i < ParameterDeclarationNodes.Length; i++) { var parameter = ParameterDeclarationNodes[i]; var field = ProgramNode.Program.DefineField(parameter.VariableInfo.StaticName, parameter.TypeNode.TigerType.Type, FieldAttributes.Public | FieldAttributes.Static); generator.Emit(OpCodes.Ldarg, i); generator.Emit(OpCodes.Stsfld, field); parameter.VariableInfo.FieldBuilder = field; } FunctionBodyNode.GenerateCode(generator); //genera el codigo del cuerpo del metodo con el generator obtenido para el nuevo metodo generator.Emit(OpCodes.Ret); }