public static void EmitFieldLiteral(IXamlField field, IXamlILEmitter codeGen)
        {
            var ftype = field.FieldType.IsEnum ? field.FieldType.GetEnumUnderlyingType() : field.FieldType;

            if (ftype.Name == "UInt64" || ftype.Name == "Int64")
            {
                codeGen.Emit(OpCodes.Ldc_I8,
                             TypeSystemHelpers.ConvertLiteralToLong(field.GetLiteralValue()));
            }
            else if (ftype.Name == "Double")
            {
                codeGen.Emit(OpCodes.Ldc_R8, (double)field.GetLiteralValue());
            }
            else if (ftype.Name == "Single")
            {
                codeGen.Emit(OpCodes.Ldc_R4, (float)field.GetLiteralValue());
            }
            else if (ftype.Name == "String")
            {
                codeGen.Emit(OpCodes.Ldstr, (string)field.GetLiteralValue());
            }
            else
            {
                codeGen.Emit(OpCodes.Ldc_I4,
                             TypeSystemHelpers.ConvertLiteralToInt(field.GetLiteralValue()));
            }
        }
Beispiel #2
0
        public static IXamlILEmitter DebugHatch(this IXamlILEmitter emitter, string message)
        {
#if DEBUG
            var debug = emitter.TypeSystem.GetType("XamlX.XamlDebugHatch").FindMethod(m => m.Name == "Debug");
            emitter.Emit(OpCodes.Ldstr, message);
            emitter.Emit(OpCodes.Call, debug);
#endif
            return(emitter);
        }
        private static IDisposable EmitMarker(
            this IXamlILEmitter emitter,
            string startMethodName,
            string endMethodName = null,
            params string[] parameters)
        {
            var markers = emitter.TypeSystem.FindType("Avalonia.Markup.Xaml.HotReload.XamlMarkers");

            if (markers == null)
            {
                return(EmptyDisposable.Instance);
            }

            var startMarker = markers.FindMethod(m => m.Name == startMethodName);

            foreach (string parameter in parameters)
            {
                emitter.Emit(OpCodes.Ldstr, parameter);
            }

            emitter.EmitCall(startMarker);

            if (endMethodName != null)
            {
                var endMarker = markers.FindMethod(m => m.Name == endMethodName);
                return(new ActionDisposable(() => emitter.EmitCall(endMarker)));
            }

            return(EmptyDisposable.Instance);
        }
        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));
        }
Beispiel #5
0
        public static IXamlILEmitter EmitCall(this IXamlILEmitter emitter, IXamlMethod method, bool swallowResult = false)
        {
            if (method is IXamlCustomEmitMethod <IXamlILEmitter> custom)
            {
                custom.EmitCall(emitter);
            }
            else
            {
                emitter.Emit(method.IsStatic ? OpCodes.Call : OpCodes.Callvirt, method);
            }

            if (swallowResult && !(method.ReturnType.Namespace == "System" && method.ReturnType.Name == "Void"))
            {
                emitter.Pop();
            }
            return(emitter);
        }
 public IXamlILEmitter Emit(OpCode code)
 {
     Record(code, null);
     _inner.Emit(code);
     return(this);
 }
Beispiel #7
0
 public static IXamlILEmitter Ldarg(this IXamlILEmitter emitter, int arg)
 => emitter.Emit(OpCodes.Ldarg, arg);
Beispiel #8
0
 public static IXamlILEmitter Ldlen(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Ldlen);
Beispiel #9
0
 public static IXamlILEmitter Add(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Add);
Beispiel #10
0
 public static IXamlILEmitter Ldc_R8(this IXamlILEmitter emitter, double arg)
 => emitter.Emit(OpCodes.Ldc_R8, arg);
Beispiel #11
0
 public static IXamlILEmitter Ret(this IXamlILEmitter emitter)
 => emitter.Emit(OpCodes.Ret);
Beispiel #12
0
 public static IXamlILEmitter Ldnull(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Ldnull);
Beispiel #13
0
 public static IXamlILEmitter Throw(this IXamlILEmitter emitter)
 => emitter.Emit(OpCodes.Throw);
Beispiel #14
0
 public static IXamlILEmitter Ldarg_0(this IXamlILEmitter emitter)
 => emitter.Emit(OpCodes.Ldarg_0);
Beispiel #15
0
 public static IXamlILEmitter Ldloca(this IXamlILEmitter emitter, IXamlLocal local)
 => emitter.Emit(OpCodes.Ldloca, local);
Beispiel #16
0
 public static IXamlILEmitter Isinst(this IXamlILEmitter emitter, IXamlType type)
 => emitter.Emit(OpCodes.Isinst, type);
Beispiel #17
0
 public static IXamlILEmitter Ldftn(this IXamlILEmitter emitter, IXamlMethod method)
 => emitter.Emit(OpCodes.Ldftn, method);
Beispiel #18
0
 public static IXamlILEmitter Ldtoken(this IXamlILEmitter emitter, IXamlType type)
 => emitter.Emit(OpCodes.Ldtoken, type);
Beispiel #19
0
 public static IXamlILEmitter Pop(this IXamlILEmitter emitter)
 => emitter.Emit(OpCodes.Pop);
Beispiel #20
0
 public static IXamlILEmitter Dup(this IXamlILEmitter emitter)
 => emitter.Emit(OpCodes.Dup);
Beispiel #21
0
 public static IXamlILEmitter Stsfld(this IXamlILEmitter emitter, IXamlField field)
 => emitter.Emit(OpCodes.Stsfld, field);
Beispiel #22
0
 public static IXamlILEmitter Castclass(this IXamlILEmitter emitter, IXamlType type)
 => emitter.Emit(OpCodes.Castclass, type);
Beispiel #23
0
 public static IXamlILEmitter Stloc(this IXamlILEmitter emitter, IXamlLocal local)
 => emitter.Emit(OpCodes.Stloc, local);
Beispiel #24
0
 public static IXamlILEmitter Unbox(this IXamlILEmitter emitter, IXamlType type)
 => emitter.Emit(OpCodes.Unbox, type);
Beispiel #25
0
 public static IXamlILEmitter Ldstr(this IXamlILEmitter emitter, string arg)
 => arg == null?emitter.Ldnull() : emitter.Emit(OpCodes.Ldstr, arg);
Beispiel #26
0
 public static IXamlILEmitter Newobj(this IXamlILEmitter emitter, IXamlConstructor ctor)
 => emitter.Emit(OpCodes.Newobj, ctor);
Beispiel #27
0
 public static IXamlILEmitter Ldc_I4(this IXamlILEmitter emitter, int arg)
 => arg == 0
         ? emitter.Emit(OpCodes.Ldc_I4_0)
         : arg == 1
             ? emitter.Emit(OpCodes.Ldc_I4_1)
             : emitter.Emit(OpCodes.Ldc_I4, arg);
Beispiel #28
0
 public static IXamlILEmitter Newarr(this IXamlILEmitter emitter, IXamlType type)
 => emitter.Emit(OpCodes.Newarr, type);
Beispiel #29
0
 public static IXamlILEmitter Ble(this IXamlILEmitter emitter, IXamlLabel label)
 => emitter.Emit(OpCodes.Ble, label);
Beispiel #30
0
 public static IXamlILEmitter Stelem_ref(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Stelem_Ref);