コード例 #1
0
        protected void EmitFunction(ITree functionNode)
        {
            string functionName       = functionNode.GetChild(0).Text;
            Type   functionReturnType = GetType(functionNode.GetChild(1).Text);

            CurrentArgs_        = Functions_[CurrentTypeBuilder_.Name][functionName].Args;
            CurrentILGenerator_ = Functions_[CurrentTypeBuilder_.Name][functionName].MethodBuilder.GetILGenerator();
            LocalObjectDef.InitGenerator(CurrentILGenerator_);

            var returnObjectDef = EmitExpression(functionNode.GetChild(2));

            returnObjectDef.Load();

            if (!functionReturnType.IsAssignableFrom(returnObjectDef.Type))
            {
                //if (!returnObjectDef.Type.IsAssignableFrom(functionReturnType))
                CompilerErrors.Add(new InvalidReturnTypeError(
                                       Functions_[CurrentTypeBuilder_.Name][functionName].MethodBuilder,
                                       returnObjectDef.Type,
                                       CompilerErrors.Count, functionNode.GetChild(2).Line, functionNode.GetChild(2).CharPositionInLine));
            }

            if (Functions_[CurrentTypeBuilder_.Name][functionName].MethodBuilder.ReturnType == typeof(void))
            {
                CurrentILGenerator_.Emit(OpCodes.Pop);
            }
            CurrentILGenerator_.Emit(OpCodes.Ret);

            returnObjectDef.Remove();
        }
コード例 #2
0
        protected void EmitField(ITree fieldNode)
        {
            CurrentILGenerator_ = Constructors_[CurrentTypeBuilder_.Name].GetILGenerator();
            LocalObjectDef.InitGenerator(CurrentILGenerator_);
            ObjectDef returnObjectDef;

            if (fieldNode.ChildCount == 3)
            {
                returnObjectDef = EmitExpression(fieldNode.GetChild(2));
            }
            else
            {
                returnObjectDef = EmitDefaultValue(GetType(fieldNode.GetChild(1).Text));
            }

            if (!Constructors_[CurrentTypeBuilder_.Name].IsStatic)
            {
                CurrentILGenerator_.Emit(OpCodes.Ldarg_0);
                returnObjectDef.Load();
                CurrentILGenerator_.Emit(OpCodes.Stfld, Fields_[CurrentTypeBuilder_.Name][fieldNode.GetChild(0).Text].FieldInfo);
            }
            else
            {
                returnObjectDef.Load();
                CurrentILGenerator_.Emit(OpCodes.Stsfld, Fields_[CurrentTypeBuilder_.Name][fieldNode.GetChild(0).Text].FieldInfo);
            }
            returnObjectDef.Remove();
        }