Ejemplo n.º 1
0
        public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            codeGen.Ldstr(_color);
            codeGen.EmitCall(_method);

            return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
        }
Ejemplo n.º 2
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.º 3
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.º 4
0
        protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            var name = _type.ToString();

            EmitCall(context, codeGen,
                     m => m.Name == name && m.Parameters.Count == 1);
        }
Ejemplo n.º 5
0
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     if (Constant is string)
     {
         codeGen.Emit(OpCodes.Ldstr, (string)Constant);
     }
     else if (Constant is long || Constant is ulong)
     {
         codeGen.Emit(OpCodes.Ldc_I8, TypeSystem.TypeSystemHelpers.ConvertLiteralToLong(Constant));
     }
     else if (Constant is float f)
     {
         codeGen.Emit(OpCodes.Ldc_R4, f);
     }
     else if (Constant is double d)
     {
         codeGen.Emit(OpCodes.Ldc_R8, d);
     }
     else if (Constant is bool b)
     {
         codeGen.Emit(b ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0);
     }
     else
     {
         codeGen.Emit(OpCodes.Ldc_I4, TypeSystem.TypeSystemHelpers.ConvertLiteralToInt(Constant));
     }
     return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
 }
            public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
            {
                if (!(node is HandleRootObjectScopeNode))
                {
                    return(null);
                }
                var types = context.GetAvaloniaTypes();

                var next       = codeGen.DefineLabel();
                var scopeField = context.RuntimeContext.ContextType.Fields.First(f =>
                                                                                 f.Name == AvaloniaXamlIlLanguage.ContextNameScopeFieldName);

                using (var local = codeGen.LocalsPool.GetLocal(types.StyledElement))
                {
                    codeGen
                    .Isinst(types.StyledElement)
                    .Dup()
                    .Stloc(local.Local)
                    .Brfalse(next)
                    .Ldloc(local.Local)
                    .Ldloc(context.ContextLocal)
                    .Ldfld(scopeField)
                    .EmitCall(types.NameScopeSetNameScope, true)
                    .MarkLabel(next)
                    .Ldloc(context.ContextLocal)
                    .Ldfld(scopeField)
                    .EmitCall(types.INameScopeComplete, true);
                }

                return(XamlILNodeEmitResult.Void(1));
            }
 public void Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     codeGen
     .Ldtype(_type)
     .EmitCall(context.GetAvaloniaTypes()
               .PropertyPathBuilder.FindMethod(m => m.Name == (_ensureType ? "EnsureType" : "Cast")));
 }
Ejemplo n.º 8
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.º 9
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.º 10
0
 protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     codeGen.Ldc_I4(_step);
     codeGen.Ldc_I4(_offset);
     EmitCall(context, codeGen,
              m => m.Name == _type.ToString() && m.Parameters.Count == 3);
 }
Ejemplo n.º 11
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.º 12
0
        protected void EmitCall(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen, Func <IXamlMethod, bool> method)
        {
            var selectors = context.Configuration.TypeSystem.GetType("Avalonia.Styling.Selectors");
            var found     = selectors.FindMethod(m => m.IsStatic && m.Parameters.Count > 0 && method(m));

            codeGen.EmitCall(found);
        }
Ejemplo n.º 13
0
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     codeGen
     .Ldloc(context.ContextLocal)
     .Ldfld(context.RuntimeContext.IntermediateRootObjectField);
     return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
 }
Ejemplo n.º 14
0
        public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            var type   = TargetType.GetClrType();
            var member = ResolveMember(type);

            if (member is IXamlProperty prop)
            {
                codeGen.Emit(OpCodes.Call, prop.Getter);
                return(XamlILNodeEmitResult.Type(0, prop.Getter.ReturnType));
            }
            else if (member is IXamlField field)
            {
                if (field.IsLiteral)
                {
                    ILEmitHelpers.EmitFieldLiteral(field, codeGen);
                }
                else
                {
                    codeGen.Emit(OpCodes.Ldsfld, field);
                }
                return(XamlILNodeEmitResult.Type(0, field.FieldType));
            }
            else
            {
                throw new XamlLoadException(
                          $"Unable to resolve {Member} as static field, property, constant or enum value", this);
            }
        }
            public void Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
            {
                context.Configuration.GetExtra <XamlIlClrPropertyInfoEmitter>()
                .Emit(context, codeGen, _property);

                codeGen.EmitCall(context.GetAvaloniaTypes()
                                 .PropertyPathBuilder.FindMethod(m => m.Name == "Property"));
            }
Ejemplo n.º 16
0
        protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            codeGen.Ldstr(String);
            var name = _type.ToString();

            EmitCall(context, codeGen,
                     m => m.Name == name && m.Parameters.Count == 2 && m.Parameters[1].FullName == "System.String");
        }
Ejemplo n.º 17
0
        protected override void DoEmit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            var name = Concrete ? "OfType" : "Is";

            codeGen.Ldtype(TargetType);
            EmitCall(context, codeGen,
                     m => m.Name == name && m.Parameters.Count == 2 && m.Parameters[1].FullName == "System.Type");
        }
        public virtual XamlILNodeEmitResult Emit(
            XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context,
            IXamlILEmitter codeGen)
        {
            codeGen.Newobj(_constructor);

            return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
        }
Ejemplo n.º 19
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));
 }
        public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            codeGen
            .Ldc_R8(_gridLength.Value)
            .Ldc_I4((int)_gridLength.GridUnitType)
            .Newobj(_types.GridLengthConstructorValueType);

            return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
        }
Ejemplo n.º 21
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()));
 }
Ejemplo n.º 22
0
 public static AvaloniaXamlIlWellKnownTypes GetAvaloniaTypes(this XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> ctx)
 {
     if (ctx.TryGetItem <AvaloniaXamlIlWellKnownTypes>(out var rv))
     {
         return(rv);
     }
     ctx.SetItem(rv = new AvaloniaXamlIlWellKnownTypes(ctx.Configuration));
     return(rv);
 }
 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));
 }
        public override XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context,
                                                  IXamlILEmitter codeGen)
        {
            foreach (var value in Values)
            {
                codeGen.Emit(OpCodes.Ldc_I4, value);
            }

            return(base.Emit(context, codeGen));
        }
        public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
        {
            foreach (var value in _values)
            {
                codeGen.Ldc_R8(value);
            }

            codeGen.Newobj(_constructor);

            return(XamlILNodeEmitResult.Type(0, Type.GetClrType()));
        }
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     codeGen
     .Ldloc(context.ContextLocal)
     .Castclass(context.Configuration.TypeMappings.UriContextProvider)
     .EmitCall(context.Configuration.TypeMappings.UriContextProvider.FindMethod(
                   "get_BaseUri", _types.Uri, false))
     .Ldstr(_text)
     .Newobj(_types.FontFamilyConstructorUriName);
     return(XamlILNodeEmitResult.Type(0, _types.FontFamily));
 }
        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));
        }
 public XamlILNodeEmitResult Emit(XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     codeGen
     .Newobj(_types.PropertyPathBuilder.FindConstructor());
     foreach (var e in _elements)
     {
         e.Emit(context, codeGen);
     }
     codeGen.EmitCall(_types.PropertyPathBuilder.FindMethod(m => m.Name == "Build"));
     return(XamlILNodeEmitResult.Type(0, _types.PropertyPath));
 }
Ejemplo n.º 29
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.º 30
0
 public XamlILNodeEmitResult Emit(IXamlAstNode node, XamlEmitContext <IXamlILEmitter, XamlILNodeEmitResult> context, IXamlILEmitter codeGen)
 {
     if (!(node is XamlAstTextNode text))
     {
         return(null);
     }
     if (!text.Type.GetClrType().Equals(context.Configuration.WellKnownTypes.String))
     {
         throw new XamlLoadException("Text node type wasn't resolved to well-known System.String", node);
     }
     codeGen.Emit(OpCodes.Ldstr, text.Text);
     return(XamlILNodeEmitResult.Type(0, text.Type.GetClrType()));
 }