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(); }
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(); }