示例#1
0
 public MethodContext(ClassContext fileContext, string name)
 {
     ClassContext = fileContext;
     EmitContext  = new EmitMethodContext();
     Name         = name;
     Symbols      = fileContext.Symbols.Push(name);
 }
示例#2
0
        public bool CompileBody(bool isStatic)
        {
            if (Count == 0)
            {
                return(true);
            }
            TypeBuilder classBuilder = ClassContext.ClassSymbol.ClassBuilder;

            if (ClassContext.InitMemberValueMethod == null)
            {
                string initMemberValueMethodName = "__InitMemberValueMethod";
                if (isStatic)
                {
                    ClassContext.InitMemberValueMethod = classBuilder.DefineMethod(initMemberValueMethodName, MethodAttributes.Private | MethodAttributes.Static, typeof(void), new Type[] { });
                }
                else
                {
                    ClassContext.InitMemberValueMethod = classBuilder.DefineMethod(initMemberValueMethodName, MethodAttributes.Private, typeof(void), new Type[] { });
                }
            }
            EmitMethodContext context = new EmitMethodContext();

            context.ClassContext = ClassContext.EmitContext;;
            context.SetBuilder(ClassContext.InitMemberValueMethod);
            EmitStmtContext stmtContext = new EmitStmtContext(context);
            EmitExpContext  expContext  = new EmitExpContext(stmtContext);

            var il = ClassContext.InitMemberValueMethod.GetILGenerator();

            foreach (var ppt in PropertyList)
            {
                ppt.GenerateBody(expContext);
            }
            il.Emit(OpCodes.Ret);
            return(true);
        }