Ejemplo n.º 1
0
        public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            if (node is XamlObjectFromDirectObjectNode objNode)
            {
                IXamlType xamlDirectType = context.GetWinUITypes().XamlDirect;
                codeGen
                .EmitCall(xamlDirectType.GetMethod(new FindMethodMethodSignature("GetDefault", xamlDirectType)
                {
                    IsStatic = true
                }));

                context.Emit(objNode.Value, codeGen, context.GetWinUITypes().IXamlDirectObject);
                codeGen
                .EmitCall(xamlDirectType.GetMethod(new FindMethodMethodSignature("GetObject", context.Configuration.WellKnownTypes.Object, context.GetWinUITypes().IXamlDirectObject)))
                .Castclass(objNode.Type.GetClrType());
                return(XamlILNodeEmitResult.Type(0, objNode.Type.GetClrType()));
            }
            else if (node is XamlDirectObjectFromObjectNode directObjNode)
            {
                IXamlType xamlDirectType = context.GetWinUITypes().XamlDirect;
                codeGen
                .EmitCall(xamlDirectType.GetMethod(new FindMethodMethodSignature("GetDefault", xamlDirectType)
                {
                    IsStatic = true
                }));

                context.Emit(directObjNode.Value, codeGen, context.Configuration.WellKnownTypes.Object);
                codeGen
                .EmitCall(xamlDirectType.GetMethod(new FindMethodMethodSignature("GetXamlDirectObject", context.GetWinUITypes().IXamlDirectObject, context.Configuration.WellKnownTypes.Object)));
                return(XamlILNodeEmitResult.Type(0, context.GetWinUITypes().IXamlDirectObject));
            }
            return(null);
        }
Ejemplo n.º 2
0
        public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            if (!(node is XamlMethodCallBaseNode mc))
            {
                return(null);
            }

            bool thisArgFromArgs = node is XamlStaticOrTargetedReturnMethodCallNode;
            bool expectsVoid     = node is XamlNoReturnMethodCallNode;


            for (var c = 0; c < mc.Arguments.Count; c++)
            {
                var off          = thisArgFromArgs ? 0 : 1;
                var expectedType = mc.Method.ParametersWithThis[c + off];
                context.Emit(mc.Arguments[c], codeGen, expectedType);
            }

            context.Emit(mc.Method, codeGen, expectsVoid);

            var isVoid = mc.Method.ReturnType.Equals(context.Configuration.WellKnownTypes.Void);

            if (!expectsVoid && isVoid)
            {
                throw new XamlLoadException(
                          $"XamlStaticReturnMethodCallNode expects a value while {mc.Method.Name} returns void", node);
            }

            var consumed = thisArgFromArgs ? 0 : 1;

            return(isVoid || expectsVoid
                ? XamlILNodeEmitResult.Void(consumed)
                : XamlILNodeEmitResult.Type(consumed, mc.Method.ReturnType));
        }
Ejemplo n.º 3
0
        protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            if (_selectors.Count == 0)
            {
                throw new XamlLoadException("Invalid selector count", this);
            }
            if (_selectors.Count == 1)
            {
                _selectors[0].Emit(context, codeGen);
                return;
            }
            var listType = context.Configuration.TypeSystem.FindType("System.Collections.Generic.List`1")
                           .MakeGenericType(base.Type.GetClrType());
            var add = listType.FindMethod("Add", context.Configuration.WellKnownTypes.Void, false, Type.GetClrType());

            codeGen
            .Newobj(listType.FindConstructor());
            foreach (var s in _selectors)
            {
                codeGen.Dup();
                context.Emit(s, codeGen, Type.GetClrType());
                codeGen.EmitCall(add, true);
            }

            EmitCall(context, codeGen,
                     m => m.Name == "Or" && m.Parameters.Count == 1 && m.Parameters[0].Name.StartsWith("IReadOnlyList"));
        }
Ejemplo n.º 4
0
        public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            if (!(node is XamlAstNewClrObjectNode n))
            {
                return(null);
            }

            var type = n.Type.GetClrType();
            var ctor = n.Constructor ?? type.FindConstructor();

            if (ctor == null)
            {
                throw new XamlLoadException("Unable to find default constructor and no non-default one is specified",
                                            n);
            }

            using (codeGen.EmitNewObjectMarker())
            {
                for (var c = 0; c < n.Arguments.Count; c++)
                {
                    context.Emit(n.Arguments[c], codeGen, ctor.Parameters[c]);
                }

                var gen = codeGen
                          .Emit(OpCodes.Newobj, ctor);
            }

            return(XamlILNodeEmitResult.Type(0, type));
        }
Ejemplo n.º 5
0
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     // Discard the stack value we are "supposed" to manipulate
     codeGen.Pop();
     context.Emit(Imperative, codeGen, null);
     return(XamlILNodeEmitResult.Void(1));
 }
Ejemplo n.º 6
0
        public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            if (!(node is XamlValueWithManipulationNode vwm))
            {
                return(null);
            }
            var created = context.Emit(vwm.Value, codeGen, vwm.Type.GetClrType());

            if (vwm.Manipulation != null &&
                !(vwm.Manipulation is XamlManipulationGroupNode grp && grp.Children.Count == 0))
            {
                codeGen.Emit(OpCodes.Dup);
                context.Emit(vwm.Manipulation, codeGen, null);
            }
            return(XamlILNodeEmitResult.Type(0, created.ReturnType));
        }
Ejemplo n.º 7
0
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     context.Emit(Value, codeGen, Method.DeclaringType);
     codeGen
     .Ldftn(Method)
     .Newobj(DelegateType.Constructors.FirstOrDefault(ct =>
                                                      ct.Parameters.Count == 2 && ct.Parameters[0].Equals(context.Configuration.WellKnownTypes.Object)));
     return(XamlILNodeEmitResult.Type(0, DelegateType));
 }
Ejemplo n.º 8
0
 public virtual XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     if (Previous != null)
     {
         context.Emit(Previous, codeGen, Type.GetClrType());
     }
     DoEmit(context, codeGen);
     return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
 }
 protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     codeGen.Ldsfld(PropertyFiled);
     context.Emit(Value, codeGen, context.Configuration.WellKnownTypes.Object);
     EmitCall(context, codeGen,
              m => m.Name == "PropertyEquals" &&
              m.Parameters.Count == 3 &&
              m.Parameters[1].FullName == "Avalonia.AvaloniaProperty" &&
              m.Parameters[2].Equals(context.Configuration.WellKnownTypes.Object));
 }
Ejemplo n.º 10
0
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     codeGen
     .Ldloc(context.ContextLocal);
     context.Emit(Value, codeGen, Value.Type.GetClrType());
     codeGen
     .Stfld(context.RuntimeContext.IntermediateRootObjectField)
     .Ldloc(context.ContextLocal)
     .Ldfld(context.RuntimeContext.IntermediateRootObjectField);
     return(XamlILNodeEmitResult.Type(0, Value.Type.GetClrType()));
 }
        public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            if (!(node is XamlPropertyValueManipulationNode pvm))
            {
                return(null);
            }
            codeGen.EmitCall(pvm.Property.Getter);
            context.Emit(pvm.Manipulation, codeGen, null);

            return(XamlILNodeEmitResult.Void(1));
        }
Ejemplo n.º 12
0
        public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter ilgen)
        {
            if (!(node is XamlMarkupExtensionNode me))
            {
                return(null);
            }
            XamlNeedsParentStackCache.Verify(context, node);

            var prop = context.ParentNodes().OfType <XamlPropertyAssignmentNode>().FirstOrDefault();

            var needProvideValueTarget = me.ProvideValue.Parameters.Count != 0 &&
                                         context.RuntimeContext.PropertyTargetObject != null &&
                                         prop != null;

            void EmitPropertyDescriptor()
            {
                if (context.EmitMappings.ProvideValueTargetPropertyEmitter
                    ?.Invoke(context, ilgen, prop.Property) == true)
                {
                    return;
                }
                ilgen.Ldstr(prop.Property.Name);
            }

            context.Emit(me.Value, ilgen, me.Value.Type.GetClrType());

            if (me.ProvideValue.Parameters.Count > 0)
            {
                ilgen
                .Emit(OpCodes.Ldloc, context.ContextLocal);
            }

            if (needProvideValueTarget)
            {
                ilgen
                .Ldloc(context.ContextLocal);
                EmitPropertyDescriptor();
                ilgen
                .Stfld(context.RuntimeContext.PropertyTargetProperty);
            }

            ilgen.EmitCall(me.ProvideValue);

            if (needProvideValueTarget)
            {
                ilgen
                .Ldloc(context.ContextLocal)
                .Ldnull()
                .Stfld(context.RuntimeContext.PropertyTargetProperty);
            }

            return(XamlILNodeEmitResult.Type(0, me.ProvideValue.ReturnType));
        }
Ejemplo n.º 13
0
        public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            context.Emit(Value, codeGen, context.Configuration.WellKnownTypes.Object);
            var t = Type.GetClrType();

            if (t.IsValueType)
            {
                codeGen.Unbox_Any(t);
            }
            else
            {
                codeGen.Castclass(t);
            }
            return(XamlILNodeEmitResult.Type(0, t));
        }
Ejemplo n.º 14
0
 protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     if (!XamlIlAvaloniaPropertyHelper.Emit(context, codeGen, Property))
     {
         throw new XamlLoadException(
                   $"{Property.Name} of {(Property.Setter ?? Property.Getter).DeclaringType.GetFqn()} doesn't seem to be an AvaloniaProperty",
                   this);
     }
     context.Emit(Value, codeGen, context.Configuration.WellKnownTypes.Object);
     EmitCall(context, codeGen,
              m => m.Name == "PropertyEquals" &&
              m.Parameters.Count == 3 &&
              m.Parameters[1].FullName == "Avalonia.AvaloniaProperty" &&
              m.Parameters[2].Equals(context.Configuration.WellKnownTypes.Object));
 }
Ejemplo n.º 15
0
        public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            var res                = context.Emit(Value, codeGen, Value.Type.GetClrType());
            var supportInitType    = context.Configuration.TypeMappings.SupportInitialize;
            var supportsInitialize = supportInitType != null &&
                                     context.Configuration.TypeMappings.SupportInitialize
                                     .IsAssignableFrom(Value.Type.GetClrType());

            if (supportsInitialize)
            {
                codeGen
                .Dup()
                .EmitCall(supportInitType.FindMethod(m => m.Name == "BeginInit"));
            }

            return(res);
        }
Ejemplo n.º 16
0
        public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            codeGen.Newobj(_constructor);

            codeGen
            .Dup()
            .Ldc_I4(_values.Count)
            .EmitCall(_listSetCapacityMethod);

            foreach (var value in _values)
            {
                codeGen.Dup();

                context.Emit(value, codeGen, _elementType);

                codeGen.EmitCall(_listAddMethod);
            }

            return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
        }
        public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            if (!(node is XamlManipulationGroupNode group))
            {
                return(null);
            }
            if (group.Children.Count == 0)
            {
                codeGen.Pop();
            }
            else
            {
                for (var c = 0; c < group.Children.Count; c++)
                {
                    if (c != group.Children.Count - 1)
                    {
                        codeGen.Emit(OpCodes.Dup);
                    }
                    context.Emit(group.Children[c], codeGen, null);
                }
            }

            return(XamlILNodeEmitResult.Void(1));
        }
Ejemplo n.º 18
0
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     XamlNeedsParentStackCache.Verify(context, this);
     return(context.Emit(Value, codeGen, Value.Type.GetClrType()));
 }
Ejemplo n.º 19
0
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     context.Emit(Value, codeGen, Value.Type.GetClrType());
     context.Emit(Manipulation, codeGen, null);
     return(XamlILNodeEmitResult.Void(0));
 }
Ejemplo n.º 20
0
 protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     context.Emit(Argument, codeGen, Type.GetClrType());
     EmitCall(context, codeGen,
              m => m.Name == "Not" && m.Parameters.Count == 2 && m.Parameters[1].Equals(Type.GetClrType()));
 }