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())); } }
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)); }
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); }
public static IXamlILEmitter Ldarg(this IXamlILEmitter emitter, int arg) => emitter.Emit(OpCodes.Ldarg, arg);
public static IXamlILEmitter Ldlen(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Ldlen);
public static IXamlILEmitter Add(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Add);
public static IXamlILEmitter Ldc_R8(this IXamlILEmitter emitter, double arg) => emitter.Emit(OpCodes.Ldc_R8, arg);
public static IXamlILEmitter Ret(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Ret);
public static IXamlILEmitter Ldnull(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Ldnull);
public static IXamlILEmitter Throw(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Throw);
public static IXamlILEmitter Ldarg_0(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Ldarg_0);
public static IXamlILEmitter Ldloca(this IXamlILEmitter emitter, IXamlLocal local) => emitter.Emit(OpCodes.Ldloca, local);
public static IXamlILEmitter Isinst(this IXamlILEmitter emitter, IXamlType type) => emitter.Emit(OpCodes.Isinst, type);
public static IXamlILEmitter Ldftn(this IXamlILEmitter emitter, IXamlMethod method) => emitter.Emit(OpCodes.Ldftn, method);
public static IXamlILEmitter Ldtoken(this IXamlILEmitter emitter, IXamlType type) => emitter.Emit(OpCodes.Ldtoken, type);
public static IXamlILEmitter Pop(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Pop);
public static IXamlILEmitter Dup(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Dup);
public static IXamlILEmitter Stsfld(this IXamlILEmitter emitter, IXamlField field) => emitter.Emit(OpCodes.Stsfld, field);
public static IXamlILEmitter Castclass(this IXamlILEmitter emitter, IXamlType type) => emitter.Emit(OpCodes.Castclass, type);
public static IXamlILEmitter Stloc(this IXamlILEmitter emitter, IXamlLocal local) => emitter.Emit(OpCodes.Stloc, local);
public static IXamlILEmitter Unbox(this IXamlILEmitter emitter, IXamlType type) => emitter.Emit(OpCodes.Unbox, type);
public static IXamlILEmitter Ldstr(this IXamlILEmitter emitter, string arg) => arg == null?emitter.Ldnull() : emitter.Emit(OpCodes.Ldstr, arg);
public static IXamlILEmitter Newobj(this IXamlILEmitter emitter, IXamlConstructor ctor) => emitter.Emit(OpCodes.Newobj, ctor);
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);
public static IXamlILEmitter Newarr(this IXamlILEmitter emitter, IXamlType type) => emitter.Emit(OpCodes.Newarr, type);
public static IXamlILEmitter Ble(this IXamlILEmitter emitter, IXamlLabel label) => emitter.Emit(OpCodes.Ble, label);
public static IXamlILEmitter Stelem_ref(this IXamlILEmitter emitter) => emitter.Emit(OpCodes.Stelem_Ref);