Пример #1
0
        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));
            }
        }
Пример #2
0
 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);
 }