예제 #1
0
 public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption option)
 {
     generator.NewObject(ReflectionHelpers.AnonymousObj);
     for (int i = 0; i < Members.Count; i++)
     {
         var member = Members[i];
         generator.Duplicate();
         generator.LoadString(member.Name);
         member.Expression.GenerateCode(generator, AssignOption);
         if (member.Expression.Type.IsValueType)
         {
             generator.Box(member.Expression.Type);
         }
         generator.CallVirtual(ReflectionHelpers.AnonymousObj_SetItem);
     }
     generator.NewObject(ReflectionHelpers.Any_New);
 }
        public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption option)
        {
            Left.GenerateCode(generator);
            generator.Duplicate();
            var end = generator.CreateLabel();

            if (Left.Type.IsValueType)
            {
                if (Left.Type.TryImplicitConvert(TypeProvider.BooleanType, out System.Reflection.MethodInfo op_Implicit))
                {
                    generator.CallStatic(op_Implicit);
                    generator.CallStatic(Utils.ReflectionHelpers.BoooleanToBool);
                }
                else
                {
                    throw new System.InvalidCastException($"Unable to cast object of type {Left.Type} to {TypeProvider.BooleanType}");
                }
            }
            generator.BranchIfTrue(end);
            generator.Pop();
            Right.GenerateCode(generator, Emit.MethodCompileOption.Dupplicate);
            generator.DefineLabelPosition(end);
        }