/// <inheritdoc/>
        public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption options)
        {
            Type = VariableType != null?VariableType.ResolveType(generator.Context) : TypeProvider.AnyType;

            if (Value != null)
            {
                var defValue = Value.Accept(generator);
                defValue.GenerateCode(generator, AssignOption);
                if (VariableType == null)
                {
                    Type = defValue.Type;
                }
                else if (!TypeUtils.AreReferenceAssignable(Type, defValue.Type) && defValue.Type.TryImplicitConvert(Type, out System.Reflection.MethodInfo opConvert))
                {
                    // When converting value type to Any, must do Box
                    if (defValue.Type.IsValueType && opConvert.GetParameters()[0].ParameterType.IsValueType == false)
                    {
                        generator.Box(defValue.Type);
                    }
                    generator.CallStatic(opConvert);
                }
                else if (defValue.Type.IsValueType && !Type.IsValueType)
                {
                    generator.Box(defValue.Type);
                }
            }
            //initialize
            var variable = generator.DeclareVariable(Type, Name);

            generator.StoreVariable(variable);
            return;
        }
Esempio n. 2
0
 public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption option)
 {
     Target.GenerateCode(generator);
     if (TypeSyntax is null || (TypeSyntax is RefTypeSyntax refType && refType.Name.Equals(LiteralExpression.NullString)))
     {
         generator.LoadNull();
         generator.CompareEqual();
     }
Esempio n. 3
0
 public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption options)
 {
     Target.GenerateCode(generator);
     if (Method != null)
     {
         // implicit conversion
         generator.CallStatic(Method);
     }
     else
     {
         generator.CastClass(Type);
     }
 }
 public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption options)
 {
     if (generator.Method is Generators.DynamicMethodGenerator)
     {
         // for annonymous type
         // if this is used in anonymous function or objects
         var variable = generator.GetLocalVariable("__value");
         generator.LoadVariable(variable);
     }
     else
     {
         generator.LoadArgument(0);
     }
 }
Esempio n. 5
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);
        }
 public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption option)
 {
     CustomGeneration(this, generator);
 }
Esempio n. 8
0
 public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption option = 0)
 {
     generator.EmitArguments(Arguments, Conversions);
     generator.NewObject(Constructor);
 }
        /// <inheritdoc/>
        public override void GenerateCode(Emit.MethodBodyGenerator generator, Emit.MethodCompileOption options)
        {
            //todo unsigned to signed
            switch (Value)
            {
            case sbyte b:
                generator.LoadByte(b);
                break;

            case byte b:
                generator.LoadByte(b);
                break;

            case short s:
                generator.LoadInt16(s);
                break;

            case ushort s:
                generator.LoadInt16(s);
                break;

            case int i:
                generator.LoadInt32(i);
                break;

            case uint i:
                generator.LoadInt32(i);
                break;

            case long l:
                generator.LoadInt64(l);
                break;

            case ulong l:
                generator.LoadInt64(l);
                break;

            case float f:
                generator.LoadSingle(f);
                break;

            case double d:
                generator.LoadDouble(d);
                break;

            case bool b:
                generator.LoadBool(b);
                break;

            case char c:
                generator.LoadChar(c);
                break;

            case string s:
                generator.LoadString(s);
                break;

            case null:
                generator.LoadNull();
                break;
            }
        }