Browse Source
Merge pull request #9415 from workgroupengineering/features/micro-optimization
perf: micro optimization
pull/9434/head
Max Katz
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
29 additions and
2 deletions
-
src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs
-
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguageParseIntrinsics.cs
-
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
|
|
|
@ -178,10 +178,11 @@ namespace Avalonia.Build.Tasks |
|
|
|
|
|
|
|
var stringEquals = asm.MainModule.ImportReference(asm.MainModule.TypeSystem.String.Resolve().Methods.First( |
|
|
|
m => |
|
|
|
m.IsStatic && m.Name == "Equals" && m.Parameters.Count == 2 && |
|
|
|
m.IsStatic && m.Name == "Equals" && m.Parameters.Count == 3 && |
|
|
|
m.ReturnType.FullName == "System.Boolean" |
|
|
|
&& m.Parameters[0].ParameterType.FullName == "System.String" |
|
|
|
&& m.Parameters[1].ParameterType.FullName == "System.String")); |
|
|
|
&& m.Parameters[1].ParameterType.FullName == "System.String" |
|
|
|
&& m.Parameters[2].ParameterType.FullName == "System.StringComparison")); |
|
|
|
|
|
|
|
bool CompileGroup(IResourceGroup group) |
|
|
|
{ |
|
|
|
@ -384,6 +385,7 @@ namespace Avalonia.Build.Tasks |
|
|
|
var nop = Instruction.Create(OpCodes.Nop); |
|
|
|
i.Add(Instruction.Create(OpCodes.Ldarg_0)); |
|
|
|
i.Add(Instruction.Create(OpCodes.Ldstr, res.Uri)); |
|
|
|
i.Add(Instruction.Create(OpCodes.Ldc_I4, (int)StringComparison.OrdinalIgnoreCase)); |
|
|
|
i.Add(Instruction.Create(OpCodes.Call, stringEquals)); |
|
|
|
i.Add(Instruction.Create(OpCodes.Brfalse, nop)); |
|
|
|
if (parameterlessConstructor != null) |
|
|
|
|
|
|
|
@ -270,6 +270,27 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (type.Equals(types.Uri)) |
|
|
|
{ |
|
|
|
var uriText = text.Trim(); |
|
|
|
|
|
|
|
var kind = ((!uriText?.StartsWith("/") == true) ? UriKind.Absolute : UriKind.Relative); |
|
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(uriText) || !Uri.TryCreate(uriText, kind, out var _)) |
|
|
|
{ |
|
|
|
throw new XamlX.XamlLoadException($"Unable to parse text {uriText} as a {kind} uri.", node); |
|
|
|
} |
|
|
|
result = new XamlAstNewClrObjectNode(node |
|
|
|
, new(node, types.Uri, false) |
|
|
|
, types.UriConstructor |
|
|
|
, new List<IXamlAstValueNode>() |
|
|
|
{ |
|
|
|
new XamlConstantNode(node, context.Configuration.WellKnownTypes.String, uriText), |
|
|
|
new XamlConstantNode(node, types.UriKind, (int)kind), |
|
|
|
}); |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
result = null; |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
@ -105,6 +105,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
|
public IXamlType IResourceDictionary { get; } |
|
|
|
public IXamlType ResourceDictionary { get; } |
|
|
|
public IXamlMethod ResourceDictionaryDeferredAdd { get; } |
|
|
|
public IXamlType UriKind { get; } |
|
|
|
public IXamlConstructor UriConstructor { get; } |
|
|
|
|
|
|
|
public AvaloniaXamlIlWellKnownTypes(TransformerConfiguration cfg) |
|
|
|
{ |
|
|
|
@ -236,6 +238,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers |
|
|
|
cfg.TypeSystem.GetType("System.Func`2").MakeGenericType( |
|
|
|
cfg.TypeSystem.GetType("System.IServiceProvider"), |
|
|
|
XamlIlTypes.Object)); |
|
|
|
UriKind = cfg.TypeSystem.GetType("System.UriKind"); |
|
|
|
UriConstructor = Uri.GetConstructor(new List<IXamlType>() { cfg.WellKnownTypes.String, UriKind }); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|